@stn-uiux/pub-ui-react 0.1.50 → 0.1.52
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +54 -0
- package/README.md +43 -52
- package/dist/index.d.ts +4 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cn.ts","../src/paginationRange.ts","../src/StnProvider.tsx","../src/StnContext.tsx","../src/components/StnButton.tsx","../src/components/StnIcon.tsx","../src/components/StnSlider.tsx","../src/index.ts","../src/components/StnIconBox.tsx","../src/components/StnPagination.tsx","../src/components/StnPopup.tsx","../src/patterns/layer/StnLayer.tsx","../src/components/toast/StnToastCloseButton.tsx","../src/components/toast/StnToastIcon.tsx","../src/components/StnProgressBar.tsx","../src/components/StnCircularProgress.tsx","../src/components/StnTable.tsx","../src/components/StnCheckbox.tsx","../src/components/StnTree.tsx","../src/components/StnTreeNode.tsx","../src/stnTreeFlatten.ts","../src/components/StnScroll.tsx","../src/patterns/sectionSide/StnSectionSide.tsx","../src/patterns/login/StnLoginCard.tsx","../src/patterns/login/StnLoginTextField.tsx","../src/components/StnLogo.tsx","../src/components/StnBadge.tsx","../src/components/StnChip.tsx","../src/components/StnSeverityBadge.tsx","../src/components/StnSystemChip.tsx","../src/components/StnToggleButton.tsx","../src/components/StnSwitch.tsx","../src/components/StnRadio.tsx","../src/components/StnRadioGroup.tsx","../src/components/StnSegmented.tsx","../src/components/StnDropdown.tsx","../src/inputWidth.ts","../src/components/StnDropdownMenu.tsx","../src/components/StnTextField.tsx","../src/components/StnDateRangeField.tsx","../src/patterns/search/StnSearchRequirementBar.tsx","../src/patterns/search/StnSearchRequirementBarDemo.tsx","../src/components/datePicker/StnDateRangePickerField.tsx","../src/components/datePicker/StnDateRangePicker.tsx","../src/components/datePicker/stnCalendarUtils.ts","../src/patterns/header/StnHeader.tsx","../src/patterns/background/StnLayer0Background.tsx","../src/components/StnWidget.tsx","../src/components/StnEventBanner.tsx","../src/patterns/scaffold/StnLoadingSkeleton.tsx","../src/components/topology/StnTopologyRing.tsx","../src/components/topology/stnTopologyShared.ts","../src/components/topology/StnTopologyNodeMark.tsx","../src/components/topology/StnTopologyGraph.tsx","../src/layouts/StnStack.tsx","../src/patterns/dashboard/AlertCenterDashboard.tsx","../src/patterns/dashboard/PubDashboardWidgetBodies.tsx","../src/patterns/alertCenter/StnAlertCenterPanel.tsx","../src/patterns/alertCenter/StnAlertCenterDocPreview.tsx","../src/components/sideNav/SideNavContext.ts","../src/components/sideNav/StnSideNavItem.tsx","../src/components/sideNav/StnSideNavHeader.tsx","../src/components/sideNav/StnSideNavLogo.tsx","../src/components/sideNav/StnSideNavMenu.tsx","../src/components/sideNav/StnSideNavGroup.tsx","../src/components/sideNav/StnSideNavSpacer.tsx","../src/components/sideNav/StnSideNavFooter.tsx","../src/components/sideNav/StnSideNavToggle.tsx","../src/components/sideNav/StnSideNavWatermark.tsx","../src/components/sideNav/StnSideNavMobileTrigger.tsx","../src/components/sideNav/StnSideNavSub.tsx","../src/components/sideNav/StnSideNavSubNav.tsx","../src/patterns/sideNav/StnSideNavigation.tsx","../src/components/StnBreadcrumb.tsx","../src/components/StnHeaderTitle.tsx","../src/layouts/StnContainer.tsx","../src/layouts/StnGrid.tsx","../src/layouts/StnLayerShell.tsx","../src/patterns/dashboard/StnMapCanvas.tsx","../src/patterns/dashboard/StnDashboard.tsx","../src/patterns/scaffold/StnPageScaffold.tsx","../src/layouts/StnListViewLayout.tsx","../src/patterns/scaffold/AlertCenterPageScaffold.tsx","../src/patterns/scaffold/LoginPageScaffold.tsx","../src/patterns/toolbar/StnFloatingToolbar.tsx"],"sourcesContent":["/** Join truthy class fragments (no dependency on clsx). */\nexport function cn(...parts: Array<string | false | null | undefined>): string {\n return parts.filter(Boolean).join(' ')\n}\n","export type StnPaginationItem = number | 'ellipsis'\n\n/**\n * Infomap Figma `paging` (node 40000042:210340)\n * 시작 근처: 1 2 3 4 5 … N\n * 끝 근처: 1 … N-4 … N\n * 중간: 1 … c-1 c c+1 … N\n */\nexport function buildPaginationItems(\n page: number,\n pageCount: number,\n siblingCount = 1,\n): StnPaginationItem[] {\n if (pageCount < 1) return []\n if (pageCount === 1) return [1]\n\n const current = Math.min(Math.max(1, page), pageCount)\n const range = (start: number, end: number) =>\n Array.from({ length: Math.max(0, end - start + 1) }, (_, i) => start + i)\n\n if (pageCount <= 7) return range(1, pageCount)\n\n /** Infomap start/end cluster length (Figma: 1…5 … 15) */\n const cluster = 5\n const side = Math.max(1, siblingCount)\n\n if (current <= cluster - 1) {\n return [...range(1, cluster), 'ellipsis', pageCount]\n }\n\n if (current >= pageCount - (cluster - 2)) {\n return [1, 'ellipsis', ...range(pageCount - cluster + 1, pageCount)]\n }\n\n return [\n 1,\n 'ellipsis',\n ...range(current - side, current + side),\n 'ellipsis',\n pageCount,\n ]\n}\n","import { useCallback, useEffect, useState, type ReactNode } from 'react'\nimport { cn } from './cn'\nimport { StnContext, type StnTheme } from './StnContext'\n\nexport type StnProviderProps = {\n children: ReactNode\n theme?: StnTheme\n defaultTheme?: StnTheme\n onThemeChange?: (theme: StnTheme) => void\n applyThemeToDocument?: boolean\n className?: string\n}\n\nexport function StnProvider({\n children,\n theme: themeProp,\n defaultTheme = 'light',\n onThemeChange,\n applyThemeToDocument = false,\n className,\n}: StnProviderProps) {\n const [internalTheme, setInternalTheme] = useState<StnTheme>(defaultTheme)\n const theme = themeProp ?? internalTheme\n\n const setTheme = useCallback(\n (next: StnTheme) => {\n if (themeProp === undefined) setInternalTheme(next)\n onThemeChange?.(next)\n },\n [themeProp, onThemeChange],\n )\n\n useEffect(() => {\n if (!applyThemeToDocument) return\n const el = document.documentElement\n const prev = el.getAttribute('data-theme')\n el.setAttribute('data-theme', theme)\n return () => {\n if (prev === null) el.removeAttribute('data-theme')\n else el.setAttribute('data-theme', prev)\n }\n }, [theme, applyThemeToDocument])\n\n const value = { theme, setTheme }\n\n if (applyThemeToDocument) {\n return <StnContext.Provider value={value}>{children}</StnContext.Provider>\n }\n\n return (\n <StnContext.Provider value={value}>\n <div className={cn(className)} data-theme={theme}>\n {children}\n </div>\n </StnContext.Provider>\n )\n}\n","import { createContext, useContext } from 'react'\n\nexport type StnTheme = 'light' | 'dark'\n\nexport type StnContextValue = {\n theme: StnTheme\n setTheme: (theme: StnTheme) => void\n}\n\nexport const StnContext = createContext<StnContextValue | null>(null)\n\nexport function useStn(): StnContextValue {\n const ctx = useContext(StnContext)\n if (!ctx) {\n return {\n theme: 'light',\n setTheme: () => {},\n }\n }\n return ctx\n}\n\nexport function useStnOptional(): StnContextValue | null {\n return useContext(StnContext)\n}\n","import { cloneElement, forwardRef, isValidElement, type ButtonHTMLAttributes, type ReactElement, type ReactNode } from 'react'\n\nimport { cn } from '../cn'\nimport type { StnWithoutStyle } from '../stnStrictProps'\nimport { StnIcon } from './StnIcon'\n\n/** 표준 2글자 사이즈: xl · lg · md · sm · xs (레거시 L/M/S/large/medium 등 호환) */\nexport type StnButtonSize =\n | 'xl'\n | 'lg'\n | 'md'\n | 'sm'\n | 'large'\n | 'medium'\n | 'small'\n | 'XL'\n | 'L'\n | 'M'\n | 'S'\n\n/** 모양 — contained(채움) · outlined(테두리) · ghost(면) · text(글자만) */\nexport type StnButtonLook = 'contained' | 'outlined' | 'ghost' | 'text'\n\n/** 버튼 variant: contained · outlined · ghost · text */\nexport type StnButtonVariant = 'contained' | 'outlined' | 'ghost' | 'text'\n\n/** 색 — 기본 primary. 토큰: --stn-feedback-* */\nexport type StnButtonColor = 'primary' | 'success' | 'error' | 'warning' | 'info'\n\n/** 아이콘 위치 — left | right | none */\nexport type StnButtonIconPosition = 'left' | 'right' | 'none'\n\n/** 모서리 형태 — pill(기본 캡슐형) · square(사각 버튼: 4px, lg/xl: 6px) */\nexport type StnButtonShape = 'pill' | 'square'\n\nexport type StnButtonResolvedSize = 'xl' | 'lg' | 'md' | 'sm'\n\nexport type StnButtonProps = StnWithoutStyle<Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'className' | 'color'>> & {\n size?: StnButtonSize\n variant?: StnButtonVariant\n color?: StnButtonColor\n /** 모서리 형태 (기본 pill, 툴바 등 사각 아이콘 버튼에는 'square') */\n shape?: StnButtonShape\n /** 아이콘 위치 · 기본 none (icon 지정 시 left 기본값) */\n iconPosition?: StnButtonIconPosition\n /** 커스텀 아이콘 또는 아이콘 이름 ('line/pencil-minus' 또는 ReactNode) */\n icon?: ReactNode\n /** width 100% — `.stn-btn.full` */\n fullWidth?: boolean\n className?: string\n children?: ReactNode\n}\n\nconst ICON_PX: Record<StnButtonResolvedSize, number> = {\n xl: 24,\n lg: 24,\n md: 20,\n sm: 16,\n}\n\nfunction resolveSize(size: StnButtonSize): StnButtonResolvedSize {\n if (size === 'XL' || size === 'xl') return 'xl'\n if (size === 'L' || size === 'large' || size === 'lg') return 'lg'\n if (size === 'S' || size === 'small' || size === 'sm') return 'sm'\n return 'md'\n}\n\nfunction resolveLookAndColor(\n variant: StnButtonVariant,\n color: StnButtonColor | undefined,\n): { look: StnButtonLook; color: StnButtonColor } {\n return { look: variant, color: color ?? 'primary' }\n}\n\nfunction hasButtonLabel(children: ReactNode): boolean {\n if (children == null || children === false || children === true) return false\n if (Array.isArray(children)) return children.some(hasButtonLabel)\n if (typeof children === 'string' || typeof children === 'number') return String(children).trim() !== ''\n return true\n}\n\nfunction resolveIconNode(icon: ReactNode, glyphPx: number): ReactNode {\n if (typeof icon === 'string') return <StnIcon name={icon} size={glyphPx} color=\"currentColor\" />\n if (isValidElement(icon)) {\n const props = icon.props as { size?: number }\n if (props.size == null) {\n return cloneElement(icon as ReactElement<{ size?: number }>, { size: glyphPx })\n }\n }\n return icon\n}\n\nfunction resolveIconPosition(iconPosition?: StnButtonIconPosition, icon?: ReactNode): StnButtonIconPosition {\n if (iconPosition != null) return iconPosition\n if (icon != null) return 'left'\n return 'none'\n}\n\n/**\n * Infomap Figma `btn` — `.stn-btn`\n * 레이블을 생략하고 `icon`만 주면 아이콘 버튼 (`.stn-btn.icon`). 이때 `aria-label` 필수.\n */\nexport const StnButton = forwardRef<HTMLButtonElement, StnButtonProps>(function StnButton(\n {\n size = 'md',\n variant = 'contained',\n color,\n shape,\n iconPosition,\n icon,\n fullWidth,\n className,\n type = 'button',\n disabled,\n children,\n ...rest\n },\n ref,\n) {\n const resolvedSize = resolveSize(size)\n const { look, color: resolvedColor } = resolveLookAndColor(variant, color)\n const labeled = hasButtonLabel(children)\n const glyphPx = labeled ? 16 : ICON_PX[resolvedSize]\n const resolvedIcon = resolveIconNode(icon, glyphPx)\n const isIconOnly = !labeled && resolvedIcon != null\n const position = resolveIconPosition(iconPosition, icon)\n\n const showLeading = (isIconOnly || position === 'left') && resolvedIcon != null\n const showTrailingCustom = !isIconOnly && position === 'right' && resolvedIcon != null\n\n return (\n <button\n ref={ref}\n type={type}\n disabled={disabled}\n className={cn(\n 'stn-btn',\n look,\n resolvedSize,\n resolvedColor !== 'primary' && resolvedColor,\n shape === 'square' && 'square',\n isIconOnly && 'icon',\n fullWidth && !isIconOnly && 'full',\n className,\n )}\n {...rest}\n >\n {showLeading ? <span className=\"stn-btn__leading\">{resolvedIcon}</span> : null}\n {labeled ? <span className=\"stn-btn__label\">{children}</span> : null}\n {showTrailingCustom ? <span className=\"stn-btn__trailing\">{resolvedIcon}</span> : null}\n </button>\n )\n})\n","import type { CSSProperties } from 'react'\n\nimport { resolveSystemIconSrcFromName } from '@stn-uiux/pub-ui/data/stnSystemIcons'\n\nimport { cn } from '../cn'\n\nexport type StnIconProps = {\n /** Iconography slug (`line/home`) */\n name?: string\n /** 정적 URL · `name`과 동시면 src 우선 */\n src?: string\n /** 모노 아이콘 색 · primitive 변수 (`var(--stn-blue-400)`) 또는 CSS 색상 */\n color?: string\n /** px */\n size?: number\n className?: string\n style?: CSSProperties\n}\n\n/**\n * 아이콘 그림 — Button leading 등에서 사용\n * color 전달 시 CSS Mask를 통해 Primitive 색상으로 실시간 틴트 적용\n */\nexport function StnIcon({ name, src, color, size = 24, className, style }: StnIconProps) {\n if (name && src) {\n console.warn('[StnIcon] `name` and `src` cannot be used together. Using `src`.')\n }\n\n const sizeStyle: CSSProperties = {\n width: size,\n height: size,\n ...style,\n }\n\n const resolvedSrc =\n src ?? (name ? resolveSystemIconSrcFromName(name) : null)\n\n if (!resolvedSrc) return null\n\n const isFillIcon = Boolean(name && name.startsWith('fill/'))\n const isNone = color === 'none' || (isFillIcon && color === undefined)\n const resolvedColor = isNone ? undefined : (color ?? (src ? undefined : 'currentColor'))\n\n if (resolvedColor) {\n const isCurrentColor = resolvedColor === 'currentColor'\n const maskUrl = `url(\"${resolvedSrc}\")`\n\n return (\n <span\n aria-hidden\n className={cn('stn-icon', 'stn-icon--masked', className)}\n style={{\n ...sizeStyle,\n ...(!isCurrentColor ? { backgroundColor: resolvedColor } : undefined),\n WebkitMaskImage: maskUrl,\n maskImage: maskUrl,\n }}\n />\n )\n }\n\n return (\n <img\n src={resolvedSrc}\n alt=\"\"\n aria-hidden\n className={cn('stn-icon', 'stn-icon--img', className)}\n style={sizeStyle}\n width={size}\n height={size}\n draggable={false}\n />\n )\n}\n","import {\n forwardRef,\n useCallback,\n useId,\n useMemo,\n useState,\n type ChangeEvent,\n type CSSProperties,\n type InputHTMLAttributes,\n type ReactNode,\n} from 'react'\n\nimport { cn } from '../cn'\nimport type { StnWithoutStyle } from '../stnStrictProps'\n\nexport type StnSliderSize = 'sm' | 'md' | 'lg'\nexport type StnSliderColor =\n | 'primary'\n | 'secondary'\n | 'success'\n | 'critical'\n | 'major'\n | 'minor'\n | 'warning'\n | 'error'\n | 'info'\n | (string & {})\n\nexport type StnSliderGradient =\n | boolean\n | 'main'\n | 'primary'\n | 'secondary'\n | 'critical'\n | 'major'\n | 'minor'\n | 'warning'\n | (string & {})\n\nexport type StnSliderLabelPosition = 'top' | 'bottom' | 'left' | 'right'\nexport type StnSliderLabelAlign = 'left' | 'center' | 'right'\n\nexport type StnSliderProps = StnWithoutStyle<\n Omit<InputHTMLAttributes<HTMLInputElement>, 'type' | 'className' | 'value' | 'defaultValue' | 'onChange' | 'size'>\n> & {\n value?: number\n defaultValue?: number\n min?: number\n max?: number\n step?: number\n /** 슬라이더 상단/주변 레이블 */\n label?: ReactNode\n /** 크기 ('sm', 'md' 기본, 'lg') @default 'md' */\n size?: StnSliderSize\n /** 활성 채움 색상 @default 'primary' */\n color?: StnSliderColor\n /** 활성화 트랙 그라데이션 ('blue', 'teal', 'purple', 'sunset', 'emerald' 또는 커스텀 linear-gradient) */\n gradient?: StnSliderGradient\n /** 레이블 위치 ('top' 기본, 'bottom', 'left', 'right') @default 'top' */\n labelPosition?: StnSliderLabelPosition\n /** 레이블 정렬 ('left' 기본, 'center', 'right') @default 'left' */\n labelAlign?: StnSliderLabelAlign\n /** 값 말풍선 표시 (hover/focus에서도 CSS로 노출) */\n showValue?: boolean\n /** 말풍선에 항상 표시 */\n alwaysShowValue?: boolean\n /** 말풍선 포맷 */\n formatValue?: (value: number) => ReactNode\n /** 필수 조절 여부 (레이블 옆에 붉은색 * 표시) */\n required?: boolean\n onChange?: (value: number) => void\n className?: string\n}\n\nfunction clamp(n: number, min: number, max: number) {\n return Math.min(max, Math.max(min, n))\n}\n\nfunction toPct(value: number, min: number, max: number) {\n if (max <= min) return 0\n return ((value - min) / (max - min)) * 100\n}\n\n/**\n * Slider — continuous range. 모양: `stn-slider.css` (`.stn-slider`)\n */\nexport const StnSlider = forwardRef<HTMLInputElement, StnSliderProps>(function StnSlider(\n {\n value: valueProp,\n defaultValue = 50,\n min = 0,\n max = 100,\n step = 1,\n label: labelProp,\n size = 'md',\n color,\n gradient,\n labelPosition = 'top',\n labelAlign = 'left',\n showValue = true,\n alwaysShowValue = false,\n formatValue,\n required = false,\n onChange,\n disabled,\n className,\n id: idProp,\n ...rest\n },\n ref,\n) {\n const autoId = useId()\n const id = idProp ?? autoId\n const isControlled = valueProp != null\n const [inner, setInner] = useState(() => clamp(defaultValue, min, max))\n const value = clamp(isControlled ? valueProp : inner, min, max)\n\n const pct = useMemo(() => toPct(value, min, max), [value, min, max])\n const tooltipLabel = formatValue ? formatValue(value) : value\n\n const handleChange = useCallback(\n (e: ChangeEvent<HTMLInputElement>) => {\n const next = Number(e.target.value)\n if (!isControlled) setInner(next)\n onChange?.(next)\n },\n [isControlled, onChange],\n )\n\n // Label placement and alignment classes\n const positionClass = `label-${labelPosition}`\n const alignClass = labelAlign !== 'left' ? `align-${labelAlign}` : ''\n\n // Known tones\n const isKnownTone =\n color &&\n [\n 'primary',\n 'secondary',\n 'success',\n 'critical',\n 'major',\n 'minor',\n 'warning',\n 'error',\n 'info',\n ].includes(color)\n const toneClass = isKnownTone ? color : ''\n\n // Gradient resolution\n let gradientClass = ''\n let customGradient = ''\n const hasGradient = Boolean(gradient)\n\n if (gradient === true) {\n gradientClass = 'gradient'\n } else if (typeof gradient === 'string') {\n if (['main', 'primary', 'secondary', 'critical', 'major', 'minor', 'warning'].includes(gradient)) {\n gradientClass = `gradient-${gradient}`\n } else if (gradient.includes('gradient') || gradient.startsWith('linear-') || gradient.startsWith('radial-')) {\n customGradient = gradient\n }\n }\n\n // Size class\n const sizeClass = size !== 'md' ? size : ''\n\n // Style properties\n const style: CSSProperties = {\n ['--stn-slider-pct' as string]: `${pct}%`,\n ['--stn-slider-pct-num' as string]: String(pct / 100),\n ...(customGradient\n ? { ['--stn-slider-fill-gradient' as string]: customGradient }\n : color && !isKnownTone\n ? { ['--stn-slider-fill' as string]: color, ['--stn-slider-thumb' as string]: color }\n : {}),\n }\n\n const labelElement =\n labelProp != null && labelProp !== '' ? (\n <label htmlFor={id} className=\"stn-slider__label\">\n {labelProp}\n {required && (\n <span className=\"stn-slider__required\" aria-hidden=\"true\">\n *\n </span>\n )}\n </label>\n ) : null\n\n return (\n <div\n className={cn(\n 'stn-slider',\n sizeClass,\n toneClass,\n gradientClass,\n hasGradient && 'gradient-fill stn-slider--gradient-fill',\n positionClass,\n alignClass,\n alwaysShowValue && 'show-value stn-slider--show-value',\n disabled && 'disabled stn-slider--disabled',\n className,\n )}\n style={style}\n >\n {labelElement}\n <div className=\"stn-slider__track-wrapper\">\n {showValue ? (\n <span className=\"stn-slider__value\" aria-hidden=\"true\">\n {tooltipLabel}\n </span>\n ) : null}\n <input\n ref={ref}\n id={id}\n type=\"range\"\n className=\"stn-slider__input\"\n min={min}\n max={max}\n step={step}\n value={value}\n disabled={disabled}\n required={required}\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuenow={value}\n onChange={handleChange}\n {...rest}\n />\n </div>\n </div>\n )\n})\n","/**\n * @stn-uiux/pub-ui-react — thin React surface for STN Pub (class names + peer CSS).\n */\nexport { cn } from './cn'\nexport { buildPaginationItems, type StnPaginationItem } from './paginationRange'\n\nexport { StnProvider, type StnProviderProps } from './StnProvider'\nexport { StnContext, useStn, useStnOptional, type StnTheme, type StnContextValue } from './StnContext'\n\nexport { StnButton, type StnButtonProps, type StnButtonSize, type StnButtonVariant, type StnButtonColor, type StnButtonShape, type StnButtonIconPosition } from './components/StnButton'\nexport {\n StnSlider,\n type StnSliderProps,\n type StnSliderSize,\n type StnSliderColor,\n type StnSliderGradient,\n type StnSliderLabelPosition,\n type StnSliderLabelAlign,\n} from './components/StnSlider'\nexport { StnIcon, type StnIconProps } from './components/StnIcon'\nexport { systemIconSrc, resolveSystemIconSrcFromName } from '@stn-uiux/pub-ui/data/stnSystemIcons'\nexport {\n StnIconBox,\n type StnIconBoxProps,\n type StnIconBoxSize,\n type StnIconBoxColor,\n} from './components/StnIconBox'\nexport {\n STN_PAGINATION_INTRO,\n STN_PAGINATION_EXAMPLE,\n STN_PAGINATION_REACT,\n STN_PAGINATION_FIGMA,\n} from '@stn-uiux/pub-ui/data/stnPagination'\nexport { StnPagination, type StnPaginationProps } from './components/StnPagination'\nexport { StnPopup, type StnPopupProps, type StnPopupSize } from './components/StnPopup'\nexport { StnToastCloseButton } from './components/toast/StnToastCloseButton'\nexport {\n StnToastIcon,\n STN_TOAST_ICON_SLUG,\n type StnToastIconProps,\n} from './components/toast/StnToastIcon'\nexport {\n StnProgressBar,\n type StnProgressBarProps,\n type StnProgressBarTone,\n type StnProgressBarGradient,\n type StnProgressBarSize,\n type StnProgressBarTrack,\n type StnProgressBarLabelPosition,\n type StnProgressBarLabelAlign,\n} from './components/StnProgressBar'\nexport {\n StnCircularProgress,\n type StnCircularProgressProps,\n type StnCircularProgressSize,\n type StnCircularProgressTone,\n type StnCircularProgressGradient,\n type StnCircularProgressTrack,\n type StnCircularProgressLabelPosition,\n} from './components/StnCircularProgress'\nexport {\n StnTable,\n StnTableGrid,\n StnTableHead,\n StnTableBody,\n StnTableRow,\n StnTableTh,\n StnTableTd,\n StnTableSort,\n StnTableThCheck,\n StnTableTdCheck,\n type StnTableProps,\n type StnTableGridProps,\n type StnTableHeadProps,\n type StnTableBodyProps,\n type StnTableRowProps,\n type StnTableAlign,\n type StnTableThProps,\n type StnTableTdProps,\n type StnTableSortProps,\n type StnTableThCheckProps,\n type StnTableTdCheckProps,\n STN_TABLE_FOOTER_MAX_ACTIONS,\n} from './components/StnTable'\nexport {\n StnTree,\n type StnTreeProps,\n type StnTreeItem,\n type StnTreeNodeKind,\n type StnTreeDocRowState,\n} from './components/StnTree'\nexport {\n StnTreeNode,\n type StnTreeNodeProps,\n type StnTreeNodeDocState,\n} from './components/StnTreeNode'\nexport { flattenStnTree, collectExpandableIds, buildStnTreeNodeCells } from './stnTreeFlatten'\nexport {\n StnScroll,\n type StnScrollProps,\n type StnScrollOrientation,\n type StnScrollSize,\n type StnScrollColor,\n} from './components/StnScroll'\nexport {\n StnSectionSide,\n StnSectionSidePreset,\n type StnSectionSideProps,\n type StnSectionSidePresetProps,\n} from './patterns/sectionSide/StnSectionSide'\nexport {\n StnLoginCard,\n StnLoginCardGlowWrapper,\n StnLoginBrandStack,\n StnLoginFormStack,\n StnLoginFormFields,\n StnLoginFormLinks,\n StnLoginPlaceholder,\n type StnLoginCardProps,\n type StnLoginCardBrandPosition,\n type StnLoginCardVariant,\n type StnLoginCardGlowWrapperProps,\n type StnLoginBrandStackProps,\n type StnLoginFormStackProps,\n type StnLoginFormFieldsProps,\n type StnLoginFormLinksProps,\n type StnLoginPlaceholderProps,\n} from './patterns/login/StnLoginCard'\nexport {\n StnLoginTextField,\n type StnLoginTextFieldProps,\n} from './patterns/login/StnLoginTextField'\nexport {\n StnLogo,\n type StnLogoProps,\n type StnLogoVariant,\n type StnLogoSize,\n type StnLogoTheme,\n} from './components/StnLogo'\nexport {\n StnBadge,\n type StnBadgeProps,\n type StnBadgeVariant,\n type StnBadgeColor,\n type StnBadgeAnchorOrigin,\n} from './components/StnBadge'\nexport {\n StnChip,\n type StnChipProps,\n type StnChipVariant,\n type StnChipSize,\n type StnChipShape,\n type StnChipColor,\n type StnChipIconPosition,\n type StnChipLabelPosition,\n} from './components/StnChip'\nexport {\n StnSeverityBadge,\n StnSeverityFilter,\n type StnSeverityBadgeProps,\n type StnSeverityFilterProps,\n type StnSeverityLevel,\n type StnSeverityVariant,\n} from './components/StnSeverityBadge'\nexport {\n StnSystemChip,\n type StnSystemChipItem,\n type StnSystemChipTone,\n type StnSystemChipProps,\n} from './components/StnSystemChip'\nexport {\n StnCheckbox,\n type StnCheckboxProps,\n type StnCheckboxSize,\n type StnCheckboxColor,\n type StnCheckboxLabelPlacement,\n} from './components/StnCheckbox'\nexport {\n StnToggleButton,\n type StnToggleButtonProps,\n type StnToggleButtonSize,\n type StnToggleButtonColor,\n type StnToggleButtonIconPosition,\n} from './components/StnToggleButton'\nexport {\n StnSwitch,\n type StnSwitchProps,\n type StnSwitchLabelPosition,\n type StnSwitchSize,\n type StnSwitchColor,\n type StnSwitchGradient,\n} from './components/StnSwitch'\nexport {\n StnRadio,\n type StnRadioProps,\n type StnRadioSize,\n type StnRadioColor,\n type StnRadioLabelPlacement,\n} from './components/StnRadio'\nexport {\n StnRadioGroup,\n type StnRadioGroupProps,\n type StnRadioGroupOption,\n type StnRadioGroupLayout,\n type StnRadioGroupOrientation,\n} from './components/StnRadioGroup'\nexport {\n StnSegmented,\n type StnSegmentedProps,\n type StnSegmentedOption,\n type StnSegmentedSingleProps,\n type StnSegmentedMultipleProps,\n} from './components/StnSegmented'\nexport {\n StnDropdown,\n type StnDropdownProps,\n type StnDropdownOption,\n type StnDropdownSize,\n type StnDropdownModifier,\n type StnDropdownVariant,\n type StnDropdownHelperTextPosition,\n} from './components/StnDropdown'\nexport {\n StnDropdownMenu,\n type StnDropdownMenuProps,\n} from './components/StnDropdownMenu'\nexport {\n StnTextField,\n type StnTextFieldProps,\n type StnTextFieldSize,\n type StnTextFieldVariant,\n type StnTextFieldColor,\n type StnTextFieldIconPosition,\n type StnTextFieldLabelPosition,\n} from './components/StnTextField'\nexport {\n StnDateRangeField,\n type StnDateRangeFieldProps,\n type StnDateRangeFieldSize,\n} from './components/StnDateRangeField'\nexport {\n STN_DROPDOWN_INTRO,\n STN_DROPDOWN_SIZE_ROWS,\n STN_DROPDOWN_INVENTORY,\n STN_DROPDOWN_HTML_COUNTS,\n STN_DROPDOWN_USAGE,\n STN_DROPDOWN_MENU_INTRO,\n STN_DROPDOWN_MENU_USAGE,\n} from '@stn-uiux/pub-ui/data/stnDropdown'\nexport {\n STN_TEXT_FIELD_FIGMA,\n STN_TEXT_FIELD_INTRO,\n STN_TEXT_FIELD_SIZE_ROWS,\n STN_TEXT_FIELD_STATES,\n STN_TEXT_FIELD_USAGE,\n STN_TEXT_FIELD_HTML,\n} from '@stn-uiux/pub-ui/data/stnTextField'\nexport {\n STN_SEGMENTED_FIGMA,\n STN_SEGMENTED_INTRO,\n STN_SEGMENTED_USAGE,\n STN_SEGMENTED_HTML,\n} from '@stn-uiux/pub-ui/data/stnSegmented'\nexport {\n STN_LOGIN_FIGMA,\n STN_LOGIN_ASSETS,\n STN_LOGIN_INTRO,\n STN_LOGIN_USAGE,\n STN_LOGIN_HTML,\n} from '@stn-uiux/pub-ui/data/stnLogin'\nexport {\n STN_DATE_RANGE_FIELD_FIGMA,\n STN_DATE_RANGE_FIELD_NAME,\n STN_DATE_RANGE_FIELD_INTRO,\n STN_DATE_RANGE_FIELD_DEMO,\n STN_DATE_RANGE_FIELD_SIZE_ROWS,\n STN_DATE_RANGE_FIELD_USAGE,\n STN_DATE_RANGE_FIELD_HTML,\n formatStnDateRangeFieldValue,\n parseStnDateRangeFieldValue,\n} from '@stn-uiux/pub-ui/data/stnDateRangeField'\nexport {\n STN_SEARCH_REQUIREMENT_FIGMA,\n STN_SEARCH_REQUIREMENT_NAME,\n STN_SEARCH_REQUIREMENT_KO_NAME,\n STN_SEARCH_REQUIREMENT_INTRO,\n STN_SEARCH_REQUIREMENT_SPEC,\n STN_SEARCH_REQUIREMENT_DEMO_FIELDS,\n STN_SEARCH_REQUIREMENT_USAGE,\n} from '@stn-uiux/pub-ui/data/stnSearchRequirement'\nexport {\n StnSearchRequirementBar,\n type StnSearchRequirementBarProps,\n type StnSearchRequirementBarFieldsProps,\n type StnSearchRequirementBarFieldProps,\n type StnSearchRequirementBarSearchButtonProps,\n type StnSearchRequirementBarExportProps,\n type StnSearchRequirementBarDividerProps,\n} from './patterns/search/StnSearchRequirementBar'\nexport {\n StnSearchRequirementBarDemo,\n type StnSearchRequirementBarDemoProps,\n} from './patterns/search/StnSearchRequirementBarDemo'\nexport {\n STN_HEADER_INTRO,\n STN_HEADER_USAGE,\n STN_HEADER_VARIANT_ROWS,\n STN_SYSTEM_CHIP_DEMO,\n STN_HEADER_PAGE_TITLE_DEMO,\n type StnHeaderVariant,\n type StnHeaderPadding,\n type StnHeaderGap,\n} from '@stn-uiux/pub-ui/data/stnHeader'\nexport {\n StnHeader,\n StnHeaderPageTitle,\n StnHeaderSubTitle,\n StnHeaderContextTitle,\n StnHeaderTitleGroup,\n StnHeaderToolbar,\n type StnHeaderProps,\n type StnHeaderRegionProps,\n type StnHeaderPageTitleProps,\n type StnHeaderTitleGroupProps,\n type StnHeaderToolbarProps,\n} from './patterns/header/StnHeader'\nexport {\n STN_LAYER0_BACKGROUND_FIGMA,\n STN_LAYER0_BACKGROUND_INTRO,\n STN_LAYER0_BACKGROUND_USAGE,\n STN_LAYER0_BACKGROUND_VARIANT_ROWS,\n STN_LAYER0_BACKGROUND_DEMO_IMAGES,\n STN_LAYER0_MAP_LIGHT_OVERLAY,\n type StnLayer0BackgroundKind,\n type StnLayer0BackgroundPreset,\n} from '@stn-uiux/pub-ui/data/stnLayer0Background'\nexport {\n StnLayer0Background,\n type StnLayer0BackgroundProps,\n type StnLayer0BackgroundColor,\n} from './patterns/background/StnLayer0Background'\nexport {\n StnDateRangePicker,\n type StnDateRangePickerProps,\n} from './components/datePicker/StnDateRangePicker'\nexport {\n StnDateRangePickerField,\n type StnDateRangePickerFieldProps,\n} from './components/datePicker/StnDateRangePickerField'\nexport {\n STN_DATE_PICKER_INTRO,\n STN_DATE_PICKER_NAME,\n STN_DATE_PICKER_KO_NAME,\n STN_DATE_PICKER_PART_ROWS,\n STN_DATE_PICKER_SPEC,\n STN_DATE_PICKER_USAGE,\n STN_DATE_PICKER_PANEL_USAGE,\n STN_DATE_PICKER_WEEKDAYS,\n type StnDateRange,\n} from '@stn-uiux/pub-ui/data/stnDatePicker'\nexport {\n StnWidget,\n StnWidgetPlaceholder,\n StnWidgetHeader,\n StnWidgetTitle,\n StnWidgetActions,\n StnWidgetBody,\n StnWidgetFooter,\n StnWidgetEmpty,\n StnWidgetLoading,\n StnWidgetInsetIcon,\n type StnWidgetInsetIconProps,\n StnWidgetChartSlot,\n StnWidgetStatusList,\n StnWidgetStatusItem,\n StnWidgetStatGroup,\n StnWidgetStatCard,\n StnWidgetGradeRowList,\n StnWidgetGradeRow,\n type StnWidgetProps,\n type StnWidgetStatus,\n type StnWidgetPadding,\n type StnWidgetBackground,\n type StnWidgetAppearance,\n type StnWidgetChartSlotProps,\n type StnWidgetStatusGrade,\n type StnWidgetStatusItemProps,\n type StnWidgetStatCardProps,\n type StnWidgetGradeRowGrade,\n type StnWidgetGradeRowProps,\n} from './components/StnWidget'\nexport {\n STN_WIDGET_FIGMA,\n STN_WIDGET_FIGMA_URL,\n STN_WIDGET_FIGMA_DARK,\n STN_WIDGET_FIGMA_DARK_URL,\n STN_WIDGET_INTRO,\n STN_WIDGET_SHELL_ROWS,\n STN_WIDGET_KINDS,\n STN_WIDGET_USAGE,\n getStnWidgetKind,\n isStnWidgetKindSlug,\n stnWidgetSampleUrl,\n resolveStnWidgetBackground,\n STN_ALERT_CENTER_DASHBOARD_WIDGETS,\n STN_ALERT_CENTER_DASHBOARD_USAGE,\n type StnWidgetKind,\n type StnWidgetShell,\n type StnWidgetBackgroundMode,\n type StnWidgetContentFamily,\n} from '@stn-uiux/pub-ui/data/stnWidget'\nexport { AlertCenterDashboard, type AlertCenterDashboardProps } from './patterns/dashboard/AlertCenterDashboard'\nexport {\n PubDisabilityStatusList,\n PubTop5EquipmentBars,\n PubTrafficTop5Bars,\n PubChartSample,\n type PubDisabilityStatusItem,\n type PubTop5BarRow,\n type PubTrafficTop5BarRow,\n} from './patterns/dashboard/PubDashboardWidgetBodies'\nexport { StnAlertCenterPanel, type StnAlertCenterPanelProps } from './patterns/alertCenter/StnAlertCenterPanel'\nexport {\n StnAlertCenterDocPreview,\n type StnAlertCenterDocPreviewProps,\n} from './patterns/alertCenter/StnAlertCenterDocPreview'\nexport {\n STN_ALERT_CENTER_INTRO,\n STN_ALERT_CENTER_TABS,\n STN_ALERT_CENTER_TAB_IDS,\n STN_ALERT_CENTER_DEMO_ALERTS,\n STN_ALERT_CENTER_DEMO_WORK,\n STN_ALERT_CENTER_DEMO_DEPLOY,\n STN_ALERT_CENTER_USAGE,\n STN_GNB_ALERT_INTEGRATION_USAGE,\n type StnAlertCenterTab,\n type StnAlertCenterAlertItem,\n type StnAlertCenterWorkItem,\n} from '@stn-uiux/pub-ui/data/stnAlertCenter'\nexport {\n SideNavContext,\n useSideNav,\n type SideNavContextValue,\n StnSideNavItem,\n type StnSideNavItemProps,\n type StnSideNavItemVariant,\n StnSideNavHeader,\n type StnSideNavHeaderProps,\n StnSideNavMenu,\n type StnSideNavMenuProps,\n StnSideNavGroup,\n type StnSideNavGroupProps,\n StnSideNavSpacer,\n type StnSideNavSpacerProps,\n StnSideNavFooter,\n type StnSideNavFooterProps,\n StnSideNavToggle,\n type StnSideNavToggleProps,\n StnSideNavLogo,\n type StnSideNavLogoProps,\n StnSideNavWatermark,\n type StnSideNavWatermarkProps,\n StnSideNavMobileTrigger,\n type StnSideNavMobileTriggerProps,\n StnSideNavSub,\n StnSideNavSubItem,\n type StnSideNavSubProps,\n type StnSideNavSubItemProps,\n StnSideNavSubNav,\n type StnSideNavSubNavProps,\n type StnSideNavSubNavVariant,\n type StnSideNavDropdownVariant,\n} from './components/sideNav'\n\n\nexport {\n StnSideNavigation,\n type StnSideNavigationProps,\n type StnSideNavigationVariant,\n} from './patterns/sideNav/StnSideNavigation'\nexport {\n StnBreadcrumb,\n type StnBreadcrumbProps,\n type StnBreadcrumbItem,\n type StnBreadcrumbMenuItem,\n type StnBreadcrumbSize,\n type StnBreadcrumbVariant,\n} from './components/StnBreadcrumb'\nexport {\n StnHeaderTitle,\n StnHeaderTitleFramePreview,\n StnHeaderTitleMainText,\n StnHeaderTitleSubText,\n StnHeaderTitleDate,\n StnHeaderTitleWeekday,\n StnHeaderTitleTime,\n formatStnHeaderTitleDate,\n formatStnHeaderTitleTime,\n formatStnHeaderTitleWeekday,\n type StnHeaderTitleVariant,\n type StnHeaderTitleProps,\n type StnHeaderTitleTitleProps,\n type StnHeaderTitleDualProps,\n type StnHeaderTitleClockProps,\n type StnHeaderTitleDateOptions,\n type StnHeaderTitleTimeOptions,\n type StnHeaderTitleSize,\n} from './components/StnHeaderTitle'\nexport {\n StnContainer,\n type StnContainerProps,\n type StnContainerMaxWidth,\n} from './layouts/StnContainer'\nexport {\n StnStack,\n type StnStackProps,\n type StnStackDirection,\n type StnStackBreakpoint,\n type StnStackResponsive,\n type StnStackWrap,\n type StnStackScrollable,\n} from './layouts/StnStack'\nexport {\n StnGrid,\n type StnGridProps,\n type StnGridBreakpoint,\n type StnGridResponsive,\n type StnGridSpacing,\n type StnGridSize,\n type StnGridDirection,\n} from './layouts/StnGrid'\nexport {\n StnLayerShell,\n type StnLayerShellProps,\n} from './layouts/StnLayerShell'\nexport {\n StnListViewLayout,\n StnListViewLayoutBody,\n StnListViewLayoutHeader,\n StnListViewLayoutSearch,\n StnListViewLayoutSidebar,\n StnListViewLayoutContent,\n StnListViewLayoutTable,\n StnListViewLayoutPagination,\n type StnListViewLayoutProps,\n type StnListViewLayoutBodyProps,\n} from './layouts/StnListViewLayout'\nexport {\n STN_LAYOUT_INTRO,\n STN_LAYOUT_LAYER_PAGE_TREE,\n STN_LAYOUT_LIST_VIEW_INTRO,\n STN_LAYOUT_LIST_VIEW_USAGE,\n STN_LAYOUT_MAP_DASHBOARD_INTRO,\n STN_LAYOUT_MAP_DASHBOARD_USAGE,\n STN_LAYER_SHELL_USAGE,\n applyLnbSideToModifiers,\n type StnLnbSide,\n STN_LAYOUT_CONTENT_ROWS,\n STN_LAYOUT_REGION_ROWS,\n STN_LAYOUT_SHELL_USAGE,\n STN_LAYOUT_RECIPES,\n STN_LAYOUT_PLAYGROUND_TABS,\n STN_LAYOUT_WHEN_TO_USE,\n STN_LAYOUT_SCREEN_RECIPES,\n STN_LAYOUT_SLOT_USAGE,\n STN_LAYOUT_ALERT_CENTER_USAGE,\n type StnLayoutScreenKind,\n} from '@stn-uiux/pub-ui/data/stnLayout'\nexport {\n StnPageScaffold,\n StnPageScaffoldRoot,\n StnPageScaffoldRegion,\n StnPageScaffoldMapPlaceholder,\n StnPageScaffoldMapCanvas,\n StnPageScaffoldLayer,\n ListPageScaffold,\n DashboardPageScaffold,\n type StnPageScaffoldRootProps,\n type StnPageScaffoldRegionProps,\n type StnPageScaffoldMapPlaceholderProps,\n type StnPageScaffoldMapCanvasProps,\n type StnPageScaffoldLayerProps,\n type ListPageScaffoldProps,\n type DashboardPageScaffoldProps,\n type DashboardType,\n} from './patterns/scaffold/StnPageScaffold'\nexport { AlertCenterPageScaffold, type AlertCenterPageScaffoldProps } from './patterns/scaffold/AlertCenterPageScaffold'\nexport { LoginPageScaffold, type LoginPageScaffoldProps } from './patterns/scaffold/LoginPageScaffold'\nexport {\n StnDashboard,\n StnMapCanvas,\n type StnDashboardProps,\n type StnDashboardWidgetPosition,\n type StnDashboardRegionProps,\n type StnMapCanvasProps,\n} from './patterns/dashboard'\nexport {\n StnLoadingSkeleton,\n StnLoadingSkeletonLine,\n StnLoadingSkeletonBlock,\n StnLoadingSkeletonCircle,\n StnLoadingSkeletonProfile,\n StnLoadingSkeletonWidget,\n StnLoadingSkeletonTable,\n type StnLoadingSkeletonLineProps,\n type StnLoadingSkeletonBlockProps,\n type StnLoadingSkeletonCircleProps,\n type StnLoadingSkeletonProfileProps,\n type StnLoadingSkeletonWidgetProps,\n type StnLoadingSkeletonTableProps,\n type StnLoadingSkeletonProps,\n type StnLoadingSkeletonRootProps,\n type StnLoadingSkeletonVariant,\n} from './patterns/scaffold/StnLoadingSkeleton'\nexport {\n StnLayer,\n StnLayerBackground,\n StnLayerContent,\n StnLayerDim,\n StnLayerModal,\n type StnLayerProps,\n type StnLayerRoleProps,\n} from './patterns/layer/StnLayer'\nexport {\n STN_PAGE_SCAFFOLD_INTRO,\n STN_PAGE_SCAFFOLD_KINDS,\n STN_PAGE_SCAFFOLD_COMPOUND_USAGE,\n STN_ALERT_CENTER_PAGE_SCAFFOLD_USAGE,\n type StnPageScaffoldKind,\n} from '@stn-uiux/pub-ui/data/stnLayout'\nexport {\n STN_LOADING_SKELETON_INTRO,\n STN_LOADING_SKELETON_USAGE,\n STN_LOADING_SKELETON_PARTS,\n} from '@stn-uiux/pub-ui/data/stnLoadingSkeleton'\nexport {\n STN_LAYER_INTRO,\n STN_LAYER_SURFACE_ROWS,\n STN_LAYER_ROLE_ROWS,\n STN_LAYER_ROLE_TO_LEVEL,\n STN_LAYER_ROLE_USAGE,\n STN_ELEVATION_Z_INDEX,\n type StnElevationLevel,\n type StnLayerSurface,\n type StnLayerRole,\n} from '@stn-uiux/pub-ui/data/stnLayer'\nexport {\n StnFloatingToolbar,\n StnFloatingToolbarPreset,\n StnMapToolbar,\n type StnFloatingToolbarProps,\n type StnFloatingToolbarPlacement,\n type StnToolbarOrientation,\n type StnFloatingToolbarPresetProps,\n type StnMapToolbarProps,\n} from './patterns/toolbar/StnFloatingToolbar'\nexport {\n StnEventBanner,\n type StnEventBannerProps,\n type StnEventBannerPlacement,\n type StnEventBannerSeverity,\n type StnEventBannerGap,\n} from './components/StnEventBanner'\n\nexport * from './components/topology'\n","import type { CSSProperties, ReactNode } from 'react'\n\nimport { cn } from '../cn'\nimport { StnIcon } from './StnIcon'\n\nexport type StnIconBoxSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl'\nexport type StnIconBoxColor =\n | 'primary'\n | 'secondary'\n | 'critical'\n | 'major'\n | 'minor'\n | 'warning'\n | 'success'\n | 'error'\n | 'info'\n | (string & {})\n\nexport type StnIconBoxProps = {\n /** Iconography slug (`line/user`) 또는 직접 전달하는 ReactNode */\n icon?: ReactNode\n /** 박스 크기 ('xs' | 'sm' | 'md' | 'lg' | 'xl', 기본값: 'md') */\n size?: StnIconBoxSize\n /** 시맨틱 색상 ('primary' | 'secondary' | 'critical' | 'major' | 'minor' | 'warning' 등) 또는 커스텀 CSS 색상 */\n color?: StnIconBoxColor\n /** 아이콘 자체의 px 크기 (지정하지 않으면 size에 따라 12 / 14 / 16 / 20 / 24로 자동 결정) */\n iconSize?: number\n /** 활성(Active) 상태 여부 */\n active?: boolean\n className?: string\n style?: CSSProperties\n children?: ReactNode\n}\n\nconst SEMANTIC_COLORS = new Set([\n 'primary',\n 'secondary',\n 'critical',\n 'major',\n 'minor',\n 'warning',\n 'success',\n 'error',\n 'info',\n])\n\nconst DEFAULT_ICON_SIZES: Record<StnIconBoxSize, number> = {\n xs: 12,\n sm: 14,\n md: 16,\n lg: 20,\n xl: 24,\n}\n\n/**\n * StnIconBox — Design System 표준 입체 아이콘 박스 컴포넌트\n * Neumorphism inset + drop shadow 효과와 그라데이션 배경을 가집니다.\n * 크기 variant: xs (20px) | sm (24px) | md (28px - default) | lg (36px) | xl (44px)\n */\nexport function StnIconBox({\n icon,\n size = 'md',\n color,\n iconSize,\n active,\n className,\n style,\n children,\n}: StnIconBoxProps) {\n const isSemanticColor = color && SEMANTIC_COLORS.has(color)\n const customColor = isSemanticColor ? undefined : color\n\n const resolvedIconSize = iconSize ?? DEFAULT_ICON_SIZES[size] ?? 16\n\n let content: ReactNode = children\n\n if (!content && icon) {\n if (typeof icon === 'string') {\n content = <StnIcon name={icon} size={resolvedIconSize} color={customColor || 'currentColor'} />\n } else {\n content = icon\n }\n }\n\n return (\n <span\n className={cn(\n 'stn-icon-box',\n size,\n active && 'active',\n isSemanticColor && color,\n className,\n )}\n style={style}\n aria-hidden\n >\n {content}\n </span>\n )\n}\r\n","import { forwardRef, type ComponentPropsWithoutRef } from 'react'\n\nimport { buildPaginationItems } from '../paginationRange'\nimport { cn } from '../cn'\nimport type { StnWithoutStyle } from '../stnStrictProps'\n\n/** Infomap paging chevron ≈ 6×11 */\nconst PrevIcon = () => (\n <svg\n className=\"stn-pagination__icon\"\n viewBox=\"0 0 6 11\"\n width=\"6\"\n height=\"11\"\n aria-hidden=\"true\"\n >\n <path\n fill=\"currentColor\"\n d=\"M5.2.3a.75.75 0 0 1 0 1.06L1.56 5.5l3.64 4.14a.75.75 0 1 1-1.12 1L.15 6.06a.75.75 0 0 1 0-1.12L4.08.3A.75.75 0 0 1 5.2.3Z\"\n />\n </svg>\n)\n\nconst NextIcon = () => (\n <svg\n className=\"stn-pagination__icon\"\n viewBox=\"0 0 6 11\"\n width=\"6\"\n height=\"11\"\n aria-hidden=\"true\"\n >\n <path\n fill=\"currentColor\"\n d=\"M.8.3a.75.75 0 0 1 1.12 0L5.85 4.94a.75.75 0 0 1 0 1.12L1.92 10.64a.75.75 0 1 1-1.12-1L4.44 5.5.8 1.36A.75.75 0 0 1 .8.3Z\"\n />\n </svg>\n)\n\nexport type StnPaginationProps = StnWithoutStyle<Omit<ComponentPropsWithoutRef<'nav'>, 'className' | 'children'>> & {\n /** 1-based current page */\n page: number\n /** Total page count */\n count: number\n onPageChange?: (page: number) => void\n /** Pages shown on each side of current when ellipsis appear (Infomap middle) */\n siblingCount?: number\n className?: string\n}\n\n/**\n * Infomap Figma `paging` — 모양: `stn-pagination.css`\n */\nexport const StnPagination = forwardRef<HTMLElement, StnPaginationProps>(function StnPagination(\n {\n page,\n count,\n onPageChange,\n siblingCount = 1,\n className,\n 'aria-label': ariaLabel = 'pagination navigation',\n ...rest\n },\n ref,\n) {\n const items = buildPaginationItems(page, count, siblingCount)\n const canPrev = page > 1\n const canNext = page < count\n\n return (\n <nav ref={ref} className={cn('stn-pagination', className)} aria-label={ariaLabel} {...rest}>\n <button\n type=\"button\"\n className=\"stn-pagination__prev\"\n disabled={!canPrev}\n aria-label=\"이전 페이지\"\n onClick={() => canPrev && onPageChange?.(page - 1)}\n >\n <PrevIcon />\n </button>\n <ul className=\"stn-pagination__list\">\n {items.map((item, index) =>\n item === 'ellipsis' ? (\n <li key={`ellipsis-${index}`}>\n <span className=\"stn-pagination__ellipsis\" aria-hidden=\"true\">\n …\n </span>\n </li>\n ) : (\n <li key={item}>\n <button\n type=\"button\"\n className={cn('stn-pagination__page', item === page && 'is-active')}\n aria-label={`${item} 페이지`}\n aria-current={item === page ? 'page' : undefined}\n onClick={() => item !== page && onPageChange?.(item)}\n >\n {item}\n </button>\n </li>\n ),\n )}\n </ul>\n <button\n type=\"button\"\n className=\"stn-pagination__next\"\n disabled={!canNext}\n aria-label=\"다음 페이지\"\n onClick={() => canNext && onPageChange?.(page + 1)}\n >\n <NextIcon />\n </button>\n </nav>\n )\n})\n","import { forwardRef, useEffect, type HTMLAttributes, type ReactNode } from 'react'\nimport { createPortal } from 'react-dom'\n\nimport { cn } from '../cn'\nimport { StnLayerDim, StnLayerModal } from '../patterns/layer/StnLayer'\nimport { StnButton } from './StnButton'\n\n/** Matches `STN_POPUP_SIZES` in `@stn-uiux/pub-ui/data/stnPopup` */\nexport type StnPopupSize =\n | 'xs'\n | 's'\n | 'sm'\n | 'm'\n | 'md'\n | 'l'\n | 'lg'\n | 'xl'\n | 'xxl'\n | '2xl'\n | 'full'\n\nconst SIZE_CLASS: Record<StnPopupSize, string> = {\n xs: 'stn-pop--xs',\n s: 'stn-pop--sm',\n sm: 'stn-pop--sm',\n m: 'stn-pop--md',\n md: 'stn-pop--md',\n l: 'stn-pop--lg',\n lg: 'stn-pop--lg',\n xl: 'stn-pop--xl',\n xxl: 'stn-pop--xxl',\n '2xl': 'stn-pop--2xl',\n full: 'stn-pop--full',\n}\n\nexport type StnPopupProps = Omit<HTMLAttributes<HTMLDivElement>, 'className' | 'children' | 'title'> & {\n open: boolean\n onClose: () => void\n title: ReactNode\n size?: StnPopupSize\n children: ReactNode\n /** Footer actions — maps to `.stn-pop__actions` */\n actions?: ReactNode\n className?: string\n /** dim + modal portal (default true) — `StnLayer.Dim` / `StnLayer.Modal` 스택 */\n portal?: boolean\n /** close when dim is clicked (default true) */\n closeOnScrimClick?: boolean\n /** Dim(스크림) 배경 여부 (기본 true). false 시 어두운 배경 딤 없이 모달만 노출 */\n dim?: boolean\n}\n\nexport const StnPopup = forwardRef<HTMLDivElement, StnPopupProps>(function StnPopup(\n {\n open,\n onClose,\n title,\n size = 'md',\n children,\n actions,\n className,\n portal = true,\n closeOnScrimClick = true,\n dim = true,\n role = 'dialog',\n ...rest\n },\n ref,\n) {\n useEffect(() => {\n if (!open || !portal) 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, portal])\n\n if (!open) return null\n\n const titleId = rest.id ? `${rest.id}-title` : 'stn-pop-title'\n\n const dialog = (\n <div\n ref={ref}\n role={role}\n aria-modal=\"true\"\n aria-labelledby={titleId}\n className={cn('stn-pop', SIZE_CLASS[size], 'stn-pop--open', className)}\n {...rest}\n >\n <div className=\"stn-pop__cont\">\n <div className=\"stn-pop__panel\">\n <div className=\"stn-pop__head\" id={titleId}>\n <h4>{title}</h4>\n </div>\n <StnButton\n icon=\"line/x\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"stn-pop__close\"\n aria-label=\"닫기\"\n onClick={onClose}\n />\n <div className=\"stn-pop__body\">{children}</div>\n {actions ? <div className=\"stn-pop__actions\">{actions}</div> : null}\n </div>\n </div>\n </div>\n )\n\n if (!portal) {\n return dialog\n }\n\n return createPortal(\n <div className={cn('stn-pop-stack', !dim && 'no-dim')}>\n <StnLayerDim className=\"stn-pop-stack__dim\">\n <button\n type=\"button\"\n className=\"stn-layer__dim-hit\"\n aria-label=\"닫기\"\n tabIndex={-1}\n onClick={closeOnScrimClick ? onClose : undefined}\n />\n </StnLayerDim>\n <StnLayerModal className=\"stn-pop-stack__modal\">{dialog}</StnLayerModal>\n </div>,\n document.body,\n )\n})\n","import { forwardRef, type HTMLAttributes, type ReactNode } from 'react'\n\nimport type {\n StnElevationLevel,\n StnLayerRole,\n StnLayerSurface,\n} from '@stn-uiux/pub-ui/data/stnLayer'\nimport { STN_LAYER_ROLE_TO_LEVEL } from '@stn-uiux/pub-ui/data/stnLayer'\n\nimport { cn } from '../../cn'\n\n\nexport type StnLayerProps = Omit<HTMLAttributes<HTMLDivElement>, 'className'> & {\n /** L0~L4 · map — 고정 z-index 층 */\n level: StnElevationLevel\n /**\n * Infomap 화면 역할. 미지정 시 level 기본값(0→background · 1→content · 2→modal).\n * `StnLayer.Dim` 은 같은 L2 elevation이어도 role이 달라야 함.\n */\n role?: StnLayerRole | 'map'\n /**\n * 면 채움 방식. 기본: L0=default, L1~L4=transparent(투명 셸).\n * - widget / panel: L1 카드·패널 + shadow.2\n * - solid: 레벨 surface-N (L2~L4 선택)\n * - gnb: L2 GNB 투명 크롬\n * - dim: L3 딤 스크림 (--stn-dim-bg)\n */\n surface?: StnLayerSurface\n /** solid·widget·panel 에 elevation shadow 적용 (L1 widget/panel은 기본 on) */\n withShadow?: boolean\n className?: string\n children?: ReactNode\n}\n\n/** role 별칭 — level은 역할에서 고정 */\nexport type StnLayerRoleProps = Omit<StnLayerProps, 'level' | 'role'>\n\nfunction defaultSurface(level: StnElevationLevel): StnLayerSurface {\n if (level === 0) return 'default'\n if (level === 'map') return 'transparent'\n return 'transparent'\n}\n\nfunction levelClass(level: StnElevationLevel): string {\n if (level === 'map') return 'stn-elev-map'\n return `stn-elev-${level}`\n}\n\nfunction surfaceClasses(level: StnElevationLevel, surface: StnLayerSurface): string[] {\n const out: string[] = []\n if (surface === 'transparent' || (surface === 'default' && level !== 0)) {\n out.push('stn-elev--shell')\n }\n if (surface === 'widget') out.push('stn-elev--panel')\n if (surface === 'panel') out.push('stn-elev--content-panel')\n if (surface === 'solid') out.push('stn-elev--solid')\n if (surface === 'gnb') out.push('stn-elev--gnb')\n if (surface === 'dim') out.push('stn-elev--dim')\n return out\n}\n\nfunction defaultWithShadow(surface: StnLayerSurface): boolean {\n return surface === 'widget' || surface === 'panel'\n}\n\nfunction roleForLevel(level: StnElevationLevel): StnLayerRole | 'map' | undefined {\n if (level === 'map') return 'map'\n if (level === 0) return 'background'\n if (level === 1) return 'content'\n if (level === 2) return 'modal'\n return undefined\n}\n\n/**\n * Elevation 레이어(도화지) — z-index 층을 고정하고, 면·shadow는 surface로 선택.\n * Pub: `stn-elev-{0-4}` + `stn-elev--shell|--panel|--solid|--dim|…`\n *\n * 역할: `StnLayer.Background` · `Content` · `Dim` · `Modal` (flat `StnLayerBackground` …)\n */\nconst StnLayerRoot = forwardRef<HTMLDivElement, StnLayerProps>(function StnLayer(\n { level, role: roleProp, surface: surfaceProp, withShadow: withShadowProp, className, children, ...rest },\n ref,\n) {\n const surface = surfaceProp ?? defaultSurface(level)\n const withShadow = withShadowProp ?? defaultWithShadow(surface)\n const role = roleProp ?? roleForLevel(level)\n\n return (\n <div\n ref={ref}\n data-stn-layer={level}\n data-stn-layer-role={role}\n data-stn-layer-surface={surface}\n className={cn(\n 'stn-layer',\n typeof level === 'number' && `stn-layer-${level}`,\n role === 'dim' && 'stn-layer-dim',\n levelClass(level),\n ...surfaceClasses(level, surface),\n withShadow && 'stn-elev--with-shadow',\n className,\n )}\n {...rest}\n >\n {children}\n </div>\n )\n})\n\nfunction createRoleLayer(\n role: StnLayerRole,\n displayName: string,\n defaultSurfaceForRole?: StnLayerSurface,\n) {\n const level = STN_LAYER_ROLE_TO_LEVEL[role]\n const Comp = forwardRef<HTMLDivElement, StnLayerRoleProps>(function StnLayerRoleAlias(\n { surface, ...rest },\n ref,\n ) {\n return (\n <StnLayerRoot\n ref={ref}\n level={level}\n role={role}\n surface={surface ?? defaultSurfaceForRole}\n {...rest}\n />\n )\n })\n Comp.displayName = displayName\n return Comp\n}\n\nexport const StnLayerBackground = createRoleLayer('background', 'StnLayerBackground')\nexport const StnLayerContent = createRoleLayer('content', 'StnLayerContent')\nexport const StnLayerDim = createRoleLayer('dim', 'StnLayerDim', 'dim')\nexport const StnLayerModal = createRoleLayer('modal', 'StnLayerModal')\n\ntype StnLayerComponent = typeof StnLayerRoot & {\n Background: typeof StnLayerBackground\n Content: typeof StnLayerContent\n Dim: typeof StnLayerDim\n Modal: typeof StnLayerModal\n}\n\nexport const StnLayer = StnLayerRoot as StnLayerComponent\nStnLayer.Background = StnLayerBackground\nStnLayer.Content = StnLayerContent\nStnLayer.Dim = StnLayerDim\nStnLayer.Modal = StnLayerModal\n","import { StnButton } from '../StnButton'\n\nexport type StnToastCloseButtonProps = {\n onClose?: () => void\n closeToast?: (dismissAll?: boolean) => void\n ariaLabel?: string\n className?: string\n}\n\n/**\n * Toast 닫기 — `StnButton` icon-only (`line/x` · tertiary ghost)\n * 클래스: `.stn-toast-close`\n */\nexport function StnToastCloseButton({\n onClose,\n closeToast,\n ariaLabel = '닫기',\n className,\n}: StnToastCloseButtonProps) {\n const handleClick = (e: React.MouseEvent) => {\n e.stopPropagation()\n if (onClose) {\n onClose()\n } else if (closeToast) {\n closeToast()\n }\n }\n\n return (\n <StnButton\n icon=\"line/x\"\n variant=\"ghost\"\n size=\"small\"\n className={['stn-toast-close', className].filter(Boolean).join(' ')}\n aria-label={ariaLabel}\n onClick={handleClick}\n />\n )\n}\n","import {\n STN_TOAST_ICON_SLUG,\n type StnToastKind,\n} from '@stn-uiux/pub-ui/data/stnToast'\nimport { StnIcon } from '../StnIcon'\nimport { cn } from '../../cn'\n\nconst TYPE_TO_KIND: Record<string, StnToastKind> = {\n info: 'info',\n success: 'success',\n warning: 'warn',\n warn: 'warn',\n error: 'error',\n default: 'info',\n}\n\nexport type StnToastIconProps = {\n type?: string\n kind?: StnToastKind\n theme?: string\n isLoading?: boolean\n size?: number\n className?: string\n}\n\n/**\n * Toast 유형 아이콘 — StnIcon 기반 (currentColor 연동)\n */\nexport function StnToastIcon({\n type,\n kind: kindProp,\n isLoading,\n size = 20,\n className,\n}: StnToastIconProps) {\n if (isLoading) return null\n\n const kind =\n kindProp ?? (type ? TYPE_TO_KIND[type] : undefined) ?? 'info'\n const slug = STN_TOAST_ICON_SLUG[kind]\n\n return (\n <StnIcon\n name={slug}\n size={size}\n color=\"currentColor\"\n className={cn('stn-toast-type-icon', className)}\n />\n )\n}\n\nexport { STN_TOAST_ICON_SLUG }\n","import {\n forwardRef,\n useEffect,\n useRef,\n type CSSProperties,\n type HTMLAttributes,\n type ReactNode,\n} from 'react'\n\nimport { cn } from '../cn'\nimport type { StnWithoutStyle } from '../stnStrictProps'\n\nexport type StnProgressBarTone =\n | 'primary'\n | 'secondary'\n | 'success'\n | 'critical'\n | 'major'\n | 'minor'\n | 'warning'\n | 'neutral'\n | 'info'\n | 'warn'\n | 'error'\n | (string & {})\nexport type StnProgressBarGradient =\n | 'none'\n | 'main'\n | 'primary'\n | 'secondary'\n | 'critical'\n | 'major'\n | 'minor'\n | 'warning'\nexport type StnProgressBarSize = 'sm' | 'md' | 'lg'\nexport type StnProgressBarTrack = 'default' | 'muted' | 'dark'\nexport type StnProgressBarLabelPosition = 'top' | 'bottom' | 'inside' | 'side'\nexport type StnProgressBarLabelAlign = 'between' | 'center' | 'start' | 'end'\n\nexport type StnProgressBarProps = StnWithoutStyle<Omit<HTMLAttributes<HTMLDivElement>, 'children'>> & {\n /** 정적 진행률 0–100 (countdown이 없을 때) */\n value?: number\n /** 기본 100 */\n max?: number\n tone?: StnProgressBarTone\n gradient?: StnProgressBarGradient\n size?: StnProgressBarSize\n /** 배경 트랙 색상 지정 (default: 회색 트랙, muted: 투명 트랙, dark: 짙은 회색) */\n track?: StnProgressBarTrack\n /** 진행률 텍스트 표시 여부 */\n showLabel?: boolean\n /** 텍스트 라벨 (미지정 시 `${Math.round(pct)}%`) */\n label?: ReactNode\n /** 좌측 타이틀 텍스트 (기본 '진행률', null 지정 시 타이틀 생략) */\n labelTitle?: ReactNode\n /** 레이블 위치 ('top' | 'bottom' | 'inside' | 'side') - 기본 'top' */\n labelPosition?: StnProgressBarLabelPosition\n /** 레이블 정렬 방식 ('between' | 'center' | 'start' | 'end') - 기본 'between' */\n labelAlign?: StnProgressBarLabelAlign\n /**\n * ms — 설정 시 100%→0 countdown 애니메이션\n * Toast autoClose와 맞춤 · `onComplete`에서 닫기\n */\n duration?: number\n /** countdown pause (toastify isPaused) */\n paused?: boolean\n onComplete?: () => void\n /** Toast 하단 슬롯 (`.stn-progress-bar.toast`) */\n toastSlot?: boolean\n}\n\n/**\n * Progress Bar — `.stn-progress-bar`\n * Modifiers: `.sm` · `.md` · `.lg` · `.info` · `.success` · `.warn` · `.error` · `.track-muted` · `.track-dark`\n */\nexport const StnProgressBar = forwardRef<HTMLDivElement, StnProgressBarProps>(function StnProgressBar(\n {\n value = 100,\n max = 100,\n tone = 'neutral',\n gradient = 'none',\n size = 'md',\n track = 'default',\n showLabel = false,\n label,\n labelTitle = '진행률',\n labelPosition = 'top',\n labelAlign = 'between',\n duration,\n paused = false,\n onComplete,\n toastSlot = false,\n className,\n ...rest\n },\n ref,\n) {\n const fillRef = useRef<HTMLSpanElement>(null)\n const isCountdown = duration != null && duration > 0\n const pct = max <= 0 ? 0 : Math.min(100, Math.max(0, (value / max) * 100))\n const pctNum = pct / 100\n const displayLabel = label ?? `${Math.round(pct)}%`\n const hasGradient = gradient != null && gradient !== 'none'\n\n useEffect(() => {\n if (!isCountdown || !onComplete) return\n const el = fillRef.current\n if (!el) return\n const handleEnd = () => onComplete()\n el.addEventListener('animationend', handleEnd)\n return () => el.removeEventListener('animationend', handleEnd)\n }, [isCountdown, onComplete, duration])\n\n const cssVars = {\n ['--stn-progress-pct' as string]: `${pct}%`,\n ['--stn-progress-pct-num' as string]: String(isCountdown ? 1 : pctNum),\n ...(isCountdown ? { ['--stn-progress-duration' as string]: `${duration}ms` } : {}),\n } as CSSProperties\n\n const barElement = (\n <div\n ref={ref}\n className={cn(\n 'stn-progress-bar',\n size,\n !hasGradient && tone !== 'neutral' && tone,\n hasGradient && `gradient-${gradient}`,\n track !== 'default' && `track-${track}`,\n toastSlot && 'toast',\n className,\n )}\n style={cssVars}\n role=\"progressbar\"\n aria-valuemin={0}\n aria-valuemax={max}\n aria-valuenow={isCountdown ? undefined : value}\n {...rest}\n >\n <span\n ref={fillRef}\n className={cn(\n 'stn-progress-bar__fill',\n isCountdown && 'stn-progress-bar__fill--countdown',\n isCountdown && paused && 'is-paused',\n )}\n aria-hidden\n />\n {showLabel && labelPosition === 'inside' && (\n <span className=\"stn-progress-bar__label--inside\">{displayLabel}</span>\n )}\n </div>\n )\n\n if (showLabel && labelPosition === 'side') {\n const hasTitle = labelTitle != null && labelTitle !== '' && labelAlign !== 'end'\n const hasValue = displayLabel != null && displayLabel !== '' && labelAlign !== 'start'\n\n return (\n <div\n className={cn(\n 'stn-progress-bar-wrap',\n 'stn-progress-bar-wrap--side',\n )}\n >\n {hasTitle && (\n <span className=\"stn-progress-bar-wrap__title\">{labelTitle}</span>\n )}\n {barElement}\n {hasValue && (\n <span className=\"stn-progress-bar-wrap__value\">{displayLabel}</span>\n )}\n </div>\n )\n }\n\n if (showLabel && labelPosition !== 'inside') {\n const isCenter = labelAlign === 'center'\n const isStart = labelAlign === 'start'\n const isEnd = labelAlign === 'end'\n\n return (\n <div\n className={cn(\n 'stn-progress-bar-wrap',\n labelPosition === 'bottom' && 'stn-progress-bar-wrap--bottom',\n )}\n >\n <div\n className={cn(\n 'stn-progress-bar-wrap__label',\n isCenter && 'stn-progress-bar-wrap__label--center',\n isStart && 'stn-progress-bar-wrap__label--start',\n isEnd && 'stn-progress-bar-wrap__label--end',\n )}\n >\n {labelAlign !== 'center' && labelTitle != null && labelTitle !== '' && (\n <span className=\"stn-progress-bar-wrap__title\">{labelTitle}</span>\n )}\n {labelAlign === 'center' && labelTitle != null && labelTitle !== '' && (\n <span className=\"stn-progress-bar-wrap__title\">{labelTitle}</span>\n )}\n <span className=\"stn-progress-bar-wrap__value\">{displayLabel}</span>\n </div>\n {barElement}\n </div>\n )\n }\n\n return barElement\n})\n\n","import { forwardRef, type HTMLAttributes, type ReactNode, useId } from 'react'\nimport { cn } from '../cn'\nimport type { StnWithoutStyle } from '../stnStrictProps'\n\nexport type StnCircularProgressSize = 'sm' | 'md' | 'lg' | 'xl'\nexport type StnCircularProgressTone =\n | 'primary'\n | 'secondary'\n | 'success'\n | 'critical'\n | 'major'\n | 'minor'\n | 'warning'\n | 'info'\n | 'warn'\n | 'error'\n | (string & {})\nexport type StnCircularProgressGradient =\n | 'none'\n | 'main'\n | 'primary'\n | 'secondary'\n | 'critical'\n | 'major'\n | 'minor'\n | 'warning'\nexport type StnCircularProgressTrack = 'default' | 'muted'\nexport type StnCircularProgressLabelPosition = 'center' | 'top' | 'bottom' | 'left' | 'right'\n\nexport type StnCircularProgressProps = StnWithoutStyle<Omit<HTMLAttributes<HTMLDivElement>, 'children'>> & {\n /** 0 - 100 */\n value?: number\n max?: number\n size?: StnCircularProgressSize\n tone?: StnCircularProgressTone\n gradient?: StnCircularProgressGradient\n track?: StnCircularProgressTrack\n showLabel?: boolean\n label?: ReactNode\n /** 레이블 표시 위치 ('center' | 'top' | 'bottom' | 'left' | 'right') - 기본 'center' */\n labelPosition?: StnCircularProgressLabelPosition\n /** 외부 레이블 배치 시 원형 안쪽 중앙에 함께 표시할 레이블 */\n innerLabel?: ReactNode | boolean\n}\n\nconst SIZE_MAP: Record<StnCircularProgressSize, { dim: number; stroke: number }> = {\n sm: { dim: 32, stroke: 3 },\n md: { dim: 48, stroke: 4 },\n lg: { dim: 64, stroke: 5 },\n xl: { dim: 88, stroke: 6 },\n}\n\nconst GRADIENT_STOPS: Record<\n Exclude<StnCircularProgressGradient, 'none'>,\n { start: string; end: string }\n> = {\n main: { start: 'var(--stn-blue-300)', end: 'var(--stn-purple-250)' },\n primary: { start: 'var(--stn-blue-500)', end: 'var(--stn-blue-350)' },\n secondary: { start: 'var(--stn-purple-500)', end: 'var(--stn-purple-300)' },\n critical: { start: 'var(--stn-red-500)', end: 'var(--stn-red-350)' },\n major: { start: 'var(--stn-orange-400)', end: 'var(--stn-orange-250)' },\n minor: { start: 'var(--stn-yellow-400)', end: 'var(--stn-yellow-250)' },\n warning: { start: 'var(--stn-teal-500)', end: 'var(--stn-teal-350)' },\n}\n\n/**\n * Circular Progress ? `.stn-progress-circle`\n * Modifiers: `.sm` �� `.md` �� `.lg` �� `.xl` �� `.info` �� `.success` �� `.warn` �� `.error` �� `.gradient-main` �� `.track-muted`\n */\nexport const StnCircularProgress = forwardRef<HTMLDivElement, StnCircularProgressProps>(\n function StnCircularProgress(\n {\n value = 0,\n max = 100,\n size = 'md',\n tone = 'primary',\n gradient = 'none',\n track = 'default',\n showLabel = false,\n label,\n labelPosition = 'center',\n innerLabel,\n className,\n ...rest\n },\n ref,\n ) {\n const rawId = useId()\n const gradientId = `stn-circle-grad-${rawId.replace(/[^a-zA-Z0-9_-]/g, '')}`\n\n const pct = max <= 0 ? 0 : Math.min(100, Math.max(0, (value / max) * 100))\n const displayLabel = label ?? `${Math.round(pct)}%`\n const isExternalLabel =\n showLabel &&\n (labelPosition === 'top' ||\n labelPosition === 'bottom' ||\n labelPosition === 'left' ||\n labelPosition === 'right')\n const hasInnerLabel =\n (showLabel && labelPosition === 'center' && size !== 'sm') ||\n (isExternalLabel && innerLabel != null && size !== 'sm')\n const centerText =\n labelPosition === 'center'\n ? displayLabel\n : innerLabel === true\n ? `${Math.round(pct)}%`\n : innerLabel\n\n const { dim, stroke } = SIZE_MAP[size]\n const radius = (dim - stroke) / 2\n const circumference = 2 * Math.PI * radius\n const strokeDashoffset = circumference - (pct / 100) * circumference\n\n const hasGradient = gradient !== 'none'\n const gradColors = hasGradient ? GRADIENT_STOPS[gradient] : null\n\n const circleElement = (\n <div\n ref={isExternalLabel ? undefined : ref}\n className={cn(\n 'stn-progress-circle',\n size,\n !hasGradient && tone,\n hasGradient && `gradient-${gradient}`,\n track !== 'default' && `track-${track}`,\n !isExternalLabel && className,\n )}\n role=\"progressbar\"\n aria-valuemin={0}\n aria-valuemax={max}\n aria-valuenow={value}\n {...(!isExternalLabel ? rest : {})}\n >\n <svg\n className=\"stn-progress-circle__svg\"\n viewBox={`0 0 ${dim} ${dim}`}\n width={dim}\n height={dim}\n >\n {hasGradient && gradColors && (\n <defs>\n <linearGradient\n id={gradientId}\n x1=\"0%\"\n y1=\"0%\"\n x2=\"100%\"\n y2=\"100%\"\n gradientTransform=\"rotate(90 0.5 0.5)\"\n >\n <stop offset=\"0%\" stopColor={gradColors.start} />\n <stop offset=\"100%\" stopColor={gradColors.end} />\n </linearGradient>\n </defs>\n )}\n\n <circle\n className=\"stn-progress-circle__track\"\n cx={dim / 2}\n cy={dim / 2}\n r={radius}\n />\n\n <circle\n className=\"stn-progress-circle__fill\"\n cx={dim / 2}\n cy={dim / 2}\n r={radius}\n strokeDasharray={circumference}\n strokeDashoffset={strokeDashoffset}\n stroke={hasGradient ? `url(#${gradientId})` : undefined}\n style={hasGradient ? { stroke: `url(#${gradientId})` } : undefined}\n />\n </svg>\n\n {hasInnerLabel && (\n <span className=\"stn-progress-circle__label\">{centerText}</span>\n )}\n </div>\n )\n\n if (isExternalLabel) {\n return (\n <div\n ref={ref}\n className={cn(\n 'stn-progress-circle-wrap',\n `stn-progress-circle-wrap--${labelPosition}`,\n className,\n )}\n {...rest}\n >\n {circleElement}\n <span className=\"stn-progress-circle-wrap__label\">{displayLabel}</span>\n </div>\n )\n }\n\n return circleElement\n },\n)\n","import {\n Children,\n forwardRef,\n createContext,\n useContext,\n useEffect,\n useRef,\n useState,\n type ButtonHTMLAttributes,\n type HTMLAttributes,\n type ReactNode,\n type TdHTMLAttributes,\n type ThHTMLAttributes,\n} from 'react'\n\nimport { cn } from '../cn'\nimport { StnCheckbox, type StnCheckboxProps } from './StnCheckbox'\n\n/** footerRight 액션 슬롯 권장 상한 (문서·Figma 101782) */\nexport const STN_TABLE_FOOTER_MAX_ACTIONS = 4\n\nfunction clampFooterRight(node: ReactNode): ReactNode {\n const kids = Children.toArray(node)\n if (kids.length <= STN_TABLE_FOOTER_MAX_ACTIONS) return node\n console.warn(\n `[StnTable] footerRight supports at most ${STN_TABLE_FOOTER_MAX_ACTIONS} actions; extras ignored.`,\n )\n return kids.slice(0, STN_TABLE_FOOTER_MAX_ACTIONS)\n}\n\nexport type StnTableContextValue = {\n trackVisited: boolean\n visitedRowId: string | null\n setVisitedRowId: (id: string | null) => void\n resizable?: boolean\n draggable?: boolean\n}\n\nexport const StnTableContext = createContext<StnTableContextValue | null>(null)\n\nexport type StnTableProps = {\n /** Scroll area content — usually `<StnTable.Grid>` / `table.stn-table__grid` */\n children: ReactNode\n /** `.stn-table__summary` */\n summary?: ReactNode\n /** `.stn-table__footer-center` — e.g. `<StnPagination />` */\n footerCenter?: ReactNode\n /** `.stn-table__page-size` — 행 수 드롭다운 (footer leading · summary 옆, `<StnDropdown size=\"sm\" direction=\"up\" />` 권장) */\n pageSize?: ReactNode\n /**\n * `.stn-table__footer-right` — 등록/수정/삭제 등 버튼 슬롯.\n * 최대 {@link STN_TABLE_FOOTER_MAX_ACTIONS}개 (초과 시 console.warn + slice).\n */\n footerRight?: ReactNode\n /** list view — `content_box` 높이에 맞춰 스크롤 영역 세로 채움 (`.stn-table--fill`) */\n fill?: boolean\n /** `.stn-table__scroll`에 인라인 스타일 지정 */\n scrollStyle?: React.CSSProperties\n /** 테이블 내의 rowId가 지정된 행 클릭 시 자동으로 visited 상태 관리 */\n trackVisited?: boolean\n /** 모든 Th에 리사이징 핸들러 기본 표시 여부 */\n resizable?: boolean\n /** 모든 Th를 기본적으로 드래그 가능하게 설정 */\n draggable?: boolean\n /** 컬럼 리사이징 종료 시 호출되는 콜백 (StnTable.Th에 name 속성 필수) */\n onColumnResize?: (name: string, newWidth: number) => void\n /** 컬럼 드래그 앤 드롭으로 순서 변경 시 호출되는 콜백 (StnTable.Th에 name 속성 필수) */\n onColumnReorder?: (sourceName: string, targetName: string, position: 'left' | 'right') => void\n className?: string\n}\n\nfunction StnTableBase({\n children,\n summary,\n footerCenter,\n pageSize,\n footerRight,\n fill = false,\n scrollStyle,\n trackVisited = false,\n resizable = false,\n draggable = false,\n onColumnResize,\n onColumnReorder,\n className,\n}: StnTableProps) {\n const [visitedRowId, setVisitedRowId] = useState<string | null>(null)\n const wrapperRef = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n const wrapper = wrapperRef.current\n if (!wrapper) return\n\n // 리사이징 핸들러\n let isResizing = false\n let startX = 0\n let currentResizer: HTMLElement | null = null\n let targetCols: HTMLElement[] = []\n let startWidths: number[] = []\n\n const handleMouseMove = (e: MouseEvent) => {\n if (!isResizing || targetCols.length === 0) return\n const delta = e.clientX - startX\n const deltaPerCol = delta / targetCols.length\n \n targetCols.forEach((col, idx) => {\n const newWidth = Math.max(50, startWidths[idx] + deltaPerCol)\n col.style.width = `${newWidth}px`\n })\n }\n\n const handleMouseUp = () => {\n if (!isResizing) return\n isResizing = false\n if (currentResizer) {\n currentResizer.classList.remove('is-resizing')\n }\n document.body.style.cursor = ''\n document.body.style.userSelect = ''\n\n if (onColumnResize) {\n targetCols.forEach(col => {\n const name = col.getAttribute('data-name')\n if (name) {\n const finalWidth = parseFloat(col.style.width) || col.getBoundingClientRect().width\n onColumnResize(name, finalWidth)\n }\n })\n }\n\n window.removeEventListener('mousemove', handleMouseMove)\n window.removeEventListener('mouseup', handleMouseUp)\n \n targetCols = []\n startWidths = []\n }\n\n const handleMouseDown = (e: MouseEvent) => {\n if (!resizable) return\n const target = e.target as HTMLElement\n if (!target.classList.contains('stn-table__resizer')) return\n\n const th = target.closest('th')\n if (!th) return\n\n const table = th.closest('table')\n if (!table) return\n\n const groupColsStr = th.getAttribute('data-group-cols')\n const targetElements: HTMLElement[] = []\n\n if (groupColsStr) {\n const names = groupColsStr.split(',')\n names.forEach(name => {\n const col = table.querySelector(`col[data-name=\"${name}\"]`) as HTMLElement\n if (col) targetElements.push(col)\n })\n } else {\n const name = th.getAttribute('data-name')\n if (name) {\n const col = table.querySelector(`col[data-name=\"${name}\"]`) as HTMLElement\n if (col) targetElements.push(col)\n }\n }\n\n if (targetElements.length === 0) return\n\n isResizing = true\n startX = e.clientX\n targetCols = targetElements\n startWidths = targetCols.map(col => col.style.width ? parseFloat(col.style.width) : col.getBoundingClientRect().width)\n \n currentResizer = target\n currentResizer.classList.add('is-resizing')\n \n document.body.style.cursor = 'col-resize'\n document.body.style.userSelect = 'none'\n\n window.addEventListener('mousemove', handleMouseMove)\n window.addEventListener('mouseup', handleMouseUp)\n }\n\n // 드래그 앤 드롭 핸들러\n let draggedName: string | null = null\n let dragOverName: string | null = null\n let dragOverPos: 'left' | 'right' | null = null\n let dragOverTh: HTMLElement | null = null\n\n const clearDragClasses = () => {\n if (dragOverTh) {\n dragOverTh.classList.remove('stn-table__th--drag-over-left', 'stn-table__th--drag-over-right')\n }\n dragOverTh = null\n dragOverName = null\n dragOverPos = null\n }\n\n const handleDragStart = (e: DragEvent) => {\n if (!draggable || isResizing) {\n e.preventDefault()\n return\n }\n \n const target = e.target as HTMLElement\n \n // 리사이저 자체를 드래그하려고 하는 경우도 방지\n if (target.classList?.contains('stn-table__resizer')) {\n e.preventDefault()\n return\n }\n\n const th = target.closest('th')\n if (!th || !th.hasAttribute('draggable')) {\n e.preventDefault()\n return\n }\n \n draggedName = th.getAttribute('data-name')\n if (!draggedName) return\n \n th.classList.add('stn-table__th--dragging')\n \n // 드래그 이미지 설정 가능하지만 기본값 사용\n }\n\n const handleDragOver = (e: DragEvent) => {\n if (!draggable || !draggedName) return\n const th = (e.target as HTMLElement).closest('th')\n if (!th || !th.hasAttribute('draggable')) return\n \n e.preventDefault()\n const name = th.getAttribute('data-name')\n if (!name || name === draggedName) return\n\n const rect = th.getBoundingClientRect()\n const isRight = e.clientX - rect.left > rect.width / 2\n\n if (dragOverTh !== th || dragOverPos !== (isRight ? 'right' : 'left')) {\n clearDragClasses()\n dragOverTh = th\n dragOverName = name\n dragOverPos = isRight ? 'right' : 'left'\n th.classList.add(isRight ? 'stn-table__th--drag-over-right' : 'stn-table__th--drag-over-left')\n }\n }\n\n const handleDragLeave = (e: DragEvent) => {\n if (!draggable || !draggedName) return\n const th = (e.target as HTMLElement).closest('th')\n if (th === dragOverTh) {\n clearDragClasses()\n }\n }\n\n const handleDrop = (e: DragEvent) => {\n if (!draggable || !draggedName) return\n const th = (e.target as HTMLElement).closest('th')\n if (!th) {\n clearDragClasses()\n return\n }\n\n e.preventDefault()\n \n if (dragOverName && dragOverPos && onColumnReorder && dragOverName !== draggedName) {\n onColumnReorder(draggedName, dragOverName, dragOverPos)\n }\n clearDragClasses()\n }\n\n const handleDragEnd = (e: DragEvent) => {\n const th = (e.target as HTMLElement).closest('th')\n if (th) th.classList.remove('stn-table__th--dragging')\n draggedName = null\n clearDragClasses()\n }\n\n wrapper.addEventListener('mousedown', handleMouseDown)\n wrapper.addEventListener('dragstart', handleDragStart)\n wrapper.addEventListener('dragover', handleDragOver)\n wrapper.addEventListener('dragleave', handleDragLeave)\n wrapper.addEventListener('drop', handleDrop)\n wrapper.addEventListener('dragend', handleDragEnd)\n\n return () => {\n wrapper.removeEventListener('mousedown', handleMouseDown)\n wrapper.removeEventListener('dragstart', handleDragStart)\n wrapper.removeEventListener('dragover', handleDragOver)\n wrapper.removeEventListener('dragleave', handleDragLeave)\n wrapper.removeEventListener('drop', handleDrop)\n wrapper.removeEventListener('dragend', handleDragEnd)\n }\n }, [resizable, draggable, onColumnResize, onColumnReorder])\n \n const right = footerRight != null ? clampFooterRight(footerRight) : null\n const hasLeading = summary != null || pageSize != null\n const hasCenter = footerCenter != null\n const hasFooter = hasLeading || hasCenter || right != null\n\n return (\n <StnTableContext.Provider value={{ trackVisited, visitedRowId, setVisitedRowId, resizable, draggable }}>\n <div ref={wrapperRef} className={cn('stn-table', fill && 'stn-table--fill', className)}>\n <div className=\"stn-table__scroll\" style={scrollStyle}>{children}</div>\n {hasFooter ? (\n <div className=\"stn-table__footer\">\n {hasLeading ? (\n <div className=\"stn-table__footer-leading\">\n {summary != null ? <p className=\"stn-table__summary\">{summary}</p> : null}\n {pageSize != null ? <div className=\"stn-table__page-size\">{pageSize}</div> : null}\n </div>\n ) : (\n <span />\n )}\n {hasCenter ? <div className=\"stn-table__footer-center\">{footerCenter}</div> : <span />}\n <div className=\"stn-table__footer-right\">{right}</div>\n </div>\n ) : null}\n </div>\n </StnTableContext.Provider>\n )\n}\n\nexport type StnTableGridProps = HTMLAttributes<HTMLTableElement>\n\nexport const StnTableGrid = forwardRef<HTMLTableElement, StnTableGridProps>(function StnTableGrid(\n { className, children, ...rest },\n ref,\n) {\n return (\n <table ref={ref} className={cn('stn-table__grid', className)} {...rest}>\n {children}\n </table>\n )\n})\n\nexport type StnTableHeadProps = HTMLAttributes<HTMLTableSectionElement>\n\nexport const StnTableHead = forwardRef<HTMLTableSectionElement, StnTableHeadProps>(\n function StnTableHead({ className, children, ...rest }, ref) {\n return (\n <thead ref={ref} className={cn('stn-table__thead', className)} {...rest}>\n {children}\n </thead>\n )\n },\n)\n\nexport type StnTableBodyProps = HTMLAttributes<HTMLTableSectionElement>\n\nexport const StnTableBody = forwardRef<HTMLTableSectionElement, StnTableBodyProps>(\n function StnTableBody({ className, children, ...rest }, ref) {\n return (\n <tbody ref={ref} className={cn('stn-table__tbody', className)} {...rest}>\n {children}\n </tbody>\n )\n },\n)\n\nexport type StnTableRowProps = HTMLAttributes<HTMLTableRowElement> & {\n /** hover background for body rows */\n hoverable?: boolean\n /** 행 선택(Active/Selected) 하이라이트 배경 (푸른 계열) */\n selected?: boolean\n /** 직전에 클릭했던 행 (보라 계열) */\n visited?: boolean\n /** 행 강조 (초록 계열) */\n highlighted?: boolean\n /** 클릭 가능한 행 포인터 커서 (cursor: pointer) */\n clickable?: boolean\n /** 프레스 면 — 마우스 다운 고정(문서) 또는 `.is-pressed` */\n pressed?: boolean\n /** StnTable에 trackVisited 설정 시 내부적으로 visited 상태를 추적하기 위한 고유 식별자 */\n rowId?: string\n}\n\nexport const StnTableRow = forwardRef<HTMLTableRowElement, StnTableRowProps>(function StnTableRow(\n { className, hoverable = false, selected = false, visited = false, highlighted = false, clickable = false, pressed = false, rowId, children, onClick, ...rest },\n ref,\n) {\n const ctx = useContext(StnTableContext)\n\n const isTrackedVisited = ctx?.trackVisited && ctx.visitedRowId != null && ctx.visitedRowId === rowId\n const finalVisited = visited || isTrackedVisited\n\n const handleClick = (e: React.MouseEvent<HTMLTableRowElement>) => {\n if (ctx?.trackVisited && rowId != null) {\n if (!(e.target as HTMLElement).closest('.stn-table__col-check')) {\n ctx.setVisitedRowId(rowId)\n }\n }\n onClick?.(e)\n }\n\n return (\n <tr\n ref={ref}\n className={cn(\n hoverable && 'is-hoverable',\n selected && 'is-selected',\n finalVisited && 'is-visited',\n highlighted && 'is-highlighted',\n clickable && 'is-clickable',\n pressed && 'is-pressed',\n className,\n )}\n onClick={handleClick}\n {...rest}\n >\n {children}\n </tr>\n )\n})\n\n/** Infomap 기본은 center. 텍스트 열은 left, 수치 열은 right. */\nexport type StnTableAlign = 'left' | 'center' | 'right'\n\nconst TABLE_COL_WIDTHS = new Set([60, 70, 72, 80, 100, 110, 120, 140, 160, 180, 200])\n\nfunction tableColWidthClass(width?: number | string): string | undefined {\n if (typeof width !== 'number' || !TABLE_COL_WIDTHS.has(width)) return undefined\n return `stn-table__col--${width}`\n}\n\nexport type StnTableThProps = Omit<ThHTMLAttributes<HTMLTableCellElement>, 'align'> & {\n /** checkbox column — 60px */\n check?: boolean\n /** 셀 텍스트 정렬 — `left` | `center`(기본) | `right` */\n align?: StnTableAlign\n /** 프레스 면 — 마우스 다운 고정(문서) 또는 `.is-pressed` */\n pressed?: boolean\n /**\n * 열 너비. 사이즈 토큰 스텝만 클래스로 붙는다.\n * `width={120}` → `.stn-table__col--120` → `var(--stn-size-120)`.\n * 60 · 70 · 72 · 80 · 100 · 110 · 120 · 140 · 160 · 180 · 200.\n * 빼 둔 열이 표의 남은 폭을 흡수한다. Body `Td`에는 두지 않는다.\n */\n width?: number\n /** 열 너비 조절 기능을 사용할지 여부 */\n resizable?: boolean\n /** 컬럼 식별자 (리사이징 및 드래그 앤 드롭 시 onColumnResize, onColumnReorder 콜백으로 전달됨) */\n name?: string\n /** 다중 헤더 그룹인 경우, 하위에 속한 컬럼들의 식별자 배열 (배열을 넘기면 리사이징 시 하위 열들이 골고루 조절됨) */\n groupCols?: string[]\n}\n\nexport const StnTableTh = forwardRef<HTMLTableCellElement, StnTableThProps>(function StnTableTh(\n { className, check = false, align, pressed = false, width, style, children, scope = 'col', resizable, draggable, name, groupCols, ...rest },\n ref,\n) {\n const ctx = useContext(StnTableContext)\n const colWidthClass = tableColWidthClass(width)\n const finalResizable = resizable ?? ctx?.resizable\n const finalDraggable = draggable ?? ctx?.draggable\n\n return (\n <th\n ref={ref}\n scope={scope}\n draggable={finalDraggable}\n data-name={name}\n data-group-cols={groupCols?.join(',')}\n className={cn(\n check && 'stn-table__col-check',\n align && `stn-table__th--align-${align}`,\n pressed && 'is-pressed',\n colWidthClass,\n className,\n )}\n style={style}\n {...rest}\n >\n {children}\n {finalResizable && (\n <div\n className=\"stn-table__resizer\"\n title=\"경계선 드래그하여 너비 조절\"\n />\n )}\n </th>\n )\n})\n\nexport type StnTableTdProps = Omit<TdHTMLAttributes<HTMLTableCellElement>, 'align'> & {\n check?: boolean\n /** 셀 텍스트 정렬 — `left` | `center`(기본) | `right` */\n align?: StnTableAlign\n}\n\nexport const StnTableTd = forwardRef<HTMLTableCellElement, StnTableTdProps>(function StnTableTd(\n { className, check = false, align, children, title, onMouseEnter, ...rest },\n ref,\n) {\n const autoTitle = typeof children === 'string' ? children : undefined;\n\n const handleMouseEnter = (e: React.MouseEvent<HTMLTableCellElement>) => {\n if (onMouseEnter) onMouseEnter(e);\n \n if (title === undefined && autoTitle) {\n const target = e.currentTarget;\n if (target.scrollWidth > target.clientWidth) {\n target.title = autoTitle;\n } else {\n target.title = '';\n }\n }\n };\n\n return (\n <td\n ref={ref}\n title={title}\n onMouseEnter={handleMouseEnter}\n className={cn(\n check && 'stn-table__col-check',\n align && `stn-table__td--align-${align}`,\n className,\n )}\n {...rest}\n >\n {children}\n </td>\n )\n})\n\nexport type StnTableThCheckProps = Omit<StnCheckboxProps, 'controlOnly' | 'variant'> &\n Pick<ThHTMLAttributes<HTMLTableCellElement>, 'scope' | 'className'>\n\n/** Infomap th 체크박스 전용 — Figma node 40000042:209512 (열 60 · 18×18 · 전체 선택) */\nexport const StnTableThCheck = forwardRef<HTMLInputElement, StnTableThCheckProps>(function StnTableThCheck(\n { label = '전체 선택', scope = 'col', className, ...rest },\n ref,\n) {\n return (\n <th scope={scope} className={cn('stn-table__col-check', className)}>\n <StnCheckbox ref={ref} controlOnly label={label} {...rest} />\n </th>\n )\n})\n\nexport type StnTableTdCheckProps = Omit<StnCheckboxProps, 'controlOnly' | 'variant'> &\n Pick<TdHTMLAttributes<HTMLTableCellElement>, 'className'>\n\n/** tbody 체크박스 셀 — `StnTable.ThCheck`와 동일 60px 열 */\nexport const StnTableTdCheck = forwardRef<HTMLInputElement, StnTableTdCheckProps>(function StnTableTdCheck(\n { label = '행 선택', className, ...rest },\n ref,\n) {\n return (\n <td className={cn('stn-table__col-check', className)}>\n <StnCheckbox ref={ref} controlOnly label={label} {...rest} />\n </td>\n )\n})\n\nexport type StnTableSortProps = ButtonHTMLAttributes<HTMLButtonElement> & {\n label: ReactNode\n /** none | ascending | descending */\n sort?: 'none' | 'ascending' | 'descending'\n /** 프레스 면 고정 — `.is-pressed` (문서·마우스 다운과 동일) */\n pressed?: boolean\n}\n\n/** Infomap sortable header — 텍스트+아이콘 inner + 클릭·`aria-sort` (Figma 40000042:209530) */\nexport const StnTableSort = forwardRef<HTMLButtonElement, StnTableSortProps>(function StnTableSort(\n { label, sort = 'none', pressed = false, className, type = 'button', ...rest },\n ref,\n) {\n const active = sort !== 'none'\n return (\n <button\n ref={ref}\n type={type}\n className={cn(\n 'stn-table__sort',\n active && 'is-active',\n sort === 'ascending' && 'is-asc',\n sort === 'descending' && 'is-desc',\n pressed && 'is-pressed',\n className,\n )}\n aria-sort={sort}\n {...rest}\n >\n <span className=\"stn-table__th-label-text\">{label}</span>\n <span className=\"stn-table__th-label-icon\" aria-hidden=\"true\" />\n </button>\n )\n})\n\nexport type StnTableCompound = typeof StnTableBase & {\n Grid: typeof StnTableGrid\n Head: typeof StnTableHead\n Body: typeof StnTableBody\n Row: typeof StnTableRow\n Th: typeof StnTableTh\n Td: typeof StnTableTd\n ThCheck: typeof StnTableThCheck\n TdCheck: typeof StnTableTdCheck\n Sort: typeof StnTableSort\n}\n\n/**\n * Pub list table shell — Infomap Figma thead/tbody (node 40000042:209510).\n * Markup: `.stn-table` > `.stn-table__scroll` + optional footer.\n */\nexport const StnTable = StnTableBase as StnTableCompound\n\nStnTable.Grid = StnTableGrid\nStnTable.Head = StnTableHead\nStnTable.Body = StnTableBody\nStnTable.Row = StnTableRow\nStnTable.Th = StnTableTh\nStnTable.Td = StnTableTd\nStnTable.ThCheck = StnTableThCheck\nStnTable.TdCheck = StnTableTdCheck\nStnTable.Sort = StnTableSort\n","import {\n forwardRef,\n useEffect,\n useId,\n useImperativeHandle,\n useRef,\n type InputHTMLAttributes,\n type ReactNode,\n} from 'react'\n\nimport { cn } from '../cn'\nimport type { StnWithoutStyle } from '../stnStrictProps'\n\nexport type StnCheckboxSize = 'sm' | 'md' | 'lg'\nexport type StnCheckboxColor =\n | 'primary'\n | 'secondary'\n | 'success'\n | 'critical'\n | 'major'\n | 'minor'\n | 'warning'\n | 'error'\n | 'neutral'\n | (string & {})\n\nexport type StnCheckboxLabelPlacement = 'end' | 'start' | 'top' | 'bottom' | 'left' | 'right'\n\nexport type StnCheckboxProps = StnWithoutStyle<\n Omit<InputHTMLAttributes<HTMLInputElement>, 'type' | 'className' | 'children' | 'size'>\n> & {\n /** 레이블 텍스트. 생략 시 단독 컨트롤로 표시 */\n label?: ReactNode\n /** 체크박스 크기 ('sm': 14px, 'md': 18px, 'lg': 22px) @default 'md' */\n size?: StnCheckboxSize\n /** 시멘틱 색상 또는 커스텀 색상 ('primary' | 'secondary' | 'success' | 'critical' | 'major' | 'minor' | 'warning' | 'error' | 'neutral') @default 'primary' */\n color?: StnCheckboxColor\n /** 레이블 배치 위치 ('end' | 'start' | 'top' | 'bottom') @default 'end' */\n labelPlacement?: StnCheckboxLabelPlacement\n /** 부분 선택 (Indeterminate) 상태 표시 */\n indeterminate?: boolean\n /** 부분 선택(indeterminate) 시 표시할 커스텀 아이콘 / 이미지 */\n indeterminateIcon?: ReactNode\n /** 선택(checked) 시 표시할 커스텀 아이콘 / 이미지 */\n checkedIcon?: ReactNode\n /** 미선택(unchecked) 시 표시할 커스텀 아이콘 / 이미지 */\n icon?: ReactNode\n /** 레이블 텍스트 숨기고 18px 컨트롤만 표시 (label이 없으면 자동 적용) */\n controlOnly?: boolean\n /** `.checkbox` 래퍼 */\n className?: string\n}\n\n/**\n * Checkbox — Figma `input`(default). 모양: `stn-checkbox.css`\n * 토글 필(ON/OFF)은 `<StnToggleButton>` · 트랙 스위치는 `<StnSwitch>`\n */\nexport const StnCheckbox = forwardRef<HTMLInputElement, StnCheckboxProps>(function StnCheckbox(\n {\n label,\n size = 'md',\n color,\n labelPlacement = 'end',\n indeterminate = false,\n indeterminateIcon,\n checkedIcon,\n icon,\n controlOnly,\n className,\n id: idProp,\n disabled,\n checked,\n defaultChecked,\n ...rest\n },\n forwardedRef,\n) {\n const autoId = useId()\n const id = idProp ?? autoId\n const innerRef = useRef<HTMLInputElement>(null)\n\n useImperativeHandle(forwardedRef, () => innerRef.current!)\n\n useEffect(() => {\n if (innerRef.current) {\n innerRef.current.indeterminate = Boolean(indeterminate)\n }\n }, [indeterminate])\n\n const isControlOnly = controlOnly ?? !label\n\n // Placement class\n const placementClass =\n labelPlacement === 'start' || labelPlacement === 'left'\n ? 'label-start'\n : labelPlacement === 'top'\n ? 'label-top'\n : labelPlacement === 'bottom'\n ? 'label-bottom'\n : ''\n\n // Tone class (단일 클래스 - 체크마크 색상만 지정 시 적용)\n const isKnownTone = color\n ? [\n 'primary',\n 'secondary',\n 'success',\n 'critical',\n 'major',\n 'minor',\n 'warning',\n 'error',\n 'red',\n 'warn',\n 'neutral',\n ].includes(color)\n : false\n const toneClass = isKnownTone && color ? (color === 'red' ? 'critical' : color) : ''\n const inlineStyle =\n !isKnownTone && color\n ? ({\n '--stn-checkbox-check': color,\n } as React.CSSProperties)\n : undefined\n\n // Determine if custom icon is rendered\n let customIconNode: ReactNode = null\n if (indeterminate && indeterminateIcon) {\n customIconNode = indeterminateIcon\n } else if ((checked || (checked == null && defaultChecked)) && checkedIcon) {\n customIconNode = checkedIcon\n } else if (!checked && !defaultChecked && icon) {\n customIconNode = icon\n }\n const hasCustomIcon = customIconNode != null\n\n return (\n <span\n className={cn(\n 'checkbox',\n 'stn-checkbox',\n size !== 'md' && size,\n toneClass,\n placementClass,\n indeterminate && 'indeterminate',\n isControlOnly && 'control-only',\n disabled && 'disabled',\n hasCustomIcon && 'has-custom-icon',\n className,\n )}\n style={inlineStyle}\n >\n <input\n ref={innerRef}\n type=\"checkbox\"\n id={id}\n disabled={disabled}\n checked={checked}\n defaultChecked={defaultChecked}\n {...rest}\n />\n {hasCustomIcon && (\n <span className=\"stn-checkbox__custom-icon\" aria-hidden=\"true\">\n {customIconNode}\n </span>\n )}\n {label != null && <label htmlFor={id}>{label}</label>}\n {label == null && <label htmlFor={id} aria-hidden=\"true\" />}\n </span>\n )\n})\n\n","import {\n forwardRef,\n useCallback,\n useMemo,\n useState,\n type HTMLAttributes,\n} from 'react'\n\nimport { cn } from '../cn'\nimport { StnTreeNode, type StnTreeNodeDocState } from './StnTreeNode'\nimport {\n collectExpandableIds,\n flattenStnTree,\n type StnTreeItem,\n} from '../stnTreeFlatten'\n\nexport type StnTreeDocRowState = StnTreeNodeDocState\n\nexport type StnTreeProps = Omit<HTMLAttributes<HTMLDivElement>, 'children' | 'onSelect'> & {\n nodes: StnTreeItem[]\n /** 섹션 제목 — Figma `FOLDER STRUCTURE` */\n heading?: string\n defaultExpandedIds?: string[]\n expandedIds?: string[]\n onExpandedChange?: (ids: string[]) => void\n selectedId?: string | null\n defaultSelectedId?: string | null\n onSelect?: (id: string) => void\n /**\n * Docs Playground — 특정 행에 hover/pressed/selected 비주얼을 고정합니다.\n * 제품 코드에서는 쓰지 마세요.\n */\n docRowState?: { id: string; state: StnTreeDocRowState }\n}\n\nfunction useControllableSet(\n controlled: string[] | undefined,\n defaultIds: string[] | undefined,\n allExpandable: string[],\n) {\n const [internal, setInternal] = useState<string[]>(() => defaultIds ?? allExpandable)\n const value = controlled ?? internal\n const setValue = useCallback(\n (next: string[] | ((prev: string[]) => string[])) => {\n const resolved = typeof next === 'function' ? next(controlled ?? internal) : next\n if (controlled == null) setInternal(resolved)\n },\n [controlled, internal],\n )\n return [value, setValue] as const\n}\n\n/** Infomap folder structure tree — `StnTreeNode` 조립 · Figma 40000042:210359 */\nexport const StnTree = forwardRef<HTMLDivElement, StnTreeProps>(function StnTree(\n {\n nodes,\n heading = 'FOLDER STRUCTURE',\n defaultExpandedIds,\n expandedIds,\n onExpandedChange,\n selectedId,\n defaultSelectedId = null,\n onSelect,\n docRowState,\n className,\n ...rest\n },\n ref,\n) {\n const expandableIds = useMemo(() => collectExpandableIds(nodes), [nodes])\n const [expanded, setExpanded] = useControllableSet(expandedIds, defaultExpandedIds, expandableIds)\n const [internalSelected, setInternalSelected] = useState<string | null>(defaultSelectedId)\n const selected = selectedId ?? internalSelected\n\n const rows = useMemo(() => flattenStnTree(nodes, expanded), [nodes, expanded])\n\n const setExpandedIds = useCallback(\n (next: string[]) => {\n setExpanded(next)\n onExpandedChange?.(next)\n },\n [onExpandedChange, setExpanded],\n )\n\n const handleToggle = useCallback(\n (id: string) => {\n setExpandedIds(\n expanded.includes(id) ? expanded.filter((item) => item !== id) : [...expanded, id],\n )\n },\n [expanded, setExpandedIds],\n )\n\n const handleSelect = useCallback(\n (id: string) => {\n if (selectedId == null) setInternalSelected(id)\n onSelect?.(id)\n },\n [onSelect, selectedId],\n )\n\n return (\n <div ref={ref} className={cn('stn-tree', className)} {...rest}>\n {heading ? <p className=\"stn-tree__heading\">{heading}</p> : null}\n <div className=\"stn-tree__rows\" role=\"tree\" aria-label={heading || 'folder tree'}>\n {rows.map((row) => (\n <StnTreeNode\n key={row.id}\n label={row.label}\n kind={row.kind}\n depth={row.depth}\n expanded={row.expanded}\n selected={selected === row.id}\n hasChildren={row.hasChildren}\n isLast={row.isLast}\n cells={row.cells}\n docState={docRowState?.id === row.id ? docRowState.state : 'default'}\n onToggle={() => handleToggle(row.id)}\n onSelect={() => handleSelect(row.id)}\n />\n ))}\n </div>\n </div>\n )\n})\n\nexport type { StnTreeItem, StnTreeNodeKind } from '../stnTreeFlatten'\n","import { forwardRef, type HTMLAttributes, type KeyboardEvent } from 'react'\n\nimport { cn } from '../cn'\nimport { StnIcon } from './StnIcon'\nimport { resolveSystemIconSrcFromName } from '@stn-uiux/pub-ui/data/stnSystemIcons'\nimport {\n buildStnTreeNodeCells,\n type StnTreeGuideCell,\n type StnTreeNodeKind,\n} from '../stnTreeFlatten'\n\nconst ICON = {\n folderOpen: resolveSystemIconSrcFromName('fill/folder-open') ?? '',\n folderClosed: resolveSystemIconSrcFromName('fill/folder') ?? '',\n vertical: resolveSystemIconSrcFromName('line/vertical_line') ?? '',\n connectorMid: resolveSystemIconSrcFromName('line/tree_connector_midium') ?? '',\n connectorEnd: resolveSystemIconSrcFromName('line/tree_connector') ?? '',\n chevron: resolveSystemIconSrcFromName('line/arrow-left') ?? '',\n} as const\n\nexport type StnTreeNodeDocState = 'default' | 'hover' | 'pressed' | 'selected'\n\nexport type StnTreeNodeProps = Omit<HTMLAttributes<HTMLDivElement>, 'children' | 'onSelect' | 'onToggle'> & {\n label: string\n /** default `folder` */\n kind?: StnTreeNodeKind\n /** 0–3 · `data-depth` · 가이드 들여쓰기 */\n depth?: number\n expanded?: boolean\n selected?: boolean\n /** folder/root에 자식이 있으면 chevron · server는 connector */\n hasChildren?: boolean\n /** server connector end vs mid */\n isLast?: boolean\n /** depth>1 가이드 · length = depth-1 */\n ancestorIsLast?: boolean[]\n /** 셀을 직접 넘기면 depth/kind 기반 생성을 건너뜁니다 */\n cells?: StnTreeGuideCell[]\n /**\n * Docs Playground — hover/pressed/selected 비주얼 고정.\n * 제품 코드에서는 쓰지 마세요.\n */\n docState?: StnTreeNodeDocState\n onSelect?: () => void\n onToggle?: () => void\n}\n\nfunction maskStyle(src: string) {\n return { maskImage: `url('${src}')`, WebkitMaskImage: `url('${src}')` } as const\n}\n\nfunction TreeGuideCell({ cell }: { cell: StnTreeGuideCell }) {\n if (cell.type === 'blank') {\n return <span className=\"stn-tree__cell stn-tree__cell--blank\" aria-hidden=\"true\" />\n }\n if (cell.type === 'vertical') {\n return (\n <span className=\"stn-tree__cell stn-tree__cell--guide\" aria-hidden=\"true\">\n <span className=\"stn-tree__guide-glyph\" style={maskStyle(ICON.vertical)} />\n </span>\n )\n }\n if (cell.type === 'connector') {\n return (\n <span\n className={cn(\n 'stn-tree__cell stn-tree__cell--guide',\n cell.variant === 'end' && 'stn-tree__cell--connector-end',\n )}\n aria-hidden=\"true\"\n >\n <span\n className=\"stn-tree__guide-glyph\"\n style={maskStyle(cell.variant === 'end' ? ICON.connectorEnd : ICON.connectorMid)}\n />\n </span>\n )\n }\n return (\n <span className=\"stn-tree__cell stn-tree__cell--toggle\" aria-hidden=\"true\">\n <span\n className={cn('stn-tree__chevron-glyph', cell.expanded && 'is-expanded')}\n style={maskStyle(ICON.chevron)}\n />\n </span>\n )\n}\n\nfunction TreeNodeIcon({ kind, expanded }: { kind: StnTreeNodeKind; expanded: boolean }) {\n if (kind === 'server') {\n return (\n <span className=\"stn-tree__cell stn-tree__cell--icon stn-tree__icon stn-tree__icon--server\">\n {/* Light — gray-400 면 · Dark — fill/server_2 본색(#40474F) */}\n <StnIcon\n name=\"fill/server_2_tree_light\"\n size={16}\n className=\"stn-tree__icon-glyph stn-tree__server-icon stn-tree__server-icon--light stn-icon--color\"\n />\n <StnIcon\n name=\"fill/server_2\"\n size={16}\n className=\"stn-tree__icon-glyph stn-tree__server-icon stn-tree__server-icon--dark stn-icon--color\"\n />\n </span>\n )\n }\n\n const folderKind = kind === 'root' ? 'root' : 'folder'\n const folderSrc = kind === 'root' || expanded ? ICON.folderOpen : ICON.folderClosed\n\n return (\n <span\n className={cn(\n 'stn-tree__cell stn-tree__cell--icon stn-tree__icon',\n `stn-tree__icon--${folderKind}`,\n )}\n >\n <span className=\"stn-tree__icon-glyph\" style={maskStyle(folderSrc)} aria-hidden=\"true\" />\n </span>\n )\n}\n\n/** Infomap FOLDER STRUCTURE 행 — Figma 40000042:210359 */\nexport const StnTreeNode = forwardRef<HTMLDivElement, StnTreeNodeProps>(function StnTreeNode(\n {\n label,\n kind = 'folder',\n depth = 0,\n expanded = false,\n selected = false,\n hasChildren,\n isLast = true,\n ancestorIsLast,\n cells: cellsProp,\n docState = 'default',\n onSelect,\n onToggle,\n className,\n onClick,\n onKeyDown,\n ...rest\n },\n ref,\n) {\n const resolvedHasChildren = hasChildren ?? kind !== 'server'\n const cells =\n cellsProp ??\n buildStnTreeNodeCells({\n depth,\n kind,\n hasChildren: resolvedHasChildren,\n expanded,\n isLast,\n ancestorIsLast,\n })\n\n const isSelected = selected || docState === 'selected'\n\n const handleSelect = () => onSelect?.()\n\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n onKeyDown?.(event)\n if (event.defaultPrevented) return\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n handleSelect()\n }\n }\n\n return (\n <div\n ref={ref}\n role=\"treeitem\"\n aria-selected={isSelected}\n aria-expanded={resolvedHasChildren ? expanded : undefined}\n className={cn(\n 'stn-tree__row',\n isSelected && 'is-selected',\n docState === 'hover' && 'is-hover',\n docState === 'pressed' && 'is-pressed',\n `stn-tree__row--${kind}`,\n className,\n )}\n data-depth={depth}\n onClick={(e) => {\n onClick?.(e)\n if (!e.defaultPrevented) handleSelect()\n }}\n onKeyDown={handleKeyDown}\n tabIndex={0}\n {...rest}\n >\n {cells.map((cell, index) => {\n if (cell.type === 'toggle') {\n return (\n <button\n key={`c-${index}`}\n type=\"button\"\n className=\"stn-tree__cell stn-tree__cell--toggle stn-tree__toggle\"\n aria-label={cell.expanded ? `${label} 접기` : `${label} 펼치기`}\n aria-expanded={cell.expanded}\n onClick={(event) => {\n event.stopPropagation()\n onToggle?.()\n }}\n >\n <span\n className={cn('stn-tree__chevron-glyph', cell.expanded && 'is-expanded')}\n style={maskStyle(ICON.chevron)}\n />\n </button>\n )\n }\n return <TreeGuideCell key={`c-${index}`} cell={cell} />\n })}\n <TreeNodeIcon kind={kind} expanded={expanded} />\n <span className=\"stn-tree__label\">{label}</span>\n </div>\n )\n})\n","export type StnTreeNodeKind = 'root' | 'folder' | 'server'\r\n\r\n/** Tree 데이터 노드 — `StnTree`의 `nodes` 항목 (`StnTreeNode` 컴포넌트와 별개) */\r\nexport type StnTreeItem = {\r\n id: string\r\n label: string\r\n /** default `folder` · leaf는 `server` · 최상위 루트는 `root` */\r\n kind?: StnTreeNodeKind\r\n children?: StnTreeItem[]\r\n}\r\nexport type StnTreeGuideCell =\r\n | { type: 'blank' }\r\n | { type: 'vertical' }\r\n | { type: 'connector'; variant: 'mid' | 'end' }\r\n | { type: 'toggle'; expanded: boolean }\r\n\r\nexport type StnTreeFlatRow = {\r\n id: string\r\n label: string\r\n kind: StnTreeNodeKind\r\n depth: number\r\n cells: StnTreeGuideCell[]\r\n hasChildren: boolean\r\n expanded: boolean\r\n isLast: boolean\r\n}\r\n\r\nfunction resolveKind(node: StnTreeItem, depth: number): StnTreeNodeKind {\r\n if (node.kind) return node.kind\r\n if (depth === 0) return 'root'\r\n if (node.children?.length) return 'folder'\r\n return 'server'\r\n}\r\n\r\n/** 단일 Tree Node용 가이드/토글 셀 — depth · kind 기준으로 생성 */\r\nexport function buildStnTreeNodeCells(options: {\r\n depth: number\r\n kind: StnTreeNodeKind\r\n hasChildren?: boolean\r\n expanded?: boolean\r\n isLast?: boolean\r\n /** length = max(0, depth - 1) · true면 해당 조상 이후 vertical 숨김 */\r\n ancestorIsLast?: boolean[]\r\n}): StnTreeGuideCell[] {\r\n const {\r\n depth,\r\n kind,\r\n hasChildren = kind !== 'server',\r\n expanded = true,\r\n isLast = true,\r\n ancestorIsLast = [],\r\n } = options\r\n\r\n return buildPrefixCells(depth, kind, ancestorIsLast, isLast, hasChildren, expanded)\r\n}\r\n\r\nfunction buildPrefixCells(\r\n depth: number,\r\n kind: StnTreeNodeKind,\r\n ancestorIsLast: boolean[],\r\n isLast: boolean,\r\n hasChildren: boolean,\r\n expanded: boolean,\r\n): StnTreeGuideCell[] {\r\n if (depth === 0) return []\r\n\r\n const cells: StnTreeGuideCell[] = []\r\n\r\n for (let i = 0; i < depth - 1; i++) {\r\n cells.push(ancestorIsLast[i] ? { type: 'blank' } : { type: 'vertical' })\r\n }\r\n\r\n if (kind === 'server') {\r\n cells.push({ type: 'connector', variant: isLast ? 'end' : 'mid' })\r\n } else if (hasChildren) {\r\n cells.push({ type: 'toggle', expanded })\r\n } else {\r\n cells.push({ type: 'blank' })\r\n }\r\n\r\n return cells\r\n}\r\n\r\nfunction walk(\r\n nodes: StnTreeItem[],\r\n depth: number,\r\n ancestorIsLast: boolean[],\r\n expanded: Set<string>,\r\n out: StnTreeFlatRow[],\r\n) {\r\n nodes.forEach((node, index) => {\r\n const isLast = index === nodes.length - 1\r\n const kind = resolveKind(node, depth)\r\n const hasChildren = Boolean(node.children?.length)\r\n const isExpanded = depth === 0 || expanded.has(node.id)\r\n\r\n out.push({\r\n id: node.id,\r\n label: node.label,\r\n kind,\r\n depth,\r\n cells: buildPrefixCells(depth, kind, ancestorIsLast, isLast, hasChildren, isExpanded),\r\n hasChildren,\r\n expanded: isExpanded,\r\n isLast,\r\n })\r\n\r\n if (hasChildren && isExpanded) {\r\n walk(node.children!, depth + 1, [...ancestorIsLast, isLast], expanded, out)\r\n }\r\n })\r\n}\r\n\r\nexport function flattenStnTree(nodes: StnTreeItem[], expandedIds: Iterable<string>): StnTreeFlatRow[] {\r\n const expanded = new Set(expandedIds)\r\n const rows: StnTreeFlatRow[] = []\r\n walk(nodes, 0, [], expanded, rows)\r\n return rows\r\n}\r\n\r\nexport function collectExpandableIds(nodes: StnTreeItem[]): string[] {\r\n const ids: string[] = []\r\n const visit = (list: StnTreeItem[]) => {\r\n for (const node of list) {\r\n if (node.children?.length) {\r\n ids.push(node.id)\r\n visit(node.children)\r\n }\r\n }\r\n }\r\n visit(nodes)\r\n return ids\r\n}\r\n","import {\n forwardRef,\n useId,\n type CSSProperties,\n type HTMLAttributes,\n type ReactNode,\n} from 'react'\n\nimport { cn } from '../cn'\n\nexport type StnScrollOrientation = 'vertical' | 'horizontal' | 'both'\nexport type StnScrollSize = 'thin' | 'default' | 'thick'\nexport type StnScrollColor = 'default' | 'primary' | 'teal' | 'muted' | 'fade'\n\nexport type StnScrollProps = HTMLAttributes<HTMLDivElement> & {\n /** 스크롤 방향 @default 'vertical' */\n orientation?: StnScrollOrientation\n /** 스크롤바 두께 preset @default 'default' (8px) */\n size?: StnScrollSize\n /** 스크롤바 색상 preset */\n color?: StnScrollColor\n /** 커스텀 thumb 색상 (CSS color value) */\n thumbColor?: string\n /** 커스텀 track 배경색 */\n trackColor?: string\n /** 커스텀 스크롤바 너비/높이 (px 숫자 또는 CSS string) */\n scrollWidth?: number | string\n /** max-height shorthand (number → px) */\n maxHeight?: number | string\n /** max-width shorthand (number → px) — 가로 스크롤 용 */\n maxWidth?: number | string\n children?: ReactNode\n className?: string\n}\n\n/**\n * STN 커스텀 스크롤바 컨테이너\n * - 색상, 두께, 방향을 토큰으로 제어\n * - 화살표 버튼은 그리지 않는다\n */\nexport const StnScroll = forwardRef<HTMLDivElement, StnScrollProps>(function StnScroll(\n {\n orientation = 'vertical',\n size = 'default',\n color = 'default',\n thumbColor,\n trackColor,\n scrollWidth,\n maxHeight,\n maxWidth,\n children,\n className,\n style,\n ...rest\n },\n ref,\n) {\n const rawId = useId()\n const customId = `stn-scr-${rawId.replace(/[^a-zA-Z0-9_-]/g, '')}`\n\n const hasCustomStyling = Boolean(thumbColor || trackColor || scrollWidth != null)\n\n let dynamicStyleTag: ReactNode = null\n if (hasCustomStyling) {\n const w = scrollWidth != null ? (typeof scrollWidth === 'number' ? `${scrollWidth}px` : scrollWidth) : undefined\n const thumb = thumbColor\n const track = trackColor || 'rgba(255, 255, 255, 0.05)'\n\n dynamicStyleTag = (\n <style>{`\n .${customId}::-webkit-scrollbar {\n ${w ? `width: ${w} !important; height: ${w} !important;` : ''}\n ${track ? `background: ${track} !important;` : ''}\n }\n .${customId}::-webkit-scrollbar-track {\n ${track ? `background: ${track} !important;` : ''}\n }\n .${customId}::-webkit-scrollbar-thumb {\n ${thumb ? `background: ${thumb} !important;` : ''}\n ${w ? `border-radius: calc(${w} / 2) !important;` : ''}\n }\n `}</style>\n )\n }\n\n const mergedStyle: CSSProperties = {\n ...(maxHeight != null && { maxHeight: typeof maxHeight === 'number' ? `${maxHeight}px` : maxHeight }),\n ...(maxWidth != null && { maxWidth: typeof maxWidth === 'number' ? `${maxWidth}px` : maxWidth }),\n ...(thumbColor && { scrollbarColor: `${thumbColor} ${trackColor || 'transparent'}` }),\n ...style,\n }\n\n return (\n <>\n {dynamicStyleTag}\n <div\n ref={ref}\n className={cn(\n 'stn-scroll',\n `stn-scroll--${orientation}`,\n size !== 'default' && `stn-scroll--${size}`,\n color !== 'default' && `stn-scroll--${color}`,\n hasCustomStyling && customId,\n className,\n )}\n data-stn-scroll={orientation}\n style={mergedStyle}\n {...rest}\n >\n {children}\n </div>\n </>\n )\n})\n","import { forwardRef, type HTMLAttributes, type ReactNode } from 'react'\n\nimport { cn } from '../../cn'\nimport { StnScroll, type StnScrollProps } from '../../components/StnScroll'\nimport { StnTree, type StnTreeProps } from '../../components/StnTree'\n\nexport type StnSectionSideProps = Omit<HTMLAttributes<HTMLElement>, 'className' | 'children'> & {\n children?: ReactNode\n className?: string\n /** true면 LNB 열 높이에 맞춰 패널을 세로로 채움 (list view + search) */\n fill?: boolean\n /** StnScroll props (orientation 고정 vertical) */\n scrollProps?: Omit<StnScrollProps, 'orientation' | 'children'>\n}\n\n/**\n * Infomap section-side — Figma 40000040:102539\n * 사이드 패널 셸 + Pub 스크롤. 본문은 보통 `StnTree`.\n */\nexport const StnSectionSide = forwardRef<HTMLElement, StnSectionSideProps>(function StnSectionSide(\n { children, className, fill = true, scrollProps, ...rest },\n ref,\n) {\n const { className: scrollClassName, ...scrollRest } = scrollProps ?? {}\n\n return (\n <aside\n ref={ref}\n className={cn('stn-section-side', fill && 'stn-section-side--fill', className)}\n data-stn-section-side\n {...rest}\n >\n <StnScroll\n orientation=\"vertical\"\n className={cn('stn-section-side__body', scrollClassName)}\n {...scrollRest}\n >\n {children}\n </StnScroll>\n </aside>\n )\n})\n\nexport type StnSectionSidePresetProps = Omit<StnSectionSideProps, 'children'> & {\n tree: StnTreeProps\n}\n\n/** Figma 예제 — FOLDER STRUCTURE + scroll */\nexport function StnSectionSidePreset({ tree, ...sideProps }: StnSectionSidePresetProps) {\n return (\n <StnSectionSide {...sideProps}>\n <StnTree heading=\"FOLDER STRUCTURE\" {...tree} />\n </StnSectionSide>\n )\n}\n","import { forwardRef, type FormHTMLAttributes, type HTMLAttributes, type ReactNode } from 'react'\nimport { cn } from '../../cn'\n\nexport type StnLoginCardBrandPosition = 'left' | 'right'\nexport type StnLoginCardVariant = 'default' | 'glow'\n\nexport type StnLoginCardProps = Omit<HTMLAttributes<HTMLDivElement>, 'children'> & {\n /** 좌측(또는 우측) 브랜드 영역 커스텀 콘텐츠 (로고 이미지, 서비스명, 설명 등) */\n brand?: ReactNode\n /** 우측(또는 좌측) 폼 영역 커스텀 콘텐츠 (탭, 입력 필드, 로그인 버튼, 도움말 링크 등) */\n children?: ReactNode\n /**\n * 브랜드 영역 위치\n * - 'left': [Brand - Form] (기본값)\n * - 'right': [Form - Brand] (반전 레이아웃)\n * @default 'left'\n */\n brandPosition?: StnLoginCardBrandPosition\n /**\n * 레이아웃 순서 반전 여부 (true면 [Form - Brand])\n * brandPosition=\"right\"와 동일하게 동작합니다.\n */\n reverse?: boolean\n /**\n * 카드 테두리 회전 레이저 빔 애니메이션 여부 (mockup/login.html 발)\n * @default false\n */\n glow?: boolean\n /**\n * 카드 스타일 변형\n * - 'default': 기본 정적 테두리\n * - 'glow': 회전 레이저 빔 애니메이션 테두리\n * @default 'default'\n */\n variant?: StnLoginCardVariant\n /** 추가 커스텀 클래스 */\n className?: string\n /** glow 래퍼에 적용할 추가 커스텀 클래스 */\n wrapperClassName?: string\n}\n\nexport type StnLoginCardGlowWrapperProps = HTMLAttributes<HTMLDivElement> & {\n children?: ReactNode\n className?: string\n}\n\n/**\n * 로그인 카드 테두리 회전 레이저 빔 애니메이션 래퍼 (Card Glow Wrapper)\n * 독립적으로 사용하거나 StnLoginCard의 `glow` 또는 `variant=\"glow\"`로 자동 적용됩니다.\n */\nexport const StnLoginCardGlowWrapper = forwardRef<HTMLDivElement, StnLoginCardGlowWrapperProps>(\n function StnLoginCardGlowWrapper({ children, className, ...rest }, ref) {\n return (\n <div\n ref={ref}\n className={cn('stn-login-card-glow-wrapper', className)}\n data-stn-login-card-glow\n {...rest}\n >\n {children}\n </div>\n )\n },\n)\n\n/**\n * Infomap / STN Login Card Pattern — Figma 40004209:78293\n *\n * 100% STN 공식 디자인 토큰 기반의 2열 로그인 카드 컨테이너입니다.\n * 브랜드 슬롯(brand)과 폼 슬롯(children)을 자유롭게 조립할 수 있으며,\n * brandPosition 또는 reverse prop으로 좌우/상하 배치를 자유롭게 바꿀 수 있습니다.\n * `glow` 또는 `variant=\"glow\"` 옵션으로 테두리 회전 레이저 빔 효과를 활성화할 수 있습니다.\n * 폼 스택(max 320)은 유지하고, 카드가 좁아지면 브랜드·폼 패딩과 로고(xl→sm)를 같이 줄입니다.\n * 900px 이하 뷰포트에서는 세로 1열 스택으로 자동 반응합니다.\n */\nexport const StnLoginCard = forwardRef<HTMLDivElement, StnLoginCardProps>(function StnLoginCard(\n {\n brand,\n children,\n brandPosition = 'left',\n reverse = false,\n glow = false,\n variant = 'default',\n className,\n wrapperClassName,\n ...rest\n },\n ref,\n) {\n const isReversed = reverse || brandPosition === 'right'\n const hasGlow = glow || variant === 'glow'\n\n const cardElement = (\n <div\n ref={hasGlow ? undefined : ref}\n className={cn('stn-login-card', isReversed && 'reverse', className)}\n data-stn-login-card\n {...rest}\n >\n {brand && (\n <div className=\"stn-login-card__brand\" data-stn-login-card-brand>\n {brand}\n </div>\n )}\n <div className=\"stn-login-card__form\" data-stn-login-card-form>\n {children}\n </div>\n </div>\n )\n\n if (hasGlow) {\n return (\n <StnLoginCardGlowWrapper ref={ref} className={wrapperClassName}>\n {cardElement}\n </StnLoginCardGlowWrapper>\n )\n }\n\n return cardElement\n})\n\nexport type StnLoginBrandStackProps = HTMLAttributes<HTMLDivElement> & {\n children?: ReactNode\n className?: string\n}\n\n/**\n * 로그인 브랜드 세로 스택 — 로고 · 제목 · 캡션을 브랜드 간격(16px)으로 나열합니다.\n */\nexport const StnLoginBrandStack = forwardRef<HTMLDivElement, StnLoginBrandStackProps>(\n function StnLoginBrandStack({ children, className, ...rest }, ref) {\n return (\n <div ref={ref} className={cn('stn-login-brand-stack', className)} {...rest}>\n {children}\n </div>\n )\n },\n)\n\n/* ==========================================================================\n 폼 내부 세로 나열 스택 패턴 컴포넌트들\n ========================================================================== */\n\nexport type StnLoginFormStackProps = FormHTMLAttributes<HTMLFormElement> & {\n children?: ReactNode\n className?: string\n}\n\n/**\n * 로그인 폼 전체 스택 컨테이너\n * 탭, 필드 그룹, 로그인 버튼, 하단 링크 등을 정해진 토큰 간격(24px)으로 세로 나열합니다.\n */\nexport const StnLoginFormStack = forwardRef<HTMLFormElement, StnLoginFormStackProps>(\n function StnLoginFormStack({ children, className, ...rest }, ref) {\n return (\n <form\n ref={ref}\n className={cn('stn-login-form-stack', className)}\n data-stn-login-form-stack\n {...rest}\n >\n {children}\n </form>\n )\n },\n)\n\nexport type StnLoginFormFieldsProps = HTMLAttributes<HTMLDivElement> & {\n children?: ReactNode\n className?: string\n}\n\n/**\n * 로그인 입력 필드 묶음 컨테이너\n * 아이디, 비밀번호 등의 입력 필드를 16px 간격으로 세로 나열합니다.\n */\nexport const StnLoginFormFields = forwardRef<HTMLDivElement, StnLoginFormFieldsProps>(\n function StnLoginFormFields({ children, className, ...rest }, ref) {\n return (\n <div\n ref={ref}\n className={cn('stn-login-form-fields', className)}\n data-stn-login-form-fields\n {...rest}\n >\n {children}\n </div>\n )\n },\n)\n\nexport type StnLoginFormLinksProps = HTMLAttributes<HTMLElement> & {\n children?: ReactNode\n className?: string\n}\n\n/**\n * 로그인 하단 링크 바 컨테이너\n * 회원가입, 아이디/비밀번호 찾기 등의 텍스트 링크를 가로 중앙 정렬합니다.\n */\nexport const StnLoginFormLinks = forwardRef<HTMLElement, StnLoginFormLinksProps>(\n function StnLoginFormLinks({ children, className, ...rest }, ref) {\n return (\n <nav\n ref={ref}\n className={cn('stn-login-form-links', className)}\n data-stn-login-form-links\n aria-label=\"계정 관리 링크\"\n {...rest}\n >\n {children}\n </nav>\n )\n },\n)\n\nexport type StnLoginPlaceholderProps = HTMLAttributes<HTMLParagraphElement> & {\n children?: ReactNode\n}\n\n/**\n * 로그인 폼 내 준비 중 안내 영역 (예: 소셜 로그인 준비 중)\n * 128px 최소 높이와 중앙 정렬, 토큰 폰트/색상(`--stn-login-link-fg`)이 적용됩니다.\n */\nexport const StnLoginPlaceholder = forwardRef<HTMLParagraphElement, StnLoginPlaceholderProps>(\n function StnLoginPlaceholder(\n { children = '소셜 로그인 기능은 준비 중입니다.', className, ...rest },\n ref,\n ) {\n return (\n <p ref={ref} className={cn('stn-login__placeholder', className)} {...rest}>\n {children}\n </p>\n )\n },\n)\n\n","import {\n cloneElement,\n forwardRef,\n isValidElement,\n type InputHTMLAttributes,\n type ReactElement,\n type ReactNode,\n} from 'react'\n\nimport { cn } from '../../cn'\nimport type { StnWithoutStyle } from '../../stnStrictProps'\nimport { StnIconBox, type StnIconBoxColor } from '../../components/StnIconBox'\n\nexport type StnLoginTextFieldProps = StnWithoutStyle<Omit<InputHTMLAttributes<HTMLInputElement>, 'size'>> & {\n /** 왼쪽 입체 아이콘 — Iconography slug (`line/user`) 또는 ReactNode */\n icon?: ReactNode\n /** 아이콘 시맨틱 색상 ('primary' | 'success' | 'warning' | 'error' | 'info') */\n iconColor?: StnIconBoxColor\n invalid?: boolean\n className?: string\n}\n\n/**\n * Login mockup `.input-group` — XL 56px, full width, left icon box.\n * 일반 검색·필터는 `StnTextField`를 사용합니다.\n */\nexport const StnLoginTextField = forwardRef<HTMLInputElement, StnLoginTextFieldProps>(\n function StnLoginTextField(\n {\n icon,\n iconColor,\n invalid,\n className,\n disabled,\n type = 'text',\n 'aria-invalid': ariaInvalid,\n ...rest\n },\n ref,\n ) {\n const hasIcon = icon != null && icon !== false\n\n let renderedIcon: ReactNode = null\n if (hasIcon) {\n if (typeof icon === 'string') {\n renderedIcon = (\n <StnIconBox\n icon={icon}\n size=\"md\"\n color={iconColor}\n className=\"stn-login-text-field__icon-box\"\n />\n )\n } else if (isValidElement(icon)) {\n renderedIcon = cloneElement(icon as ReactElement<{ className?: string }>, {\n className: cn('stn-login-text-field__icon-box', (icon.props as { className?: string })?.className),\n })\n } else {\n renderedIcon = icon\n }\n }\n\n return (\n <div\n className={cn(\n 'stn-login-text-field',\n invalid && 'stn-login-text-field--invalid',\n className,\n )}\n >\n {renderedIcon}\n <input\n ref={ref}\n type={type}\n disabled={disabled}\n aria-invalid={invalid ? true : ariaInvalid}\n className=\"stn-login-text-field__control\"\n {...rest}\n />\n </div>\n )\n },\n)\n","import { forwardRef, type HTMLAttributes } from 'react'\nimport { STN_INFOMAP_LOGO } from '@stn-uiux/pub-ui/data/stnBrand'\nimport { cn } from '../cn'\nimport type { StnWithoutStyle } from '../stnStrictProps'\n\n/** horizontal = 가로 wordmark · vertical = 세로 mark · watermark = 워터마크 · onlyimg/symbol = 아이콘 단독 심볼 */\nexport type StnLogoVariant = 'horizontal' | 'vertical' | 'watermark' | 'onlyimg' | 'symbol'\n/** CSS tokens: xs sm md lg xl */\nexport type StnLogoSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl'\nexport type StnLogoTheme = 'dark' | 'light'\n\nexport type StnLogoProps = StnWithoutStyle<Omit<HTMLAttributes<HTMLSpanElement>, 'children'>> & {\n /**\n * horizontal: 가로 워드마크 (full PNG)\n * vertical: 세로 심볼 (single PNG)\n * watermark: 워터마크 SVG\n * onlyimg / symbol: 단독 로고 심볼 (logo-onlyimg.png)\n * @default 'horizontal'\n */\n variant?: StnLogoVariant\n /**\n * xs sm md lg xl — 픽셀 width 금지. 기본 md.\n * @default 'md'\n */\n size?: StnLogoSize\n /**\n * dark: 흰색 로고 (어두운 배경용, 기본값)\n * light: 검은색 로고 (밝은 배경용)\n * @default 'dark'\n */\n theme?: StnLogoTheme\n alt?: string\n}\n\nfunction sources(variant: StnLogoVariant) {\n if (variant === 'onlyimg' || variant === 'symbol') {\n return { light: STN_INFOMAP_LOGO.onlyImgLight, dark: STN_INFOMAP_LOGO.onlyImgDark }\n }\n if (variant === 'vertical') {\n return { light: STN_INFOMAP_LOGO.single, dark: STN_INFOMAP_LOGO.singleDark }\n }\n if (variant === 'watermark') {\n return { light: STN_INFOMAP_LOGO.watermark, dark: STN_INFOMAP_LOGO.watermarkDark }\n }\n return { light: STN_INFOMAP_LOGO.full, dark: STN_INFOMAP_LOGO.fullDark }\n}\n\nexport const StnLogo = forwardRef<HTMLSpanElement, StnLogoProps>(function StnLogo(\n { variant = 'horizontal', size = 'md', theme, alt = 'InfoMap SRM', className, ...rest },\n ref,\n) {\n const { light, dark } = sources(variant)\n\n return (\n <span\n ref={ref}\n className={cn('stn-logo', variant, size, className)}\n data-theme={theme}\n {...rest}\n >\n <img className=\"stn-logo__img light\" src={light} alt={theme === 'dark' ? '' : alt} />\n <img className=\"stn-logo__img dark\" src={dark} alt={theme === 'light' ? '' : alt} />\n </span>\n )\n})\n","import React from 'react';\nimport { cn } from '../cn';\n\nexport type StnBadgeVariant = 'standard' | 'dot';\nexport type StnBadgeAppearance = 'subtle' | 'solid';\nexport type StnBadgeColor =\n | 'primary'\n | 'secondary'\n | 'success'\n | 'critical'\n | 'major'\n | 'minor'\n | 'warning'\n | 'error'\n | 'neutral'\n | 'default'\n | (string & {});\n\nexport interface StnBadgeAnchorOrigin {\n vertical: 'top' | 'bottom';\n horizontal: 'left' | 'right';\n}\n\nexport interface StnBadgeProps extends React.HTMLAttributes<HTMLSpanElement> {\n /** 뱃지 내부에 표시할 숫자 또는 내용 (0일 경우 showZero가 false이면 숨김) */\n badgeContent?: React.ReactNode;\n /** 뱃지 형태: 'standard' (숫자/문자 pill) | 'dot' (작은 원형 점) */\n variant?: StnBadgeVariant;\n /** 외형 모드: 'subtle' (mockup .sb-badge 규격, 반투명 배경 + 컬러 텍스트, 기본값) | 'solid' (완전 채움 캡슐형) */\n appearance?: StnBadgeAppearance;\n /** 색상 테마: primary, secondary, success, critical/error, major, minor, warning, neutral */\n color?: StnBadgeColor;\n /** 최대 표시 수치 (기본값: 99, 99 초과 시 99+ 로 표시) */\n max?: number;\n /** badgeContent가 0일 때도 뱃지를 노출할지 여부 (기본값: false) */\n showZero?: boolean;\n /** 뱃지를 숨길지 여부 */\n invisible?: boolean;\n /** 자식 요소를 기준으로 뱃지가 배치될 위치 (기본값: top-right) */\n anchorOrigin?: StnBadgeAnchorOrigin;\n /** 뱃지 버블 요소에 직접 지정할 배경색 (디자인 토큰 또는 컬러값) */\n backgroundColor?: string;\n /** 뱃지 버블 요소에 직접 지정할 텍스트 색상 (디자인 토큰 또는 컬러값) */\n textColor?: string;\n /** 뱃지 버블 요소에 직접 전달할 인라인 스타일 */\n badgeStyle?: React.CSSProperties;\n /** 뱃지 자체의 추가 className */\n badgeClassName?: string;\n /** 추가 클래스 */\n className?: string;\n /** 뱃지가 부착될 대상 엘리먼트 (생략 시 독립 인라인 뱃지로 렌더링) */\n children?: React.ReactNode;\n}\n\n/**\n * StnBadge\n * 알림 개수(Notification count)나 활성 상태를 나타내는 오버레이 뱃지 컴포넌트입니다.\n * 자식 엘리먼트를 감싸 우측 상단/좌측 하단 등에 카운트나 점을 띄우거나, 단독 인라인 뱃지로 사용됩니다.\n */\nexport const StnBadge = React.forwardRef<HTMLSpanElement, StnBadgeProps>(\n (\n {\n badgeContent,\n variant = 'standard',\n appearance = 'subtle',\n color = 'error',\n max = 99,\n showZero = false,\n invisible: customInvisible,\n anchorOrigin = { vertical: 'top', horizontal: 'right' },\n backgroundColor,\n textColor,\n badgeStyle,\n badgeClassName,\n className,\n children,\n style,\n ...restProps\n },\n ref\n ) => {\n const isDot = variant === 'dot';\n\n // 0이거나 내용이 없을 때 투명/숨김 처리 여부\n let isZero = false;\n if (typeof badgeContent === 'number') {\n isZero = badgeContent === 0;\n } else if (typeof badgeContent === 'string') {\n isZero = badgeContent === '0';\n }\n\n const hasNoContent = badgeContent === undefined || badgeContent === null || badgeContent === '';\n const invisible = customInvisible ?? (!isDot && ((isZero && !showZero) || hasNoContent));\n\n // 숫자 max 처리 (예: 100 -> 99+)\n let displayContent: React.ReactNode = badgeContent;\n if (!isDot && typeof badgeContent === 'number' && max != null && badgeContent > max) {\n displayContent = `${max}+`;\n }\n\n const positionClass = `${anchorOrigin.vertical}-${anchorOrigin.horizontal}`;\n const colorClass = color;\n const appearanceClass = appearance;\n const isStandalone = !children;\n\n const customBadgeStyle: React.CSSProperties = {\n ...(backgroundColor ? { backgroundColor } : {}),\n ...(textColor ? { color: textColor } : {}),\n ...badgeStyle,\n ...(isStandalone && style ? style : {}),\n };\n\n const badgeElement = (\n <span\n ref={isStandalone ? ref : undefined}\n className={cn(\n 'stn-badge',\n isDot ? 'dot' : 'standard',\n appearanceClass,\n colorClass,\n !isStandalone && positionClass,\n isStandalone && 'standalone',\n invisible && 'is-invisible',\n badgeClassName,\n isStandalone && className\n )}\n style={customBadgeStyle}\n aria-hidden={invisible}\n {...(isStandalone ? restProps : {})}\n >\n {!isDot && displayContent}\n </span>\n );\n\n // 감싸는 자식(아이콘, 버튼 등)이 없을 경우 단독 인라인 뱃지로 렌더링\n if (isStandalone) {\n return badgeElement;\n }\n\n // 래핑 모드\n return (\n <span ref={ref} className={cn('stn-badge-root', className)} style={style} {...restProps}>\n {children}\n {badgeElement}\n </span>\n );\n }\n);\n\nStnBadge.displayName = 'StnBadge';\n","import type { HTMLAttributes, ReactNode, MouseEvent, KeyboardEvent } from 'react'\n\nimport {\n STN_GRADE_SOURCE,\n type StnChipBorderAccent,\n type StnChipGrade,\n} from '@stn-uiux/pub-ui/data/stnChip'\n\nimport { cn } from '../cn'\nimport type { StnWithoutStyle } from '../stnStrictProps'\n\nexport type StnChipVariant = 'filled' | 'outline' | 'outlined' | 'border'\nexport type StnChipSize = 'sm' | 'md' | 'lg'\nexport type StnChipShape = 'square' | 'pill' | 'round' | 'rounded'\nexport type StnChipIconPosition = 'left' | 'right'\nexport type StnChipLabelPosition = 'top' | 'bottom' | 'left' | 'right'\nexport type StnChipColor =\n | 'cr'\n | 'mj'\n | 'mn'\n | 'wr'\n | 'CR'\n | 'MJ'\n | 'MN'\n | 'WR'\n | 'primary'\n | 'teal'\n | 'success'\n | 'error'\n | 'red'\n | 'warn'\n | 'warning'\n | 'purple'\n | 'secondary'\n | 'neutral'\n | 'gray'\n | 'critical'\n | 'major'\n | 'minor'\n\nexport type StnChipProps = StnWithoutStyle<\n Omit<HTMLAttributes<HTMLSpanElement>, 'className' | 'color'>\n> & {\n children?: ReactNode\n /** 칩 본문 텍스트 (children이 없을 때 사용하거나, children과 함께 전달 시 외곽 라벨로 기능) */\n label?: ReactNode\n variant?: StnChipVariant\n size?: StnChipSize\n shape?: StnChipShape\n radius?: StnChipShape\n color?: StnChipColor\n icon?: ReactNode\n /** 아이콘 위치 ('left': 기본, 'right') */\n iconPosition?: StnChipIconPosition\n /** 외곽 보조 라벨 */\n sideLabel?: ReactNode\n /** 외곽 보조 라벨 배치 위치 ('top' | 'bottom' | 'left' | 'right', 기본 'right') */\n labelPosition?: StnChipLabelPosition\n /** `labelPosition` 별칭 */\n sideLabelPosition?: StnChipLabelPosition\n /** 클릭 가능한 인터랙티브 칩 여부 (토글과 달리 On/Off 상태를 갖지 않는 액션 클릭용) */\n clickable?: boolean\n /** 삭제 이벤트 콜백 (제공 시 삭제 버튼 렌더링) */\n onDelete?: (e: MouseEvent<HTMLButtonElement>) => void\n /** 삭제 버튼 아이콘 (기본: SVG 닫기 아이콘) */\n deleteIcon?: ReactNode\n /** 삭제 버튼 위치 ('left' | 'right', 기본 'right') */\n deleteIconPosition?: StnChipIconPosition\n /** 삭제 버튼 접근성 라벨 @default '삭제' */\n deleteAriaLabel?: string\n className?: string\n /** Grade for status */\n grade?: StnChipGrade\n /** Border accent */\n accent?: StnChipBorderAccent\n}\n\nfunction hasSideLabel(sideLabel: ReactNode | undefined): boolean {\n return sideLabel !== undefined && sideLabel !== null && sideLabel !== ''\n}\n\nconst DefaultDeleteIcon = () => (\n <svg width=\"1em\" height=\"1em\" viewBox=\"0 0 16 16\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M4.646 4.646a.5.5 0 0 1 .708 0L8 7.293l2.646-2.647a.5.5 0 0 1 .708.708L8.707 8l2.647 2.646a.5.5 0 0 1-.708.708L8 8.707l-2.646 2.647a.5.5 0 0 1-.708-.708L7.293 8 4.646 5.354a.5.5 0 0 1 0-.708z\" />\n </svg>\n)\n\nexport function StnChip(props: StnChipProps) {\n const {\n variant = 'filled',\n size = 'md',\n shape,\n radius,\n color,\n icon,\n iconPosition = 'left',\n sideLabel,\n label,\n labelPosition,\n sideLabelPosition,\n clickable = false,\n onDelete,\n deleteIcon,\n deleteIconPosition = 'right',\n deleteAriaLabel = '삭제',\n className,\n children,\n grade,\n accent,\n onClick,\n onKeyDown,\n role: roleProp,\n tabIndex: tabIndexProp,\n ...rest\n } = props\n\n // Shape resolution (기본: square, rounded는 호환성을 위해 square로 정규화)\n const rawShape = shape ?? radius ?? 'square'\n const resolvedShape: StnChipShape =\n rawShape === 'rounded' || rawShape === 'square' ? 'square' : rawShape\n\n // Variant normalization\n const isOutline = variant === 'outline' || variant === 'outlined' || variant === 'border'\n const variantClass = isOutline ? 'outline' : 'filled'\n\n // Color / Grade resolution\n const resolvedColor = color ?? grade\n\n // Content resolution: children이 있으면 children 우선, 없으면 label, 없으면 grade label\n let content = children ?? label\n if (!content && grade && STN_GRADE_SOURCE[grade]) {\n content = STN_GRADE_SOURCE[grade].label\n }\n\n // Outer side label resolution:\n // children과 label이 둘 다 전달되고 sideLabel이 없으면 label을 외곽 라벨로 취급, 그 외엔 sideLabel 사용\n const resolvedSideLabel =\n sideLabel !== undefined\n ? sideLabel\n : children !== undefined && label !== undefined\n ? label\n : undefined\n\n const resolvedLabelPosition = labelPosition ?? sideLabelPosition ?? 'right'\n const positionClass = `label-${resolvedLabelPosition}`\n\n // Clickable state\n const isClickable = clickable || onClick !== undefined\n const role = roleProp ?? (isClickable ? 'button' : undefined)\n const tabIndex = tabIndexProp ?? (isClickable ? 0 : undefined)\n\n const handleKeyDown = (e: KeyboardEvent<HTMLSpanElement>) => {\n onKeyDown?.(e)\n if (isClickable && (e.key === 'Enter' || e.key === ' ')) {\n if (e.key === ' ') {\n e.preventDefault()\n }\n onClick?.(e as unknown as MouseEvent<HTMLSpanElement>)\n }\n }\n\n const iconElement = icon ? <span className=\"stn-chip__icon\">{icon}</span> : null\n const contentElement = <span className=\"stn-chip__label\">{content}</span>\n\n const deleteElement = onDelete ? (\n <button\n type=\"button\"\n className=\"stn-chip__delete\"\n aria-label={deleteAriaLabel}\n onClick={(e) => {\n e.stopPropagation()\n onDelete(e)\n }}\n >\n {deleteIcon ?? <DefaultDeleteIcon />}\n </button>\n ) : null\n\n // Element ordering based on iconPosition and deleteIconPosition\n const elements: ReactNode[] = []\n if (deleteElement && deleteIconPosition === 'left') {\n elements.push(deleteElement)\n }\n if (iconElement && iconPosition === 'left') {\n elements.push(iconElement)\n }\n elements.push(contentElement)\n if (iconElement && iconPosition === 'right') {\n elements.push(iconElement)\n }\n if (deleteElement && deleteIconPosition === 'right') {\n elements.push(deleteElement)\n }\n\n const chip = (\n <span\n role={role}\n tabIndex={tabIndex}\n className={cn(\n 'stn-chip',\n variantClass,\n size,\n resolvedShape,\n resolvedColor,\n isClickable && 'clickable',\n onDelete && 'deletable',\n accent && `stn-chip--accent-${accent}`,\n !hasSideLabel(resolvedSideLabel) && className,\n )}\n onClick={onClick}\n onKeyDown={handleKeyDown}\n {...rest}\n >\n {elements}\n </span>\n )\n\n if (!hasSideLabel(resolvedSideLabel)) {\n return chip\n }\n\n return (\n <span className={cn('stn-chip-wrap', positionClass, className)}>\n {chip}\n <span className=\"stn-chip__side\">{resolvedSideLabel}</span>\n </span>\n )\n}\n","import React from 'react';\nimport { StnIcon } from './StnIcon';\n\nexport type StnSeverityLevel = 'critical' | 'major' | 'minor' | 'warning'\nexport type StnSeverityVariant = 'badge' | 'filter' | 'glow' | 'solid'\nexport type StnSeveritySize = 'sm' | 'md' | 'lg'\n\nexport interface StnSeverityBadgeProps extends React.ButtonHTMLAttributes<HTMLButtonElement | HTMLSpanElement> {\n /** 심각도: critical, major, minor, warning */\n severity: StnSeverityLevel;\n /** 표시 모드: badge (기본 깔끔한 솔리드), glow (네온 블러/글로우 발광), filter (필터 토글 버튼) */\n variant?: StnSeverityVariant;\n /** 뱃지 크기: 'sm' (18px), 'md' (20px - 기본값), 'lg' (24px) */\n size?: StnSeveritySize;\n /** 라운드(알약/원형) 모서리 적용 여부 (기본값: false, 4px) */\n round?: boolean;\n /** 아이콘 표시 여부 (기본값: true) */\n showIcon?: boolean;\n /** 아이콘 전용 모드 (텍스트 없이 정사각/원형 심각도 아이콘만 표시) */\n iconOnly?: boolean;\n /** 블러 / 네온 글로우 발광 효과 적용 여부 (variant=\"glow\"와 동일, 기본값: false) */\n glow?: boolean;\n /** glow의 별칭 prop (blur 발광 효과 제어) */\n blur?: boolean;\n /** 텍스트 라벨 (미지정 시 기본 라벨 표시) */\n label?: React.ReactNode;\n /** 필터 모드일 때 활성화(선택) 상태 */\n active?: boolean;\n /** 클릭 이벤트 핸들러 */\n onClick?: React.MouseEventHandler<HTMLElement>;\n /** 추가 클래스 */\n className?: string;\n children?: React.ReactNode;\n}\n\nconst SEVERITY_DEFAULT_LABELS: Record<StnSeverityLevel, string> = {\n critical: 'Critical',\n major: 'Major',\n minor: 'Minor',\n warning: 'Warning',\n};\n\nconst SEVERITY_ICONS: Record<StnSeverityLevel, string> = {\n critical: 'fill/alert4',\n major: 'fill/alert3',\n minor: 'fill/alert2',\n warning: 'fill/alert1',\n};\n\n/**\n * StnSeverityBadge\n * 알람 심각도(Critical, Major, Minor, Warning)를 명확하게 표시하거나\n * 대시보드에서 다중 필터 토글 용도로 사용하는 독립 컴포넌트입니다.\n */\nexport const StnSeverityBadge = React.forwardRef<HTMLElement, StnSeverityBadgeProps>(\n (\n {\n severity,\n variant = 'badge',\n size = 'md',\n round = false,\n showIcon = true,\n iconOnly = false,\n glow = false,\n blur = false,\n label,\n active = false,\n onClick,\n className = '',\n children,\n ...restProps\n },\n ref\n ) => {\n const isFilter = variant === 'filter';\n const isInteractive = isFilter || Boolean(onClick);\n const Component = isInteractive ? 'button' : 'span';\n const isIconOnly = Boolean(iconOnly);\n const hasGlow = Boolean(glow || blur || variant === 'glow');\n\n const classNames = [\n 'stn-severity-badge',\n isFilter ? 'filter' : 'badge',\n size,\n round ? 'round' : '',\n isIconOnly ? 'icon-only' : '',\n hasGlow ? 'glow' : '',\n severity,\n active ? 'is-active' : '',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const defaultLabel = SEVERITY_DEFAULT_LABELS[severity];\n const displayLabel = children ?? label ?? defaultLabel;\n const iconName = SEVERITY_ICONS[severity];\n\n const elementProps: Record<string, any> = {\n ref,\n className: classNames,\n onClick,\n title: restProps.title ?? (isIconOnly ? defaultLabel : undefined),\n 'aria-label': restProps['aria-label'] ?? (isIconOnly ? defaultLabel : undefined),\n ...restProps,\n };\n\n if (Component === 'button') {\n elementProps.type = restProps.type || 'button';\n if (isFilter) {\n elementProps['aria-pressed'] = active;\n }\n }\n\n const iconSize = isFilter ? 16 : size === 'sm' ? 12 : size === 'lg' ? 16 : 14;\n\n return (\n <Component {...elementProps}>\n {(showIcon || isIconOnly) && (\n <StnIcon\n name={iconName}\n size={iconSize}\n className=\"stn-severity-badge__icon\"\n color=\"none\"\n aria-hidden=\"true\"\n />\n )}\n {!isIconOnly && <span className=\"stn-severity-badge__label\">{displayLabel}</span>}\n </Component>\n );\n }\n);\n\nStnSeverityBadge.displayName = 'StnSeverityBadge';\n\nexport interface StnSeverityFilterProps {\n /** 현재 선택된 심각도 레벨 배열 */\n value?: StnSeverityLevel[];\n /** 선택 변경 콜백 */\n onChange?: (nextValue: StnSeverityLevel[]) => void;\n /** 비활성화할 심각도 목록 */\n disabledSeverities?: StnSeverityLevel[];\n /** 아이콘 표시 여부 (기본: true) */\n showIcon?: boolean;\n /** 추가 클래스 */\n className?: string;\n}\n\nconst ALL_SEVERITIES: StnSeverityLevel[] = ['critical', 'major', 'minor', 'warning'];\n\n/**\n * StnSeverityFilter\n * 대시보드 및 실시간 장애 목록 상단에서 사용되는 4단계 심각도 필터 그룹 컴포넌트입니다.\n */\nexport const StnSeverityFilter: React.FC<StnSeverityFilterProps> = ({\n value = ALL_SEVERITIES,\n onChange,\n disabledSeverities = [],\n showIcon = true,\n className = '',\n}) => {\n const handleToggle = (sev: StnSeverityLevel) => {\n if (!onChange) return;\n const exists = value.includes(sev);\n const next = exists ? value.filter((item) => item !== sev) : [...value, sev];\n onChange(next);\n };\n\n return (\n <div className={`stn-severity-filter-group ${className}`.trim()} role=\"group\" aria-label=\"심각도 필터\">\n {ALL_SEVERITIES.map((sev) => {\n const isActive = value.includes(sev);\n const isDisabled = disabledSeverities.includes(sev);\n return (\n <StnSeverityBadge\n key={sev}\n severity={sev}\n variant=\"filter\"\n showIcon={showIcon}\n active={isActive}\n disabled={isDisabled}\n onClick={() => !isDisabled && handleToggle(sev)}\n />\n );\n })}\n </div>\n );\n};\n\nStnSeverityFilter.displayName = 'StnSeverityFilter';\n","import type { CSSProperties, HTMLAttributes } from 'react'\n\nimport { cn } from '../cn'\n\nexport type StnSystemChipTone =\n | 'cr'\n | 'mj'\n | 'mn'\n | 'wr'\n | 'CR'\n | 'MJ'\n | 'MN'\n | 'WR'\n | 'info'\n | 'success'\n | 'purple'\n | 'neutral'\n | 'critical'\n | 'major'\n | 'minor'\n | 'warning'\n | 'teal'\n | 'error'\n | 'warn'\n | string\n\nexport type StnSystemChipItem = {\n id: string\n /** 점(dot) 색상 톤: 2글자 표준(cr, mj, mn, wr) 또는 info, success, purple 등 */\n tone?: StnSystemChipTone\n /** 점(dot) 커스텀 색상 값 (CSS 컬러 또는 var(--...)) */\n dotColor?: string\n /** 수치 카운트 또는 텍스트 */\n count?: number | string\n value?: number | string\n /** 텍스트 라벨 (선택) */\n label?: string\n}\n\nexport type StnSystemChipProps = HTMLAttributes<HTMLDivElement> & {\n /** 1개, 2개, 3개, 4개 등 원하는 숫자만큼의 아이템 배열 */\n items: StnSystemChipItem[]\n /** 텍스트 라벨 표시 여부 */\n showLabel?: boolean\n /**\n * 핵심 1개만 노출 · 호버/포커스 시 전체 펼침.\n * - 생략(`auto`): `stn-header` ≤1200px 에서 CSS 자동 적용\n * - `true`: 항상 compact\n * - `false`: 항상 전체 노출\n */\n compact?: boolean\n className?: string\n}\n\nconst DEFAULT_TONE_LABELS: Record<string, string> = {\n cr: 'CR',\n mj: 'MJ',\n mn: 'MN',\n wr: 'WR',\n critical: 'CR',\n major: 'MJ',\n minor: 'MN',\n warning: 'WR',\n info: 'Info',\n success: 'Success',\n teal: 'WR',\n}\n\nconst TONE_PRIORITY = ['cr', 'critical', 'mj', 'major', 'mn', 'minor', 'wr', 'warning', 'teal'] as const\n\nfunction canonicalTone(tone?: string) {\n const raw = tone ? tone.toLowerCase() : 'info'\n if (raw === 'critical') return 'cr'\n if (raw === 'major') return 'mj'\n if (raw === 'minor') return 'mn'\n if (raw === 'warning' || raw === 'teal') return 'wr'\n return raw\n}\n\n/** 가장 중요한 항목 — 심각도 순 · count>0 우선, 없으면 첫 항목 */\nfunction pickPrimaryIndex(items: StnSystemChipItem[]) {\n for (const tone of TONE_PRIORITY) {\n const index = items.findIndex((item) => {\n const t = canonicalTone(item.tone)\n const value = Number(item.value ?? item.count ?? 0)\n return t === tone && Number.isFinite(value) && value > 0\n })\n if (index >= 0) return index\n }\n return 0\n}\n\n/**\n * System Chip (헤더 시스템 상태 요약 바)\n * [ 🔴 0 | 🟠 12 | 🟡 2 | 🔵 3 ] 형태.\n * compact 모드에서는 핵심 1개만 보이고 호버 시 전체가 펼쳐집니다.\n */\nexport function StnSystemChip({\n items,\n showLabel = false,\n compact,\n className,\n ...rest\n}: StnSystemChipProps) {\n const primaryIndex = pickPrimaryIndex(items)\n\n return (\n <div\n className={cn(\n 'stn-system-chip',\n showLabel && 'stn-system-chip--labeled',\n compact === true && 'compact',\n className,\n )}\n role=\"group\"\n aria-label=\"System status chip\"\n {...(compact === undefined ? {} : { 'data-compact': compact ? 'true' : 'false' })}\n {...rest}\n >\n {items.map((item, index) => {\n const tone = canonicalTone(item.tone)\n const isNamedTone = [\n 'cr',\n 'mj',\n 'mn',\n 'wr',\n 'info',\n 'success',\n 'purple',\n 'neutral',\n ].includes(tone)\n\n const dotStyle: CSSProperties | undefined = item.dotColor\n ? { backgroundColor: item.dotColor }\n : !isNamedTone && item.tone\n ? { backgroundColor: item.tone }\n : undefined\n\n const displayValue = item.value ?? item.count ?? 0\n const displayLabel =\n item.label ??\n (showLabel\n ? DEFAULT_TONE_LABELS[tone] || (item.tone && DEFAULT_TONE_LABELS[item.tone])\n : undefined)\n\n return (\n <div\n key={item.id}\n className={cn(\n 'stn-system-chip__item',\n index === primaryIndex && 'stn-system-chip__item--primary',\n )}\n >\n <span\n className={cn(\n 'stn-system-chip__dot',\n isNamedTone && `stn-system-chip__dot--${tone}`,\n )}\n style={dotStyle}\n aria-hidden=\"true\"\n />\n {displayLabel ? (\n <span className=\"stn-system-chip__label\">{displayLabel}</span>\n ) : null}\n <span className=\"stn-system-chip__count\">{displayValue}</span>\n </div>\n )\n })}\n </div>\n )\n}\n","import {\n forwardRef,\n useState,\n type ButtonHTMLAttributes,\n type ReactNode,\n} from 'react'\n\nimport { cn } from '../cn'\nimport type { StnWithoutStyle } from '../stnStrictProps'\nimport { StnIcon } from './StnIcon'\n\nexport type StnToggleButtonSize = 'sm' | 'md' | 'lg'\nexport type StnToggleButtonColor =\n | 'primary'\n | 'secondary'\n | 'success'\n | 'critical'\n | 'major'\n | 'minor'\n | 'warning'\n | 'neutral'\n | (string & {})\n\nexport type StnToggleButtonGradient =\n | 'none'\n | 'main'\n | 'primary'\n | 'secondary'\n | 'critical'\n | 'major'\n | 'minor'\n | 'warning'\n\nexport type StnToggleButtonWidthPreset = 80 | 100 | 120 | 140 | 160 | 180 | 200\nexport type StnToggleButtonWidthValue = StnToggleButtonWidthPreset | 'full' | number | string\nexport type StnToggleButtonIconPosition = 'left' | 'right'\n\nexport type StnToggleButtonProps = StnWithoutStyle<\n Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'onChange'>\n> & {\n /** 켜짐(ON) 상태 여부 (제어 모드) */\n pressed?: boolean\n /** 초기 켜짐(ON) 상태 (비제어 모드) @default false */\n defaultPressed?: boolean\n /** 토글 상태 변경 콜백 (true: ON, false: OFF) */\n onChange?: (pressed: boolean) => void\n /** 크기 ('sm': 26px, 'md': 34px 기본, 'lg': 42px) @default 'md' */\n size?: StnToggleButtonSize\n /** 활성(ON) 상태 시맨틱 솔리드 색상 @default 'primary' */\n color?: StnToggleButtonColor\n /** 활성(ON) 상태 7대 표준 시맨틱 그라데이션 ('main' | 'primary' | 'secondary' | 'critical' | 'major' | 'minor' | 'warning') */\n gradient?: StnToggleButtonGradient\n /** 아이콘 요소 또는 시스템 아이콘 slug ('line/volume', 'line/pin' 등) */\n icon?: ReactNode\n /** 아이콘 위치 ('left': 기본, 'right') @default 'left' */\n iconPosition?: StnToggleButtonIconPosition\n /** 아이콘 전용 정사각/원형 모드 */\n iconOnly?: boolean\n /**\n * 너비 프리셋 (80 | 100 | 120 | 140 | 160 | 180 | 200 | 'full') 또는 커스텀 px/string.\n * 토글 버튼 특성상 최소 고정 너비(min-width)로 작용하여 글자가 길어지면 자연스럽게 확장(Hug)됩니다.\n */\n width?: StnToggleButtonWidthValue\n /** 최소 너비(min-width) 명시적 지정 (width와 동일) */\n minWidth?: number | string\n /** 100% 전체 폭 버튼 (`full`) */\n fullWidth?: boolean\n disabled?: boolean\n children?: ReactNode\n className?: string\n 'aria-label'?: string\n}\n\nexport const StnToggleButton = forwardRef<HTMLButtonElement, StnToggleButtonProps>(\n function StnToggleButton(\n {\n pressed: pressedProp,\n defaultPressed = false,\n onChange,\n size = 'md',\n color = 'primary',\n gradient = 'none',\n icon,\n iconPosition = 'left',\n iconOnly: iconOnlyProp,\n width: widthProp,\n minWidth: minWidthProp,\n fullWidth = false,\n disabled = false,\n children,\n className,\n 'aria-label': ariaLabel,\n onClick,\n ...rest\n },\n ref,\n ) {\n const isControlled = pressedProp !== undefined\n const [internalPressed, setInternalPressed] = useState(defaultPressed)\n const isPressed = isControlled ? Boolean(pressedProp) : internalPressed\n\n const hasGradient = gradient && gradient !== 'none'\n const isKnownTone = [\n 'primary',\n 'secondary',\n 'success',\n 'critical',\n 'major',\n 'minor',\n 'warning',\n 'neutral',\n ].includes(color)\n const toneClass = !hasGradient && isKnownTone ? color : ''\n const gradientClass = hasGradient ? `gradient-${gradient}` : ''\n const inlineStyle =\n !hasGradient && !isKnownTone && color\n ? ({\n '--stn-toggle-active-bg': color,\n } as React.CSSProperties)\n : undefined\n\n const targetWidth = minWidthProp ?? widthProp\n const isFull = fullWidth || targetWidth === 'full' || targetWidth === '100%'\n const rawNumber =\n typeof targetWidth === 'number'\n ? targetWidth\n : typeof targetWidth === 'string' && /^(?:w)?\\d+px?$/i.test(targetWidth.trim())\n ? parseInt(targetWidth.trim().replace(/^w/i, ''), 10)\n : null\n\n const KNOWN_PRESETS = [80, 100, 120, 140, 160, 180, 200]\n const isPreset = rawNumber != null && KNOWN_PRESETS.includes(rawNumber)\n const widthClass = isFull ? 'full' : isPreset ? `w${rawNumber}` : ''\n\n const customMinWidth =\n !isFull && !isPreset && targetWidth != null\n ? typeof targetWidth === 'number'\n ? `${targetWidth}px`\n : String(targetWidth)\n : undefined\n\n const combinedStyle: React.CSSProperties | undefined =\n inlineStyle || customMinWidth\n ? {\n ...inlineStyle,\n ...(customMinWidth ? { minWidth: customMinWidth } : {}),\n }\n : undefined\n\n const isIconOnly = iconOnlyProp !== undefined ? iconOnlyProp : Boolean(icon && !children)\n const iconPx = size === 'sm' ? 14 : size === 'lg' ? 18 : 16\n const renderedIcon =\n typeof icon === 'string' ? (\n <StnIcon name={icon} size={iconPx} color=\"currentColor\" />\n ) : (\n icon\n )\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n if (disabled) return\n onClick?.(e)\n const nextPressed = !isPressed\n if (!isControlled) {\n setInternalPressed(nextPressed)\n }\n onChange?.(nextPressed)\n }\n\n return (\n <button\n ref={ref}\n type=\"button\"\n aria-pressed={isPressed}\n aria-label={ariaLabel}\n disabled={disabled}\n className={cn(\n 'stn-toggle-btn',\n isPressed && 'active',\n size !== 'md' && size,\n toneClass,\n gradientClass,\n isIconOnly && 'icon-only',\n iconPosition === 'right' && 'icon-right',\n widthClass,\n className,\n )}\n style={combinedStyle}\n onClick={handleClick}\n {...rest}\n >\n {iconPosition === 'right' ? (\n <>\n {children}\n {renderedIcon}\n </>\n ) : (\n <>\n {renderedIcon}\n {children}\n </>\n )}\n </button>\n )\n },\n)\n\n\n\n","import { forwardRef, useId, type InputHTMLAttributes, type ReactNode } from 'react'\n\nimport { cn } from '../cn'\nimport type { StnWithoutStyle } from '../stnStrictProps'\n\nexport type StnSwitchSize = 'sm' | 'md' | 'lg'\nexport type StnSwitchColor =\n | 'primary'\n | 'secondary'\n | 'success'\n | 'critical'\n | 'major'\n | 'minor'\n | 'warning'\n | (string & {})\n\nexport type StnSwitchGradient =\n | boolean\n | 'main'\n | 'primary'\n | 'secondary'\n | 'critical'\n | 'major'\n | 'minor'\n | 'warning'\n | (string & {})\n\nexport type StnSwitchLabelPosition = 'right' | 'left' | 'top' | 'bottom' | 'start' | 'end'\n\nexport type StnSwitchProps = StnWithoutStyle<\n Omit<InputHTMLAttributes<HTMLInputElement>, 'type' | 'className' | 'children' | 'role' | 'size'>\n> & {\n /** 스위치 옆/맞은편 레이블 */\n label?: ReactNode\n /** 크기 ('sm': 28×16, 'md': 36×20 기본, 'lg': 44×24) @default 'md' */\n size?: StnSwitchSize\n /** 활성 트랙 색상 @default 'primary' */\n color?: StnSwitchColor\n /**\n * 활성화 시 그라데이션 트랙 적용\n * boolean(기본 블루) 또는 'blue' | 'teal' | 'purple' | 'sunset' | 'emerald' | 커스텀 linear-gradient\n */\n gradient?: StnSwitchGradient\n /** 레이블 위치 ('right' 기본, 'left', 'top', 'bottom') @default 'right' */\n labelPosition?: StnSwitchLabelPosition\n /**\n * true: 행 전체 100% width · 레이블 왼쪽 / 스위치 오른쪽 끝 분리 배치\n */\n between?: boolean\n /** 필수 입력 여부 (레이블 옆에 붉은색 * 표시) */\n required?: boolean\n className?: string\n}\n\n/**\n * Switch Toggle — ON/OFF. 모양: `stn-switch.css`\n * DOM: input → control → label (checked 스타일은 인접 형제)\n */\nexport const StnSwitch = forwardRef<HTMLInputElement, StnSwitchProps>(function StnSwitch(\n {\n label,\n size = 'md',\n color,\n gradient,\n labelPosition = 'right',\n between = false,\n required = false,\n className,\n id: idProp,\n disabled,\n ...rest\n },\n ref,\n) {\n const autoId = useId()\n const id = idProp ?? autoId\n\n // Placement class\n let positionClass = 'label-right'\n if (between) {\n positionClass = 'between'\n } else if (labelPosition === 'left' || labelPosition === 'start') {\n positionClass = 'label-left'\n } else if (labelPosition === 'top') {\n positionClass = 'label-top'\n } else if (labelPosition === 'bottom') {\n positionClass = 'label-bottom'\n }\n\n // Known tones\n const isKnownTone =\n color &&\n [\n 'primary',\n 'secondary',\n 'success',\n 'critical',\n 'major',\n 'minor',\n 'warning',\n ].includes(color)\n const toneClass = isKnownTone ? color : ''\n\n // Gradient resolution\n let gradientClass = ''\n let customGradient = ''\n\n if (gradient === true) {\n gradientClass = 'gradient'\n } else if (typeof gradient === 'string') {\n if (['main', 'primary', 'secondary', 'critical', 'major', 'minor', 'warning'].includes(gradient)) {\n gradientClass = `gradient-${gradient}`\n } else if (gradient.includes('gradient') || gradient.startsWith('linear-') || gradient.startsWith('radial-')) {\n customGradient = gradient\n }\n }\n\n // Custom color / gradient inline style\n const inlineStyle = customGradient\n ? ({\n '--stn-switch-track-checked': customGradient,\n } as React.CSSProperties)\n : color && !isKnownTone\n ? ({\n '--stn-switch-track-checked': color,\n } as React.CSSProperties)\n : undefined\n\n // Size class\n const sizeClass = size !== 'md' ? size : ''\n\n return (\n <label\n className={cn(\n 'stn-switch',\n sizeClass,\n toneClass,\n gradientClass,\n positionClass,\n disabled && 'disabled',\n className,\n )}\n style={inlineStyle}\n htmlFor={id}\n >\n <input\n ref={ref}\n id={id}\n type=\"checkbox\"\n role=\"switch\"\n className=\"stn-switch__input\"\n disabled={disabled}\n required={required}\n {...rest}\n />\n <span className=\"stn-switch__control\" aria-hidden=\"true\">\n <span className=\"stn-switch__thumb\" />\n </span>\n {label != null && label !== '' ? (\n <span className=\"stn-switch__label\">\n {label}\n {required && (\n <span className=\"stn-switch__required\" aria-hidden=\"true\">\n *\n </span>\n )}\n </span>\n ) : null}\n </label>\n )\n})\n","import { forwardRef, useId, type InputHTMLAttributes, type ReactNode } from 'react'\n\nimport { cn } from '../cn'\nimport type { StnWithoutStyle } from '../stnStrictProps'\n\nexport type StnRadioSize = 'sm' | 'md' | 'lg'\nexport type StnRadioColor =\n | 'primary'\n | 'secondary'\n | 'success'\n | 'critical'\n | 'major'\n | 'minor'\n | 'warning'\n | (string & {})\n\nexport type StnRadioLabelPlacement = 'end' | 'start' | 'top' | 'bottom' | 'left' | 'right'\n\nexport type StnRadioProps = StnWithoutStyle<\n Omit<InputHTMLAttributes<HTMLInputElement>, 'type' | 'className' | 'children' | 'size'>\n> & {\n /** 레이블 텍스트. 생략 시 단독 컨트롤(control-only)로 표시 */\n label?: ReactNode\n /** 라디오 버튼 크기 ('sm': 14px, 'md': 18px 기본, 'lg': 22px) @default 'md' */\n size?: StnRadioSize\n /** 시멘틱 색상 또는 커스텀 색상 ('primary' | 'error' | 'success' | 'warn' | 'secondary' | 'neutral') @default 'primary' */\n color?: StnRadioColor\n /** 레이블 배치 위치 ('end' | 'start' | 'top' | 'bottom') @default 'end' */\n labelPlacement?: StnRadioLabelPlacement\n /** 레이블 텍스트 숨기고 컨트롤만 표시 (label이 없으면 자동 적용) */\n controlOnly?: boolean\n /** 필수 선택 여부 (레이블 옆에 붉은색 * 표시) */\n required?: boolean\n className?: string\n}\n\n/**\n * Radio — Figma `input`(18×18 · cyan-350 점). 모양: `stn-radio.css`\n */\nexport const StnRadio = forwardRef<HTMLInputElement, StnRadioProps>(function StnRadio(\n {\n label,\n size = 'md',\n color,\n labelPlacement = 'end',\n controlOnly,\n required = false,\n className,\n id: idProp,\n disabled,\n ...rest\n },\n ref,\n) {\n const autoId = useId()\n const id = idProp ?? autoId\n const isControlOnly = controlOnly ?? !label\n\n // Placement class\n const placementClass =\n labelPlacement === 'start' || labelPlacement === 'left'\n ? 'label-start'\n : labelPlacement === 'top'\n ? 'label-top'\n : labelPlacement === 'bottom'\n ? 'label-bottom'\n : ''\n\n // Tone class (단일 클래스)\n const isKnownTone =\n color &&\n [\n 'primary',\n 'secondary',\n 'success',\n 'critical',\n 'major',\n 'minor',\n 'warning',\n ].includes(color)\n const toneClass = isKnownTone ? color : ''\n\n // Size class (단일 클래스)\n const sizeClass = size !== 'md' ? size : ''\n\n // Inline style for custom color\n const inlineStyle =\n color && !isKnownTone\n ? ({\n '--stn-radio-dot': color,\n '--stn-radio-checked-border': color,\n } as React.CSSProperties)\n : undefined\n\n return (\n <span\n className={cn(\n 'radio',\n 'stn-radio',\n sizeClass,\n toneClass,\n placementClass,\n isControlOnly && 'control-only',\n disabled && 'disabled',\n className,\n )}\n style={inlineStyle}\n >\n <input ref={ref} type=\"radio\" id={id} disabled={disabled} required={required} {...rest} />\n <label htmlFor={id} aria-hidden={isControlOnly ? true : undefined}>\n {label}\n {required && !isControlOnly && (\n <span className=\"stn-radio__required\" aria-hidden=\"true\">\n *\n </span>\n )}\n </label>\n </span>\n )\n})\n","import { useId, type ReactNode } from 'react'\n\nimport { cn } from '../cn'\nimport { StnRadio, type StnRadioColor, type StnRadioSize } from './StnRadio'\n\nexport type StnRadioGroupOption = {\n value: string\n label: ReactNode\n disabled?: boolean\n}\n\nexport type StnRadioGroupLayout = 'column' | 'row'\nexport type StnRadioGroupOrientation = 'horizontal' | 'vertical'\n\nexport type StnRadioGroupProps = {\n name?: string\n value?: string\n defaultValue?: string\n onChange?: (value: string) => void\n options: readonly StnRadioGroupOption[]\n /** 배치 방향 ('horizontal' | 'vertical') @default 'vertical' */\n orientation?: StnRadioGroupOrientation\n /** column — 세로 나열 · row — 가로 나열 (기존 호환성) */\n layout?: StnRadioGroupLayout | 'inline'\n /** 크기 ('sm' | 'md' | 'lg') */\n size?: StnRadioSize\n /** 색상 톤 */\n color?: StnRadioColor\n disabled?: boolean\n className?: string\n 'aria-label'?: string\n}\n\nexport function StnRadioGroup({\n name: nameProp,\n value,\n defaultValue,\n onChange,\n options,\n orientation,\n layout,\n size,\n color,\n disabled = false,\n className,\n 'aria-label': ariaLabel,\n}: StnRadioGroupProps) {\n const autoName = useId().replace(/:/g, '')\n const name = nameProp ?? `stn-radio-${autoName}`\n\n const isRow = orientation === 'horizontal' || layout === 'row'\n\n const items = options.map((opt) => (\n <StnRadio\n key={opt.value}\n name={name}\n value={opt.value}\n label={opt.label}\n size={size}\n color={color}\n checked={value !== undefined ? value === opt.value : undefined}\n defaultChecked={defaultValue !== undefined ? defaultValue === opt.value : undefined}\n disabled={disabled || opt.disabled}\n onChange={() => onChange?.(opt.value)}\n />\n ))\n\n return (\n <div\n className={cn(\n 'stn-radio-group',\n isRow ? 'horizontal stn-radio-group--row' : 'vertical stn-radio-group--column',\n className,\n )}\n role=\"radiogroup\"\n aria-label={ariaLabel}\n aria-orientation={isRow ? 'horizontal' : 'vertical'}\n >\n {items}\n </div>\n )\n}\n","import { useId, type ReactNode } from 'react'\n\nimport { cn } from '../cn'\nimport type { StnWithoutStyle } from '../stnStrictProps'\nimport { StnIcon } from './StnIcon'\n\nfunction renderSegmentedIcon(icon: ReactNode, size: StnSegmentedSize) {\n if (!icon) return null\n if (typeof icon === 'string') {\n const iconPx = size === 'sm' ? 14 : size === 'lg' ? 18 : 16\n return <StnIcon name={icon} size={iconPx} color=\"currentColor\" />\n }\n return icon\n}\n\nexport type StnSegmentedSize = 'sm' | 'md' | 'lg'\nexport type StnSegmentedOrientation = 'horizontal' | 'vertical'\n\nexport type StnSegmentedColor =\n | 'primary'\n | 'secondary'\n | 'success'\n | 'critical'\n | 'major'\n | 'minor'\n | 'warning'\n | 'neutral'\n\nexport type StnSegmentedOption = {\n value: string\n label?: ReactNode\n icon?: ReactNode\n disabled?: boolean\n 'aria-label'?: string\n}\n\ntype StnSegmentedShared = StnWithoutStyle<{\n /** 탭 항목 목록 */\n options: readonly StnSegmentedOption[]\n /** 크기 ('sm': 26px, 'md': 32px 기본, 'lg': 40px) @default 'md' */\n size?: StnSegmentedSize\n /** 활성 탭 시맨틱 솔리드 색상 */\n color?: StnSegmentedColor\n /** 배치 방향 ('horizontal' | 'vertical') @default 'horizontal' */\n orientation?: StnSegmentedOrientation\n /** 수직 세로 배치 여부 @default false */\n vertical?: boolean\n /** 전체 너비 확장 여부 @default false */\n block?: boolean\n /** 전체 비활성화 */\n disabled?: boolean\n className?: string\n name?: string\n 'aria-label'?: string\n}>\n\nexport type StnSegmentedSingleProps = StnSegmentedShared & {\n multiple?: false\n value: string\n onChange: (value: string) => void\n}\n\nexport type StnSegmentedMultipleProps = StnSegmentedShared & {\n multiple: true\n value: readonly string[]\n onChange: (value: string[]) => void\n}\n\nexport type StnSegmentedProps = StnSegmentedSingleProps | StnSegmentedMultipleProps\n\n/**\n * Pill segmented control — Pub `.stn-segmented`\n * 기본은 하나만 선택. `multiple`이면 1개도, 여러 개도 고를 수 있다.\n * 아이콘 전용, 아이콘 + 텍스트, 크기(sm/md/lg), 수직(vertical) 배치를 지원합니다.\n */\nexport function StnSegmented(props: StnSegmentedProps) {\n const {\n options,\n size = 'md',\n orientation = 'horizontal',\n vertical = false,\n block = false,\n disabled = false,\n color,\n className,\n name: nameProp,\n 'aria-label': ariaLabel,\n } = props\n const autoName = useId().replace(/:/g, '')\n const name = nameProp ?? `stn-segmented-${autoName}`\n const multiple = props.multiple === true\n const isVertical = vertical || orientation === 'vertical'\n\n function isSelected(optionValue: string) {\n if (multiple) return props.value.includes(optionValue)\n return props.value === optionValue\n }\n\n function handleClick(optionValue: string) {\n if (multiple) {\n const current = [...props.value]\n const next = current.includes(optionValue)\n ? current.filter((item) => item !== optionValue)\n : [...current, optionValue]\n props.onChange(next)\n return\n }\n props.onChange(optionValue)\n }\n\n return (\n <div\n className={cn(\n 'stn-segmented',\n isVertical && 'vertical',\n size !== 'md' && size,\n block && 'block',\n multiple && 'stn-segmented--multiple',\n color,\n className,\n )}\n role={multiple ? 'group' : 'radiogroup'}\n aria-label={ariaLabel}\n aria-orientation={isVertical ? 'vertical' : 'horizontal'}\n >\n {options.map((opt) => {\n const selected = isSelected(opt.value)\n const itemDisabled = disabled || opt.disabled\n const isIconOnly = Boolean(opt.icon && !opt.label)\n const ariaLabelText = opt['aria-label'] || (isIconOnly && typeof opt.value === 'string' ? opt.value : undefined)\n\n return (\n <button\n key={opt.value}\n type=\"button\"\n role={multiple ? undefined : 'radio'}\n name={multiple ? undefined : name}\n aria-checked={multiple ? undefined : selected}\n aria-pressed={multiple ? selected : undefined}\n aria-label={ariaLabelText}\n disabled={itemDisabled}\n className={cn(\n 'stn-segmented__item',\n selected && 'stn-segmented__item--active',\n isIconOnly && 'icon-only',\n )}\n onClick={() => {\n if (!itemDisabled) handleClick(opt.value)\n }}\n >\n {renderSegmentedIcon(opt.icon, size)}\n {opt.label && <span>{opt.label}</span>}\n </button>\n )\n })}\n </div>\n )\n}\n","import {\n useCallback,\n useEffect,\n useId,\n useRef,\n useState,\n type HTMLAttributes,\n type KeyboardEvent,\n type ReactNode,\n} from 'react'\n\nimport type {\n StnDropdownModifier,\n StnDropdownOption,\n StnDropdownSize,\n StnDropdownVariant,\n StnDropdownHelperTextPosition,\n StnDropdownDirection,\n} from '@stn-uiux/pub-ui/data/stnDropdown'\nimport type { StnInputWidthValue } from '@stn-uiux/pub-ui/data/stnInputWidth'\n\nimport { cn } from '../cn'\nimport type { StnWithoutStyle } from '../stnStrictProps'\nimport { resolveInputWidthProps } from '../inputWidth'\n\nexport type {\n StnDropdownOption,\n StnDropdownSize,\n StnDropdownModifier,\n StnDropdownVariant,\n StnDropdownHelperTextPosition,\n StnDropdownDirection,\n}\n\nfunction modifierClass(modifier: StnDropdownModifier | undefined): string {\n if (modifier === 'pageSize') return 'stn-table__page-size'\n if (modifier === 'serverFilter') return 'server_filter'\n if (modifier === 'networkArea') return 'network_area_box'\n if (modifier === 'fullWidth') return 'full'\n return ''\n}\n\nfunction sizeClass(size: StnDropdownSize): string {\n if (size === 'sm') return 'sm'\n if (size === 'lg') return 'lg'\n if (size === 'xl') return 'xl'\n return 'md'\n}\n\nfunction menuSizeClass(size: StnDropdownSize, prominent: boolean): string {\n if (prominent || size === 'xl') return 'xl'\n return sizeClass(size)\n}\n\nfunction variantClass(variant: StnDropdownVariant = 'outline'): string {\n if (variant === 'standard') return 'standard'\n if (variant === 'filled') return 'filled'\n return 'outline'\n}\n\nfunction useControllable<T>(controlled: T | undefined, defaultValue: T, onChange?: (v: T) => void) {\n const [internal, setInternal] = useState(defaultValue)\n const value = controlled ?? internal\n const setValue = useCallback(\n (next: T) => {\n if (controlled === undefined) setInternal(next)\n onChange?.(next)\n },\n [controlled, onChange],\n )\n return [value, setValue] as const\n}\n\nexport type StnDropdownProps = {\n /** 드롭다운 옵션 목록 */\n options: StnDropdownOption[]\n /** 드롭다운 높이 규격: sm (24px) | md (32px, 기본값) | lg (40px) | xl (52px) */\n size?: StnDropdownSize\n /** 외형 스타일 변형: outline (기본) | standard (하단 라인만) | filled (배경 채움) */\n variant?: StnDropdownVariant\n /** 특수 레이아웃 수식어 */\n modifier?: StnDropdownModifier\n /** 선택된 값 (Controlled) */\n value?: string\n /** 초기 기본값 (Uncontrolled) */\n defaultValue?: string\n /** 선택 변경 핸들러 */\n onChange?: (value: string) => void\n /** 비활성화 여부 */\n disabled?: boolean\n /** 오류 상태 (빨간색 테두리 및 헬퍼 텍스트) */\n error?: boolean\n /** 읽기 전용 상태 (선택 변경 불가) */\n readOnly?: boolean\n /** 선택되지 않았을 때 표시할 안내 문구 */\n placeholder?: string\n /** 필드 보조 텍스트 (도움말/에러 안내) */\n helperText?: ReactNode\n /** 보조 텍스트 위치 (top | bottom | left | right, 기본값 bottom) */\n helperTextPosition?: StnDropdownHelperTextPosition\n /** 메뉴 열림 방향: down (기본값 · 아래로 열림) | up (위로 열림) */\n direction?: StnDropdownDirection\n /**\n * 검색 특화 52px 대형 메뉴 (`stn-dropdown--prominent`).\n * `size=\"xl\"` 사용 권장.\n */\n prominent?: boolean\n /** width 100% — `stn-dropdown--full w100p` */\n fullWidth?: boolean\n /** 프리셋 80·100·140·180·200 · `100%`/`full` · 그 외 px/string */\n width?: StnInputWidthValue\n className?: string\n id?: string\n 'aria-label'?: string\n} & StnWithoutStyle<\n Omit<\n HTMLAttributes<HTMLDivElement>,\n 'value' | 'defaultValue' | 'onChange' | 'children' | 'className' | 'style' | 'id' | 'aria-label'\n >\n>\n\n/**\n * StnDropdown — 디자인 시스템 표준 커스텀 드롭다운 (`div.selected` + `ul.select_option`).\n */\nexport function StnDropdown({\n options,\n size = 'md',\n variant = 'outline',\n direction = 'down',\n modifier,\n value: valueProp,\n defaultValue = '',\n onChange,\n disabled = false,\n error = false,\n readOnly = false,\n placeholder,\n helperText,\n helperTextPosition = 'bottom',\n prominent = false,\n fullWidth = false,\n width,\n className,\n id: idProp,\n 'aria-label': ariaLabel,\n ...divRest\n}: StnDropdownProps) {\n const autoId = useId()\n const rootId = idProp ?? `stn-dropdown-${autoId.replace(/:/g, '')}`\n const [value, setValue] = useControllable(valueProp, defaultValue, onChange)\n const [open, setOpen] = useState(false)\n const rootRef = useRef<HTMLDivElement>(null)\n\n const selected = options.find((o) => o.value === value)\n const hasValue = selected !== undefined && value !== ''\n const displayLabel = hasValue ? selected.label : (placeholder ?? (options[0]?.label ?? ''))\n\n const widthProps = resolveInputWidthProps(\n 'stn-dropdown',\n fullWidth || modifier === 'fullWidth',\n width,\n )\n\n const hasHelper = helperText != null && helperText !== ''\n const helperId = hasHelper ? `${rootId}-helper` : undefined\n const isHorizontalHelper = hasHelper && (helperTextPosition === 'left' || helperTextPosition === 'right')\n const shouldApplyWidthToDropdown = !hasHelper || isHorizontalHelper\n\n const boxClass = cn(\n 'stn-dropdown',\n menuSizeClass(size, prominent),\n variantClass(variant),\n (direction === 'up' || modifier === 'pageSize') && 'up',\n modifierClass(modifier),\n shouldApplyWidthToDropdown && widthProps.className,\n disabled && 'is-disabled',\n error && 'is-error',\n readOnly && 'is-readonly',\n open && 'on',\n shouldApplyWidthToDropdown && className,\n )\n\n useEffect(() => {\n if (disabled || readOnly) setOpen(false)\n }, [disabled, readOnly])\n\n useEffect(() => {\n if (!open) return\n const onDoc = (e: MouseEvent) => {\n if (rootRef.current && !rootRef.current.contains(e.target as Node)) setOpen(false)\n }\n document.addEventListener('mousedown', onDoc)\n return () => document.removeEventListener('mousedown', onDoc)\n }, [open])\n\n const pick = (next: string) => {\n if (readOnly || disabled) return\n setValue(next)\n setOpen(false)\n }\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (disabled || readOnly) return\n\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n setOpen((o) => !o)\n return\n }\n\n if (e.key === 'Escape') {\n setOpen(false)\n return\n }\n\n if (e.key === 'ArrowDown' || e.key === 'ArrowUp') {\n e.preventDefault()\n if (!open) {\n setOpen(true)\n return\n }\n const enabledOptions = options.filter((o) => !o.disabled)\n if (enabledOptions.length === 0) return\n\n const currentIndex = enabledOptions.findIndex((o) => o.value === value)\n let nextIndex = 0\n if (e.key === 'ArrowDown') {\n nextIndex = currentIndex < enabledOptions.length - 1 ? currentIndex + 1 : 0\n } else {\n nextIndex = currentIndex > 0 ? currentIndex - 1 : enabledOptions.length - 1\n }\n setValue(enabledOptions[nextIndex].value)\n }\n }\n\n const dropdownNode = (\n <div\n ref={rootRef}\n id={rootId}\n className={boxClass}\n style={shouldApplyWidthToDropdown ? widthProps.style : undefined}\n aria-disabled={disabled || undefined}\n aria-readonly={readOnly || undefined}\n aria-invalid={error || undefined}\n {...(!hasHelper ? divRest : {})}\n >\n <div\n className={cn('selected', !hasValue && placeholder && 'is-placeholder')}\n tabIndex={disabled ? -1 : 0}\n role=\"combobox\"\n aria-expanded={open}\n aria-disabled={disabled}\n aria-readonly={readOnly}\n aria-invalid={error}\n aria-describedby={helperId}\n aria-label={ariaLabel}\n onClick={() => !disabled && !readOnly && setOpen((o) => !o)}\n onKeyDown={handleKeyDown}\n >\n {displayLabel}\n </div>\n <ul className=\"select_option\" role=\"listbox\" aria-label={ariaLabel}>\n {options.map((opt) => (\n <li\n key={opt.value}\n role=\"option\"\n aria-selected={opt.value === value}\n aria-disabled={opt.disabled}\n className={opt.disabled ? 'disabled' : undefined}\n onClick={() => !opt.disabled && pick(opt.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && !opt.disabled) pick(opt.value)\n }}\n >\n {opt.label}\n </li>\n ))}\n </ul>\n </div>\n )\n\n if (!hasHelper) return dropdownNode\n\n return (\n <div\n className={cn(\n 'stn-dropdown-field',\n `stn-dropdown-field--pos-${helperTextPosition}`,\n error && 'is-error',\n !isHorizontalHelper && widthProps.className,\n className,\n )}\n style={!isHorizontalHelper ? widthProps.style : undefined}\n {...divRest}\n >\n {dropdownNode}\n <span\n id={helperId}\n className={cn('stn-dropdown-field__helper', error && 'stn-dropdown-field__helper--error')}\n >\n {helperText}\n </span>\n </div>\n )\n}\n","import type { CSSProperties } from 'react'\n\nimport {\n resolveStnInputWidth,\n type StnInputWidthValue,\n} from '@stn-uiux/pub-ui/data/stnInputWidth'\n\nexport type { StnInputWidthPreset, StnInputWidthValue } from '@stn-uiux/pub-ui/data/stnInputWidth'\n\n/**\n * Dropdown / TextField 공통 width → className + style\n * @param _prefix `stn-dropdown` | `stn-text-field`\n */\nexport function resolveInputWidthProps(\n _prefix: 'stn-dropdown' | 'stn-text-field',\n fullWidth?: boolean,\n width?: StnInputWidthValue,\n): { className: string; style: CSSProperties | undefined } {\n const resolved = resolveStnInputWidth(fullWidth, width)\n\n if (resolved.kind === 'full') {\n return {\n className: 'full',\n style: undefined,\n }\n }\n\n if (resolved.kind === 'preset' && resolved.preset != null) {\n return {\n className: `w${resolved.preset}`,\n style: undefined,\n }\n }\n\n if (resolved.kind === 'custom' && resolved.styleWidth != null) {\n return {\n className: '',\n style: { width: resolved.styleWidth },\n }\n }\n\n return { className: '', style: undefined }\n}\n","import { StnDropdown, type StnDropdownOption, type StnDropdownProps } from './StnDropdown'\r\n\r\nexport type StnDropdownMenuProps = Omit<\r\n StnDropdownProps,\r\n 'size' | 'modifier'\r\n>\r\n\r\n/**\r\n * Pub 커스텀 메뉴 (`.stn-dropdown` + `.selected` + `.select_option`).\r\n * CCTV·simple_board 검색줄 — **52px prominent** (`stn-dropdown--prominent`).\r\n * 일반 sm/md/lg 스케일은 `StnDropdown` size prop 사용.\r\n */\r\nexport function StnDropdownMenu({\r\n className,\r\n ...rest\r\n}: StnDropdownMenuProps) {\r\n return (\r\n <StnDropdown\r\n size=\"xl\"\r\n className={className}\r\n {...rest}\r\n />\r\n )\r\n}\r\n\r\nexport type { StnDropdownOption }\r\n","import { forwardRef, useId, type InputHTMLAttributes, type ReactNode } from 'react'\n\nimport type { StnTextFieldSize } from '@stn-uiux/pub-ui/data/stnTextField'\n\nexport type { StnTextFieldSize }\nimport type { StnInputWidthValue } from '@stn-uiux/pub-ui/data/stnInputWidth'\n\nimport { cn } from '../cn'\nimport type { StnWithoutStyle } from '../stnStrictProps'\nimport { resolveInputWidthProps } from '../inputWidth'\nimport { StnIcon } from './StnIcon'\n\n\nexport type StnTextFieldVariant = 'outlined' | 'filled' | 'standard'\n\n/** 색 — 기본 primary. 토큰: --stn-feedback-* */\nexport type StnTextFieldColor = 'primary' | 'success' | 'error' | 'warning' | 'info' | 'secondary'\n\n/** 아이콘 위치 — left | right */\nexport type StnTextFieldIconPosition = 'left' | 'right'\n\n/** 라벨 위치 — left | right | top */\nexport type StnTextFieldLabelPosition = 'left' | 'right' | 'top'\n\nexport type StnTextFieldSizeProp = StnTextFieldSize | 's' | 'm' | 'l' | 'xl' | 'sm' | 'md' | 'lg'\n\nfunction normalizeSize(size?: StnTextFieldSizeProp): StnTextFieldSize {\n if (!size) return 'M'\n const u = String(size).toUpperCase()\n if (u === 'S' || u === 'SM') return 'S'\n if (u === 'L' || u === 'LG') return 'L'\n if (u === 'XL') return 'XL'\n return 'M'\n}\n\nfunction sizeClass(size?: StnTextFieldSizeProp): string {\n const s = normalizeSize(size)\n if (s === 'S') return 'sm'\n if (s === 'L') return 'lg'\n if (s === 'XL') return 'xl'\n return 'md'\n}\n\nfunction variantClass(variant: StnTextFieldVariant): string {\n if (variant === 'filled') return 'filled'\n if (variant === 'standard') return 'standard'\n return 'outlined'\n}\n\nfunction colorClass(color: StnTextFieldColor | undefined): string | undefined {\n if (!color || color === 'primary' || color === 'secondary') return undefined\n return color\n}\n\nfunction resolveGlyph(node: ReactNode): ReactNode {\n if (typeof node === 'string') return <StnIcon name={node} size={16} color=\"currentColor\" />\n return node\n}\n\nexport type StnTextFieldProps = StnWithoutStyle<Omit<InputHTMLAttributes<HTMLInputElement>, 'size' | 'color'>> & {\n size?: StnTextFieldSizeProp\n /** outlined = box · filled = fill · standard = underline */\n variant?: StnTextFieldVariant\n /** 피드백 색 — primary/secondary는 기본 테두리. success·error·warning·info = --stn-feedback-* */\n color?: StnTextFieldColor\n /** 오류 테두리 — `aria-invalid`도 함께 설정 */\n invalid?: boolean\n /** width 100% — `stn-text-field--full` */\n fullWidth?: boolean\n /** 프리셋 80·100·140·180·200 · `100%`/`full` · 그 외 px/string */\n width?: StnInputWidthValue\n /** 라벨 텍스트 또는 노드 */\n label?: ReactNode\n /** 라벨 위치 ('left' | 'right' | 'top') - 기본 'left' */\n labelPosition?: StnTextFieldLabelPosition\n /** 필수 입력 여부 (`*` 표시) */\n required?: boolean\n /** 왼쪽 아이콘 — Iconography slug (`line/user`) 또는 ReactNode. 로그인 등 고정 왼쪽 슬롯 */\n prefix?: ReactNode\n /** 오른쪽 아이콘 — slug 또는 ReactNode */\n suffix?: ReactNode\n /** 아이콘 — slug 또는 ReactNode. 위치는 iconPosition */\n icon?: ReactNode\n /** 아이콘 위치 · icon 지정 시 기본 left */\n iconPosition?: StnTextFieldIconPosition\n /** 필드 하단 왼쪽 캡션 */\n helperText?: ReactNode\n className?: string\n}\n\nexport const StnTextField = forwardRef<HTMLInputElement, StnTextFieldProps>(function StnTextField(\n {\n size = 'M',\n variant = 'outlined',\n color,\n invalid,\n fullWidth,\n width,\n label,\n labelPosition = 'left',\n required,\n prefix,\n suffix,\n icon,\n iconPosition,\n helperText,\n className,\n disabled,\n type = 'text',\n id: idProp,\n 'aria-invalid': ariaInvalid,\n 'aria-describedby': ariaDescribedBy,\n ...rest\n },\n ref,\n) {\n const autoId = useId()\n const id = idProp ?? autoId\n const resolvedIconPos = iconPosition ?? 'left'\n const leftFromIcon = icon != null && resolvedIconPos === 'left' ? icon : undefined\n const rightFromIcon = icon != null && resolvedIconPos === 'right' ? icon : undefined\n const leftNode = prefix ?? leftFromIcon\n const rightNode = suffix ?? rightFromIcon\n const hasLeft = leftNode != null && leftNode !== false\n const hasRight = rightNode != null && rightNode !== false\n const hasSlot = hasLeft || hasRight\n const hasLabel = label != null && label !== ''\n const hasHelper = helperText != null && helperText !== ''\n const hasWrap = hasLabel || hasHelper\n const helperId = hasHelper ? `${id}-helper` : undefined\n const describedBy = [ariaDescribedBy, helperId].filter(Boolean).join(' ') || undefined\n const widthProps = resolveInputWidthProps('stn-text-field', fullWidth, width)\n const fieldClass = cn(\n 'stn-text-field',\n variantClass(variant),\n sizeClass(size),\n colorClass(color),\n !hasWrap && widthProps.className,\n invalid && 'stn-text-field--invalid',\n Boolean(prefix) && 'stn-text-field--with-prefix',\n hasSlot && 'stn-text-field--with-icon',\n className,\n )\n\n const input = (\n <input\n ref={ref}\n id={id}\n type={type}\n disabled={disabled}\n required={required}\n aria-invalid={invalid ? true : ariaInvalid}\n aria-describedby={describedBy}\n className={hasSlot ? 'stn-text-field__control' : fieldClass}\n style={hasSlot || hasWrap ? undefined : widthProps.style}\n {...rest}\n />\n )\n\n const field = hasSlot ? (\n <div className={fieldClass} style={hasWrap ? undefined : widthProps.style}>\n {hasLeft ? (\n <span className=\"stn-text-field__prefix\" aria-hidden>\n <span className=\"stn-text-field__icon-box\">{resolveGlyph(leftNode)}</span>\n </span>\n ) : null}\n {input}\n {hasRight ? (\n <span className=\"stn-text-field__suffix\" aria-hidden>\n <span className=\"stn-text-field__icon-box\">{resolveGlyph(rightNode)}</span>\n </span>\n ) : null}\n </div>\n ) : (\n input\n )\n\n if (!hasWrap) return field\n\n const labelElement = hasLabel ? (\n <label htmlFor={id} className=\"stn-text-field__label\">\n <span className=\"stn-text-field__label-text\">{label}</span>\n {required && (\n <span className=\"stn-text-field__required\" aria-hidden=\"true\">\n *\n </span>\n )}\n </label>\n ) : null\n\n const isRow = labelPosition === 'left' || labelPosition === 'right'\n\n return (\n <div\n className={cn(\n 'stn-text-field-wrap',\n hasLabel && (isRow ? 'stn-text-field-wrap--row' : 'stn-text-field-wrap--col'),\n hasLabel && labelPosition === 'left' && 'stn-text-field-wrap--label-left',\n hasLabel && labelPosition === 'right' && 'stn-text-field-wrap--label-right',\n hasLabel && labelPosition === 'top' && 'stn-text-field-wrap--label-top',\n widthProps.className,\n )}\n style={widthProps.style}\n >\n {hasLabel && (labelPosition === 'left' || labelPosition === 'top') ? labelElement : null}\n <div className=\"stn-text-field-wrap__body\">\n {field}\n {hasHelper && (\n <p\n id={helperId}\n className={cn('stn-text-field__helper', invalid && 'stn-text-field__helper--error')}\n >\n {helperText}\n </p>\n )}\n </div>\n {hasLabel && labelPosition === 'right' ? labelElement : null}\n </div>\n )\n})\n","import { forwardRef, type ButtonHTMLAttributes, type CSSProperties } from 'react'\n\nimport {\n formatStnDateRangeFieldValue,\n type StnDateRangeFieldSize,\n} from '@stn-uiux/pub-ui/data/stnDateRangeField'\n\nexport type { StnDateRangeFieldSize }\n\nimport { cn } from '../cn'\n\n\nfunction normalizeSize(size: StnDateRangeFieldSize | 's' | 'm' | 'l' | 'sm' | 'md' | 'lg'): StnDateRangeFieldSize {\n const u = String(size).toUpperCase()\n if (u === 'S' || u === 'SM') return 'S'\n if (u === 'L' || u === 'LG') return 'L'\n return 'M'\n}\n\nfunction sizeClass(size: StnDateRangeFieldSize | 's' | 'm' | 'l' | 'sm' | 'md' | 'lg'): string {\n const s = normalizeSize(size)\n if (s === 'S') return 'sm'\n if (s === 'L') return 'lg'\n return 'md'\n}\n\nfunction resolveValue(value: Date | string | null | undefined, format: (date: Date) => string): string | null {\n if (value == null) return null\n if (value instanceof Date) return format(value)\n const trimmed = value.trim()\n return trimmed || null\n}\n\nexport type StnDateRangeFieldProps = Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'children' | 'value'> & {\n size?: StnDateRangeFieldSize | 's' | 'm' | 'l' | 'sm' | 'md' | 'lg'\n start?: Date | string | null\n end?: Date | string | null\n /** 표시 포맷 — 기본 `YYYY-MM-DD HH:mm:ss` */\n format?: (date: Date) => string\n startPlaceholder?: string\n endPlaceholder?: string\n invalid?: boolean\n fullWidth?: boolean\n width?: number | string\n className?: string\n}\n\nexport const StnDateRangeField = forwardRef<HTMLButtonElement, StnDateRangeFieldProps>(function StnDateRangeField(\n {\n size = 'M',\n start,\n end,\n format = formatStnDateRangeFieldValue,\n startPlaceholder = 'Start',\n endPlaceholder = 'End',\n invalid,\n fullWidth,\n width,\n className,\n style,\n disabled,\n type = 'button',\n 'aria-invalid': ariaInvalid,\n ...rest\n },\n ref,\n) {\n const startText = resolveValue(start, format)\n const endText = resolveValue(end, format)\n const isEmpty = !startText && !endText\n\n const resolvedStyle: CSSProperties | undefined =\n width !== undefined ? { ...style, width: typeof width === 'number' ? `${width}px` : width } : style\n\n return (\n <button\n ref={ref}\n type={type}\n disabled={disabled}\n aria-invalid={invalid ? true : ariaInvalid}\n className={cn(\n 'stn-date-range-field',\n sizeClass(size),\n fullWidth && 'stn-date-range-field--full w100p',\n invalid && 'stn-date-range-field--invalid',\n isEmpty && 'is-empty',\n className,\n )}\n style={resolvedStyle}\n {...rest}\n >\n <span className=\"stn-date-range-field__inner\">\n <span className=\"stn-date-range-field__text\">\n <span className={cn('stn-date-range-field__value', !startText && 'is-placeholder')}>\n {startText ?? startPlaceholder}\n </span>\n <span className=\"stn-date-range-field__sep\" aria-hidden=\"true\">\n ~\n </span>\n <span className={cn('stn-date-range-field__value', !endText && 'is-placeholder')}>\n {endText ?? endPlaceholder}\n </span>\n </span>\n <span className=\"stn-date-range-field__icon\" aria-hidden=\"true\" />\n </span>\n </button>\n )\n})\n","import type { HTMLAttributes, ReactNode } from 'react'\n\nimport { StnButton, type StnButtonProps } from '../../components/StnButton'\nimport { StnIcon } from '../../components/StnIcon'\nimport { cn } from '../../cn'\n\nexport type StnSearchRequirementBarProps = HTMLAttributes<HTMLDivElement> & {\n children?: ReactNode\n className?: string\n /**\n * 여백 밀도\n * - default: padding 8px 16px, gap 16px\n * - compact: padding 6px 12px, gap 12px\n */\n density?: 'default' | 'compact'\n}\n\n/**\n * 검색조건 바 — 직접 자식으로 Fields · SearchButton · Export(선택)를 둡니다.\n * Export는 `margin-left: auto`로 우측 정렬됩니다. Main/export 트레이 래퍼 없음.\n */\nexport function StnSearchRequirementBar({\n children,\n className,\n density = 'default',\n ...rest\n}: StnSearchRequirementBarProps) {\n return (\n <div\n className={cn(\n 'stn-search-requirement',\n density === 'compact' && 'stn-search-requirement--compact',\n className\n )}\n data-stn-search-requirement=\"root\"\n {...rest}\n >\n {children}\n </div>\n )\n}\n\nexport type StnSearchRequirementBarFieldsProps = HTMLAttributes<HTMLDivElement> & {\n children?: ReactNode\n className?: string\n}\n\nfunction StnSearchRequirementBarFields({ children, className, ...rest }: StnSearchRequirementBarFieldsProps) {\n return (\n <div className={cn('stn-search-requirement__fields', className)} data-stn-search-requirement=\"fields\" {...rest}>\n {children}\n </div>\n )\n}\n\nexport type StnSearchRequirementBarFieldProps = HTMLAttributes<HTMLDivElement> & {\n label: ReactNode\n children?: ReactNode\n className?: string\n labelClassName?: string\n controlClassName?: string\n}\n\nfunction StnSearchRequirementBarField({\n label,\n children,\n className,\n labelClassName,\n controlClassName,\n ...rest\n}: StnSearchRequirementBarFieldProps) {\n return (\n <div className={cn('stn-search-requirement__field', className)} data-stn-search-requirement=\"field\" {...rest}>\n <span className={cn('stn-search-requirement__label', labelClassName)}>{label}</span>\n <div className={cn('stn-search-requirement__control', controlClassName)}>{children}</div>\n </div>\n )\n}\n\nexport type StnSearchRequirementBarSearchButtonProps = StnButtonProps\n\nfunction StnSearchRequirementBarSearchButton({\n children = '검색',\n size = 'M',\n icon = <StnIcon name=\"line/search\" size={16} color=\"currentColor\" />,\n className,\n ...rest\n}: StnSearchRequirementBarSearchButtonProps) {\n return (\n <StnButton\n size={size}\n variant=\"contained\"\n icon={icon}\n className={className}\n data-stn-search-requirement=\"search\"\n {...rest}\n >\n {children}\n </StnButton>\n )\n}\n\nexport type StnSearchRequirementBarExportProps = Omit<StnButtonProps, 'children' | 'icon'> & {\n /** 기본 `line/file-analytics` (엑셀/다운로드) */\n name?: string\n icon?: StnButtonProps['icon']\n}\n\nfunction StnSearchRequirementBarExport({\n className,\n name = 'line/file-analytics',\n icon,\n variant = 'ghost',\n size = 'md',\n 'aria-label': ariaLabel = 'Excel보내기',\n ...rest\n}: StnSearchRequirementBarExportProps) {\n return (\n <StnButton\n icon={icon ?? <StnIcon name={name} size={24} color=\"currentColor\" />}\n variant={variant}\n size={size}\n aria-label={ariaLabel}\n className={className}\n data-stn-search-requirement=\"export\"\n {...rest}\n />\n )\n}\n\nexport type StnSearchRequirementBarDividerProps = HTMLAttributes<HTMLSpanElement> & {\n className?: string\n}\n\nfunction StnSearchRequirementBarDivider({ className, ...rest }: StnSearchRequirementBarDividerProps) {\n return (\n <span\n className={cn('stn-search-requirement__divider', className)}\n role=\"separator\"\n aria-orientation=\"vertical\"\n {...rest}\n />\n )\n}\n\nStnSearchRequirementBar.Fields = StnSearchRequirementBarFields\nStnSearchRequirementBar.Field = StnSearchRequirementBarField\nStnSearchRequirementBar.SearchButton = StnSearchRequirementBarSearchButton\nStnSearchRequirementBar.Export = StnSearchRequirementBarExport\nStnSearchRequirementBar.Divider = StnSearchRequirementBarDivider\n","import { STN_DATE_RANGE_FIELD_DEMO, parseStnDateRangeFieldValue } from '@stn-uiux/pub-ui/data/stnDateRangeField'\nimport { STN_SEARCH_REQUIREMENT_DEMO_FIELDS } from '@stn-uiux/pub-ui/data/stnSearchRequirement'\n\nimport { StnDropdown } from '../../components/StnDropdown'\nimport { StnTextField } from '../../components/StnTextField'\nimport { StnDateRangePickerField } from '../../components/datePicker/StnDateRangePickerField'\nimport { StnSearchRequirementBar } from './StnSearchRequirementBar'\n\nconst ALL_OPTIONS = [{ value: '', label: '전체' }]\n\nexport type StnSearchRequirementBarDemoProps = {\n onSearch?: () => void\n onExport?: () => void\n className?: string\n}\n\n/** Figma 40000042:186893 — 보고서 검색조건 기본 조합 */\nexport function StnSearchRequirementBarDemo({ onSearch, onExport, className }: StnSearchRequirementBarDemoProps) {\n const demo = STN_SEARCH_REQUIREMENT_DEMO_FIELDS\n\n return (\n <StnSearchRequirementBar className={className}>\n <StnSearchRequirementBar.Fields>\n <StnSearchRequirementBar.Field label={demo.reportTypeText.label}>\n <StnTextField\n size=\"M\"\n defaultValue={demo.reportTypeText.value}\n width={140}\n aria-label={demo.reportTypeText.label}\n />\n </StnSearchRequirementBar.Field>\n <StnSearchRequirementBar.Field label={demo.reportTypeSelect.label}>\n <StnDropdown\n size=\"md\"\n width={130}\n options={ALL_OPTIONS}\n defaultValue={demo.reportTypeSelect.value}\n aria-label={demo.reportTypeSelect.label}\n />\n </StnSearchRequirementBar.Field>\n <StnSearchRequirementBar.Field label={demo.periodType.label}>\n <StnDropdown\n size=\"md\"\n width={130}\n options={ALL_OPTIONS}\n defaultValue={demo.periodType.value}\n aria-label={demo.periodType.label}\n />\n </StnSearchRequirementBar.Field>\n <StnSearchRequirementBar.Field label={demo.period.label}>\n <StnDateRangePickerField\n size=\"M\"\n defaultValue={{\n start: parseStnDateRangeFieldValue(STN_DATE_RANGE_FIELD_DEMO.start),\n end: parseStnDateRangeFieldValue(STN_DATE_RANGE_FIELD_DEMO.end),\n }}\n showTime\n aria-label={demo.period.label}\n />\n </StnSearchRequirementBar.Field>\n </StnSearchRequirementBar.Fields>\n <StnSearchRequirementBar.SearchButton onClick={onSearch} />\n <StnSearchRequirementBar.Export onClick={onExport} />\n </StnSearchRequirementBar>\n )\n}\n","import {\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n type CSSProperties,\n} from 'react'\nimport { createPortal } from 'react-dom'\n\nimport type { StnDateRange } from '@stn-uiux/pub-ui/data/stnDatePicker'\nimport { formatStnDateRangeFieldValue } from '@stn-uiux/pub-ui/data/stnDateRangeField'\n\nimport { StnDateRangeField, type StnDateRangeFieldProps } from '../StnDateRangeField'\nimport { cn } from '../../cn'\nimport { StnDateRangePicker } from './StnDateRangePicker'\n\nfunction useControllableRange(\n controlled: StnDateRange | undefined,\n defaultValue: StnDateRange,\n onChange?: (value: StnDateRange) => void,\n) {\n const [internal, setInternal] = useState(defaultValue)\n const value = controlled ?? internal\n\n const setValue = useCallback(\n (next: StnDateRange) => {\n if (controlled === undefined) setInternal(next)\n onChange?.(next)\n },\n [controlled, onChange],\n )\n\n return [value, setValue] as const\n}\n\nexport type StnDateRangePickerFieldProps = Omit<\n StnDateRangeFieldProps,\n 'start' | 'end' | 'onClick' | 'defaultValue' | 'value' | 'onChange'\n> & {\n value?: StnDateRange\n defaultValue?: StnDateRange\n onChange?: (value: StnDateRange) => void\n showTime?: boolean\n format?: (date: Date) => string\n pickerClassName?: string\n pickerStyle?: CSSProperties\n}\n\nconst EMPTY_RANGE: StnDateRange = { start: null, end: null }\n\nexport function StnDateRangePickerField({\n value: valueProp,\n defaultValue = EMPTY_RANGE,\n onChange,\n showTime = true,\n format = formatStnDateRangeFieldValue,\n className,\n pickerClassName,\n pickerStyle,\n disabled,\n ...fieldProps\n}: StnDateRangePickerFieldProps) {\n const [value, setValue] = useControllableRange(valueProp, defaultValue, onChange)\n const [open, setOpen] = useState(false)\n const [anchorRect, setAnchorRect] = useState<DOMRect | null>(null)\n const rootRef = useRef<HTMLDivElement>(null)\n const triggerRef = useRef<HTMLButtonElement>(null)\n const panelRef = useRef<HTMLDivElement>(null)\n\n const updateAnchor = useCallback(() => {\n setAnchorRect(triggerRef.current?.getBoundingClientRect() ?? null)\n }, [])\n\n useLayoutEffect(() => {\n if (!open) return\n updateAnchor()\n const onReflow = () => updateAnchor()\n window.addEventListener('resize', onReflow)\n window.addEventListener('scroll', onReflow, true)\n return () => {\n window.removeEventListener('resize', onReflow)\n window.removeEventListener('scroll', onReflow, true)\n }\n }, [open, updateAnchor])\n\n useEffect(() => {\n if (!open) return\n const onDocMouseDown = (event: MouseEvent) => {\n const target = event.target as Node\n if (rootRef.current?.contains(target)) return\n if (panelRef.current?.contains(target)) return\n setOpen(false)\n }\n document.addEventListener('mousedown', onDocMouseDown)\n return () => document.removeEventListener('mousedown', onDocMouseDown)\n }, [open])\n\n useEffect(() => {\n if (!open) return\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') setOpen(false)\n }\n document.addEventListener('keydown', onKeyDown)\n return () => document.removeEventListener('keydown', onKeyDown)\n }, [open])\n\n return (\n <div ref={rootRef} className={cn('stn-date-picker-field', className)}>\n <StnDateRangeField\n ref={triggerRef}\n {...fieldProps}\n disabled={disabled}\n start={value.start}\n end={value.end}\n format={format}\n aria-expanded={open}\n aria-haspopup=\"dialog\"\n onClick={(event) => {\n if (disabled) return\n event.preventDefault()\n updateAnchor()\n setOpen((prev) => !prev)\n }}\n />\n {open && typeof document !== 'undefined'\n ? createPortal(\n <div ref={panelRef}>\n <StnDateRangePicker\n open\n value={value}\n showTime={showTime}\n anchorRect={anchorRect}\n className={pickerClassName}\n style={pickerStyle}\n onApply={setValue}\n onClose={() => setOpen(false)}\n />\n </div>,\n document.body,\n )\n : null}\n </div>\n )\n}\n","import { useCallback, useEffect, useId, useMemo, useState, type CSSProperties } from 'react'\n\nimport {\n STN_DATE_PICKER_WEEKDAYS,\n type StnDateRange,\n} from '@stn-uiux/pub-ui/data/stnDatePicker'\n\nimport { StnButton } from '../StnButton'\nimport { cn } from '../../cn'\nimport {\n addMonths,\n buildMonthGrid,\n cloneDate,\n formatMonthTitle,\n isBetweenDays,\n isSameDay,\n normalizeRange,\n setTimePart,\n startOfMonth,\n} from './stnCalendarUtils'\n\nexport type StnDateRangePickerProps = {\n open: boolean\n value: StnDateRange\n onChange?: (value: StnDateRange) => void\n onApply?: (value: StnDateRange) => void\n onClose?: () => void\n showTime?: boolean\n className?: string\n style?: CSSProperties\n /** portal positioning — `StnDateRangePickerField`가 전달 */\n anchorRect?: DOMRect | null\n}\n\nfunction useDraftRange(value: StnDateRange, open: boolean) {\n const [draft, setDraft] = useState(value)\n\n useEffect(() => {\n if (open) setDraft(value)\n }, [open, value])\n\n return [draft, setDraft] as const\n}\n\ntype CalendarPanelProps = {\n month: Date\n range: StnDateRange\n onPick: (day: Date) => void\n onPrev: () => void\n onNext: () => void\n showPrev?: boolean\n showNext?: boolean\n}\n\nfunction CalendarPanel({ month, range, onPick, onPrev, onNext, showPrev = true, showNext = true }: CalendarPanelProps) {\n const days = useMemo(() => buildMonthGrid(month), [month])\n const { start, end } = range\n\n return (\n <div className=\"stn-date-picker-panel\">\n <div className=\"stn-date-picker-panel__header\">\n {showPrev ? (\n <button type=\"button\" className=\"stn-date-picker-panel__nav\" onClick={onPrev} aria-label=\"Previous month\">\n ‹\n </button>\n ) : (\n <span className=\"stn-date-picker-panel__nav\" aria-hidden=\"true\" />\n )}\n <p className=\"stn-date-picker-panel__title\">{formatMonthTitle(month)}</p>\n {showNext ? (\n <button type=\"button\" className=\"stn-date-picker-panel__nav\" onClick={onNext} aria-label=\"Next month\">\n ›\n </button>\n ) : (\n <span className=\"stn-date-picker-panel__nav\" aria-hidden=\"true\" />\n )}\n </div>\n <table className=\"stn-date-picker-content\">\n <thead>\n <tr>\n {STN_DATE_PICKER_WEEKDAYS.map((label) => (\n <th key={label} scope=\"col\">\n {label}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {Array.from({ length: 6 }, (_, row) => (\n <tr key={row}>\n {days.slice(row * 7, row * 7 + 7).map((cell) => {\n const inRange = start && end && isBetweenDays(cell.date, start, end)\n const isStart = start ? isSameDay(cell.date, start) : false\n const isEnd = end ? isSameDay(cell.date, end) : false\n\n return (\n <td\n key={cell.date.toISOString()}\n className={cn(\n 'stn-date-picker-cell',\n !cell.inMonth && 'stn-date-picker-cell--outside',\n inRange && 'stn-date-picker-cell--in-range',\n isStart && 'stn-date-picker-cell--range-start',\n isEnd && 'stn-date-picker-cell--range-end',\n )}\n >\n <button\n type=\"button\"\n className=\"stn-date-picker-cell__btn\"\n onClick={() => onPick(cell.date)}\n >\n {cell.date.getDate()}\n </button>\n </td>\n )\n })}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )\n}\n\ntype TimeColumnsProps = {\n label: string\n value: Date | null\n onChange: (next: Date) => void\n}\n\nfunction TimeColumns({ label, value, onChange }: TimeColumnsProps) {\n const hours = value?.getHours() ?? 0\n const minutes = value?.getMinutes() ?? 0\n const seconds = value?.getSeconds() ?? 0\n const base = value ?? new Date()\n\n const patch = (h: number, m: number, s: number) => onChange(setTimePart(base, h, m, s))\n\n return (\n <div className=\"stn-date-picker-time__side\">\n <span className=\"stn-date-picker-time__label\">{label}</span>\n <div className=\"stn-date-picker-time__columns\">\n <ul className=\"stn-date-picker-time__column\" aria-label={`${label} hour`}>\n {Array.from({ length: 24 }, (_, h) => (\n <li key={h}>\n <button\n type=\"button\"\n className={cn('stn-date-picker-time__option', h === hours && 'is-selected')}\n onClick={() => patch(h, minutes, seconds)}\n >\n {String(h).padStart(2, '0')}\n </button>\n </li>\n ))}\n </ul>\n <ul className=\"stn-date-picker-time__column\" aria-label={`${label} minute`}>\n {Array.from({ length: 60 }, (_, m) => (\n <li key={m}>\n <button\n type=\"button\"\n className={cn('stn-date-picker-time__option', m === minutes && 'is-selected')}\n onClick={() => patch(hours, m, seconds)}\n >\n {String(m).padStart(2, '0')}\n </button>\n </li>\n ))}\n </ul>\n <ul className=\"stn-date-picker-time__column\" aria-label={`${label} second`}>\n {Array.from({ length: 60 }, (_, s) => (\n <li key={s}>\n <button\n type=\"button\"\n className={cn('stn-date-picker-time__option', s === seconds && 'is-selected')}\n onClick={() => patch(hours, minutes, s)}\n >\n {String(s).padStart(2, '0')}\n </button>\n </li>\n ))}\n </ul>\n </div>\n </div>\n )\n}\n\nexport function StnDateRangePicker({\n open,\n value,\n onChange,\n onApply,\n onClose,\n showTime = true,\n className,\n style,\n anchorRect,\n}: StnDateRangePickerProps) {\n const titleId = useId()\n const [draft, setDraft] = useDraftRange(value, open)\n const [leftMonth, setLeftMonth] = useState(() => startOfMonth(draft.start ?? draft.end ?? new Date()))\n\n useEffect(() => {\n if (!open) return\n const anchor = draft.start ?? draft.end ?? new Date()\n setLeftMonth(startOfMonth(anchor))\n }, [open, draft.start, draft.end])\n\n const rightMonth = useMemo(() => addMonths(leftMonth, 1), [leftMonth])\n\n const updateDraft = useCallback(\n (next: StnDateRange) => {\n setDraft(next)\n onChange?.(next)\n },\n [onChange],\n )\n\n const pickDay = useCallback(\n (day: Date) => {\n const nextStart = cloneDate(day)\n if (!showTime) {\n nextStart.setHours(0, 0, 0, 0)\n } else if (draft.start) {\n nextStart.setHours(draft.start.getHours(), draft.start.getMinutes(), draft.start.getSeconds(), 0)\n }\n\n if (!draft.start || (draft.start && draft.end)) {\n updateDraft({ start: nextStart, end: null })\n return\n }\n\n const nextEnd = cloneDate(day)\n if (!showTime) {\n nextEnd.setHours(23, 59, 59, 0)\n } else {\n nextEnd.setHours(\n draft.end?.getHours() ?? 23,\n draft.end?.getMinutes() ?? 59,\n draft.end?.getSeconds() ?? 59,\n 0,\n )\n }\n updateDraft(normalizeRange(draft.start, nextEnd))\n },\n [draft.end, draft.start, showTime, updateDraft],\n )\n\n const handleApply = () => {\n const next = normalizeRange(draft.start, draft.end)\n onApply?.(next)\n onClose?.()\n }\n\n if (!open) return null\n\n const positionStyle: CSSProperties = anchorRect\n ? {\n top: anchorRect.bottom + 4,\n left: anchorRect.left,\n ...style,\n }\n : style ?? {}\n\n return (\n <div\n className={cn('stn-date-picker-dropdown', className)}\n style={positionStyle}\n role=\"dialog\"\n aria-modal=\"false\"\n aria-labelledby={titleId}\n >\n <div className=\"stn-date-picker-dropdown__body\">\n <span id={titleId} className=\"stn-sf__visually-hidden\">\n Date range picker\n </span>\n <div className=\"stn-date-picker-dropdown__panels\">\n <CalendarPanel\n month={leftMonth}\n range={draft}\n onPick={pickDay}\n onPrev={() => setLeftMonth((m) => addMonths(m, -1))}\n onNext={() => setLeftMonth((m) => addMonths(m, 1))}\n showNext={false}\n />\n <CalendarPanel\n month={rightMonth}\n range={draft}\n onPick={pickDay}\n onPrev={() => setLeftMonth((m) => addMonths(m, -1))}\n onNext={() => setLeftMonth((m) => addMonths(m, 1))}\n showPrev={false}\n />\n </div>\n {showTime ? (\n <div className=\"stn-date-picker-time\">\n <TimeColumns\n label=\"시작\"\n value={draft.start}\n onChange={(start) => updateDraft({ ...draft, start })}\n />\n <TimeColumns\n label=\"종료\"\n value={draft.end}\n onChange={(end) => updateDraft({ ...draft, end })}\n />\n </div>\n ) : null}\n <div className=\"stn-date-picker-footer\">\n <StnButton size=\"M\" variant=\"contained\" onClick={handleApply} disabled={!draft.start || !draft.end}>\n 확인\n </StnButton>\n </div>\n </div>\n </div>\n )\n}\n","export function cloneDate(date: Date): Date {\n return new Date(date.getTime())\n}\n\nexport function startOfDay(date: Date): Date {\n const next = cloneDate(date)\n next.setHours(0, 0, 0, 0)\n return next\n}\n\nexport function startOfMonth(date: Date): Date {\n return new Date(date.getFullYear(), date.getMonth(), 1)\n}\n\nexport function addMonths(date: Date, count: number): Date {\n return new Date(date.getFullYear(), date.getMonth() + count, 1)\n}\n\nexport function isSameDay(a: Date, b: Date): boolean {\n return (\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate()\n )\n}\n\nexport function isBetweenDays(day: Date, start: Date, end: Date): boolean {\n const value = startOfDay(day).getTime()\n const from = startOfDay(start).getTime()\n const to = startOfDay(end).getTime()\n const min = Math.min(from, to)\n const max = Math.max(from, to)\n return value >= min && value <= max\n}\n\nexport function setTimePart(date: Date, hours: number, minutes: number, seconds: number): Date {\n const next = cloneDate(date)\n next.setHours(hours, minutes, seconds, 0)\n return next\n}\n\nexport type StnCalendarDayCell = {\n date: Date\n inMonth: boolean\n}\n\nexport function buildMonthGrid(monthAnchor: Date): StnCalendarDayCell[] {\n const first = startOfMonth(monthAnchor)\n const startOffset = first.getDay()\n const gridStart = new Date(first)\n gridStart.setDate(first.getDate() - startOffset)\n\n return Array.from({ length: 42 }, (_, index) => {\n const date = new Date(gridStart)\n date.setDate(gridStart.getDate() + index)\n return {\n date,\n inMonth: date.getMonth() === monthAnchor.getMonth(),\n }\n })\n}\n\nexport function formatMonthTitle(date: Date): string {\n return `${date.getFullYear()}년 ${date.getMonth() + 1}월`\n}\n\nexport function normalizeRange(start: Date | null, end: Date | null): { start: Date | null; end: Date | null } {\n if (!start || !end) return { start, end }\n if (start.getTime() <= end.getTime()) return { start, end }\n return { start: end, end: start }\n}\n","import type { CSSProperties, HTMLAttributes, ReactNode } from 'react'\n\nimport type {\n StnHeaderGap,\n StnHeaderPadding,\n StnHeaderVariant,\n} from '@stn-uiux/pub-ui/data/stnHeader'\n\nimport { cn } from '../../cn'\n\n\nexport type StnHeaderProps = HTMLAttributes<HTMLElement> & {\n /**\n * @deprecated Header는 Left, Center, Right 슬롯 구성에 따라 레이아웃이 자동 결정되므로 variant 지정이 필요하지 않습니다. 하위 호환성을 위해 유지됩니다.\n */\n variant?: StnHeaderVariant\n padding?: StnHeaderPadding | number | string\n gap?: StnHeaderGap | number | string\n children?: ReactNode\n className?: string\n style?: CSSProperties\n}\n\nfunction variantClass(variant?: StnHeaderVariant): string | undefined {\n if (variant === 'page') return 'stn-header--page'\n return undefined\n}\n\nexport function StnHeader({\n variant,\n padding,\n gap,\n children,\n className,\n style,\n ...rest\n}: StnHeaderProps) {\n const isNamedPadding = typeof padding === 'string' && ['none', 'sm', 'md', 'lg'].includes(padding)\n const isNamedGap = typeof gap === 'string' && ['none', 'sm', 'md', 'lg'].includes(gap)\n\n const dynamicStyles: Record<string, string | number> = {}\n\n if (padding !== undefined && !isNamedPadding) {\n dynamicStyles['--stn-header-padding-x'] =\n typeof padding === 'number' ? `${padding}px` : padding\n }\n\n if (gap !== undefined && !isNamedGap) {\n dynamicStyles['--stn-header-gap'] =\n typeof gap === 'number' ? `${gap}px` : gap\n }\n\n const combinedStyle: CSSProperties = {\n ...dynamicStyles,\n ...style,\n }\n\n return (\n <header\n className={cn(\n 'stn-header',\n variantClass(variant),\n isNamedPadding ? `padding-${padding}` : undefined,\n isNamedGap ? `gap-${gap}` : undefined,\n className,\n )}\n data-stn-header={variant}\n style={Object.keys(combinedStyle).length > 0 ? combinedStyle : undefined}\n {...rest}\n >\n {children}\n </header>\n )\n}\n\nexport type StnHeaderRegionProps = HTMLAttributes<HTMLDivElement> & {\n children?: ReactNode\n className?: string\n}\n\nfunction StnHeaderLeft({ children, className, ...rest }: StnHeaderRegionProps) {\n return (\n <div className={cn('stn-header__left', className)} data-stn-header-region=\"left\" {...rest}>\n {children}\n </div>\n )\n}\n\nfunction StnHeaderCenter({ children, className, ...rest }: StnHeaderRegionProps) {\n return (\n <div className={cn('stn-header__center', className)} data-stn-header-region=\"center\" {...rest}>\n {children}\n </div>\n )\n}\n\nfunction StnHeaderRight({ children, className, ...rest }: StnHeaderRegionProps) {\n return (\n <div className={cn('stn-header__right', className)} data-stn-header-region=\"right\" {...rest}>\n {children}\n </div>\n )\n}\n\nexport type StnHeaderTitleGroupProps = HTMLAttributes<HTMLDivElement> & {\n children?: ReactNode\n className?: string\n}\n\nexport function StnHeaderTitleGroup({ children, className, ...rest }: StnHeaderTitleGroupProps) {\n return (\n <div className={cn('stn-header__title-group', className)} {...rest}>\n {children}\n </div>\n )\n}\n\nStnHeader.Left = StnHeaderLeft\nStnHeader.Center = StnHeaderCenter\nStnHeader.Right = StnHeaderRight\nStnHeader.TitleGroup = StnHeaderTitleGroup\n\nexport type StnHeaderPageTitleProps = HTMLAttributes<HTMLHeadingElement> & {\n children: ReactNode\n className?: string\n}\n\nexport function StnHeaderPageTitle({ children, className, title, ...rest }: StnHeaderPageTitleProps) {\n const autoTitle = typeof children === 'string' ? children : undefined\n return (\n <h1\n className={cn('stn-header__page-title', className)}\n title={title ?? autoTitle}\n {...rest}\n >\n {children}\n </h1>\n )\n}\n\nexport function StnHeaderSubTitle({ children, className, title, ...rest }: StnHeaderPageTitleProps) {\n const autoTitle = typeof children === 'string' ? children : undefined\n return (\n <span\n className={cn('stn-header__subtitle', className)}\n title={title ?? autoTitle}\n {...rest}\n >\n {children}\n </span>\n )\n}\n\nexport function StnHeaderContextTitle({ children, className, title, ...rest }: StnHeaderPageTitleProps) {\n const autoTitle = typeof children === 'string' ? children : undefined\n return (\n <span\n className={cn('stn-header__context-title', className)}\n title={title ?? autoTitle}\n {...rest}\n >\n {children}\n </span>\n )\n}\n\nexport type StnHeaderToolbarProps = HTMLAttributes<HTMLDivElement> & {\n children?: ReactNode\n className?: string\n}\n\nexport function StnHeaderToolbar({ children, className, ...rest }: StnHeaderToolbarProps) {\n return (\n <div className={cn('stn-header-toolbar', className)} data-stn-header-toolbar {...rest}>\n {children}\n </div>\n )\n}\n\nexport {\n StnSystemChip,\n type StnSystemChipItem,\n type StnSystemChipTone,\n type StnSystemChipProps,\n} from '../../components/StnSystemChip'\n","import type { CSSProperties, HTMLAttributes } from 'react'\n\nimport {\n STN_LAYER0_BACKGROUND_DEMO_IMAGES,\n STN_LAYER0_MAP_LIGHT_OVERLAY,\n type StnLayer0BackgroundKind,\n type StnLayer0BackgroundPreset,\n} from '@stn-uiux/pub-ui/data/stnLayer0Background'\n\nimport { cn } from '../../cn'\n\n/** 단색 L0 — 지금은 default만. 장면이 생기면 타입을 추가합니다. */\nexport type StnLayer0BackgroundColor = 'default'\n\nexport type StnLayer0BackgroundProps = Omit<HTMLAttributes<HTMLDivElement>, 'children'> & {\n /** 디자인 시스템 사전 정의 프리셋 ('dashboard' | 'login' | 'map-light' | 'showroom-a' | 'showroom-b' | 'none') */\n variant?: StnLayer0BackgroundPreset\n /** 채움 방식. 기본 color. `src`가 있으면 image로 봅니다. */\n kind?: StnLayer0BackgroundKind\n /** 단색 named look. 기본 default (`--stn-elevation-surface-0`) */\n color?: StnLayer0BackgroundColor\n /** 이미지 배경 — light(또는 단일) URL. 있으면 단색이 아닙니다. */\n src?: string\n /** image kind — dark 전용 이미지 (있으면 테마에 따라 전환) */\n srcDark?: string\n /** image kind — 흰색 오버레이 0~1 (Figma map-light light: 0.2) · 다크에서는 숨김 */\n overlay?: number\n /** image kind — dark 전용 radial vignette (Figma showroom-b dark) */\n overlayDarkRadial?: boolean\n /** image kind — 장식 이미지 대체 텍스트 (빈 문자열이면 aria-hidden) */\n alt?: string\n className?: string\n}\n\nfunction overlayStyle(overlay?: number): CSSProperties | undefined {\n if (overlay == null || overlay <= 0) return undefined\n const pct = `${Math.min(100, Math.max(0, overlay * 100))}%`\n return { '--stn-layer0-overlay-opacity': pct } as CSSProperties\n}\n\n/**\n * Layer 0 page background — 프리셋은 `variant`, 단색은 `color`, 임의 URL은 `src`.\n * `src` + `srcDark` 를 같이 주면 `data-theme` 에 맞춰 전환합니다.\n */\nexport function StnLayer0Background({\n variant,\n kind: kindProp,\n color = 'default',\n src: srcProp,\n srcDark: srcDarkProp,\n overlay: overlayProp,\n overlayDarkRadial: overlayDarkRadialProp,\n alt = '',\n className,\n style,\n ...rest\n}: StnLayer0BackgroundProps) {\n let src = srcProp\n let srcDark = srcDarkProp\n let overlay = overlayProp\n let overlayDarkRadial = overlayDarkRadialProp\n let isPresetImage = false\n\n if (variant && variant !== 'none' && (variant as string) !== 'color') {\n isPresetImage = true\n if (variant === 'dashboard') {\n src = src ?? STN_LAYER0_BACKGROUND_DEMO_IMAGES.dashboard\n srcDark = srcDark ?? STN_LAYER0_BACKGROUND_DEMO_IMAGES.dashboardDark\n } else if (variant === 'showroom-a') {\n src = src ?? STN_LAYER0_BACKGROUND_DEMO_IMAGES.showroomA\n srcDark = srcDark ?? STN_LAYER0_BACKGROUND_DEMO_IMAGES.showroomADark\n } else if (variant === 'showroom-b') {\n src = src ?? STN_LAYER0_BACKGROUND_DEMO_IMAGES.showroomB\n srcDark = srcDark ?? STN_LAYER0_BACKGROUND_DEMO_IMAGES.showroomBDark\n overlayDarkRadial = overlayDarkRadial ?? true\n } else if (variant === 'login') {\n src = src ?? STN_LAYER0_BACKGROUND_DEMO_IMAGES.login\n srcDark = srcDark ?? STN_LAYER0_BACKGROUND_DEMO_IMAGES.loginDark\n } else if (variant === 'map-light') {\n src = src ?? STN_LAYER0_BACKGROUND_DEMO_IMAGES.mapLight\n srcDark = srcDark ?? STN_LAYER0_BACKGROUND_DEMO_IMAGES.mapDark\n overlay = overlay ?? STN_LAYER0_MAP_LIGHT_OVERLAY\n }\n }\n\n const kind = kindProp ?? (isPresetImage ? 'image' : undefined)\n const isImage = kind === 'image' || Boolean(src || srcDark)\n if (isImage) {\n const paired = Boolean(src && srcDark)\n return (\n <div\n className={cn('stn-layer0-bg', 'image', className)}\n aria-hidden={alt === '' ? true : undefined}\n style={{ ...overlayStyle(overlay), ...style }}\n {...rest}\n >\n <div className=\"stn-layer0-bg__media\">\n {src ? (\n <img\n className={cn('stn-layer0-bg__img', paired && 'light')}\n src={src}\n alt={alt}\n decoding=\"async\"\n />\n ) : null}\n {srcDark ? (\n <img\n className={cn('stn-layer0-bg__img', paired ? 'dark' : undefined)}\n src={srcDark}\n alt={alt}\n decoding=\"async\"\n />\n ) : null}\n {overlay != null && overlay > 0 ? (\n <div className=\"stn-layer0-bg__overlay\" aria-hidden=\"true\" />\n ) : null}\n {overlayDarkRadial ? (\n <div className=\"stn-layer0-bg__overlay radial\" aria-hidden=\"true\" />\n ) : null}\n </div>\n </div>\n )\n }\n\n return (\n <div\n className={cn('stn-layer0-bg', 'color', color, className)}\n aria-hidden=\"true\"\n style={style}\n {...rest}\n />\n )\n}\n","import {\n Children,\n Fragment,\n cloneElement,\n isValidElement,\n type ButtonHTMLAttributes,\n type CSSProperties,\n type HTMLAttributes,\n type ReactElement,\n type ReactNode,\n} from 'react'\n\nimport {\n normalizeStnWidgetAppearance,\n resolveStnWidgetBackground,\n type StnWidgetAppearance,\n type StnWidgetBackgroundMode,\n type StnWidgetShell,\n} from '@stn-uiux/pub-ui/data/stnWidget'\n\nimport type { StnWidgetGradeRowGrade } from '@stn-uiux/pub-ui/data/stnWidget'\n\nimport { cn } from '../cn'\nimport { StnButton } from './StnButton'\nimport { StnEventBanner, type StnEventBannerSeverity } from './StnEventBanner'\nimport { StnIcon } from './StnIcon'\nimport { StnIconBox, type StnIconBoxProps } from './StnIconBox'\nimport { StnLoadingSkeleton } from '../patterns/scaffold/StnLoadingSkeleton'\nimport { StnTopologyRing, StnTopologyGraph } from './topology'\n\nexport type { StnWidgetAppearance, StnWidgetShell, StnWidgetGradeRowGrade }\n\nexport type StnWidgetBackground = boolean | StnWidgetBackgroundMode\n\nconst SHELL_PUB_CLASS: Record<StnWidgetShell, string> = {\n card: '',\n 'fault-panel': '',\n board: 'widgetboard',\n 'board-item': 'widget_item',\n canvas: 'shell-canvas',\n}\n\nexport type StnWidgetStatus = 'default' | 'critical' | 'major' | 'minor' | 'warning'\nexport type StnWidgetPadding = 'default' | 'compact' | 'none'\n\nexport type StnWidgetProps = Omit<HTMLAttributes<HTMLDivElement>, 'className' | 'title'> & {\n className?: string\n /** Pub 위젯 셸 — card | fault-panel | board | board-item | canvas (맵/토폴로지 마운트 셸) */\n shell?: StnWidgetShell\n /** 위젯 variant 별칭 (shell과 동일: canvas 등 지정 가능) */\n variant?: StnWidgetShell\n /**\n * Figma Widget Container 186:114582 — 설정 시 `background` 대신 appearance 면·그림자 사용\n */\n appearance?: StnWidgetAppearance\n /**\n * 배경 · L1 elevation (`appearance` 미설정 시)\n * - true | 'surface' — surface-widget + shadow\n * - false | 'none' — Pub `none-bg`\n */\n background?: StnWidgetBackground\n /** 위젯 관제/장애 상태 — 'critical' 시 2px 레드 보더 및 네온 글로우 */\n status?: StnWidgetStatus\n /** 심각 장애 상태 편의 플래그 (.critical) */\n isCritical?: boolean\n /** 위젯 종류 id (sample PNG 파일명 · data-stn-widget-kind) */\n kind?: string\n title?: ReactNode\n /** 타이틀 우측에 붙는 뱃지 슬롯 (예: <StnSeverityBadge />) */\n badge?: ReactNode\n titleActions?: ReactNode\n /** Figma 헤더 — 차트 아이콘 (appearance 설정 시 기본 true) */\n showHeaderIcon?: boolean\n /** Iconography slug — `line/chart-histogram` 등 (`headerIcon` 미지정 시) */\n headerIconName?: string\n headerIcon?: ReactNode\n /** Figma 헤더 — 우측 슬롯: plain text (`periodLabel`) 또는 `periodActions` / `PeriodSelect` · `PeriodPager` */\n periodLabel?: ReactNode\n periodActions?: ReactNode\n /** card 셸 본문 — ds-widget-item__con */\n contentClassName?: string\n /** 내부 여백 모드 — 기본(12px), compact(8px), none(0px) */\n padding?: StnWidgetPadding\n /** padding: 0 (Pub none-bg 차트 위젯) */\n noPadding?: boolean\n /** 로딩 상태 여부 */\n loading?: boolean\n /** 빈 상태 여부 */\n empty?: boolean\n /** 빈 상태 안내 문구 */\n emptyMessage?: ReactNode\n /** 하단 푸터 슬롯 */\n footer?: ReactNode\n /**\n * 카드 바깥에 붙는 플로팅 슬롯. `StnEventBanner`면 `status`와 같은 위험도로 맞춥니다.\n */\n banner?: ReactNode\n /** hover 애니메이션 및 인터랙션 유무 */\n interactive?: boolean\n /** 문서용 hover 상태 고정 (appearance map · translucent) */\n docHover?: boolean\n /** 너비 100% 채움 여부 (기본: true) */\n fullWidth?: boolean\n /** 높이 100% 채움 여부 (기본: true) */\n fullHeight?: boolean\n /** 헤더 우측 컨트롤이 많을 때 아랫줄로 개행(2행 구조) 허용 여부 (기본: false, 1줄 말줄임) */\n wrapActions?: boolean\n children?: ReactNode\n}\n\n/** appearance는 셸 면만 변경 — 헤더 IconBox 기본 sm */\nfunction defaultHeaderIconName(_appearance?: StnWidgetAppearance): string {\n return 'line/chart-histogram'\n}\n\nfunction bannerSeverityFromStatus(status: StnWidgetStatus, isCritical: boolean): StnEventBannerSeverity | undefined {\n if (isCritical || status === 'critical') return 'critical'\n if (status === 'major') return 'major'\n if (status === 'minor') return 'minor'\n if (status === 'warning') return 'warning'\n return undefined\n}\n\nfunction withBannerSeverity(banner: ReactNode, severity: StnEventBannerSeverity | undefined) {\n if (!severity || !isValidElement(banner) || banner.type !== StnEventBanner) return banner\n return cloneElement(banner as ReactElement<{ severity?: StnEventBannerSeverity }>, { severity })\n}\n\ntype StnWidgetSlotName = 'header' | 'body' | 'footer'\n\nfunction markWidgetSlot<T extends (...args: never[]) => ReactNode>(component: T, slot: StnWidgetSlotName): T {\n ;(component as T & { __stnWidgetSlot?: StnWidgetSlotName }).__stnWidgetSlot = slot\n return component\n}\n\nfunction readWidgetSlot(type: unknown): StnWidgetSlotName | null {\n if (type == null || (typeof type !== 'function' && typeof type !== 'object')) return null\n const slot = (type as { __stnWidgetSlot?: string }).__stnWidgetSlot\n return slot === 'header' || slot === 'body' || slot === 'footer' ? slot : null\n}\n\nfunction flattenWidgetChildren(children: ReactNode): ReactNode[] {\n const out: ReactNode[] = []\n Children.forEach(children, (child) => {\n if (isValidElement(child) && child.type === Fragment) {\n const fragmentProps = child.props as { children?: ReactNode }\n out.push(...flattenWidgetChildren(fragmentProps.children))\n return\n }\n out.push(child)\n })\n return out\n}\n\ntype WidgetSlotElement = ReactElement<{ className?: string; style?: CSSProperties; children?: ReactNode }>\n\ntype WidgetChildSlots = {\n headers: WidgetSlotElement[]\n bodies: WidgetSlotElement[]\n footers: WidgetSlotElement[]\n rest: ReactNode[]\n}\n\nfunction partitionWidgetChildren(children: ReactNode): WidgetChildSlots {\n const slots: WidgetChildSlots = { headers: [], bodies: [], footers: [], rest: [] }\n for (const child of flattenWidgetChildren(children)) {\n if (child == null || child === false || child === true) continue\n if (isValidElement(child)) {\n const slot = readWidgetSlot(child.type)\n if (slot === 'header') {\n slots.headers.push(child as WidgetSlotElement)\n continue\n }\n if (slot === 'body') {\n slots.bodies.push(child as WidgetSlotElement)\n continue\n }\n if (slot === 'footer') {\n slots.footers.push(child as WidgetSlotElement)\n continue\n }\n }\n slots.rest.push(child)\n }\n return slots\n}\n\nfunction mergeBodySlot(\n body: ReactElement<{ className?: string; style?: CSSProperties; children?: ReactNode }>,\n extra: ReactNode[],\n contentClassName: string | undefined,\n isEmptyState: boolean,\n emptyStyle: CSSProperties | undefined,\n) {\n const prev = body.props\n return cloneElement(\n body,\n {\n className: cn(prev.className, contentClassName, isEmptyState && 'empty'),\n style: emptyStyle ? { ...emptyStyle, ...prev.style } : prev.style,\n },\n extra.length > 0 ? [prev.children, ...extra] : prev.children,\n )\n}\n\n/** 헤더 우측 — title과 동일 타이포의 plain text */\nexport function StnWidgetPeriodText({\n children,\n className,\n ...rest\n}: { children: ReactNode } & HTMLAttributes<HTMLSpanElement>) {\n return (\n <span className={cn('stn-widget__period-text', className)} {...rest}>\n {children}\n </span>\n )\n}\n\n/** 헤더 우측 — 드롭다운(라벨 + chevron). 메뉴는 `onClick` · 외부 Dropdown 연결 */\nexport function StnWidgetPeriodSelect({\n label,\n className,\n ...rest\n}: { label: ReactNode } & Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'color'>) {\n return (\n <StnButton\n variant=\"ghost\"\n size=\"sm\"\n shape=\"square\"\n icon={<StnIcon name=\"line/chevron-down\" />}\n iconPosition=\"right\"\n className={className}\n {...rest}\n >\n {label}\n </StnButton>\n )\n}\n\n/** 헤더 우측 — 이전/다음 화살표 + 가운데 라벨 */\nexport function StnWidgetPeriodPager({\n label,\n className,\n onPrev,\n onNext,\n prevLabel = '이전',\n nextLabel = '다음',\n ...rest\n}: {\n label: ReactNode\n className?: string\n onPrev?: () => void\n onNext?: () => void\n prevLabel?: string\n nextLabel?: string\n} & HTMLAttributes<HTMLDivElement>) {\n return (\n <div className={cn('stn-widget__period-pager', className)} {...rest}>\n <StnButton\n variant=\"ghost\"\n size=\"sm\"\n shape=\"square\"\n icon={<StnIcon name=\"line/arrow-narrow-left\" />}\n onClick={onPrev}\n aria-label={prevLabel}\n />\n <span className=\"stn-widget__period-pager-label\">{label}</span>\n <StnButton\n variant=\"ghost\"\n size=\"sm\"\n shape=\"square\"\n icon={<StnIcon name=\"line/arrow-narrow-right\" />}\n onClick={onNext}\n aria-label={nextLabel}\n />\n </div>\n )\n}\n\nfunction StnWidgetHeaderInner({\n appearance,\n title,\n badge,\n titleActions,\n periodLabel,\n periodActions,\n showHeaderIcon,\n headerIconName,\n headerIcon,\n wrapActions = false,\n}: {\n title?: ReactNode\n badge?: ReactNode\n titleActions?: ReactNode\n periodLabel?: ReactNode\n periodActions?: ReactNode\n showHeaderIcon: boolean\n headerIconName?: string\n headerIcon?: ReactNode\n appearance: StnWidgetAppearance\n wrapActions?: boolean\n}) {\n const resolvedIconName = headerIconName ?? defaultHeaderIconName(appearance)\n\n return (\n <div className={cn('stn-widget__head', wrapActions && 'stn-widget__head--wrap')}>\n <div className=\"stn-widget__head-start\">\n {showHeaderIcon ? (\n headerIcon != null ? (\n <StnWidgetInsetIcon size=\"sm\">{headerIcon}</StnWidgetInsetIcon>\n ) : resolvedIconName ? (\n <StnWidgetInsetIcon size=\"sm\" icon={resolvedIconName} />\n ) : null\n ) : null}\n {title != null || badge != null ? (\n typeof title === 'string' || title == null ? (\n <div className=\"stn-widget__title-wrap\">\n {typeof title === 'string' ? (\n <p className=\"stn-widget__title\" title={title}>\n {title}\n </p>\n ) : null}\n {badge}\n </div>\n ) : (\n <>\n {title}\n {badge}\n </>\n )\n ) : null}\n </div>\n {titleActions != null || periodActions != null || (periodLabel != null && periodLabel !== '') ? (\n <div className=\"stn-widget__head-end\">\n {titleActions ??\n (periodActions != null ? (\n periodActions\n ) : periodLabel != null && periodLabel !== '' ? (\n <StnWidgetPeriodText>{periodLabel}</StnWidgetPeriodText>\n ) : null)}\n </div>\n ) : null}\n </div>\n )\n}\n\nexport function StnWidgetRoot({\n shell: shellProp,\n variant,\n appearance,\n background,\n status = 'default',\n isCritical = false,\n kind,\n title,\n badge,\n titleActions,\n showHeaderIcon,\n headerIconName,\n headerIcon,\n periodLabel,\n periodActions,\n children,\n className,\n contentClassName,\n padding = 'default',\n noPadding = false,\n loading = false,\n empty = false,\n emptyMessage,\n footer,\n banner,\n interactive = false,\n docHover = false,\n fullWidth = true,\n fullHeight = true,\n wrapActions = false,\n style,\n ...rest\n}: StnWidgetProps) {\n const shell = variant ?? shellProp ?? 'card'\n const isCanvas = shell === 'canvas'\n const isFigmaShell = appearance != null\n const appearanceShell = appearance != null ? normalizeStnWidgetAppearance(appearance) : undefined\n const defaultBg = isCanvas ? false : true\n const bgMode = resolveStnWidgetBackground(background ?? defaultBg)\n const pubShell = SHELL_PUB_CLASS[shell]\n const resolvedShowIcon = showHeaderIcon ?? (isFigmaShell && !isCanvas)\n const resolvedCritical = isCritical || status === 'critical'\n const emptyText = typeof empty === 'string' ? empty : emptyMessage\n const isEmptyState = Boolean(empty)\n const emptyStyle: CSSProperties | undefined = emptyText\n ? { ['--stn-widget-empty-text' as string]: `\"${emptyText}\"` }\n : undefined\n\n const rootClass = cn(\n 'stn-widget',\n pubShell,\n /* appearance: translucent / solid / line / transparent / overlay */\n appearanceShell,\n appearanceShell && docHover && 'doc-hover',\n /* background=false → no-bg (default는 surface) */\n !appearanceShell && bgMode !== 'surface' && 'no-bg',\n (noPadding || padding === 'none') && 'padding-none',\n padding === 'compact' && 'padding-compact',\n resolvedCritical && 'critical',\n status === 'major' && 'major',\n (status === 'minor' || status === 'warning') && 'minor',\n interactive && 'interactive',\n isEmptyState && 'empty',\n wrapActions && 'stn-widget--wrap-actions',\n !fullWidth && 'stn-widget--fit-width',\n !fullHeight && 'stn-widget--fit-height',\n className,\n )\n\n const rootProps = {\n className: rootClass,\n style,\n 'data-stn-widget': 'react',\n 'data-stn-widget-shell': shell,\n 'data-stn-widget-background': appearance ?? bgMode,\n ...(appearance ? { 'data-stn-widget-appearance': appearance } : {}),\n ...(kind ? { 'data-stn-widget-kind': kind } : {}),\n ...rest,\n }\n\n const slots = partitionWidgetChildren(children)\n\n const propHead =\n shell === 'fault-panel' && !isFigmaShell ? (\n title != null || titleActions ? (\n <div className=\"app_bar\">\n <div className=\"fault_title_box\">{typeof title === 'string' ? <span>{title}</span> : title}</div>\n {titleActions}\n </div>\n ) : null\n ) : shell === 'board' || shell === 'board-item' ? (\n title != null ? (\n <div className=\"stn-widget__head\">{typeof title === 'string' ? <p>{title}</p> : title}</div>\n ) : null\n ) : isFigmaShell ? (\n <StnWidgetHeaderInner\n appearance={appearance}\n title={title}\n badge={badge}\n titleActions={titleActions}\n periodLabel={periodLabel}\n periodActions={periodActions}\n showHeaderIcon={resolvedShowIcon}\n headerIconName={headerIconName}\n headerIcon={headerIcon}\n wrapActions={wrapActions}\n />\n ) : title != null || badge != null || titleActions ? (\n <div className={cn('stn-widget__head', wrapActions && 'stn-widget__head--wrap')}>\n <div className=\"stn-widget__head-start\">\n {title != null ? (\n typeof title === 'string' ? (\n <p className=\"stn-widget__title\" title={title}>\n {title}\n </p>\n ) : (\n title\n )\n ) : null}\n {badge}\n </div>\n {titleActions ? <div className=\"stn-widget__head-end\">{titleActions}</div> : null}\n </div>\n ) : null\n\n const head = slots.headers.length > 0 ? slots.headers : propHead\n const autoBodyClass = shell === 'fault-panel' && !isFigmaShell ? 'table_area' : undefined\n\n let body: ReactNode\n if (loading) {\n body = (\n <div className={cn('stn-widget__body', autoBodyClass, contentClassName)}>\n <StnWidgetLoading />\n </div>\n )\n } else if (slots.bodies.length > 0) {\n body = slots.bodies.map((slot, index) =>\n mergeBodySlot(slot, index === 0 ? slots.rest : [], contentClassName, isEmptyState, emptyStyle),\n )\n } else {\n body = (\n <div className={cn('stn-widget__body', autoBodyClass, isEmptyState && 'empty', contentClassName)} style={emptyStyle}>\n {slots.rest}\n </div>\n )\n }\n\n const footerNode =\n slots.footers.length > 0 ? slots.footers : footer ? <div className=\"stn-widget__footer\">{footer}</div> : null\n\n const card = (\n <div {...rootProps}>\n {isFigmaShell && appearanceShell === 'overlay' ? <div className=\"stn-widget__map-deco\" aria-hidden /> : null}\n {head}\n {body}\n {footerNode}\n </div>\n )\n\n if (banner == null || banner === false) return card\n\n return (\n <div className=\"stn-widget-anchor\">\n {withBannerSeverity(banner, bannerSeverityFromStatus(status, isCritical))}\n {card}\n </div>\n )\n}\n\nexport type StnWidgetHeaderProps = HTMLAttributes<HTMLDivElement> & {\n /** 헤더 우측 컨트롤이 많을 때 아랫줄로 개행(2행 구조) 허용 여부 */\n wrap?: boolean\n}\n\nexport function StnWidgetHeader({ className, wrap = false, children, ...rest }: StnWidgetHeaderProps) {\n return (\n <div className={cn('stn-widget__head', wrap && 'stn-widget__head--wrap', className)} {...rest}>\n {children}\n </div>\n )\n}\n\nmarkWidgetSlot(StnWidgetHeader, 'header')\n\nexport function StnWidgetTitle({ className, children, title, ...rest }: HTMLAttributes<HTMLHeadingElement>) {\n const titleAttr = title ?? (typeof children === 'string' ? children : undefined)\n return (\n <p className={cn('stn-widget__title', className)} title={titleAttr} {...rest}>\n {children}\n </p>\n )\n}\n\nexport function StnWidgetActions({ className, children, ...rest }: HTMLAttributes<HTMLDivElement>) {\n return (\n <div className={cn('stn-widget__head-end', className)} {...rest}>\n {children}\n </div>\n )\n}\n\nexport type StnWidgetBodyProps = HTMLAttributes<HTMLDivElement> & {\n /** 본문 내부 여백 규격 — 기본 12px, compact 8px, none 0px */\n padding?: StnWidgetPadding\n /** 내용이 넘칠 때 내부 스크롤 활성화 여부 (기본 true) */\n scrollable?: boolean\n /** 본문 서피스 배경 — 'default' | 'canvas' (차트용 다크 캔버스) | 'transparent' | 'subtle' */\n surface?: 'default' | 'canvas' | 'transparent' | 'subtle'\n /** 빈 깡통 슬롯 표시 (점선 테두리 및 'Widget Content Shell' 라벨) */\n empty?: boolean | string\n}\n\nexport function StnWidgetBody({\n padding,\n scrollable = true,\n surface = 'default',\n empty,\n className,\n style,\n children,\n ...rest\n}: StnWidgetBodyProps) {\n const emptyText = typeof empty === 'string' ? empty : undefined\n const mergedStyle = emptyText\n ? { ['--stn-widget-empty-text' as any]: `\"${emptyText}\"`, ...style }\n : style\n\n return (\n <div\n className={cn(\n 'stn-widget__body',\n Boolean(empty) && 'empty',\n padding === 'compact' && 'padding-compact',\n padding === 'none' && 'padding-none',\n surface === 'canvas' && 'stn-widget__body--surface-canvas',\n surface === 'transparent' && 'stn-widget__body--surface-transparent',\n surface === 'subtle' && 'stn-widget__body--surface-subtle',\n !scrollable && 'stn-widget__body--no-scroll',\n className,\n )}\n style={mergedStyle}\n {...rest}\n >\n {children}\n </div>\n )\n}\n\nmarkWidgetSlot(StnWidgetBody, 'body')\n\nexport type StnWidgetChartSlotProps = HTMLAttributes<HTMLDivElement> & {\n label?: string\n}\n\n/** Figma slot — dashed chart mount area */\nexport function StnWidgetChartSlot({ label = 'select chart', className, children, ...rest }: StnWidgetChartSlotProps) {\n return (\n <div className={cn('stn-widget__chart-slot', className)} data-stn-widget-chart-slot {...rest}>\n {children ?? <span className=\"stn-widget__chart-slot-label\">{label}</span>}\n </div>\n )\n}\n\nexport type StnWidgetStatusGrade = 'critical' | 'major' | 'minor' | 'info' | 'normal'\n\nexport type StnWidgetStatusItemProps = HTMLAttributes<HTMLDivElement> & {\n label: ReactNode\n value: ReactNode\n grade?: StnWidgetStatusGrade\n /** @deprecated grade 사용 권장 */\n status?: StnWidgetStatusGrade | 'warning'\n showDot?: boolean\n}\n\nexport function StnWidgetStatusItem({\n label,\n value,\n grade: gradeProp,\n status,\n showDot = true,\n className,\n ...rest\n}: StnWidgetStatusItemProps) {\n const grade = gradeProp ?? (status === 'warning' ? 'minor' : status) ?? 'normal'\n return (\n <div className={cn('stn-widget__status-item', className)} {...rest}>\n <span className=\"stn-widget__status-label\">\n {showDot ? (\n <span\n className={cn('stn-widget__status-dot', `stn-widget__status-dot--${grade}`)}\n aria-hidden=\"true\"\n />\n ) : null}\n {label}\n </span>\n <span className=\"stn-widget__status-val\">{value}</span>\n </div>\n )\n}\n\nexport function StnWidgetStatusList({ className, children, ...rest }: HTMLAttributes<HTMLDivElement>) {\n return (\n <div className={cn('stn-widget__status-list', className)} {...rest}>\n {children}\n </div>\n )\n}\n\nexport function StnWidgetStatGroup({ className, children, ...rest }: HTMLAttributes<HTMLDivElement>) {\n return (\n <div className={cn('stn-widget__stat-group', className)} {...rest}>\n {children}\n </div>\n )\n}\n\nexport type StnWidgetStatCardProps = HTMLAttributes<HTMLDivElement> & {\n label: ReactNode\n count: ReactNode\n}\n\nexport function StnWidgetStatCard({ label, count, className, ...rest }: StnWidgetStatCardProps) {\n return (\n <div className={cn('stn-widget__stat-card', className)} {...rest}>\n <span className=\"stn-widget__stat-label\">{label}</span>\n <span className=\"stn-widget__stat-count\">{count}</span>\n </div>\n )\n}\n\n/** DS · 스토리용 빈 본문 */\nexport function StnWidgetPlaceholder({ label = '콘텐츠 영역' }: { label?: string }) {\n return <div className=\"stn-widget__placeholder\">{label}</div>\n}\n\nconst GRADE_ROW_ICON: Record<StnWidgetGradeRowGrade, string> = {\n critical: 'fill/alert4',\n major: 'fill/alert3',\n minor: 'fill/alert2',\n default: 'fill/alert1',\n}\n\n\nexport type StnWidgetGradeRowProps = HTMLAttributes<HTMLDivElement> & {\n grade: StnWidgetGradeRowGrade\n label: ReactNode\n value: ReactNode\n /** 0–100 — progress bar width · percent label */\n percent: number\n percentLabel?: ReactNode\n}\n\nfunction formatGradePercent(percent: number): string {\n const rounded = Math.round(percent * 10) / 10\n return Number.isInteger(rounded) ? `${rounded}%` : `${rounded.toFixed(1)}%`\n}\n\n/** Figma dark dashboard — grade row + 2px progress bar */\nexport function StnWidgetGradeRow({\n grade,\n label,\n value,\n percent,\n percentLabel,\n className,\n ...rest\n}: StnWidgetGradeRowProps) {\n const clamped = Math.max(0, Math.min(100, percent))\n const resolvedPercentLabel = percentLabel ?? formatGradePercent(clamped)\n\n return (\n <div className={cn('stn-widget__grade-row', `stn-widget__grade-row--${grade}`, className)} {...rest}>\n <div className=\"stn-widget__grade-row-left\">\n <span className=\"stn-widget__grade-row-label\">\n <StnIcon name={GRADE_ROW_ICON[grade]} size={20} className=\"stn-widget__grade-row-icon\" aria-hidden />\n {label}\n </span>\n <div className=\"stn-widget__grade-row-track\" aria-hidden>\n <span className=\"stn-widget__grade-row-fill\" style={{ width: `${clamped}%` }} />\n </div>\n </div>\n <div className=\"stn-widget__grade-row-right\">\n <span className=\"stn-widget__grade-row-value\">{value}</span>\n <span className=\"stn-widget__grade-row-percent\">{resolvedPercentLabel}</span>\n </div>\n </div>\n )\n}\n\nexport function StnWidgetGradeRowList({ className, children, ...rest }: HTMLAttributes<HTMLDivElement>) {\n return (\n <div className={cn('stn-widget__grade-row-list', className)} {...rest}>\n {children}\n </div>\n )\n}\n\nexport function StnWidgetFooter({ className, children, ...rest }: HTMLAttributes<HTMLDivElement>) {\n return (\n <div className={cn('stn-widget__footer', className)} {...rest}>\n {children}\n </div>\n )\n}\n\nmarkWidgetSlot(StnWidgetFooter, 'footer')\n\nexport function StnWidgetEmpty({ className, children, ...rest }: HTMLAttributes<HTMLDivElement>) {\n return (\n <div className={cn('stn-widget__empty', className)} {...rest}>\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\" style={{ opacity: 0.6 }}>\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\" />\n </svg>\n <div>{children ?? '데이터가 없습니다.'}</div>\n </div>\n )\n}\n\nexport interface StnWidgetLoadingProps extends HTMLAttributes<HTMLDivElement> {\n lines?: number\n}\n\nexport function StnWidgetLoading({ lines = 3, className, children, ...rest }: StnWidgetLoadingProps) {\n return (\n <div className={cn('stn-widget__loading', className)} {...rest}>\n {children ?? <StnLoadingSkeleton.Widget lines={lines} />}\n </div>\n )\n}\n\nexport type StnWidgetInsetIconProps = StnIconBoxProps\n\n/** 위젯 헤더 아이콘 슬롯 — `StnIconBox` (기본 size=`sm`) */\nexport function StnWidgetInsetIcon({ className, size = 'sm', ...rest }: StnWidgetInsetIconProps) {\n return <StnIconBox size={size} className={cn('stn-widget__inset-icon', className)} {...rest} />\n}\n\nexport const StnWidget = Object.assign(StnWidgetRoot, {\n Header: StnWidgetHeader,\n Title: StnWidgetTitle,\n Actions: StnWidgetActions,\n Body: StnWidgetBody,\n Footer: StnWidgetFooter,\n Empty: StnWidgetEmpty,\n Loading: StnWidgetLoading,\n InsetIcon: StnWidgetInsetIcon,\n ChartSlot: StnWidgetChartSlot,\n PeriodText: StnWidgetPeriodText,\n PeriodSelect: StnWidgetPeriodSelect,\n PeriodPager: StnWidgetPeriodPager,\n StatusList: StnWidgetStatusList,\n StatusItem: StnWidgetStatusItem,\n StatGroup: StnWidgetStatGroup,\n StatCard: StnWidgetStatCard,\n GradeRowList: StnWidgetGradeRowList,\n GradeRow: StnWidgetGradeRow,\n Placeholder: StnWidgetPlaceholder,\n TopologyRing: StnTopologyRing,\n TopologyGraph: StnTopologyGraph,\n})\n","import React from 'react'\nimport { cn } from '../cn'\n\nimport { StnIcon } from './StnIcon'\n\nexport type StnEventBannerPlacement = 'top' | 'bottom' | 'inline'\nexport type StnEventBannerSeverity = 'critical' | 'major' | 'minor' | 'warning'\n/** 위젯과 배너 사이. 시맨틱 스페이스 토큰 space-0 / 4 / 8 / 16. 기본은 `--stn-spacing-event-banner-gap` */\nexport type StnEventBannerGap = 0 | 4 | 8 | 16\n\nexport interface StnEventBannerProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {\n /** 위험도 레벨: 'critical' | 'major' | 'minor' | 'warning' (기본값: 'critical') */\n severity?: StnEventBannerSeverity\n /** 경보 메인 타이틀 (예: 'DISK 임계치 92.4% 초과', 'CPU/MEM 자원 사용률 초과') */\n title?: React.ReactNode\n /** 발생 시간 또는 부가 정보 (예: '발생 시간 09:25:11') */\n time?: React.ReactNode\n /** 우측 액션 버튼 텍스트 (예: '이벤트 정보') */\n actionText?: React.ReactNode\n /** 우측 액션 버튼 클릭 핸들러 */\n onAction?: (e: React.MouseEvent<HTMLButtonElement>) => void\n /** 커스텀 좌측 아이콘 (미지정 시 위험도별 기본 시스템 아이콘) */\n icon?: React.ReactNode\n /** 배치. top/bottom은 위젯 바깥 위·아래에 자리를 차지하지 않음. inline은 흐름 안에 둠 */\n placement?: StnEventBannerPlacement\n /** 위젯과의 간격. 0=붙임, 4/8/16은 `--stn-space-*`. 생략하면 `--stn-spacing-event-banner-gap` */\n gap?: StnEventBannerGap\n /** 네온 인셋 숨쉬기 애니메이션 활성화 여부 (기본값: true) */\n blink?: boolean\n /** 우측 추가 커스텀 액션 컨트롤 */\n actions?: React.ReactNode\n /** 닫기 버튼 핸들러 (지정 시 닫기 버튼 노출) */\n onClose?: (e: React.MouseEvent<HTMLButtonElement>) => void\n /** 추가 클래스 */\n className?: string\n /** 인라인 스타일 */\n style?: React.CSSProperties\n}\n\nconst SEVERITY_ICONS: Record<StnEventBannerSeverity, string> = {\n critical: 'fill/alert4',\n major: 'fill/alert3',\n minor: 'fill/alert2',\n warning: 'fill/alert1',\n}\n\n/** 기본 경고 삼각 아이콘 */\nfunction DefaultTriangleIcon() {\n return (\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M10.29 3.86L1.82 18A2 2 0 0 0 3.54 21H20.46A2 2 0 0 0 22.18 18L13.71 3.86A2 2 0 0 0 10.29 3.86Z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n <circle cx=\"12\" cy=\"17\" r=\"1\" fill=\"currentColor\" />\n </svg>\n )\n}\n\nfunction resolveDefaultIcon(severity: StnEventBannerSeverity) {\n if (severity === 'critical') {\n return <DefaultTriangleIcon />\n }\n return <StnIcon name={SEVERITY_ICONS[severity] || 'fill/alert4'} size={20} />\n}\n\n/** 위험도별 이벤트 배너. placement와 severity로 배치·스타일을 고릅니다. */\nexport const StnEventBanner = React.forwardRef<HTMLDivElement, StnEventBannerProps>(\n (\n {\n severity = 'critical',\n title = 'DISK 임계치 92.4% 초과',\n time,\n actionText = '이벤트 정보',\n onAction,\n icon,\n placement = 'top',\n gap,\n blink = true,\n actions,\n onClose,\n className,\n id,\n ...restProps\n },\n ref\n ) => {\n return (\n <div\n ref={ref}\n id={id}\n role=\"alert\"\n aria-live=\"assertive\"\n className={cn(\n 'stn-event-banner',\n placement,\n severity,\n !blink && 'no-blink',\n gap != null && `gap-${gap}`,\n className\n )}\n {...restProps}\n >\n <div className=\"stn-event-banner__left\">\n <div className=\"stn-event-banner__icon-wrap\">\n {icon ?? resolveDefaultIcon(severity)}\n </div>\n <div className=\"stn-event-banner__text\">\n {title && (\n <span className=\"stn-event-banner__title\" title={typeof title === 'string' ? title : undefined}>\n {title}\n </span>\n )}\n {time && (\n <span className=\"stn-event-banner__time\" title={typeof time === 'string' ? time : undefined}>\n {time}\n </span>\n )}\n </div>\n </div>\n\n <div className=\"stn-event-banner__actions\">\n {actions}\n {actionText && (\n <button\n type=\"button\"\n className=\"stn-event-banner__btn\"\n onClick={onAction}\n >\n {actionText}\n </button>\n )}\n {onClose && (\n <button\n type=\"button\"\n className=\"stn-event-banner__btn\"\n onClick={onClose}\n aria-label=\"배너 닫기\"\n >\n 닫기\n </button>\n )}\n </div>\n </div>\n )\n }\n)\n\nStnEventBanner.displayName = 'StnEventBanner'\n","import type { CSSProperties, HTMLAttributes, ReactNode } from 'react'\n\nimport { cn } from '../../cn'\n\nexport type StnLoadingSkeletonVariant =\n | 'line'\n | 'circle'\n | 'block'\n | 'profile'\n | 'widget'\n | 'table'\n\nexport type StnLoadingSkeletonLineProps = HTMLAttributes<HTMLDivElement> & {\n width?: 'full' | 'medium' | 'short'\n className?: string\n style?: CSSProperties\n}\n\nexport function StnLoadingSkeletonLine({ width = 'full', className, style, ...rest }: StnLoadingSkeletonLineProps) {\n return (\n <div\n className={cn(\n 'stn-loading-skeleton__line',\n width === 'medium' && 'stn-loading-skeleton__line--medium',\n width === 'short' && 'stn-loading-skeleton__line--short',\n className,\n )}\n style={style}\n aria-hidden\n {...rest}\n />\n )\n}\n\nexport type StnLoadingSkeletonBlockProps = HTMLAttributes<HTMLDivElement> & {\n minHeight?: number | string\n className?: string\n style?: CSSProperties\n}\n\nexport function StnLoadingSkeletonBlock({ minHeight = 48, className, style, ...rest }: StnLoadingSkeletonBlockProps) {\n return (\n <div\n className={cn('stn-loading-skeleton__block', className)}\n style={{ minHeight, ...style }}\n aria-hidden\n {...rest}\n />\n )\n}\n\nexport type StnLoadingSkeletonCircleProps = HTMLAttributes<HTMLDivElement> & {\n size?: number\n className?: string\n style?: CSSProperties\n}\n\nexport function StnLoadingSkeletonCircle({ size = 40, className, style, ...rest }: StnLoadingSkeletonCircleProps) {\n return (\n <div\n className={cn('stn-loading-skeleton__circle', className)}\n style={{ width: size, height: size, ...style }}\n aria-hidden\n {...rest}\n />\n )\n}\n\nexport type StnLoadingSkeletonProfileProps = HTMLAttributes<HTMLDivElement> & {\n /** 아바타 원형 크기 (기본: 40px) */\n avatarSize?: number\n className?: string\n style?: CSSProperties\n}\n\nexport function StnLoadingSkeletonProfile({ avatarSize = 40, className, style, ...rest }: StnLoadingSkeletonProfileProps) {\n return (\n <div\n className={cn('stn-loading-skeleton--profile', className)}\n style={style}\n aria-busy=\"true\"\n aria-label=\"프로필 로딩 중\"\n {...rest}\n >\n <StnLoadingSkeletonCircle size={avatarSize} />\n <div className=\"stn-loading-skeleton__profile-content\">\n <StnLoadingSkeletonLine width=\"medium\" />\n <StnLoadingSkeletonLine width=\"short\" />\n </div>\n </div>\n )\n}\n\nexport type StnLoadingSkeletonWidgetProps = HTMLAttributes<HTMLDivElement> & {\n lines?: number\n className?: string\n style?: CSSProperties\n}\n\n/** 위젯 본문 로딩 — StnWidget children 자리 */\nexport function StnLoadingSkeletonWidget({ lines = 4, className, style, ...rest }: StnLoadingSkeletonWidgetProps) {\n return (\n <div\n className={cn('stn-loading-skeleton', 'stn-loading-skeleton--widget', className)}\n style={style}\n aria-busy=\"true\"\n aria-label=\"로딩 중\"\n {...rest}\n >\n {Array.from({ length: lines }, (_, i) => (\n <StnLoadingSkeletonLine key={i} width={i % 3 === 0 ? 'short' : i % 2 === 0 ? 'medium' : 'full'} />\n ))}\n </div>\n )\n}\n\nexport type StnLoadingSkeletonTableProps = HTMLAttributes<HTMLDivElement> & {\n rows?: number\n cols?: number\n className?: string\n style?: CSSProperties\n}\n\nexport function StnLoadingSkeletonTable({ rows = 5, cols = 4, className, style, ...rest }: StnLoadingSkeletonTableProps) {\n return (\n <div\n className={cn('stn-loading-skeleton', 'stn-loading-skeleton--table', className)}\n style={{ ...style, ['--stn-skeleton-cols' as string]: String(cols) }}\n aria-busy=\"true\"\n aria-label=\"테이블 로딩 중\"\n {...rest}\n >\n {Array.from({ length: rows }, (_, row) => (\n <div key={row} className=\"stn-loading-skeleton__table-row\">\n {Array.from({ length: cols }, (_, col) => (\n <StnLoadingSkeletonLine key={col} />\n ))}\n </div>\n ))}\n </div>\n )\n}\n\nexport type StnLoadingSkeletonProps = HTMLAttributes<HTMLDivElement> & {\n /**\n * 스켈레톤 형태:\n * - 'line': 텍스트 라인 (기본)\n * - 'circle': 원형 아바타 / 아이콘\n * - 'block': 카드 / 차트 / 배너 면 영역\n * - 'profile': 아바타 + 2줄 텍스트 복합 프리셋\n * - 'widget': 위젯용 다중 라인\n * - 'table': 그리드형 테이블 프리셋\n */\n variant?: StnLoadingSkeletonVariant\n /** variant=\"line\" 전용: 가로 너비 ('full' | 'medium' | 'short') */\n width?: 'full' | 'medium' | 'short'\n /** variant=\"circle\" 및 \"profile\" 아바타 크기 (px) */\n size?: number\n avatarSize?: number\n /** variant=\"block\" 전용: 최소 높이 (px 또는 string) */\n minHeight?: number | string\n /** variant=\"widget\" 전용: 라인 수 */\n lines?: number\n /** variant=\"table\" 전용: 행/열 수 */\n rows?: number\n cols?: number\n className?: string\n style?: CSSProperties\n children?: ReactNode\n}\n\n/**\n * StnLoadingSkeleton\n * 단일 컴포넌트에 variant prop을 지정하거나, children을 넘겨 복합 레이아웃 컨테이너로 사용합니다.\n * 하위 호환을 위해 StnLoadingSkeleton.Line 등의 서브컴포넌트도 동일하게 지원합니다.\n */\nfunction StnLoadingSkeletonRoot({\n variant,\n width,\n size,\n avatarSize,\n minHeight,\n lines,\n rows,\n cols,\n children,\n className,\n style,\n ...rest\n}: StnLoadingSkeletonProps) {\n // children이 제공되면 커스텀 스켈레톤을 묶는 컨테이너로 동작\n if (children != null) {\n return (\n <div className={cn('stn-loading-skeleton', className)} style={style} aria-busy=\"true\" {...rest}>\n {children}\n </div>\n )\n }\n\n // variant에 따라 해당 원자/프리셋 렌더링 (기본값: 'line')\n const resolvedVariant = variant ?? 'line'\n\n switch (resolvedVariant) {\n case 'circle':\n return <StnLoadingSkeletonCircle size={size} className={className} style={style} {...rest} />\n case 'block':\n return <StnLoadingSkeletonBlock minHeight={minHeight} className={className} style={style} {...rest} />\n case 'profile':\n return <StnLoadingSkeletonProfile avatarSize={avatarSize ?? size} className={className} style={style} {...rest} />\n case 'widget':\n return <StnLoadingSkeletonWidget lines={lines} className={className} style={style} {...rest} />\n case 'table':\n return <StnLoadingSkeletonTable rows={rows} cols={cols} className={className} style={style} {...rest} />\n case 'line':\n default:\n return <StnLoadingSkeletonLine width={width} className={className} style={style} {...rest} />\n }\n}\n\n/** 로딩 스켈레톤 UI — 단일 컴포넌트(<StnLoadingSkeleton variant=\"...\" />) 또는 서브컴포넌트 네임스페이스 지원 */\nexport const StnLoadingSkeleton = Object.assign(StnLoadingSkeletonRoot, {\n Line: StnLoadingSkeletonLine,\n Block: StnLoadingSkeletonBlock,\n Circle: StnLoadingSkeletonCircle,\n Profile: StnLoadingSkeletonProfile,\n Widget: StnLoadingSkeletonWidget,\n Table: StnLoadingSkeletonTable,\n})\n\n/** 레거시 RootProps 호환 alias */\nexport type StnLoadingSkeletonRootProps = StnLoadingSkeletonProps\n","import { useId, type CSSProperties, type HTMLAttributes } from 'react'\nimport { cn } from '../../cn'\nimport { StnTopologyNodeMark } from './StnTopologyNodeMark'\nimport {\n ringOrbitRadius,\n STN_TOPOLOGY_STATUS_COLORS,\n type StnTopologyCore,\n type StnTopologyNode,\n type StnTopologyNodeSize,\n type StnTopologyNodeStatus,\n} from './stnTopologyShared'\n\nexport type {\n StnTopologyCore,\n StnTopologyNode,\n StnTopologyNodeContent,\n StnTopologyNodeIcon,\n StnTopologyNodeShape,\n StnTopologyNodeSize,\n StnTopologyNodeStatus,\n} from './stnTopologyShared'\n\nexport type StnTopologyRingProps = Omit<HTMLAttributes<HTMLDivElement>, 'title'> & {\n /** 중앙 코어 노드 정보 */\n core?: StnTopologyCore\n /** 둘레 궤도 상의 관제 노드 목록 */\n nodes?: StnTopologyNode[]\n /** 궤도(링) 개수 (기본 3단계 동심원) */\n ringCount?: number\n /** 메인 궤도 반경 (SVG 단위, 기본 115) */\n orbitRadius?: number\n /** 궤도 간격 (기본 36) */\n ringGap?: number\n /** 노드 기본 크기 */\n nodeSize?: StnTopologyNodeSize\n /** 중앙 연결 선 스타일 */\n connectionLineStyle?: 'solid' | 'dashed' | 'none'\n /** 선택 하이라이트 노드 id */\n selectedId?: string\n /** 노드 클릭 핸들러 */\n onNodeClick?: (node: StnTopologyNode) => void\n /** 스켈레톤 로딩 상태 */\n loading?: boolean\n className?: string\n style?: CSSProperties\n}\n\n/**\n * StnTopologyRing — 종합 관제 원형 궤도 토폴로지\n *\n * - 동심원 궤도 (orbitRadius · ringCount · 노드별 orbit)\n * - 노드 크기(xs~lg) · 모양(circle/hexagon/diamond/square) · 상태색\n * - 본문 타입: 아이콘 또는 수량 숫자\n */\nexport function StnTopologyRing({\n core = {\n title: '에스티엔인포텍',\n subTitle: 'STN',\n status: 'normal',\n statusLabel: '정상',\n },\n nodes = [],\n ringCount = 3,\n orbitRadius = 115,\n ringGap = 36,\n nodeSize = 'md',\n connectionLineStyle = 'solid',\n selectedId,\n onNodeClick,\n loading = false,\n className,\n style,\n ...rest\n}: StnTopologyRingProps) {\n const gradientId = useId()\n const coreGlowId = useId()\n\n const safeRingCount = Math.max(1, ringCount)\n const radii = Array.from({ length: safeRingCount }, (_, i) =>\n ringOrbitRadius(i + 1, safeRingCount, orbitRadius, ringGap),\n )\n const maxOrbit = Math.max(...radii)\n const vb = Math.max(380, Math.ceil((maxOrbit + 72) * 2))\n const centerX = vb / 2\n const centerY = vb / 2\n\n const coreStatus: StnTopologyNodeStatus = core.status ?? 'normal'\n const coreColor = core.color ?? STN_TOPOLOGY_STATUS_COLORS[coreStatus].main\n const coreStatusLabel = core.statusLabel ?? STN_TOPOLOGY_STATUS_COLORS[coreStatus].label\n const mainOrbit = Math.ceil(safeRingCount / 2)\n\n const calculatedNodes = nodes.map((node, index) => {\n const orbit = node.orbit ?? mainOrbit\n const radius = ringOrbitRadius(orbit, safeRingCount, orbitRadius, ringGap)\n const angleDegree = node.angle ?? index * (360 / Math.max(1, nodes.length)) - 90\n const angleRad = (angleDegree * Math.PI) / 180\n const x = centerX + radius * Math.cos(angleRad)\n const y = centerY + radius * Math.sin(angleRad)\n const status = node.status ?? 'normal'\n const color = node.color ?? STN_TOPOLOGY_STATUS_COLORS[status].main\n const statusLabel = node.statusLabel ?? STN_TOPOLOGY_STATUS_COLORS[status].label\n\n return {\n ...node,\n orbit,\n radius,\n angleDegree,\n x,\n y,\n status,\n color,\n statusLabel,\n }\n })\n\n if (loading) {\n return (\n <div\n className={cn('stn-topology-ring', 'stn-topology-ring--loading', className)}\n style={style}\n {...rest}\n >\n <div className=\"stn-topology-ring__loading-label\">토폴로지 링 데이터를 불러오는 중...</div>\n </div>\n )\n }\n\n return (\n <div\n className={cn('stn-topology-ring', className)}\n style={style}\n data-stn-topology-ring\n data-ring-count={safeRingCount}\n {...rest}\n >\n <svg\n className=\"stn-topology-ring__svg\"\n width=\"100%\"\n height=\"100%\"\n viewBox={`0 0 ${vb} ${vb}`}\n overflow=\"visible\"\n >\n <defs>\n <radialGradient id={coreGlowId} cx=\"50%\" cy=\"50%\" r=\"50%\">\n <stop offset=\"0%\" stopColor=\"#722ed1\" stopOpacity=\"0.8\" />\n <stop offset=\"100%\" stopColor=\"#120338\" stopOpacity=\"0\" />\n </radialGradient>\n <linearGradient id={gradientId} x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"100%\">\n <stop offset=\"0%\" stopColor=\"#00e5ff\" stopOpacity=\"0.4\" />\n <stop offset=\"100%\" stopColor=\"#722ed1\" stopOpacity=\"0.4\" />\n </linearGradient>\n </defs>\n\n {radii.map((r, idx) => {\n const isMain = idx + 1 === mainOrbit\n return (\n <circle\n key={`orbit-${idx}`}\n cx={centerX}\n cy={centerY}\n r={r}\n fill=\"none\"\n stroke={isMain ? `url(#${gradientId})` : 'rgba(255, 255, 255, 0.08)'}\n strokeWidth={isMain ? 1.5 : 1}\n strokeDasharray={isMain ? undefined : '4 4'}\n />\n )\n })}\n\n {connectionLineStyle !== 'none' &&\n calculatedNodes.map((node) => (\n <line\n key={`line-${node.id}`}\n x1={centerX}\n y1={centerY}\n x2={node.x}\n y2={node.y}\n stroke={\n node.status === 'critical'\n ? 'rgba(255, 77, 79, 0.45)'\n : node.status === 'warning' || node.status === 'major'\n ? 'rgba(250, 140, 22, 0.4)'\n : 'rgba(255, 255, 255, 0.12)'\n }\n strokeWidth={node.status === 'critical' ? 1.5 : 1}\n strokeDasharray={connectionLineStyle === 'dashed' ? '3 3' : undefined}\n />\n ))}\n\n <g className=\"stn-topology-ring__core\">\n <circle cx={centerX} cy={centerY} r={54} fill={`url(#${coreGlowId})`} />\n <circle\n cx={centerX}\n cy={centerY}\n r={42}\n fill=\"rgba(12, 14, 28, 0.95)\"\n stroke=\"#722ed1\"\n strokeWidth=\"2\"\n style={{ filter: 'drop-shadow(0 0 12px rgba(114, 46, 209, 0.6))' }}\n />\n {core.subTitle && (\n <text\n x={centerX}\n y={centerY - 10}\n textAnchor=\"middle\"\n fill=\"#00e5ff\"\n fontSize=\"14\"\n fontWeight=\"800\"\n letterSpacing=\"1\"\n >\n {core.subTitle}\n </text>\n )}\n {core.title && (\n <text x={centerX} y={centerY + 8} textAnchor=\"middle\" fill=\"#f0f2f5\" fontSize=\"10\" fontWeight=\"600\">\n {core.title}\n </text>\n )}\n <text x={centerX} y={centerY + 22} textAnchor=\"middle\" fill={coreColor} fontSize=\"9\" fontWeight=\"500\">\n ● {coreStatusLabel}\n </text>\n </g>\n\n {calculatedNodes.map((node) => (\n <StnTopologyNodeMark\n key={node.id}\n x={node.x}\n y={node.y}\n size={node.size ?? nodeSize}\n shape={node.shape ?? 'circle'}\n status={node.status}\n color={node.color}\n content={node.content ?? (node.count != null && !node.icon ? 'count' : 'icon')}\n icon={node.icon}\n count={node.count}\n label={node.label}\n statusLabel={node.statusLabel}\n pulse={node.pulse}\n selected={selectedId === node.id}\n onClick={onNodeClick ? () => onNodeClick(node) : undefined}\n />\n ))}\n </svg>\n </div>\n )\n}\n","import type { ReactNode } from 'react'\n\nexport type StnTopologyNodeStatus = 'normal' | 'minor' | 'major' | 'critical' | 'warning'\n\nexport type StnTopologyNodeShape = 'circle' | 'hexagon' | 'diamond' | 'square'\n\nexport type StnTopologyNodeSize = 'xs' | 'sm' | 'md' | 'lg'\n\n/** 노드 본문 — 아이콘 또는 수량 숫자 */\nexport type StnTopologyNodeContent = 'icon' | 'count'\n\nexport type StnTopologyNodeIcon =\n | 'server'\n | 'cloud'\n | 'ai'\n | 'network'\n | 'shield'\n | 'user'\n | 'database'\n | 'wifi'\n\nexport const STN_TOPOLOGY_NODE_SHAPES: readonly StnTopologyNodeShape[] = [\n 'circle',\n 'hexagon',\n 'diamond',\n 'square',\n]\n\nexport const STN_TOPOLOGY_NODE_SIZES: readonly StnTopologyNodeSize[] = ['xs', 'sm', 'md', 'lg']\n\nexport const STN_TOPOLOGY_NODE_STATUSES: readonly StnTopologyNodeStatus[] = [\n 'normal',\n 'minor',\n 'warning',\n 'major',\n 'critical',\n]\n\nexport const STN_TOPOLOGY_NODE_ICONS: readonly StnTopologyNodeIcon[] = [\n 'server',\n 'cloud',\n 'ai',\n 'network',\n 'shield',\n 'user',\n 'database',\n 'wifi',\n]\n\nexport type StnTopologyStatusTone = {\n main: string\n glow: string\n text: string\n label: string\n}\n\nexport const STN_TOPOLOGY_STATUS_COLORS: Record<StnTopologyNodeStatus, StnTopologyStatusTone> = {\n normal: {\n main: '#52c41a',\n glow: 'rgba(82, 196, 26, 0.35)',\n text: '#95de64',\n label: '정상',\n },\n minor: {\n main: '#fadb14',\n glow: 'rgba(250, 219, 20, 0.5)',\n text: '#ffd666',\n label: '주의',\n },\n warning: {\n main: '#13c2c2',\n glow: 'rgba(19, 194, 194, 0.5)',\n text: '#36cfc9',\n label: '경고',\n },\n major: {\n main: '#fa8c16',\n glow: 'rgba(250, 140, 22, 0.65)',\n text: '#ffa940',\n label: '위험',\n },\n critical: {\n main: '#ff4d4f',\n glow: 'rgba(255, 77, 79, 0.8)',\n text: '#ff7875',\n label: '심각',\n },\n}\n\nexport const STN_TOPOLOGY_NODE_SIZE: Record<\n StnTopologyNodeSize,\n { r: number; icon: number; countFont: number; labelFont: number; statusFont: number; stroke: number }\n> = {\n xs: { r: 9, icon: 10, countFont: 8, labelFont: 9, statusFont: 8, stroke: 1.2 },\n sm: { r: 12, icon: 12, countFont: 10, labelFont: 10, statusFont: 8.5, stroke: 1.4 },\n md: { r: 16, icon: 14, countFont: 13, labelFont: 11, statusFont: 9.5, stroke: 1.8 },\n lg: { r: 22, icon: 18, countFont: 16, labelFont: 12, statusFont: 10, stroke: 2.2 },\n}\n\nexport function formatTopologyCount(count: number | string | undefined): string {\n if (count == null || count === '') return '0'\n if (typeof count === 'string') return count\n if (count > 999) return '999+'\n return String(count)\n}\n\nexport function topologyStatusColor(status: StnTopologyNodeStatus | undefined, fallback?: string): string {\n if (fallback) return fallback\n return STN_TOPOLOGY_STATUS_COLORS[status ?? 'normal'].main\n}\n\nexport function hexToRgba(hex: string, alpha: number): string {\n const raw = hex.trim()\n if (!raw.startsWith('#')) return raw\n const h = raw.slice(1)\n const full = h.length === 3 ? h.split('').map((c) => c + c).join('') : h\n if (full.length !== 6) return raw\n const n = Number.parseInt(full, 16)\n if (Number.isNaN(n)) return raw\n const r = (n >> 16) & 255\n const g = (n >> 8) & 255\n const b = n & 255\n return `rgba(${r}, ${g}, ${b}, ${alpha})`\n}\n\nexport function polygonPoints(cx: number, cy: number, r: number, sides: number, rotationDeg: number): string {\n const rot = (rotationDeg * Math.PI) / 180\n return Array.from({ length: sides }, (_, i) => {\n const a = rot + (i * 2 * Math.PI) / sides\n return `${cx + r * Math.cos(a)},${cy + r * Math.sin(a)}`\n }).join(' ')\n}\n\nexport function topologyShapePoints(shape: StnTopologyNodeShape, cx: number, cy: number, r: number): string {\n if (shape === 'hexagon') return polygonPoints(cx, cy, r, 6, -90)\n if (shape === 'diamond') return polygonPoints(cx, cy, r, 4, 0)\n return polygonPoints(cx, cy, r, 4, 45)\n}\n\nexport function ringOrbitRadius(orbit: number, ringCount: number, baseRadius: number, gap = 36): number {\n const safeCount = Math.max(1, ringCount)\n const safeOrbit = Math.min(Math.max(1, orbit), safeCount)\n const mid = Math.ceil(safeCount / 2)\n return Math.max(100, baseRadius + (safeOrbit - mid) * gap)\n}\n\nexport type StnTopologyNode = {\n id: string\n label: string\n status?: StnTopologyNodeStatus\n statusLabel?: string\n icon?: StnTopologyNodeIcon | ReactNode\n shape?: StnTopologyNodeShape\n size?: StnTopologyNodeSize\n content?: StnTopologyNodeContent\n /** 노드 본문 숫자(`content: 'count'`) 또는 아이콘 위 뱃지 */\n count?: number | string\n color?: string\n /** 링 상의 각도 (0~360). 미지정 시 균등 분할 */\n angle?: number\n /** 1-based 궤도 번호 (안쪽 → 바깥쪽). 미지정 시 메인 궤도 */\n orbit?: number\n subText?: string\n data?: unknown\n pulse?: boolean\n}\n\nexport type StnTopologyCore = {\n title?: string\n subTitle?: string\n status?: StnTopologyNodeStatus\n statusLabel?: string\n icon?: ReactNode\n color?: string\n}\n","import type { ReactNode, SVGAttributes } from 'react'\nimport { cn } from '../../cn'\nimport {\n STN_TOPOLOGY_NODE_SIZE,\n STN_TOPOLOGY_STATUS_COLORS,\n formatTopologyCount,\n hexToRgba,\n topologyShapePoints,\n topologyStatusColor,\n type StnTopologyNodeContent,\n type StnTopologyNodeIcon,\n type StnTopologyNodeShape,\n type StnTopologyNodeSize,\n type StnTopologyNodeStatus,\n} from './stnTopologyShared'\n\nexport type StnTopologyNodeMarkProps = Omit<SVGAttributes<SVGGElement>, 'onClick'> & {\n x: number\n y: number\n size?: StnTopologyNodeSize\n shape?: StnTopologyNodeShape\n status?: StnTopologyNodeStatus\n color?: string\n content?: StnTopologyNodeContent\n icon?: StnTopologyNodeIcon | ReactNode\n count?: number | string\n label?: string\n statusLabel?: string\n pulse?: boolean\n selected?: boolean\n showLabel?: boolean\n showStatus?: boolean\n onClick?: () => void\n}\n\nfunction renderTopologyIcon(icon: StnTopologyNodeIcon | ReactNode | undefined, color: string, px: number) {\n if (!icon) return null\n if (typeof icon !== 'string') return icon\n\n const iconProps = {\n width: px,\n height: px,\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: color,\n strokeWidth: 2,\n strokeLinecap: 'round' as const,\n strokeLinejoin: 'round' as const,\n }\n\n switch (icon) {\n case 'server':\n return (\n <svg {...iconProps}>\n <rect x=\"2\" y=\"2\" width=\"20\" height=\"8\" rx=\"2\" ry=\"2\" />\n <rect x=\"2\" y=\"14\" width=\"20\" height=\"8\" rx=\"2\" ry=\"2\" />\n <line x1=\"6\" y1=\"6\" x2=\"6.01\" y2=\"6\" />\n <line x1=\"6\" y1=\"18\" x2=\"6.01\" y2=\"18\" />\n </svg>\n )\n case 'cloud':\n return (\n <svg {...iconProps}>\n <path d=\"M18 10h-1.26A8 8 0 1 0 9 20h9a5 5 0 0 0 0-10z\" />\n </svg>\n )\n case 'ai':\n return (\n <svg {...iconProps}>\n <rect x=\"4\" y=\"4\" width=\"16\" height=\"16\" rx=\"2\" />\n <rect x=\"9\" y=\"9\" width=\"6\" height=\"6\" />\n <line x1=\"9\" y1=\"1\" x2=\"9\" y2=\"4\" />\n <line x1=\"15\" y1=\"1\" x2=\"15\" y2=\"4\" />\n <line x1=\"9\" y1=\"20\" x2=\"9\" y2=\"23\" />\n <line x1=\"15\" y1=\"20\" x2=\"15\" y2=\"23\" />\n <line x1=\"20\" y1=\"9\" x2=\"23\" y2=\"9\" />\n <line x1=\"20\" y1=\"14\" x2=\"23\" y2=\"14\" />\n <line x1=\"1\" y1=\"9\" x2=\"4\" y2=\"9\" />\n <line x1=\"1\" y1=\"14\" x2=\"4\" y2=\"14\" />\n </svg>\n )\n case 'network':\n return (\n <svg {...iconProps}>\n <rect x=\"2\" y=\"2\" width=\"6\" height=\"6\" rx=\"1\" />\n <rect x=\"16\" y=\"2\" width=\"6\" height=\"6\" rx=\"1\" />\n <rect x=\"9\" y=\"16\" width=\"6\" height=\"6\" rx=\"1\" />\n <line x1=\"5\" y1=\"8\" x2=\"5\" y2=\"12\" />\n <line x1=\"19\" y1=\"8\" x2=\"19\" y2=\"12\" />\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\" />\n <line x1=\"12\" y1=\"12\" x2=\"12\" y2=\"16\" />\n </svg>\n )\n case 'shield':\n return (\n <svg {...iconProps}>\n <path d=\"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z\" />\n </svg>\n )\n case 'user':\n return (\n <svg {...iconProps}>\n <path d=\"M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2\" />\n <circle cx=\"12\" cy=\"7\" r=\"4\" />\n </svg>\n )\n case 'database':\n return (\n <svg {...iconProps}>\n <ellipse cx=\"12\" cy=\"5\" rx=\"9\" ry=\"3\" />\n <path d=\"M21 12c0 1.66-4 3-9 3s-9-1.34-9-3\" />\n <path d=\"M3 5v14c0 1.66 4 3 9 3s9-1.34 9-3V5\" />\n </svg>\n )\n case 'wifi':\n return (\n <svg {...iconProps}>\n <path d=\"M5 12.55a11 11 0 0 1 14.08 0\" />\n <path d=\"M1.42 9a16 16 0 0 1 21.16 0\" />\n <path d=\"M8.53 16.11a6 6 0 0 1 6.95 0\" />\n <line x1=\"12\" y1=\"20\" x2=\"12.01\" y2=\"20\" />\n </svg>\n )\n default:\n return null\n }\n}\n\nfunction NodeShape({\n shape,\n x,\n y,\n r,\n fill,\n stroke,\n strokeWidth,\n glow,\n}: {\n shape: StnTopologyNodeShape\n x: number\n y: number\n r: number\n fill: string\n stroke: string\n strokeWidth: number\n glow: string\n}) {\n const filter = glow ? `drop-shadow(0 0 8px ${glow})` : 'drop-shadow(0 2px 4px rgba(0, 0, 0, 0.4))'\n\n if (shape === 'circle') {\n return <circle cx={x} cy={y} r={r} fill={fill} stroke={stroke} strokeWidth={strokeWidth} style={{ filter }} />\n }\n\n if (shape === 'square') {\n const size = r * 2\n return (\n <rect\n x={x - r}\n y={y - r}\n width={size}\n height={size}\n rx={Math.max(2, r * 0.18)}\n fill={fill}\n stroke={stroke}\n strokeWidth={strokeWidth}\n style={{ filter }}\n />\n )\n }\n\n return (\n <polygon\n points={topologyShapePoints(shape, x, y, r)}\n fill={fill}\n stroke={stroke}\n strokeWidth={strokeWidth}\n strokeLinejoin=\"round\"\n style={{ filter }}\n />\n )\n}\n\n/**\n * StnTopologyNodeMark — 토폴로지 노드 시각 단위 (크기 · 모양 · 색 · 아이콘/숫자)\n */\nexport function StnTopologyNodeMark({\n x,\n y,\n size = 'md',\n shape = 'circle',\n status = 'normal',\n color,\n content = 'icon',\n icon,\n count,\n label,\n statusLabel,\n pulse = false,\n selected = false,\n showLabel = true,\n showStatus = true,\n onClick,\n className,\n ...rest\n}: StnTopologyNodeMarkProps) {\n const metrics = STN_TOPOLOGY_NODE_SIZE[size]\n const tone = STN_TOPOLOGY_STATUS_COLORS[status]\n const stroke = topologyStatusColor(status, color)\n const isAlert = status === 'critical' || pulse\n const isCount = content === 'count'\n const fill = isCount ? hexToRgba(stroke, 0.28) : 'rgba(16, 20, 34, 0.95)'\n const r = isAlert ? metrics.r + 1.5 : metrics.r\n const resolvedStatusLabel = statusLabel ?? tone.label\n const countText = formatTopologyCount(count)\n const iconPx = metrics.icon\n const showCornerBadge = !isCount && count != null && count !== ''\n\n return (\n <g\n className={cn('stn-topology-node', selected && 'stn-topology-node--selected', className)}\n data-shape={shape}\n data-size={size}\n data-status={status}\n data-content={content}\n onClick={onClick}\n style={{ cursor: onClick ? 'pointer' : 'default' }}\n {...rest}\n >\n {isAlert && (\n <circle\n className=\"stn-topology-node__pulse\"\n cx={x}\n cy={y}\n r={r + 6}\n fill=\"none\"\n stroke={stroke}\n strokeWidth=\"1.5\"\n opacity=\"0.55\"\n >\n <animate attributeName=\"r\" values={`${r + 4};${r + 12};${r + 4}`} dur=\"2s\" repeatCount=\"indefinite\" />\n <animate attributeName=\"opacity\" values=\"0.75;0.15;0.75\" dur=\"2s\" repeatCount=\"indefinite\" />\n </circle>\n )}\n\n {selected && (\n <circle cx={x} cy={y} r={r + 6} fill=\"none\" stroke=\"#00e5ff\" strokeWidth=\"1.5\" strokeDasharray=\"3 3\" />\n )}\n\n <NodeShape\n shape={shape}\n x={x}\n y={y}\n r={r}\n fill={fill}\n stroke={stroke}\n strokeWidth={isAlert ? metrics.stroke + 0.6 : metrics.stroke}\n glow={isAlert || isCount ? tone.glow : ''}\n />\n\n {isCount ? (\n <text\n x={x}\n y={y}\n textAnchor=\"middle\"\n dominantBaseline=\"central\"\n fill=\"#ffffff\"\n fontSize={metrics.countFont}\n fontWeight=\"800\"\n style={{ textShadow: '0 1px 2px rgba(0, 0, 0, 0.85)' }}\n >\n {countText}\n </text>\n ) : (\n <g transform={`translate(${x - iconPx / 2}, ${y - iconPx / 2})`}>{renderTopologyIcon(icon, stroke, iconPx)}</g>\n )}\n\n {showCornerBadge && (\n <g className=\"stn-topology-node__badge\">\n <circle cx={x + r * 0.72} cy={y - r * 0.72} r={Math.max(6, r * 0.38)} fill={stroke} stroke=\"rgba(6,7,15,0.9)\" strokeWidth=\"1\" />\n <text\n x={x + r * 0.72}\n y={y - r * 0.72}\n textAnchor=\"middle\"\n dominantBaseline=\"central\"\n fill=\"#0b0d14\"\n fontSize={Math.max(7, r * 0.42)}\n fontWeight=\"800\"\n >\n {countText}\n </text>\n </g>\n )}\n\n {showLabel && label && (\n <text\n x={x}\n y={y - r - 6}\n textAnchor=\"middle\"\n fill=\"#ffffff\"\n fontSize={metrics.labelFont}\n fontWeight=\"700\"\n style={{ textShadow: '0 1px 3px rgba(0, 0, 0, 0.9)' }}\n >\n {label}\n </text>\n )}\n\n {showStatus && resolvedStatusLabel && (\n <text\n x={x}\n y={y + r + 12}\n textAnchor=\"middle\"\n fill={stroke}\n fontSize={metrics.statusFont}\n fontWeight=\"600\"\n style={{ textShadow: '0 1px 2px rgba(0, 0, 0, 0.8)' }}\n >\n ● {resolvedStatusLabel}\n </text>\n )}\n </g>\n )\n}\n\nexport type StnTopologyNodePreviewProps = Omit<StnTopologyNodeMarkProps, 'x' | 'y'> & {\n width?: number\n height?: number\n}\n\n/** 문서·팔레트용 단독 노드 프리뷰 */\nexport function StnTopologyNodePreview({\n width,\n height,\n size = 'md',\n showLabel = true,\n showStatus = false,\n ...rest\n}: StnTopologyNodePreviewProps) {\n const r = STN_TOPOLOGY_NODE_SIZE[size].r\n const w = width ?? r * 2 + (showLabel ? 88 : 28)\n const h = height ?? r * 2 + (showLabel || showStatus ? 56 : 28)\n return (\n <svg className=\"stn-topology-node-preview\" width={w} height={h} viewBox={`0 0 ${w} ${h}`} overflow=\"visible\">\n <StnTopologyNodeMark x={w / 2} y={h / 2} size={size} showLabel={showLabel} showStatus={showStatus} {...rest} />\n </svg>\n )\n}\n","import { useState, type CSSProperties, type HTMLAttributes } from 'react'\nimport { cn } from '../../cn'\nimport { StnSegmented } from '../StnSegmented'\nimport { StnTopologyNodeMark } from './StnTopologyNodeMark'\nimport {\n STN_TOPOLOGY_STATUS_COLORS,\n type StnTopologyNodeContent,\n type StnTopologyNodeIcon,\n type StnTopologyNodeShape,\n type StnTopologyNodeSize,\n type StnTopologyNodeStatus,\n} from './stnTopologyShared'\n\nexport type StnTopologyGraphNode = {\n id: string\n x: number\n y: number\n z?: number\n label?: string\n status?: StnTopologyNodeStatus\n statusLabel?: string\n isCore?: boolean\n color?: string\n pulse?: boolean\n shape?: StnTopologyNodeShape\n size?: StnTopologyNodeSize\n content?: StnTopologyNodeContent\n count?: number | string\n icon?: StnTopologyNodeIcon\n}\n\nexport type StnTopologyGraphLink = {\n source: string\n target: string\n status?: StnTopologyNodeStatus\n dashed?: boolean\n}\n\nexport type StnTopologyGraphProps = Omit<HTMLAttributes<HTMLDivElement>, 'title'> & {\n defaultMode?: '2D' | '3D'\n showModeToggle?: boolean\n showMinimap?: boolean\n nodes?: StnTopologyGraphNode[]\n links?: StnTopologyGraphLink[]\n nodeSize?: StnTopologyNodeSize\n selectedId?: string\n onNodeClick?: (node: StnTopologyGraphNode) => void\n loading?: boolean\n className?: string\n style?: CSSProperties\n}\n\nconst DEFAULT_GRAPH_NODES: StnTopologyGraphNode[] = [\n { id: 'n1', x: 200, y: 58, status: 'minor', label: 'GW-01', shape: 'circle', content: 'icon', icon: 'wifi' },\n { id: 'n2', x: 118, y: 118, status: 'critical', label: 'BACKUP', shape: 'hexagon', content: 'count', count: 4, pulse: true },\n { id: 'n3', x: 282, y: 118, status: 'critical', label: 'PROXY', shape: 'diamond', content: 'count', count: 2 },\n { id: 'core', x: 200, y: 158, isCore: true, status: 'normal', label: 'CORE', shape: 'diamond', size: 'lg' },\n { id: 'n4', x: 110, y: 210, status: 'normal', label: 'DB-01', shape: 'square', content: 'icon', icon: 'database' },\n { id: 'n5', x: 200, y: 248, status: 'major', label: 'NAS', shape: 'hexagon', content: 'count', count: 12 },\n { id: 'n6', x: 300, y: 210, status: 'normal', label: 'FW-01', shape: 'circle', content: 'icon', icon: 'shield' },\n]\n\nconst DEFAULT_GRAPH_LINKS: StnTopologyGraphLink[] = [\n { source: 'n1', target: 'n2' },\n { source: 'n1', target: 'n3' },\n { source: 'n2', target: 'core' },\n { source: 'n3', target: 'core' },\n { source: 'core', target: 'n4' },\n { source: 'core', target: 'n5' },\n { source: 'core', target: 'n6' },\n { source: 'n2', target: 'n4', dashed: true },\n]\n\n/**\n * StnTopologyGraph — 관제 2D/3D 퍼스펙티브 네트워크 토폴로지\n */\nexport function StnTopologyGraph({\n defaultMode = '3D',\n showModeToggle = true,\n showMinimap = true,\n nodes = DEFAULT_GRAPH_NODES,\n links = DEFAULT_GRAPH_LINKS,\n nodeSize = 'sm',\n selectedId,\n onNodeClick,\n loading = false,\n className,\n style,\n ...rest\n}: StnTopologyGraphProps) {\n const [viewMode, setViewMode] = useState<'2D' | '3D'>(defaultMode)\n\n if (loading) {\n return (\n <div className={cn('stn-topology-graph', 'stn-topology-graph--loading', className)} style={style} {...rest}>\n <div className=\"stn-topology-graph__loading-label\">토폴로지 캔버스 데이터를 불러오는 중...</div>\n </div>\n )\n }\n\n const nodeMap = new Map(nodes.map((n) => [n.id, n]))\n\n return (\n <div\n className={cn('stn-topology-graph', className)}\n style={style}\n data-stn-topology-graph\n data-view-mode={viewMode}\n {...rest}\n >\n {showModeToggle && (\n <div className=\"stn-topology-graph__mode\">\n <StnSegmented\n size=\"sm\"\n value={viewMode}\n onChange={(val) => setViewMode(val as '2D' | '3D')}\n options={[\n { value: '2D', label: '2D' },\n { value: '3D', label: '3D' },\n ]}\n />\n </div>\n )}\n\n <svg className=\"stn-topology-graph__svg\" width=\"100%\" height=\"100%\" viewBox=\"0 0 400 300\" overflow=\"visible\">\n {viewMode === '3D' ? (\n <g opacity=\"0.6\">\n <line x1=\"60\" y1=\"260\" x2=\"200\" y2=\"80\" stroke=\"rgba(255,255,255,0.06)\" strokeDasharray=\"3 3\" />\n <line x1=\"130\" y1=\"260\" x2=\"200\" y2=\"80\" stroke=\"rgba(255,255,255,0.08)\" strokeDasharray=\"3 3\" />\n <line x1=\"200\" y1=\"260\" x2=\"200\" y2=\"80\" stroke=\"rgba(255,255,255,0.14)\" strokeDasharray=\"3 3\" />\n <line x1=\"270\" y1=\"260\" x2=\"200\" y2=\"80\" stroke=\"rgba(255,255,255,0.08)\" strokeDasharray=\"3 3\" />\n <line x1=\"340\" y1=\"260\" x2=\"200\" y2=\"80\" stroke=\"rgba(255,255,255,0.06)\" strokeDasharray=\"3 3\" />\n <line x1=\"100\" y1=\"230\" x2=\"300\" y2=\"230\" stroke=\"rgba(255,255,255,0.06)\" />\n <line x1=\"130\" y1=\"190\" x2=\"270\" y2=\"190\" stroke=\"rgba(255,255,255,0.06)\" />\n <line x1=\"160\" y1=\"140\" x2=\"240\" y2=\"140\" stroke=\"rgba(255,255,255,0.06)\" />\n </g>\n ) : (\n <g opacity=\"0.3\">\n <line x1=\"40\" y1=\"60\" x2=\"360\" y2=\"60\" stroke=\"rgba(255,255,255,0.08)\" strokeDasharray=\"4 4\" />\n <line x1=\"40\" y1=\"150\" x2=\"360\" y2=\"150\" stroke=\"rgba(255,255,255,0.08)\" strokeDasharray=\"4 4\" />\n <line x1=\"40\" y1=\"240\" x2=\"360\" y2=\"240\" stroke=\"rgba(255,255,255,0.08)\" strokeDasharray=\"4 4\" />\n <line x1=\"100\" y1=\"20\" x2=\"100\" y2=\"280\" stroke=\"rgba(255,255,255,0.08)\" strokeDasharray=\"4 4\" />\n <line x1=\"200\" y1=\"20\" x2=\"200\" y2=\"280\" stroke=\"rgba(255,255,255,0.08)\" strokeDasharray=\"4 4\" />\n <line x1=\"300\" y1=\"20\" x2=\"300\" y2=\"280\" stroke=\"rgba(255,255,255,0.08)\" strokeDasharray=\"4 4\" />\n </g>\n )}\n\n {links.map((link, idx) => {\n const s = nodeMap.get(link.source)\n const t = nodeMap.get(link.target)\n if (!s || !t) return null\n\n const isAlert = s.status === 'critical' || t.status === 'critical' || link.status === 'critical'\n const strokeColor = isAlert ? 'rgba(255, 77, 79, 0.65)' : 'rgba(255, 255, 255, 0.2)'\n\n return (\n <line\n key={`link-${idx}`}\n x1={s.x}\n y1={s.y}\n x2={t.x}\n y2={t.y}\n stroke={strokeColor}\n strokeWidth={isAlert ? 2 : 1}\n strokeDasharray={link.dashed ? '4 4' : undefined}\n />\n )\n })}\n\n {nodes.map((node) => {\n const status = node.status ?? 'normal'\n const isCore = Boolean(node.isCore)\n\n return (\n <StnTopologyNodeMark\n key={node.id}\n x={node.x}\n y={node.y}\n size={node.size ?? (isCore ? 'lg' : nodeSize)}\n shape={node.shape ?? (isCore ? 'diamond' : 'circle')}\n status={status}\n color={node.color ?? (isCore ? '#00e5ff' : undefined)}\n content={node.content ?? (node.count != null && !node.icon ? 'count' : 'icon')}\n icon={node.icon}\n count={node.count}\n label={node.label}\n statusLabel={node.statusLabel}\n pulse={node.pulse}\n selected={selectedId === node.id}\n showStatus={false}\n onClick={onNodeClick ? () => onNodeClick(node) : undefined}\n />\n )\n })}\n </svg>\n\n {showMinimap && (\n <div className=\"stn-topology-graph__minimap\">\n <div className=\"stn-topology-graph__minimap-head\">\n <span>미리보기</span>\n <span>—</span>\n </div>\n <svg width=\"100%\" height=\"40\" viewBox=\"0 0 100 50\">\n <polyline points=\"50,10 40,25 50,40 60,30\" fill=\"none\" stroke=\"rgba(255,77,79,0.5)\" strokeWidth=\"1\" />\n <circle cx=\"50\" cy=\"10\" r=\"2\" fill={STN_TOPOLOGY_STATUS_COLORS.critical.main} />\n <circle cx=\"40\" cy=\"25\" r=\"2.5\" fill={STN_TOPOLOGY_STATUS_COLORS.critical.main} />\n <circle cx=\"50\" cy=\"40\" r=\"2\" fill=\"#00e5ff\" />\n <circle cx=\"60\" cy=\"30\" r=\"2\" fill={STN_TOPOLOGY_STATUS_COLORS.normal.main} />\n </svg>\n </div>\n )}\n </div>\n )\n}\n","import {\n Children,\n forwardRef,\n Fragment,\n isValidElement,\n type CSSProperties,\n type ElementType,\n type ReactNode,\n} from 'react'\n\nimport { cn } from '../cn'\n\nexport type StnStackDirection = 'row' | 'row-reverse' | 'column' | 'column-reverse'\nexport type StnStackBreakpoint = 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n/** 값 하나, 또는 xs 기본 · sm 768 · md 1024 · lg 1280 · xl 1440 */\nexport type StnStackResponsive<T> = T | Partial<Record<StnStackBreakpoint, T>>\nexport type StnStackWrap = 'nowrap' | 'wrap' | 'wrap-reverse'\nexport type StnStackScrollable = boolean | 'auto' | 'y' | 'x'\n\nconst BREAKPOINTS = ['xs', 'sm', 'md', 'lg', 'xl'] as const\nconst DIRECTION_CLASS = new Set<StnStackDirection>(['row', 'row-reverse', 'column', 'column-reverse'])\n\nexport type StnStackProps<T extends ElementType = 'div'> = {\n /** 렌더링할 HTML 태그 또는 컴포넌트 (기본: 'div') */\n component?: T\n /** @alias component */\n as?: T\n /**\n * 플렉스 방향. 브레이크포인트 맵이면 xs가 기본이다.\n * `direction={{ xs: 'column', sm: 'row' }}`\n * @default 'column'\n */\n direction?: StnStackResponsive<StnStackDirection>\n /**\n * 아이템 간격.\n * 숫자는 8px 스텝으로 `.stn-stack--spacing-*`가 `--stn-spacing-stack-*`를 고른다.\n * `1` → `--stn-spacing-stack-8`. `spacing={{ xs: 1, sm: 2, md: 4 }}`\n * @default 0\n */\n spacing?: StnStackResponsive<number | string>\n /** 가로/세로 정렬 */\n alignItems?: CSSProperties['alignItems']\n /** 주축 정렬 */\n justifyContent?: CSSProperties['justifyContent']\n /** 줄바꿈 여부 */\n wrap?: StnStackWrap\n /**\n * 스크롤 가능 여부 및 축\n * - true | 'auto' | 'y': 세로 스크롤 (overflow-y: auto, overflow-x: hidden, min-height: 0, flex: 1 1 0%)\n * - 'x': 가로 스크롤 (overflow-x: auto, overflow-y: hidden, min-width: 0)\n */\n scrollable?: StnStackScrollable\n /**\n * 주축 방향으로 자식을 균등 분할 (`.is-fill`).\n * L1 높이 체인 안에서 위젯·패널을 세로/가로로 나눠 채울 때 사용.\n */\n fill?: boolean\n /**\n * 자식 사이에 끼우는 구분선. 선 자체에는 간격을 넣지 않습니다.\n * `spacing`(gap)이 선 양쪽에 그대로 적용됩니다.\n */\n divider?: ReactNode\n className?: string\n style?: CSSProperties\n children?: ReactNode\n} & Omit<React.ComponentPropsWithoutRef<T>, 'as' | 'component' | 'children' | 'className' | 'style'>\n\nconst STACK_SPACE_TOKENS = new Set([2, 4, 6, 8, 10, 12, 14, 16, 20, 24, 32, 36, 40, 44, 48, 56, 64, 80, 84])\n\nconst JUSTIFY_CLASS = new Set([\n 'flex-start',\n 'center',\n 'flex-end',\n 'space-between',\n 'space-around',\n 'space-evenly',\n])\n\nconst ALIGN_CLASS = new Set(['flex-start', 'center', 'flex-end', 'stretch', 'baseline'])\n\nfunction isResponsiveObject<T>(value: StnStackResponsive<T>): value is Partial<Record<StnStackBreakpoint, T>> {\n return typeof value === 'object' && value !== null\n}\n\nfunction directionClasses(direction: StnStackResponsive<StnStackDirection> = 'column') {\n const resolved = isResponsiveObject(direction) ? direction : { xs: direction }\n const classes: string[] = []\n if (!resolved.xs) classes.push('stn-stack--direction-column')\n for (const bp of BREAKPOINTS) {\n const next = resolved[bp]\n if (!next || !DIRECTION_CLASS.has(next)) continue\n classes.push(bp === 'xs' ? `stn-stack--direction-${next}` : `stn-stack--direction-${bp}-${next}`)\n }\n return classes\n}\n\nconst DIRECT_PX_TO_STEP: Record<number, number> = {\n 2: 0.25,\n 4: 0.5,\n 6: 0.75,\n 8: 1,\n 10: 1.25,\n 12: 1.5,\n 14: 1.75,\n 16: 2,\n 20: 2.5,\n 24: 3,\n 32: 4,\n 36: 4.5,\n 40: 5,\n 44: 5.5,\n 48: 6,\n 56: 7,\n 64: 8,\n 80: 10,\n 84: 10.5,\n}\n\nfunction normalizeSpacingVal(val: number | string): number | string {\n if (typeof val === 'string') {\n const parsed = parseFloat(val)\n if (!Number.isNaN(parsed)) {\n if (val.endsWith('px') && DIRECT_PX_TO_STEP[parsed] != null) {\n return DIRECT_PX_TO_STEP[parsed]\n }\n return parsed\n }\n }\n return val\n}\n\nfunction resolveSpacing(val: number | string): { slug?: string; inlineGap?: string } {\n if (val === 0 || val === '0' || val === '0px') return { slug: '0' }\n const norm = normalizeSpacingVal(val)\n if (typeof norm === 'number') {\n // 1. Direct step match (e.g. 1 -> 8px, 1.5 -> 12px, 2 -> 16px)\n const px = norm * 8\n if (Number.isFinite(px) && Number.isInteger(px) && STACK_SPACE_TOKENS.has(px)) {\n return { slug: String(norm).replace('.', '-') }\n }\n // 2. Direct px number match (e.g. 12 -> step 1.5 -> 12px)\n if (DIRECT_PX_TO_STEP[norm] != null) {\n const step = DIRECT_PX_TO_STEP[norm]\n return { slug: String(step).replace('.', '-') }\n }\n // 3. Fallback arbitrary number\n return { inlineGap: `${norm}px` }\n }\n return { inlineGap: String(val) }\n}\n\nfunction spacingClassesAndStyle(spacing: StnStackResponsive<number | string> | undefined) {\n if (spacing == null) return { classes: [], inlineGap: undefined }\n const resolved = isResponsiveObject(spacing) ? spacing : { xs: spacing }\n const classes: string[] = []\n let inlineGap: string | undefined\n\n for (const bp of BREAKPOINTS) {\n const next = resolved[bp]\n if (next == null) continue\n const res = resolveSpacing(next)\n if (res.slug) {\n classes.push(bp === 'xs' ? `stn-stack--spacing-${res.slug}` : `stn-stack--spacing-${bp}-${res.slug}`)\n } else if (bp === 'xs' && res.inlineGap) {\n inlineGap = res.inlineGap\n }\n }\n return { classes, inlineGap }\n}\n\n/**\n * 1차원 Flex 스택 레이아웃 컴포넌트.\n * 수직/수평 방향(direction), 간격(spacing), 구분선(divider)을 쉽게 다룰 수 있습니다.\n */\nexport const StnStack = forwardRef(function StnStack<T extends ElementType = 'div'>(\n {\n component,\n as,\n direction = 'column',\n spacing = 0,\n alignItems,\n justifyContent,\n wrap,\n scrollable,\n fill = false,\n divider,\n className,\n style,\n children,\n ...rest\n }: StnStackProps<T>,\n ref: React.ForwardedRef<any>,\n) {\n const Component = component ?? as ?? 'div'\n const isScrollY = scrollable === true || scrollable === 'auto' || scrollable === 'y'\n const isScrollX = scrollable === 'x'\n const justify = typeof justifyContent === 'string' && JUSTIFY_CLASS.has(justifyContent) ? justifyContent : undefined\n const align = typeof alignItems === 'string' && ALIGN_CLASS.has(alignItems) ? alignItems : undefined\n\n const { classes: spacingClass, inlineGap } = spacingClassesAndStyle(spacing)\n const mergedStyle = inlineGap ? { gap: inlineGap, ...style } : style\n\n const validChildren = Children.toArray(children).filter(Boolean)\n const renderedChildren = divider\n ? validChildren.map((child, index) => {\n const key = isValidElement(child) && child.key != null ? child.key : index\n return (\n <Fragment key={key}>\n {index > 0 ? divider : null}\n {child}\n </Fragment>\n )\n })\n : children\n\n return (\n <Component\n ref={ref}\n className={cn(\n 'stn-stack',\n ...directionClasses(direction),\n ...spacingClass,\n wrap && `stn-stack--wrap-${wrap}`,\n justify && `stn-stack--justify-${justify}`,\n align && `stn-stack--align-${align}`,\n isScrollY && 'is-scrollable',\n isScrollX && 'is-scrollable-x',\n fill && 'is-fill',\n className,\n )}\n style={mergedStyle}\n {...rest}\n >\n {renderedChildren}\n </Component>\n )\n})\n","import { StnWidget, type StnWidgetAppearance } from '../../components/StnWidget'\nimport { StnStack } from '../../layouts/StnStack'\nimport { StnLoadingSkeleton } from '../scaffold/StnLoadingSkeleton'\n\nconst TOP5_ROWS = [\n { label: '그랑시아', percent: 80, value: '80건', grade: 'critical' as const },\n { label: '연립주택 15세대', percent: 74, value: '74건', grade: 'major' as const },\n { label: '영동고등학교', percent: 69, value: '69건', grade: 'major' as const },\n { label: '리오빌딩', percent: 69, value: '69건', grade: 'minor' as const },\n { label: 'PRADA', percent: 68, value: '68건', grade: 'default' as const },\n]\n\nexport type AlertCenterDashboardProps = {\n className?: string\n appearance?: StnWidgetAppearance\n /** 위젯 본문 로딩 스켈레톤 표출 유무 */\n loading?: boolean\n}\n\n/**\n * alert_center 우측 위젯 묶음 — `.dashboard_right` 슬롯(StnDashboard.Right) 안에 넣음\n */\nexport function AlertCenterDashboard({ className, appearance = 'translucent', loading = false }: AlertCenterDashboardProps) {\n return (\n <StnStack\n direction=\"column\"\n spacing={1}\n className={className}\n style={{ flex: '1 1 0%', minHeight: 0, height: '100%', width: '100%' }}\n data-stn-dashboard=\"alert-widgets\"\n >\n <StnWidget title=\"시설 현황\" appearance={appearance} interactive>\n {loading ? (\n <StnLoadingSkeleton.Widget lines={3} />\n ) : (\n <StnWidget.StatusList>\n <StnWidget.StatusItem label=\"PTN\" value=\"179\" showDot={false} />\n <StnWidget.StatusItem label=\"MSPP\" value=\"63\" showDot={false} />\n <StnWidget.StatusItem label=\"L3스위치\" value=\"27\" showDot={false} />\n </StnWidget.StatusList>\n )}\n </StnWidget>\n\n <StnWidget title=\"장애 현황\" appearance={appearance} interactive>\n {loading ? (\n <StnLoadingSkeleton.Widget lines={3} />\n ) : (\n <StnWidget.StatusList>\n <StnWidget.StatusItem label=\"Critical\" value=\"43\" grade=\"critical\" />\n <StnWidget.StatusItem label=\"Major\" value=\"79\" grade=\"major\" />\n <StnWidget.StatusItem label=\"Minor\" value=\"3\" grade=\"minor\" />\n </StnWidget.StatusList>\n )}\n </StnWidget>\n\n <StnWidget title=\"일일 장비별 장애 TOP5\" appearance={appearance} interactive>\n {loading ? (\n <StnLoadingSkeleton.Widget lines={4} />\n ) : (\n <StnWidget.GradeRowList>\n {TOP5_ROWS.map((row) => (\n <StnWidget.GradeRow\n key={row.label}\n grade={row.grade}\n label={row.label}\n value={row.value}\n percent={row.percent}\n />\n ))}\n </StnWidget.GradeRowList>\n )}\n </StnWidget>\n\n <StnWidget title=\"일일 장애 통계\" appearance={appearance} interactive>\n {loading ? (\n <StnLoadingSkeleton.Widget lines={3} />\n ) : (\n <StnWidget.ChartSlot label=\"일일 장애 통계 차트\" />\n )}\n </StnWidget>\n </StnStack>\n )\n}\n","import type { CSSProperties, ReactNode } from 'react'\r\n\r\n/** Pub dashboard_right 위젯 본문 — alert_center.html · dashboard-map.html 공통 마크업 */\r\n\r\nexport type PubDisabilityStatusItem = {\r\n label: ReactNode\r\n value: ReactNode\r\n grade?: 'critical' | 'major' | 'minor' | 'warning' | 'normal'\r\n showDot?: boolean\r\n}\r\n\r\ntype PubDisabilityStatusListProps = {\r\n items: PubDisabilityStatusItem[]\r\n summary?: { label: string; value: ReactNode }[]\r\n}\r\n\r\nexport function PubDisabilityStatusList({ items, summary }: PubDisabilityStatusListProps) {\r\n return (\r\n <div className=\"ds-disability-status\">\r\n <ul className=\"ds-disability-status__list\">\r\n {items.map((item, i) => (\r\n <li\r\n key={i}\r\n className={['ds-disability-status__item', item.grade].filter(Boolean).join(' ')}\r\n >\r\n <span>\r\n {item.showDot !== false && item.grade ? <span className=\"dot\" aria-hidden /> : null}\r\n {item.label}\r\n </span>\r\n <p>{item.value}</p>\r\n </li>\r\n ))}\r\n </ul>\r\n {summary && summary.length > 0 ? (\r\n <div className=\"ds-disability-status__summary\">\r\n {summary.map((row, i) => (\r\n <p key={i} className=\"ds-disability-status__value\">\r\n {row.label}\r\n <span>{row.value}</span>\r\n </p>\r\n ))}\r\n </div>\r\n ) : null}\r\n </div>\r\n )\r\n}\r\n\r\nexport type PubTop5BarRow = { label: string; percent: number; status: string }\r\n\r\nexport type PubTrafficTop5BarRow = { label: string; percent: number; value: string }\r\n\r\nexport function PubTrafficTop5Bars({ rows }: { rows: PubTrafficTop5BarRow[] }) {\r\n const maxPercent = Math.max(...rows.map((row) => row.percent), 0)\r\n return (\r\n <div className=\"ds-bar-group\">\r\n {rows.map((row) => (\r\n <div key={row.label} className={['ds-bar', row.percent === maxPercent ? 'max' : ''].filter(Boolean).join(' ')}>\r\n <p className=\"ds-bar-name\" title={row.label}>\r\n {row.label}\r\n </p>\r\n <div className=\"ds-bar-con\" title={`${row.percent}%`}>\r\n <span className=\"ds-bar-gauge\" style={{ '--percent': `${row.percent}%` } as CSSProperties} />\r\n </div>\r\n <p className=\"ds-bar-value\" title={row.value}>\r\n {row.value}\r\n </p>\r\n </div>\r\n ))}\r\n </div>\r\n )\r\n}\r\n\r\nexport function PubTop5EquipmentBars({ rows }: { rows: PubTop5BarRow[] }) {\r\n return (\r\n <div className=\"ds-group\">\r\n <div className=\"ds-group-box\">\r\n <div className=\"ds-equipment-ico\">\r\n <span className=\"blind\">장비 이미지</span>\r\n </div>\r\n </div>\r\n <div className=\"ds-group-box\">\r\n <div className=\"ds-bar-group\">\r\n {rows.map((row) => (\r\n <div key={row.label} className=\"ds-bar type-2\">\r\n <div className=\"ds-bar-con\" title={`${row.percent}%`}>\r\n <span className=\"ds-bar-gauge\" style={{ '--percent': `${row.percent}%` } as CSSProperties} />\r\n <div className=\"ds-bar-status\">{row.status}</div>\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\nexport function PubChartSample({\r\n src,\r\n alt = '차트',\r\n onError,\r\n}: {\r\n src: string\r\n alt?: string\r\n onError?: () => void\r\n}) {\r\n return (\r\n <div className=\"ds-chart\">\r\n <img src={src} alt={alt} className=\"chart_sample\" onError={onError} />\r\n </div>\r\n )\r\n}\r\n","import { useId, useState } from 'react'\n\nimport type {\n StnAlertCenterAlertItem,\n StnAlertCenterTab,\n StnAlertCenterWorkItem,\n} from '@stn-uiux/pub-ui/data/stnAlertCenter'\nimport {\n STN_ALERT_CENTER_TAB_IDS,\n STN_ALERT_CENTER_TABS,\n} from '@stn-uiux/pub-ui/data/stnAlertCenter'\n\nimport { cn } from '../../cn'\nimport { StnChip } from '../../components/StnChip'\nimport { StnButton } from '../../components/StnButton'\n\nexport type StnAlertCenterPanelProps = {\n title?: string\n alerts?: StnAlertCenterAlertItem[]\n workItems?: StnAlertCenterWorkItem[]\n deployItems?: StnAlertCenterWorkItem[]\n defaultTab?: StnAlertCenterTab\n /** Pub `:has(#gnb-alert-tab-*)` — 기본 Pub id 사용 권장 */\n tabIds?: Partial<Record<StnAlertCenterTab, string>>\n tabName?: string\n onClose?: () => void\n closeLabel?: string\n className?: string\n}\n\nfunction listWrapStyle(active: boolean): React.CSSProperties | undefined {\n return active ? undefined : { display: 'none' }\n}\n\nexport function StnAlertCenterPanel({\n title = '알림센터',\n alerts = [],\n workItems = [],\n deployItems = [],\n defaultTab = 'error',\n tabIds,\n tabName: tabNameProp,\n onClose,\n closeLabel = '닫기',\n className,\n}: StnAlertCenterPanelProps) {\n const uid = useId().replace(/:/g, '')\n const tabName = tabNameProp ?? `gnb-alert-status-${uid}`\n const [activeTab, setActiveTab] = useState<StnAlertCenterTab>(defaultTab)\n\n const ids = {\n error: tabIds?.error ?? STN_ALERT_CENTER_TAB_IDS.error,\n work: tabIds?.work ?? STN_ALERT_CENTER_TAB_IDS.work,\n deploy: tabIds?.deploy ?? STN_ALERT_CENTER_TAB_IDS.deploy,\n }\n\n return (\n <div className={cn('stn-alert-center gnb_alert_modal', className)} data-stn-alert-center>\n <div className=\"stn-alert-center__header alert_header\">\n <div className=\"stn-alert-center__header-left header_left\">\n <span className=\"stn-alert-center__title title\">{title}</span>\n <div className=\"stn-alert-center__toggle alert_toggle\">\n {STN_ALERT_CENTER_TABS.map((tab) => (\n <span key={tab.id}>\n <input\n type=\"radio\"\n id={ids[tab.id]}\n name={tabName}\n checked={activeTab === tab.id}\n onChange={() => setActiveTab(tab.id)}\n />\n <label htmlFor={ids[tab.id]}>{tab.label}</label>\n </span>\n ))}\n </div>\n </div>\n <StnButton\n icon=\"line/x\"\n variant=\"ghost\"\n size=\"small\"\n className=\"stn-alert-center__close close_alert_modal\"\n aria-label={closeLabel}\n onClick={onClose}\n />\n </div>\n\n <div className=\"stn-alert-center__list-wrap alert_list_wrap\" style={listWrapStyle(activeTab === 'error')}>\n <ul className=\"stn-alert-center__list alert_list\">\n {alerts.map((row) => (\n <li key={row.id ?? row.title} className=\"stn-alert-center__item alert_item\">\n <span className=\"stn-alert-center__dot dot\" aria-hidden />\n <StnChip grade={row.grade} />\n <span title={row.title} className=\"stn-alert-center__title-cell title_cell\">\n {row.title}\n </span>\n <span className=\"stn-alert-center__desc-cell desc_cell\">{row.description}</span>\n <span className=\"stn-alert-center__time-cell time_cell\">{row.time}</span>\n </li>\n ))}\n </ul>\n </div>\n\n <div className=\"stn-alert-center__list-wrap work_list_wrap\" style={listWrapStyle(activeTab === 'work')}>\n <ul className=\"stn-alert-center__list work_list\">\n {workItems.map((row) => (\n <li key={row.id ?? `${row.typeLabel}-${row.time}`} className=\"stn-alert-center__item work_item\">\n <span className=\"stn-alert-center__dot dot\" aria-hidden />\n <span className=\"stn-alert-center__work-type work_type\">{row.typeLabel}</span>\n <span className=\"stn-alert-center__work-text work_text\">{row.text}</span>\n <span className=\"stn-alert-center__time-cell time_cell\">{row.time}</span>\n </li>\n ))}\n </ul>\n </div>\n\n <div className=\"stn-alert-center__list-wrap deploy_list_wrap\" style={listWrapStyle(activeTab === 'deploy')}>\n <ul className=\"stn-alert-center__list work_list\">\n {deployItems.map((row) => (\n <li key={row.id ?? `${row.typeLabel}-${row.time}`} className=\"stn-alert-center__item work_item\">\n <span className=\"stn-alert-center__dot dot\" aria-hidden />\n <span className=\"stn-alert-center__work-type work_type\">{row.typeLabel}</span>\n <span className=\"stn-alert-center__work-text work_text\">{row.text}</span>\n <span className=\"stn-alert-center__time-cell time_cell\">{row.time}</span>\n </li>\n ))}\n </ul>\n </div>\n\n </div>\n )\n}\n","import type { ReactNode } from 'react'\n\nimport type { StnTheme } from '../../StnContext'\nimport { StnProvider } from '../../StnProvider'\nimport { StnAlertCenterPanel, type StnAlertCenterPanelProps } from './StnAlertCenterPanel'\n\nexport type StnAlertCenterDocPreviewProps = StnAlertCenterPanelProps & {\n theme?: StnTheme\n /** DS iframe·Color doc용 GNB 크롬 래퍼 */\n withDocChrome?: boolean\n children?: ReactNode\n}\n\n/**\n * 문서·데모 — `stn-doc-frame--alert-center` + SideNav bottom shell.\n * 제품 앱에서는 `StnSideNavigation` bottom 슬롯에 `StnAlertCenterPanel`만 넣으면 됩니다.\n */\nexport function StnAlertCenterDocPreview({\n theme = 'light',\n withDocChrome = true,\n children,\n ...panelProps\n}: StnAlertCenterDocPreviewProps) {\n const panel = children ?? <StnAlertCenterPanel {...panelProps} />\n\n if (!withDocChrome) {\n return (\n <StnProvider theme={theme} applyThemeToDocument={false}>\n {panel}\n </StnProvider>\n )\n }\n\n return (\n <div className=\"stn-doc-frame stn-doc-frame--alert-center\" data-theme={theme}>\n <div className=\"stn-alert-center-preview-shell\">\n {panel}\n </div>\n </div>\n )\n}\n","import { createContext, useContext } from 'react'\n\nexport type SideNavContextValue = {\n collapsed: boolean\n activeId?: string\n onSelect?: (id: string) => void\n onToggleCollapse?: () => void\n mobileOpen?: boolean\n onToggleMobileOpen?: () => void\n setMobileOpen?: (open: boolean) => void\n isDrawer?: boolean\n}\n\nexport const SideNavContext = createContext<SideNavContextValue>({\n collapsed: false,\n mobileOpen: false,\n})\n\nexport const useSideNav = () => useContext(SideNavContext)\n\n","import { forwardRef, type ButtonHTMLAttributes, type MouseEvent, type ReactNode } from 'react'\n\nimport { STN_NAV_MENU_SUB_ICON } from '@stn-uiux/pub-ui/data/stnSideNavItem'\n\nimport { cn } from '../../cn'\nimport type { StnWithoutStyle } from '../../stnStrictProps'\nimport { StnBadge } from '../StnBadge'\nimport { useSideNav } from './SideNavContext'\n\nexport type StnSideNavItemVariant = 'item' | 'sub'\nexport type StnSideNavItemIconPosition = 'left' | 'right'\n\nexport type StnSideNavItemProps = StnWithoutStyle<Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'children'>> & {\n label: string\n id?: string\n /** 1depth line icon (mask URL) 또는 2depth sub-icon mask URL */\n iconSrc?: string\n /** active 시 대체 아이콘 — Figma apps gradient URL */\n activeIconSrc?: string\n /** ReactNode 커스텀 아이콘 (1depth 및 2depth sub-icon 모두 지원) */\n icon?: ReactNode\n /** 아이콘 위치 — 기본 left, 우측 배치 시 'right' */\n iconPosition?: StnSideNavItemIconPosition\n variant?: StnSideNavItemVariant\n /** 선택됨 (Figma의 state=clicked 동일) */\n active?: boolean\n /** Figma state=clicked 지원용 별칭 (active와 동일하게 동작) */\n clicked?: boolean\n /** hover 가상 상태 강제 적용 (문서/데모용) */\n hovered?: boolean\n /** 사이드바 접힘 여부 (미지정 시 SideNavContext 값 사용) */\n collapsed?: boolean\n /** 하위 메뉴 존재 표시 (chevron 꺽쇠) — 1depth/2depth 모두 지원 */\n showChevron?: boolean\n /** 하위 메뉴 펼침 여부 (chevron 회전) */\n chevronOpen?: boolean\n /** chevron 기본 방향 및 펼침 방향 (기본: 'down', 위로 펼쳐지는 경우 'up') */\n chevronDirection?: 'down' | 'up'\n /** 숫자/텍스트 배지 (StnBadge 자동 연동) 또는 StnBadge 컴포넌트 직주입 — 1depth/2depth 모두 지원 */\n badge?: ReactNode\n /** 점 배지 표시 (StnBadge dot) */\n showBadgeDot?: boolean\n /** 2depth 서브 도트(stn-side-nav-item__sub-dot) 표시 여부 (기본값: icon이 없으면 true, icon이 있으면 false. 둘 다 원할 시 true 지정) */\n showSubDot?: boolean\n /** 2depth 서브 들여쓰기(stn-side-nav-item__sub-indent) 표시 여부 (기본값: variant=\"sub\"일 때 true) */\n showSubIndent?: boolean\n}\n\nfunction maskStyle(src: string) {\n return { maskImage: `url('${src}')`, WebkitMaskImage: `url('${src}')` } as const\n}\n\n/**\n * SideNav 메뉴 행 항목 컴포넌트 — 1depth 및 2depth sub 지원\n */\nexport const StnSideNavItem = forwardRef<HTMLButtonElement, StnSideNavItemProps>(function StnSideNavItem(\n {\n label,\n id,\n iconSrc,\n activeIconSrc,\n icon,\n iconPosition = 'left',\n variant = 'item',\n active: activeProp,\n clicked = false,\n hovered = false,\n collapsed: collapsedProp,\n showChevron = false,\n chevronOpen = false,\n chevronDirection = 'down',\n badge,\n showBadgeDot = false,\n showSubDot,\n showSubIndent = true,\n className,\n type = 'button',\n onClick,\n ...rest\n },\n ref,\n) {\n const sideNav = useSideNav()\n const collapsed = collapsedProp ?? sideNav.collapsed ?? false\n const active = Boolean(activeProp || clicked || (id != null && sideNav.activeId != null ? sideNav.activeId === id : false))\n\n const isSub = variant === 'sub'\n const hasIcon = Boolean(icon || iconSrc)\n const resolvedIconSrc = active && activeIconSrc ? activeIconSrc : iconSrc\n\n // 2depth 서브 도트 표시 여부: 명시적 prop이 있으면 그 값 사용, 없으면 icon이 없을 때 기본 표시\n const shouldShowSubDot = isSub && (showSubDot !== undefined ? showSubDot : !hasIcon)\n\n const hasBadge = badge !== undefined && badge !== null && badge !== ''\n /** 접힘: dot 배지 오버레이 */\n const showDot = collapsed && (hasBadge || showBadgeDot)\n /** 펼침: 숫자/텍스트 배지 또는 도트 배지 */\n const renderBadge = !collapsed && (hasBadge || showBadgeDot)\n\n const spreadTrail = Boolean(\n (!isSub && showChevron && !collapsed) ||\n renderBadge ||\n (iconPosition === 'right' && hasIcon),\n )\n\n const handleClick = (e: MouseEvent<HTMLButtonElement>) => {\n onClick?.(e)\n if (id && sideNav.onSelect) {\n sideNav.onSelect(id)\n }\n }\n\n // 1depth 전용 아이콘\n const iconElement = hasIcon && !isSub ? (\n <span className=\"stn-side-nav-item__icon-wrap\">\n <span className=\"stn-side-nav-item__icon\" aria-hidden=\"true\">\n {icon ??\n (resolvedIconSrc ? (\n <span className=\"stn-side-nav-item__icon-glyph\" style={maskStyle(resolvedIconSrc)} />\n ) : null)}\n </span>\n {showDot ? (\n <span className=\"stn-side-nav-item__dot-wrap\" aria-hidden=\"true\">\n <StnBadge variant=\"dot\" color=\"error\" />\n </span>\n ) : null}\n </span>\n ) : null\n\n // 2depth 전용 서브 아이콘\n const subIconElement = hasIcon && isSub ? (\n <span className=\"stn-side-nav-item__sub-icon\" aria-hidden=\"true\">\n {icon ??\n (resolvedIconSrc ? (\n <span className=\"stn-side-nav-item__icon-glyph\" style={maskStyle(resolvedIconSrc)} />\n ) : null)}\n </span>\n ) : null\n\n const activeIconElement = isSub ? subIconElement : iconElement\n\n return (\n <button\n ref={ref}\n type={type}\n className={cn(\n 'stn-side-nav-item',\n isSub && 'sub',\n active && 'active',\n hovered && 'hovered',\n collapsed && 'collapsed',\n active && activeIconSrc && 'gradient-icon',\n iconPosition === 'right' && 'icon-right',\n className,\n )}\n aria-current={active ? 'page' : undefined}\n title={collapsed ? label : undefined}\n onClick={handleClick}\n {...rest}\n >\n <span className={cn('stn-side-nav-item__inner', spreadTrail && 'spread')}>\n <span className=\"stn-side-nav-item__lead\">\n {isSub && showSubIndent ? <span className=\"stn-side-nav-item__sub-indent\" aria-hidden=\"true\" /> : null}\n {shouldShowSubDot ? (\n <span\n className={cn(\n 'stn-side-nav-item__sub-dot',\n hasIcon && iconPosition === 'left' && 'compact',\n )}\n aria-hidden=\"true\"\n >\n <span className=\"stn-side-nav-item__sub-dot-glyph\" style={maskStyle(STN_NAV_MENU_SUB_ICON)} />\n </span>\n ) : null}\n {iconPosition === 'left' ? activeIconElement : null}\n <span className=\"stn-side-nav-item__label\">{label}</span>\n </span>\n {iconPosition === 'right' ? activeIconElement : null}\n {renderBadge ? (\n typeof badge === 'string' || typeof badge === 'number' ? (\n <StnBadge\n badgeContent={badge}\n color=\"error\"\n appearance=\"subtle\"\n className=\"stn-side-nav-item__badge\"\n />\n ) : badge ? (\n <span className=\"stn-side-nav-item__badge\">{badge}</span>\n ) : showBadgeDot ? (\n <StnBadge\n variant=\"dot\"\n color=\"error\"\n className=\"stn-side-nav-item__badge\"\n />\n ) : null\n ) : null}\n {!isSub && showChevron && !collapsed ? (\n <span\n className={cn(\n 'stn-side-nav-item__chevron',\n chevronDirection === 'up' && 'up',\n chevronOpen && (chevronDirection === 'up' ? 'up open' : 'open'),\n )}\n aria-hidden=\"true\"\n />\n ) : null}\n </span>\n </button>\n )\n})\n","import { forwardRef, type HTMLAttributes, type ReactNode } from 'react'\n\nimport { cn } from '../../cn'\nimport { StnButton } from '../StnButton'\nimport { useSideNav } from './SideNavContext'\nimport { StnSideNavLogo } from './StnSideNavLogo'\n\nexport type StnSideNavHeaderProps = HTMLAttributes<HTMLDivElement> & {\n children?: ReactNode\n /** 하단 경계선(divider/border) 표시 여부 (기본값: false, 목업 규격 준수) */\n border?: boolean\n /** border 별칭 */\n hasBorder?: boolean\n /** 접기/펼치기 토글 버튼 표시 여부 @default true */\n showToggle?: boolean\n /** 드로어 모드 닫기 버튼 표시 여부 (드로어 활성화 시 기본 true) */\n showClose?: boolean\n}\n\n/**\n * SideNav 상단 헤더 영역\n * - 가운데: InfoMap 브랜드 로고 (펼침: horizontal, 접힘: onlyimg 자동 전환)\n * - 우측 플로팅: 표준 StnButton 기반 접기/펼치기 아이콘 버튼 또는 드로어 닫기 버튼\n * - 경계선: border / hasBorder prop으로 하단 구분선 유무 제어 가능 (기본값: false)\n */\nexport const StnSideNavHeader = forwardRef<HTMLDivElement, StnSideNavHeaderProps>(function StnSideNavHeader(\n {\n children,\n border = false,\n hasBorder = false,\n showToggle = true,\n showClose,\n className,\n ...rest\n },\n ref,\n) {\n const { collapsed, onToggleCollapse, isDrawer, setMobileOpen } = useSideNav()\n const withBorder = Boolean(border || hasBorder)\n const shouldShowClose = showClose ?? Boolean(isDrawer)\n\n return (\n <div\n ref={ref}\n className={cn(\n 'stn-side-nav__header',\n collapsed && 'collapsed',\n withBorder && 'has-border',\n className,\n )}\n {...rest}\n >\n {children ?? (\n <>\n <StnSideNavLogo />\n {shouldShowClose ? (\n <StnButton\n size=\"sm\"\n variant=\"ghost\"\n shape=\"square\"\n icon=\"line/x\"\n aria-label=\"사이드바 닫기\"\n title=\"사이드바 닫기\"\n className=\"stn-side-nav__collapse-btn\"\n onClick={() => setMobileOpen?.(false)}\n />\n ) : showToggle ? (\n <StnButton\n size=\"sm\"\n variant=\"ghost\"\n shape=\"square\"\n icon={collapsed ? 'line/arrow-right' : 'line/arrow-left'}\n aria-label={collapsed ? '사이드바 펼치기' : '사이드바 접기'}\n title={collapsed ? '사이드바 펼치기' : '사이드바 접기'}\n className=\"stn-side-nav__collapse-btn\"\n onClick={onToggleCollapse}\n />\n ) : null}\n </>\n )}\n </div>\n )\n})\n\n","import { forwardRef, type HTMLAttributes } from 'react'\n\nimport { cn } from '../../cn'\nimport { StnLogo, type StnLogoProps } from '../StnLogo'\nimport { useSideNav } from './SideNavContext'\n\nexport type StnSideNavLogoProps = HTMLAttributes<HTMLDivElement> & {\n logoProps?: Partial<StnLogoProps>\n}\n\n/**\n * 사이드바 로고 영역\n * - 펼침 상태: InfoMap 가로 로고 (horizontal)\n * - 접힘 상태: logo-onlyimg 심볼 (onlyimg)로 자동 대체\n */\nexport const StnSideNavLogo = forwardRef<HTMLDivElement, StnSideNavLogoProps>(\n function StnSideNavLogo({ className, logoProps, ...rest }, ref) {\n const { collapsed } = useSideNav()\n\n return (\n <div\n ref={ref}\n className={cn(\n 'stn-side-nav__logo-wrap',\n collapsed ? 'collapsed' : null,\n className,\n )}\n title=\"InfoMap\"\n {...rest}\n >\n <StnLogo\n variant={collapsed ? 'onlyimg' : 'horizontal'}\n size={collapsed ? 'md' : 'sm'}\n {...logoProps}\n />\n </div>\n )\n },\n)\n\n","import { forwardRef, type HTMLAttributes, type ReactNode } from 'react'\n\nimport { cn } from '../../cn'\nimport type { StnScrollColor, StnScrollSize } from '../StnScroll'\n\nexport type StnSideNavMenuProps = HTMLAttributes<HTMLElement> & {\n children?: ReactNode\n /** StnScroll 두께 프리셋 ('thin' | 'default' | 'thick') @default 'thin' */\n scrollSize?: StnScrollSize\n /** StnScroll 색상/스타일 프리셋 ('default' | 'primary' | 'teal' | 'muted' | 'fade') @default 'fade' */\n scrollColor?: StnScrollColor\n}\n\n/**\n * SideNav 메인 내비게이션 메뉴 컨테이너 (`<nav>`)\n * - STN StnScroll (.stn-scroll) 커스텀 스크롤바 내장\n */\nexport const StnSideNavMenu = forwardRef<HTMLElement, StnSideNavMenuProps>(function StnSideNavMenu(\n {\n children,\n className,\n scrollSize = 'thin',\n scrollColor = 'fade',\n ...rest\n },\n ref,\n) {\n return (\n <nav\n ref={ref}\n className={cn(\n 'stn-side-nav__menu',\n 'stn-scroll',\n 'stn-scroll--vertical',\n scrollSize && `stn-scroll--${scrollSize}`,\n scrollColor && `stn-scroll--${scrollColor}`,\n className,\n )}\n aria-label=\"사이드 내비게이션\"\n {...rest}\n >\n {children}\n </nav>\n )\n})\n","import {\n forwardRef,\n useEffect,\n useRef,\n useState,\n type HTMLAttributes,\n type ReactNode,\n} from 'react'\n\nimport { cn } from '../../cn'\nimport { useSideNav } from './SideNavContext'\n\nexport type StnSideNavGroupDirection = 'down' | 'up'\nexport type StnSideNavGroupVariant = 'inline' | 'dropdown'\nexport type StnSideNavDropdownVariant = 'filled' | 'transparent'\n\nexport type StnSideNavGroupProps = HTMLAttributes<HTMLDivElement> & {\n /** 그룹 타이틀 레이블 (대문자 캡션 형태로 표시) */\n label?: ReactNode\n /** 펼침/접힘 트리 부모 아이템 (예: StnSideNavItem) */\n parent?: ReactNode\n /** 펼침 방향 (기본: 'down' 아래로 펼쳐짐, 'up' 위로 펼쳐짐) */\n direction?: StnSideNavGroupDirection\n /**\n * 서브메뉴 표시 모드\n * - 'inline': 일반 문서 흐름에서 상/하로 밀면서 펼침 (기본값)\n * - 'dropdown': 위아래 레이아웃 밀림 없이 플로팅 드롭다운/팝오버 형태로 띄움\n */\n variant?: StnSideNavGroupVariant\n /** dropdown 모드 단축 boolean prop (variant=\"dropdown\"과 동일) */\n dropdown?: boolean\n /**\n * 드롭다운 서브메뉴 배경 스타일\n * - 'filled': 배경, 경계선, 블러, 그림자가 적용된 카드 팝오버 (기본값)\n * - 'transparent': 배경 및 그림자 없이 투명하게 플로팅되는 형태\n * @default 'filled'\n */\n dropdownVariant?: StnSideNavDropdownVariant\n /** 드롭다운 배경 표시 여부 (false 시 dropdownVariant=\"transparent\"와 동일) @default true */\n dropdownBackground?: boolean\n /** 펼침 상태 (controlled) */\n open?: boolean\n /** 기본 펼침 상태 (uncontrolled) */\n defaultOpen?: boolean\n /** 펼침 상태 변경 핸들러 */\n onOpenChange?: (open: boolean) => void\n children?: ReactNode\n}\n\n/**\n * SideNav 메뉴 그룹 컴포넌트\n * - `label`: 섹션 헤더 레이블로 아이템 그룹핑\n * - `parent`: 1depth 부모 아이템 클릭 시 2depth 서브메뉴 펼침/접힘 제어\n * - `variant`: 'inline'(아코디언 형태) | 'dropdown'(플로팅 팝업 드롭다운 형태)\n * - `direction`: 'down'(아래 방향) | 'up'(위 방향)\n */\nexport const StnSideNavGroup = forwardRef<HTMLDivElement, StnSideNavGroupProps>(function StnSideNavGroup(\n {\n label,\n parent,\n direction = 'down',\n variant = 'inline',\n dropdown = false,\n dropdownVariant = 'filled',\n dropdownBackground = true,\n open: openProp,\n defaultOpen = true,\n onOpenChange,\n className,\n children,\n ...rest\n },\n ref,\n) {\n const { collapsed } = useSideNav()\n const [internalOpen, setInternalOpen] = useState(defaultOpen)\n const isOpen = openProp ?? internalOpen\n const isDropdown = Boolean(dropdown || variant === 'dropdown')\n const isTransparent = dropdownVariant === 'transparent' || dropdownBackground === false\n const isUp = direction === 'up'\n\n const groupRef = useRef<HTMLDivElement | null>(null)\n\n // 드롭다운 모드일 때 외부 클릭 시 닫힘 처리\n useEffect(() => {\n if (!isDropdown || !isOpen) return\n\n const handlePointerDown = (e: globalThis.MouseEvent) => {\n if (groupRef.current && !groupRef.current.contains(e.target as Node)) {\n if (openProp === undefined) {\n setInternalOpen(false)\n }\n onOpenChange?.(false)\n }\n }\n\n document.addEventListener('mousedown', handlePointerDown)\n return () => {\n document.removeEventListener('mousedown', handlePointerDown)\n }\n }, [isDropdown, isOpen, openProp, onOpenChange])\n\n const handleToggle = () => {\n const next = !isOpen\n if (openProp === undefined) {\n setInternalOpen(next)\n }\n onOpenChange?.(next)\n }\n\n const subnavNode =\n children && (!collapsed && isOpen) ? (\n <div\n className={cn(\n 'stn-side-nav__subnav',\n isUp && 'up',\n isDropdown && 'dropdown',\n isDropdown && (isUp ? 'up' : 'down'),\n isDropdown && isTransparent && 'transparent',\n )}\n data-dropdown-variant={isDropdown ? (isTransparent ? 'transparent' : 'filled') : undefined}\n role=\"group\"\n >\n {children}\n </div>\n ) : null\n\n return (\n <div\n ref={(node) => {\n groupRef.current = node\n if (typeof ref === 'function') {\n ref(node)\n } else if (ref) {\n ref.current = node\n }\n }}\n className={cn(\n 'stn-side-nav__group',\n isUp && 'up',\n isDropdown && 'dropdown',\n className,\n )}\n role=\"group\"\n aria-label={typeof label === 'string' ? label : undefined}\n {...rest}\n >\n {label && !collapsed ? (\n <span className=\"stn-side-nav__group-label\" onClick={handleToggle}>\n {label}\n </span>\n ) : null}\n\n {/* direction=\"up\"인 경우 서브메뉴(children)가 부모(parent) 위에 위치 */}\n {isUp ? subnavNode : null}\n {parent}\n {!isUp ? subnavNode : null}\n </div>\n )\n})\n","import { forwardRef, type HTMLAttributes } from 'react'\n\nimport { cn } from '../../cn'\n\nexport type StnSideNavSpacerProps = HTMLAttributes<HTMLDivElement>\n\n/**\n * SideNav 상단 메뉴와 하단 푸터 사이의 여백을 밀어내는 Flex Spacer\n */\nexport const StnSideNavSpacer = forwardRef<HTMLDivElement, StnSideNavSpacerProps>(function StnSideNavSpacer(\n { className, style, ...rest },\n ref,\n) {\n return (\n <div\n ref={ref}\n className={cn('stn-side-nav__spacer', className)}\n style={{ flex: '1 1 0%', minHeight: '12px', ...style }}\n aria-hidden=\"true\"\n {...rest}\n />\n )\n})\n","import { forwardRef, type HTMLAttributes, type ReactNode } from 'react'\n\nimport { cn } from '../../cn'\n\nexport type StnSideNavFooterProps = HTMLAttributes<HTMLElement> & {\n /** mockup/index.html 스타일의 상단 우측 32px 곡면 라운드 및 글래스 효과 */\n curved?: boolean\n children?: ReactNode\n}\n\n/**\n * SideNav 하단 푸터 영역 (도움말, 설정, 사용자 프로필, 로그아웃 등)\n */\nexport const StnSideNavFooter = forwardRef<HTMLElement, StnSideNavFooterProps>(function StnSideNavFooter(\n { curved = false, children, className, ...rest },\n ref,\n) {\n return (\n <nav\n ref={ref}\n className={cn('stn-side-nav__footer', curved && 'curved', className)}\n aria-label=\"보조 내비게이션\"\n {...rest}\n >\n {children}\n </nav>\n )\n})\n","import { forwardRef, type ButtonHTMLAttributes } from 'react'\n\nimport { cn } from '../../cn'\nimport { useSideNav } from './SideNavContext'\n\nexport type StnSideNavToggleProps = ButtonHTMLAttributes<HTMLButtonElement>\n\n/**\n * mockup/index.html의 플로팅 원형 사이드바 접기/펼치기 버튼 (Figma 40004302:30002)\n * 접힘 시 사이드바 우측 경계선에 걸치고, 펼침 시 헤더 우측 상단으로 이동하며 180도 회전\n */\nexport const StnSideNavToggle = forwardRef<HTMLButtonElement, StnSideNavToggleProps>(\n function StnSideNavToggle({ className, onClick, ...rest }, ref) {\n const { collapsed, onToggleCollapse } = useSideNav()\n\n return (\n <button\n ref={ref}\n type=\"button\"\n className={cn('stn-side-nav__toggle', className)}\n onClick={(e) => {\n onToggleCollapse?.()\n onClick?.(e)\n }}\n aria-label={collapsed ? '사이드바 펼치기' : '사이드바 접기'}\n title={collapsed ? '사이드바 펼치기' : '사이드바 접기'}\n {...rest}\n >\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M9 18l6-6-6-6\" />\n </svg>\n </button>\n )\n },\n)\n\n","import { forwardRef, type HTMLAttributes } from 'react'\n\nimport { cn } from '../../cn'\nimport { StnLogo, type StnLogoSize, type StnLogoTheme } from '../StnLogo'\n\nexport type StnSideNavWatermarkProps = HTMLAttributes<HTMLDivElement> & {\n /**\n * 워터마크 로고 크기 (xs, sm, md, lg, xl).\n * 사이드바 기본 규격에 최적화된 'xl' (120px)이 기본값입니다.\n * @default 'xl'\n */\n size?: StnLogoSize\n /**\n * 다크 / 라이트 테마 (미지정 시 상위 data-theme에 따라 자동 전환)\n */\n theme?: StnLogoTheme\n}\n\n/**\n * 사이드바 하단 3D 엠보싱 브랜드 워터마크 카드 (Figma 40004218:102473)\n * StnLogo(variant=\"watermark\") 기반으로 크기(size prop) 및 테마 제어를 지원합니다.\n */\nexport const StnSideNavWatermark = forwardRef<HTMLDivElement, StnSideNavWatermarkProps>(\n function StnSideNavWatermark({ size = 'xl', theme, className, ...rest }, ref) {\n return (\n <div\n ref={ref}\n className={cn('stn-side-nav__watermark', className)}\n aria-hidden=\"true\"\n {...rest}\n >\n <StnLogo variant=\"watermark\" size={size} theme={theme} />\n </div>\n )\n },\n)\n\n","import { forwardRef, type ButtonHTMLAttributes, type ReactNode } from 'react'\nimport { cn } from '../../cn'\nimport { useSideNav } from './SideNavContext'\n\nexport type StnSideNavMobileTriggerProps = ButtonHTMLAttributes<HTMLButtonElement> & {\n /** 화면 좌하단 플로팅 고정 여부 @default false */\n floating?: boolean\n children?: ReactNode\n}\n\n/**\n * 모바일 화면에서 사이드 내비게이션 드로어를 열고 닫는 햄버거 토글 버튼\n * - \floating 속성 지정 시 화면 좌하단에 플로팅 버튼으로 고정됩니다.\n * - 컴포넌트 단독 또는 StnSideNavigation.MobileTrigger로 접근할 수 있습니다.\n */\nexport const StnSideNavMobileTrigger = forwardRef<HTMLButtonElement, StnSideNavMobileTriggerProps>(\n function StnSideNavMobileTrigger({ floating = false, className, children, onClick, ...rest }, ref) {\n const { onToggleMobileOpen, mobileOpen } = useSideNav()\n\n return (\n <button\n ref={ref}\n type=\"button\"\n className={cn(\n 'stn-side-nav__mobile-trigger',\n floating && 'floating',\n mobileOpen && 'is-open',\n className,\n )}\n aria-label={mobileOpen ? '사이드 내비게이션 닫기' : '사이드 내비게이션 열기'}\n aria-expanded={mobileOpen}\n onClick={(e) => {\n onClick?.(e)\n onToggleMobileOpen?.()\n }}\n {...rest}\n >\n {children ?? (\n <span className=\"stn-side-nav__hamburger-bars\" aria-hidden=\"true\">\n <span />\n <span />\n <span />\n </span>\n )}\n </button>\n )\n },\n)\r\n","import {\n forwardRef,\n type HTMLAttributes,\n type ReactNode,\n} from 'react'\n\nimport { cn } from '../../cn'\nimport { StnButton, type StnButtonProps } from '../StnButton'\nimport { useSideNav } from './SideNavContext'\n\nexport type StnSideNavSubProps = HTMLAttributes<HTMLDivElement> & {\n children?: ReactNode\n}\n\n/**\n * SideNav 하단 푸터 바로 위의 서브/유틸리티 액션 영역 (화면 조정, 테마 전환 등)\n * - 내부에 StnButton(variant=\"ghost\") 또는 StnSideNavigation.SubItem / Button을 배치할 수 있습니다.\n * - 접힘 상태(collapsed): 세로 1열 32px 원형 아이콘 버튼 배치\n * - 펼침 상태(expanded): 가로 2열 캡슐형 Ghost 버튼 배치\n */\nexport const StnSideNavSub = forwardRef<HTMLDivElement, StnSideNavSubProps>(\n function StnSideNavSub({ children, className, ...rest }, ref) {\n return (\n <div\n ref={ref}\n className={cn('stn-side-nav__sub', className)}\n role=\"toolbar\"\n aria-label=\"보조 유틸리티\"\n {...rest}\n >\n {children}\n </div>\n )\n },\n)\n\nexport type StnSideNavSubItemProps = Omit<StnButtonProps, 'variant' | 'size' | 'shape'> & {\n /** 버튼 변형 (기본: 'ghost') */\n variant?: StnButtonProps['variant']\n /** 버튼 크기 (기본: 'md') */\n size?: StnButtonProps['size']\n /** 버튼 형태 (기본: 'pill') */\n shape?: StnButtonProps['shape']\n /** 좌측 또는 단독 아이콘 (ReactNode 또는 아이콘명 slug) */\n icon?: ReactNode\n /** 아이콘 이미지 경로 (SVG 등) */\n iconSrc?: string\n /** 펼쳤을 때 표시되는 버튼 텍스트 라벨 (children 대신 지정 가능) */\n label?: string\n /** 툴팁 또는 접근성 타이틀 (미지정 시 label 사용) */\n title?: string\n children?: ReactNode\n className?: string\n}\n\n/**\n * StnSideNavSub 내부에서 사용하는 보조 액션 버튼 (StnButton variant=\"ghost\" 기반)\n */\nexport const StnSideNavSubItem = forwardRef<HTMLButtonElement, StnSideNavSubItemProps>(\n function StnSideNavSubItem(\n {\n variant = 'ghost',\n size = 'md',\n shape = 'pill',\n icon,\n iconSrc,\n label,\n title,\n children,\n className,\n ...rest\n },\n ref,\n ) {\n const { collapsed } = useSideNav()\n const content = children ?? label\n const computedTitle = title ?? (typeof content === 'string' ? content : undefined)\n const resolvedIcon =\n icon ??\n (iconSrc ? (\n <span className=\"stn-side-nav__sub-icon\">\n <span\n className=\"stn-side-nav__sub-glyph\"\n style={{ maskImage: `url('${iconSrc}')`, WebkitMaskImage: `url('${iconSrc}')` }}\n />\n </span>\n ) : null)\n\n return (\n <StnButton\n ref={ref}\n variant={variant}\n size={size}\n shape={shape}\n icon={resolvedIcon}\n className={cn('stn-side-nav__sub-btn', className)}\n title={computedTitle}\n aria-label={computedTitle}\n {...rest}\n >\n {collapsed ? null : content}\n </StnButton>\n )\n },\n)\n\n","import { forwardRef, type HTMLAttributes, type ReactNode } from 'react'\nimport { cn } from '../../cn'\n\nexport type StnSideNavSubNavVariant = 'filled' | 'transparent'\nexport type StnSideNavSubNavDirection = 'down' | 'up'\n\nexport type StnSideNavSubNavProps = HTMLAttributes<HTMLDivElement> & {\n /** 드롭다운(플로팅 팝오버) 모드 여부 @default false */\n dropdown?: boolean\n /** 드롭다운 펼침 방향 ('down' 아래로 | 'up' 위로) @default 'down' */\n direction?: StnSideNavSubNavDirection\n /** 드롭다운 배경 스타일 ('filled' 기본 배경/보더/그림자 | 'transparent' 배경 없는 투명) @default 'filled' */\n variant?: StnSideNavSubNavVariant\n /** 배경 표시 여부 (false 시 variant=\"transparent\"와 동일) @default true */\n background?: boolean\n children?: ReactNode\n}\n\n/**\n * Side Navigation 서브메뉴(2depth) 컨테이너 컴포넌트 (`.stn-side-nav__subnav`)\n * - 인라인 아코디언 서브메뉴 목록 또는 플로팅 드롭다운 서브메뉴 목록을 감싸는 전용 래퍼입니다.\n * - `dropdown`: true 지정 시 플로팅 드롭다운 팝오버 모드로 전환됩니다.\n * - `variant`: 'filled'(배경/보더/그림자 카드) | 'transparent'(배경 없는 투명 모드)\n * - `background`: false 지정 시 투명 모드로 전환됩니다.\n */\nexport const StnSideNavSubNav = forwardRef<HTMLDivElement, StnSideNavSubNavProps>(\n function StnSideNavSubNav(\n {\n dropdown = false,\n direction = 'down',\n variant = 'filled',\n background = true,\n className,\n children,\n ...rest\n },\n ref,\n ) {\n const isUp = direction === 'up'\n const isTransparent = variant === 'transparent' || background === false\n\n return (\n <div\n ref={ref}\n className={cn(\n 'stn-side-nav__subnav',\n isUp && 'up',\n dropdown && 'dropdown',\n dropdown && (isUp ? 'up' : 'down'),\n dropdown && isTransparent && 'transparent',\n className,\n )}\n data-dropdown-variant={dropdown ? (isTransparent ? 'transparent' : 'filled') : undefined}\n role=\"group\"\n {...rest}\n >\n {children}\n </div>\n )\n },\n)\n","import {\n forwardRef,\n useCallback,\n useMemo,\n useState,\n type HTMLAttributes,\n type ReactNode,\n} from 'react'\n\nimport { cn } from '../../cn'\nimport {\n SideNavContext,\n StnSideNavFooter,\n StnSideNavGroup,\n StnSideNavHeader,\n StnSideNavItem,\n StnSideNavLogo,\n StnSideNavMenu,\n StnSideNavMobileTrigger,\n StnSideNavSpacer,\n StnSideNavSub,\n StnSideNavSubItem,\n StnSideNavSubNav,\n StnSideNavToggle,\n StnSideNavWatermark,\n type SideNavContextValue,\n} from '../../components/sideNav'\n\nexport type StnSideNavigationVariant = 'default' | 'glassmorphism'\n\nexport type StnSideNavigationProps = HTMLAttributes<HTMLElement> & {\n /** 사이드바 배경 및 외형 스타일 ('default' 불투명 솔리드 | 'glassmorphism' 반투명 블러) @default 'default' */\n variant?: StnSideNavigationVariant\n /** variant 별칭 */\n appearance?: StnSideNavigationVariant\n /** 모바일 드로어 모드에서의 배경 스타일 (미지정 시 variant 값을 상속) */\n drawerVariant?: StnSideNavigationVariant\n /** drawerVariant 별칭 */\n drawerAppearance?: StnSideNavigationVariant\n /** 사이드바 접힘 상태 (controlled) */\n collapsed?: boolean\n /** 기본 접힘 상태 (uncontrolled) @default false */\n defaultCollapsed?: boolean\n /** 접힘 상태 변경 콜백 */\n onCollapseChange?: (collapsed: boolean) => void\n /** 활성화된 메뉴 아이템 id (controlled) */\n activeId?: string\n /** 기본 활성 메뉴 아이템 id (uncontrolled) */\n defaultActiveId?: string\n /** 메뉴 선택 변경 콜백 */\n onActiveChange?: (activeId: string) => void\n /** 모바일 드로어 열림 상태 (controlled) */\n mobileOpen?: boolean\n /** 기본 모바일 드로어 열림 상태 (uncontrolled) @default false */\n defaultMobileOpen?: boolean\n /** 모바일 드로어 열림 상태 변경 콜백 */\n onMobileOpenChange?: (open: boolean) => void\n /** 상시 드로어 모드 활성화 (화면 오버레이 슬라이드아웃 패널) @default false */\n drawer?: boolean\n /** 반응형 자동 드로어 모드 (모바일 화면 <= 768px / 1024px 시 자동으로 드로어로 변환) @default true */\n responsiveDrawer?: boolean\n /** 화면 좌하단 플로팅 햄버거 토글 버튼 자동 렌더 여부 @default false */\n showMobileTrigger?: boolean\n children?: ReactNode\n}\n\nfunction useControllableState<T>(\n controlledValue: T | undefined,\n defaultValue: T,\n onChange?: (value: T) => void,\n) {\n const [internalState, setInternalState] = useState<T>(defaultValue)\n const isControlled = controlledValue !== undefined\n const value = isControlled ? controlledValue : internalState\n\n const setValue = useCallback(\n (next: T) => {\n if (!isControlled) {\n setInternalState(next)\n }\n onChange?.(next)\n },\n [isControlled, onChange],\n )\n\n return [value, setValue] as const\n}\n\n/**\n * 현대적인 합성(Compound) 사이드 내비게이션 패턴\n *\n * Header, Menu, Group, Item, Spacer, Footer, MobileTrigger를 자유롭게 조립하여 사용합니다.\n * 모바일 화면을 위한 햄버거 토글 버튼(`StnSideNavigation.MobileTrigger`) 및 슬라이드아웃 드로어(`drawer`, `responsiveDrawer`)를 기본 지원합니다.\n *\n * @example\n * ```tsx\n * <StnSideNavigation\n * collapsed={collapsed}\n * onCollapseChange={setCollapsed}\n * responsiveDrawer\n * showMobileTrigger\n * >\n * <StnSideNavigation.Header />\n * <StnSideNavigation.Menu>\n * <StnSideNavigation.Item iconSrc={...} label=\"대시보드\" active />\n * </StnSideNavigation.Menu>\n * </StnSideNavigation>\n * ```\n */\nconst StnSideNavigationRoot = forwardRef<HTMLElement, StnSideNavigationProps>(function StnSideNavigationRoot(\n {\n variant: variantProp,\n appearance,\n drawerVariant: drawerVariantProp,\n drawerAppearance,\n collapsed: collapsedProp,\n defaultCollapsed = false,\n onCollapseChange,\n activeId: activeIdProp,\n defaultActiveId,\n onActiveChange,\n mobileOpen: mobileOpenProp,\n defaultMobileOpen = false,\n onMobileOpenChange,\n drawer = false,\n responsiveDrawer = true,\n showMobileTrigger = false,\n className,\n children,\n ...rest\n },\n ref,\n) {\n const variant = variantProp ?? appearance ?? 'default'\n const drawerVariant = drawerVariantProp ?? drawerAppearance ?? variant\n\n const [collapsed, setCollapsed] = useControllableState(\n collapsedProp,\n defaultCollapsed,\n onCollapseChange,\n )\n\n const [activeId, setActiveId] = useControllableState(\n activeIdProp,\n defaultActiveId ?? '',\n onActiveChange,\n )\n\n const [mobileOpen, setMobileOpen] = useControllableState(\n mobileOpenProp,\n defaultMobileOpen,\n onMobileOpenChange,\n )\n\n const handleToggleCollapse = useCallback(() => {\n setCollapsed(!collapsed)\n }, [collapsed, setCollapsed])\n\n const handleToggleMobileOpen = useCallback(() => {\n setMobileOpen(!mobileOpen)\n }, [mobileOpen, setMobileOpen])\n\n const isDrawerMode = Boolean(drawer || (responsiveDrawer && mobileOpen))\n // 모바일 드로어가 열려있을 때(mobileOpen)는 collapsed 상태를 해제하여 항상 전체 메뉴와 라벨이 보이도록 함\n const isEffectiveCollapsed = isDrawerMode && mobileOpen ? false : collapsed\n\n // 드로어 모드일 때는 drawerVariant를 우선 적용 (미지정 시 variant 상속)\n const activeVariant = isDrawerMode && mobileOpen ? drawerVariant : variant\n const isGlassmorphism = activeVariant === 'glassmorphism'\n\n const contextValue: SideNavContextValue = useMemo(\n () => ({\n collapsed: isEffectiveCollapsed,\n activeId,\n onSelect: setActiveId,\n onToggleCollapse: handleToggleCollapse,\n mobileOpen,\n onToggleMobileOpen: handleToggleMobileOpen,\n setMobileOpen,\n isDrawer: isDrawerMode,\n }),\n [isEffectiveCollapsed, activeId, setActiveId, handleToggleCollapse, mobileOpen, handleToggleMobileOpen, setMobileOpen, isDrawerMode],\n )\n\n return (\n <SideNavContext.Provider value={contextValue}>\n {showMobileTrigger && (\n <StnSideNavMobileTrigger floating />\n )}\n {(drawer || responsiveDrawer) && (\n <div\n className={cn('stn-side-nav__backdrop', mobileOpen && 'is-open')}\n onClick={() => setMobileOpen(false)}\n aria-hidden={!mobileOpen}\n />\n )}\n <aside\n ref={ref}\n className={cn(\n 'stn-side-nav',\n isGlassmorphism ? 'glassmorphism' : 'default',\n isEffectiveCollapsed && 'collapsed',\n drawer && 'drawer',\n responsiveDrawer && 'responsive-drawer',\n mobileOpen && (drawer || responsiveDrawer) && 'open is-open',\n className,\n )}\n data-stn-side-nav-variant={variant}\n data-stn-side-nav-drawer-variant={drawerVariant}\n aria-label=\"사이드 내비게이션 바\"\n {...rest}\n >\n {children}\n </aside>\n </SideNavContext.Provider>\n )\n})\n\nexport const StnSideNavigation = Object.assign(StnSideNavigationRoot, {\n Header: StnSideNavHeader,\n Toggle: StnSideNavToggle,\n Logo: StnSideNavLogo,\n Menu: StnSideNavMenu,\n Group: StnSideNavGroup,\n Item: StnSideNavItem,\n SubNav: StnSideNavSubNav,\n Spacer: StnSideNavSpacer,\n Sub: StnSideNavSub,\n SubItem: StnSideNavSubItem,\n Footer: StnSideNavFooter,\n Watermark: StnSideNavWatermark,\n MobileTrigger: StnSideNavMobileTrigger,\n})\n\n","import {\n Fragment,\n useEffect,\n useId,\n useRef,\n useState,\n type AnchorHTMLAttributes,\n type ButtonHTMLAttributes,\n type ReactNode,\n} from 'react'\n\nimport {\n STN_BREADCRUMB_ICON_SRC,\n type StnBreadcrumbIconId,\n} from '@stn-uiux/pub-ui/data/stnBreadcrumb'\n\nimport { cn } from '../cn'\n\nfunction maskStyle(src: string) {\n return { maskImage: `url('${src}')`, WebkitMaskImage: `url('${src}')` } as const\n}\n\nexport type StnBreadcrumbSize = 'sm' | 'md' | 'lg'\nexport type StnBreadcrumbVariant = 'default' | 'chip'\n\n/** Sibling / alternate path option shown in a segment dropdown */\nexport type StnBreadcrumbMenuItem = {\n id: string\n label: string\n href?: string\n onClick?: () => void\n /** Marks the active sibling in the menu */\n current?: boolean\n}\n\nexport type StnBreadcrumbItem = {\n id: string\n label: string\n /** line icon mask src — defaults from `icon` id */\n iconSrc?: string\n icon?: Exclude<StnBreadcrumbIconId, 'home' | 'separator' | 'caret'>\n /**\n * Show caret and open sibling picker when `menuItems` is provided.\n * Without `menuItems`, caret is decorative only (prefer passing `menuItems`).\n */\n menu?: boolean\n /** Dropdown options under this segment */\n menuItems?: StnBreadcrumbMenuItem[]\n href?: string\n onClick?: () => void\n current?: boolean\n}\n\nexport type StnBreadcrumbProps = {\n items: StnBreadcrumbItem[]\n className?: string\n /** 크기: sm · md(기본) · lg — 클래스 `.sm` `.md` `.lg` */\n size?: StnBreadcrumbSize\n /** `chip`이면 루트에 `.chip` */\n variant?: StnBreadcrumbVariant\n /** 이 개수를 넘으면 중간을 `.collapsed` 버튼으로 접음 */\n maxItems?: number\n itemsBeforeCollapse?: number\n itemsAfterCollapse?: number\n homeHref?: string\n onHomeClick?: () => void\n showHome?: boolean\n homeLabel?: string\n renderItem?: (item: StnBreadcrumbItem, segment: ReactNode) => ReactNode\n}\n\nfunction resolveIconSrc(item: StnBreadcrumbItem) {\n if (item.iconSrc) return item.iconSrc\n if (item.icon) return STN_BREADCRUMB_ICON_SRC[item.icon]\n return undefined\n}\n\nfunction hasSegmentMenu(item: StnBreadcrumbItem) {\n return Boolean(item.menu || (item.menuItems && item.menuItems.length > 0))\n}\n\nfunction BreadcrumbSeparator() {\n return (\n <li className=\"separator\" aria-hidden=\"true\">\n <span style={maskStyle(STN_BREADCRUMB_ICON_SRC.separator)} />\n </li>\n )\n}\n\nfunction BreadcrumbIcon({ src }: { src: string }) {\n return <span className=\"stn-breadcrumb__icon-glyph\" style={maskStyle(src)} aria-hidden=\"true\" />\n}\n\nfunction BreadcrumbCaret() {\n return (\n <span\n className=\"stn-breadcrumb__caret\"\n style={maskStyle(STN_BREADCRUMB_ICON_SRC.caret)}\n aria-hidden=\"true\"\n />\n )\n}\n\nfunction SegmentContent({\n iconSrc,\n label,\n menu,\n}: {\n iconSrc?: string\n label: string\n menu?: boolean\n}) {\n return (\n <>\n {iconSrc ? <BreadcrumbIcon src={iconSrc} /> : null}\n <span className=\"stn-breadcrumb__label\">{label}</span>\n {menu ? <BreadcrumbCaret /> : null}\n </>\n )\n}\n\nfunction BreadcrumbMenuList({\n id,\n items,\n onPick,\n}: {\n id: string\n items: StnBreadcrumbMenuItem[]\n onPick: () => void\n}) {\n return (\n <ul id={id} className=\"stn-breadcrumb__menu\" role=\"menu\">\n {items.map((option) => (\n <li key={option.id} role=\"none\">\n {option.href ? (\n <a\n role=\"menuitem\"\n href={option.href}\n aria-current={option.current ? 'true' : undefined}\n onClick={() => {\n option.onClick?.()\n onPick()\n }}\n >\n {option.label}\n </a>\n ) : (\n <button\n type=\"button\"\n role=\"menuitem\"\n aria-current={option.current ? 'true' : undefined}\n onClick={() => {\n option.onClick?.()\n onPick()\n }}\n >\n {option.label}\n </button>\n )}\n </li>\n ))}\n </ul>\n )\n}\n\nfunction useDismissibleMenu<T extends HTMLElement>(open: boolean, onClose: () => void) {\n const rootRef = useRef<T | null>(null)\n\n useEffect(() => {\n if (!open) return\n\n const onPointerDown = (event: PointerEvent) => {\n if (!rootRef.current?.contains(event.target as Node)) onClose()\n }\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') onClose()\n }\n\n document.addEventListener('pointerdown', onPointerDown)\n document.addEventListener('keydown', onKeyDown)\n return () => {\n document.removeEventListener('pointerdown', onPointerDown)\n document.removeEventListener('keydown', onKeyDown)\n }\n }, [open, onClose])\n\n return rootRef\n}\n\nfunction BreadcrumbSegment({\n item,\n isCurrent,\n}: {\n item: StnBreadcrumbItem\n isCurrent: boolean\n}) {\n const menuId = useId()\n const [open, setOpen] = useState(false)\n const menuItems = item.menuItems ?? []\n const showMenu = hasSegmentMenu(item) && !isCurrent\n const canOpenMenu = showMenu && menuItems.length > 0\n const rootRef = useDismissibleMenu<HTMLSpanElement>(open, () => setOpen(false))\n const iconSrc = resolveIconSrc(item)\n const content = <SegmentContent iconSrc={iconSrc} label={item.label} menu={showMenu} />\n\n if (isCurrent) {\n return (\n <span className=\"stn-breadcrumb__segment\" aria-current=\"page\" aria-label={item.label}>\n {content}\n </span>\n )\n }\n\n if (canOpenMenu) {\n return (\n <span ref={rootRef} className=\"stn-breadcrumb__segment-wrap\">\n <button\n type=\"button\"\n className=\"stn-breadcrumb__segment\"\n aria-label={item.label}\n aria-haspopup=\"menu\"\n aria-expanded={open}\n aria-controls={menuId}\n onClick={() => {\n item.onClick?.()\n setOpen((value) => !value)\n }}\n >\n {content}\n </button>\n {open ? (\n <BreadcrumbMenuList id={menuId} items={menuItems} onPick={() => setOpen(false)} />\n ) : null}\n </span>\n )\n }\n\n if (item.menu || item.onClick) {\n const buttonProps: ButtonHTMLAttributes<HTMLButtonElement> = {\n type: 'button',\n className: 'stn-breadcrumb__segment',\n onClick: item.onClick,\n 'aria-label': item.label,\n 'aria-haspopup': item.menu ? 'menu' : undefined,\n 'aria-expanded': item.menu ? false : undefined,\n }\n return <button {...buttonProps}>{content}</button>\n }\n\n if (item.href) {\n const linkProps: AnchorHTMLAttributes<HTMLAnchorElement> = {\n href: item.href,\n className: 'stn-breadcrumb__segment',\n onClick: item.onClick,\n 'aria-label': item.label,\n }\n return <a {...linkProps}>{content}</a>\n }\n\n return (\n <span className=\"stn-breadcrumb__segment\" aria-label={item.label}>\n {content}\n </span>\n )\n}\n\nfunction BreadcrumbBack({\n label,\n href,\n onClick,\n}: {\n label: string\n href?: string\n onClick?: () => void\n}) {\n const content = (\n <>\n <span\n className=\"stn-breadcrumb__back-glyph\"\n style={maskStyle(STN_BREADCRUMB_ICON_SRC.separator)}\n aria-hidden=\"true\"\n />\n <span className=\"stn-breadcrumb__label\">{label}</span>\n </>\n )\n\n if (href) {\n return (\n <a className=\"stn-breadcrumb__back\" href={href} onClick={onClick} aria-label={`뒤로: ${label}`}>\n {content}\n </a>\n )\n }\n\n return (\n <button type=\"button\" className=\"stn-breadcrumb__back\" onClick={onClick} aria-label={`뒤로: ${label}`}>\n {content}\n </button>\n )\n}\n\nfunction splitCollapsedItems(\n items: StnBreadcrumbItem[],\n maxItems: number | undefined,\n itemsBeforeCollapse: number,\n itemsAfterCollapse: number,\n) {\n if (!maxItems || items.length <= maxItems) {\n return { head: items, hidden: [] as StnBreadcrumbItem[], tail: [] as StnBreadcrumbItem[] }\n }\n\n const before = Math.max(1, itemsBeforeCollapse)\n const after = Math.max(1, itemsAfterCollapse)\n const reserved = before + after\n if (items.length <= reserved) {\n return { head: items, hidden: [] as StnBreadcrumbItem[], tail: [] as StnBreadcrumbItem[] }\n }\n\n return {\n head: items.slice(0, before),\n hidden: items.slice(before, items.length - after),\n tail: items.slice(items.length - after),\n }\n}\n\nfunction BreadcrumbCollapsed({\n items,\n menuId,\n}: {\n items: StnBreadcrumbItem[]\n menuId: string\n}) {\n const [open, setOpen] = useState(false)\n const rootRef = useDismissibleMenu<HTMLLIElement>(open, () => setOpen(false))\n\n const menuItems: StnBreadcrumbMenuItem[] = items.map((item) => ({\n id: item.id,\n label: item.label,\n href: item.href,\n onClick: item.onClick,\n current: item.current,\n }))\n\n return (\n <li className=\"stn-breadcrumb__item\" ref={rootRef}>\n <button\n type=\"button\"\n className=\"collapsed\"\n aria-expanded={open}\n aria-haspopup=\"menu\"\n aria-controls={menuId}\n aria-label=\"숨긴 경로 펼치기\"\n onClick={() => setOpen((value) => !value)}\n >\n ⋯\n </button>\n {open ? (\n <BreadcrumbMenuList id={menuId} items={menuItems} onPick={() => setOpen(false)} />\n ) : null}\n </li>\n )\n}\n\nexport function StnBreadcrumb({\n items,\n className,\n size = 'md',\n variant = 'default',\n maxItems,\n itemsBeforeCollapse = 1,\n itemsAfterCollapse = 1,\n homeHref = '#',\n onHomeClick,\n showHome = true,\n homeLabel = '홈',\n renderItem,\n}: StnBreadcrumbProps) {\n const menuId = useId()\n const currentIndex = items.findIndex((item, index) => item.current ?? index === items.length - 1)\n const currentItem = currentIndex >= 0 ? items[currentIndex] : items[items.length - 1]\n const previousItem = currentIndex > 0 ? items[currentIndex - 1] : null\n const backHref = previousItem?.href ?? (showHome ? homeHref : undefined)\n const backOnClick = previousItem?.onClick ?? onHomeClick\n const { head, hidden, tail } = splitCollapsedItems(\n items,\n maxItems,\n itemsBeforeCollapse,\n itemsAfterCollapse,\n )\n\n const lastId = items[items.length - 1]?.id\n\n const renderTrailItem = (item: StnBreadcrumbItem) => {\n const isCurrent = Boolean(item.current) || item.id === lastId\n const segment = <BreadcrumbSegment item={item} isCurrent={isCurrent} />\n\n return (\n <li\n className={cn(\n 'stn-breadcrumb__item',\n isCurrent ? 'stn-breadcrumb__item--current' : 'stn-breadcrumb__item--middle',\n )}\n >\n {renderItem ? renderItem(item, segment) : segment}\n </li>\n )\n }\n\n return (\n <nav\n className={cn('stn-breadcrumb', size, variant === 'chip' && 'chip', className)}\n aria-label=\"Breadcrumb\"\n >\n <ol className=\"stn-breadcrumb__list\">\n {currentItem ? (\n <li className=\"stn-breadcrumb__item stn-breadcrumb__item--back\">\n <BreadcrumbBack label={currentItem.label} href={backHref} onClick={backOnClick} />\n </li>\n ) : null}\n\n {showHome ? (\n <li className=\"stn-breadcrumb__item stn-breadcrumb__item--home\">\n <a className=\"stn-breadcrumb__home\" href={homeHref} onClick={onHomeClick}>\n <BreadcrumbIcon src={STN_BREADCRUMB_ICON_SRC.home} />\n <span className=\"blind\">{homeLabel}</span>\n </a>\n </li>\n ) : null}\n\n {head.map((item, index) => (\n <Fragment key={item.id}>\n {showHome || index > 0 ? <BreadcrumbSeparator /> : null}\n {renderTrailItem(item)}\n </Fragment>\n ))}\n\n {hidden.length > 0 ? (\n <>\n <BreadcrumbSeparator />\n <BreadcrumbCollapsed items={hidden} menuId={menuId} />\n </>\n ) : null}\n\n {tail.map((item) => (\n <Fragment key={item.id}>\n <BreadcrumbSeparator />\n {renderTrailItem(item)}\n </Fragment>\n ))}\n </ol>\n </nav>\n )\n}\n","import { useEffect, useState, type HTMLAttributes, type ReactNode } from 'react'\n\nimport { STN_HEADER_TITLE_FRAME } from '@stn-uiux/pub-ui/data/stnHeaderTitle'\n\nimport { cn } from '../cn'\n\nconst KO_WEEKDAY_SHORT = ['일', '월', '화', '수', '목', '금', '토'] as const\nconst KO_WEEKDAY_LONG = [\n '일요일',\n '월요일',\n '화요일',\n '수요일',\n '목요일',\n '금요일',\n '토요일',\n] as const\n\nexport interface StnHeaderTitleDateOptions {\n /** 요일 포함 여부 (기본 true) */\n includeWeekday?: boolean\n /** 요일 표기 형식 ('short': '(화)' · 'long': '(화요일)', 기본 'short') */\n weekdayFormat?: 'short' | 'long'\n}\n\nexport interface StnHeaderTitleTimeOptions {\n /** 초(Seconds) 포함 여부 (기본 true, false 시 'HH:mm') */\n showSeconds?: boolean\n}\n\nexport function formatStnHeaderTitleDate(date: Date, options?: StnHeaderTitleDateOptions) {\n const y = date.getFullYear()\n const m = String(date.getMonth() + 1).padStart(2, '0')\n const d = String(date.getDate()).padStart(2, '0')\n const base = `${y}.${m}.${d}`\n if (options?.includeWeekday === false) {\n return base\n }\n const dayIdx = date.getDay()\n const weekdayText =\n options?.weekdayFormat === 'long' ? KO_WEEKDAY_LONG[dayIdx] : KO_WEEKDAY_SHORT[dayIdx]\n return `${base}(${weekdayText})`\n}\n\nexport function formatStnHeaderTitleWeekday(\n date: Date,\n format: 'short' | 'long' = 'short',\n wrapped = true,\n) {\n const dayIdx = date.getDay()\n const text = format === 'long' ? KO_WEEKDAY_LONG[dayIdx] : KO_WEEKDAY_SHORT[dayIdx]\n return wrapped ? `(${text})` : text\n}\n\nexport function formatStnHeaderTitleTime(date: Date, options?: StnHeaderTitleTimeOptions) {\n const h = String(date.getHours()).padStart(2, '0')\n const m = String(date.getMinutes()).padStart(2, '0')\n if (options?.showSeconds === false) {\n return `${h}:${m}`\n }\n const s = String(date.getSeconds()).padStart(2, '0')\n return `${h}:${m}:${s}`\n}\n\nexport type StnHeaderTitleVariant = 'title' | 'dual' | 'clock'\nexport type StnHeaderTitleSize = 'sm' | 'md' | 'lg'\n\ntype StnHeaderTitleBaseProps = Omit<HTMLAttributes<HTMLElement>, 'children' | 'title'> & {\n className?: string\n /** 프레임 그래픽 표시 · 기본 true · false면 텍스트만 */\n framed?: boolean\n /** 글자 크기 ('sm': 24/16px · 'md': 32/18px · 'lg': 40/20px) · 기본 'md' */\n size?: StnHeaderTitleSize\n}\n\nexport type StnHeaderTitleTitleProps = StnHeaderTitleBaseProps & {\n variant?: 'title'\n /** 단일 타이틀 텍스트 (children 또는 title) */\n title?: ReactNode\n children?: ReactNode\n}\n\nexport type StnHeaderTitleDualProps = StnHeaderTitleBaseProps & {\n variant?: 'dual'\n /** 앞부분 일반 굵기 보조 텍스트 (18px Medium) */\n subText?: ReactNode\n /** 뒷부분 굵은 메인 타이틀 텍스트 (32px SemiBold) */\n mainText?: ReactNode\n /** title 또는 children도 mainText로 사용 가능 */\n title?: ReactNode\n children?: ReactNode\n}\n\nexport type StnHeaderTitleClockProps = StnHeaderTitleBaseProps & {\n variant: 'clock'\n /** 지정 날짜 문자열 (생략 시 현재 날짜) */\n date?: string\n /** 지정 시각 문자열 (생략 시 현재 시각) */\n time?: string\n /** 지정 요일 문자열 (생략 시 현재 요일 또는 날짜 포맷에 포함) */\n weekday?: string\n /** 1초마다 실시간 갱신 (기본: date와 time이 모두 없을 때 true) */\n live?: boolean\n /** 날짜 표시 여부 (기본 true) */\n showDate?: boolean\n /** 요일 표시 여부 (기본 true, showDate=true일 때 날짜 뒤에 포함되거나 단독 표시) */\n showWeekday?: boolean\n /** 시각 표시 여부 (기본 true) */\n showTime?: boolean\n /** 시각 표시 시 초(Seconds) 포함 여부 (기본 true, false 시 'HH:mm') */\n showSeconds?: boolean\n /** 요일 표기 형식 ('short': '(화)' · 'long': '(화요일)', 기본 'short') */\n weekdayFormat?: 'short' | 'long'\n /** 커스텀 날짜 포맷 함수 */\n dateFormat?: (date: Date) => string\n /** 커스텀 시간 포맷 함수 */\n timeFormat?: (date: Date) => string\n /** 커스텀 요일 포맷 함수 */\n weekdayFormatFn?: (date: Date) => string\n /** 직접 하위 컴포넌트(StnHeaderTitle.Date, Time, Weekday 등)를 구성할 경우 */\n children?: ReactNode\n}\n\nexport type StnHeaderTitleProps =\n | StnHeaderTitleTitleProps\n | StnHeaderTitleDualProps\n | StnHeaderTitleClockProps\n\nfunction HeaderTitleFrame({ preview = false }: { preview?: boolean }) {\n const frameClass = preview ? 'stn-header-title__frame-preview' : 'stn-header-title__frame'\n\n return (\n <div className={frameClass} aria-hidden=\"true\">\n <div className=\"stn-header-title__frame-bleed stn-header-title__frame-bleed--outer\">\n <img\n className=\"stn-header-title__frame-img\"\n src={STN_HEADER_TITLE_FRAME.outer}\n alt=\"\"\n draggable={false}\n />\n </div>\n <div className=\"stn-header-title__frame-bleed stn-header-title__frame-bleed--inner\">\n <img\n className=\"stn-header-title__frame-img stn-header-title__frame-img--dark\"\n src={STN_HEADER_TITLE_FRAME.innerDark}\n alt=\"\"\n draggable={false}\n />\n <img\n className=\"stn-header-title__frame-img stn-header-title__frame-img--light\"\n src={STN_HEADER_TITLE_FRAME.innerLight}\n alt=\"\"\n draggable={false}\n />\n </div>\n </div>\n )\n}\n\n/** 문서용 — 프레임 그래픽만 */\nexport function StnHeaderTitleFramePreview({ className }: { className?: string }) {\n return (\n <div className={cn('stn-header-title__frame-only', className)}>\n <HeaderTitleFrame preview />\n </div>\n )\n}\n\nfunction useLiveClock(enabled: boolean) {\n const [now, setNow] = useState(() => new Date())\n\n useEffect(() => {\n if (!enabled) return\n const id = window.setInterval(() => setNow(new Date()), 1000)\n return () => window.clearInterval(id)\n }, [enabled])\n\n return now\n}\n\nexport function StnHeaderTitleMainText({\n className,\n children,\n ...rest\n}: HTMLAttributes<HTMLHeadingElement>) {\n return (\n <h1 className={cn('stn-header-title__text', className)} {...rest}>\n {children}\n </h1>\n )\n}\n\nexport function StnHeaderTitleSubText({\n className,\n children,\n ...rest\n}: HTMLAttributes<HTMLSpanElement>) {\n return (\n <span className={cn('stn-header-title__sub-text', className)} {...rest}>\n {children}\n </span>\n )\n}\n\nexport function StnHeaderTitleDate({\n className,\n children,\n ...rest\n}: HTMLAttributes<HTMLElement>) {\n return (\n <time className={cn('stn-header-title__date', className)} {...rest}>\n {children}\n </time>\n )\n}\n\nexport function StnHeaderTitleWeekday({\n className,\n children,\n ...rest\n}: HTMLAttributes<HTMLSpanElement>) {\n return (\n <span className={cn('stn-header-title__weekday', className)} {...rest}>\n {children}\n </span>\n )\n}\n\nexport function StnHeaderTitleTime({\n className,\n children,\n ...rest\n}: HTMLAttributes<HTMLSpanElement>) {\n return (\n <span className={cn('stn-header-title__time', className)} aria-label=\"현재 시각\" {...rest}>\n {children}\n </span>\n )\n}\n\nfunction StnHeaderTitleClock({\n className,\n size = 'md',\n date,\n time,\n weekday,\n live = date == null && time == null,\n showDate = true,\n showWeekday = true,\n showTime = true,\n showSeconds = true,\n weekdayFormat = 'short',\n dateFormat,\n timeFormat,\n weekdayFormatFn,\n framed = true,\n children,\n ...rest\n}: StnHeaderTitleClockProps) {\n const now = useLiveClock(live)\n\n if (children != null) {\n return (\n <header\n className={cn(\n 'stn-header-title',\n 'stn-header-title--clock',\n size,\n !framed && 'stn-header-title--plain',\n className,\n )}\n {...rest}\n >\n {framed ? <HeaderTitleFrame /> : null}\n <div className=\"stn-header-title__content\">{children}</div>\n </header>\n )\n }\n\n // 1. 날짜 문자열 계산\n let resolvedDate: string | undefined\n if (showDate) {\n if (date != null) {\n resolvedDate = date\n } else if (dateFormat) {\n resolvedDate = dateFormat(now)\n } else {\n resolvedDate = formatStnHeaderTitleDate(now, {\n includeWeekday: showWeekday,\n weekdayFormat,\n })\n }\n }\n\n // 2. 요일 단독 표시 (날짜 미표시 상태에서 요일만 표시할 때)\n const resolvedWeekday =\n weekday ??\n (weekdayFormatFn ? weekdayFormatFn(now) : formatStnHeaderTitleWeekday(now, weekdayFormat))\n const showWeekdayOnly = !showDate && showWeekday\n\n // 3. 시간 문자열 계산\n let resolvedTime: string | undefined\n if (showTime) {\n if (time != null) {\n resolvedTime = time\n } else if (timeFormat) {\n resolvedTime = timeFormat(now)\n } else {\n resolvedTime = formatStnHeaderTitleTime(now, { showSeconds })\n }\n }\n\n return (\n <header\n className={cn(\n 'stn-header-title',\n 'stn-header-title--clock',\n size,\n !framed && 'stn-header-title--plain',\n className,\n )}\n {...rest}\n >\n {framed ? <HeaderTitleFrame /> : null}\n <div className=\"stn-header-title__content\">\n {resolvedDate ? (\n <time className=\"stn-header-title__date\" dateTime={resolvedDate}>\n {resolvedDate}\n </time>\n ) : null}\n {showWeekdayOnly ? (\n <span className=\"stn-header-title__weekday\">{resolvedWeekday}</span>\n ) : null}\n {resolvedTime ? (\n <span className=\"stn-header-title__time\" aria-label=\"현재 시각\">\n {resolvedTime}\n </span>\n ) : null}\n </div>\n </header>\n )\n}\n\nfunction StnHeaderTitleDual({\n className,\n size = 'md',\n subText,\n mainText,\n title,\n children,\n framed = true,\n ...rest\n}: StnHeaderTitleDualProps) {\n const resolvedMain = mainText ?? title ?? children\n\n return (\n <header\n className={cn(\n 'stn-header-title',\n 'stn-header-title--dual',\n size,\n !framed && 'stn-header-title--plain',\n className,\n )}\n {...rest}\n >\n {framed ? <HeaderTitleFrame /> : null}\n <div className=\"stn-header-title__content\">\n {subText != null ? (\n <span className=\"stn-header-title__sub-text\">{subText}</span>\n ) : null}\n {resolvedMain != null ? (\n typeof resolvedMain === 'string' || typeof resolvedMain === 'number' ? (\n <h1 className=\"stn-header-title__text\">{resolvedMain}</h1>\n ) : (\n resolvedMain\n )\n ) : null}\n </div>\n </header>\n )\n}\n\nfunction StnHeaderTitleText({\n className,\n size = 'md',\n title,\n children,\n framed = true,\n ...rest\n}: StnHeaderTitleTitleProps) {\n const resolved = title ?? children\n\n return (\n <header\n className={cn(\n 'stn-header-title',\n 'stn-header-title--title',\n size,\n !framed && 'stn-header-title--plain',\n className,\n )}\n {...rest}\n >\n {framed ? <HeaderTitleFrame /> : null}\n <div className=\"stn-header-title__content\">\n {typeof resolved === 'string' || typeof resolved === 'number' ? (\n <h1 className=\"stn-header-title__text\">{resolved}</h1>\n ) : (\n resolved\n )}\n </div>\n </header>\n )\n}\n\nfunction StnHeaderTitleRoot(props: StnHeaderTitleProps) {\n if (props.variant === 'clock') {\n return <StnHeaderTitleClock {...props} />\n }\n if (props.variant === 'dual' || ('subText' in props && props.subText != null)) {\n return <StnHeaderTitleDual {...(props as StnHeaderTitleDualProps)} />\n }\n return <StnHeaderTitleText {...(props as StnHeaderTitleTitleProps)} />\n}\n\nexport const StnHeaderTitle = Object.assign(StnHeaderTitleRoot, {\n Text: StnHeaderTitleMainText,\n SubText: StnHeaderTitleSubText,\n Date: StnHeaderTitleDate,\n Weekday: StnHeaderTitleWeekday,\n Time: StnHeaderTitleTime,\n Frame: StnHeaderTitleFramePreview,\n})\n","import {\n forwardRef,\n type CSSProperties,\n type ElementType,\n type ReactNode,\n} from 'react'\n\nimport { cn } from '../cn'\n\nexport type StnContainerMaxWidth = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | false\n\nexport type StnContainerProps<T extends ElementType = 'div'> = {\n /** 렌더링할 HTML 태그 또는 컴포넌트 (기본: 'div') */\n component?: T\n /** @alias component */\n as?: T\n /**\n * 콘텐츠 최대 너비. 기본은 화면이 커지면 따라 늘다 이 값에서 멈춘다.\n * - 'xs' (444px)\n * - 'sm' (768px)\n * - 'md' (1024px)\n * - 'lg' (1280px)\n * - 'xl' (1440px)\n * - false (상한 없음)\n * @default 'lg'\n */\n maxWidth?: StnContainerMaxWidth\n /** 좌우 패딩 거터 비활성화 여부 */\n disableGutters?: boolean\n /**\n * true면 breakpoint마다 그 구간 폭으로 고정된다. 구간 안에서는 안 늘어난다.\n * `maxWidth`가 마지막 계단이다. 기본 `lg`면 768 → 1024 → 1280에서 멈춘다.\n */\n fixed?: boolean\n className?: string\n style?: CSSProperties\n children?: ReactNode\n} & Omit<React.ComponentPropsWithoutRef<T>, 'as' | 'component' | 'children' | 'className' | 'style'>\n\n/**\n * 본문 폭을 가운데로 제한하는 컨테이너.\n * 기본은 화면이 커지면 따라 늘다 `maxWidth`에서 멈춘다.\n * `fixed`는 breakpoint(768 / 1024 / 1280 / 1440)마다 폭이 한 단계씩 고정된다.\n */\nexport const StnContainer = forwardRef(function StnContainer<T extends ElementType = 'div'>(\n {\n component,\n as,\n maxWidth = 'lg',\n disableGutters = false,\n fixed = false,\n className,\n style,\n children,\n ...rest\n }: StnContainerProps<T>,\n ref: React.ForwardedRef<any>,\n) {\n const Component = component ?? as ?? 'div'\n\n const maxWidthClass = maxWidth ? `stn-container--${maxWidth}` : 'stn-container--fluid'\n\n return (\n <Component\n ref={ref}\n className={cn(\n 'stn-container',\n maxWidthClass,\n disableGutters && 'stn-container--disable-gutters',\n fixed && 'stn-container--fixed',\n className,\n )}\n style={style}\n {...rest}\n >\n {children}\n </Component>\n )\n})\n","import { forwardRef, type CSSProperties, type ElementType, type ReactNode } from 'react'\n\nimport { cn } from '../cn'\n\nexport type StnGridBreakpoint = 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n\n/** 숫자 또는 브레이크포인트 맵. xs는 기본, sm 768 · md 1024 · lg 1280 · xl 1440 */\nexport type StnGridResponsive<T> = T | Partial<Record<StnGridBreakpoint, T>>\n\n/**\n * MUI spacing 스텝. 8px 단위로 `--stn-spacing-grid-*`에 연결된다.\n * 0 → 0, 0.5 → 4, 1 → 8, 2 → 16, 3 → 24, 4 → 32, 8 → 64, 12 → 96\n */\nexport type StnGridSpacing = 0 | 0.5 | 1 | 2 | 3 | 4 | 8 | 12\n\nexport type StnGridDirection = 'row' | 'row-reverse' | 'column' | 'column-reverse'\n\n/** 12열 기준 칸 수, 남는 폭을 나누는 grow, 콘텐츠 폭 auto */\nexport type StnGridSize = number | 'grow' | 'auto'\n\nconst BREAKPOINTS = ['xs', 'sm', 'md', 'lg', 'xl'] as const\n\nconst SPACING_CLASS: Record<string, string> = {\n '0': '0',\n '0.5': '0-5',\n '1': '1',\n '2': '2',\n '3': '3',\n '4': '4',\n '8': '8',\n '12': '12',\n}\n\nconst JUSTIFY_CLASS = new Set([\n 'flex-start',\n 'center',\n 'flex-end',\n 'space-between',\n 'space-around',\n 'space-evenly',\n])\n\nconst ALIGN_CLASS = new Set(['flex-start', 'center', 'flex-end', 'stretch', 'baseline'])\n\nexport type StnGridProps<T extends ElementType = 'div'> = {\n /** 렌더링할 HTML 태그 또는 컴포넌트 (기본: 'div') */\n component?: T\n /** @alias component */\n as?: T\n /** true면 그리드 컨테이너 */\n container?: boolean\n /**\n * 열 수. 기본 12.\n * `columns={{ xs: 4, sm: 8, md: 12 }}`\n */\n columns?: StnGridResponsive<number>\n /**\n * 행·열 간격 스텝. `--stn-spacing-grid-*`를 사용한다.\n * `spacing={2}` → `var(--stn-spacing-grid-16)`\n */\n spacing?: StnGridResponsive<StnGridSpacing>\n /** 행 간격. 없으면 spacing을 따른다 */\n rowSpacing?: StnGridResponsive<StnGridSpacing>\n /** 열 간격. 없으면 spacing을 따른다 */\n columnSpacing?: StnGridResponsive<StnGridSpacing>\n /**\n * 칸 너비. 12열 기준 숫자, 남는 폭을 나누는 grow, 콘텐츠 폭 auto.\n * `size={8}` · `size=\"grow\"` · `size=\"auto\"` · `size={{ xs: 6, md: 'grow' }}`\n */\n size?: StnGridResponsive<StnGridSize>\n /**\n * 정렬 축. 지정하면 flex wrap 컨테이너가 된다.\n * row · row-reverse · column · column-reverse\n */\n direction?: StnGridDirection\n /** 주축 정렬. flex-start · center · flex-end · space-between · space-around · space-evenly */\n justifyContent?: CSSProperties['justifyContent']\n /** 교차축 정렬. flex-start · center · flex-end · stretch · baseline */\n alignItems?: CSSProperties['alignItems']\n className?: string\n style?: CSSProperties\n children?: ReactNode\n} & Omit<React.ComponentPropsWithoutRef<T>, 'as' | 'component' | 'children' | 'className' | 'style'>\n\nfunction isResponsiveObject<T>(value: StnGridResponsive<T>): value is Partial<Record<StnGridBreakpoint, T>> {\n return typeof value === 'object' && value !== null\n}\n\nfunction asMap<T>(value: StnGridResponsive<T> | undefined): Partial<Record<StnGridBreakpoint, T>> | undefined {\n if (value == null) return undefined\n return isResponsiveObject(value) ? value : { xs: value }\n}\n\nfunction classSuffix(bp: StnGridBreakpoint, token: string) {\n return bp === 'xs' ? token : `${bp}-${token}`\n}\n\nfunction modifierClasses<T>(\n prefix: string,\n value: StnGridResponsive<T> | undefined,\n tokenOf: (value: T) => string | undefined,\n) {\n const resolved = asMap(value)\n if (!resolved) return []\n const classes: string[] = []\n for (const bp of BREAKPOINTS) {\n const next = resolved[bp]\n if (next == null) continue\n const token = tokenOf(next)\n if (!token) continue\n classes.push(`${prefix}-${classSuffix(bp, token)}`)\n }\n return classes\n}\n\nfunction spacingSlug(step: number) {\n return SPACING_CLASS[String(step)]\n}\n\nfunction trackSlug(count: number) {\n return Number.isInteger(count) && count >= 1 && count <= 12 ? String(count) : undefined\n}\n\nfunction sizeClasses(size: StnGridResponsive<StnGridSize> | undefined) {\n const resolved = asMap(size)\n if (!resolved) return []\n const classes: string[] = []\n for (const bp of BREAKPOINTS) {\n const next = resolved[bp]\n if (next == null) continue\n if (next === 'grow' || next === 'auto') {\n classes.push(`stn-grid__item--size-${classSuffix(bp, next)}`)\n continue\n }\n const track = trackSlug(next)\n if (track) classes.push(`stn-grid__item--span-${classSuffix(bp, track)}`)\n }\n return classes\n}\n\n/**\n * 12열 flex 그리드. 컨테이너와 칸을 같은 컴포넌트로 쓴다.\n */\nexport const StnGrid = forwardRef(function StnGrid<T extends ElementType = 'div'>(\n {\n component,\n as,\n container = false,\n columns,\n spacing,\n rowSpacing,\n columnSpacing,\n size,\n direction,\n justifyContent,\n alignItems,\n className,\n style,\n children,\n ...rest\n }: StnGridProps<T>,\n ref: React.ForwardedRef<any>,\n) {\n const Component = component ?? as ?? 'div'\n const justify = typeof justifyContent === 'string' && JUSTIFY_CLASS.has(justifyContent) ? justifyContent : undefined\n const align = typeof alignItems === 'string' && ALIGN_CLASS.has(alignItems) ? alignItems : undefined\n\n return (\n <Component\n ref={ref}\n className={cn(\n container && 'stn-grid',\n ...(container ? modifierClasses('stn-grid--columns', columns ?? 12, trackSlug) : []),\n ...(container ? modifierClasses('stn-grid--row-spacing', rowSpacing ?? spacing, spacingSlug) : []),\n ...(container ? modifierClasses('stn-grid--column-spacing', columnSpacing ?? spacing, spacingSlug) : []),\n container && direction && `stn-grid--direction-${direction}`,\n container && justify && `stn-grid--justify-${justify}`,\n container && align && `stn-grid--align-${align}`,\n size != null && 'stn-grid__item',\n ...sizeClasses(size),\n className,\n )}\n style={style}\n {...rest}\n >\n {children}\n </Component>\n )\n})\n","import type { ReactNode } from 'react'\nimport type { StnLnbSide } from '@stn-uiux/pub-ui/data/stnLayout'\n\nimport { cn } from '../cn'\n\nexport type StnLayerShellProps = {\n /** L1 Main UI — 사이드 내비게이션 레일 (StnSideNavigation 등) */\n gnb?: ReactNode\n /** L1 Main UI — 사이드 네비 위치 @default 'left' */\n gnbSide?: StnLnbSide\n /** L1 Main UI — 상단 바 (StnHeader 등) · 네비 제외 영역 */\n header?: ReactNode\n /** L1 Content 본문 — layer1 미지정 시 children 사용 */\n children?: ReactNode\n /** 루트 래퍼 id */\n wrapId?: string\n /** 루트 래퍼 추가 클래스명 */\n wrapClassName?: string\n /** L1 Content 컨테이너 id */\n containerId?: string\n /** L1 Content 컨테이너 추가 클래스명 */\n containerClassName?: string\n /** 본문 추가 클래스명 */\n contentClassName?: string\n /** LNB·데이터 트리 열 위치 */\n lnbSide?: StnLnbSide\n\n // === 3단계 표준 레이어 슬롯 (L0 / L1 / L2) ===\n /** 본문 스크롤 허용 여부 (기본: true). 화면 높이 초과 시 내부 스크롤 허용 */\n scrollable?: boolean | 'auto' | 'y' | 'x'\n /** L0 배경 레이어 — `StnLayer.Background` / `StnLayer0Background` 등 (z-index: 0) */\n layer0?: ReactNode\n /** L1 메인 화면 본문 — `children`의 명시적 3단계 층위 슬롯 명칭 (z-index: 100) */\n layer1?: ReactNode\n /** L2 모달 다이얼로그 — `StnPopup` 등 (Dim 스크림 내장, z-index: 200) */\n layer2?: ReactNode\n /** toast · audio 등 유틸리티 오버레이 — `data-stn-layer-role=\"utility\"` */\n utilities?: ReactNode\n}\n\n/**\n * StnLayer role 기반 페이지 셸 — 3단계 층위 표준:\n * L0 Background · L1 Main UI (사이드바 + 우측 헤더/본문 스택 2분할 구조) · L2 Modal\n */\nexport function StnLayerShell({\n gnb,\n gnbSide = 'left',\n header,\n children,\n wrapId,\n wrapClassName,\n containerId,\n containerClassName,\n contentClassName,\n lnbSide: _lnbSide = 'left',\n scrollable = true,\n layer0,\n layer1,\n layer2,\n utilities,\n}: StnLayerShellProps) {\n const resolvedMainContent = layer1 ?? children\n const resolvedModal = layer2\n const isGnbRight = gnbSide === 'right'\n\n return (\n <div\n id={wrapId}\n data-stn-layer-mode=\"v2\"\n data-stn-gnb-side={gnbSide}\n className={cn('stn-wrap', isGnbRight && 'stn-wrap--gnb-right', wrapClassName)}\n >\n {/* L0: Background 레이어 */}\n {layer0}\n\n {/* L2: 유틸리티 (토스트 등) - 존재할 때만 렌더링 */}\n {utilities ? (\n <div className=\"stn-page-utilities\" data-stn-layer-role=\"utility\">\n {utilities}\n </div>\n ) : null}\n\n {/* L1: Main UI 도화지 (사이드 네비 + [헤더 + 본문]) */}\n <main\n id={containerId}\n data-stn-layer=\"1\"\n data-stn-layer-role=\"content\"\n className={cn('stn-layer-1', scrollable && 'scroll', containerClassName)}\n >\n {/* 좌측 사이드 네비 (gnbSide === 'left') */}\n {!isGnbRight && gnb}\n\n <div className=\"stn-layer-1__main\">\n {header ? <header className=\"stn-layer-1__header\">{header}</header> : null}\n <div className={cn('stn-layer-1__body', scrollable && 'stn-scroll', contentClassName)}>\n {resolvedMainContent}\n </div>\n </div>\n\n {/* 우측 사이드 네비 (gnbSide === 'right') */}\n {isGnbRight && gnb}\n </main>\n\n {/* L2: Modal / Dialog 레이어 */}\n {resolvedModal}\n </div>\n )\n}\n","import type { HTMLAttributes, ReactNode } from 'react'\nimport { cn } from '../../cn'\n\nexport type StnMapCanvasProps = HTMLAttributes<HTMLDivElement> & {\n children?: ReactNode\n className?: string\n}\n\n/**\n * 맵·토폴로지·차트 캔버스 마운트 컨테이너 컴포넌트\n * `.stn-map-canvas`를 제공하여 GIS 엔진 및 토폴로지 라이브러리를 안전하게 마운트합니다.\n */\nexport function StnMapCanvas({\n children,\n className,\n ...rest\n}: StnMapCanvasProps) {\n return (\n <div\n className={cn('stn-map-canvas', className)}\n data-stn-dashboard=\"canvas\"\n {...rest}\n >\n {children}\n </div>\n )\n}\n","import type { CSSProperties, HTMLAttributes, ReactNode } from 'react'\n\nimport { cn } from '../../cn'\nimport { StnMapCanvas, type StnMapCanvasProps } from './StnMapCanvas'\n\nexport type StnDashboardWidgetPosition = 'right' | 'left' | 'both' | 'none'\n\nexport type StnDashboardProps = HTMLAttributes<HTMLDivElement> & {\n children?: ReactNode\n className?: string\n /** 위젯 패널 위치 — 기본값 'right' */\n widgetPosition?: StnDashboardWidgetPosition\n /** 빈 대시보드 상태 (L0 배경만 노출) */\n empty?: boolean\n}\n\nexport type StnDashboardRegionProps = HTMLAttributes<HTMLDivElement> & {\n children?: ReactNode\n className?: string\n}\n\nconst fillStyle: CSSProperties = {\n flex: '1 1 0%',\n minHeight: 0,\n minWidth: 0,\n height: '100%',\n width: '100%',\n alignItems: 'stretch',\n}\n\nfunction StnDashboardRoot({\n children,\n className,\n widgetPosition = 'right',\n empty = false,\n style,\n ...rest\n}: StnDashboardProps) {\n const isLeft = widgetPosition === 'left'\n const isBoth = widgetPosition === 'both'\n\n return (\n <div\n className={cn(\n 'stn-dashboard',\n empty && 'stn-dashboard--empty',\n isLeft && 'stn-dashboard--widget-left',\n isBoth && 'stn-dashboard--widget-both',\n className,\n )}\n style={{\n ...fillStyle,\n display: 'flex',\n flexDirection: isLeft ? 'row-reverse' : 'row',\n gap: 8,\n ...style,\n }}\n data-stn-dashboard=\"root\"\n {...rest}\n >\n {children}\n </div>\n )\n}\n\nfunction StnDashboardLeft({\n children,\n className,\n style,\n ...rest\n}: StnDashboardRegionProps) {\n return (\n <div\n className={cn('stn-dashboard__left', className)}\n style={{\n minWidth: 0,\n minHeight: 0,\n flex: '1 1 0%',\n display: 'flex',\n flexDirection: 'column',\n gap: 8,\n height: '100%',\n ...style,\n }}\n data-stn-dashboard=\"left\"\n {...rest}\n >\n {children}\n </div>\n )\n}\n\nfunction StnDashboardRight({\n children,\n className,\n style,\n ...rest\n}: StnDashboardRegionProps) {\n return (\n <div\n className={cn('stn-dashboard__right', className)}\n style={{\n width: 320,\n flex: '0 0 320px',\n minWidth: 0,\n minHeight: 0,\n height: '100%',\n display: 'flex',\n flexDirection: 'column',\n gap: 8,\n overflow: 'hidden',\n boxSizing: 'border-box',\n ...style,\n }}\n data-stn-dashboard=\"right\"\n {...rest}\n >\n {children}\n </div>\n )\n}\n\nfunction StnDashboardTopRight({\n children,\n className,\n ...rest\n}: StnDashboardRegionProps) {\n return (\n <div\n className={cn('stn-dashboard__top-right', className)}\n data-stn-dashboard=\"top-right\"\n {...rest}\n >\n {children}\n </div>\n )\n}\n\n/**\n * 대시보드 레이아웃 — Pub 클래스(`.dashboard` / `_left` / `_right`)\n * Compound: `Left` · `Right` · `TopRight` · `Canvas`\n */\nexport const StnDashboard = Object.assign(StnDashboardRoot, {\n Root: StnDashboardRoot,\n Left: StnDashboardLeft,\n Right: StnDashboardRight,\n TopRight: StnDashboardTopRight,\n Canvas: StnMapCanvas,\n})\n\nexport type { StnMapCanvasProps }\n","import type { HTMLAttributes, ReactNode } from 'react'\n\nimport type { StnLnbSide } from '@stn-uiux/pub-ui/data/stnLayout'\n\nimport { cn } from '../../cn'\nimport { StnContainer } from '../../layouts/StnContainer'\nimport { StnLayerShell, type StnLayerShellProps } from '../../layouts/StnLayerShell'\nimport { StnHeader, StnHeaderPageTitle } from '../header/StnHeader'\nimport { StnDashboard } from '../dashboard/StnDashboard'\nimport { StnLayer, type StnLayerProps } from '../layer/StnLayer'\n\nexport type StnPageScaffoldRootProps = HTMLAttributes<HTMLDivElement> & {\n children?: ReactNode\n className?: string\n}\n\n/** 페이지 뼈대 루트 — 구역 조립용 래퍼 (로딩 UI 아님) */\nexport function StnPageScaffoldRoot({ children, className, ...rest }: StnPageScaffoldRootProps) {\n return (\n <div\n className={cn('stn-page-scaffold', className)}\n data-stn-page-scaffold=\"root\"\n {...rest}\n >\n {children}\n </div>\n )\n}\n\nexport type StnPageScaffoldRegionProps = HTMLAttributes<HTMLDivElement> & {\n label: string\n hint?: string\n children?: ReactNode\n className?: string\n}\n\n/** 빈 구역 라벨 — LNB·search·팝업 본문 등 */\nexport function StnPageScaffoldRegion({\n label,\n hint,\n children,\n className,\n ...rest\n}: StnPageScaffoldRegionProps) {\n return (\n <div className={cn('stn-page-scaffold__region', className)} data-stn-page-scaffold=\"region\" {...rest}>\n <span className=\"stn-page-scaffold__region-label\">{label}</span>\n {hint ? <span className=\"stn-page-scaffold__region-hint\">{hint}</span> : null}\n {children}\n </div>\n )\n}\n\nexport type StnPageScaffoldMapPlaceholderProps = HTMLAttributes<HTMLDivElement> & {\n message?: string\n note?: string\n className?: string\n}\n\n/** 맵·토폴로지 자리 — 실제 맵 JS 대신 안내 박스 */\nexport function StnPageScaffoldMapPlaceholder({\n message = '캔버스는 추후 연동',\n note = '토폴로지/맵 엔진은 이 영역(StnWidget variant=\"canvas\")에 마운트합니다.',\n className,\n children,\n ...rest\n}: StnPageScaffoldMapPlaceholderProps) {\n return (\n <div className=\"stn-widget shell-canvas stn-map-canvas\" data-stn-dashboard=\"canvas\">\n <div\n className={cn('stn-page-scaffold__canvas-placeholder', className)}\n data-stn-page-scaffold=\"canvas\"\n role=\"status\"\n {...rest}\n >\n <p className=\"stn-page-scaffold__canvas-placeholder-title\">{message}</p>\n {note ? <p className=\"stn-page-scaffold__canvas-placeholder-note\">{note}</p> : null}\n {children}\n </div>\n </div>\n )\n}\n\nexport type StnPageScaffoldMapCanvasProps = HTMLAttributes<HTMLDivElement> & {\n className?: string\n}\n\n/** 맵·토폴로지 마운트 — L0 배경만 보이는 빈 본문 (placeholder 박스 없음) */\nexport function StnPageScaffoldMapCanvas({\n className,\n children,\n ...rest\n}: StnPageScaffoldMapCanvasProps) {\n return (\n <div\n className={cn('stn-widget', 'shell-canvas', 'stn-map-canvas', 'stn-page-scaffold__canvas', className)}\n data-stn-page-scaffold=\"canvas\"\n data-stn-dashboard=\"canvas\"\n {...rest}\n >\n {children}\n </div>\n )\n}\n\nexport type StnPageScaffoldLayerProps = StnLayerProps & {\n /** DS·개발용 구역 라벨 (L3 팝업 본문 등) */\n label?: string\n hint?: string\n}\n\n/**\n * StnLayer + 뼈대 슬롯 — 예: L3 팝업 층에 “여기 본문” 표시\n * elevation은 StnLayer가 담당, 레이아웃 구역은 Page scaffold.\n */\nexport function StnPageScaffoldLayer({ label, hint, children, className, ...layerProps }: StnPageScaffoldLayerProps) {\n const labelText = label ? (hint ? `${label} · ${hint}` : label) : undefined\n return (\n <StnLayer\n className={cn(\n 'stn-page-scaffold__layer-slot',\n labelText && 'stn-page-scaffold__layer-slot--labeled',\n className,\n )}\n data-stn-scaffold-label={labelText}\n {...layerProps}\n >\n {children}\n </StnLayer>\n )\n}\n\n/** 토스 ListRow.AssetIcon 스타일 — StnPageScaffold.Region 조합 */\nexport const StnPageScaffold = Object.assign(StnPageScaffoldRoot, {\n Region: StnPageScaffoldRegion,\n MapPlaceholder: StnPageScaffoldMapPlaceholder,\n MapCanvas: StnPageScaffoldMapCanvas,\n Layer: StnPageScaffoldLayer,\n})\n\nexport type ListPageScaffoldProps = Omit<StnLayerShellProps, 'children' | 'header'> & {\n /** L1 Main UI — 사이드 네비 (StnSideNavigation) */\n gnb?: ReactNode\n /**\n * L1 Main UI — App header (`StnHeader` page 등).\n * `null`이면 헤더 없음. Map과 같이 `StnHeader` 전달 가능.\n */\n header?: ReactNode | null\n /** `header` 미지정 시 page title 기본값 */\n title?: string\n lnbHint?: string\n searchHint?: string\n tableHint?: string\n /** false면 LNB 영역 미렌더 */\n showLnb?: boolean\n /** `lnb_box` 슬롯 — 미지정 시 placeholder Region (보통 `StnSectionSide` + `StnTree`) */\n lnb?: ReactNode\n /** `search_area` 슬롯 — 미지정 시 placeholder Region */\n search?: ReactNode\n /** false면 search_area 미렌더 (has_sch는 호출측에서 빼세요) */\n showSearch?: boolean\n children?: ReactNode\n /** @deprecated StnLayerShell이 기본 표준 셸입니다. 생략 가능합니다. */\n shell?: 'layer'\n /** LNB 열 위치 — `has_lnb` ↔ `has_lnb_right` 자동 치환 (layer 셸) */\n lnbSide?: StnLnbSide\n /** L0 배경 — `StnLayer0Background` 등 */\n layer0?: ReactNode\n /** L1 메인 화면 본문 — `children`의 명시적 레이어 슬롯 명칭 */\n layer1?: ReactNode\n /** L2 모달 다이얼로그 — `StnPopup` 등 (Dim 스크림 내장) */\n layer2?: ReactNode\n}\n\nfunction listPageLnbClass(lnbSide: StnLnbSide): string {\n return lnbSide === 'right'\n ? 'stn-page-scaffold__lnb lnb_box lnb_box_right'\n : 'stn-page-scaffold__lnb lnb_box'\n}\n\n/** interface_list 계열 — Header · LNB · search · table 구역 */\nexport function ListPageScaffold({\n gnb,\n header,\n title = 'PAGE',\n lnbHint = 'LNB 트리 — 앱/도메인 마크업',\n searchHint = '검색 영역 (Search Area) + StnButton',\n tableHint = 'StnTable · 페이지네이션',\n showLnb = true,\n lnb,\n search,\n showSearch = true,\n children,\n lnbSide = 'left',\n scrollable = true,\n layer0,\n layer1,\n layer2,\n ...shellProps\n}: ListPageScaffoldProps & { scrollable?: boolean | 'auto' | 'y' | 'x' }) {\n const lnbClass = listPageLnbClass(lnbSide)\n const lnbAside = showLnb ? (\n <aside className={lnbClass}>{lnb ?? <StnPageScaffold.Region label=\"LNB\" hint={lnbHint} />}</aside>\n ) : null\n\n const resolvedContent = layer1 ?? children\n\n const body = (\n <StnPageScaffold>\n {lnbSide === 'left' ? lnbAside : null}\n {showSearch ? (\n <div className=\"stn-page-scaffold__search search_area\">\n {search ?? <StnPageScaffold.Region label=\"Search\" hint={searchHint} />}\n </div>\n ) : null}\n <div className={cn('stn-page-scaffold__content content_box', scrollable && 'is-scrollable')}>\n {resolvedContent ?? (\n <div className=\"stn-table stn-table--fill\">\n <StnPageScaffold.Region label=\"Table\" hint={tableHint} />\n </div>\n )}\n </div>\n {lnbSide === 'right' ? lnbAside : null}\n </StnPageScaffold>\n )\n\n const resolvedHeader =\n header === null\n ? undefined\n : (header ?? (\n <StnHeader variant=\"page\">\n <StnHeader.Left>\n <StnHeaderPageTitle>{title}</StnHeaderPageTitle>\n </StnHeader.Left>\n </StnHeader>\n ))\n\n return (\n <StnLayerShell\n gnb={gnb}\n lnbSide={lnbSide}\n header={resolvedHeader}\n scrollable={scrollable}\n layer0={layer0}\n layer1={body}\n layer2={layer2}\n {...shellProps}\n />\n )\n}\n\nexport type DashboardType = 'map' | 'topology' | 'widget-grid'\n\nexport type DashboardPageScaffoldProps = Omit<StnLayerShellProps, 'children' | 'header' | 'layer1'> & {\n /** 대시보드 스펙 구분자 — 'map' (GIS/맵) | 'topology' (네트워크 토폴로지) | 'widget-grid' (자유 위젯 그리드) */\n type?: DashboardType\n /** L1 content 본문 커스텀 — 미지정 시 left/right/MapPlaceholder 로 `.dashboard` 조립. layer1 슬롯을 따로 두지 않음 */\n children?: ReactNode\n gnb: ReactNode\n header?: ReactNode\n mapMessage?: string\n mapNote?: string\n kind?: 'map' | 'topology' | 'canvas'\n left?: ReactNode | null\n right?: ReactNode | null\n faultPanel?: ReactNode\n /** 위젯 패널 배치 위치 — 'right' (우측) | 'left' (좌측) | 'both' (양쪽) | 'none' (없음 - 100% Full Map) */\n widgetPosition?: 'right' | 'left' | 'both' | 'none'\n /** 우측 `stn-page-scaffold__region` / `dashboard_right` 영역 표시 여부 (기본 true, false 시 100% Full Map) */\n showRightRegion?: boolean\n /**\n * L1 content 비움 — `.dashboard` 자식 없이 L0 배경만\n * (`stn-dashboard--empty`)\n */\n bodyEmpty?: boolean\n wrapClassName?: string\n /** 본문 Container 스크롤 가능 여부 (기본: true). 초과 컨텐츠 시 내부 스크롤 허용 */\n scrollable?: boolean | 'auto' | 'y' | 'x'\n /** @deprecated StnLayerShell이 기본 표준 셸입니다. 생략 가능합니다. */\n shell?: 'layer'\n /** L0 배경 — `StnLayer0Background` */\n layer0?: ReactNode\n /** L2 모달 / 팝업 다이얼로그 (StnPopup 등) */\n layer2?: ReactNode\n}\n\n/** 대시보드 공통 스캐폴드 — type('map' | 'topology' | 'widget-grid')에 맞춰 Header/GNB/캔버스/L0 자동 매핑.\n * L1 `.stn-layer-1`: 좌측 사이드바 + 우측 본문 스택(Header + Grid) 2분할 구조.\n */\nexport function DashboardPageScaffold({\n type,\n children,\n gnb,\n header,\n mapMessage,\n mapNote,\n kind,\n left,\n right,\n faultPanel,\n widgetPosition = 'right',\n showRightRegion = true,\n bodyEmpty = false,\n wrapClassName,\n scrollable = true,\n layer0,\n layer2,\n ...shellProps\n}: DashboardPageScaffoldProps) {\n const resolvedType: DashboardType = type ?? (kind === 'topology' ? 'topology' : 'map')\n\n const finalWrapClassName =\n wrapClassName ??\n (resolvedType === 'map'\n ? 'stn-page--map-bg'\n : resolvedType === 'topology'\n ? 'stn-page--topology-bg'\n : '')\n\n const finalMapMessage =\n mapMessage ??\n (resolvedType === 'topology'\n ? 'Topology Dashboard 캔버스'\n : resolvedType === 'widget-grid'\n ? 'Widget Grid Board 캔버스'\n : 'Map Dashboard 캔버스')\n\n const finalMapNote =\n mapNote ??\n (resolvedType === 'topology'\n ? '네트워크 토폴로지 캔버스 마운트 영역'\n : resolvedType === 'widget-grid'\n ? 'Widget Grid (12열 자유 배치 보드) 마운트 영역'\n : 'GIS / 맵 엔진 마운트 영역')\n\n const isLeft = widgetPosition === 'left'\n const isBoth = widgetPosition === 'both'\n const isNone = widgetPosition === 'none' || !showRightRegion\n\n const mapColumn = (\n <StnDashboard.Left>\n <StnPageScaffold.MapPlaceholder message={finalMapMessage} note={finalMapNote} />\n {faultPanel}\n </StnDashboard.Left>\n )\n\n const rightWidgets = right ?? (\n <StnPageScaffold.Region label=\"dashboard_right\" hint=\"위젯·장애 패널\" />\n )\n\n const leftWidgets = left ?? right ?? (\n <StnPageScaffold.Region label=\"dashboard_right\" hint=\"좌측 위젯·장애 패널\" />\n )\n\n const dashboardGrid = bodyEmpty ? (\n <StnDashboard empty widgetPosition={widgetPosition} data-stn-page-scaffold=\"dashboard-empty\" />\n ) : isBoth ? (\n <StnDashboard widgetPosition=\"both\">\n <StnDashboard.Right>{leftWidgets}</StnDashboard.Right>\n {mapColumn}\n <StnDashboard.Right>{rightWidgets}</StnDashboard.Right>\n </StnDashboard>\n ) : isLeft ? (\n <StnDashboard widgetPosition=\"left\">\n <StnDashboard.Right>{leftWidgets}</StnDashboard.Right>\n {mapColumn}\n </StnDashboard>\n ) : (\n <StnDashboard widgetPosition={isNone ? 'none' : 'right'}>\n {mapColumn}\n {!isNone ? <StnDashboard.Right>{rightWidgets}</StnDashboard.Right> : null}\n </StnDashboard>\n )\n\n const contentNode = children ?? dashboardGrid\n\n return (\n <StnLayerShell\n gnb={gnb}\n wrapClassName={finalWrapClassName}\n header={header}\n layer0={layer0}\n layer2={layer2}\n {...shellProps}\n >\n {/* L1 높이 체인 앵커 — body > Container > (Stack|Grid|scroll-region) */}\n <StnContainer\n maxWidth={false}\n disableGutters\n className={scrollable === true || scrollable === 'auto' || scrollable === 'y' ? 'is-scrollable' : undefined}\n >\n {contentNode}\n </StnContainer>\n </StnLayerShell>\n )\n}\n","import type { HTMLAttributes, ReactNode } from 'react'\n\nimport { cn } from '../cn'\nimport { StnHeader, StnHeaderPageTitle } from '../patterns/header/StnHeader'\nimport { StnPageScaffold } from '../patterns/scaffold/StnPageScaffold'\n\nexport type StnListViewLayoutProps = Omit<HTMLAttributes<HTMLDivElement>, 'title'> & {\n /**\n * `StnLayerShell` / `ListPageScaffold` 안에서 쓸 때 `true`.\n * L0 · GNB · Header · `stn-content-area` 래퍼 없이\n * `StnPageScaffold`(LNB · search · table)만 렌더합니다.\n * @alias noShell\n */\n bare?: boolean\n /** @deprecated `bare` 사용 */\n noShell?: boolean\n /** 페이지 타이틀 (header 미지정 시 기본 StnHeader에 전달) */\n title?: string\n /** 상단 헤더 슬롯 (null 전달 시 헤더 안 함). `bare`일 때는 무시(셸이 담당) */\n header?: ReactNode | null\n /** 검색 조건 슬롯 (StnSearchRequirementBar 등) */\n search?: ReactNode\n /** LNB 사이드바 슬롯 (StnSectionSide + StnTree 등) */\n sidebar?: ReactNode\n /** 메인 데이터 테이블 슬롯 (StnTable 등) */\n table?: ReactNode\n /** 테이블 하단 페이징 슬롯 (StnPagination 등) */\n pagination?: ReactNode\n /** LNB 위치 — 'left' | 'right' (기본 'left') */\n lnbSide?: 'left' | 'right'\n /** 커스텀 본문 (search, table, pagination 조합 대신 직접 전달할 때) */\n children?: ReactNode\n}\n\nexport type StnListViewLayoutBodyProps = Pick<\n StnListViewLayoutProps,\n 'search' | 'sidebar' | 'table' | 'pagination' | 'lnbSide' | 'children' | 'className'\n>\n\n/** L1 listview 그리드 — `StnLayerShell` `stn-content-area` 직하위 또는 `bare` 루트 */\nexport function StnListViewLayoutBody({\n search,\n sidebar,\n table,\n pagination,\n lnbSide = 'left',\n children,\n className,\n}: StnListViewLayoutBodyProps) {\n const lnbClass =\n lnbSide === 'right'\n ? 'stn-page-scaffold__lnb lnb_box lnb_box_right'\n : 'stn-page-scaffold__lnb lnb_box'\n\n return (\n <StnPageScaffold className={cn('stn-list-view-layout__body', className)}>\n {lnbSide === 'left' && sidebar ? <aside className={lnbClass}>{sidebar}</aside> : null}\n\n {search ? <div className=\"stn-page-scaffold__search search_area\">{search}</div> : null}\n\n <div className=\"stn-page-scaffold__content content_box\">\n {children ?? (\n <div className=\"stn-table stn-table--fill\">\n {table}\n {pagination}\n </div>\n )}\n </div>\n\n {lnbSide === 'right' && sidebar ? <aside className={lnbClass}>{sidebar}</aside> : null}\n </StnPageScaffold>\n )\n}\n\nexport function StnListViewLayoutRoot({\n bare: bareProp,\n noShell,\n title = '목록 조회',\n header,\n search,\n sidebar,\n table,\n pagination,\n lnbSide = 'left',\n children,\n className,\n ...rest\n}: StnListViewLayoutProps) {\n const bare = bareProp ?? noShell ?? false\n const hasLnbClass = lnbSide === 'right' ? 'has_lnb_right' : 'has_lnb'\n\n const body = (\n <StnListViewLayoutBody\n search={search}\n sidebar={sidebar}\n table={table}\n pagination={pagination}\n lnbSide={lnbSide}\n className={bare ? className : undefined}\n >\n {children}\n </StnListViewLayoutBody>\n )\n\n if (bare) {\n return body\n }\n\n const renderedHeader =\n header === null ? null : header !== undefined ? (\n header\n ) : (\n <div className=\"stn-layer-1__header\">\n <StnHeader variant=\"page\">\n <StnHeader.Left>\n <StnHeaderPageTitle>{title}</StnHeaderPageTitle>\n </StnHeader.Left>\n </StnHeader>\n </div>\n )\n\n return (\n <div className={cn('stn-list-view-layout', 'stn-layer-1', className)} {...rest}>\n {renderedHeader}\n\n <div\n className={cn('stn-content-area', sidebar ? hasLnbClass : null, search ? 'has_sch' : null)}\n >\n {body}\n </div>\n </div>\n )\n}\n\nexport function StnListViewLayoutHeader({ className, children, ...rest }: HTMLAttributes<HTMLDivElement>) {\n return (\n <div className={cn('stn-layer-1__header', className)} {...rest}>\n {children}\n </div>\n )\n}\n\nexport function StnListViewLayoutSearch({ className, children, ...rest }: HTMLAttributes<HTMLDivElement>) {\n return (\n <div className={cn('search_area', className)} {...rest}>\n {children}\n </div>\n )\n}\n\nexport function StnListViewLayoutSidebar({\n side = 'left',\n className,\n children,\n ...rest\n}: HTMLAttributes<HTMLElement> & { side?: 'left' | 'right' }) {\n const lnbClass = side === 'right' ? 'lnb_box_right' : 'lnb_box'\n return (\n <aside className={cn(lnbClass, className)} {...rest}>\n {children}\n </aside>\n )\n}\n\nexport function StnListViewLayoutContent({ className, children, ...rest }: HTMLAttributes<HTMLDivElement>) {\n return (\n <div className={cn('content_box', className)} {...rest}>\n {children}\n </div>\n )\n}\n\nexport function StnListViewLayoutTable({ className, children, ...rest }: HTMLAttributes<HTMLDivElement>) {\n return (\n <div className={cn('stn-table', className)} {...rest}>\n {children}\n </div>\n )\n}\n\nexport function StnListViewLayoutPagination({ className, children, ...rest }: HTMLAttributes<HTMLDivElement>) {\n return (\n <div className={cn('stn-list-view-layout__pagination-wrap', className)} {...rest}>\n {children}\n </div>\n )\n}\n\nexport const StnListViewLayout = Object.assign(StnListViewLayoutRoot, {\n Body: StnListViewLayoutBody,\n Header: StnListViewLayoutHeader,\n Search: StnListViewLayoutSearch,\n Sidebar: StnListViewLayoutSidebar,\n Content: StnListViewLayoutContent,\n Table: StnListViewLayoutTable,\n Pagination: StnListViewLayoutPagination,\n})\n","import { useMemo, useState, type ReactNode } from 'react'\n\nimport {\n STN_ALERT_CENTER_DEMO_ALERTS,\n STN_ALERT_CENTER_DEMO_DEPLOY,\n STN_ALERT_CENTER_DEMO_WORK,\n} from '@stn-uiux/pub-ui/data/stnAlertCenter'\nimport { systemIconSrc } from '@stn-uiux/pub-ui/data/stnSystemIcons'\n\nimport { StnAlertCenterPanel } from '../alertCenter/StnAlertCenterPanel'\nimport { AlertCenterDashboard } from '../dashboard/AlertCenterDashboard'\nimport { StnSideNavigation } from '../sideNav/StnSideNavigation'\nimport { StnHeader } from '../header/StnHeader'\nimport { DashboardPageScaffold, StnPageScaffold, type DashboardPageScaffoldProps } from './StnPageScaffold'\n\nexport type AlertCenterPageScaffoldProps = Omit<\n DashboardPageScaffoldProps,\n 'gnb' | 'right' | 'faultPanel' | 'mapMessage' | 'mapNote'\n> & {\n /** 알림 패널 — 미지정 시 데모 StnAlertCenterPanel */\n gnbAlertPanel?: ReactNode\n defaultAlertOpen?: boolean\n mapMessage?: string\n mapNote?: string\n /** `.real_time_fault_status` 자리 placeholder */\n showFaultPanelPlaceholder?: boolean\n faultPanel?: ReactNode\n /** 우측 4위젯 — 기본 AlertCenterDashboard */\n right?: ReactNode\n clock?: ReactNode\n gnb?: ReactNode\n defaultGnbOpen?: boolean\n}\n\n/**\n * CLI(`widget-grid` · `map-dashboard` · `topology-dashboard`)와 동일한 기본 헤더.\n * `StnHeader variant=\"widget\"`\n */\nfunction defaultTopologyHeader(_clock?: ReactNode) {\n return <StnHeader variant=\"widget\" />\n}\n\n/**\n * `alert_center.html` 1단계 페이지 뼈대 — 맵 빈 칸 + 사이드바·알림 + 헤더(StnHeader widget) + 우측 위젯\n */\nexport function AlertCenterPageScaffold({\n gnbAlertPanel,\n defaultAlertOpen: _defaultAlertOpen = false,\n mapMessage = '맵은 추후 연동',\n mapNote,\n showFaultPanelPlaceholder = false,\n faultPanel,\n right,\n clock,\n header,\n wrapId,\n gnb: gnbProp,\n defaultGnbOpen = true,\n ...shellProps\n}: AlertCenterPageScaffoldProps) {\n const [gnbOpen, setGnbOpen] = useState(defaultGnbOpen)\n\n const panel = useMemo(\n () =>\n gnbAlertPanel ?? (\n <StnAlertCenterPanel\n alerts={STN_ALERT_CENTER_DEMO_ALERTS}\n workItems={STN_ALERT_CENTER_DEMO_WORK}\n deployItems={STN_ALERT_CENTER_DEMO_DEPLOY}\n />\n ),\n [gnbAlertPanel],\n )\n\n const sideNav = useMemo(\n () =>\n gnbProp ?? (\n <>\n <StnSideNavigation\n collapsed={!gnbOpen}\n onCollapseChange={(col) => setGnbOpen(!col)}\n >\n <StnSideNavigation.Header>\n <StnSideNavigation.Logo />\n <StnSideNavigation.Toggle />\n </StnSideNavigation.Header>\n <StnSideNavigation.Menu>\n <StnSideNavigation.Item iconSrc={systemIconSrc('line/layout-grid')} label=\"메인 대시보드\" active />\n <StnSideNavigation.Item iconSrc={systemIconSrc('line/server_2')} label=\"서버 모니터링\" />\n <StnSideNavigation.Item iconSrc={systemIconSrc('line/activity')} label=\"네트워크 분석\" />\n </StnSideNavigation.Menu>\n <StnSideNavigation.Spacer />\n <StnSideNavigation.Footer curved>\n <StnSideNavigation.Watermark />\n <StnSideNavigation.Item\n iconSrc={systemIconSrc('line/bell')}\n label=\"알림\"\n badge={12}\n // 알림센터 리디자인 전까지 패널 비활성\n onClick={undefined}\n />\n <StnSideNavigation.Item iconSrc={systemIconSrc('line/settings')} label=\"설정\" />\n </StnSideNavigation.Footer>\n </StnSideNavigation>\n {false ? panel : null}\n </>\n ),\n [gnbProp, gnbOpen, panel],\n )\n\n const faultSlot =\n faultPanel ??\n (showFaultPanelPlaceholder ? (\n <div className=\"wrap_real_time stn-page-scaffold__fault-ph\">\n <StnPageScaffold.Region label=\"실시간 장애 현황\" hint=\"StnWidget shell=fault-panel · 선택\" />\n </div>\n ) : null)\n\n return (\n <DashboardPageScaffold\n gnb={sideNav}\n header={header ?? defaultTopologyHeader(clock)}\n mapMessage={mapMessage}\n mapNote={mapNote}\n faultPanel={faultSlot}\n right={right ?? <AlertCenterDashboard />}\n wrapId={wrapId}\n wrapClassName=\"stn-page--map-bg\"\n {...shellProps}\n />\n )\n}\n","import { useState, type FormEvent, type ReactNode } from 'react'\n\nimport { cn } from '../../cn'\nimport { StnButton } from '../../components/StnButton'\nimport { StnLogo } from '../../components/StnLogo'\nimport { StnSegmented } from '../../components/StnSegmented'\nimport { StnLoginTextField } from '../login/StnLoginTextField'\nimport {\n StnLoginBrandStack,\n StnLoginCard,\n StnLoginFormFields,\n StnLoginFormLinks,\n StnLoginFormStack,\n StnLoginPlaceholder,\n type StnLoginCardVariant,\n} from '../login/StnLoginCard'\nimport { StnLayer0Background } from '../background/StnLayer0Background'\nimport type { StnLayerShellProps } from '../../layouts/StnLayerShell'\n\nexport type LoginPageScaffoldProps = Omit<StnLayerShellProps, 'children' | 'gnb' | 'header' | 'layer1' | 'layer2'> & {\n /** L0 배경 — 기본 `StnLayer0Background variant=\"login\"` */\n layer0?: ReactNode\n /** 기본 카드의 로고 — `children`을 넘기면 무시 */\n logo?: ReactNode\n productCaption?: string\n /** 카드 테두리 회전 레이저 빔 애니메이션 여부 */\n cardGlow?: boolean\n /** 카드 스타일 변형 ('default' | 'glow') */\n cardVariant?: StnLoginCardVariant\n /** 소셜 로그인 탭 선택 시 노출할 커스텀 콘텐츠. 미지정 시 기본 `<StnLoginPlaceholder />` 노출 */\n socialContent?: ReactNode\n /** L1 카드. 기본은 `StnLoginCard` + 기본 폼. 직접 넘기면 카드 전체를 교체 */\n children?: ReactNode\n onLogin?: (id: string, password: string) => void\n signUpHref?: string\n recoverHref?: string\n}\n\nconst LOGIN_TABS = [\n { value: 'normal', label: '일반 로그인' },\n { value: 'social', label: '소셜 로그인' },\n] as const\n\nfunction DefaultLoginForm({\n onLogin,\n socialContent,\n signUpHref = '#',\n recoverHref = '#',\n}: {\n onLogin?: (id: string, password: string) => void\n socialContent?: ReactNode\n signUpHref?: string\n recoverHref?: string\n}) {\n const [mode, setMode] = useState<'normal' | 'social'>('normal')\n const [userId, setUserId] = useState('')\n const [password, setPassword] = useState('')\n\n function handleSubmit(e: FormEvent) {\n e.preventDefault()\n onLogin?.(userId, password)\n }\n\n return (\n <StnLoginFormStack onSubmit={handleSubmit}>\n <StnSegmented\n aria-label=\"로그인 방식\"\n value={mode}\n onChange={(v) => setMode(v as 'normal' | 'social')}\n options={LOGIN_TABS}\n />\n {mode === 'normal' ? (\n <StnLoginFormFields>\n <StnLoginTextField\n icon=\"line/user\"\n name=\"username\"\n autoComplete=\"username\"\n placeholder=\"아이디\"\n value={userId}\n onChange={(e) => setUserId(e.target.value)}\n aria-label=\"아이디\"\n />\n <StnLoginTextField\n icon=\"line/lock\"\n type=\"password\"\n name=\"password\"\n autoComplete=\"current-password\"\n placeholder=\"비밀번호\"\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n aria-label=\"비밀번호\"\n />\n </StnLoginFormFields>\n ) : (\n socialContent ?? <StnLoginPlaceholder />\n )}\n <StnButton type=\"submit\" size=\"xl\" fullWidth>\n 로그인\n </StnButton>\n <StnLoginFormLinks>\n <a href={signUpHref}>회원가입</a>\n <a href={recoverHref}>아이디 / 비밀번호 찾기</a>\n </StnLoginFormLinks>\n </StnLoginFormStack>\n )\n}\n\nfunction DefaultLoginCard({\n logo,\n productCaption,\n glow,\n variant,\n socialContent,\n onLogin,\n signUpHref,\n recoverHref,\n}: {\n logo?: ReactNode\n productCaption: string\n glow?: boolean\n variant?: StnLoginCardVariant\n socialContent?: ReactNode\n onLogin?: (id: string, password: string) => void\n signUpHref?: string\n recoverHref?: string\n}) {\n return (\n <StnLoginCard\n glow={glow}\n variant={variant}\n brand={\n <StnLoginBrandStack>\n {logo ?? <StnLogo variant=\"vertical\" size=\"xl\" />}\n <p className=\"stn-login-card__caption\">{productCaption}</p>\n </StnLoginBrandStack>\n }\n >\n <DefaultLoginForm\n onLogin={onLogin}\n socialContent={socialContent}\n signUpHref={signUpHref}\n recoverHref={recoverHref}\n />\n </StnLoginCard>\n )\n}\n\n/**\n * Login 화면 레시피 — L0 + L1 중앙. 카드는 `StnLoginCard`, 배경은 `StnLayer0Background`.\n */\nexport function LoginPageScaffold({\n layer0,\n logo,\n productCaption = 'Server Resource Monitoring',\n cardGlow,\n cardVariant,\n socialContent,\n children,\n wrapClassName,\n onLogin,\n signUpHref,\n recoverHref,\n ...shellProps\n}: LoginPageScaffoldProps) {\n const resolvedLayer0 = layer0 ?? <StnLayer0Background variant=\"login\" />\n const resolvedCard =\n children ?? (\n <DefaultLoginCard\n logo={logo}\n productCaption={productCaption}\n glow={cardGlow}\n variant={cardVariant}\n socialContent={socialContent}\n onLogin={onLogin}\n signUpHref={signUpHref}\n recoverHref={recoverHref}\n />\n )\n\n\n return (\n <div\n className={cn('stn-wrap stn-page--login', wrapClassName)}\n data-stn-layer-mode=\"v2\"\n {...shellProps}\n >\n {resolvedLayer0}\n <div className=\"stn-login\">\n {resolvedCard}\n </div>\n </div>\n )\n}\n","import React from 'react';\nimport { cn } from '../../cn';\nimport { StnButton } from '../../components/StnButton';\nimport { StnDropdown, type StnDropdownOption } from '../../components/StnDropdown';\n\nexport type StnToolbarOrientation = 'horizontal' | 'vertical';\n\nexport type StnFloatingToolbarPlacement =\n | 'none'\n | 'bottom-left'\n | 'bottom-center'\n | 'bottom-right'\n | 'top-left'\n | 'top-right'\n | 'center-left'\n | 'center-right';\n\nexport interface StnFloatingToolbarProps extends React.HTMLAttributes<HTMLDivElement> {\n /** 캔버스 기준 고정 위치 (기본값: 'none' - 인라인 플렉스) */\n placement?: StnFloatingToolbarPlacement;\n /** 툴바 방향 (기본값: 'horizontal') */\n orientation?: StnToolbarOrientation;\n /** 추가 클래스 */\n className?: string;\n children?: React.ReactNode;\n}\n\nexport interface StnMapToolbarProps extends StnFloatingToolbarProps {\n /** 뷰 모드 드롭다운 옵션 (미지정 시 기본 ['구면', '평면', '원형'] 제공) */\n modeOptions?: StnDropdownOption[];\n /** 현재 선택된 뷰 모드 값 */\n modeValue?: string;\n /** 뷰 모드 변경 콜백 */\n onModeChange?: (value: string) => void;\n /** 드롭다운 너비 (기본값: 110px) */\n dropdownWidth?: number | string;\n /** 툴바 버튼 스타일 (기본값: 'ghost') */\n buttonVariant?: 'ghost' | 'outlined';\n /** 초기화(Restore) 버튼 클릭 핸들러 */\n onRestore?: () => void;\n /** 전체화면(Fullscreen) 버튼 클릭 핸들러 */\n onFullscreen?: () => void;\n /** 확대(Zoom In) 버튼 클릭 핸들러 */\n onZoomIn?: () => void;\n /** 축소(Zoom Out) 버튼 클릭 핸들러 */\n onZoomOut?: () => void;\n /** 새로고침(Refresh) 버튼 클릭 핸들러 */\n onRefresh?: () => void;\n /** 추가 커스텀 액션 버튼들 */\n extraActions?: React.ReactNode;\n}\n\nconst DEFAULT_MAP_MODES: StnDropdownOption[] = [\n { value: 'sphere', label: '구면' },\n { value: 'plane', label: '평면' },\n { value: 'circle', label: '원형' },\n];\n\n/**\n * StnFloatingToolbar\n * 지도, 차트, 토폴로지 캔버스 위에 플로팅되는 툴바 컨테이너입니다.\n */\nexport const StnFloatingToolbar = React.forwardRef<HTMLDivElement, StnFloatingToolbarProps>(\n ({ placement = 'none', orientation = 'horizontal', className, children, ...restProps }, ref) => {\n const placementClass = placement !== 'none' ? `stn-floating-toolbar--${placement}` : '';\n const orientationClass = orientation === 'vertical' ? 'stn-floating-toolbar--vertical' : '';\n\n return (\n <div\n ref={ref}\n className={cn('stn-floating-toolbar', placementClass, orientationClass, className)}\n data-orientation={orientation}\n role=\"toolbar\"\n {...restProps}\n >\n {children}\n </div>\n );\n }\n);\n\nStnFloatingToolbar.displayName = 'StnFloatingToolbar';\n\n/**\n * StnMapToolbar\n * mockup/index.html의 토폴로지/지도 하단 툴바(topo-toolbar-container)를\n * 완벽히 재현한 통합 패턴 컴포넌트입니다.\n * 32px 드롭다운과 4px 각진 아이콘 버튼(StnButton shape=\"square\")으로 구성됩니다.\n */\nexport const StnMapToolbar = React.forwardRef<HTMLDivElement, StnMapToolbarProps>(\n (\n {\n placement = 'none',\n orientation = 'horizontal',\n modeOptions = DEFAULT_MAP_MODES,\n modeValue = 'sphere',\n onModeChange,\n dropdownWidth = 110,\n buttonVariant = 'ghost',\n onRestore,\n onFullscreen,\n onZoomIn,\n onZoomOut,\n onRefresh,\n extraActions,\n className,\n children,\n ...restProps\n },\n ref\n ) => {\n return (\n <StnFloatingToolbar\n ref={ref}\n placement={placement}\n orientation={orientation}\n className={cn('stn-map-toolbar', className)}\n aria-label=\"지도 및 토폴로지 도구 모음\"\n {...restProps}\n >\n {/* 1. 뷰 모드 드롭다운 */}\n {modeOptions && modeOptions.length > 0 && (\n <StnDropdown\n size=\"md\"\n width={dropdownWidth}\n options={modeOptions}\n value={modeValue}\n onChange={onModeChange}\n aria-label=\"투영 모드 선택\"\n />\n )}\n\n {/* 2. 표준 컨트롤 버튼들 (shape=\"square\" 32px 아이콘 버튼) */}\n {onRestore && (\n <StnButton\n variant={buttonVariant}\n size=\"md\"\n shape=\"square\"\n icon={\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M3.06006 13C3.30547 15.1939 4.34865 17.221 5.9912 18.696C7.63374 20.1709 9.76108 20.9907 11.9686 20.9994C14.1762 21.0081 16.3099 20.2052 17.9641 18.7434C19.6183 17.2815 20.6775 15.2627 20.9403 13.0708C21.2031 10.879 20.6511 8.66696 19.3894 6.85551C18.1276 5.04406 16.2441 3.75951 14.0971 3.24618C11.95 2.73284 9.68922 3.02652 7.74457 4.07135C5.79993 5.11619 4.30712 6.83931 3.55006 8.913\" />\n <path d=\"M3 4.00098V9.00098H8\" />\n <circle cx=\"12\" cy=\"12\" r=\"1\" fill=\"currentColor\" />\n </svg>\n }\n aria-label=\"초기화 (Restore)\"\n title=\"초기화 (Restore)\"\n onClick={onRestore}\n />\n )}\n\n {onFullscreen && (\n <StnButton\n variant={buttonVariant}\n size=\"md\"\n shape=\"square\"\n icon={\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M16 4H20V8\" />\n <path d=\"M14 10L20 4\" />\n <path d=\"M8 20H4V16\" />\n <path d=\"M4 20L10 14\" />\n </svg>\n }\n aria-label=\"전체화면\"\n title=\"전체화면\"\n onClick={onFullscreen}\n />\n )}\n\n {onZoomIn && (\n <StnButton\n variant={buttonVariant}\n size=\"md\"\n shape=\"square\"\n icon={\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M12 5V19\" />\n <path d=\"M5 12H19\" />\n </svg>\n }\n aria-label=\"확대\"\n title=\"확대\"\n onClick={onZoomIn}\n />\n )}\n\n {onZoomOut && (\n <StnButton\n variant={buttonVariant}\n size=\"md\"\n shape=\"square\"\n icon={\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M5 12H19\" />\n </svg>\n }\n aria-label=\"축소\"\n title=\"축소\"\n onClick={onZoomOut}\n />\n )}\n\n {onRefresh && (\n <StnButton\n variant={buttonVariant}\n size=\"md\"\n shape=\"square\"\n icon={\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M20 11C19.7554 9.24023 18.9391 7.60967 17.6766 6.35951C16.4142 5.10934 14.7758 4.30893 13.0137 4.08156C11.2516 3.8542 9.46362 4.21249 7.9252 5.10126C6.38678 5.99002 5.18325 7.35995 4.5 9.00001M4 5.00001V9.00001H8\" />\n <path d=\"M4 13C4.24456 14.7598 5.06093 16.3903 6.32336 17.6405C7.58579 18.8907 9.22424 19.6911 10.9863 19.9184C12.7484 20.1458 14.5364 19.7875 16.0748 18.8988C17.6132 18.01 18.8168 16.6401 19.5 15M20 19V15H16\" />\n </svg>\n }\n aria-label=\"새로고침\"\n title=\"새로고침\"\n onClick={onRefresh}\n />\n )}\n\n {extraActions}\n {children}\n </StnFloatingToolbar>\n );\n }\n);\n\nStnMapToolbar.displayName = 'StnMapToolbar';\n\nexport type StnFloatingToolbarPresetProps = StnMapToolbarProps;\nexport const StnFloatingToolbarPreset = StnMapToolbar;\n"],"mappings":"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","names":["jsx","jsx","StnButton","forwardRef","useCallback","useState","jsx","jsxs","forwardRef","StnSlider","useState","useCallback","sizeClass","systemIconSrc","resolveSystemIconSrcFromName","jsx","forwardRef","jsx","jsxs","forwardRef","StnPagination","forwardRef","useEffect","forwardRef","jsx","forwardRef","StnLayer","jsx","jsxs","forwardRef","StnPopup","useEffect","jsx","jsx","forwardRef","useEffect","jsx","jsxs","forwardRef","StnProgressBar","useEffect","forwardRef","useId","jsx","jsxs","forwardRef","StnCircularProgress","useId","forwardRef","createContext","useContext","useEffect","useRef","useState","forwardRef","useEffect","useId","useRef","jsx","jsxs","forwardRef","StnCheckbox","useId","useRef","useEffect","jsx","jsxs","createContext","useState","useRef","useEffect","forwardRef","StnTableGrid","StnTableHead","StnTableBody","StnTableRow","useContext","StnTableTh","StnTableTd","StnTableThCheck","StnTableTdCheck","StnTableSort","forwardRef","useCallback","useMemo","useState","forwardRef","resolveSystemIconSrcFromName","jsx","jsxs","resolveSystemIconSrcFromName","forwardRef","StnTreeNode","jsx","jsxs","useState","useCallback","forwardRef","StnTree","useMemo","forwardRef","useId","jsx","jsxs","forwardRef","StnScroll","useId","forwardRef","jsx","forwardRef","StnSectionSide","forwardRef","jsx","jsxs","forwardRef","StnLoginCardGlowWrapper","StnLoginCard","StnLoginBrandStack","StnLoginFormStack","StnLoginFormFields","StnLoginFormLinks","StnLoginPlaceholder","cloneElement","forwardRef","isValidElement","jsx","jsxs","forwardRef","StnLoginTextField","isValidElement","cloneElement","forwardRef","jsx","jsxs","forwardRef","StnLogo","jsx","jsxs","colorClass","jsx","jsxs","variantClass","React","jsx","jsxs","React","jsx","jsxs","forwardRef","useState","Fragment","jsx","jsxs","forwardRef","StnToggleButton","useState","forwardRef","useId","jsx","jsxs","forwardRef","StnSwitch","useId","sizeClass","forwardRef","useId","jsx","jsxs","forwardRef","StnRadio","useId","sizeClass","useId","jsx","useId","useId","jsx","jsxs","useId","useCallback","useEffect","useId","useRef","useState","jsx","jsxs","useState","useCallback","useId","useRef","useEffect","jsx","forwardRef","useId","jsx","jsxs","sizeClass","variantClass","forwardRef","StnTextField","useId","forwardRef","jsx","jsxs","normalizeSize","sizeClass","forwardRef","StnDateRangeField","STN_DATE_RANGE_FIELD_DEMO","formatStnDateRangeFieldValue","parseStnDateRangeFieldValue","STN_SEARCH_REQUIREMENT_DEMO_FIELDS","jsx","jsxs","useCallback","useEffect","useRef","useState","createPortal","formatStnDateRangeFieldValue","useCallback","useEffect","useId","useMemo","useState","jsx","jsxs","useState","useEffect","useMemo","useId","useCallback","jsx","jsxs","useState","useCallback","formatStnDateRangeFieldValue","useRef","useEffect","createPortal","jsx","jsxs","jsx","variantClass","STN_LAYER0_BACKGROUND_DEMO_IMAGES","STN_LAYER0_MAP_LIGHT_OVERLAY","jsx","jsxs","STN_DATE_PICKER_WEEKDAYS","Children","Fragment","cloneElement","isValidElement","React","jsx","jsxs","SEVERITY_ICONS","React","jsx","jsxs","_","useId","jsx","jsxs","jsx","jsxs","useId","useState","jsx","jsxs","useState","Fragment","jsx","jsxs","isValidElement","cloneElement","Children","resolveStnWidgetBackground","Children","forwardRef","Fragment","isValidElement","jsx","jsxs","forwardRef","StnStack","Children","isValidElement","Fragment","jsx","jsxs","jsx","jsxs","useId","useState","jsx","jsxs","useId","useState","jsx","STN_ALERT_CENTER_TABS","STN_ALERT_CENTER_TAB_IDS","STN_ALERT_CENTER_DEMO_ALERTS","STN_ALERT_CENTER_DEMO_WORK","STN_ALERT_CENTER_DEMO_DEPLOY","createContext","useContext","forwardRef","jsx","jsxs","maskStyle","forwardRef","StnSideNavItem","forwardRef","forwardRef","jsx","forwardRef","StnSideNavLogo","Fragment","jsx","jsxs","forwardRef","StnSideNavHeader","forwardRef","jsx","forwardRef","StnSideNavMenu","forwardRef","useEffect","useRef","useState","jsx","jsxs","forwardRef","StnSideNavGroup","useState","useRef","useEffect","forwardRef","jsx","forwardRef","StnSideNavSpacer","forwardRef","jsx","forwardRef","StnSideNavFooter","forwardRef","jsx","forwardRef","StnSideNavToggle","forwardRef","jsx","forwardRef","StnSideNavWatermark","forwardRef","jsx","jsxs","forwardRef","StnSideNavMobileTrigger","forwardRef","jsx","forwardRef","StnSideNavSub","StnSideNavSubItem","forwardRef","jsx","forwardRef","StnSideNavSubNav","forwardRef","useCallback","useMemo","useState","jsx","jsxs","useState","useCallback","forwardRef","StnSideNavigationRoot","useMemo","Fragment","useEffect","useId","useRef","useState","Fragment","jsx","jsxs","maskStyle","useRef","useEffect","useId","useState","useEffect","useState","jsx","jsxs","useState","useEffect","forwardRef","jsx","forwardRef","StnContainer","forwardRef","jsx","BREAKPOINTS","JUSTIFY_CLASS","ALIGN_CLASS","isResponsiveObject","forwardRef","StnGrid","jsx","jsxs","jsx","jsx","jsx","jsxs","StnLayer","jsx","jsxs","useMemo","useState","Fragment","jsx","jsxs","useState","useMemo","useState","jsx","jsxs","useState","STN_LAYER_ROLE_TO_LEVEL","React","jsx","jsxs","React"]}
|
|
1
|
+
{"version":3,"sources":["../src/cn.ts","../src/paginationRange.ts","../src/StnProvider.tsx","../src/StnContext.tsx","../src/components/StnButton.tsx","../src/components/StnIcon.tsx","../src/components/StnSlider.tsx","../src/index.ts","../src/components/StnIconBox.tsx","../src/components/StnPagination.tsx","../src/components/StnPopup.tsx","../src/patterns/layer/StnLayer.tsx","../src/components/toast/StnToastCloseButton.tsx","../src/components/toast/StnToastIcon.tsx","../src/components/StnProgressBar.tsx","../src/components/StnCircularProgress.tsx","../src/components/StnTable.tsx","../src/components/StnCheckbox.tsx","../src/components/StnTree.tsx","../src/components/StnTreeNode.tsx","../src/stnTreeFlatten.ts","../src/components/StnScroll.tsx","../src/patterns/sectionSide/StnSectionSide.tsx","../src/patterns/login/StnLoginCard.tsx","../src/patterns/login/StnLoginTextField.tsx","../src/components/StnLogo.tsx","../src/components/StnBadge.tsx","../src/components/StnChip.tsx","../src/components/StnSeverityBadge.tsx","../src/components/StnSystemChip.tsx","../src/components/StnToggleButton.tsx","../src/components/StnSwitch.tsx","../src/components/StnRadio.tsx","../src/components/StnRadioGroup.tsx","../src/components/StnSegmented.tsx","../src/components/StnDropdown.tsx","../src/inputWidth.ts","../src/components/StnDropdownMenu.tsx","../src/components/StnTextField.tsx","../src/components/StnDateRangeField.tsx","../src/patterns/search/StnSearchRequirementBar.tsx","../src/patterns/search/StnSearchRequirementBarDemo.tsx","../src/components/datePicker/StnDateRangePickerField.tsx","../src/components/datePicker/StnDateRangePicker.tsx","../src/components/datePicker/stnCalendarUtils.ts","../src/patterns/header/StnHeader.tsx","../src/patterns/background/StnLayer0Background.tsx","../src/components/StnWidget.tsx","../src/components/StnEventBanner.tsx","../src/patterns/scaffold/StnLoadingSkeleton.tsx","../src/components/topology/StnTopologyRing.tsx","../src/components/topology/stnTopologyShared.ts","../src/components/topology/StnTopologyNodeMark.tsx","../src/components/topology/StnTopologyGraph.tsx","../src/layouts/StnStack.tsx","../src/patterns/dashboard/AlertCenterDashboard.tsx","../src/patterns/dashboard/PubDashboardWidgetBodies.tsx","../src/patterns/alertCenter/StnAlertCenterPanel.tsx","../src/patterns/alertCenter/StnAlertCenterDocPreview.tsx","../src/components/sideNav/SideNavContext.ts","../src/components/sideNav/StnSideNavItem.tsx","../src/components/sideNav/StnSideNavHeader.tsx","../src/components/sideNav/StnSideNavLogo.tsx","../src/components/sideNav/StnSideNavMenu.tsx","../src/components/sideNav/StnSideNavGroup.tsx","../src/components/sideNav/StnSideNavSpacer.tsx","../src/components/sideNav/StnSideNavFooter.tsx","../src/components/sideNav/StnSideNavToggle.tsx","../src/components/sideNav/StnSideNavWatermark.tsx","../src/components/sideNav/StnSideNavMobileTrigger.tsx","../src/components/sideNav/StnSideNavSub.tsx","../src/components/sideNav/StnSideNavSubNav.tsx","../src/patterns/sideNav/StnSideNavigation.tsx","../src/components/StnBreadcrumb.tsx","../src/components/StnHeaderTitle.tsx","../src/layouts/StnContainer.tsx","../src/layouts/StnGrid.tsx","../src/layouts/StnLayerShell.tsx","../src/patterns/dashboard/StnMapCanvas.tsx","../src/patterns/dashboard/StnDashboard.tsx","../src/patterns/scaffold/StnPageScaffold.tsx","../src/layouts/StnListViewLayout.tsx","../src/patterns/scaffold/AlertCenterPageScaffold.tsx","../src/patterns/scaffold/LoginPageScaffold.tsx","../src/patterns/toolbar/StnFloatingToolbar.tsx"],"sourcesContent":["/** Join truthy class fragments (no dependency on clsx). */\nexport function cn(...parts: Array<string | false | null | undefined>): string {\n return parts.filter(Boolean).join(' ')\n}\n","export type StnPaginationItem = number | 'ellipsis'\n\n/**\n * Infomap Figma `paging` (node 40000042:210340)\n * 시작 근처: 1 2 3 4 5 … N\n * 끝 근처: 1 … N-4 … N\n * 중간: 1 … c-1 c c+1 … N\n */\nexport function buildPaginationItems(\n page: number,\n pageCount: number,\n siblingCount = 1,\n): StnPaginationItem[] {\n if (pageCount < 1) return []\n if (pageCount === 1) return [1]\n\n const current = Math.min(Math.max(1, page), pageCount)\n const range = (start: number, end: number) =>\n Array.from({ length: Math.max(0, end - start + 1) }, (_, i) => start + i)\n\n if (pageCount <= 7) return range(1, pageCount)\n\n /** Infomap start/end cluster length (Figma: 1…5 … 15) */\n const cluster = 5\n const side = Math.max(1, siblingCount)\n\n if (current <= cluster - 1) {\n return [...range(1, cluster), 'ellipsis', pageCount]\n }\n\n if (current >= pageCount - (cluster - 2)) {\n return [1, 'ellipsis', ...range(pageCount - cluster + 1, pageCount)]\n }\n\n return [\n 1,\n 'ellipsis',\n ...range(current - side, current + side),\n 'ellipsis',\n pageCount,\n ]\n}\n","import { useCallback, useEffect, useState, type ReactNode } from 'react'\nimport { cn } from './cn'\nimport { StnContext, type StnTheme } from './StnContext'\n\nexport type StnProviderProps = {\n children: ReactNode\n theme?: StnTheme\n defaultTheme?: StnTheme\n onThemeChange?: (theme: StnTheme) => void\n applyThemeToDocument?: boolean\n className?: string\n}\n\nexport function StnProvider({\n children,\n theme: themeProp,\n defaultTheme = 'light',\n onThemeChange,\n applyThemeToDocument = false,\n className,\n}: StnProviderProps) {\n const [internalTheme, setInternalTheme] = useState<StnTheme>(defaultTheme)\n const theme = themeProp ?? internalTheme\n\n const setTheme = useCallback(\n (next: StnTheme) => {\n if (themeProp === undefined) setInternalTheme(next)\n onThemeChange?.(next)\n },\n [themeProp, onThemeChange],\n )\n\n useEffect(() => {\n if (!applyThemeToDocument) return\n const el = document.documentElement\n const prev = el.getAttribute('data-theme')\n el.setAttribute('data-theme', theme)\n return () => {\n if (prev === null) el.removeAttribute('data-theme')\n else el.setAttribute('data-theme', prev)\n }\n }, [theme, applyThemeToDocument])\n\n const value = { theme, setTheme }\n\n if (applyThemeToDocument) {\n return <StnContext.Provider value={value}>{children}</StnContext.Provider>\n }\n\n return (\n <StnContext.Provider value={value}>\n <div className={cn(className)} data-theme={theme}>\n {children}\n </div>\n </StnContext.Provider>\n )\n}\n","import { createContext, useContext } from 'react'\n\nexport type StnTheme = 'light' | 'dark'\n\nexport type StnContextValue = {\n theme: StnTheme\n setTheme: (theme: StnTheme) => void\n}\n\nexport const StnContext = createContext<StnContextValue | null>(null)\n\nexport function useStn(): StnContextValue {\n const ctx = useContext(StnContext)\n if (!ctx) {\n return {\n theme: 'light',\n setTheme: () => {},\n }\n }\n return ctx\n}\n\nexport function useStnOptional(): StnContextValue | null {\n return useContext(StnContext)\n}\n","import { cloneElement, forwardRef, isValidElement, type ButtonHTMLAttributes, type ReactElement, type ReactNode } from 'react'\n\nimport { cn } from '../cn'\nimport type { StnWithoutStyle } from '../stnStrictProps'\nimport { StnIcon } from './StnIcon'\n\n/** 표준 2글자 사이즈: xl · lg · md · sm · xs (레거시 L/M/S/large/medium 등 호환) */\nexport type StnButtonSize =\n | 'xl'\n | 'lg'\n | 'md'\n | 'sm'\n | 'large'\n | 'medium'\n | 'small'\n | 'XL'\n | 'L'\n | 'M'\n | 'S'\n\n/** 모양 — contained(채움) · outlined(테두리) · ghost(면) · text(글자만) */\nexport type StnButtonLook = 'contained' | 'outlined' | 'ghost' | 'text'\n\n/** 버튼 variant: contained · outlined · ghost · text */\nexport type StnButtonVariant = 'contained' | 'outlined' | 'ghost' | 'text'\n\n/** 색 — 기본 primary. 토큰: --stn-feedback-* */\nexport type StnButtonColor = 'primary' | 'success' | 'error' | 'warning' | 'info'\n\n/** 아이콘 위치 — left | right | none */\nexport type StnButtonIconPosition = 'left' | 'right' | 'none'\n\n/** 모서리 형태 — pill(기본 캡슐형) · square(사각 버튼: 4px, lg/xl: 6px) */\nexport type StnButtonShape = 'pill' | 'square'\n\nexport type StnButtonResolvedSize = 'xl' | 'lg' | 'md' | 'sm'\n\nexport type StnButtonProps = StnWithoutStyle<Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'className' | 'color'>> & {\n size?: StnButtonSize\n variant?: StnButtonVariant\n color?: StnButtonColor\n /** 모서리 형태 (기본 pill, 툴바 등 사각 아이콘 버튼에는 'square') */\n shape?: StnButtonShape\n /** 아이콘 위치 · 기본 none (icon 지정 시 left 기본값) */\n iconPosition?: StnButtonIconPosition\n /** 커스텀 아이콘 또는 아이콘 이름 ('line/pencil-minus' 또는 ReactNode) */\n icon?: ReactNode\n /** width 100% — `.stn-btn.full` */\n fullWidth?: boolean\n className?: string\n children?: ReactNode\n}\n\nconst ICON_PX: Record<StnButtonResolvedSize, number> = {\n xl: 24,\n lg: 24,\n md: 20,\n sm: 16,\n}\n\nfunction resolveSize(size: StnButtonSize): StnButtonResolvedSize {\n if (size === 'XL' || size === 'xl') return 'xl'\n if (size === 'L' || size === 'large' || size === 'lg') return 'lg'\n if (size === 'S' || size === 'small' || size === 'sm') return 'sm'\n return 'md'\n}\n\nfunction resolveLookAndColor(\n variant: StnButtonVariant,\n color: StnButtonColor | undefined,\n): { look: StnButtonLook; color: StnButtonColor } {\n return { look: variant, color: color ?? 'primary' }\n}\n\nfunction hasButtonLabel(children: ReactNode): boolean {\n if (children == null || children === false || children === true) return false\n if (Array.isArray(children)) return children.some(hasButtonLabel)\n if (typeof children === 'string' || typeof children === 'number') return String(children).trim() !== ''\n return true\n}\n\nfunction resolveIconNode(icon: ReactNode, glyphPx: number): ReactNode {\n if (typeof icon === 'string') return <StnIcon name={icon} size={glyphPx} color=\"currentColor\" />\n if (isValidElement(icon)) {\n const props = icon.props as { size?: number }\n if (props.size == null) {\n return cloneElement(icon as ReactElement<{ size?: number }>, { size: glyphPx })\n }\n }\n return icon\n}\n\nfunction resolveIconPosition(iconPosition?: StnButtonIconPosition, icon?: ReactNode): StnButtonIconPosition {\n if (iconPosition != null) return iconPosition\n if (icon != null) return 'left'\n return 'none'\n}\n\n/**\n * Infomap Figma `btn` — `.stn-btn`\n * 레이블을 생략하고 `icon`만 주면 아이콘 버튼 (`.stn-btn.icon`). 이때 `aria-label` 필수.\n */\nexport const StnButton = forwardRef<HTMLButtonElement, StnButtonProps>(function StnButton(\n {\n size = 'md',\n variant = 'contained',\n color,\n shape,\n iconPosition,\n icon,\n fullWidth,\n className,\n type = 'button',\n disabled,\n children,\n ...rest\n },\n ref,\n) {\n const resolvedSize = resolveSize(size)\n const { look, color: resolvedColor } = resolveLookAndColor(variant, color)\n const labeled = hasButtonLabel(children)\n const glyphPx = labeled ? 16 : ICON_PX[resolvedSize]\n const resolvedIcon = resolveIconNode(icon, glyphPx)\n const isIconOnly = !labeled && resolvedIcon != null\n const position = resolveIconPosition(iconPosition, icon)\n\n const showLeading = (isIconOnly || position === 'left') && resolvedIcon != null\n const showTrailingCustom = !isIconOnly && position === 'right' && resolvedIcon != null\n\n return (\n <button\n ref={ref}\n type={type}\n disabled={disabled}\n className={cn(\n 'stn-btn',\n look,\n resolvedSize,\n resolvedColor !== 'primary' && resolvedColor,\n shape === 'square' && 'square',\n isIconOnly && 'icon',\n fullWidth && !isIconOnly && 'full',\n className,\n )}\n {...rest}\n >\n {showLeading ? <span className=\"stn-btn__leading\">{resolvedIcon}</span> : null}\n {labeled ? <span className=\"stn-btn__label\">{children}</span> : null}\n {showTrailingCustom ? <span className=\"stn-btn__trailing\">{resolvedIcon}</span> : null}\n </button>\n )\n})\n","import type { CSSProperties } from 'react'\n\nimport { resolveSystemIconSrcFromName } from '@stn-uiux/pub-ui/data/stnSystemIcons'\n\nimport { cn } from '../cn'\n\nexport type StnIconProps = {\n /** Iconography slug (`line/home`) */\n name?: string\n /** 정적 URL · `name`과 동시면 src 우선 */\n src?: string\n /** 모노 아이콘 색 · primitive 변수 (`var(--stn-blue-400)`) 또는 CSS 색상 */\n color?: string\n /** px */\n size?: number\n className?: string\n style?: CSSProperties\n}\n\n/**\n * 아이콘 그림 — Button leading 등에서 사용\n * color 전달 시 CSS Mask를 통해 Primitive 색상으로 실시간 틴트 적용\n */\nexport function StnIcon({ name, src, color, size = 24, className, style }: StnIconProps) {\n if (name && src) {\n console.warn('[StnIcon] `name` and `src` cannot be used together. Using `src`.')\n }\n\n const sizeStyle: CSSProperties = {\n width: size,\n height: size,\n ...style,\n }\n\n const resolvedSrc =\n src ?? (name ? resolveSystemIconSrcFromName(name) : null)\n\n if (!resolvedSrc) return null\n\n const isFillIcon = Boolean(name && name.startsWith('fill/'))\n const isNone = color === 'none' || (isFillIcon && color === undefined)\n const resolvedColor = isNone ? undefined : (color ?? (src ? undefined : 'currentColor'))\n\n if (resolvedColor) {\n const isCurrentColor = resolvedColor === 'currentColor'\n const maskUrl = `url(\"${resolvedSrc}\")`\n\n return (\n <span\n aria-hidden\n className={cn('stn-icon', 'stn-icon--masked', className)}\n style={{\n ...sizeStyle,\n ...(!isCurrentColor ? { backgroundColor: resolvedColor } : undefined),\n WebkitMaskImage: maskUrl,\n maskImage: maskUrl,\n }}\n />\n )\n }\n\n return (\n <img\n src={resolvedSrc}\n alt=\"\"\n aria-hidden\n className={cn('stn-icon', 'stn-icon--img', className)}\n style={sizeStyle}\n width={size}\n height={size}\n draggable={false}\n />\n )\n}\n","import {\n forwardRef,\n useCallback,\n useId,\n useMemo,\n useState,\n type ChangeEvent,\n type CSSProperties,\n type InputHTMLAttributes,\n type ReactNode,\n} from 'react'\n\nimport { cn } from '../cn'\nimport type { StnWithoutStyle } from '../stnStrictProps'\n\nexport type StnSliderSize = 'sm' | 'md' | 'lg'\nexport type StnSliderColor =\n | 'primary'\n | 'secondary'\n | 'success'\n | 'critical'\n | 'major'\n | 'minor'\n | 'warning'\n | 'error'\n | 'info'\n | (string & {})\n\nexport type StnSliderGradient =\n | boolean\n | 'main'\n | 'primary'\n | 'secondary'\n | 'critical'\n | 'major'\n | 'minor'\n | 'warning'\n | (string & {})\n\nexport type StnSliderLabelPosition = 'top' | 'bottom' | 'left' | 'right'\nexport type StnSliderLabelAlign = 'left' | 'center' | 'right'\n\nexport type StnSliderProps = StnWithoutStyle<\n Omit<InputHTMLAttributes<HTMLInputElement>, 'type' | 'className' | 'value' | 'defaultValue' | 'onChange' | 'size'>\n> & {\n value?: number\n defaultValue?: number\n min?: number\n max?: number\n step?: number\n /** 슬라이더 상단/주변 레이블 */\n label?: ReactNode\n /** 크기 ('sm', 'md' 기본, 'lg') @default 'md' */\n size?: StnSliderSize\n /** 활성 채움 색상 @default 'primary' */\n color?: StnSliderColor\n /** 활성화 트랙 그라데이션 ('blue', 'teal', 'purple', 'sunset', 'emerald' 또는 커스텀 linear-gradient) */\n gradient?: StnSliderGradient\n /** 레이블 위치 ('top' 기본, 'bottom', 'left', 'right') @default 'top' */\n labelPosition?: StnSliderLabelPosition\n /** 레이블 정렬 ('left' 기본, 'center', 'right') @default 'left' */\n labelAlign?: StnSliderLabelAlign\n /** 값 말풍선 표시 (hover/focus에서도 CSS로 노출) */\n showValue?: boolean\n /** 말풍선에 항상 표시 */\n alwaysShowValue?: boolean\n /** 말풍선 포맷 */\n formatValue?: (value: number) => ReactNode\n /** 필수 조절 여부 (레이블 옆에 붉은색 * 표시) */\n required?: boolean\n onChange?: (value: number) => void\n className?: string\n}\n\nfunction clamp(n: number, min: number, max: number) {\n return Math.min(max, Math.max(min, n))\n}\n\nfunction toPct(value: number, min: number, max: number) {\n if (max <= min) return 0\n return ((value - min) / (max - min)) * 100\n}\n\n/**\n * Slider — continuous range. 모양: `stn-slider.css` (`.stn-slider`)\n */\nexport const StnSlider = forwardRef<HTMLInputElement, StnSliderProps>(function StnSlider(\n {\n value: valueProp,\n defaultValue = 50,\n min = 0,\n max = 100,\n step = 1,\n label: labelProp,\n size = 'md',\n color,\n gradient,\n labelPosition = 'top',\n labelAlign = 'left',\n showValue = true,\n alwaysShowValue = false,\n formatValue,\n required = false,\n onChange,\n disabled,\n className,\n id: idProp,\n ...rest\n },\n ref,\n) {\n const autoId = useId()\n const id = idProp ?? autoId\n const isControlled = valueProp != null\n const [inner, setInner] = useState(() => clamp(defaultValue, min, max))\n const value = clamp(isControlled ? valueProp : inner, min, max)\n\n const pct = useMemo(() => toPct(value, min, max), [value, min, max])\n const tooltipLabel = formatValue ? formatValue(value) : value\n\n const handleChange = useCallback(\n (e: ChangeEvent<HTMLInputElement>) => {\n const next = Number(e.target.value)\n if (!isControlled) setInner(next)\n onChange?.(next)\n },\n [isControlled, onChange],\n )\n\n // Label placement and alignment classes\n const positionClass = `label-${labelPosition}`\n const alignClass = labelAlign !== 'left' ? `align-${labelAlign}` : ''\n\n // Known tones\n const isKnownTone =\n color &&\n [\n 'primary',\n 'secondary',\n 'success',\n 'critical',\n 'major',\n 'minor',\n 'warning',\n 'error',\n 'info',\n ].includes(color)\n const toneClass = isKnownTone ? color : ''\n\n // Gradient resolution\n let gradientClass = ''\n let customGradient = ''\n const hasGradient = Boolean(gradient)\n\n if (gradient === true) {\n gradientClass = 'gradient'\n } else if (typeof gradient === 'string') {\n if (['main', 'primary', 'secondary', 'critical', 'major', 'minor', 'warning'].includes(gradient)) {\n gradientClass = `gradient-${gradient}`\n } else if (gradient.includes('gradient') || gradient.startsWith('linear-') || gradient.startsWith('radial-')) {\n customGradient = gradient\n }\n }\n\n // Size class\n const sizeClass = size !== 'md' ? size : ''\n\n // Style properties\n const style: CSSProperties = {\n ['--stn-slider-pct' as string]: `${pct}%`,\n ['--stn-slider-pct-num' as string]: String(pct / 100),\n ...(customGradient\n ? { ['--stn-slider-fill-gradient' as string]: customGradient }\n : color && !isKnownTone\n ? { ['--stn-slider-fill' as string]: color, ['--stn-slider-thumb' as string]: color }\n : {}),\n }\n\n const labelElement =\n labelProp != null && labelProp !== '' ? (\n <label htmlFor={id} className=\"stn-slider__label\">\n {labelProp}\n {required && (\n <span className=\"stn-slider__required\" aria-hidden=\"true\">\n *\n </span>\n )}\n </label>\n ) : null\n\n return (\n <div\n className={cn(\n 'stn-slider',\n sizeClass,\n toneClass,\n gradientClass,\n hasGradient && 'gradient-fill stn-slider--gradient-fill',\n positionClass,\n alignClass,\n alwaysShowValue && 'show-value stn-slider--show-value',\n disabled && 'disabled stn-slider--disabled',\n className,\n )}\n style={style}\n >\n {labelElement}\n <div className=\"stn-slider__track-wrapper\">\n {showValue ? (\n <span className=\"stn-slider__value\" aria-hidden=\"true\">\n {tooltipLabel}\n </span>\n ) : null}\n <input\n ref={ref}\n id={id}\n type=\"range\"\n className=\"stn-slider__input\"\n min={min}\n max={max}\n step={step}\n value={value}\n disabled={disabled}\n required={required}\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuenow={value}\n onChange={handleChange}\n {...rest}\n />\n </div>\n </div>\n )\n})\n","/**\n * @stn-uiux/pub-ui-react — thin React surface for STN Pub (class names + peer CSS).\n */\nexport { cn } from './cn'\nexport { buildPaginationItems, type StnPaginationItem } from './paginationRange'\n\nexport { StnProvider, type StnProviderProps } from './StnProvider'\nexport { StnContext, useStn, useStnOptional, type StnTheme, type StnContextValue } from './StnContext'\n\nexport { StnButton, type StnButtonProps, type StnButtonSize, type StnButtonVariant, type StnButtonColor, type StnButtonShape, type StnButtonIconPosition } from './components/StnButton'\nexport {\n StnSlider,\n type StnSliderProps,\n type StnSliderSize,\n type StnSliderColor,\n type StnSliderGradient,\n type StnSliderLabelPosition,\n type StnSliderLabelAlign,\n} from './components/StnSlider'\nexport { StnIcon, type StnIconProps } from './components/StnIcon'\nexport { systemIconSrc, resolveSystemIconSrcFromName } from '@stn-uiux/pub-ui/data/stnSystemIcons'\nexport {\n StnIconBox,\n type StnIconBoxProps,\n type StnIconBoxSize,\n type StnIconBoxColor,\n} from './components/StnIconBox'\nexport {\n STN_PAGINATION_INTRO,\n STN_PAGINATION_EXAMPLE,\n STN_PAGINATION_REACT,\n STN_PAGINATION_FIGMA,\n} from '@stn-uiux/pub-ui/data/stnPagination'\nexport { StnPagination, type StnPaginationProps } from './components/StnPagination'\nexport { StnPopup, type StnPopupProps, type StnPopupSize } from './components/StnPopup'\nexport { StnToastCloseButton } from './components/toast/StnToastCloseButton'\nexport {\n StnToastIcon,\n STN_TOAST_ICON_SLUG,\n type StnToastIconProps,\n} from './components/toast/StnToastIcon'\nexport {\n StnProgressBar,\n type StnProgressBarProps,\n type StnProgressBarTone,\n type StnProgressBarGradient,\n type StnProgressBarSize,\n type StnProgressBarTrack,\n type StnProgressBarLabelPosition,\n type StnProgressBarLabelAlign,\n} from './components/StnProgressBar'\nexport {\n StnCircularProgress,\n type StnCircularProgressProps,\n type StnCircularProgressSize,\n type StnCircularProgressTone,\n type StnCircularProgressGradient,\n type StnCircularProgressTrack,\n type StnCircularProgressLabelPosition,\n} from './components/StnCircularProgress'\nexport {\n StnTable,\n StnTableGrid,\n StnTableHead,\n StnTableBody,\n StnTableRow,\n StnTableTh,\n StnTableTd,\n StnTableSort,\n StnTableThCheck,\n StnTableTdCheck,\n type StnTableProps,\n type StnTableGridProps,\n type StnTableHeadProps,\n type StnTableBodyProps,\n type StnTableRowProps,\n type StnTableAlign,\n type StnTableThProps,\n type StnTableTdProps,\n type StnTableSortProps,\n type StnTableThCheckProps,\n type StnTableTdCheckProps,\n STN_TABLE_FOOTER_MAX_ACTIONS,\n} from './components/StnTable'\nexport {\n StnTree,\n type StnTreeProps,\n type StnTreeItem,\n type StnTreeNodeKind,\n type StnTreeDocRowState,\n} from './components/StnTree'\nexport {\n StnTreeNode,\n type StnTreeNodeProps,\n type StnTreeNodeDocState,\n} from './components/StnTreeNode'\nexport { flattenStnTree, collectExpandableIds, buildStnTreeNodeCells } from './stnTreeFlatten'\nexport {\n StnScroll,\n type StnScrollProps,\n type StnScrollOrientation,\n type StnScrollSize,\n type StnScrollColor,\n} from './components/StnScroll'\nexport {\n StnSectionSide,\n StnSectionSidePreset,\n type StnSectionSideProps,\n type StnSectionSidePresetProps,\n} from './patterns/sectionSide/StnSectionSide'\nexport {\n StnLoginCard,\n StnLoginCardGlowWrapper,\n StnLoginBrandStack,\n StnLoginFormStack,\n StnLoginFormFields,\n StnLoginFormLinks,\n StnLoginPlaceholder,\n type StnLoginCardProps,\n type StnLoginCardBrandPosition,\n type StnLoginCardVariant,\n type StnLoginCardGlowWrapperProps,\n type StnLoginBrandStackProps,\n type StnLoginFormStackProps,\n type StnLoginFormFieldsProps,\n type StnLoginFormLinksProps,\n type StnLoginPlaceholderProps,\n} from './patterns/login/StnLoginCard'\nexport {\n StnLoginTextField,\n type StnLoginTextFieldProps,\n} from './patterns/login/StnLoginTextField'\nexport {\n StnLogo,\n type StnLogoProps,\n type StnLogoVariant,\n type StnLogoSize,\n type StnLogoTheme,\n} from './components/StnLogo'\nexport {\n StnBadge,\n type StnBadgeProps,\n type StnBadgeVariant,\n type StnBadgeColor,\n type StnBadgeAnchorOrigin,\n} from './components/StnBadge'\nexport {\n StnChip,\n type StnChipProps,\n type StnChipVariant,\n type StnChipSize,\n type StnChipShape,\n type StnChipColor,\n type StnChipIconPosition,\n type StnChipLabelPosition,\n} from './components/StnChip'\nexport {\n StnSeverityBadge,\n StnSeverityFilter,\n type StnSeverityBadgeProps,\n type StnSeverityFilterProps,\n type StnSeverityLevel,\n type StnSeverityVariant,\n} from './components/StnSeverityBadge'\nexport {\n StnSystemChip,\n type StnSystemChipItem,\n type StnSystemChipTone,\n type StnSystemChipProps,\n} from './components/StnSystemChip'\nexport {\n StnCheckbox,\n type StnCheckboxProps,\n type StnCheckboxSize,\n type StnCheckboxColor,\n type StnCheckboxLabelPlacement,\n} from './components/StnCheckbox'\nexport {\n StnToggleButton,\n type StnToggleButtonProps,\n type StnToggleButtonSize,\n type StnToggleButtonColor,\n type StnToggleButtonIconPosition,\n} from './components/StnToggleButton'\nexport {\n StnSwitch,\n type StnSwitchProps,\n type StnSwitchLabelPosition,\n type StnSwitchSize,\n type StnSwitchColor,\n type StnSwitchGradient,\n} from './components/StnSwitch'\nexport {\n StnRadio,\n type StnRadioProps,\n type StnRadioSize,\n type StnRadioColor,\n type StnRadioLabelPlacement,\n} from './components/StnRadio'\nexport {\n StnRadioGroup,\n type StnRadioGroupProps,\n type StnRadioGroupOption,\n type StnRadioGroupLayout,\n type StnRadioGroupOrientation,\n} from './components/StnRadioGroup'\nexport {\n StnSegmented,\n type StnSegmentedProps,\n type StnSegmentedOption,\n type StnSegmentedSingleProps,\n type StnSegmentedMultipleProps,\n} from './components/StnSegmented'\nexport {\n StnDropdown,\n type StnDropdownProps,\n type StnDropdownOption,\n type StnDropdownSize,\n type StnDropdownModifier,\n type StnDropdownVariant,\n type StnDropdownHelperTextPosition,\n} from './components/StnDropdown'\nexport {\n StnDropdownMenu,\n type StnDropdownMenuProps,\n} from './components/StnDropdownMenu'\nexport {\n StnTextField,\n type StnTextFieldProps,\n type StnTextFieldSize,\n type StnTextFieldVariant,\n type StnTextFieldColor,\n type StnTextFieldIconPosition,\n type StnTextFieldLabelPosition,\n} from './components/StnTextField'\nexport {\n StnDateRangeField,\n type StnDateRangeFieldProps,\n type StnDateRangeFieldSize,\n} from './components/StnDateRangeField'\nexport {\n STN_DROPDOWN_INTRO,\n STN_DROPDOWN_SIZE_ROWS,\n STN_DROPDOWN_INVENTORY,\n STN_DROPDOWN_HTML_COUNTS,\n STN_DROPDOWN_USAGE,\n STN_DROPDOWN_MENU_INTRO,\n STN_DROPDOWN_MENU_USAGE,\n} from '@stn-uiux/pub-ui/data/stnDropdown'\nexport {\n STN_TEXT_FIELD_FIGMA,\n STN_TEXT_FIELD_INTRO,\n STN_TEXT_FIELD_SIZE_ROWS,\n STN_TEXT_FIELD_STATES,\n STN_TEXT_FIELD_USAGE,\n STN_TEXT_FIELD_HTML,\n} from '@stn-uiux/pub-ui/data/stnTextField'\nexport {\n STN_SEGMENTED_FIGMA,\n STN_SEGMENTED_INTRO,\n STN_SEGMENTED_USAGE,\n STN_SEGMENTED_HTML,\n} from '@stn-uiux/pub-ui/data/stnSegmented'\nexport {\n STN_LOGIN_FIGMA,\n STN_LOGIN_ASSETS,\n STN_LOGIN_INTRO,\n STN_LOGIN_USAGE,\n STN_LOGIN_HTML,\n} from '@stn-uiux/pub-ui/data/stnLogin'\nexport {\n STN_DATE_RANGE_FIELD_FIGMA,\n STN_DATE_RANGE_FIELD_NAME,\n STN_DATE_RANGE_FIELD_INTRO,\n STN_DATE_RANGE_FIELD_DEMO,\n STN_DATE_RANGE_FIELD_SIZE_ROWS,\n STN_DATE_RANGE_FIELD_USAGE,\n STN_DATE_RANGE_FIELD_HTML,\n formatStnDateRangeFieldValue,\n parseStnDateRangeFieldValue,\n} from '@stn-uiux/pub-ui/data/stnDateRangeField'\nexport {\n STN_SEARCH_REQUIREMENT_FIGMA,\n STN_SEARCH_REQUIREMENT_NAME,\n STN_SEARCH_REQUIREMENT_KO_NAME,\n STN_SEARCH_REQUIREMENT_INTRO,\n STN_SEARCH_REQUIREMENT_SPEC,\n STN_SEARCH_REQUIREMENT_DEMO_FIELDS,\n STN_SEARCH_REQUIREMENT_USAGE,\n} from '@stn-uiux/pub-ui/data/stnSearchRequirement'\nexport {\n StnSearchRequirementBar,\n type StnSearchRequirementBarProps,\n type StnSearchRequirementBarFieldsProps,\n type StnSearchRequirementBarFieldProps,\n type StnSearchRequirementBarSearchButtonProps,\n type StnSearchRequirementBarExportProps,\n type StnSearchRequirementBarDividerProps,\n} from './patterns/search/StnSearchRequirementBar'\nexport {\n StnSearchRequirementBarDemo,\n type StnSearchRequirementBarDemoProps,\n} from './patterns/search/StnSearchRequirementBarDemo'\nexport {\n STN_HEADER_INTRO,\n STN_HEADER_USAGE,\n STN_HEADER_VARIANT_ROWS,\n STN_SYSTEM_CHIP_DEMO,\n STN_HEADER_PAGE_TITLE_DEMO,\n type StnHeaderVariant,\n type StnHeaderPadding,\n type StnHeaderGap,\n} from '@stn-uiux/pub-ui/data/stnHeader'\nexport {\n StnHeader,\n StnHeaderPageTitle,\n StnHeaderSubTitle,\n StnHeaderContextTitle,\n StnHeaderTitleGroup,\n StnHeaderToolbar,\n type StnHeaderProps,\n type StnHeaderRegionProps,\n type StnHeaderPageTitleProps,\n type StnHeaderTitleGroupProps,\n type StnHeaderToolbarProps,\n} from './patterns/header/StnHeader'\nexport {\n STN_LAYER0_BACKGROUND_FIGMA,\n STN_LAYER0_BACKGROUND_INTRO,\n STN_LAYER0_BACKGROUND_USAGE,\n STN_LAYER0_BACKGROUND_VARIANT_ROWS,\n STN_LAYER0_BACKGROUND_DEMO_IMAGES,\n STN_LAYER0_MAP_LIGHT_OVERLAY,\n type StnLayer0BackgroundKind,\n type StnLayer0BackgroundPreset,\n} from '@stn-uiux/pub-ui/data/stnLayer0Background'\nexport {\n StnLayer0Background,\n type StnLayer0BackgroundProps,\n type StnLayer0BackgroundColor,\n} from './patterns/background/StnLayer0Background'\nexport {\n StnDateRangePicker,\n type StnDateRangePickerProps,\n} from './components/datePicker/StnDateRangePicker'\nexport {\n StnDateRangePickerField,\n type StnDateRangePickerFieldProps,\n} from './components/datePicker/StnDateRangePickerField'\nexport {\n STN_DATE_PICKER_INTRO,\n STN_DATE_PICKER_NAME,\n STN_DATE_PICKER_KO_NAME,\n STN_DATE_PICKER_PART_ROWS,\n STN_DATE_PICKER_SPEC,\n STN_DATE_PICKER_USAGE,\n STN_DATE_PICKER_PANEL_USAGE,\n STN_DATE_PICKER_WEEKDAYS,\n type StnDateRange,\n} from '@stn-uiux/pub-ui/data/stnDatePicker'\nexport {\n StnWidget,\n StnWidgetPlaceholder,\n StnWidgetHeader,\n StnWidgetTitle,\n StnWidgetActions,\n StnWidgetBody,\n StnWidgetFooter,\n StnWidgetEmpty,\n StnWidgetLoading,\n StnWidgetInsetIcon,\n type StnWidgetInsetIconProps,\n StnWidgetChartSlot,\n StnWidgetStatusList,\n StnWidgetStatusItem,\n StnWidgetStatGroup,\n StnWidgetStatCard,\n StnWidgetGradeRowList,\n StnWidgetGradeRow,\n type StnWidgetProps,\n type StnWidgetStatus,\n type StnWidgetPadding,\n type StnWidgetBackground,\n type StnWidgetAppearance,\n type StnWidgetChartSlotProps,\n type StnWidgetStatusGrade,\n type StnWidgetStatusItemProps,\n type StnWidgetStatCardProps,\n type StnWidgetGradeRowGrade,\n type StnWidgetGradeRowProps,\n} from './components/StnWidget'\nexport {\n STN_WIDGET_FIGMA,\n STN_WIDGET_FIGMA_URL,\n STN_WIDGET_FIGMA_DARK,\n STN_WIDGET_FIGMA_DARK_URL,\n STN_WIDGET_INTRO,\n STN_WIDGET_SHELL_ROWS,\n STN_WIDGET_KINDS,\n STN_WIDGET_USAGE,\n getStnWidgetKind,\n isStnWidgetKindSlug,\n stnWidgetSampleUrl,\n resolveStnWidgetBackground,\n STN_ALERT_CENTER_DASHBOARD_WIDGETS,\n STN_ALERT_CENTER_DASHBOARD_USAGE,\n type StnWidgetKind,\n type StnWidgetShell,\n type StnWidgetBackgroundMode,\n type StnWidgetContentFamily,\n} from '@stn-uiux/pub-ui/data/stnWidget'\nexport { AlertCenterDashboard, type AlertCenterDashboardProps } from './patterns/dashboard/AlertCenterDashboard'\nexport {\n PubDisabilityStatusList,\n PubTop5EquipmentBars,\n PubTrafficTop5Bars,\n PubChartSample,\n type PubDisabilityStatusItem,\n type PubTop5BarRow,\n type PubTrafficTop5BarRow,\n} from './patterns/dashboard/PubDashboardWidgetBodies'\nexport { StnAlertCenterPanel, type StnAlertCenterPanelProps } from './patterns/alertCenter/StnAlertCenterPanel'\nexport {\n StnAlertCenterDocPreview,\n type StnAlertCenterDocPreviewProps,\n} from './patterns/alertCenter/StnAlertCenterDocPreview'\nexport {\n STN_ALERT_CENTER_INTRO,\n STN_ALERT_CENTER_TABS,\n STN_ALERT_CENTER_TAB_IDS,\n STN_ALERT_CENTER_DEMO_ALERTS,\n STN_ALERT_CENTER_DEMO_WORK,\n STN_ALERT_CENTER_DEMO_DEPLOY,\n STN_ALERT_CENTER_USAGE,\n STN_GNB_ALERT_INTEGRATION_USAGE,\n type StnAlertCenterTab,\n type StnAlertCenterAlertItem,\n type StnAlertCenterWorkItem,\n} from '@stn-uiux/pub-ui/data/stnAlertCenter'\nexport {\n SideNavContext,\n useSideNav,\n type SideNavContextValue,\n StnSideNavItem,\n type StnSideNavItemProps,\n type StnSideNavItemVariant,\n StnSideNavHeader,\n type StnSideNavHeaderProps,\n StnSideNavMenu,\n type StnSideNavMenuProps,\n StnSideNavGroup,\n type StnSideNavGroupProps,\n StnSideNavSpacer,\n type StnSideNavSpacerProps,\n StnSideNavFooter,\n type StnSideNavFooterProps,\n StnSideNavToggle,\n type StnSideNavToggleProps,\n StnSideNavLogo,\n type StnSideNavLogoProps,\n StnSideNavWatermark,\n type StnSideNavWatermarkProps,\n StnSideNavMobileTrigger,\n type StnSideNavMobileTriggerProps,\n StnSideNavSub,\n StnSideNavSubItem,\n type StnSideNavSubProps,\n type StnSideNavSubItemProps,\n StnSideNavSubNav,\n type StnSideNavSubNavProps,\n type StnSideNavSubNavVariant,\n type StnSideNavDropdownVariant,\n} from './components/sideNav'\n\n\nexport {\n StnSideNavigation,\n type StnSideNavigationProps,\n type StnSideNavigationVariant,\n} from './patterns/sideNav/StnSideNavigation'\nexport {\n StnBreadcrumb,\n type StnBreadcrumbProps,\n type StnBreadcrumbItem,\n type StnBreadcrumbMenuItem,\n type StnBreadcrumbSize,\n type StnBreadcrumbVariant,\n} from './components/StnBreadcrumb'\nexport {\n StnHeaderTitle,\n StnHeaderTitleFramePreview,\n StnHeaderTitleMainText,\n StnHeaderTitleSubText,\n StnHeaderTitleDate,\n StnHeaderTitleWeekday,\n StnHeaderTitleTime,\n formatStnHeaderTitleDate,\n formatStnHeaderTitleTime,\n formatStnHeaderTitleWeekday,\n type StnHeaderTitleVariant,\n type StnHeaderTitleProps,\n type StnHeaderTitleTitleProps,\n type StnHeaderTitleDualProps,\n type StnHeaderTitleClockProps,\n type StnHeaderTitleDateOptions,\n type StnHeaderTitleTimeOptions,\n type StnHeaderTitleSize,\n} from './components/StnHeaderTitle'\nexport {\n StnContainer,\n type StnContainerProps,\n type StnContainerMaxWidth,\n} from './layouts/StnContainer'\nexport {\n StnStack,\n type StnStackProps,\n type StnStackDirection,\n type StnStackBreakpoint,\n type StnStackResponsive,\n type StnStackWrap,\n type StnStackScrollable,\n} from './layouts/StnStack'\nexport {\n StnGrid,\n type StnGridProps,\n type StnGridBreakpoint,\n type StnGridResponsive,\n type StnGridSpacing,\n type StnGridSize,\n type StnGridDirection,\n} from './layouts/StnGrid'\nexport {\n StnLayerShell,\n type StnLayerShellProps,\n} from './layouts/StnLayerShell'\nexport {\n StnListViewLayout,\n StnListViewLayoutBody,\n StnListViewLayoutHeader,\n StnListViewLayoutSearch,\n StnListViewLayoutSidebar,\n StnListViewLayoutContent,\n StnListViewLayoutTable,\n StnListViewLayoutPagination,\n type StnListViewLayoutProps,\n type StnListViewLayoutBodyProps,\n} from './layouts/StnListViewLayout'\nexport {\n STN_LAYOUT_INTRO,\n STN_LAYOUT_LAYER_PAGE_TREE,\n STN_LAYOUT_LIST_VIEW_INTRO,\n STN_LAYOUT_LIST_VIEW_USAGE,\n STN_LAYOUT_MAP_DASHBOARD_INTRO,\n STN_LAYOUT_MAP_DASHBOARD_USAGE,\n STN_LAYER_SHELL_USAGE,\n applyLnbSideToModifiers,\n type StnLnbSide,\n STN_LAYOUT_CONTENT_ROWS,\n STN_LAYOUT_REGION_ROWS,\n STN_LAYOUT_SHELL_USAGE,\n STN_LAYOUT_RECIPES,\n STN_LAYOUT_PLAYGROUND_TABS,\n STN_LAYOUT_WHEN_TO_USE,\n STN_LAYOUT_SCREEN_RECIPES,\n STN_LAYOUT_SLOT_USAGE,\n STN_LAYOUT_ALERT_CENTER_USAGE,\n type StnLayoutScreenKind,\n} from '@stn-uiux/pub-ui/data/stnLayout'\nexport {\n StnPageScaffold,\n StnPageScaffoldRoot,\n StnPageScaffoldRegion,\n StnPageScaffoldMapPlaceholder,\n StnPageScaffoldMapCanvas,\n StnPageScaffoldLayer,\n ListPageScaffold,\n DashboardPageScaffold,\n type StnPageScaffoldRootProps,\n type StnPageScaffoldRegionProps,\n type StnPageScaffoldMapPlaceholderProps,\n type StnPageScaffoldMapCanvasProps,\n type StnPageScaffoldLayerProps,\n type ListPageScaffoldProps,\n type DashboardPageScaffoldProps,\n type DashboardType,\n} from './patterns/scaffold/StnPageScaffold'\nexport { AlertCenterPageScaffold, type AlertCenterPageScaffoldProps } from './patterns/scaffold/AlertCenterPageScaffold'\nexport { LoginPageScaffold, type LoginPageScaffoldProps } from './patterns/scaffold/LoginPageScaffold'\nexport {\n StnDashboard,\n StnMapCanvas,\n type StnDashboardProps,\n type StnDashboardWidgetPosition,\n type StnDashboardRegionProps,\n type StnMapCanvasProps,\n} from './patterns/dashboard'\nexport {\n StnLoadingSkeleton,\n StnLoadingSkeletonLine,\n StnLoadingSkeletonBlock,\n StnLoadingSkeletonCircle,\n StnLoadingSkeletonProfile,\n StnLoadingSkeletonWidget,\n StnLoadingSkeletonTable,\n type StnLoadingSkeletonLineProps,\n type StnLoadingSkeletonBlockProps,\n type StnLoadingSkeletonCircleProps,\n type StnLoadingSkeletonProfileProps,\n type StnLoadingSkeletonWidgetProps,\n type StnLoadingSkeletonTableProps,\n type StnLoadingSkeletonProps,\n type StnLoadingSkeletonRootProps,\n type StnLoadingSkeletonVariant,\n} from './patterns/scaffold/StnLoadingSkeleton'\nexport {\n StnLayer,\n StnLayerBackground,\n StnLayerContent,\n StnLayerDim,\n StnLayerModal,\n type StnLayerProps,\n type StnLayerRoleProps,\n} from './patterns/layer/StnLayer'\nexport {\n STN_PAGE_SCAFFOLD_INTRO,\n STN_PAGE_SCAFFOLD_KINDS,\n STN_PAGE_SCAFFOLD_COMPOUND_USAGE,\n STN_ALERT_CENTER_PAGE_SCAFFOLD_USAGE,\n type StnPageScaffoldKind,\n} from '@stn-uiux/pub-ui/data/stnLayout'\nexport {\n STN_LOADING_SKELETON_INTRO,\n STN_LOADING_SKELETON_USAGE,\n STN_LOADING_SKELETON_PARTS,\n} from '@stn-uiux/pub-ui/data/stnLoadingSkeleton'\nexport {\n STN_LAYER_INTRO,\n STN_LAYER_SURFACE_ROWS,\n STN_LAYER_ROLE_ROWS,\n STN_LAYER_ROLE_TO_LEVEL,\n STN_LAYER_ROLE_USAGE,\n STN_ELEVATION_Z_INDEX,\n type StnElevationLevel,\n type StnLayerSurface,\n type StnLayerRole,\n} from '@stn-uiux/pub-ui/data/stnLayer'\nexport {\n StnFloatingToolbar,\n StnFloatingToolbarPreset,\n StnMapToolbar,\n type StnFloatingToolbarProps,\n type StnFloatingToolbarPlacement,\n type StnToolbarOrientation,\n type StnFloatingToolbarPresetProps,\n type StnMapToolbarProps,\n} from './patterns/toolbar/StnFloatingToolbar'\nexport {\n StnEventBanner,\n type StnEventBannerProps,\n type StnEventBannerPlacement,\n type StnEventBannerSeverity,\n type StnEventBannerGap,\n} from './components/StnEventBanner'\n\nexport * from './components/topology'\n","import type { CSSProperties, ReactNode } from 'react'\n\nimport { cn } from '../cn'\nimport { StnIcon } from './StnIcon'\n\nexport type StnIconBoxSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl'\nexport type StnIconBoxColor =\n | 'primary'\n | 'secondary'\n | 'critical'\n | 'major'\n | 'minor'\n | 'warning'\n | 'success'\n | 'error'\n | 'info'\n | (string & {})\n\nexport type StnIconBoxProps = {\n /** Iconography slug (`line/user`) 또는 직접 전달하는 ReactNode */\n icon?: ReactNode\n /** 박스 크기 ('xs' | 'sm' | 'md' | 'lg' | 'xl', 기본값: 'md') */\n size?: StnIconBoxSize\n /** 시맨틱 색상 ('primary' | 'secondary' | 'critical' | 'major' | 'minor' | 'warning' 등) 또는 커스텀 CSS 색상 */\n color?: StnIconBoxColor\n /** 아이콘 자체의 px 크기 (지정하지 않으면 size에 따라 12 / 14 / 16 / 20 / 24로 자동 결정) */\n iconSize?: number\n /** 활성(Active) 상태 여부 */\n active?: boolean\n className?: string\n style?: CSSProperties\n children?: ReactNode\n}\n\nconst SEMANTIC_COLORS = new Set([\n 'primary',\n 'secondary',\n 'critical',\n 'major',\n 'minor',\n 'warning',\n 'success',\n 'error',\n 'info',\n])\n\nconst DEFAULT_ICON_SIZES: Record<StnIconBoxSize, number> = {\n xs: 12,\n sm: 14,\n md: 16,\n lg: 20,\n xl: 24,\n}\n\n/**\n * StnIconBox — Design System 표준 입체 아이콘 박스 컴포넌트\n * Neumorphism inset + drop shadow 효과와 그라데이션 배경을 가집니다.\n * 크기 variant: xs (20px) | sm (24px) | md (28px - default) | lg (36px) | xl (44px)\n */\nexport function StnIconBox({\n icon,\n size = 'md',\n color,\n iconSize,\n active,\n className,\n style,\n children,\n}: StnIconBoxProps) {\n const isSemanticColor = color && SEMANTIC_COLORS.has(color)\n const customColor = isSemanticColor ? undefined : color\n\n const resolvedIconSize = iconSize ?? DEFAULT_ICON_SIZES[size] ?? 16\n\n let content: ReactNode = children\n\n if (!content && icon) {\n if (typeof icon === 'string') {\n content = <StnIcon name={icon} size={resolvedIconSize} color={customColor || 'currentColor'} />\n } else {\n content = icon\n }\n }\n\n return (\n <span\n className={cn(\n 'stn-icon-box',\n size,\n active && 'active',\n isSemanticColor && color,\n className,\n )}\n style={style}\n aria-hidden\n >\n {content}\n </span>\n )\n}\r\n","import { forwardRef, type ComponentPropsWithoutRef } from 'react'\n\nimport { buildPaginationItems } from '../paginationRange'\nimport { cn } from '../cn'\nimport type { StnWithoutStyle } from '../stnStrictProps'\n\n/** Infomap paging chevron ≈ 6×11 */\nconst PrevIcon = () => (\n <svg\n className=\"stn-pagination__icon\"\n viewBox=\"0 0 6 11\"\n width=\"6\"\n height=\"11\"\n aria-hidden=\"true\"\n >\n <path\n fill=\"currentColor\"\n d=\"M5.2.3a.75.75 0 0 1 0 1.06L1.56 5.5l3.64 4.14a.75.75 0 1 1-1.12 1L.15 6.06a.75.75 0 0 1 0-1.12L4.08.3A.75.75 0 0 1 5.2.3Z\"\n />\n </svg>\n)\n\nconst NextIcon = () => (\n <svg\n className=\"stn-pagination__icon\"\n viewBox=\"0 0 6 11\"\n width=\"6\"\n height=\"11\"\n aria-hidden=\"true\"\n >\n <path\n fill=\"currentColor\"\n d=\"M.8.3a.75.75 0 0 1 1.12 0L5.85 4.94a.75.75 0 0 1 0 1.12L1.92 10.64a.75.75 0 1 1-1.12-1L4.44 5.5.8 1.36A.75.75 0 0 1 .8.3Z\"\n />\n </svg>\n)\n\nexport type StnPaginationProps = StnWithoutStyle<Omit<ComponentPropsWithoutRef<'nav'>, 'className' | 'children'>> & {\n /** 1-based current page */\n page: number\n /** Total page count */\n count: number\n onPageChange?: (page: number) => void\n /** Pages shown on each side of current when ellipsis appear (Infomap middle) */\n siblingCount?: number\n className?: string\n}\n\n/**\n * Infomap Figma `paging` — 모양: `stn-pagination.css`\n */\nexport const StnPagination = forwardRef<HTMLElement, StnPaginationProps>(function StnPagination(\n {\n page,\n count,\n onPageChange,\n siblingCount = 1,\n className,\n 'aria-label': ariaLabel = 'pagination navigation',\n ...rest\n },\n ref,\n) {\n const items = buildPaginationItems(page, count, siblingCount)\n const canPrev = page > 1\n const canNext = page < count\n\n return (\n <nav ref={ref} className={cn('stn-pagination', className)} aria-label={ariaLabel} {...rest}>\n <button\n type=\"button\"\n className=\"stn-pagination__prev\"\n disabled={!canPrev}\n aria-label=\"이전 페이지\"\n onClick={() => canPrev && onPageChange?.(page - 1)}\n >\n <PrevIcon />\n </button>\n <ul className=\"stn-pagination__list\">\n {items.map((item, index) =>\n item === 'ellipsis' ? (\n <li key={`ellipsis-${index}`}>\n <span className=\"stn-pagination__ellipsis\" aria-hidden=\"true\">\n …\n </span>\n </li>\n ) : (\n <li key={item}>\n <button\n type=\"button\"\n className={cn('stn-pagination__page', item === page && 'is-active')}\n aria-label={`${item} 페이지`}\n aria-current={item === page ? 'page' : undefined}\n onClick={() => item !== page && onPageChange?.(item)}\n >\n {item}\n </button>\n </li>\n ),\n )}\n </ul>\n <button\n type=\"button\"\n className=\"stn-pagination__next\"\n disabled={!canNext}\n aria-label=\"다음 페이지\"\n onClick={() => canNext && onPageChange?.(page + 1)}\n >\n <NextIcon />\n </button>\n </nav>\n )\n})\n","import { forwardRef, useEffect, type HTMLAttributes, type ReactNode } from 'react'\nimport { createPortal } from 'react-dom'\n\nimport { cn } from '../cn'\nimport { StnLayerDim, StnLayerModal } from '../patterns/layer/StnLayer'\nimport { StnButton } from './StnButton'\n\n/** Matches `STN_POPUP_SIZES` in `@stn-uiux/pub-ui/data/stnPopup` */\nexport type StnPopupSize =\n | 'xs'\n | 's'\n | 'sm'\n | 'm'\n | 'md'\n | 'l'\n | 'lg'\n | 'xl'\n | 'xxl'\n | '2xl'\n | 'full'\n\nconst SIZE_CLASS: Record<StnPopupSize, string> = {\n xs: 'stn-pop--xs',\n s: 'stn-pop--sm',\n sm: 'stn-pop--sm',\n m: 'stn-pop--md',\n md: 'stn-pop--md',\n l: 'stn-pop--lg',\n lg: 'stn-pop--lg',\n xl: 'stn-pop--xl',\n xxl: 'stn-pop--xxl',\n '2xl': 'stn-pop--2xl',\n full: 'stn-pop--full',\n}\n\nexport type StnPopupProps = Omit<HTMLAttributes<HTMLDivElement>, 'className' | 'children' | 'title'> & {\n open: boolean\n onClose: () => void\n title: ReactNode\n size?: StnPopupSize\n children: ReactNode\n /** Footer actions — maps to `.stn-pop__actions` */\n actions?: ReactNode\n className?: string\n /** dim + modal portal (default true) — `StnLayer.Dim` / `StnLayer.Modal` 스택 */\n portal?: boolean\n /** close when dim is clicked (default true) */\n closeOnScrimClick?: boolean\n /** Dim(스크림) 배경 여부 (기본 true). false 시 어두운 배경 딤 없이 모달만 노출 */\n dim?: boolean\n}\n\nexport const StnPopup = forwardRef<HTMLDivElement, StnPopupProps>(function StnPopup(\n {\n open,\n onClose,\n title,\n size = 'md',\n children,\n actions,\n className,\n portal = true,\n closeOnScrimClick = true,\n dim = true,\n role = 'dialog',\n ...rest\n },\n ref,\n) {\n useEffect(() => {\n if (!open || !portal) 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, portal])\n\n if (!open) return null\n\n const titleId = rest.id ? `${rest.id}-title` : 'stn-pop-title'\n\n const dialog = (\n <div\n ref={ref}\n role={role}\n aria-modal=\"true\"\n aria-labelledby={titleId}\n className={cn('stn-pop', SIZE_CLASS[size], 'stn-pop--open', className)}\n {...rest}\n >\n <div className=\"stn-pop__cont\">\n <div className=\"stn-pop__panel\">\n <div className=\"stn-pop__head\" id={titleId}>\n <h4>{title}</h4>\n </div>\n <StnButton\n icon=\"line/x\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"stn-pop__close\"\n aria-label=\"닫기\"\n onClick={onClose}\n />\n <div className=\"stn-pop__body\">{children}</div>\n {actions ? <div className=\"stn-pop__actions\">{actions}</div> : null}\n </div>\n </div>\n </div>\n )\n\n if (!portal) {\n return dialog\n }\n\n return createPortal(\n <div className={cn('stn-pop-stack', !dim && 'no-dim')}>\n <StnLayerDim className=\"stn-pop-stack__dim\">\n <button\n type=\"button\"\n className=\"stn-layer__dim-hit\"\n aria-label=\"닫기\"\n tabIndex={-1}\n onClick={closeOnScrimClick ? onClose : undefined}\n />\n </StnLayerDim>\n <StnLayerModal className=\"stn-pop-stack__modal\">{dialog}</StnLayerModal>\n </div>,\n document.body,\n )\n})\n","import { forwardRef, type HTMLAttributes, type ReactNode } from 'react'\n\nimport type {\n StnElevationLevel,\n StnLayerRole,\n StnLayerSurface,\n} from '@stn-uiux/pub-ui/data/stnLayer'\nimport { STN_LAYER_ROLE_TO_LEVEL } from '@stn-uiux/pub-ui/data/stnLayer'\n\nimport { cn } from '../../cn'\n\n\nexport type StnLayerProps = Omit<HTMLAttributes<HTMLDivElement>, 'className'> & {\n /** L0~L4 · map — 고정 z-index 층 */\n level: StnElevationLevel\n /**\n * Infomap 화면 역할. 미지정 시 level 기본값(0→background · 1→content · 2→modal).\n * `StnLayer.Dim` 은 같은 L2 elevation이어도 role이 달라야 함.\n */\n role?: StnLayerRole | 'map'\n /**\n * 면 채움 방식. 기본: L0=default, L1~L4=transparent(투명 셸).\n * - widget / panel: L1 카드·패널 + shadow.2\n * - solid: 레벨 surface-N (L2~L4 선택)\n * - gnb: L2 GNB 투명 크롬\n * - dim: L3 딤 스크림 (--stn-dim-bg)\n */\n surface?: StnLayerSurface\n /** solid·widget·panel 에 elevation shadow 적용 (L1 widget/panel은 기본 on) */\n withShadow?: boolean\n className?: string\n children?: ReactNode\n}\n\n/** role 별칭 — level은 역할에서 고정 */\nexport type StnLayerRoleProps = Omit<StnLayerProps, 'level' | 'role'>\n\nfunction defaultSurface(level: StnElevationLevel): StnLayerSurface {\n if (level === 0) return 'default'\n if (level === 'map') return 'transparent'\n return 'transparent'\n}\n\nfunction levelClass(level: StnElevationLevel): string {\n if (level === 'map') return 'stn-elev-map'\n return `stn-elev-${level}`\n}\n\nfunction surfaceClasses(level: StnElevationLevel, surface: StnLayerSurface): string[] {\n const out: string[] = []\n if (surface === 'transparent' || (surface === 'default' && level !== 0)) {\n out.push('stn-elev--shell')\n }\n if (surface === 'widget') out.push('stn-elev--panel')\n if (surface === 'panel') out.push('stn-elev--content-panel')\n if (surface === 'solid') out.push('stn-elev--solid')\n if (surface === 'gnb') out.push('stn-elev--gnb')\n if (surface === 'dim') out.push('stn-elev--dim')\n return out\n}\n\nfunction defaultWithShadow(surface: StnLayerSurface): boolean {\n return surface === 'widget' || surface === 'panel'\n}\n\nfunction roleForLevel(level: StnElevationLevel): StnLayerRole | 'map' | undefined {\n if (level === 'map') return 'map'\n if (level === 0) return 'background'\n if (level === 1) return 'content'\n if (level === 2) return 'modal'\n return undefined\n}\n\n/**\n * Elevation 레이어(도화지) — z-index 층을 고정하고, 면·shadow는 surface로 선택.\n * Pub: `stn-elev-{0-4}` + `stn-elev--shell|--panel|--solid|--dim|…`\n *\n * 역할: `StnLayer.Background` · `Content` · `Dim` · `Modal` (flat `StnLayerBackground` …)\n */\nconst StnLayerRoot = forwardRef<HTMLDivElement, StnLayerProps>(function StnLayer(\n { level, role: roleProp, surface: surfaceProp, withShadow: withShadowProp, className, children, ...rest },\n ref,\n) {\n const surface = surfaceProp ?? defaultSurface(level)\n const withShadow = withShadowProp ?? defaultWithShadow(surface)\n const role = roleProp ?? roleForLevel(level)\n\n return (\n <div\n ref={ref}\n data-stn-layer={level}\n data-stn-layer-role={role}\n data-stn-layer-surface={surface}\n className={cn(\n 'stn-layer',\n typeof level === 'number' && `stn-layer-${level}`,\n role === 'dim' && 'stn-layer-dim',\n levelClass(level),\n ...surfaceClasses(level, surface),\n withShadow && 'stn-elev--with-shadow',\n className,\n )}\n {...rest}\n >\n {children}\n </div>\n )\n})\n\nfunction createRoleLayer(\n role: StnLayerRole,\n displayName: string,\n defaultSurfaceForRole?: StnLayerSurface,\n) {\n const level = STN_LAYER_ROLE_TO_LEVEL[role]\n const Comp = forwardRef<HTMLDivElement, StnLayerRoleProps>(function StnLayerRoleAlias(\n { surface, ...rest },\n ref,\n ) {\n return (\n <StnLayerRoot\n ref={ref}\n level={level}\n role={role}\n surface={surface ?? defaultSurfaceForRole}\n {...rest}\n />\n )\n })\n Comp.displayName = displayName\n return Comp\n}\n\nexport const StnLayerBackground = createRoleLayer('background', 'StnLayerBackground')\nexport const StnLayerContent = createRoleLayer('content', 'StnLayerContent')\nexport const StnLayerDim = createRoleLayer('dim', 'StnLayerDim', 'dim')\nexport const StnLayerModal = createRoleLayer('modal', 'StnLayerModal')\n\ntype StnLayerComponent = typeof StnLayerRoot & {\n Background: typeof StnLayerBackground\n Content: typeof StnLayerContent\n Dim: typeof StnLayerDim\n Modal: typeof StnLayerModal\n}\n\nexport const StnLayer = StnLayerRoot as StnLayerComponent\nStnLayer.Background = StnLayerBackground\nStnLayer.Content = StnLayerContent\nStnLayer.Dim = StnLayerDim\nStnLayer.Modal = StnLayerModal\n","import { StnButton } from '../StnButton'\n\nexport type StnToastCloseButtonProps = {\n onClose?: () => void\n closeToast?: (dismissAll?: boolean) => void\n ariaLabel?: string\n className?: string\n}\n\n/**\n * Toast 닫기 — `StnButton` icon-only (`line/x` · tertiary ghost)\n * 클래스: `.stn-toast-close`\n */\nexport function StnToastCloseButton({\n onClose,\n closeToast,\n ariaLabel = '닫기',\n className,\n}: StnToastCloseButtonProps) {\n const handleClick = (e: React.MouseEvent) => {\n e.stopPropagation()\n if (onClose) {\n onClose()\n } else if (closeToast) {\n closeToast()\n }\n }\n\n return (\n <StnButton\n icon=\"line/x\"\n variant=\"ghost\"\n size=\"small\"\n className={['stn-toast-close', className].filter(Boolean).join(' ')}\n aria-label={ariaLabel}\n onClick={handleClick}\n />\n )\n}\n","import {\n STN_TOAST_ICON_SLUG,\n type StnToastKind,\n} from '@stn-uiux/pub-ui/data/stnToast'\nimport { StnIcon } from '../StnIcon'\nimport { cn } from '../../cn'\n\nconst TYPE_TO_KIND: Record<string, StnToastKind> = {\n info: 'info',\n success: 'success',\n warning: 'warn',\n warn: 'warn',\n error: 'error',\n default: 'info',\n}\n\nexport type StnToastIconProps = {\n type?: string\n kind?: StnToastKind\n theme?: string\n isLoading?: boolean\n size?: number\n className?: string\n}\n\n/**\n * Toast 유형 아이콘 — StnIcon 기반 (currentColor 연동)\n */\nexport function StnToastIcon({\n type,\n kind: kindProp,\n isLoading,\n size = 20,\n className,\n}: StnToastIconProps) {\n if (isLoading) return null\n\n const kind =\n kindProp ?? (type ? TYPE_TO_KIND[type] : undefined) ?? 'info'\n const slug = STN_TOAST_ICON_SLUG[kind]\n\n return (\n <StnIcon\n name={slug}\n size={size}\n color=\"currentColor\"\n className={cn('stn-toast-type-icon', className)}\n />\n )\n}\n\nexport { STN_TOAST_ICON_SLUG }\n","import {\n forwardRef,\n useEffect,\n useRef,\n type CSSProperties,\n type HTMLAttributes,\n type ReactNode,\n} from 'react'\n\nimport { cn } from '../cn'\nimport type { StnWithoutStyle } from '../stnStrictProps'\n\nexport type StnProgressBarTone =\n | 'primary'\n | 'secondary'\n | 'success'\n | 'critical'\n | 'major'\n | 'minor'\n | 'warning'\n | 'neutral'\n | 'info'\n | 'warn'\n | 'error'\n | (string & {})\nexport type StnProgressBarGradient =\n | 'none'\n | 'main'\n | 'primary'\n | 'secondary'\n | 'critical'\n | 'major'\n | 'minor'\n | 'warning'\nexport type StnProgressBarSize = 'sm' | 'md' | 'lg'\nexport type StnProgressBarTrack = 'default' | 'muted' | 'dark'\nexport type StnProgressBarLabelPosition = 'top' | 'bottom' | 'inside' | 'side'\nexport type StnProgressBarLabelAlign = 'between' | 'center' | 'start' | 'end'\n\nexport type StnProgressBarProps = StnWithoutStyle<Omit<HTMLAttributes<HTMLDivElement>, 'children'>> & {\n /** 정적 진행률 0–100 (countdown이 없을 때) */\n value?: number\n /** 기본 100 */\n max?: number\n tone?: StnProgressBarTone\n gradient?: StnProgressBarGradient\n size?: StnProgressBarSize\n /** 배경 트랙 색상 지정 (default: 회색 트랙, muted: 투명 트랙, dark: 짙은 회색) */\n track?: StnProgressBarTrack\n /** 진행률 텍스트 표시 여부 */\n showLabel?: boolean\n /** 텍스트 라벨 (미지정 시 `${Math.round(pct)}%`) */\n label?: ReactNode\n /** 좌측 타이틀 텍스트 (기본 '진행률', null 지정 시 타이틀 생략) */\n labelTitle?: ReactNode\n /** 레이블 위치 ('top' | 'bottom' | 'inside' | 'side') - 기본 'top' */\n labelPosition?: StnProgressBarLabelPosition\n /** 레이블 정렬 방식 ('between' | 'center' | 'start' | 'end') - 기본 'between' */\n labelAlign?: StnProgressBarLabelAlign\n /**\n * ms — 설정 시 100%→0 countdown 애니메이션\n * Toast autoClose와 맞춤 · `onComplete`에서 닫기\n */\n duration?: number\n /** countdown pause (toastify isPaused) */\n paused?: boolean\n onComplete?: () => void\n /** Toast 하단 슬롯 (`.stn-progress-bar.toast`) */\n toastSlot?: boolean\n}\n\n/**\n * Progress Bar — `.stn-progress-bar`\n * Modifiers: `.sm` · `.md` · `.lg` · `.info` · `.success` · `.warn` · `.error` · `.track-muted` · `.track-dark`\n */\nexport const StnProgressBar = forwardRef<HTMLDivElement, StnProgressBarProps>(function StnProgressBar(\n {\n value = 100,\n max = 100,\n tone = 'neutral',\n gradient = 'none',\n size = 'md',\n track = 'default',\n showLabel = false,\n label,\n labelTitle = '진행률',\n labelPosition = 'top',\n labelAlign = 'between',\n duration,\n paused = false,\n onComplete,\n toastSlot = false,\n className,\n ...rest\n },\n ref,\n) {\n const fillRef = useRef<HTMLSpanElement>(null)\n const isCountdown = duration != null && duration > 0\n const pct = max <= 0 ? 0 : Math.min(100, Math.max(0, (value / max) * 100))\n const pctNum = pct / 100\n const displayLabel = label ?? `${Math.round(pct)}%`\n const hasGradient = gradient != null && gradient !== 'none'\n\n useEffect(() => {\n if (!isCountdown || !onComplete) return\n const el = fillRef.current\n if (!el) return\n const handleEnd = () => onComplete()\n el.addEventListener('animationend', handleEnd)\n return () => el.removeEventListener('animationend', handleEnd)\n }, [isCountdown, onComplete, duration])\n\n const cssVars = {\n ['--stn-progress-pct' as string]: `${pct}%`,\n ['--stn-progress-pct-num' as string]: String(isCountdown ? 1 : pctNum),\n ...(isCountdown ? { ['--stn-progress-duration' as string]: `${duration}ms` } : {}),\n } as CSSProperties\n\n const barElement = (\n <div\n ref={ref}\n className={cn(\n 'stn-progress-bar',\n size,\n !hasGradient && tone !== 'neutral' && tone,\n hasGradient && `gradient-${gradient}`,\n track !== 'default' && `track-${track}`,\n toastSlot && 'toast',\n className,\n )}\n style={cssVars}\n role=\"progressbar\"\n aria-valuemin={0}\n aria-valuemax={max}\n aria-valuenow={isCountdown ? undefined : value}\n {...rest}\n >\n <span\n ref={fillRef}\n className={cn(\n 'stn-progress-bar__fill',\n isCountdown && 'stn-progress-bar__fill--countdown',\n isCountdown && paused && 'is-paused',\n )}\n aria-hidden\n />\n {showLabel && labelPosition === 'inside' && (\n <span className=\"stn-progress-bar__label--inside\">{displayLabel}</span>\n )}\n </div>\n )\n\n if (showLabel && labelPosition === 'side') {\n const hasTitle = labelTitle != null && labelTitle !== '' && labelAlign !== 'end'\n const hasValue = displayLabel != null && displayLabel !== '' && labelAlign !== 'start'\n\n return (\n <div\n className={cn(\n 'stn-progress-bar-wrap',\n 'stn-progress-bar-wrap--side',\n )}\n >\n {hasTitle && (\n <span className=\"stn-progress-bar-wrap__title\">{labelTitle}</span>\n )}\n {barElement}\n {hasValue && (\n <span className=\"stn-progress-bar-wrap__value\">{displayLabel}</span>\n )}\n </div>\n )\n }\n\n if (showLabel && labelPosition !== 'inside') {\n const isCenter = labelAlign === 'center'\n const isStart = labelAlign === 'start'\n const isEnd = labelAlign === 'end'\n\n return (\n <div\n className={cn(\n 'stn-progress-bar-wrap',\n labelPosition === 'bottom' && 'stn-progress-bar-wrap--bottom',\n )}\n >\n <div\n className={cn(\n 'stn-progress-bar-wrap__label',\n isCenter && 'stn-progress-bar-wrap__label--center',\n isStart && 'stn-progress-bar-wrap__label--start',\n isEnd && 'stn-progress-bar-wrap__label--end',\n )}\n >\n {labelAlign !== 'center' && labelTitle != null && labelTitle !== '' && (\n <span className=\"stn-progress-bar-wrap__title\">{labelTitle}</span>\n )}\n {labelAlign === 'center' && labelTitle != null && labelTitle !== '' && (\n <span className=\"stn-progress-bar-wrap__title\">{labelTitle}</span>\n )}\n <span className=\"stn-progress-bar-wrap__value\">{displayLabel}</span>\n </div>\n {barElement}\n </div>\n )\n }\n\n return barElement\n})\n\n","import { forwardRef, type HTMLAttributes, type ReactNode, useId } from 'react'\nimport { cn } from '../cn'\nimport type { StnWithoutStyle } from '../stnStrictProps'\n\nexport type StnCircularProgressSize = 'sm' | 'md' | 'lg' | 'xl'\nexport type StnCircularProgressTone =\n | 'primary'\n | 'secondary'\n | 'success'\n | 'critical'\n | 'major'\n | 'minor'\n | 'warning'\n | 'info'\n | 'warn'\n | 'error'\n | (string & {})\nexport type StnCircularProgressGradient =\n | 'none'\n | 'main'\n | 'primary'\n | 'secondary'\n | 'critical'\n | 'major'\n | 'minor'\n | 'warning'\nexport type StnCircularProgressTrack = 'default' | 'muted'\nexport type StnCircularProgressLabelPosition = 'center' | 'top' | 'bottom' | 'left' | 'right'\n\nexport type StnCircularProgressProps = StnWithoutStyle<Omit<HTMLAttributes<HTMLDivElement>, 'children'>> & {\n /** 0 - 100 */\n value?: number\n max?: number\n size?: StnCircularProgressSize\n tone?: StnCircularProgressTone\n gradient?: StnCircularProgressGradient\n track?: StnCircularProgressTrack\n showLabel?: boolean\n label?: ReactNode\n /** 레이블 표시 위치 ('center' | 'top' | 'bottom' | 'left' | 'right') - 기본 'center' */\n labelPosition?: StnCircularProgressLabelPosition\n /** 외부 레이블 배치 시 원형 안쪽 중앙에 함께 표시할 레이블 */\n innerLabel?: ReactNode | boolean\n}\n\nconst SIZE_MAP: Record<StnCircularProgressSize, { dim: number; stroke: number }> = {\n sm: { dim: 32, stroke: 3 },\n md: { dim: 48, stroke: 4 },\n lg: { dim: 64, stroke: 5 },\n xl: { dim: 88, stroke: 6 },\n}\n\nconst GRADIENT_STOPS: Record<\n Exclude<StnCircularProgressGradient, 'none'>,\n { start: string; end: string }\n> = {\n main: { start: 'var(--stn-blue-300)', end: 'var(--stn-purple-250)' },\n primary: { start: 'var(--stn-blue-500)', end: 'var(--stn-blue-350)' },\n secondary: { start: 'var(--stn-purple-500)', end: 'var(--stn-purple-300)' },\n critical: { start: 'var(--stn-red-500)', end: 'var(--stn-red-350)' },\n major: { start: 'var(--stn-orange-400)', end: 'var(--stn-orange-250)' },\n minor: { start: 'var(--stn-yellow-400)', end: 'var(--stn-yellow-250)' },\n warning: { start: 'var(--stn-teal-500)', end: 'var(--stn-teal-350)' },\n}\n\n/**\n * Circular Progress ? `.stn-progress-circle`\n * Modifiers: `.sm` �� `.md` �� `.lg` �� `.xl` �� `.info` �� `.success` �� `.warn` �� `.error` �� `.gradient-main` �� `.track-muted`\n */\nexport const StnCircularProgress = forwardRef<HTMLDivElement, StnCircularProgressProps>(\n function StnCircularProgress(\n {\n value = 0,\n max = 100,\n size = 'md',\n tone = 'primary',\n gradient = 'none',\n track = 'default',\n showLabel = false,\n label,\n labelPosition = 'center',\n innerLabel,\n className,\n ...rest\n },\n ref,\n ) {\n const rawId = useId()\n const gradientId = `stn-circle-grad-${rawId.replace(/[^a-zA-Z0-9_-]/g, '')}`\n\n const pct = max <= 0 ? 0 : Math.min(100, Math.max(0, (value / max) * 100))\n const displayLabel = label ?? `${Math.round(pct)}%`\n const isExternalLabel =\n showLabel &&\n (labelPosition === 'top' ||\n labelPosition === 'bottom' ||\n labelPosition === 'left' ||\n labelPosition === 'right')\n const hasInnerLabel =\n (showLabel && labelPosition === 'center' && size !== 'sm') ||\n (isExternalLabel && innerLabel != null && size !== 'sm')\n const centerText =\n labelPosition === 'center'\n ? displayLabel\n : innerLabel === true\n ? `${Math.round(pct)}%`\n : innerLabel\n\n const { dim, stroke } = SIZE_MAP[size]\n const radius = (dim - stroke) / 2\n const circumference = 2 * Math.PI * radius\n const strokeDashoffset = circumference - (pct / 100) * circumference\n\n const hasGradient = gradient !== 'none'\n const gradColors = hasGradient ? GRADIENT_STOPS[gradient] : null\n\n const circleElement = (\n <div\n ref={isExternalLabel ? undefined : ref}\n className={cn(\n 'stn-progress-circle',\n size,\n !hasGradient && tone,\n hasGradient && `gradient-${gradient}`,\n track !== 'default' && `track-${track}`,\n !isExternalLabel && className,\n )}\n role=\"progressbar\"\n aria-valuemin={0}\n aria-valuemax={max}\n aria-valuenow={value}\n {...(!isExternalLabel ? rest : {})}\n >\n <svg\n className=\"stn-progress-circle__svg\"\n viewBox={`0 0 ${dim} ${dim}`}\n width={dim}\n height={dim}\n >\n {hasGradient && gradColors && (\n <defs>\n <linearGradient\n id={gradientId}\n x1=\"0%\"\n y1=\"0%\"\n x2=\"100%\"\n y2=\"100%\"\n gradientTransform=\"rotate(90 0.5 0.5)\"\n >\n <stop offset=\"0%\" stopColor={gradColors.start} />\n <stop offset=\"100%\" stopColor={gradColors.end} />\n </linearGradient>\n </defs>\n )}\n\n <circle\n className=\"stn-progress-circle__track\"\n cx={dim / 2}\n cy={dim / 2}\n r={radius}\n />\n\n <circle\n className=\"stn-progress-circle__fill\"\n cx={dim / 2}\n cy={dim / 2}\n r={radius}\n strokeDasharray={circumference}\n strokeDashoffset={strokeDashoffset}\n stroke={hasGradient ? `url(#${gradientId})` : undefined}\n style={hasGradient ? { stroke: `url(#${gradientId})` } : undefined}\n />\n </svg>\n\n {hasInnerLabel && (\n <span className=\"stn-progress-circle__label\">{centerText}</span>\n )}\n </div>\n )\n\n if (isExternalLabel) {\n return (\n <div\n ref={ref}\n className={cn(\n 'stn-progress-circle-wrap',\n `stn-progress-circle-wrap--${labelPosition}`,\n className,\n )}\n {...rest}\n >\n {circleElement}\n <span className=\"stn-progress-circle-wrap__label\">{displayLabel}</span>\n </div>\n )\n }\n\n return circleElement\n },\n)\n","import {\n Children,\n forwardRef,\n createContext,\n useContext,\n useEffect,\n useRef,\n useState,\n type ButtonHTMLAttributes,\n type HTMLAttributes,\n type ReactNode,\n type TdHTMLAttributes,\n type ThHTMLAttributes,\n} from 'react'\n\nimport { cn } from '../cn'\nimport { StnCheckbox, type StnCheckboxProps } from './StnCheckbox'\n\n/** footerRight 액션 슬롯 권장 상한 (문서·Figma 101782) */\nexport const STN_TABLE_FOOTER_MAX_ACTIONS = 4\n\nfunction clampFooterRight(node: ReactNode): ReactNode {\n const kids = Children.toArray(node)\n if (kids.length <= STN_TABLE_FOOTER_MAX_ACTIONS) return node\n console.warn(\n `[StnTable] footerRight supports at most ${STN_TABLE_FOOTER_MAX_ACTIONS} actions; extras ignored.`,\n )\n return kids.slice(0, STN_TABLE_FOOTER_MAX_ACTIONS)\n}\n\nexport type StnTableContextValue = {\n trackVisited: boolean\n visitedRowId: string | null\n setVisitedRowId: (id: string | null) => void\n resizable?: boolean\n draggable?: boolean\n}\n\nexport const StnTableContext = createContext<StnTableContextValue | null>(null)\n\nexport type StnTableProps = {\n /** Scroll area content — usually `<StnTable.Grid>` / `table.stn-table__grid` */\n children: ReactNode\n /** `.stn-table__summary` */\n summary?: ReactNode\n /** `.stn-table__footer-center` — e.g. `<StnPagination />` */\n footerCenter?: ReactNode\n /** `.stn-table__page-size` — 행 수 드롭다운 (footer leading · summary 옆, `<StnDropdown size=\"sm\" direction=\"up\" />` 권장) */\n pageSize?: ReactNode\n /**\n * `.stn-table__footer-right` — 등록/수정/삭제 등 버튼 슬롯.\n * 최대 {@link STN_TABLE_FOOTER_MAX_ACTIONS}개 (초과 시 console.warn + slice).\n */\n footerRight?: ReactNode\n /** list view — `content_box` 높이에 맞춰 스크롤 영역 세로 채움 (`.stn-table--fill`) */\n fill?: boolean\n /** `.stn-table__scroll`에 인라인 스타일 지정 */\n scrollStyle?: React.CSSProperties\n /** 테이블 내의 rowId가 지정된 행 클릭 시 자동으로 visited 상태 관리 */\n trackVisited?: boolean\n /** 모든 Th에 리사이징 핸들러 기본 표시 여부 */\n resizable?: boolean\n /** 모든 Th를 기본적으로 드래그 가능하게 설정 */\n draggable?: boolean\n /** 컬럼 리사이징 종료 시 호출되는 콜백 (StnTable.Th에 name 속성 필수) */\n onColumnResize?: (name: string, newWidth: number) => void\n /** 컬럼 드래그 앤 드롭으로 순서 변경 시 호출되는 콜백 (StnTable.Th에 name 속성 필수) */\n onColumnReorder?: (sourceName: string, targetName: string, position: 'left' | 'right') => void\n className?: string\n}\n\nfunction StnTableBase({\n children,\n summary,\n footerCenter,\n pageSize,\n footerRight,\n fill = false,\n scrollStyle,\n trackVisited = false,\n resizable = false,\n draggable = false,\n onColumnResize,\n onColumnReorder,\n className,\n}: StnTableProps) {\n const [visitedRowId, setVisitedRowId] = useState<string | null>(null)\n const wrapperRef = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n const wrapper = wrapperRef.current\n if (!wrapper) return\n\n // 리사이징 핸들러\n let isResizing = false\n let startX = 0\n let currentResizer: HTMLElement | null = null\n let targetCols: HTMLElement[] = []\n let startWidths: number[] = []\n\n const handleMouseMove = (e: MouseEvent) => {\n if (!isResizing || targetCols.length === 0) return\n const delta = e.clientX - startX\n const deltaPerCol = delta / targetCols.length\n \n targetCols.forEach((col, idx) => {\n const newWidth = Math.max(50, startWidths[idx] + deltaPerCol)\n col.style.width = `${newWidth}px`\n })\n }\n\n const handleMouseUp = () => {\n if (!isResizing) return\n isResizing = false\n if (currentResizer) {\n currentResizer.classList.remove('is-resizing')\n }\n document.body.style.cursor = ''\n document.body.style.userSelect = ''\n\n if (onColumnResize) {\n targetCols.forEach(col => {\n const name = col.getAttribute('data-name')\n if (name) {\n const finalWidth = parseFloat(col.style.width) || col.getBoundingClientRect().width\n onColumnResize(name, finalWidth)\n }\n })\n }\n\n window.removeEventListener('mousemove', handleMouseMove)\n window.removeEventListener('mouseup', handleMouseUp)\n \n targetCols = []\n startWidths = []\n }\n\n const handleMouseDown = (e: MouseEvent) => {\n if (!resizable) return\n const target = e.target as HTMLElement\n if (!target.classList.contains('stn-table__resizer')) return\n\n const th = target.closest('th')\n if (!th) return\n\n const table = th.closest('table')\n if (!table) return\n\n const groupColsStr = th.getAttribute('data-group-cols')\n const targetElements: HTMLElement[] = []\n\n if (groupColsStr) {\n const names = groupColsStr.split(',')\n names.forEach(name => {\n const col = table.querySelector(`col[data-name=\"${name}\"]`) as HTMLElement\n if (col) targetElements.push(col)\n })\n } else {\n const name = th.getAttribute('data-name')\n if (name) {\n const col = table.querySelector(`col[data-name=\"${name}\"]`) as HTMLElement\n if (col) targetElements.push(col)\n }\n }\n\n if (targetElements.length === 0) return\n\n isResizing = true\n startX = e.clientX\n targetCols = targetElements\n startWidths = targetCols.map(col => col.style.width ? parseFloat(col.style.width) : col.getBoundingClientRect().width)\n \n currentResizer = target\n currentResizer.classList.add('is-resizing')\n \n document.body.style.cursor = 'col-resize'\n document.body.style.userSelect = 'none'\n\n window.addEventListener('mousemove', handleMouseMove)\n window.addEventListener('mouseup', handleMouseUp)\n }\n\n // 드래그 앤 드롭 핸들러\n let draggedName: string | null = null\n let dragOverName: string | null = null\n let dragOverPos: 'left' | 'right' | null = null\n let dragOverTh: HTMLElement | null = null\n\n const clearDragClasses = () => {\n if (dragOverTh) {\n dragOverTh.classList.remove('stn-table__th--drag-over-left', 'stn-table__th--drag-over-right')\n }\n dragOverTh = null\n dragOverName = null\n dragOverPos = null\n }\n\n const handleDragStart = (e: DragEvent) => {\n if (!draggable || isResizing) {\n e.preventDefault()\n return\n }\n \n const target = e.target as HTMLElement\n \n // 리사이저 자체를 드래그하려고 하는 경우도 방지\n if (target.classList?.contains('stn-table__resizer')) {\n e.preventDefault()\n return\n }\n\n const th = target.closest('th')\n if (!th || !th.hasAttribute('draggable')) {\n e.preventDefault()\n return\n }\n \n draggedName = th.getAttribute('data-name')\n if (!draggedName) return\n \n th.classList.add('stn-table__th--dragging')\n \n // 드래그 이미지 설정 가능하지만 기본값 사용\n }\n\n const handleDragOver = (e: DragEvent) => {\n if (!draggable || !draggedName) return\n const th = (e.target as HTMLElement).closest('th')\n if (!th || !th.hasAttribute('draggable')) return\n \n e.preventDefault()\n const name = th.getAttribute('data-name')\n if (!name || name === draggedName) return\n\n const rect = th.getBoundingClientRect()\n const isRight = e.clientX - rect.left > rect.width / 2\n\n if (dragOverTh !== th || dragOverPos !== (isRight ? 'right' : 'left')) {\n clearDragClasses()\n dragOverTh = th\n dragOverName = name\n dragOverPos = isRight ? 'right' : 'left'\n th.classList.add(isRight ? 'stn-table__th--drag-over-right' : 'stn-table__th--drag-over-left')\n }\n }\n\n const handleDragLeave = (e: DragEvent) => {\n if (!draggable || !draggedName) return\n const th = (e.target as HTMLElement).closest('th')\n if (th === dragOverTh) {\n clearDragClasses()\n }\n }\n\n const handleDrop = (e: DragEvent) => {\n if (!draggable || !draggedName) return\n const th = (e.target as HTMLElement).closest('th')\n if (!th) {\n clearDragClasses()\n return\n }\n\n e.preventDefault()\n \n if (dragOverName && dragOverPos && onColumnReorder && dragOverName !== draggedName) {\n onColumnReorder(draggedName, dragOverName, dragOverPos)\n }\n clearDragClasses()\n }\n\n const handleDragEnd = (e: DragEvent) => {\n const th = (e.target as HTMLElement).closest('th')\n if (th) th.classList.remove('stn-table__th--dragging')\n draggedName = null\n clearDragClasses()\n }\n\n wrapper.addEventListener('mousedown', handleMouseDown)\n wrapper.addEventListener('dragstart', handleDragStart)\n wrapper.addEventListener('dragover', handleDragOver)\n wrapper.addEventListener('dragleave', handleDragLeave)\n wrapper.addEventListener('drop', handleDrop)\n wrapper.addEventListener('dragend', handleDragEnd)\n\n return () => {\n wrapper.removeEventListener('mousedown', handleMouseDown)\n wrapper.removeEventListener('dragstart', handleDragStart)\n wrapper.removeEventListener('dragover', handleDragOver)\n wrapper.removeEventListener('dragleave', handleDragLeave)\n wrapper.removeEventListener('drop', handleDrop)\n wrapper.removeEventListener('dragend', handleDragEnd)\n }\n }, [resizable, draggable, onColumnResize, onColumnReorder])\n \n const right = footerRight != null ? clampFooterRight(footerRight) : null\n const hasLeading = summary != null || pageSize != null\n const hasCenter = footerCenter != null\n const hasFooter = hasLeading || hasCenter || right != null\n\n return (\n <StnTableContext.Provider value={{ trackVisited, visitedRowId, setVisitedRowId, resizable, draggable }}>\n <div ref={wrapperRef} className={cn('stn-table', fill && 'stn-table--fill', className)}>\n <div className=\"stn-table__scroll\" style={scrollStyle}>{children}</div>\n {hasFooter ? (\n <div className=\"stn-table__footer\">\n {hasLeading ? (\n <div className=\"stn-table__footer-leading\">\n {summary != null ? <p className=\"stn-table__summary\">{summary}</p> : null}\n {pageSize != null ? <div className=\"stn-table__page-size\">{pageSize}</div> : null}\n </div>\n ) : (\n <span />\n )}\n {hasCenter ? <div className=\"stn-table__footer-center\">{footerCenter}</div> : <span />}\n <div className=\"stn-table__footer-right\">{right}</div>\n </div>\n ) : null}\n </div>\n </StnTableContext.Provider>\n )\n}\n\nexport type StnTableGridProps = HTMLAttributes<HTMLTableElement>\n\nexport const StnTableGrid = forwardRef<HTMLTableElement, StnTableGridProps>(function StnTableGrid(\n { className, children, ...rest },\n ref,\n) {\n return (\n <table ref={ref} className={cn('stn-table__grid', className)} {...rest}>\n {children}\n </table>\n )\n})\n\nexport type StnTableHeadProps = HTMLAttributes<HTMLTableSectionElement>\n\nexport const StnTableHead = forwardRef<HTMLTableSectionElement, StnTableHeadProps>(\n function StnTableHead({ className, children, ...rest }, ref) {\n return (\n <thead ref={ref} className={cn('stn-table__thead', className)} {...rest}>\n {children}\n </thead>\n )\n },\n)\n\nexport type StnTableBodyProps = HTMLAttributes<HTMLTableSectionElement>\n\nexport const StnTableBody = forwardRef<HTMLTableSectionElement, StnTableBodyProps>(\n function StnTableBody({ className, children, ...rest }, ref) {\n return (\n <tbody ref={ref} className={cn('stn-table__tbody', className)} {...rest}>\n {children}\n </tbody>\n )\n },\n)\n\nexport type StnTableRowProps = HTMLAttributes<HTMLTableRowElement> & {\n /** hover background for body rows */\n hoverable?: boolean\n /** 행 선택(Active/Selected) 하이라이트 배경 (푸른 계열) */\n selected?: boolean\n /** 직전에 클릭했던 행 (보라 계열) */\n visited?: boolean\n /** 행 강조 (초록 계열) */\n highlighted?: boolean\n /** 클릭 가능한 행 포인터 커서 (cursor: pointer) */\n clickable?: boolean\n /** 프레스 면 — 마우스 다운 고정(문서) 또는 `.is-pressed` */\n pressed?: boolean\n /** StnTable에 trackVisited 설정 시 내부적으로 visited 상태를 추적하기 위한 고유 식별자 */\n rowId?: string\n}\n\nexport const StnTableRow = forwardRef<HTMLTableRowElement, StnTableRowProps>(function StnTableRow(\n { className, hoverable = false, selected = false, visited = false, highlighted = false, clickable = false, pressed = false, rowId, children, onClick, ...rest },\n ref,\n) {\n const ctx = useContext(StnTableContext)\n\n const isTrackedVisited = ctx?.trackVisited && ctx.visitedRowId != null && ctx.visitedRowId === rowId\n const finalVisited = visited || isTrackedVisited\n\n const handleClick = (e: React.MouseEvent<HTMLTableRowElement>) => {\n if (ctx?.trackVisited && rowId != null) {\n if (!(e.target as HTMLElement).closest('.stn-table__col-check')) {\n ctx.setVisitedRowId(rowId)\n }\n }\n onClick?.(e)\n }\n\n return (\n <tr\n ref={ref}\n className={cn(\n hoverable && 'is-hoverable',\n selected && 'is-selected',\n finalVisited && 'is-visited',\n highlighted && 'is-highlighted',\n clickable && 'is-clickable',\n pressed && 'is-pressed',\n className,\n )}\n onClick={handleClick}\n {...rest}\n >\n {children}\n </tr>\n )\n})\n\n/** Infomap 기본은 center. 텍스트 열은 left, 수치 열은 right. */\nexport type StnTableAlign = 'left' | 'center' | 'right'\n\nconst TABLE_COL_WIDTHS = new Set([60, 70, 72, 80, 100, 110, 120, 140, 160, 180, 200])\n\nfunction tableColWidthClass(width?: number | string): string | undefined {\n if (typeof width !== 'number' || !TABLE_COL_WIDTHS.has(width)) return undefined\n return `stn-table__col--${width}`\n}\n\nexport type StnTableThProps = Omit<ThHTMLAttributes<HTMLTableCellElement>, 'align'> & {\n /** checkbox column — 60px */\n check?: boolean\n /** 셀 텍스트 정렬 — `left` | `center`(기본) | `right` */\n align?: StnTableAlign\n /** 프레스 면 — 마우스 다운 고정(문서) 또는 `.is-pressed` */\n pressed?: boolean\n /**\n * 열 너비. 사이즈 토큰 스텝만 클래스로 붙는다.\n * `width={120}` → `.stn-table__col--120` → `var(--stn-size-120)`.\n * 60 · 70 · 72 · 80 · 100 · 110 · 120 · 140 · 160 · 180 · 200.\n * 빼 둔 열이 표의 남은 폭을 흡수한다. Body `Td`에는 두지 않는다.\n */\n width?: number\n /** 열 너비 조절 기능을 사용할지 여부 */\n resizable?: boolean\n /** 컬럼 식별자 (리사이징 및 드래그 앤 드롭 시 onColumnResize, onColumnReorder 콜백으로 전달됨) */\n name?: string\n /** 다중 헤더 그룹인 경우, 하위에 속한 컬럼들의 식별자 배열 (배열을 넘기면 리사이징 시 하위 열들이 골고루 조절됨) */\n groupCols?: string[]\n}\n\nexport const StnTableTh = forwardRef<HTMLTableCellElement, StnTableThProps>(function StnTableTh(\n { className, check = false, align, pressed = false, width, style, children, scope = 'col', resizable, draggable, name, groupCols, ...rest },\n ref,\n) {\n const ctx = useContext(StnTableContext)\n const colWidthClass = tableColWidthClass(width)\n const finalResizable = resizable ?? ctx?.resizable\n const finalDraggable = draggable ?? ctx?.draggable\n\n return (\n <th\n ref={ref}\n scope={scope}\n draggable={finalDraggable}\n data-name={name}\n data-group-cols={groupCols?.join(',')}\n className={cn(\n check && 'stn-table__col-check',\n align && `stn-table__th--align-${align}`,\n pressed && 'is-pressed',\n colWidthClass,\n className,\n )}\n style={style}\n {...rest}\n >\n {children}\n {finalResizable && (\n <div\n className=\"stn-table__resizer\"\n title=\"경계선 드래그하여 너비 조절\"\n />\n )}\n </th>\n )\n})\n\nexport type StnTableTdProps = Omit<TdHTMLAttributes<HTMLTableCellElement>, 'align'> & {\n check?: boolean\n /** 셀 텍스트 정렬 — `left` | `center`(기본) | `right` */\n align?: StnTableAlign\n}\n\nexport const StnTableTd = forwardRef<HTMLTableCellElement, StnTableTdProps>(function StnTableTd(\n { className, check = false, align, children, title, onMouseEnter, ...rest },\n ref,\n) {\n const autoTitle = typeof children === 'string' ? children : undefined;\n\n const handleMouseEnter = (e: React.MouseEvent<HTMLTableCellElement>) => {\n if (onMouseEnter) onMouseEnter(e);\n \n if (title === undefined && autoTitle) {\n const target = e.currentTarget;\n if (target.scrollWidth > target.clientWidth) {\n target.title = autoTitle;\n } else {\n target.title = '';\n }\n }\n };\n\n return (\n <td\n ref={ref}\n title={title}\n onMouseEnter={handleMouseEnter}\n className={cn(\n check && 'stn-table__col-check',\n align && `stn-table__td--align-${align}`,\n className,\n )}\n {...rest}\n >\n {children}\n </td>\n )\n})\n\nexport type StnTableThCheckProps = Omit<StnCheckboxProps, 'controlOnly' | 'variant'> &\n Pick<ThHTMLAttributes<HTMLTableCellElement>, 'scope' | 'className'>\n\n/** Infomap th 체크박스 전용 — Figma node 40000042:209512 (열 60 · 18×18 · 전체 선택) */\nexport const StnTableThCheck = forwardRef<HTMLInputElement, StnTableThCheckProps>(function StnTableThCheck(\n { label = '전체 선택', scope = 'col', className, ...rest },\n ref,\n) {\n return (\n <th scope={scope} className={cn('stn-table__col-check', className)}>\n <StnCheckbox ref={ref} controlOnly label={label} {...rest} />\n </th>\n )\n})\n\nexport type StnTableTdCheckProps = Omit<StnCheckboxProps, 'controlOnly' | 'variant'> &\n Pick<TdHTMLAttributes<HTMLTableCellElement>, 'className'>\n\n/** tbody 체크박스 셀 — `StnTable.ThCheck`와 동일 60px 열 */\nexport const StnTableTdCheck = forwardRef<HTMLInputElement, StnTableTdCheckProps>(function StnTableTdCheck(\n { label = '행 선택', className, ...rest },\n ref,\n) {\n return (\n <td className={cn('stn-table__col-check', className)}>\n <StnCheckbox ref={ref} controlOnly label={label} {...rest} />\n </td>\n )\n})\n\nexport type StnTableSortProps = ButtonHTMLAttributes<HTMLButtonElement> & {\n label: ReactNode\n /** none | ascending | descending */\n sort?: 'none' | 'ascending' | 'descending'\n /** 프레스 면 고정 — `.is-pressed` (문서·마우스 다운과 동일) */\n pressed?: boolean\n}\n\n/** Infomap sortable header — 텍스트+아이콘 inner + 클릭·`aria-sort` (Figma 40000042:209530) */\nexport const StnTableSort = forwardRef<HTMLButtonElement, StnTableSortProps>(function StnTableSort(\n { label, sort = 'none', pressed = false, className, type = 'button', ...rest },\n ref,\n) {\n const active = sort !== 'none'\n return (\n <button\n ref={ref}\n type={type}\n className={cn(\n 'stn-table__sort',\n active && 'is-active',\n sort === 'ascending' && 'is-asc',\n sort === 'descending' && 'is-desc',\n pressed && 'is-pressed',\n className,\n )}\n aria-sort={sort}\n {...rest}\n >\n <span className=\"stn-table__th-label-text\">{label}</span>\n <span className=\"stn-table__th-label-icon\" aria-hidden=\"true\" />\n </button>\n )\n})\n\nexport type StnTableRowActionsProps = HTMLAttributes<HTMLDivElement>\n\n/** Row Actions — 행 호버 시 우측 끝에 나타나는 액션 버튼 그룹 컨테이너 */\nexport const StnTableRowActions = forwardRef<HTMLDivElement, StnTableRowActionsProps>(function StnTableRowActions(\n { className, children, ...rest },\n ref,\n) {\n return (\n <div ref={ref} className={cn('stn-table__row-actions', className)} {...rest}>\n {children}\n </div>\n )\n})\n\nexport type StnTableCompound = typeof StnTableBase & {\n Grid: typeof StnTableGrid\n Head: typeof StnTableHead\n Body: typeof StnTableBody\n Row: typeof StnTableRow\n Th: typeof StnTableTh\n Td: typeof StnTableTd\n ThCheck: typeof StnTableThCheck\n TdCheck: typeof StnTableTdCheck\n Sort: typeof StnTableSort\n RowActions: typeof StnTableRowActions\n}\n\n/**\n * Pub list table shell — Infomap Figma thead/tbody (node 40000042:209510).\n * Markup: `.stn-table` > `.stn-table__scroll` + optional footer.\n */\nexport const StnTable = StnTableBase as StnTableCompound\n\nStnTable.Grid = StnTableGrid\nStnTable.Head = StnTableHead\nStnTable.Body = StnTableBody\nStnTable.Row = StnTableRow\nStnTable.Th = StnTableTh\nStnTable.Td = StnTableTd\nStnTable.ThCheck = StnTableThCheck\nStnTable.TdCheck = StnTableTdCheck\nStnTable.Sort = StnTableSort\nStnTable.RowActions = StnTableRowActions\n","import {\n forwardRef,\n useEffect,\n useId,\n useImperativeHandle,\n useRef,\n type InputHTMLAttributes,\n type ReactNode,\n} from 'react'\n\nimport { cn } from '../cn'\nimport type { StnWithoutStyle } from '../stnStrictProps'\n\nexport type StnCheckboxSize = 'sm' | 'md' | 'lg'\nexport type StnCheckboxColor =\n | 'primary'\n | 'secondary'\n | 'success'\n | 'critical'\n | 'major'\n | 'minor'\n | 'warning'\n | 'error'\n | 'neutral'\n | (string & {})\n\nexport type StnCheckboxLabelPlacement = 'end' | 'start' | 'top' | 'bottom' | 'left' | 'right'\n\nexport type StnCheckboxProps = StnWithoutStyle<\n Omit<InputHTMLAttributes<HTMLInputElement>, 'type' | 'className' | 'children' | 'size'>\n> & {\n /** 레이블 텍스트. 생략 시 단독 컨트롤로 표시 */\n label?: ReactNode\n /** 체크박스 크기 ('sm': 14px, 'md': 18px, 'lg': 22px) @default 'md' */\n size?: StnCheckboxSize\n /** 시멘틱 색상 또는 커스텀 색상 ('primary' | 'secondary' | 'success' | 'critical' | 'major' | 'minor' | 'warning' | 'error' | 'neutral') @default 'primary' */\n color?: StnCheckboxColor\n /** 레이블 배치 위치 ('end' | 'start' | 'top' | 'bottom') @default 'end' */\n labelPlacement?: StnCheckboxLabelPlacement\n /** 부분 선택 (Indeterminate) 상태 표시 */\n indeterminate?: boolean\n /** 부분 선택(indeterminate) 시 표시할 커스텀 아이콘 / 이미지 */\n indeterminateIcon?: ReactNode\n /** 선택(checked) 시 표시할 커스텀 아이콘 / 이미지 */\n checkedIcon?: ReactNode\n /** 미선택(unchecked) 시 표시할 커스텀 아이콘 / 이미지 */\n icon?: ReactNode\n /** 레이블 텍스트 숨기고 18px 컨트롤만 표시 (label이 없으면 자동 적용) */\n controlOnly?: boolean\n /** `.checkbox` 래퍼 */\n className?: string\n}\n\n/**\n * Checkbox — Figma `input`(default). 모양: `stn-checkbox.css`\n * 토글 필(ON/OFF)은 `<StnToggleButton>` · 트랙 스위치는 `<StnSwitch>`\n */\nexport const StnCheckbox = forwardRef<HTMLInputElement, StnCheckboxProps>(function StnCheckbox(\n {\n label,\n size = 'md',\n color,\n labelPlacement = 'end',\n indeterminate = false,\n indeterminateIcon,\n checkedIcon,\n icon,\n controlOnly,\n className,\n id: idProp,\n disabled,\n checked,\n defaultChecked,\n ...rest\n },\n forwardedRef,\n) {\n const autoId = useId()\n const id = idProp ?? autoId\n const innerRef = useRef<HTMLInputElement>(null)\n\n useImperativeHandle(forwardedRef, () => innerRef.current!)\n\n useEffect(() => {\n if (innerRef.current) {\n innerRef.current.indeterminate = Boolean(indeterminate)\n }\n }, [indeterminate])\n\n const isControlOnly = controlOnly ?? !label\n\n // Placement class\n const placementClass =\n labelPlacement === 'start' || labelPlacement === 'left'\n ? 'label-start'\n : labelPlacement === 'top'\n ? 'label-top'\n : labelPlacement === 'bottom'\n ? 'label-bottom'\n : ''\n\n // Tone class (단일 클래스 - 체크마크 색상만 지정 시 적용)\n const isKnownTone = color\n ? [\n 'primary',\n 'secondary',\n 'success',\n 'critical',\n 'major',\n 'minor',\n 'warning',\n 'error',\n 'red',\n 'warn',\n 'neutral',\n ].includes(color)\n : false\n const toneClass = isKnownTone && color ? (color === 'red' ? 'critical' : color) : ''\n const inlineStyle =\n !isKnownTone && color\n ? ({\n '--stn-checkbox-check': color,\n } as React.CSSProperties)\n : undefined\n\n // Determine if custom icon is rendered\n let customIconNode: ReactNode = null\n if (indeterminate && indeterminateIcon) {\n customIconNode = indeterminateIcon\n } else if ((checked || (checked == null && defaultChecked)) && checkedIcon) {\n customIconNode = checkedIcon\n } else if (!checked && !defaultChecked && icon) {\n customIconNode = icon\n }\n const hasCustomIcon = customIconNode != null\n\n return (\n <span\n className={cn(\n 'checkbox',\n 'stn-checkbox',\n size !== 'md' && size,\n toneClass,\n placementClass,\n indeterminate && 'indeterminate',\n isControlOnly && 'control-only',\n disabled && 'disabled',\n hasCustomIcon && 'has-custom-icon',\n className,\n )}\n style={inlineStyle}\n >\n <input\n ref={innerRef}\n type=\"checkbox\"\n id={id}\n disabled={disabled}\n checked={checked}\n defaultChecked={defaultChecked}\n {...rest}\n />\n {hasCustomIcon && (\n <span className=\"stn-checkbox__custom-icon\" aria-hidden=\"true\">\n {customIconNode}\n </span>\n )}\n {label != null && <label htmlFor={id}>{label}</label>}\n {label == null && <label htmlFor={id} aria-hidden=\"true\" />}\n </span>\n )\n})\n\n","import {\n forwardRef,\n useCallback,\n useMemo,\n useState,\n type HTMLAttributes,\n} from 'react'\n\nimport { cn } from '../cn'\nimport { StnTreeNode, type StnTreeNodeDocState } from './StnTreeNode'\nimport {\n collectExpandableIds,\n flattenStnTree,\n type StnTreeItem,\n} from '../stnTreeFlatten'\n\nexport type StnTreeDocRowState = StnTreeNodeDocState\n\nexport type StnTreeProps = Omit<HTMLAttributes<HTMLDivElement>, 'children' | 'onSelect'> & {\n nodes: StnTreeItem[]\n /** 섹션 제목 — Figma `FOLDER STRUCTURE` */\n heading?: string\n defaultExpandedIds?: string[]\n expandedIds?: string[]\n onExpandedChange?: (ids: string[]) => void\n selectedId?: string | null\n defaultSelectedId?: string | null\n onSelect?: (id: string) => void\n /**\n * Docs Playground — 특정 행에 hover/pressed/selected 비주얼을 고정합니다.\n * 제품 코드에서는 쓰지 마세요.\n */\n docRowState?: { id: string; state: StnTreeDocRowState }\n}\n\nfunction useControllableSet(\n controlled: string[] | undefined,\n defaultIds: string[] | undefined,\n allExpandable: string[],\n) {\n const [internal, setInternal] = useState<string[]>(() => defaultIds ?? allExpandable)\n const value = controlled ?? internal\n const setValue = useCallback(\n (next: string[] | ((prev: string[]) => string[])) => {\n const resolved = typeof next === 'function' ? next(controlled ?? internal) : next\n if (controlled == null) setInternal(resolved)\n },\n [controlled, internal],\n )\n return [value, setValue] as const\n}\n\n/** Infomap folder structure tree — `StnTreeNode` 조립 · Figma 40000042:210359 */\nexport const StnTree = forwardRef<HTMLDivElement, StnTreeProps>(function StnTree(\n {\n nodes,\n heading = 'FOLDER STRUCTURE',\n defaultExpandedIds,\n expandedIds,\n onExpandedChange,\n selectedId,\n defaultSelectedId = null,\n onSelect,\n docRowState,\n className,\n ...rest\n },\n ref,\n) {\n const expandableIds = useMemo(() => collectExpandableIds(nodes), [nodes])\n const [expanded, setExpanded] = useControllableSet(expandedIds, defaultExpandedIds, expandableIds)\n const [internalSelected, setInternalSelected] = useState<string | null>(defaultSelectedId)\n const selected = selectedId ?? internalSelected\n\n const rows = useMemo(() => flattenStnTree(nodes, expanded), [nodes, expanded])\n\n const setExpandedIds = useCallback(\n (next: string[]) => {\n setExpanded(next)\n onExpandedChange?.(next)\n },\n [onExpandedChange, setExpanded],\n )\n\n const handleToggle = useCallback(\n (id: string) => {\n setExpandedIds(\n expanded.includes(id) ? expanded.filter((item) => item !== id) : [...expanded, id],\n )\n },\n [expanded, setExpandedIds],\n )\n\n const handleSelect = useCallback(\n (id: string) => {\n if (selectedId == null) setInternalSelected(id)\n onSelect?.(id)\n },\n [onSelect, selectedId],\n )\n\n return (\n <div ref={ref} className={cn('stn-tree', className)} {...rest}>\n {heading ? <p className=\"stn-tree__heading\">{heading}</p> : null}\n <div className=\"stn-tree__rows\" role=\"tree\" aria-label={heading || 'folder tree'}>\n {rows.map((row) => (\n <StnTreeNode\n key={row.id}\n label={row.label}\n kind={row.kind}\n depth={row.depth}\n expanded={row.expanded}\n selected={selected === row.id}\n hasChildren={row.hasChildren}\n isLast={row.isLast}\n cells={row.cells}\n docState={docRowState?.id === row.id ? docRowState.state : 'default'}\n onToggle={() => handleToggle(row.id)}\n onSelect={() => handleSelect(row.id)}\n />\n ))}\n </div>\n </div>\n )\n})\n\nexport type { StnTreeItem, StnTreeNodeKind } from '../stnTreeFlatten'\n","import { forwardRef, type HTMLAttributes, type KeyboardEvent } from 'react'\n\nimport { cn } from '../cn'\nimport { StnIcon } from './StnIcon'\nimport { resolveSystemIconSrcFromName } from '@stn-uiux/pub-ui/data/stnSystemIcons'\nimport {\n buildStnTreeNodeCells,\n type StnTreeGuideCell,\n type StnTreeNodeKind,\n} from '../stnTreeFlatten'\n\nconst ICON = {\n folderOpen: resolveSystemIconSrcFromName('fill/folder-open') ?? '',\n folderClosed: resolveSystemIconSrcFromName('fill/folder') ?? '',\n vertical: resolveSystemIconSrcFromName('line/vertical_line') ?? '',\n connectorMid: resolveSystemIconSrcFromName('line/tree_connector_midium') ?? '',\n connectorEnd: resolveSystemIconSrcFromName('line/tree_connector') ?? '',\n chevron: resolveSystemIconSrcFromName('line/arrow-left') ?? '',\n} as const\n\nexport type StnTreeNodeDocState = 'default' | 'hover' | 'pressed' | 'selected'\n\nexport type StnTreeNodeProps = Omit<HTMLAttributes<HTMLDivElement>, 'children' | 'onSelect' | 'onToggle'> & {\n label: string\n /** default `folder` */\n kind?: StnTreeNodeKind\n /** 0–3 · `data-depth` · 가이드 들여쓰기 */\n depth?: number\n expanded?: boolean\n selected?: boolean\n /** folder/root에 자식이 있으면 chevron · server는 connector */\n hasChildren?: boolean\n /** server connector end vs mid */\n isLast?: boolean\n /** depth>1 가이드 · length = depth-1 */\n ancestorIsLast?: boolean[]\n /** 셀을 직접 넘기면 depth/kind 기반 생성을 건너뜁니다 */\n cells?: StnTreeGuideCell[]\n /**\n * Docs Playground — hover/pressed/selected 비주얼 고정.\n * 제품 코드에서는 쓰지 마세요.\n */\n docState?: StnTreeNodeDocState\n onSelect?: () => void\n onToggle?: () => void\n}\n\nfunction maskStyle(src: string) {\n return { maskImage: `url('${src}')`, WebkitMaskImage: `url('${src}')` } as const\n}\n\nfunction TreeGuideCell({ cell }: { cell: StnTreeGuideCell }) {\n if (cell.type === 'blank') {\n return <span className=\"stn-tree__cell stn-tree__cell--blank\" aria-hidden=\"true\" />\n }\n if (cell.type === 'vertical') {\n return (\n <span className=\"stn-tree__cell stn-tree__cell--guide\" aria-hidden=\"true\">\n <span className=\"stn-tree__guide-glyph\" style={maskStyle(ICON.vertical)} />\n </span>\n )\n }\n if (cell.type === 'connector') {\n return (\n <span\n className={cn(\n 'stn-tree__cell stn-tree__cell--guide',\n cell.variant === 'end' && 'stn-tree__cell--connector-end',\n )}\n aria-hidden=\"true\"\n >\n <span\n className=\"stn-tree__guide-glyph\"\n style={maskStyle(cell.variant === 'end' ? ICON.connectorEnd : ICON.connectorMid)}\n />\n </span>\n )\n }\n return (\n <span className=\"stn-tree__cell stn-tree__cell--toggle\" aria-hidden=\"true\">\n <span\n className={cn('stn-tree__chevron-glyph', cell.expanded && 'is-expanded')}\n style={maskStyle(ICON.chevron)}\n />\n </span>\n )\n}\n\nfunction TreeNodeIcon({ kind, expanded }: { kind: StnTreeNodeKind; expanded: boolean }) {\n if (kind === 'server') {\n return (\n <span className=\"stn-tree__cell stn-tree__cell--icon stn-tree__icon stn-tree__icon--server\">\n {/* Light — gray-400 면 · Dark — fill/server_2 본색(#40474F) */}\n <StnIcon\n name=\"fill/server_2_tree_light\"\n size={16}\n className=\"stn-tree__icon-glyph stn-tree__server-icon stn-tree__server-icon--light stn-icon--color\"\n />\n <StnIcon\n name=\"fill/server_2\"\n size={16}\n className=\"stn-tree__icon-glyph stn-tree__server-icon stn-tree__server-icon--dark stn-icon--color\"\n />\n </span>\n )\n }\n\n const folderKind = kind === 'root' ? 'root' : 'folder'\n const folderSrc = kind === 'root' || expanded ? ICON.folderOpen : ICON.folderClosed\n\n return (\n <span\n className={cn(\n 'stn-tree__cell stn-tree__cell--icon stn-tree__icon',\n `stn-tree__icon--${folderKind}`,\n )}\n >\n <span className=\"stn-tree__icon-glyph\" style={maskStyle(folderSrc)} aria-hidden=\"true\" />\n </span>\n )\n}\n\n/** Infomap FOLDER STRUCTURE 행 — Figma 40000042:210359 */\nexport const StnTreeNode = forwardRef<HTMLDivElement, StnTreeNodeProps>(function StnTreeNode(\n {\n label,\n kind = 'folder',\n depth = 0,\n expanded = false,\n selected = false,\n hasChildren,\n isLast = true,\n ancestorIsLast,\n cells: cellsProp,\n docState = 'default',\n onSelect,\n onToggle,\n className,\n onClick,\n onKeyDown,\n ...rest\n },\n ref,\n) {\n const resolvedHasChildren = hasChildren ?? kind !== 'server'\n const cells =\n cellsProp ??\n buildStnTreeNodeCells({\n depth,\n kind,\n hasChildren: resolvedHasChildren,\n expanded,\n isLast,\n ancestorIsLast,\n })\n\n const isSelected = selected || docState === 'selected'\n\n const handleSelect = () => onSelect?.()\n\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n onKeyDown?.(event)\n if (event.defaultPrevented) return\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n handleSelect()\n }\n }\n\n return (\n <div\n ref={ref}\n role=\"treeitem\"\n aria-selected={isSelected}\n aria-expanded={resolvedHasChildren ? expanded : undefined}\n className={cn(\n 'stn-tree__row',\n isSelected && 'is-selected',\n docState === 'hover' && 'is-hover',\n docState === 'pressed' && 'is-pressed',\n `stn-tree__row--${kind}`,\n className,\n )}\n data-depth={depth}\n onClick={(e) => {\n onClick?.(e)\n if (!e.defaultPrevented) handleSelect()\n }}\n onKeyDown={handleKeyDown}\n tabIndex={0}\n {...rest}\n >\n {cells.map((cell, index) => {\n if (cell.type === 'toggle') {\n return (\n <button\n key={`c-${index}`}\n type=\"button\"\n className=\"stn-tree__cell stn-tree__cell--toggle stn-tree__toggle\"\n aria-label={cell.expanded ? `${label} 접기` : `${label} 펼치기`}\n aria-expanded={cell.expanded}\n onClick={(event) => {\n event.stopPropagation()\n onToggle?.()\n }}\n >\n <span\n className={cn('stn-tree__chevron-glyph', cell.expanded && 'is-expanded')}\n style={maskStyle(ICON.chevron)}\n />\n </button>\n )\n }\n return <TreeGuideCell key={`c-${index}`} cell={cell} />\n })}\n <TreeNodeIcon kind={kind} expanded={expanded} />\n <span className=\"stn-tree__label\">{label}</span>\n </div>\n )\n})\n","export type StnTreeNodeKind = 'root' | 'folder' | 'server'\r\n\r\n/** Tree 데이터 노드 — `StnTree`의 `nodes` 항목 (`StnTreeNode` 컴포넌트와 별개) */\r\nexport type StnTreeItem = {\r\n id: string\r\n label: string\r\n /** default `folder` · leaf는 `server` · 최상위 루트는 `root` */\r\n kind?: StnTreeNodeKind\r\n children?: StnTreeItem[]\r\n}\r\nexport type StnTreeGuideCell =\r\n | { type: 'blank' }\r\n | { type: 'vertical' }\r\n | { type: 'connector'; variant: 'mid' | 'end' }\r\n | { type: 'toggle'; expanded: boolean }\r\n\r\nexport type StnTreeFlatRow = {\r\n id: string\r\n label: string\r\n kind: StnTreeNodeKind\r\n depth: number\r\n cells: StnTreeGuideCell[]\r\n hasChildren: boolean\r\n expanded: boolean\r\n isLast: boolean\r\n}\r\n\r\nfunction resolveKind(node: StnTreeItem, depth: number): StnTreeNodeKind {\r\n if (node.kind) return node.kind\r\n if (depth === 0) return 'root'\r\n if (node.children?.length) return 'folder'\r\n return 'server'\r\n}\r\n\r\n/** 단일 Tree Node용 가이드/토글 셀 — depth · kind 기준으로 생성 */\r\nexport function buildStnTreeNodeCells(options: {\r\n depth: number\r\n kind: StnTreeNodeKind\r\n hasChildren?: boolean\r\n expanded?: boolean\r\n isLast?: boolean\r\n /** length = max(0, depth - 1) · true면 해당 조상 이후 vertical 숨김 */\r\n ancestorIsLast?: boolean[]\r\n}): StnTreeGuideCell[] {\r\n const {\r\n depth,\r\n kind,\r\n hasChildren = kind !== 'server',\r\n expanded = true,\r\n isLast = true,\r\n ancestorIsLast = [],\r\n } = options\r\n\r\n return buildPrefixCells(depth, kind, ancestorIsLast, isLast, hasChildren, expanded)\r\n}\r\n\r\nfunction buildPrefixCells(\r\n depth: number,\r\n kind: StnTreeNodeKind,\r\n ancestorIsLast: boolean[],\r\n isLast: boolean,\r\n hasChildren: boolean,\r\n expanded: boolean,\r\n): StnTreeGuideCell[] {\r\n if (depth === 0) return []\r\n\r\n const cells: StnTreeGuideCell[] = []\r\n\r\n for (let i = 0; i < depth - 1; i++) {\r\n cells.push(ancestorIsLast[i] ? { type: 'blank' } : { type: 'vertical' })\r\n }\r\n\r\n if (kind === 'server') {\r\n cells.push({ type: 'connector', variant: isLast ? 'end' : 'mid' })\r\n } else if (hasChildren) {\r\n cells.push({ type: 'toggle', expanded })\r\n } else {\r\n cells.push({ type: 'blank' })\r\n }\r\n\r\n return cells\r\n}\r\n\r\nfunction walk(\r\n nodes: StnTreeItem[],\r\n depth: number,\r\n ancestorIsLast: boolean[],\r\n expanded: Set<string>,\r\n out: StnTreeFlatRow[],\r\n) {\r\n nodes.forEach((node, index) => {\r\n const isLast = index === nodes.length - 1\r\n const kind = resolveKind(node, depth)\r\n const hasChildren = Boolean(node.children?.length)\r\n const isExpanded = depth === 0 || expanded.has(node.id)\r\n\r\n out.push({\r\n id: node.id,\r\n label: node.label,\r\n kind,\r\n depth,\r\n cells: buildPrefixCells(depth, kind, ancestorIsLast, isLast, hasChildren, isExpanded),\r\n hasChildren,\r\n expanded: isExpanded,\r\n isLast,\r\n })\r\n\r\n if (hasChildren && isExpanded) {\r\n walk(node.children!, depth + 1, [...ancestorIsLast, isLast], expanded, out)\r\n }\r\n })\r\n}\r\n\r\nexport function flattenStnTree(nodes: StnTreeItem[], expandedIds: Iterable<string>): StnTreeFlatRow[] {\r\n const expanded = new Set(expandedIds)\r\n const rows: StnTreeFlatRow[] = []\r\n walk(nodes, 0, [], expanded, rows)\r\n return rows\r\n}\r\n\r\nexport function collectExpandableIds(nodes: StnTreeItem[]): string[] {\r\n const ids: string[] = []\r\n const visit = (list: StnTreeItem[]) => {\r\n for (const node of list) {\r\n if (node.children?.length) {\r\n ids.push(node.id)\r\n visit(node.children)\r\n }\r\n }\r\n }\r\n visit(nodes)\r\n return ids\r\n}\r\n","import {\n forwardRef,\n useId,\n type CSSProperties,\n type HTMLAttributes,\n type ReactNode,\n} from 'react'\n\nimport { cn } from '../cn'\n\nexport type StnScrollOrientation = 'vertical' | 'horizontal' | 'both'\nexport type StnScrollSize = 'thin' | 'default' | 'thick'\nexport type StnScrollColor = 'default' | 'primary' | 'teal' | 'muted' | 'fade'\n\nexport type StnScrollProps = HTMLAttributes<HTMLDivElement> & {\n /** 스크롤 방향 @default 'vertical' */\n orientation?: StnScrollOrientation\n /** 스크롤바 두께 preset @default 'default' (8px) */\n size?: StnScrollSize\n /** 스크롤바 색상 preset */\n color?: StnScrollColor\n /** 커스텀 thumb 색상 (CSS color value) */\n thumbColor?: string\n /** 커스텀 track 배경색 */\n trackColor?: string\n /** 커스텀 스크롤바 너비/높이 (px 숫자 또는 CSS string) */\n scrollWidth?: number | string\n /** max-height shorthand (number → px) */\n maxHeight?: number | string\n /** max-width shorthand (number → px) — 가로 스크롤 용 */\n maxWidth?: number | string\n children?: ReactNode\n className?: string\n}\n\n/**\n * STN 커스텀 스크롤바 컨테이너\n * - 색상, 두께, 방향을 토큰으로 제어\n * - 화살표 버튼은 그리지 않는다\n */\nexport const StnScroll = forwardRef<HTMLDivElement, StnScrollProps>(function StnScroll(\n {\n orientation = 'vertical',\n size = 'default',\n color = 'default',\n thumbColor,\n trackColor,\n scrollWidth,\n maxHeight,\n maxWidth,\n children,\n className,\n style,\n ...rest\n },\n ref,\n) {\n const rawId = useId()\n const customId = `stn-scr-${rawId.replace(/[^a-zA-Z0-9_-]/g, '')}`\n\n const hasCustomStyling = Boolean(thumbColor || trackColor || scrollWidth != null)\n\n let dynamicStyleTag: ReactNode = null\n if (hasCustomStyling) {\n const w = scrollWidth != null ? (typeof scrollWidth === 'number' ? `${scrollWidth}px` : scrollWidth) : undefined\n const thumb = thumbColor\n const track = trackColor || 'rgba(255, 255, 255, 0.05)'\n\n dynamicStyleTag = (\n <style>{`\n .${customId}::-webkit-scrollbar {\n ${w ? `width: ${w} !important; height: ${w} !important;` : ''}\n ${track ? `background: ${track} !important;` : ''}\n }\n .${customId}::-webkit-scrollbar-track {\n ${track ? `background: ${track} !important;` : ''}\n }\n .${customId}::-webkit-scrollbar-thumb {\n ${thumb ? `background: ${thumb} !important;` : ''}\n ${w ? `border-radius: calc(${w} / 2) !important;` : ''}\n }\n `}</style>\n )\n }\n\n const mergedStyle: CSSProperties = {\n ...(maxHeight != null && { maxHeight: typeof maxHeight === 'number' ? `${maxHeight}px` : maxHeight }),\n ...(maxWidth != null && { maxWidth: typeof maxWidth === 'number' ? `${maxWidth}px` : maxWidth }),\n ...(thumbColor && { scrollbarColor: `${thumbColor} ${trackColor || 'transparent'}` }),\n ...style,\n }\n\n return (\n <>\n {dynamicStyleTag}\n <div\n ref={ref}\n className={cn(\n 'stn-scroll',\n `stn-scroll--${orientation}`,\n size !== 'default' && `stn-scroll--${size}`,\n color !== 'default' && `stn-scroll--${color}`,\n hasCustomStyling && customId,\n className,\n )}\n data-stn-scroll={orientation}\n style={mergedStyle}\n {...rest}\n >\n {children}\n </div>\n </>\n )\n})\n","import { forwardRef, type HTMLAttributes, type ReactNode } from 'react'\n\nimport { cn } from '../../cn'\nimport { StnScroll, type StnScrollProps } from '../../components/StnScroll'\nimport { StnTree, type StnTreeProps } from '../../components/StnTree'\n\nexport type StnSectionSideProps = Omit<HTMLAttributes<HTMLElement>, 'className' | 'children'> & {\n children?: ReactNode\n className?: string\n /** true면 LNB 열 높이에 맞춰 패널을 세로로 채움 (list view + search) */\n fill?: boolean\n /** StnScroll props (orientation 고정 vertical) */\n scrollProps?: Omit<StnScrollProps, 'orientation' | 'children'>\n}\n\n/**\n * Infomap section-side — Figma 40000040:102539\n * 사이드 패널 셸 + Pub 스크롤. 본문은 보통 `StnTree`.\n */\nexport const StnSectionSide = forwardRef<HTMLElement, StnSectionSideProps>(function StnSectionSide(\n { children, className, fill = true, scrollProps, ...rest },\n ref,\n) {\n const { className: scrollClassName, ...scrollRest } = scrollProps ?? {}\n\n return (\n <aside\n ref={ref}\n className={cn('stn-section-side', fill && 'stn-section-side--fill', className)}\n data-stn-section-side\n {...rest}\n >\n <StnScroll\n orientation=\"vertical\"\n className={cn('stn-section-side__body', scrollClassName)}\n {...scrollRest}\n >\n {children}\n </StnScroll>\n </aside>\n )\n})\n\nexport type StnSectionSidePresetProps = Omit<StnSectionSideProps, 'children'> & {\n tree: StnTreeProps\n}\n\n/** Figma 예제 — FOLDER STRUCTURE + scroll */\nexport function StnSectionSidePreset({ tree, ...sideProps }: StnSectionSidePresetProps) {\n return (\n <StnSectionSide {...sideProps}>\n <StnTree heading=\"FOLDER STRUCTURE\" {...tree} />\n </StnSectionSide>\n )\n}\n","import { forwardRef, type FormHTMLAttributes, type HTMLAttributes, type ReactNode } from 'react'\nimport { cn } from '../../cn'\n\nexport type StnLoginCardBrandPosition = 'left' | 'right'\nexport type StnLoginCardVariant = 'default' | 'glow'\n\nexport type StnLoginCardProps = Omit<HTMLAttributes<HTMLDivElement>, 'children'> & {\n /** 좌측(또는 우측) 브랜드 영역 커스텀 콘텐츠 (로고 이미지, 서비스명, 설명 등) */\n brand?: ReactNode\n /** 우측(또는 좌측) 폼 영역 커스텀 콘텐츠 (탭, 입력 필드, 로그인 버튼, 도움말 링크 등) */\n children?: ReactNode\n /**\n * 브랜드 영역 위치\n * - 'left': [Brand - Form] (기본값)\n * - 'right': [Form - Brand] (반전 레이아웃)\n * @default 'left'\n */\n brandPosition?: StnLoginCardBrandPosition\n /**\n * 레이아웃 순서 반전 여부 (true면 [Form - Brand])\n * brandPosition=\"right\"와 동일하게 동작합니다.\n */\n reverse?: boolean\n /**\n * 카드 테두리 회전 레이저 빔 애니메이션 여부 (mockup/login.html 발)\n * @default false\n */\n glow?: boolean\n /**\n * 카드 스타일 변형\n * - 'default': 기본 정적 테두리\n * - 'glow': 회전 레이저 빔 애니메이션 테두리\n * @default 'default'\n */\n variant?: StnLoginCardVariant\n /** 추가 커스텀 클래스 */\n className?: string\n /** glow 래퍼에 적용할 추가 커스텀 클래스 */\n wrapperClassName?: string\n}\n\nexport type StnLoginCardGlowWrapperProps = HTMLAttributes<HTMLDivElement> & {\n children?: ReactNode\n className?: string\n}\n\n/**\n * 로그인 카드 테두리 회전 레이저 빔 애니메이션 래퍼 (Card Glow Wrapper)\n * 독립적으로 사용하거나 StnLoginCard의 `glow` 또는 `variant=\"glow\"`로 자동 적용됩니다.\n */\nexport const StnLoginCardGlowWrapper = forwardRef<HTMLDivElement, StnLoginCardGlowWrapperProps>(\n function StnLoginCardGlowWrapper({ children, className, ...rest }, ref) {\n return (\n <div\n ref={ref}\n className={cn('stn-login-card-glow-wrapper', className)}\n data-stn-login-card-glow\n {...rest}\n >\n {children}\n </div>\n )\n },\n)\n\n/**\n * Infomap / STN Login Card Pattern — Figma 40004209:78293\n *\n * 100% STN 공식 디자인 토큰 기반의 2열 로그인 카드 컨테이너입니다.\n * 브랜드 슬롯(brand)과 폼 슬롯(children)을 자유롭게 조립할 수 있으며,\n * brandPosition 또는 reverse prop으로 좌우/상하 배치를 자유롭게 바꿀 수 있습니다.\n * `glow` 또는 `variant=\"glow\"` 옵션으로 테두리 회전 레이저 빔 효과를 활성화할 수 있습니다.\n * 폼 스택(max 320)은 유지하고, 카드가 좁아지면 브랜드·폼 패딩과 로고(xl→sm)를 같이 줄입니다.\n * 900px 이하 뷰포트에서는 세로 1열 스택으로 자동 반응합니다.\n */\nexport const StnLoginCard = forwardRef<HTMLDivElement, StnLoginCardProps>(function StnLoginCard(\n {\n brand,\n children,\n brandPosition = 'left',\n reverse = false,\n glow = false,\n variant = 'default',\n className,\n wrapperClassName,\n ...rest\n },\n ref,\n) {\n const isReversed = reverse || brandPosition === 'right'\n const hasGlow = glow || variant === 'glow'\n\n const cardElement = (\n <div\n ref={hasGlow ? undefined : ref}\n className={cn('stn-login-card', isReversed && 'reverse', className)}\n data-stn-login-card\n {...rest}\n >\n {brand && (\n <div className=\"stn-login-card__brand\" data-stn-login-card-brand>\n {brand}\n </div>\n )}\n <div className=\"stn-login-card__form\" data-stn-login-card-form>\n {children}\n </div>\n </div>\n )\n\n if (hasGlow) {\n return (\n <StnLoginCardGlowWrapper ref={ref} className={wrapperClassName}>\n {cardElement}\n </StnLoginCardGlowWrapper>\n )\n }\n\n return cardElement\n})\n\nexport type StnLoginBrandStackProps = HTMLAttributes<HTMLDivElement> & {\n children?: ReactNode\n className?: string\n}\n\n/**\n * 로그인 브랜드 세로 스택 — 로고 · 제목 · 캡션을 브랜드 간격(16px)으로 나열합니다.\n */\nexport const StnLoginBrandStack = forwardRef<HTMLDivElement, StnLoginBrandStackProps>(\n function StnLoginBrandStack({ children, className, ...rest }, ref) {\n return (\n <div ref={ref} className={cn('stn-login-brand-stack', className)} {...rest}>\n {children}\n </div>\n )\n },\n)\n\n/* ==========================================================================\n 폼 내부 세로 나열 스택 패턴 컴포넌트들\n ========================================================================== */\n\nexport type StnLoginFormStackProps = FormHTMLAttributes<HTMLFormElement> & {\n children?: ReactNode\n className?: string\n}\n\n/**\n * 로그인 폼 전체 스택 컨테이너\n * 탭, 필드 그룹, 로그인 버튼, 하단 링크 등을 정해진 토큰 간격(24px)으로 세로 나열합니다.\n */\nexport const StnLoginFormStack = forwardRef<HTMLFormElement, StnLoginFormStackProps>(\n function StnLoginFormStack({ children, className, ...rest }, ref) {\n return (\n <form\n ref={ref}\n className={cn('stn-login-form-stack', className)}\n data-stn-login-form-stack\n {...rest}\n >\n {children}\n </form>\n )\n },\n)\n\nexport type StnLoginFormFieldsProps = HTMLAttributes<HTMLDivElement> & {\n children?: ReactNode\n className?: string\n}\n\n/**\n * 로그인 입력 필드 묶음 컨테이너\n * 아이디, 비밀번호 등의 입력 필드를 16px 간격으로 세로 나열합니다.\n */\nexport const StnLoginFormFields = forwardRef<HTMLDivElement, StnLoginFormFieldsProps>(\n function StnLoginFormFields({ children, className, ...rest }, ref) {\n return (\n <div\n ref={ref}\n className={cn('stn-login-form-fields', className)}\n data-stn-login-form-fields\n {...rest}\n >\n {children}\n </div>\n )\n },\n)\n\nexport type StnLoginFormLinksProps = HTMLAttributes<HTMLElement> & {\n children?: ReactNode\n className?: string\n}\n\n/**\n * 로그인 하단 링크 바 컨테이너\n * 회원가입, 아이디/비밀번호 찾기 등의 텍스트 링크를 가로 중앙 정렬합니다.\n */\nexport const StnLoginFormLinks = forwardRef<HTMLElement, StnLoginFormLinksProps>(\n function StnLoginFormLinks({ children, className, ...rest }, ref) {\n return (\n <nav\n ref={ref}\n className={cn('stn-login-form-links', className)}\n data-stn-login-form-links\n aria-label=\"계정 관리 링크\"\n {...rest}\n >\n {children}\n </nav>\n )\n },\n)\n\nexport type StnLoginPlaceholderProps = HTMLAttributes<HTMLParagraphElement> & {\n children?: ReactNode\n}\n\n/**\n * 로그인 폼 내 준비 중 안내 영역 (예: 소셜 로그인 준비 중)\n * 128px 최소 높이와 중앙 정렬, 토큰 폰트/색상(`--stn-login-link-fg`)이 적용됩니다.\n */\nexport const StnLoginPlaceholder = forwardRef<HTMLParagraphElement, StnLoginPlaceholderProps>(\n function StnLoginPlaceholder(\n { children = '소셜 로그인 기능은 준비 중입니다.', className, ...rest },\n ref,\n ) {\n return (\n <p ref={ref} className={cn('stn-login__placeholder', className)} {...rest}>\n {children}\n </p>\n )\n },\n)\n\n","import {\n cloneElement,\n forwardRef,\n isValidElement,\n type InputHTMLAttributes,\n type ReactElement,\n type ReactNode,\n} from 'react'\n\nimport { cn } from '../../cn'\nimport type { StnWithoutStyle } from '../../stnStrictProps'\nimport { StnIconBox, type StnIconBoxColor } from '../../components/StnIconBox'\n\nexport type StnLoginTextFieldProps = StnWithoutStyle<Omit<InputHTMLAttributes<HTMLInputElement>, 'size'>> & {\n /** 왼쪽 입체 아이콘 — Iconography slug (`line/user`) 또는 ReactNode */\n icon?: ReactNode\n /** 아이콘 시맨틱 색상 ('primary' | 'success' | 'warning' | 'error' | 'info') */\n iconColor?: StnIconBoxColor\n invalid?: boolean\n className?: string\n}\n\n/**\n * Login mockup `.input-group` — XL 56px, full width, left icon box.\n * 일반 검색·필터는 `StnTextField`를 사용합니다.\n */\nexport const StnLoginTextField = forwardRef<HTMLInputElement, StnLoginTextFieldProps>(\n function StnLoginTextField(\n {\n icon,\n iconColor,\n invalid,\n className,\n disabled,\n type = 'text',\n 'aria-invalid': ariaInvalid,\n ...rest\n },\n ref,\n ) {\n const hasIcon = icon != null && icon !== false\n\n let renderedIcon: ReactNode = null\n if (hasIcon) {\n if (typeof icon === 'string') {\n renderedIcon = (\n <StnIconBox\n icon={icon}\n size=\"md\"\n color={iconColor}\n className=\"stn-login-text-field__icon-box\"\n />\n )\n } else if (isValidElement(icon)) {\n renderedIcon = cloneElement(icon as ReactElement<{ className?: string }>, {\n className: cn('stn-login-text-field__icon-box', (icon.props as { className?: string })?.className),\n })\n } else {\n renderedIcon = icon\n }\n }\n\n return (\n <div\n className={cn(\n 'stn-login-text-field',\n invalid && 'stn-login-text-field--invalid',\n className,\n )}\n >\n {renderedIcon}\n <input\n ref={ref}\n type={type}\n disabled={disabled}\n aria-invalid={invalid ? true : ariaInvalid}\n className=\"stn-login-text-field__control\"\n {...rest}\n />\n </div>\n )\n },\n)\n","import { forwardRef, type HTMLAttributes } from 'react'\nimport { STN_INFOMAP_LOGO } from '@stn-uiux/pub-ui/data/stnBrand'\nimport { cn } from '../cn'\nimport type { StnWithoutStyle } from '../stnStrictProps'\n\n/** horizontal = 가로 wordmark · vertical = 세로 mark · watermark = 워터마크 · onlyimg/symbol = 아이콘 단독 심볼 */\nexport type StnLogoVariant = 'horizontal' | 'vertical' | 'watermark' | 'onlyimg' | 'symbol'\n/** CSS tokens: xs sm md lg xl */\nexport type StnLogoSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl'\nexport type StnLogoTheme = 'dark' | 'light'\n\nexport type StnLogoProps = StnWithoutStyle<Omit<HTMLAttributes<HTMLSpanElement>, 'children'>> & {\n /**\n * horizontal: 가로 워드마크 (full PNG)\n * vertical: 세로 심볼 (single PNG)\n * watermark: 워터마크 SVG\n * onlyimg / symbol: 단독 로고 심볼 (logo-onlyimg.png)\n * @default 'horizontal'\n */\n variant?: StnLogoVariant\n /**\n * xs sm md lg xl — 픽셀 width 금지. 기본 md.\n * @default 'md'\n */\n size?: StnLogoSize\n /**\n * dark: 흰색 로고 (어두운 배경용, 기본값)\n * light: 검은색 로고 (밝은 배경용)\n * @default 'dark'\n */\n theme?: StnLogoTheme\n alt?: string\n}\n\nfunction sources(variant: StnLogoVariant) {\n if (variant === 'onlyimg' || variant === 'symbol') {\n return { light: STN_INFOMAP_LOGO.onlyImgLight, dark: STN_INFOMAP_LOGO.onlyImgDark }\n }\n if (variant === 'vertical') {\n return { light: STN_INFOMAP_LOGO.single, dark: STN_INFOMAP_LOGO.singleDark }\n }\n if (variant === 'watermark') {\n return { light: STN_INFOMAP_LOGO.watermark, dark: STN_INFOMAP_LOGO.watermarkDark }\n }\n return { light: STN_INFOMAP_LOGO.full, dark: STN_INFOMAP_LOGO.fullDark }\n}\n\nexport const StnLogo = forwardRef<HTMLSpanElement, StnLogoProps>(function StnLogo(\n { variant = 'horizontal', size = 'md', theme, alt = 'InfoMap SRM', className, ...rest },\n ref,\n) {\n const { light, dark } = sources(variant)\n\n return (\n <span\n ref={ref}\n className={cn('stn-logo', variant, size, className)}\n data-theme={theme}\n {...rest}\n >\n <img className=\"stn-logo__img light\" src={light} alt={theme === 'dark' ? '' : alt} />\n <img className=\"stn-logo__img dark\" src={dark} alt={theme === 'light' ? '' : alt} />\n </span>\n )\n})\n","import React from 'react';\nimport { cn } from '../cn';\n\nexport type StnBadgeVariant = 'standard' | 'dot';\nexport type StnBadgeAppearance = 'subtle' | 'solid';\nexport type StnBadgeColor =\n | 'primary'\n | 'secondary'\n | 'success'\n | 'critical'\n | 'major'\n | 'minor'\n | 'warning'\n | 'error'\n | 'neutral'\n | 'default'\n | (string & {});\n\nexport interface StnBadgeAnchorOrigin {\n vertical: 'top' | 'bottom';\n horizontal: 'left' | 'right';\n}\n\nexport interface StnBadgeProps extends React.HTMLAttributes<HTMLSpanElement> {\n /** 뱃지 내부에 표시할 숫자 또는 내용 (0일 경우 showZero가 false이면 숨김) */\n badgeContent?: React.ReactNode;\n /** 뱃지 형태: 'standard' (숫자/문자 pill) | 'dot' (작은 원형 점) */\n variant?: StnBadgeVariant;\n /** 외형 모드: 'subtle' (mockup .sb-badge 규격, 반투명 배경 + 컬러 텍스트, 기본값) | 'solid' (완전 채움 캡슐형) */\n appearance?: StnBadgeAppearance;\n /** 색상 테마: primary, secondary, success, critical/error, major, minor, warning, neutral */\n color?: StnBadgeColor;\n /** 최대 표시 수치 (기본값: 99, 99 초과 시 99+ 로 표시) */\n max?: number;\n /** badgeContent가 0일 때도 뱃지를 노출할지 여부 (기본값: false) */\n showZero?: boolean;\n /** 뱃지를 숨길지 여부 */\n invisible?: boolean;\n /** 자식 요소를 기준으로 뱃지가 배치될 위치 (기본값: top-right) */\n anchorOrigin?: StnBadgeAnchorOrigin;\n /** 뱃지 버블 요소에 직접 지정할 배경색 (디자인 토큰 또는 컬러값) */\n backgroundColor?: string;\n /** 뱃지 버블 요소에 직접 지정할 텍스트 색상 (디자인 토큰 또는 컬러값) */\n textColor?: string;\n /** 뱃지 버블 요소에 직접 전달할 인라인 스타일 */\n badgeStyle?: React.CSSProperties;\n /** 뱃지 자체의 추가 className */\n badgeClassName?: string;\n /** 추가 클래스 */\n className?: string;\n /** 뱃지가 부착될 대상 엘리먼트 (생략 시 독립 인라인 뱃지로 렌더링) */\n children?: React.ReactNode;\n}\n\n/**\n * StnBadge\n * 알림 개수(Notification count)나 활성 상태를 나타내는 오버레이 뱃지 컴포넌트입니다.\n * 자식 엘리먼트를 감싸 우측 상단/좌측 하단 등에 카운트나 점을 띄우거나, 단독 인라인 뱃지로 사용됩니다.\n */\nexport const StnBadge = React.forwardRef<HTMLSpanElement, StnBadgeProps>(\n (\n {\n badgeContent,\n variant = 'standard',\n appearance = 'subtle',\n color = 'error',\n max = 99,\n showZero = false,\n invisible: customInvisible,\n anchorOrigin = { vertical: 'top', horizontal: 'right' },\n backgroundColor,\n textColor,\n badgeStyle,\n badgeClassName,\n className,\n children,\n style,\n ...restProps\n },\n ref\n ) => {\n const isDot = variant === 'dot';\n\n // 0이거나 내용이 없을 때 투명/숨김 처리 여부\n let isZero = false;\n if (typeof badgeContent === 'number') {\n isZero = badgeContent === 0;\n } else if (typeof badgeContent === 'string') {\n isZero = badgeContent === '0';\n }\n\n const hasNoContent = badgeContent === undefined || badgeContent === null || badgeContent === '';\n const invisible = customInvisible ?? (!isDot && ((isZero && !showZero) || hasNoContent));\n\n // 숫자 max 처리 (예: 100 -> 99+)\n let displayContent: React.ReactNode = badgeContent;\n if (!isDot && typeof badgeContent === 'number' && max != null && badgeContent > max) {\n displayContent = `${max}+`;\n }\n\n const positionClass = `${anchorOrigin.vertical}-${anchorOrigin.horizontal}`;\n const colorClass = color;\n const appearanceClass = appearance;\n const isStandalone = !children;\n\n const customBadgeStyle: React.CSSProperties = {\n ...(backgroundColor ? { backgroundColor } : {}),\n ...(textColor ? { color: textColor } : {}),\n ...badgeStyle,\n ...(isStandalone && style ? style : {}),\n };\n\n const badgeElement = (\n <span\n ref={isStandalone ? ref : undefined}\n className={cn(\n 'stn-badge',\n isDot ? 'dot' : 'standard',\n appearanceClass,\n colorClass,\n !isStandalone && positionClass,\n isStandalone && 'standalone',\n invisible && 'is-invisible',\n badgeClassName,\n isStandalone && className\n )}\n style={customBadgeStyle}\n aria-hidden={invisible}\n {...(isStandalone ? restProps : {})}\n >\n {!isDot && displayContent}\n </span>\n );\n\n // 감싸는 자식(아이콘, 버튼 등)이 없을 경우 단독 인라인 뱃지로 렌더링\n if (isStandalone) {\n return badgeElement;\n }\n\n // 래핑 모드\n return (\n <span ref={ref} className={cn('stn-badge-root', className)} style={style} {...restProps}>\n {children}\n {badgeElement}\n </span>\n );\n }\n);\n\nStnBadge.displayName = 'StnBadge';\n","import type { HTMLAttributes, ReactNode, MouseEvent, KeyboardEvent } from 'react'\n\nimport {\n STN_GRADE_SOURCE,\n type StnChipBorderAccent,\n type StnChipGrade,\n} from '@stn-uiux/pub-ui/data/stnChip'\n\nimport { cn } from '../cn'\nimport type { StnWithoutStyle } from '../stnStrictProps'\n\nexport type StnChipVariant = 'filled' | 'outline' | 'outlined' | 'border'\nexport type StnChipSize = 'sm' | 'md' | 'lg'\nexport type StnChipShape = 'square' | 'pill' | 'round' | 'rounded'\nexport type StnChipIconPosition = 'left' | 'right'\nexport type StnChipLabelPosition = 'top' | 'bottom' | 'left' | 'right'\nexport type StnChipColor =\n | 'cr'\n | 'mj'\n | 'mn'\n | 'wr'\n | 'CR'\n | 'MJ'\n | 'MN'\n | 'WR'\n | 'primary'\n | 'teal'\n | 'success'\n | 'error'\n | 'red'\n | 'warn'\n | 'warning'\n | 'purple'\n | 'secondary'\n | 'neutral'\n | 'gray'\n | 'critical'\n | 'major'\n | 'minor'\n\nexport type StnChipProps = StnWithoutStyle<\n Omit<HTMLAttributes<HTMLSpanElement>, 'className' | 'color'>\n> & {\n children?: ReactNode\n /** 칩 본문 텍스트 (children이 없을 때 사용하거나, children과 함께 전달 시 외곽 라벨로 기능) */\n label?: ReactNode\n variant?: StnChipVariant\n size?: StnChipSize\n shape?: StnChipShape\n radius?: StnChipShape\n color?: StnChipColor\n icon?: ReactNode\n /** 아이콘 위치 ('left': 기본, 'right') */\n iconPosition?: StnChipIconPosition\n /** 외곽 보조 라벨 */\n sideLabel?: ReactNode\n /** 외곽 보조 라벨 배치 위치 ('top' | 'bottom' | 'left' | 'right', 기본 'right') */\n labelPosition?: StnChipLabelPosition\n /** `labelPosition` 별칭 */\n sideLabelPosition?: StnChipLabelPosition\n /** 클릭 가능한 인터랙티브 칩 여부 (토글과 달리 On/Off 상태를 갖지 않는 액션 클릭용) */\n clickable?: boolean\n /** 삭제 이벤트 콜백 (제공 시 삭제 버튼 렌더링) */\n onDelete?: (e: MouseEvent<HTMLButtonElement>) => void\n /** 삭제 버튼 아이콘 (기본: SVG 닫기 아이콘) */\n deleteIcon?: ReactNode\n /** 삭제 버튼 위치 ('left' | 'right', 기본 'right') */\n deleteIconPosition?: StnChipIconPosition\n /** 삭제 버튼 접근성 라벨 @default '삭제' */\n deleteAriaLabel?: string\n className?: string\n /** Grade for status */\n grade?: StnChipGrade\n /** Border accent */\n accent?: StnChipBorderAccent\n}\n\nfunction hasSideLabel(sideLabel: ReactNode | undefined): boolean {\n return sideLabel !== undefined && sideLabel !== null && sideLabel !== ''\n}\n\nconst DefaultDeleteIcon = () => (\n <svg width=\"1em\" height=\"1em\" viewBox=\"0 0 16 16\" fill=\"currentColor\" aria-hidden=\"true\">\n <path d=\"M4.646 4.646a.5.5 0 0 1 .708 0L8 7.293l2.646-2.647a.5.5 0 0 1 .708.708L8.707 8l2.647 2.646a.5.5 0 0 1-.708.708L8 8.707l-2.646 2.647a.5.5 0 0 1-.708-.708L7.293 8 4.646 5.354a.5.5 0 0 1 0-.708z\" />\n </svg>\n)\n\nexport function StnChip(props: StnChipProps) {\n const {\n variant = 'filled',\n size = 'md',\n shape,\n radius,\n color,\n icon,\n iconPosition = 'left',\n sideLabel,\n label,\n labelPosition,\n sideLabelPosition,\n clickable = false,\n onDelete,\n deleteIcon,\n deleteIconPosition = 'right',\n deleteAriaLabel = '삭제',\n className,\n children,\n grade,\n accent,\n onClick,\n onKeyDown,\n role: roleProp,\n tabIndex: tabIndexProp,\n ...rest\n } = props\n\n // Shape resolution (기본: square, rounded는 호환성을 위해 square로 정규화)\n const rawShape = shape ?? radius ?? 'square'\n const resolvedShape: StnChipShape =\n rawShape === 'rounded' || rawShape === 'square' ? 'square' : rawShape\n\n // Variant normalization\n const isOutline = variant === 'outline' || variant === 'outlined' || variant === 'border'\n const variantClass = isOutline ? 'outline' : 'filled'\n\n // Color / Grade resolution\n const resolvedColor = color ?? grade\n\n // Content resolution: children이 있으면 children 우선, 없으면 label, 없으면 grade label\n let content = children ?? label\n if (!content && grade && STN_GRADE_SOURCE[grade]) {\n content = STN_GRADE_SOURCE[grade].label\n }\n\n // Outer side label resolution:\n // children과 label이 둘 다 전달되고 sideLabel이 없으면 label을 외곽 라벨로 취급, 그 외엔 sideLabel 사용\n const resolvedSideLabel =\n sideLabel !== undefined\n ? sideLabel\n : children !== undefined && label !== undefined\n ? label\n : undefined\n\n const resolvedLabelPosition = labelPosition ?? sideLabelPosition ?? 'right'\n const positionClass = `label-${resolvedLabelPosition}`\n\n // Clickable state\n const isClickable = clickable || onClick !== undefined\n const role = roleProp ?? (isClickable ? 'button' : undefined)\n const tabIndex = tabIndexProp ?? (isClickable ? 0 : undefined)\n\n const handleKeyDown = (e: KeyboardEvent<HTMLSpanElement>) => {\n onKeyDown?.(e)\n if (isClickable && (e.key === 'Enter' || e.key === ' ')) {\n if (e.key === ' ') {\n e.preventDefault()\n }\n onClick?.(e as unknown as MouseEvent<HTMLSpanElement>)\n }\n }\n\n const iconElement = icon ? <span className=\"stn-chip__icon\">{icon}</span> : null\n const contentElement = <span className=\"stn-chip__label\">{content}</span>\n\n const deleteElement = onDelete ? (\n <button\n type=\"button\"\n className=\"stn-chip__delete\"\n aria-label={deleteAriaLabel}\n onClick={(e) => {\n e.stopPropagation()\n onDelete(e)\n }}\n >\n {deleteIcon ?? <DefaultDeleteIcon />}\n </button>\n ) : null\n\n // Element ordering based on iconPosition and deleteIconPosition\n const elements: ReactNode[] = []\n if (deleteElement && deleteIconPosition === 'left') {\n elements.push(deleteElement)\n }\n if (iconElement && iconPosition === 'left') {\n elements.push(iconElement)\n }\n elements.push(contentElement)\n if (iconElement && iconPosition === 'right') {\n elements.push(iconElement)\n }\n if (deleteElement && deleteIconPosition === 'right') {\n elements.push(deleteElement)\n }\n\n const chip = (\n <span\n role={role}\n tabIndex={tabIndex}\n className={cn(\n 'stn-chip',\n variantClass,\n size,\n resolvedShape,\n resolvedColor,\n isClickable && 'clickable',\n onDelete && 'deletable',\n accent && `stn-chip--accent-${accent}`,\n !hasSideLabel(resolvedSideLabel) && className,\n )}\n onClick={onClick}\n onKeyDown={handleKeyDown}\n {...rest}\n >\n {elements}\n </span>\n )\n\n if (!hasSideLabel(resolvedSideLabel)) {\n return chip\n }\n\n return (\n <span className={cn('stn-chip-wrap', positionClass, className)}>\n {chip}\n <span className=\"stn-chip__side\">{resolvedSideLabel}</span>\n </span>\n )\n}\n","import React from 'react';\nimport { StnIcon } from './StnIcon';\n\nexport type StnSeverityLevel = 'critical' | 'major' | 'minor' | 'warning'\nexport type StnSeverityVariant = 'badge' | 'filter' | 'glow' | 'solid'\nexport type StnSeveritySize = 'sm' | 'md' | 'lg'\n\nexport interface StnSeverityBadgeProps extends React.ButtonHTMLAttributes<HTMLButtonElement | HTMLSpanElement> {\n /** 심각도: critical, major, minor, warning */\n severity: StnSeverityLevel;\n /** 표시 모드: badge (기본 깔끔한 솔리드), glow (네온 블러/글로우 발광), filter (필터 토글 버튼) */\n variant?: StnSeverityVariant;\n /** 뱃지 크기: 'sm' (18px), 'md' (20px - 기본값), 'lg' (24px) */\n size?: StnSeveritySize;\n /** 라운드(알약/원형) 모서리 적용 여부 (기본값: false, 4px) */\n round?: boolean;\n /** 아이콘 표시 여부 (기본값: true) */\n showIcon?: boolean;\n /** 아이콘 전용 모드 (텍스트 없이 정사각/원형 심각도 아이콘만 표시) */\n iconOnly?: boolean;\n /** 블러 / 네온 글로우 발광 효과 적용 여부 (variant=\"glow\"와 동일, 기본값: false) */\n glow?: boolean;\n /** glow의 별칭 prop (blur 발광 효과 제어) */\n blur?: boolean;\n /** 텍스트 라벨 (미지정 시 기본 라벨 표시) */\n label?: React.ReactNode;\n /** 필터 모드일 때 활성화(선택) 상태 */\n active?: boolean;\n /** 클릭 이벤트 핸들러 */\n onClick?: React.MouseEventHandler<HTMLElement>;\n /** 추가 클래스 */\n className?: string;\n children?: React.ReactNode;\n}\n\nconst SEVERITY_DEFAULT_LABELS: Record<StnSeverityLevel, string> = {\n critical: 'Critical',\n major: 'Major',\n minor: 'Minor',\n warning: 'Warning',\n};\n\nconst SEVERITY_ICONS: Record<StnSeverityLevel, string> = {\n critical: 'fill/alert4',\n major: 'fill/alert3',\n minor: 'fill/alert2',\n warning: 'fill/alert1',\n};\n\n/**\n * StnSeverityBadge\n * 알람 심각도(Critical, Major, Minor, Warning)를 명확하게 표시하거나\n * 대시보드에서 다중 필터 토글 용도로 사용하는 독립 컴포넌트입니다.\n */\nexport const StnSeverityBadge = React.forwardRef<HTMLElement, StnSeverityBadgeProps>(\n (\n {\n severity,\n variant = 'badge',\n size = 'md',\n round = false,\n showIcon = true,\n iconOnly = false,\n glow = false,\n blur = false,\n label,\n active = false,\n onClick,\n className = '',\n children,\n ...restProps\n },\n ref\n ) => {\n const isFilter = variant === 'filter';\n const isInteractive = isFilter || Boolean(onClick);\n const Component = isInteractive ? 'button' : 'span';\n const isIconOnly = Boolean(iconOnly);\n const hasGlow = Boolean(glow || blur || variant === 'glow');\n\n const classNames = [\n 'stn-severity-badge',\n isFilter ? 'filter' : 'badge',\n size,\n round ? 'round' : '',\n isIconOnly ? 'icon-only' : '',\n hasGlow ? 'glow' : '',\n severity,\n active ? 'is-active' : '',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const defaultLabel = SEVERITY_DEFAULT_LABELS[severity];\n const displayLabel = children ?? label ?? defaultLabel;\n const iconName = SEVERITY_ICONS[severity];\n\n const elementProps: Record<string, any> = {\n ref,\n className: classNames,\n onClick,\n title: restProps.title ?? (isIconOnly ? defaultLabel : undefined),\n 'aria-label': restProps['aria-label'] ?? (isIconOnly ? defaultLabel : undefined),\n ...restProps,\n };\n\n if (Component === 'button') {\n elementProps.type = restProps.type || 'button';\n if (isFilter) {\n elementProps['aria-pressed'] = active;\n }\n }\n\n const iconSize = isFilter ? 16 : size === 'sm' ? 12 : size === 'lg' ? 16 : 14;\n\n return (\n <Component {...elementProps}>\n {(showIcon || isIconOnly) && (\n <StnIcon\n name={iconName}\n size={iconSize}\n className=\"stn-severity-badge__icon\"\n color=\"none\"\n aria-hidden=\"true\"\n />\n )}\n {!isIconOnly && <span className=\"stn-severity-badge__label\">{displayLabel}</span>}\n </Component>\n );\n }\n);\n\nStnSeverityBadge.displayName = 'StnSeverityBadge';\n\nexport interface StnSeverityFilterProps {\n /** 현재 선택된 심각도 레벨 배열 */\n value?: StnSeverityLevel[];\n /** 선택 변경 콜백 */\n onChange?: (nextValue: StnSeverityLevel[]) => void;\n /** 비활성화할 심각도 목록 */\n disabledSeverities?: StnSeverityLevel[];\n /** 아이콘 표시 여부 (기본: true) */\n showIcon?: boolean;\n /** 추가 클래스 */\n className?: string;\n}\n\nconst ALL_SEVERITIES: StnSeverityLevel[] = ['critical', 'major', 'minor', 'warning'];\n\n/**\n * StnSeverityFilter\n * 대시보드 및 실시간 장애 목록 상단에서 사용되는 4단계 심각도 필터 그룹 컴포넌트입니다.\n */\nexport const StnSeverityFilter: React.FC<StnSeverityFilterProps> = ({\n value = ALL_SEVERITIES,\n onChange,\n disabledSeverities = [],\n showIcon = true,\n className = '',\n}) => {\n const handleToggle = (sev: StnSeverityLevel) => {\n if (!onChange) return;\n const exists = value.includes(sev);\n const next = exists ? value.filter((item) => item !== sev) : [...value, sev];\n onChange(next);\n };\n\n return (\n <div className={`stn-severity-filter-group ${className}`.trim()} role=\"group\" aria-label=\"심각도 필터\">\n {ALL_SEVERITIES.map((sev) => {\n const isActive = value.includes(sev);\n const isDisabled = disabledSeverities.includes(sev);\n return (\n <StnSeverityBadge\n key={sev}\n severity={sev}\n variant=\"filter\"\n showIcon={showIcon}\n active={isActive}\n disabled={isDisabled}\n onClick={() => !isDisabled && handleToggle(sev)}\n />\n );\n })}\n </div>\n );\n};\n\nStnSeverityFilter.displayName = 'StnSeverityFilter';\n","import type { CSSProperties, HTMLAttributes } from 'react'\n\nimport { cn } from '../cn'\n\nexport type StnSystemChipTone =\n | 'cr'\n | 'mj'\n | 'mn'\n | 'wr'\n | 'CR'\n | 'MJ'\n | 'MN'\n | 'WR'\n | 'info'\n | 'success'\n | 'purple'\n | 'neutral'\n | 'critical'\n | 'major'\n | 'minor'\n | 'warning'\n | 'teal'\n | 'error'\n | 'warn'\n | string\n\nexport type StnSystemChipItem = {\n id: string\n /** 점(dot) 색상 톤: 2글자 표준(cr, mj, mn, wr) 또는 info, success, purple 등 */\n tone?: StnSystemChipTone\n /** 점(dot) 커스텀 색상 값 (CSS 컬러 또는 var(--...)) */\n dotColor?: string\n /** 수치 카운트 또는 텍스트 */\n count?: number | string\n value?: number | string\n /** 텍스트 라벨 (선택) */\n label?: string\n}\n\nexport type StnSystemChipProps = HTMLAttributes<HTMLDivElement> & {\n /** 1개, 2개, 3개, 4개 등 원하는 숫자만큼의 아이템 배열 */\n items: StnSystemChipItem[]\n /** 텍스트 라벨 표시 여부 */\n showLabel?: boolean\n /**\n * 핵심 1개만 노출 · 호버/포커스 시 전체 펼침.\n * - 생략(`auto`): `stn-header` ≤1200px 에서 CSS 자동 적용\n * - `true`: 항상 compact\n * - `false`: 항상 전체 노출\n */\n compact?: boolean\n className?: string\n}\n\nconst DEFAULT_TONE_LABELS: Record<string, string> = {\n cr: 'CR',\n mj: 'MJ',\n mn: 'MN',\n wr: 'WR',\n critical: 'CR',\n major: 'MJ',\n minor: 'MN',\n warning: 'WR',\n info: 'Info',\n success: 'Success',\n teal: 'WR',\n}\n\nconst TONE_PRIORITY = ['cr', 'critical', 'mj', 'major', 'mn', 'minor', 'wr', 'warning', 'teal'] as const\n\nfunction canonicalTone(tone?: string) {\n const raw = tone ? tone.toLowerCase() : 'info'\n if (raw === 'critical') return 'cr'\n if (raw === 'major') return 'mj'\n if (raw === 'minor') return 'mn'\n if (raw === 'warning' || raw === 'teal') return 'wr'\n return raw\n}\n\n/** 가장 중요한 항목 — 심각도 순 · count>0 우선, 없으면 첫 항목 */\nfunction pickPrimaryIndex(items: StnSystemChipItem[]) {\n for (const tone of TONE_PRIORITY) {\n const index = items.findIndex((item) => {\n const t = canonicalTone(item.tone)\n const value = Number(item.value ?? item.count ?? 0)\n return t === tone && Number.isFinite(value) && value > 0\n })\n if (index >= 0) return index\n }\n return 0\n}\n\n/**\n * System Chip (헤더 시스템 상태 요약 바)\n * [ 🔴 0 | 🟠 12 | 🟡 2 | 🔵 3 ] 형태.\n * compact 모드에서는 핵심 1개만 보이고 호버 시 전체가 펼쳐집니다.\n */\nexport function StnSystemChip({\n items,\n showLabel = false,\n compact,\n className,\n ...rest\n}: StnSystemChipProps) {\n const primaryIndex = pickPrimaryIndex(items)\n\n return (\n <div\n className={cn(\n 'stn-system-chip',\n showLabel && 'stn-system-chip--labeled',\n compact === true && 'compact',\n className,\n )}\n role=\"group\"\n aria-label=\"System status chip\"\n {...(compact === undefined ? {} : { 'data-compact': compact ? 'true' : 'false' })}\n {...rest}\n >\n {items.map((item, index) => {\n const tone = canonicalTone(item.tone)\n const isNamedTone = [\n 'cr',\n 'mj',\n 'mn',\n 'wr',\n 'info',\n 'success',\n 'purple',\n 'neutral',\n ].includes(tone)\n\n const dotStyle: CSSProperties | undefined = item.dotColor\n ? { backgroundColor: item.dotColor }\n : !isNamedTone && item.tone\n ? { backgroundColor: item.tone }\n : undefined\n\n const displayValue = item.value ?? item.count ?? 0\n const displayLabel =\n item.label ??\n (showLabel\n ? DEFAULT_TONE_LABELS[tone] || (item.tone && DEFAULT_TONE_LABELS[item.tone])\n : undefined)\n\n return (\n <div\n key={item.id}\n className={cn(\n 'stn-system-chip__item',\n index === primaryIndex && 'stn-system-chip__item--primary',\n )}\n >\n <span\n className={cn(\n 'stn-system-chip__dot',\n isNamedTone && `stn-system-chip__dot--${tone}`,\n )}\n style={dotStyle}\n aria-hidden=\"true\"\n />\n {displayLabel ? (\n <span className=\"stn-system-chip__label\">{displayLabel}</span>\n ) : null}\n <span className=\"stn-system-chip__count\">{displayValue}</span>\n </div>\n )\n })}\n </div>\n )\n}\n","import {\n forwardRef,\n useState,\n type ButtonHTMLAttributes,\n type ReactNode,\n} from 'react'\n\nimport { cn } from '../cn'\nimport type { StnWithoutStyle } from '../stnStrictProps'\nimport { StnIcon } from './StnIcon'\n\nexport type StnToggleButtonSize = 'sm' | 'md' | 'lg'\nexport type StnToggleButtonColor =\n | 'primary'\n | 'secondary'\n | 'success'\n | 'critical'\n | 'major'\n | 'minor'\n | 'warning'\n | 'neutral'\n | (string & {})\n\nexport type StnToggleButtonGradient =\n | 'none'\n | 'main'\n | 'primary'\n | 'secondary'\n | 'critical'\n | 'major'\n | 'minor'\n | 'warning'\n\nexport type StnToggleButtonWidthPreset = 80 | 100 | 120 | 140 | 160 | 180 | 200\nexport type StnToggleButtonWidthValue = StnToggleButtonWidthPreset | 'full' | number | string\nexport type StnToggleButtonIconPosition = 'left' | 'right'\n\nexport type StnToggleButtonProps = StnWithoutStyle<\n Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'onChange'>\n> & {\n /** 켜짐(ON) 상태 여부 (제어 모드) */\n pressed?: boolean\n /** 초기 켜짐(ON) 상태 (비제어 모드) @default false */\n defaultPressed?: boolean\n /** 토글 상태 변경 콜백 (true: ON, false: OFF) */\n onChange?: (pressed: boolean) => void\n /** 크기 ('sm': 26px, 'md': 34px 기본, 'lg': 42px) @default 'md' */\n size?: StnToggleButtonSize\n /** 활성(ON) 상태 시맨틱 솔리드 색상 @default 'primary' */\n color?: StnToggleButtonColor\n /** 활성(ON) 상태 7대 표준 시맨틱 그라데이션 ('main' | 'primary' | 'secondary' | 'critical' | 'major' | 'minor' | 'warning') */\n gradient?: StnToggleButtonGradient\n /** 아이콘 요소 또는 시스템 아이콘 slug ('line/volume', 'line/pin' 등) */\n icon?: ReactNode\n /** 아이콘 위치 ('left': 기본, 'right') @default 'left' */\n iconPosition?: StnToggleButtonIconPosition\n /** 아이콘 전용 정사각/원형 모드 */\n iconOnly?: boolean\n /**\n * 너비 프리셋 (80 | 100 | 120 | 140 | 160 | 180 | 200 | 'full') 또는 커스텀 px/string.\n * 토글 버튼 특성상 최소 고정 너비(min-width)로 작용하여 글자가 길어지면 자연스럽게 확장(Hug)됩니다.\n */\n width?: StnToggleButtonWidthValue\n /** 최소 너비(min-width) 명시적 지정 (width와 동일) */\n minWidth?: number | string\n /** 100% 전체 폭 버튼 (`full`) */\n fullWidth?: boolean\n disabled?: boolean\n children?: ReactNode\n className?: string\n 'aria-label'?: string\n}\n\nexport const StnToggleButton = forwardRef<HTMLButtonElement, StnToggleButtonProps>(\n function StnToggleButton(\n {\n pressed: pressedProp,\n defaultPressed = false,\n onChange,\n size = 'md',\n color = 'primary',\n gradient = 'none',\n icon,\n iconPosition = 'left',\n iconOnly: iconOnlyProp,\n width: widthProp,\n minWidth: minWidthProp,\n fullWidth = false,\n disabled = false,\n children,\n className,\n 'aria-label': ariaLabel,\n onClick,\n ...rest\n },\n ref,\n ) {\n const isControlled = pressedProp !== undefined\n const [internalPressed, setInternalPressed] = useState(defaultPressed)\n const isPressed = isControlled ? Boolean(pressedProp) : internalPressed\n\n const hasGradient = gradient && gradient !== 'none'\n const isKnownTone = [\n 'primary',\n 'secondary',\n 'success',\n 'critical',\n 'major',\n 'minor',\n 'warning',\n 'neutral',\n ].includes(color)\n const toneClass = !hasGradient && isKnownTone ? color : ''\n const gradientClass = hasGradient ? `gradient-${gradient}` : ''\n const inlineStyle =\n !hasGradient && !isKnownTone && color\n ? ({\n '--stn-toggle-active-bg': color,\n } as React.CSSProperties)\n : undefined\n\n const targetWidth = minWidthProp ?? widthProp\n const isFull = fullWidth || targetWidth === 'full' || targetWidth === '100%'\n const rawNumber =\n typeof targetWidth === 'number'\n ? targetWidth\n : typeof targetWidth === 'string' && /^(?:w)?\\d+px?$/i.test(targetWidth.trim())\n ? parseInt(targetWidth.trim().replace(/^w/i, ''), 10)\n : null\n\n const KNOWN_PRESETS = [80, 100, 120, 140, 160, 180, 200]\n const isPreset = rawNumber != null && KNOWN_PRESETS.includes(rawNumber)\n const widthClass = isFull ? 'full' : isPreset ? `w${rawNumber}` : ''\n\n const customMinWidth =\n !isFull && !isPreset && targetWidth != null\n ? typeof targetWidth === 'number'\n ? `${targetWidth}px`\n : String(targetWidth)\n : undefined\n\n const combinedStyle: React.CSSProperties | undefined =\n inlineStyle || customMinWidth\n ? {\n ...inlineStyle,\n ...(customMinWidth ? { minWidth: customMinWidth } : {}),\n }\n : undefined\n\n const isIconOnly = iconOnlyProp !== undefined ? iconOnlyProp : Boolean(icon && !children)\n const iconPx = size === 'sm' ? 14 : size === 'lg' ? 18 : 16\n const renderedIcon =\n typeof icon === 'string' ? (\n <StnIcon name={icon} size={iconPx} color=\"currentColor\" />\n ) : (\n icon\n )\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n if (disabled) return\n onClick?.(e)\n const nextPressed = !isPressed\n if (!isControlled) {\n setInternalPressed(nextPressed)\n }\n onChange?.(nextPressed)\n }\n\n return (\n <button\n ref={ref}\n type=\"button\"\n aria-pressed={isPressed}\n aria-label={ariaLabel}\n disabled={disabled}\n className={cn(\n 'stn-toggle-btn',\n isPressed && 'active',\n size !== 'md' && size,\n toneClass,\n gradientClass,\n isIconOnly && 'icon-only',\n iconPosition === 'right' && 'icon-right',\n widthClass,\n className,\n )}\n style={combinedStyle}\n onClick={handleClick}\n {...rest}\n >\n {iconPosition === 'right' ? (\n <>\n {children}\n {renderedIcon}\n </>\n ) : (\n <>\n {renderedIcon}\n {children}\n </>\n )}\n </button>\n )\n },\n)\n\n\n\n","import { forwardRef, useId, type InputHTMLAttributes, type ReactNode } from 'react'\n\nimport { cn } from '../cn'\nimport type { StnWithoutStyle } from '../stnStrictProps'\n\nexport type StnSwitchSize = 'sm' | 'md' | 'lg'\nexport type StnSwitchColor =\n | 'primary'\n | 'secondary'\n | 'success'\n | 'critical'\n | 'major'\n | 'minor'\n | 'warning'\n | (string & {})\n\nexport type StnSwitchGradient =\n | boolean\n | 'main'\n | 'primary'\n | 'secondary'\n | 'critical'\n | 'major'\n | 'minor'\n | 'warning'\n | (string & {})\n\nexport type StnSwitchLabelPosition = 'right' | 'left' | 'top' | 'bottom' | 'start' | 'end'\n\nexport type StnSwitchProps = StnWithoutStyle<\n Omit<InputHTMLAttributes<HTMLInputElement>, 'type' | 'className' | 'children' | 'role' | 'size'>\n> & {\n /** 스위치 옆/맞은편 레이블 */\n label?: ReactNode\n /** 크기 ('sm': 28×16, 'md': 36×20 기본, 'lg': 44×24) @default 'md' */\n size?: StnSwitchSize\n /** 활성 트랙 색상 @default 'primary' */\n color?: StnSwitchColor\n /**\n * 활성화 시 그라데이션 트랙 적용\n * boolean(기본 블루) 또는 'blue' | 'teal' | 'purple' | 'sunset' | 'emerald' | 커스텀 linear-gradient\n */\n gradient?: StnSwitchGradient\n /** 레이블 위치 ('right' 기본, 'left', 'top', 'bottom') @default 'right' */\n labelPosition?: StnSwitchLabelPosition\n /**\n * true: 행 전체 100% width · 레이블 왼쪽 / 스위치 오른쪽 끝 분리 배치\n */\n between?: boolean\n /** 필수 입력 여부 (레이블 옆에 붉은색 * 표시) */\n required?: boolean\n className?: string\n}\n\n/**\n * Switch Toggle — ON/OFF. 모양: `stn-switch.css`\n * DOM: input → control → label (checked 스타일은 인접 형제)\n */\nexport const StnSwitch = forwardRef<HTMLInputElement, StnSwitchProps>(function StnSwitch(\n {\n label,\n size = 'md',\n color,\n gradient,\n labelPosition = 'right',\n between = false,\n required = false,\n className,\n id: idProp,\n disabled,\n ...rest\n },\n ref,\n) {\n const autoId = useId()\n const id = idProp ?? autoId\n\n // Placement class\n let positionClass = 'label-right'\n if (between) {\n positionClass = 'between'\n } else if (labelPosition === 'left' || labelPosition === 'start') {\n positionClass = 'label-left'\n } else if (labelPosition === 'top') {\n positionClass = 'label-top'\n } else if (labelPosition === 'bottom') {\n positionClass = 'label-bottom'\n }\n\n // Known tones\n const isKnownTone =\n color &&\n [\n 'primary',\n 'secondary',\n 'success',\n 'critical',\n 'major',\n 'minor',\n 'warning',\n ].includes(color)\n const toneClass = isKnownTone ? color : ''\n\n // Gradient resolution\n let gradientClass = ''\n let customGradient = ''\n\n if (gradient === true) {\n gradientClass = 'gradient'\n } else if (typeof gradient === 'string') {\n if (['main', 'primary', 'secondary', 'critical', 'major', 'minor', 'warning'].includes(gradient)) {\n gradientClass = `gradient-${gradient}`\n } else if (gradient.includes('gradient') || gradient.startsWith('linear-') || gradient.startsWith('radial-')) {\n customGradient = gradient\n }\n }\n\n // Custom color / gradient inline style\n const inlineStyle = customGradient\n ? ({\n '--stn-switch-track-checked': customGradient,\n } as React.CSSProperties)\n : color && !isKnownTone\n ? ({\n '--stn-switch-track-checked': color,\n } as React.CSSProperties)\n : undefined\n\n // Size class\n const sizeClass = size !== 'md' ? size : ''\n\n return (\n <label\n className={cn(\n 'stn-switch',\n sizeClass,\n toneClass,\n gradientClass,\n positionClass,\n disabled && 'disabled',\n className,\n )}\n style={inlineStyle}\n htmlFor={id}\n >\n <input\n ref={ref}\n id={id}\n type=\"checkbox\"\n role=\"switch\"\n className=\"stn-switch__input\"\n disabled={disabled}\n required={required}\n {...rest}\n />\n <span className=\"stn-switch__control\" aria-hidden=\"true\">\n <span className=\"stn-switch__thumb\" />\n </span>\n {label != null && label !== '' ? (\n <span className=\"stn-switch__label\">\n {label}\n {required && (\n <span className=\"stn-switch__required\" aria-hidden=\"true\">\n *\n </span>\n )}\n </span>\n ) : null}\n </label>\n )\n})\n","import { forwardRef, useId, type InputHTMLAttributes, type ReactNode } from 'react'\n\nimport { cn } from '../cn'\nimport type { StnWithoutStyle } from '../stnStrictProps'\n\nexport type StnRadioSize = 'sm' | 'md' | 'lg'\nexport type StnRadioColor =\n | 'primary'\n | 'secondary'\n | 'success'\n | 'critical'\n | 'major'\n | 'minor'\n | 'warning'\n | (string & {})\n\nexport type StnRadioLabelPlacement = 'end' | 'start' | 'top' | 'bottom' | 'left' | 'right'\n\nexport type StnRadioProps = StnWithoutStyle<\n Omit<InputHTMLAttributes<HTMLInputElement>, 'type' | 'className' | 'children' | 'size'>\n> & {\n /** 레이블 텍스트. 생략 시 단독 컨트롤(control-only)로 표시 */\n label?: ReactNode\n /** 라디오 버튼 크기 ('sm': 14px, 'md': 18px 기본, 'lg': 22px) @default 'md' */\n size?: StnRadioSize\n /** 시멘틱 색상 또는 커스텀 색상 ('primary' | 'error' | 'success' | 'warn' | 'secondary' | 'neutral') @default 'primary' */\n color?: StnRadioColor\n /** 레이블 배치 위치 ('end' | 'start' | 'top' | 'bottom') @default 'end' */\n labelPlacement?: StnRadioLabelPlacement\n /** 레이블 텍스트 숨기고 컨트롤만 표시 (label이 없으면 자동 적용) */\n controlOnly?: boolean\n /** 필수 선택 여부 (레이블 옆에 붉은색 * 표시) */\n required?: boolean\n className?: string\n}\n\n/**\n * Radio — Figma `input`(18×18 · cyan-350 점). 모양: `stn-radio.css`\n */\nexport const StnRadio = forwardRef<HTMLInputElement, StnRadioProps>(function StnRadio(\n {\n label,\n size = 'md',\n color,\n labelPlacement = 'end',\n controlOnly,\n required = false,\n className,\n id: idProp,\n disabled,\n ...rest\n },\n ref,\n) {\n const autoId = useId()\n const id = idProp ?? autoId\n const isControlOnly = controlOnly ?? !label\n\n // Placement class\n const placementClass =\n labelPlacement === 'start' || labelPlacement === 'left'\n ? 'label-start'\n : labelPlacement === 'top'\n ? 'label-top'\n : labelPlacement === 'bottom'\n ? 'label-bottom'\n : ''\n\n // Tone class (단일 클래스)\n const isKnownTone =\n color &&\n [\n 'primary',\n 'secondary',\n 'success',\n 'critical',\n 'major',\n 'minor',\n 'warning',\n ].includes(color)\n const toneClass = isKnownTone ? color : ''\n\n // Size class (단일 클래스)\n const sizeClass = size !== 'md' ? size : ''\n\n // Inline style for custom color\n const inlineStyle =\n color && !isKnownTone\n ? ({\n '--stn-radio-dot': color,\n '--stn-radio-checked-border': color,\n } as React.CSSProperties)\n : undefined\n\n return (\n <span\n className={cn(\n 'radio',\n 'stn-radio',\n sizeClass,\n toneClass,\n placementClass,\n isControlOnly && 'control-only',\n disabled && 'disabled',\n className,\n )}\n style={inlineStyle}\n >\n <input ref={ref} type=\"radio\" id={id} disabled={disabled} required={required} {...rest} />\n <label htmlFor={id} aria-hidden={isControlOnly ? true : undefined}>\n {label}\n {required && !isControlOnly && (\n <span className=\"stn-radio__required\" aria-hidden=\"true\">\n *\n </span>\n )}\n </label>\n </span>\n )\n})\n","import { useId, type ReactNode } from 'react'\n\nimport { cn } from '../cn'\nimport { StnRadio, type StnRadioColor, type StnRadioSize } from './StnRadio'\n\nexport type StnRadioGroupOption = {\n value: string\n label: ReactNode\n disabled?: boolean\n}\n\nexport type StnRadioGroupLayout = 'column' | 'row'\nexport type StnRadioGroupOrientation = 'horizontal' | 'vertical'\n\nexport type StnRadioGroupProps = {\n name?: string\n value?: string\n defaultValue?: string\n onChange?: (value: string) => void\n options: readonly StnRadioGroupOption[]\n /** 배치 방향 ('horizontal' | 'vertical') @default 'vertical' */\n orientation?: StnRadioGroupOrientation\n /** column — 세로 나열 · row — 가로 나열 (기존 호환성) */\n layout?: StnRadioGroupLayout | 'inline'\n /** 크기 ('sm' | 'md' | 'lg') */\n size?: StnRadioSize\n /** 색상 톤 */\n color?: StnRadioColor\n disabled?: boolean\n className?: string\n 'aria-label'?: string\n}\n\nexport function StnRadioGroup({\n name: nameProp,\n value,\n defaultValue,\n onChange,\n options,\n orientation,\n layout,\n size,\n color,\n disabled = false,\n className,\n 'aria-label': ariaLabel,\n}: StnRadioGroupProps) {\n const autoName = useId().replace(/:/g, '')\n const name = nameProp ?? `stn-radio-${autoName}`\n\n const isRow = orientation === 'horizontal' || layout === 'row'\n\n const items = options.map((opt) => (\n <StnRadio\n key={opt.value}\n name={name}\n value={opt.value}\n label={opt.label}\n size={size}\n color={color}\n checked={value !== undefined ? value === opt.value : undefined}\n defaultChecked={defaultValue !== undefined ? defaultValue === opt.value : undefined}\n disabled={disabled || opt.disabled}\n onChange={() => onChange?.(opt.value)}\n />\n ))\n\n return (\n <div\n className={cn(\n 'stn-radio-group',\n isRow ? 'horizontal stn-radio-group--row' : 'vertical stn-radio-group--column',\n className,\n )}\n role=\"radiogroup\"\n aria-label={ariaLabel}\n aria-orientation={isRow ? 'horizontal' : 'vertical'}\n >\n {items}\n </div>\n )\n}\n","import { useId, type ReactNode } from 'react'\n\nimport { cn } from '../cn'\nimport type { StnWithoutStyle } from '../stnStrictProps'\nimport { StnIcon } from './StnIcon'\n\nfunction renderSegmentedIcon(icon: ReactNode, size: StnSegmentedSize) {\n if (!icon) return null\n if (typeof icon === 'string') {\n const iconPx = size === 'sm' ? 14 : size === 'lg' ? 18 : 16\n return <StnIcon name={icon} size={iconPx} color=\"currentColor\" />\n }\n return icon\n}\n\nexport type StnSegmentedSize = 'sm' | 'md' | 'lg'\nexport type StnSegmentedOrientation = 'horizontal' | 'vertical'\n\nexport type StnSegmentedColor =\n | 'primary'\n | 'secondary'\n | 'success'\n | 'critical'\n | 'major'\n | 'minor'\n | 'warning'\n | 'neutral'\n\nexport type StnSegmentedOption = {\n value: string\n label?: ReactNode\n icon?: ReactNode\n disabled?: boolean\n 'aria-label'?: string\n}\n\ntype StnSegmentedShared = StnWithoutStyle<{\n /** 탭 항목 목록 */\n options: readonly StnSegmentedOption[]\n /** 크기 ('sm': 26px, 'md': 32px 기본, 'lg': 40px) @default 'md' */\n size?: StnSegmentedSize\n /** 활성 탭 시맨틱 솔리드 색상 */\n color?: StnSegmentedColor\n /** 배치 방향 ('horizontal' | 'vertical') @default 'horizontal' */\n orientation?: StnSegmentedOrientation\n /** 수직 세로 배치 여부 @default false */\n vertical?: boolean\n /** 전체 너비 확장 여부 @default false */\n block?: boolean\n /** 전체 비활성화 */\n disabled?: boolean\n className?: string\n name?: string\n 'aria-label'?: string\n}>\n\nexport type StnSegmentedSingleProps = StnSegmentedShared & {\n multiple?: false\n value: string\n onChange: (value: string) => void\n}\n\nexport type StnSegmentedMultipleProps = StnSegmentedShared & {\n multiple: true\n value: readonly string[]\n onChange: (value: string[]) => void\n}\n\nexport type StnSegmentedProps = StnSegmentedSingleProps | StnSegmentedMultipleProps\n\n/**\n * Pill segmented control — Pub `.stn-segmented`\n * 기본은 하나만 선택. `multiple`이면 1개도, 여러 개도 고를 수 있다.\n * 아이콘 전용, 아이콘 + 텍스트, 크기(sm/md/lg), 수직(vertical) 배치를 지원합니다.\n */\nexport function StnSegmented(props: StnSegmentedProps) {\n const {\n options,\n size = 'md',\n orientation = 'horizontal',\n vertical = false,\n block = false,\n disabled = false,\n color,\n className,\n name: nameProp,\n 'aria-label': ariaLabel,\n } = props\n const autoName = useId().replace(/:/g, '')\n const name = nameProp ?? `stn-segmented-${autoName}`\n const multiple = props.multiple === true\n const isVertical = vertical || orientation === 'vertical'\n\n function isSelected(optionValue: string) {\n if (multiple) return props.value.includes(optionValue)\n return props.value === optionValue\n }\n\n function handleClick(optionValue: string) {\n if (multiple) {\n const current = [...props.value]\n const next = current.includes(optionValue)\n ? current.filter((item) => item !== optionValue)\n : [...current, optionValue]\n props.onChange(next)\n return\n }\n props.onChange(optionValue)\n }\n\n return (\n <div\n className={cn(\n 'stn-segmented',\n isVertical && 'vertical',\n size !== 'md' && size,\n block && 'block',\n multiple && 'stn-segmented--multiple',\n color,\n className,\n )}\n role={multiple ? 'group' : 'radiogroup'}\n aria-label={ariaLabel}\n aria-orientation={isVertical ? 'vertical' : 'horizontal'}\n >\n {options.map((opt) => {\n const selected = isSelected(opt.value)\n const itemDisabled = disabled || opt.disabled\n const isIconOnly = Boolean(opt.icon && !opt.label)\n const ariaLabelText = opt['aria-label'] || (isIconOnly && typeof opt.value === 'string' ? opt.value : undefined)\n\n return (\n <button\n key={opt.value}\n type=\"button\"\n role={multiple ? undefined : 'radio'}\n name={multiple ? undefined : name}\n aria-checked={multiple ? undefined : selected}\n aria-pressed={multiple ? selected : undefined}\n aria-label={ariaLabelText}\n disabled={itemDisabled}\n className={cn(\n 'stn-segmented__item',\n selected && 'stn-segmented__item--active',\n isIconOnly && 'icon-only',\n )}\n onClick={() => {\n if (!itemDisabled) handleClick(opt.value)\n }}\n >\n {renderSegmentedIcon(opt.icon, size)}\n {opt.label && <span>{opt.label}</span>}\n </button>\n )\n })}\n </div>\n )\n}\n","import {\n useCallback,\n useEffect,\n useId,\n useRef,\n useState,\n type HTMLAttributes,\n type KeyboardEvent,\n type ReactNode,\n} from 'react'\n\nimport type {\n StnDropdownModifier,\n StnDropdownOption,\n StnDropdownSize,\n StnDropdownVariant,\n StnDropdownHelperTextPosition,\n StnDropdownDirection,\n} from '@stn-uiux/pub-ui/data/stnDropdown'\nimport type { StnInputWidthValue } from '@stn-uiux/pub-ui/data/stnInputWidth'\n\nimport { cn } from '../cn'\nimport type { StnWithoutStyle } from '../stnStrictProps'\nimport { resolveInputWidthProps } from '../inputWidth'\n\nexport type {\n StnDropdownOption,\n StnDropdownSize,\n StnDropdownModifier,\n StnDropdownVariant,\n StnDropdownHelperTextPosition,\n StnDropdownDirection,\n}\n\nfunction modifierClass(modifier: StnDropdownModifier | undefined): string {\n if (modifier === 'pageSize') return 'stn-table__page-size'\n if (modifier === 'serverFilter') return 'server_filter'\n if (modifier === 'networkArea') return 'network_area_box'\n if (modifier === 'fullWidth') return 'full'\n return ''\n}\n\nfunction sizeClass(size: StnDropdownSize): string {\n if (size === 'sm') return 'sm'\n if (size === 'lg') return 'lg'\n if (size === 'xl') return 'xl'\n return 'md'\n}\n\nfunction menuSizeClass(size: StnDropdownSize, prominent: boolean): string {\n if (prominent || size === 'xl') return 'xl'\n return sizeClass(size)\n}\n\nfunction variantClass(variant: StnDropdownVariant = 'outline'): string {\n if (variant === 'standard') return 'standard'\n if (variant === 'filled') return 'filled'\n return 'outline'\n}\n\nfunction useControllable<T>(controlled: T | undefined, defaultValue: T, onChange?: (v: T) => void) {\n const [internal, setInternal] = useState(defaultValue)\n const value = controlled ?? internal\n const setValue = useCallback(\n (next: T) => {\n if (controlled === undefined) setInternal(next)\n onChange?.(next)\n },\n [controlled, onChange],\n )\n return [value, setValue] as const\n}\n\nexport type StnDropdownProps = {\n /** 드롭다운 옵션 목록 */\n options: StnDropdownOption[]\n /** 드롭다운 높이 규격: sm (24px) | md (32px, 기본값) | lg (40px) | xl (52px) */\n size?: StnDropdownSize\n /** 외형 스타일 변형: outline (기본) | standard (하단 라인만) | filled (배경 채움) */\n variant?: StnDropdownVariant\n /** 특수 레이아웃 수식어 */\n modifier?: StnDropdownModifier\n /** 선택된 값 (Controlled) */\n value?: string\n /** 초기 기본값 (Uncontrolled) */\n defaultValue?: string\n /** 선택 변경 핸들러 */\n onChange?: (value: string) => void\n /** 비활성화 여부 */\n disabled?: boolean\n /** 오류 상태 (빨간색 테두리 및 헬퍼 텍스트) */\n error?: boolean\n /** 읽기 전용 상태 (선택 변경 불가) */\n readOnly?: boolean\n /** 선택되지 않았을 때 표시할 안내 문구 */\n placeholder?: string\n /** 필드 보조 텍스트 (도움말/에러 안내) */\n helperText?: ReactNode\n /** 보조 텍스트 위치 (top | bottom | left | right, 기본값 bottom) */\n helperTextPosition?: StnDropdownHelperTextPosition\n /** 메뉴 열림 방향: down (기본값 · 아래로 열림) | up (위로 열림) */\n direction?: StnDropdownDirection\n /**\n * 검색 특화 52px 대형 메뉴 (`stn-dropdown--prominent`).\n * `size=\"xl\"` 사용 권장.\n */\n prominent?: boolean\n /** width 100% — `stn-dropdown--full w100p` */\n fullWidth?: boolean\n /** 프리셋 80·100·140·180·200 · `100%`/`full` · 그 외 px/string */\n width?: StnInputWidthValue\n className?: string\n id?: string\n 'aria-label'?: string\n} & StnWithoutStyle<\n Omit<\n HTMLAttributes<HTMLDivElement>,\n 'value' | 'defaultValue' | 'onChange' | 'children' | 'className' | 'style' | 'id' | 'aria-label'\n >\n>\n\n/**\n * StnDropdown — 디자인 시스템 표준 커스텀 드롭다운 (`div.selected` + `ul.select_option`).\n */\nexport function StnDropdown({\n options,\n size = 'md',\n variant = 'outline',\n direction = 'down',\n modifier,\n value: valueProp,\n defaultValue = '',\n onChange,\n disabled = false,\n error = false,\n readOnly = false,\n placeholder,\n helperText,\n helperTextPosition = 'bottom',\n prominent = false,\n fullWidth = false,\n width,\n className,\n id: idProp,\n 'aria-label': ariaLabel,\n ...divRest\n}: StnDropdownProps) {\n const autoId = useId()\n const rootId = idProp ?? `stn-dropdown-${autoId.replace(/:/g, '')}`\n const [value, setValue] = useControllable(valueProp, defaultValue, onChange)\n const [open, setOpen] = useState(false)\n const rootRef = useRef<HTMLDivElement>(null)\n\n const selected = options.find((o) => o.value === value)\n const hasValue = selected !== undefined && value !== ''\n const displayLabel = hasValue ? selected.label : (placeholder ?? (options[0]?.label ?? ''))\n\n const widthProps = resolveInputWidthProps(\n 'stn-dropdown',\n fullWidth || modifier === 'fullWidth',\n width,\n )\n\n const hasHelper = helperText != null && helperText !== ''\n const helperId = hasHelper ? `${rootId}-helper` : undefined\n const isHorizontalHelper = hasHelper && (helperTextPosition === 'left' || helperTextPosition === 'right')\n const shouldApplyWidthToDropdown = !hasHelper || isHorizontalHelper\n\n const boxClass = cn(\n 'stn-dropdown',\n menuSizeClass(size, prominent),\n variantClass(variant),\n (direction === 'up' || modifier === 'pageSize') && 'up',\n modifierClass(modifier),\n shouldApplyWidthToDropdown && widthProps.className,\n disabled && 'is-disabled',\n error && 'is-error',\n readOnly && 'is-readonly',\n open && 'on',\n shouldApplyWidthToDropdown && className,\n )\n\n useEffect(() => {\n if (disabled || readOnly) setOpen(false)\n }, [disabled, readOnly])\n\n useEffect(() => {\n if (!open) return\n const onDoc = (e: MouseEvent) => {\n if (rootRef.current && !rootRef.current.contains(e.target as Node)) setOpen(false)\n }\n document.addEventListener('mousedown', onDoc)\n return () => document.removeEventListener('mousedown', onDoc)\n }, [open])\n\n const pick = (next: string) => {\n if (readOnly || disabled) return\n setValue(next)\n setOpen(false)\n }\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (disabled || readOnly) return\n\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n setOpen((o) => !o)\n return\n }\n\n if (e.key === 'Escape') {\n setOpen(false)\n return\n }\n\n if (e.key === 'ArrowDown' || e.key === 'ArrowUp') {\n e.preventDefault()\n if (!open) {\n setOpen(true)\n return\n }\n const enabledOptions = options.filter((o) => !o.disabled)\n if (enabledOptions.length === 0) return\n\n const currentIndex = enabledOptions.findIndex((o) => o.value === value)\n let nextIndex = 0\n if (e.key === 'ArrowDown') {\n nextIndex = currentIndex < enabledOptions.length - 1 ? currentIndex + 1 : 0\n } else {\n nextIndex = currentIndex > 0 ? currentIndex - 1 : enabledOptions.length - 1\n }\n setValue(enabledOptions[nextIndex].value)\n }\n }\n\n const dropdownNode = (\n <div\n ref={rootRef}\n id={rootId}\n className={boxClass}\n style={shouldApplyWidthToDropdown ? widthProps.style : undefined}\n aria-disabled={disabled || undefined}\n aria-readonly={readOnly || undefined}\n aria-invalid={error || undefined}\n {...(!hasHelper ? divRest : {})}\n >\n <div\n className={cn('selected', !hasValue && placeholder && 'is-placeholder')}\n tabIndex={disabled ? -1 : 0}\n role=\"combobox\"\n aria-expanded={open}\n aria-disabled={disabled}\n aria-readonly={readOnly}\n aria-invalid={error}\n aria-describedby={helperId}\n aria-label={ariaLabel}\n onClick={() => !disabled && !readOnly && setOpen((o) => !o)}\n onKeyDown={handleKeyDown}\n >\n {displayLabel}\n </div>\n <ul className=\"select_option\" role=\"listbox\" aria-label={ariaLabel}>\n {options.map((opt) => (\n <li\n key={opt.value}\n role=\"option\"\n aria-selected={opt.value === value}\n aria-disabled={opt.disabled}\n className={opt.disabled ? 'disabled' : undefined}\n onClick={() => !opt.disabled && pick(opt.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && !opt.disabled) pick(opt.value)\n }}\n >\n {opt.label}\n </li>\n ))}\n </ul>\n </div>\n )\n\n if (!hasHelper) return dropdownNode\n\n return (\n <div\n className={cn(\n 'stn-dropdown-field',\n `stn-dropdown-field--pos-${helperTextPosition}`,\n error && 'is-error',\n !isHorizontalHelper && widthProps.className,\n className,\n )}\n style={!isHorizontalHelper ? widthProps.style : undefined}\n {...divRest}\n >\n {dropdownNode}\n <span\n id={helperId}\n className={cn('stn-dropdown-field__helper', error && 'stn-dropdown-field__helper--error')}\n >\n {helperText}\n </span>\n </div>\n )\n}\n","import type { CSSProperties } from 'react'\n\nimport {\n resolveStnInputWidth,\n type StnInputWidthValue,\n} from '@stn-uiux/pub-ui/data/stnInputWidth'\n\nexport type { StnInputWidthPreset, StnInputWidthValue } from '@stn-uiux/pub-ui/data/stnInputWidth'\n\n/**\n * Dropdown / TextField 공통 width → className + style\n * @param _prefix `stn-dropdown` | `stn-text-field`\n */\nexport function resolveInputWidthProps(\n _prefix: 'stn-dropdown' | 'stn-text-field',\n fullWidth?: boolean,\n width?: StnInputWidthValue,\n): { className: string; style: CSSProperties | undefined } {\n const resolved = resolveStnInputWidth(fullWidth, width)\n\n if (resolved.kind === 'full') {\n return {\n className: 'full',\n style: undefined,\n }\n }\n\n if (resolved.kind === 'preset' && resolved.preset != null) {\n return {\n className: `w${resolved.preset}`,\n style: undefined,\n }\n }\n\n if (resolved.kind === 'custom' && resolved.styleWidth != null) {\n return {\n className: '',\n style: { width: resolved.styleWidth },\n }\n }\n\n return { className: '', style: undefined }\n}\n","import { StnDropdown, type StnDropdownOption, type StnDropdownProps } from './StnDropdown'\r\n\r\nexport type StnDropdownMenuProps = Omit<\r\n StnDropdownProps,\r\n 'size' | 'modifier'\r\n>\r\n\r\n/**\r\n * Pub 커스텀 메뉴 (`.stn-dropdown` + `.selected` + `.select_option`).\r\n * CCTV·simple_board 검색줄 — **52px prominent** (`stn-dropdown--prominent`).\r\n * 일반 sm/md/lg 스케일은 `StnDropdown` size prop 사용.\r\n */\r\nexport function StnDropdownMenu({\r\n className,\r\n ...rest\r\n}: StnDropdownMenuProps) {\r\n return (\r\n <StnDropdown\r\n size=\"xl\"\r\n className={className}\r\n {...rest}\r\n />\r\n )\r\n}\r\n\r\nexport type { StnDropdownOption }\r\n","import { forwardRef, useId, type InputHTMLAttributes, type ReactNode } from 'react'\n\nimport type { StnTextFieldSize } from '@stn-uiux/pub-ui/data/stnTextField'\n\nexport type { StnTextFieldSize }\nimport type { StnInputWidthValue } from '@stn-uiux/pub-ui/data/stnInputWidth'\n\nimport { cn } from '../cn'\nimport type { StnWithoutStyle } from '../stnStrictProps'\nimport { resolveInputWidthProps } from '../inputWidth'\nimport { StnIcon } from './StnIcon'\n\n\nexport type StnTextFieldVariant = 'outlined' | 'filled' | 'standard'\n\n/** 색 — 기본 primary. 토큰: --stn-feedback-* */\nexport type StnTextFieldColor = 'primary' | 'success' | 'error' | 'warning' | 'info' | 'secondary'\n\n/** 아이콘 위치 — left | right */\nexport type StnTextFieldIconPosition = 'left' | 'right'\n\n/** 라벨 위치 — left | right | top */\nexport type StnTextFieldLabelPosition = 'left' | 'right' | 'top'\n\nexport type StnTextFieldSizeProp = StnTextFieldSize | 's' | 'm' | 'l' | 'xl' | 'sm' | 'md' | 'lg'\n\nfunction normalizeSize(size?: StnTextFieldSizeProp): StnTextFieldSize {\n if (!size) return 'M'\n const u = String(size).toUpperCase()\n if (u === 'S' || u === 'SM') return 'S'\n if (u === 'L' || u === 'LG') return 'L'\n if (u === 'XL') return 'XL'\n return 'M'\n}\n\nfunction sizeClass(size?: StnTextFieldSizeProp): string {\n const s = normalizeSize(size)\n if (s === 'S') return 'sm'\n if (s === 'L') return 'lg'\n if (s === 'XL') return 'xl'\n return 'md'\n}\n\nfunction variantClass(variant: StnTextFieldVariant): string {\n if (variant === 'filled') return 'filled'\n if (variant === 'standard') return 'standard'\n return 'outlined'\n}\n\nfunction colorClass(color: StnTextFieldColor | undefined): string | undefined {\n if (!color || color === 'primary' || color === 'secondary') return undefined\n return color\n}\n\nfunction resolveGlyph(node: ReactNode): ReactNode {\n if (typeof node === 'string') return <StnIcon name={node} size={16} color=\"currentColor\" />\n return node\n}\n\nexport type StnTextFieldProps = StnWithoutStyle<Omit<InputHTMLAttributes<HTMLInputElement>, 'size' | 'color'>> & {\n size?: StnTextFieldSizeProp\n /** outlined = box · filled = fill · standard = underline */\n variant?: StnTextFieldVariant\n /** 피드백 색 — primary/secondary는 기본 테두리. success·error·warning·info = --stn-feedback-* */\n color?: StnTextFieldColor\n /** 오류 테두리 — `aria-invalid`도 함께 설정 */\n invalid?: boolean\n /** width 100% — `stn-text-field--full` */\n fullWidth?: boolean\n /** 프리셋 80·100·140·180·200 · `100%`/`full` · 그 외 px/string */\n width?: StnInputWidthValue\n /** 라벨 텍스트 또는 노드 */\n label?: ReactNode\n /** 라벨 위치 ('left' | 'right' | 'top') - 기본 'left' */\n labelPosition?: StnTextFieldLabelPosition\n /** 필수 입력 여부 (`*` 표시) */\n required?: boolean\n /** 왼쪽 아이콘 — Iconography slug (`line/user`) 또는 ReactNode. 로그인 등 고정 왼쪽 슬롯 */\n prefix?: ReactNode\n /** 오른쪽 아이콘 — slug 또는 ReactNode */\n suffix?: ReactNode\n /** 아이콘 — slug 또는 ReactNode. 위치는 iconPosition */\n icon?: ReactNode\n /** 아이콘 위치 · icon 지정 시 기본 left */\n iconPosition?: StnTextFieldIconPosition\n /** 필드 하단 왼쪽 캡션 */\n helperText?: ReactNode\n className?: string\n}\n\nexport const StnTextField = forwardRef<HTMLInputElement, StnTextFieldProps>(function StnTextField(\n {\n size = 'M',\n variant = 'outlined',\n color,\n invalid,\n fullWidth,\n width,\n label,\n labelPosition = 'left',\n required,\n prefix,\n suffix,\n icon,\n iconPosition,\n helperText,\n className,\n disabled,\n type = 'text',\n id: idProp,\n 'aria-invalid': ariaInvalid,\n 'aria-describedby': ariaDescribedBy,\n ...rest\n },\n ref,\n) {\n const autoId = useId()\n const id = idProp ?? autoId\n const resolvedIconPos = iconPosition ?? 'left'\n const leftFromIcon = icon != null && resolvedIconPos === 'left' ? icon : undefined\n const rightFromIcon = icon != null && resolvedIconPos === 'right' ? icon : undefined\n const leftNode = prefix ?? leftFromIcon\n const rightNode = suffix ?? rightFromIcon\n const hasLeft = leftNode != null && leftNode !== false\n const hasRight = rightNode != null && rightNode !== false\n const hasSlot = hasLeft || hasRight\n const hasLabel = label != null && label !== ''\n const hasHelper = helperText != null && helperText !== ''\n const hasWrap = hasLabel || hasHelper\n const helperId = hasHelper ? `${id}-helper` : undefined\n const describedBy = [ariaDescribedBy, helperId].filter(Boolean).join(' ') || undefined\n const widthProps = resolveInputWidthProps('stn-text-field', fullWidth, width)\n const fieldClass = cn(\n 'stn-text-field',\n variantClass(variant),\n sizeClass(size),\n colorClass(color),\n !hasWrap && widthProps.className,\n invalid && 'stn-text-field--invalid',\n Boolean(prefix) && 'stn-text-field--with-prefix',\n hasSlot && 'stn-text-field--with-icon',\n className,\n )\n\n const input = (\n <input\n ref={ref}\n id={id}\n type={type}\n disabled={disabled}\n required={required}\n aria-invalid={invalid ? true : ariaInvalid}\n aria-describedby={describedBy}\n className={hasSlot ? 'stn-text-field__control' : fieldClass}\n style={hasSlot || hasWrap ? undefined : widthProps.style}\n {...rest}\n />\n )\n\n const field = hasSlot ? (\n <div className={fieldClass} style={hasWrap ? undefined : widthProps.style}>\n {hasLeft ? (\n <span className=\"stn-text-field__prefix\" aria-hidden>\n <span className=\"stn-text-field__icon-box\">{resolveGlyph(leftNode)}</span>\n </span>\n ) : null}\n {input}\n {hasRight ? (\n <span className=\"stn-text-field__suffix\" aria-hidden>\n <span className=\"stn-text-field__icon-box\">{resolveGlyph(rightNode)}</span>\n </span>\n ) : null}\n </div>\n ) : (\n input\n )\n\n if (!hasWrap) return field\n\n const labelElement = hasLabel ? (\n <label htmlFor={id} className=\"stn-text-field__label\">\n <span className=\"stn-text-field__label-text\">{label}</span>\n {required && (\n <span className=\"stn-text-field__required\" aria-hidden=\"true\">\n *\n </span>\n )}\n </label>\n ) : null\n\n const isRow = labelPosition === 'left' || labelPosition === 'right'\n\n return (\n <div\n className={cn(\n 'stn-text-field-wrap',\n hasLabel && (isRow ? 'stn-text-field-wrap--row' : 'stn-text-field-wrap--col'),\n hasLabel && labelPosition === 'left' && 'stn-text-field-wrap--label-left',\n hasLabel && labelPosition === 'right' && 'stn-text-field-wrap--label-right',\n hasLabel && labelPosition === 'top' && 'stn-text-field-wrap--label-top',\n widthProps.className,\n )}\n style={widthProps.style}\n >\n {hasLabel && (labelPosition === 'left' || labelPosition === 'top') ? labelElement : null}\n <div className=\"stn-text-field-wrap__body\">\n {field}\n {hasHelper && (\n <p\n id={helperId}\n className={cn('stn-text-field__helper', invalid && 'stn-text-field__helper--error')}\n >\n {helperText}\n </p>\n )}\n </div>\n {hasLabel && labelPosition === 'right' ? labelElement : null}\n </div>\n )\n})\n","import { forwardRef, type ButtonHTMLAttributes, type CSSProperties } from 'react'\n\nimport {\n formatStnDateRangeFieldValue,\n type StnDateRangeFieldSize,\n} from '@stn-uiux/pub-ui/data/stnDateRangeField'\n\nexport type { StnDateRangeFieldSize }\n\nimport { cn } from '../cn'\n\n\nfunction normalizeSize(size: StnDateRangeFieldSize | 's' | 'm' | 'l' | 'sm' | 'md' | 'lg'): StnDateRangeFieldSize {\n const u = String(size).toUpperCase()\n if (u === 'S' || u === 'SM') return 'S'\n if (u === 'L' || u === 'LG') return 'L'\n return 'M'\n}\n\nfunction sizeClass(size: StnDateRangeFieldSize | 's' | 'm' | 'l' | 'sm' | 'md' | 'lg'): string {\n const s = normalizeSize(size)\n if (s === 'S') return 'sm'\n if (s === 'L') return 'lg'\n return 'md'\n}\n\nfunction resolveValue(value: Date | string | null | undefined, format: (date: Date) => string): string | null {\n if (value == null) return null\n if (value instanceof Date) return format(value)\n const trimmed = value.trim()\n return trimmed || null\n}\n\nexport type StnDateRangeFieldProps = Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'children' | 'value'> & {\n size?: StnDateRangeFieldSize | 's' | 'm' | 'l' | 'sm' | 'md' | 'lg'\n start?: Date | string | null\n end?: Date | string | null\n /** 표시 포맷 — 기본 `YYYY-MM-DD HH:mm:ss` */\n format?: (date: Date) => string\n startPlaceholder?: string\n endPlaceholder?: string\n invalid?: boolean\n fullWidth?: boolean\n width?: number | string\n className?: string\n}\n\nexport const StnDateRangeField = forwardRef<HTMLButtonElement, StnDateRangeFieldProps>(function StnDateRangeField(\n {\n size = 'M',\n start,\n end,\n format = formatStnDateRangeFieldValue,\n startPlaceholder = 'Start',\n endPlaceholder = 'End',\n invalid,\n fullWidth,\n width,\n className,\n style,\n disabled,\n type = 'button',\n 'aria-invalid': ariaInvalid,\n ...rest\n },\n ref,\n) {\n const startText = resolveValue(start, format)\n const endText = resolveValue(end, format)\n const isEmpty = !startText && !endText\n\n const resolvedStyle: CSSProperties | undefined =\n width !== undefined ? { ...style, width: typeof width === 'number' ? `${width}px` : width } : style\n\n return (\n <button\n ref={ref}\n type={type}\n disabled={disabled}\n aria-invalid={invalid ? true : ariaInvalid}\n className={cn(\n 'stn-date-range-field',\n sizeClass(size),\n fullWidth && 'stn-date-range-field--full w100p',\n invalid && 'stn-date-range-field--invalid',\n isEmpty && 'is-empty',\n className,\n )}\n style={resolvedStyle}\n {...rest}\n >\n <span className=\"stn-date-range-field__inner\">\n <span className=\"stn-date-range-field__text\">\n <span className={cn('stn-date-range-field__value', !startText && 'is-placeholder')}>\n {startText ?? startPlaceholder}\n </span>\n <span className=\"stn-date-range-field__sep\" aria-hidden=\"true\">\n ~\n </span>\n <span className={cn('stn-date-range-field__value', !endText && 'is-placeholder')}>\n {endText ?? endPlaceholder}\n </span>\n </span>\n <span className=\"stn-date-range-field__icon\" aria-hidden=\"true\" />\n </span>\n </button>\n )\n})\n","import type { HTMLAttributes, ReactNode } from 'react'\n\nimport { StnButton, type StnButtonProps } from '../../components/StnButton'\nimport { StnIcon } from '../../components/StnIcon'\nimport { cn } from '../../cn'\n\nexport type StnSearchRequirementBarProps = HTMLAttributes<HTMLDivElement> & {\n children?: ReactNode\n className?: string\n /**\n * 여백 밀도\n * - default: padding 8px 16px, gap 16px\n * - compact: padding 6px 12px, gap 12px\n */\n density?: 'default' | 'compact'\n}\n\n/**\n * 검색조건 바 — 직접 자식으로 Fields · SearchButton · Export(선택)를 둡니다.\n * Export는 `margin-left: auto`로 우측 정렬됩니다. Main/export 트레이 래퍼 없음.\n */\nexport function StnSearchRequirementBar({\n children,\n className,\n density = 'default',\n ...rest\n}: StnSearchRequirementBarProps) {\n return (\n <div\n className={cn(\n 'stn-search-requirement',\n density === 'compact' && 'stn-search-requirement--compact',\n className\n )}\n data-stn-search-requirement=\"root\"\n {...rest}\n >\n {children}\n </div>\n )\n}\n\nexport type StnSearchRequirementBarFieldsProps = HTMLAttributes<HTMLDivElement> & {\n children?: ReactNode\n className?: string\n}\n\nfunction StnSearchRequirementBarFields({ children, className, ...rest }: StnSearchRequirementBarFieldsProps) {\n return (\n <div className={cn('stn-search-requirement__fields', className)} data-stn-search-requirement=\"fields\" {...rest}>\n {children}\n </div>\n )\n}\n\nexport type StnSearchRequirementBarFieldProps = HTMLAttributes<HTMLDivElement> & {\n label: ReactNode\n children?: ReactNode\n className?: string\n labelClassName?: string\n controlClassName?: string\n}\n\nfunction StnSearchRequirementBarField({\n label,\n children,\n className,\n labelClassName,\n controlClassName,\n ...rest\n}: StnSearchRequirementBarFieldProps) {\n return (\n <div className={cn('stn-search-requirement__field', className)} data-stn-search-requirement=\"field\" {...rest}>\n <span className={cn('stn-search-requirement__label', labelClassName)}>{label}</span>\n <div className={cn('stn-search-requirement__control', controlClassName)}>{children}</div>\n </div>\n )\n}\n\nexport type StnSearchRequirementBarSearchButtonProps = StnButtonProps\n\nfunction StnSearchRequirementBarSearchButton({\n children = '검색',\n size = 'M',\n icon = <StnIcon name=\"line/search\" size={16} color=\"currentColor\" />,\n className,\n ...rest\n}: StnSearchRequirementBarSearchButtonProps) {\n return (\n <StnButton\n size={size}\n variant=\"contained\"\n icon={icon}\n className={className}\n data-stn-search-requirement=\"search\"\n {...rest}\n >\n {children}\n </StnButton>\n )\n}\n\nexport type StnSearchRequirementBarExportProps = Omit<StnButtonProps, 'children' | 'icon'> & {\n /** 기본 `line/file-analytics` (엑셀/다운로드) */\n name?: string\n icon?: StnButtonProps['icon']\n}\n\nfunction StnSearchRequirementBarExport({\n className,\n name = 'line/file-analytics',\n icon,\n variant = 'ghost',\n size = 'md',\n 'aria-label': ariaLabel = 'Excel보내기',\n ...rest\n}: StnSearchRequirementBarExportProps) {\n return (\n <StnButton\n icon={icon ?? <StnIcon name={name} size={24} color=\"currentColor\" />}\n variant={variant}\n size={size}\n aria-label={ariaLabel}\n className={className}\n data-stn-search-requirement=\"export\"\n {...rest}\n />\n )\n}\n\nexport type StnSearchRequirementBarDividerProps = HTMLAttributes<HTMLSpanElement> & {\n className?: string\n}\n\nfunction StnSearchRequirementBarDivider({ className, ...rest }: StnSearchRequirementBarDividerProps) {\n return (\n <span\n className={cn('stn-search-requirement__divider', className)}\n role=\"separator\"\n aria-orientation=\"vertical\"\n {...rest}\n />\n )\n}\n\nStnSearchRequirementBar.Fields = StnSearchRequirementBarFields\nStnSearchRequirementBar.Field = StnSearchRequirementBarField\nStnSearchRequirementBar.SearchButton = StnSearchRequirementBarSearchButton\nStnSearchRequirementBar.Export = StnSearchRequirementBarExport\nStnSearchRequirementBar.Divider = StnSearchRequirementBarDivider\n","import { STN_DATE_RANGE_FIELD_DEMO, parseStnDateRangeFieldValue } from '@stn-uiux/pub-ui/data/stnDateRangeField'\nimport { STN_SEARCH_REQUIREMENT_DEMO_FIELDS } from '@stn-uiux/pub-ui/data/stnSearchRequirement'\n\nimport { StnDropdown } from '../../components/StnDropdown'\nimport { StnTextField } from '../../components/StnTextField'\nimport { StnDateRangePickerField } from '../../components/datePicker/StnDateRangePickerField'\nimport { StnSearchRequirementBar } from './StnSearchRequirementBar'\n\nconst ALL_OPTIONS = [{ value: '', label: '전체' }]\n\nexport type StnSearchRequirementBarDemoProps = {\n onSearch?: () => void\n onExport?: () => void\n className?: string\n}\n\n/** Figma 40000042:186893 — 보고서 검색조건 기본 조합 */\nexport function StnSearchRequirementBarDemo({ onSearch, onExport, className }: StnSearchRequirementBarDemoProps) {\n const demo = STN_SEARCH_REQUIREMENT_DEMO_FIELDS\n\n return (\n <StnSearchRequirementBar className={className}>\n <StnSearchRequirementBar.Fields>\n <StnSearchRequirementBar.Field label={demo.reportTypeText.label}>\n <StnTextField\n size=\"M\"\n defaultValue={demo.reportTypeText.value}\n width={140}\n aria-label={demo.reportTypeText.label}\n />\n </StnSearchRequirementBar.Field>\n <StnSearchRequirementBar.Field label={demo.reportTypeSelect.label}>\n <StnDropdown\n size=\"md\"\n width={130}\n options={ALL_OPTIONS}\n defaultValue={demo.reportTypeSelect.value}\n aria-label={demo.reportTypeSelect.label}\n />\n </StnSearchRequirementBar.Field>\n <StnSearchRequirementBar.Field label={demo.periodType.label}>\n <StnDropdown\n size=\"md\"\n width={130}\n options={ALL_OPTIONS}\n defaultValue={demo.periodType.value}\n aria-label={demo.periodType.label}\n />\n </StnSearchRequirementBar.Field>\n <StnSearchRequirementBar.Field label={demo.period.label}>\n <StnDateRangePickerField\n size=\"M\"\n defaultValue={{\n start: parseStnDateRangeFieldValue(STN_DATE_RANGE_FIELD_DEMO.start),\n end: parseStnDateRangeFieldValue(STN_DATE_RANGE_FIELD_DEMO.end),\n }}\n showTime\n aria-label={demo.period.label}\n />\n </StnSearchRequirementBar.Field>\n </StnSearchRequirementBar.Fields>\n <StnSearchRequirementBar.SearchButton onClick={onSearch} />\n <StnSearchRequirementBar.Export onClick={onExport} />\n </StnSearchRequirementBar>\n )\n}\n","import {\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n type CSSProperties,\n} from 'react'\nimport { createPortal } from 'react-dom'\n\nimport type { StnDateRange } from '@stn-uiux/pub-ui/data/stnDatePicker'\nimport { formatStnDateRangeFieldValue } from '@stn-uiux/pub-ui/data/stnDateRangeField'\n\nimport { StnDateRangeField, type StnDateRangeFieldProps } from '../StnDateRangeField'\nimport { cn } from '../../cn'\nimport { StnDateRangePicker } from './StnDateRangePicker'\n\nfunction useControllableRange(\n controlled: StnDateRange | undefined,\n defaultValue: StnDateRange,\n onChange?: (value: StnDateRange) => void,\n) {\n const [internal, setInternal] = useState(defaultValue)\n const value = controlled ?? internal\n\n const setValue = useCallback(\n (next: StnDateRange) => {\n if (controlled === undefined) setInternal(next)\n onChange?.(next)\n },\n [controlled, onChange],\n )\n\n return [value, setValue] as const\n}\n\nexport type StnDateRangePickerFieldProps = Omit<\n StnDateRangeFieldProps,\n 'start' | 'end' | 'onClick' | 'defaultValue' | 'value' | 'onChange'\n> & {\n value?: StnDateRange\n defaultValue?: StnDateRange\n onChange?: (value: StnDateRange) => void\n showTime?: boolean\n format?: (date: Date) => string\n pickerClassName?: string\n pickerStyle?: CSSProperties\n}\n\nconst EMPTY_RANGE: StnDateRange = { start: null, end: null }\n\nexport function StnDateRangePickerField({\n value: valueProp,\n defaultValue = EMPTY_RANGE,\n onChange,\n showTime = true,\n format = formatStnDateRangeFieldValue,\n className,\n pickerClassName,\n pickerStyle,\n disabled,\n ...fieldProps\n}: StnDateRangePickerFieldProps) {\n const [value, setValue] = useControllableRange(valueProp, defaultValue, onChange)\n const [open, setOpen] = useState(false)\n const [anchorRect, setAnchorRect] = useState<DOMRect | null>(null)\n const rootRef = useRef<HTMLDivElement>(null)\n const triggerRef = useRef<HTMLButtonElement>(null)\n const panelRef = useRef<HTMLDivElement>(null)\n\n const updateAnchor = useCallback(() => {\n setAnchorRect(triggerRef.current?.getBoundingClientRect() ?? null)\n }, [])\n\n useLayoutEffect(() => {\n if (!open) return\n updateAnchor()\n const onReflow = () => updateAnchor()\n window.addEventListener('resize', onReflow)\n window.addEventListener('scroll', onReflow, true)\n return () => {\n window.removeEventListener('resize', onReflow)\n window.removeEventListener('scroll', onReflow, true)\n }\n }, [open, updateAnchor])\n\n useEffect(() => {\n if (!open) return\n const onDocMouseDown = (event: MouseEvent) => {\n const target = event.target as Node\n if (rootRef.current?.contains(target)) return\n if (panelRef.current?.contains(target)) return\n setOpen(false)\n }\n document.addEventListener('mousedown', onDocMouseDown)\n return () => document.removeEventListener('mousedown', onDocMouseDown)\n }, [open])\n\n useEffect(() => {\n if (!open) return\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') setOpen(false)\n }\n document.addEventListener('keydown', onKeyDown)\n return () => document.removeEventListener('keydown', onKeyDown)\n }, [open])\n\n return (\n <div ref={rootRef} className={cn('stn-date-picker-field', className)}>\n <StnDateRangeField\n ref={triggerRef}\n {...fieldProps}\n disabled={disabled}\n start={value.start}\n end={value.end}\n format={format}\n aria-expanded={open}\n aria-haspopup=\"dialog\"\n onClick={(event) => {\n if (disabled) return\n event.preventDefault()\n updateAnchor()\n setOpen((prev) => !prev)\n }}\n />\n {open && typeof document !== 'undefined'\n ? createPortal(\n <div ref={panelRef}>\n <StnDateRangePicker\n open\n value={value}\n showTime={showTime}\n anchorRect={anchorRect}\n className={pickerClassName}\n style={pickerStyle}\n onApply={setValue}\n onClose={() => setOpen(false)}\n />\n </div>,\n document.body,\n )\n : null}\n </div>\n )\n}\n","import { useCallback, useEffect, useId, useMemo, useState, type CSSProperties } from 'react'\n\nimport {\n STN_DATE_PICKER_WEEKDAYS,\n type StnDateRange,\n} from '@stn-uiux/pub-ui/data/stnDatePicker'\n\nimport { StnButton } from '../StnButton'\nimport { cn } from '../../cn'\nimport {\n addMonths,\n buildMonthGrid,\n cloneDate,\n formatMonthTitle,\n isBetweenDays,\n isSameDay,\n normalizeRange,\n setTimePart,\n startOfMonth,\n} from './stnCalendarUtils'\n\nexport type StnDateRangePickerProps = {\n open: boolean\n value: StnDateRange\n onChange?: (value: StnDateRange) => void\n onApply?: (value: StnDateRange) => void\n onClose?: () => void\n showTime?: boolean\n className?: string\n style?: CSSProperties\n /** portal positioning — `StnDateRangePickerField`가 전달 */\n anchorRect?: DOMRect | null\n}\n\nfunction useDraftRange(value: StnDateRange, open: boolean) {\n const [draft, setDraft] = useState(value)\n\n useEffect(() => {\n if (open) setDraft(value)\n }, [open, value])\n\n return [draft, setDraft] as const\n}\n\ntype CalendarPanelProps = {\n month: Date\n range: StnDateRange\n onPick: (day: Date) => void\n onPrev: () => void\n onNext: () => void\n showPrev?: boolean\n showNext?: boolean\n}\n\nfunction CalendarPanel({ month, range, onPick, onPrev, onNext, showPrev = true, showNext = true }: CalendarPanelProps) {\n const days = useMemo(() => buildMonthGrid(month), [month])\n const { start, end } = range\n\n return (\n <div className=\"stn-date-picker-panel\">\n <div className=\"stn-date-picker-panel__header\">\n {showPrev ? (\n <button type=\"button\" className=\"stn-date-picker-panel__nav\" onClick={onPrev} aria-label=\"Previous month\">\n ‹\n </button>\n ) : (\n <span className=\"stn-date-picker-panel__nav\" aria-hidden=\"true\" />\n )}\n <p className=\"stn-date-picker-panel__title\">{formatMonthTitle(month)}</p>\n {showNext ? (\n <button type=\"button\" className=\"stn-date-picker-panel__nav\" onClick={onNext} aria-label=\"Next month\">\n ›\n </button>\n ) : (\n <span className=\"stn-date-picker-panel__nav\" aria-hidden=\"true\" />\n )}\n </div>\n <table className=\"stn-date-picker-content\">\n <thead>\n <tr>\n {STN_DATE_PICKER_WEEKDAYS.map((label) => (\n <th key={label} scope=\"col\">\n {label}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {Array.from({ length: 6 }, (_, row) => (\n <tr key={row}>\n {days.slice(row * 7, row * 7 + 7).map((cell) => {\n const inRange = start && end && isBetweenDays(cell.date, start, end)\n const isStart = start ? isSameDay(cell.date, start) : false\n const isEnd = end ? isSameDay(cell.date, end) : false\n\n return (\n <td\n key={cell.date.toISOString()}\n className={cn(\n 'stn-date-picker-cell',\n !cell.inMonth && 'stn-date-picker-cell--outside',\n inRange && 'stn-date-picker-cell--in-range',\n isStart && 'stn-date-picker-cell--range-start',\n isEnd && 'stn-date-picker-cell--range-end',\n )}\n >\n <button\n type=\"button\"\n className=\"stn-date-picker-cell__btn\"\n onClick={() => onPick(cell.date)}\n >\n {cell.date.getDate()}\n </button>\n </td>\n )\n })}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )\n}\n\ntype TimeColumnsProps = {\n label: string\n value: Date | null\n onChange: (next: Date) => void\n}\n\nfunction TimeColumns({ label, value, onChange }: TimeColumnsProps) {\n const hours = value?.getHours() ?? 0\n const minutes = value?.getMinutes() ?? 0\n const seconds = value?.getSeconds() ?? 0\n const base = value ?? new Date()\n\n const patch = (h: number, m: number, s: number) => onChange(setTimePart(base, h, m, s))\n\n return (\n <div className=\"stn-date-picker-time__side\">\n <span className=\"stn-date-picker-time__label\">{label}</span>\n <div className=\"stn-date-picker-time__columns\">\n <ul className=\"stn-date-picker-time__column\" aria-label={`${label} hour`}>\n {Array.from({ length: 24 }, (_, h) => (\n <li key={h}>\n <button\n type=\"button\"\n className={cn('stn-date-picker-time__option', h === hours && 'is-selected')}\n onClick={() => patch(h, minutes, seconds)}\n >\n {String(h).padStart(2, '0')}\n </button>\n </li>\n ))}\n </ul>\n <ul className=\"stn-date-picker-time__column\" aria-label={`${label} minute`}>\n {Array.from({ length: 60 }, (_, m) => (\n <li key={m}>\n <button\n type=\"button\"\n className={cn('stn-date-picker-time__option', m === minutes && 'is-selected')}\n onClick={() => patch(hours, m, seconds)}\n >\n {String(m).padStart(2, '0')}\n </button>\n </li>\n ))}\n </ul>\n <ul className=\"stn-date-picker-time__column\" aria-label={`${label} second`}>\n {Array.from({ length: 60 }, (_, s) => (\n <li key={s}>\n <button\n type=\"button\"\n className={cn('stn-date-picker-time__option', s === seconds && 'is-selected')}\n onClick={() => patch(hours, minutes, s)}\n >\n {String(s).padStart(2, '0')}\n </button>\n </li>\n ))}\n </ul>\n </div>\n </div>\n )\n}\n\nexport function StnDateRangePicker({\n open,\n value,\n onChange,\n onApply,\n onClose,\n showTime = true,\n className,\n style,\n anchorRect,\n}: StnDateRangePickerProps) {\n const titleId = useId()\n const [draft, setDraft] = useDraftRange(value, open)\n const [leftMonth, setLeftMonth] = useState(() => startOfMonth(draft.start ?? draft.end ?? new Date()))\n\n useEffect(() => {\n if (!open) return\n const anchor = draft.start ?? draft.end ?? new Date()\n setLeftMonth(startOfMonth(anchor))\n }, [open, draft.start, draft.end])\n\n const rightMonth = useMemo(() => addMonths(leftMonth, 1), [leftMonth])\n\n const updateDraft = useCallback(\n (next: StnDateRange) => {\n setDraft(next)\n onChange?.(next)\n },\n [onChange],\n )\n\n const pickDay = useCallback(\n (day: Date) => {\n const nextStart = cloneDate(day)\n if (!showTime) {\n nextStart.setHours(0, 0, 0, 0)\n } else if (draft.start) {\n nextStart.setHours(draft.start.getHours(), draft.start.getMinutes(), draft.start.getSeconds(), 0)\n }\n\n if (!draft.start || (draft.start && draft.end)) {\n updateDraft({ start: nextStart, end: null })\n return\n }\n\n const nextEnd = cloneDate(day)\n if (!showTime) {\n nextEnd.setHours(23, 59, 59, 0)\n } else {\n nextEnd.setHours(\n draft.end?.getHours() ?? 23,\n draft.end?.getMinutes() ?? 59,\n draft.end?.getSeconds() ?? 59,\n 0,\n )\n }\n updateDraft(normalizeRange(draft.start, nextEnd))\n },\n [draft.end, draft.start, showTime, updateDraft],\n )\n\n const handleApply = () => {\n const next = normalizeRange(draft.start, draft.end)\n onApply?.(next)\n onClose?.()\n }\n\n if (!open) return null\n\n const positionStyle: CSSProperties = anchorRect\n ? {\n top: anchorRect.bottom + 4,\n left: anchorRect.left,\n ...style,\n }\n : style ?? {}\n\n return (\n <div\n className={cn('stn-date-picker-dropdown', className)}\n style={positionStyle}\n role=\"dialog\"\n aria-modal=\"false\"\n aria-labelledby={titleId}\n >\n <div className=\"stn-date-picker-dropdown__body\">\n <span id={titleId} className=\"stn-sf__visually-hidden\">\n Date range picker\n </span>\n <div className=\"stn-date-picker-dropdown__panels\">\n <CalendarPanel\n month={leftMonth}\n range={draft}\n onPick={pickDay}\n onPrev={() => setLeftMonth((m) => addMonths(m, -1))}\n onNext={() => setLeftMonth((m) => addMonths(m, 1))}\n showNext={false}\n />\n <CalendarPanel\n month={rightMonth}\n range={draft}\n onPick={pickDay}\n onPrev={() => setLeftMonth((m) => addMonths(m, -1))}\n onNext={() => setLeftMonth((m) => addMonths(m, 1))}\n showPrev={false}\n />\n </div>\n {showTime ? (\n <div className=\"stn-date-picker-time\">\n <TimeColumns\n label=\"시작\"\n value={draft.start}\n onChange={(start) => updateDraft({ ...draft, start })}\n />\n <TimeColumns\n label=\"종료\"\n value={draft.end}\n onChange={(end) => updateDraft({ ...draft, end })}\n />\n </div>\n ) : null}\n <div className=\"stn-date-picker-footer\">\n <StnButton size=\"M\" variant=\"contained\" onClick={handleApply} disabled={!draft.start || !draft.end}>\n 확인\n </StnButton>\n </div>\n </div>\n </div>\n )\n}\n","export function cloneDate(date: Date): Date {\n return new Date(date.getTime())\n}\n\nexport function startOfDay(date: Date): Date {\n const next = cloneDate(date)\n next.setHours(0, 0, 0, 0)\n return next\n}\n\nexport function startOfMonth(date: Date): Date {\n return new Date(date.getFullYear(), date.getMonth(), 1)\n}\n\nexport function addMonths(date: Date, count: number): Date {\n return new Date(date.getFullYear(), date.getMonth() + count, 1)\n}\n\nexport function isSameDay(a: Date, b: Date): boolean {\n return (\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate()\n )\n}\n\nexport function isBetweenDays(day: Date, start: Date, end: Date): boolean {\n const value = startOfDay(day).getTime()\n const from = startOfDay(start).getTime()\n const to = startOfDay(end).getTime()\n const min = Math.min(from, to)\n const max = Math.max(from, to)\n return value >= min && value <= max\n}\n\nexport function setTimePart(date: Date, hours: number, minutes: number, seconds: number): Date {\n const next = cloneDate(date)\n next.setHours(hours, minutes, seconds, 0)\n return next\n}\n\nexport type StnCalendarDayCell = {\n date: Date\n inMonth: boolean\n}\n\nexport function buildMonthGrid(monthAnchor: Date): StnCalendarDayCell[] {\n const first = startOfMonth(monthAnchor)\n const startOffset = first.getDay()\n const gridStart = new Date(first)\n gridStart.setDate(first.getDate() - startOffset)\n\n return Array.from({ length: 42 }, (_, index) => {\n const date = new Date(gridStart)\n date.setDate(gridStart.getDate() + index)\n return {\n date,\n inMonth: date.getMonth() === monthAnchor.getMonth(),\n }\n })\n}\n\nexport function formatMonthTitle(date: Date): string {\n return `${date.getFullYear()}년 ${date.getMonth() + 1}월`\n}\n\nexport function normalizeRange(start: Date | null, end: Date | null): { start: Date | null; end: Date | null } {\n if (!start || !end) return { start, end }\n if (start.getTime() <= end.getTime()) return { start, end }\n return { start: end, end: start }\n}\n","import type { CSSProperties, HTMLAttributes, ReactNode } from 'react'\n\nimport type {\n StnHeaderGap,\n StnHeaderPadding,\n StnHeaderVariant,\n} from '@stn-uiux/pub-ui/data/stnHeader'\n\nimport { cn } from '../../cn'\n\n\nexport type StnHeaderProps = HTMLAttributes<HTMLElement> & {\n /**\n * @deprecated Header는 Left, Center, Right 슬롯 구성에 따라 레이아웃이 자동 결정되므로 variant 지정이 필요하지 않습니다. 하위 호환성을 위해 유지됩니다.\n */\n variant?: StnHeaderVariant\n padding?: StnHeaderPadding | number | string\n gap?: StnHeaderGap | number | string\n children?: ReactNode\n className?: string\n style?: CSSProperties\n}\n\nfunction variantClass(variant?: StnHeaderVariant): string | undefined {\n if (variant === 'page') return 'stn-header--page'\n return undefined\n}\n\nexport function StnHeader({\n variant,\n padding,\n gap,\n children,\n className,\n style,\n ...rest\n}: StnHeaderProps) {\n const isNamedPadding = typeof padding === 'string' && ['none', 'sm', 'md', 'lg'].includes(padding)\n const isNamedGap = typeof gap === 'string' && ['none', 'sm', 'md', 'lg'].includes(gap)\n\n const dynamicStyles: Record<string, string | number> = {}\n\n if (padding !== undefined && !isNamedPadding) {\n dynamicStyles['--stn-header-padding-x'] =\n typeof padding === 'number' ? `${padding}px` : padding\n }\n\n if (gap !== undefined && !isNamedGap) {\n dynamicStyles['--stn-header-gap'] =\n typeof gap === 'number' ? `${gap}px` : gap\n }\n\n const combinedStyle: CSSProperties = {\n ...dynamicStyles,\n ...style,\n }\n\n return (\n <header\n className={cn(\n 'stn-header',\n variantClass(variant),\n isNamedPadding ? `padding-${padding}` : undefined,\n isNamedGap ? `gap-${gap}` : undefined,\n className,\n )}\n data-stn-header={variant}\n style={Object.keys(combinedStyle).length > 0 ? combinedStyle : undefined}\n {...rest}\n >\n {children}\n </header>\n )\n}\n\nexport type StnHeaderRegionProps = HTMLAttributes<HTMLDivElement> & {\n children?: ReactNode\n className?: string\n}\n\nfunction StnHeaderLeft({ children, className, ...rest }: StnHeaderRegionProps) {\n return (\n <div className={cn('stn-header__left', className)} data-stn-header-region=\"left\" {...rest}>\n {children}\n </div>\n )\n}\n\nfunction StnHeaderCenter({ children, className, ...rest }: StnHeaderRegionProps) {\n return (\n <div className={cn('stn-header__center', className)} data-stn-header-region=\"center\" {...rest}>\n {children}\n </div>\n )\n}\n\nfunction StnHeaderRight({ children, className, ...rest }: StnHeaderRegionProps) {\n return (\n <div className={cn('stn-header__right', className)} data-stn-header-region=\"right\" {...rest}>\n {children}\n </div>\n )\n}\n\nexport type StnHeaderTitleGroupProps = HTMLAttributes<HTMLDivElement> & {\n children?: ReactNode\n className?: string\n}\n\nexport function StnHeaderTitleGroup({ children, className, ...rest }: StnHeaderTitleGroupProps) {\n return (\n <div className={cn('stn-header__title-group', className)} {...rest}>\n {children}\n </div>\n )\n}\n\nStnHeader.Left = StnHeaderLeft\nStnHeader.Center = StnHeaderCenter\nStnHeader.Right = StnHeaderRight\nStnHeader.TitleGroup = StnHeaderTitleGroup\n\nexport type StnHeaderPageTitleProps = HTMLAttributes<HTMLHeadingElement> & {\n children: ReactNode\n className?: string\n}\n\nexport function StnHeaderPageTitle({ children, className, title, ...rest }: StnHeaderPageTitleProps) {\n const autoTitle = typeof children === 'string' ? children : undefined\n return (\n <h1\n className={cn('stn-header__page-title', className)}\n title={title ?? autoTitle}\n {...rest}\n >\n {children}\n </h1>\n )\n}\n\nexport function StnHeaderSubTitle({ children, className, title, ...rest }: StnHeaderPageTitleProps) {\n const autoTitle = typeof children === 'string' ? children : undefined\n return (\n <span\n className={cn('stn-header__subtitle', className)}\n title={title ?? autoTitle}\n {...rest}\n >\n {children}\n </span>\n )\n}\n\nexport function StnHeaderContextTitle({ children, className, title, ...rest }: StnHeaderPageTitleProps) {\n const autoTitle = typeof children === 'string' ? children : undefined\n return (\n <span\n className={cn('stn-header__context-title', className)}\n title={title ?? autoTitle}\n {...rest}\n >\n {children}\n </span>\n )\n}\n\nexport type StnHeaderToolbarProps = HTMLAttributes<HTMLDivElement> & {\n children?: ReactNode\n className?: string\n}\n\nexport function StnHeaderToolbar({ children, className, ...rest }: StnHeaderToolbarProps) {\n return (\n <div className={cn('stn-header-toolbar', className)} data-stn-header-toolbar {...rest}>\n {children}\n </div>\n )\n}\n\nexport {\n StnSystemChip,\n type StnSystemChipItem,\n type StnSystemChipTone,\n type StnSystemChipProps,\n} from '../../components/StnSystemChip'\n","import type { CSSProperties, HTMLAttributes } from 'react'\n\nimport {\n STN_LAYER0_BACKGROUND_DEMO_IMAGES,\n STN_LAYER0_MAP_LIGHT_OVERLAY,\n type StnLayer0BackgroundKind,\n type StnLayer0BackgroundPreset,\n} from '@stn-uiux/pub-ui/data/stnLayer0Background'\n\nimport { cn } from '../../cn'\n\n/** 단색 L0 — 지금은 default만. 장면이 생기면 타입을 추가합니다. */\nexport type StnLayer0BackgroundColor = 'default'\n\nexport type StnLayer0BackgroundProps = Omit<HTMLAttributes<HTMLDivElement>, 'children'> & {\n /** 디자인 시스템 사전 정의 프리셋 ('dashboard' | 'login' | 'map-light' | 'showroom-a' | 'showroom-b' | 'none') */\n variant?: StnLayer0BackgroundPreset\n /** 채움 방식. 기본 color. `src`가 있으면 image로 봅니다. */\n kind?: StnLayer0BackgroundKind\n /** 단색 named look. 기본 default (`--stn-elevation-surface-0`) */\n color?: StnLayer0BackgroundColor\n /** 이미지 배경 — light(또는 단일) URL. 있으면 단색이 아닙니다. */\n src?: string\n /** image kind — dark 전용 이미지 (있으면 테마에 따라 전환) */\n srcDark?: string\n /** image kind — 흰색 오버레이 0~1 (Figma map-light light: 0.2) · 다크에서는 숨김 */\n overlay?: number\n /** image kind — dark 전용 radial vignette (Figma showroom-b dark) */\n overlayDarkRadial?: boolean\n /** image kind — 장식 이미지 대체 텍스트 (빈 문자열이면 aria-hidden) */\n alt?: string\n className?: string\n}\n\nfunction overlayStyle(overlay?: number): CSSProperties | undefined {\n if (overlay == null || overlay <= 0) return undefined\n const pct = `${Math.min(100, Math.max(0, overlay * 100))}%`\n return { '--stn-layer0-overlay-opacity': pct } as CSSProperties\n}\n\n/**\n * Layer 0 page background — 프리셋은 `variant`, 단색은 `color`, 임의 URL은 `src`.\n * `src` + `srcDark` 를 같이 주면 `data-theme` 에 맞춰 전환합니다.\n */\nexport function StnLayer0Background({\n variant,\n kind: kindProp,\n color = 'default',\n src: srcProp,\n srcDark: srcDarkProp,\n overlay: overlayProp,\n overlayDarkRadial: overlayDarkRadialProp,\n alt = '',\n className,\n style,\n ...rest\n}: StnLayer0BackgroundProps) {\n let src = srcProp\n let srcDark = srcDarkProp\n let overlay = overlayProp\n let overlayDarkRadial = overlayDarkRadialProp\n let isPresetImage = false\n\n if (variant && variant !== 'none' && (variant as string) !== 'color') {\n isPresetImage = true\n if (variant === 'dashboard') {\n src = src ?? STN_LAYER0_BACKGROUND_DEMO_IMAGES.dashboard\n srcDark = srcDark ?? STN_LAYER0_BACKGROUND_DEMO_IMAGES.dashboardDark\n } else if (variant === 'showroom-a') {\n src = src ?? STN_LAYER0_BACKGROUND_DEMO_IMAGES.showroomA\n srcDark = srcDark ?? STN_LAYER0_BACKGROUND_DEMO_IMAGES.showroomADark\n } else if (variant === 'showroom-b') {\n src = src ?? STN_LAYER0_BACKGROUND_DEMO_IMAGES.showroomB\n srcDark = srcDark ?? STN_LAYER0_BACKGROUND_DEMO_IMAGES.showroomBDark\n overlayDarkRadial = overlayDarkRadial ?? true\n } else if (variant === 'login') {\n src = src ?? STN_LAYER0_BACKGROUND_DEMO_IMAGES.login\n srcDark = srcDark ?? STN_LAYER0_BACKGROUND_DEMO_IMAGES.loginDark\n } else if (variant === 'map-light') {\n src = src ?? STN_LAYER0_BACKGROUND_DEMO_IMAGES.mapLight\n srcDark = srcDark ?? STN_LAYER0_BACKGROUND_DEMO_IMAGES.mapDark\n overlay = overlay ?? STN_LAYER0_MAP_LIGHT_OVERLAY\n }\n }\n\n const kind = kindProp ?? (isPresetImage ? 'image' : undefined)\n const isImage = kind === 'image' || Boolean(src || srcDark)\n if (isImage) {\n const paired = Boolean(src && srcDark)\n return (\n <div\n className={cn('stn-layer0-bg', 'image', className)}\n aria-hidden={alt === '' ? true : undefined}\n style={{ ...overlayStyle(overlay), ...style }}\n {...rest}\n >\n <div className=\"stn-layer0-bg__media\">\n {src ? (\n <img\n className={cn('stn-layer0-bg__img', paired && 'light')}\n src={src}\n alt={alt}\n decoding=\"async\"\n />\n ) : null}\n {srcDark ? (\n <img\n className={cn('stn-layer0-bg__img', paired ? 'dark' : undefined)}\n src={srcDark}\n alt={alt}\n decoding=\"async\"\n />\n ) : null}\n {overlay != null && overlay > 0 ? (\n <div className=\"stn-layer0-bg__overlay\" aria-hidden=\"true\" />\n ) : null}\n {overlayDarkRadial ? (\n <div className=\"stn-layer0-bg__overlay radial\" aria-hidden=\"true\" />\n ) : null}\n </div>\n </div>\n )\n }\n\n return (\n <div\n className={cn('stn-layer0-bg', 'color', color, className)}\n aria-hidden=\"true\"\n style={style}\n {...rest}\n />\n )\n}\n","import {\n Children,\n Fragment,\n cloneElement,\n isValidElement,\n type ButtonHTMLAttributes,\n type CSSProperties,\n type HTMLAttributes,\n type ReactElement,\n type ReactNode,\n} from 'react'\n\nimport {\n normalizeStnWidgetAppearance,\n resolveStnWidgetBackground,\n type StnWidgetAppearance,\n type StnWidgetBackgroundMode,\n type StnWidgetShell,\n} from '@stn-uiux/pub-ui/data/stnWidget'\n\nimport type { StnWidgetGradeRowGrade } from '@stn-uiux/pub-ui/data/stnWidget'\n\nimport { cn } from '../cn'\nimport { StnButton } from './StnButton'\nimport { StnEventBanner, type StnEventBannerSeverity } from './StnEventBanner'\nimport { StnIcon } from './StnIcon'\nimport { StnIconBox, type StnIconBoxProps } from './StnIconBox'\nimport { StnLoadingSkeleton } from '../patterns/scaffold/StnLoadingSkeleton'\nimport { StnTopologyRing, StnTopologyGraph } from './topology'\n\nexport type { StnWidgetAppearance, StnWidgetShell, StnWidgetGradeRowGrade }\n\nexport type StnWidgetBackground = boolean | StnWidgetBackgroundMode\n\nconst SHELL_PUB_CLASS: Record<StnWidgetShell, string> = {\n card: '',\n 'fault-panel': '',\n board: 'widgetboard',\n 'board-item': 'widget_item',\n canvas: 'shell-canvas',\n}\n\nexport type StnWidgetStatus = 'default' | 'critical' | 'major' | 'minor' | 'warning'\nexport type StnWidgetPadding = 'default' | 'compact' | 'none'\n\nexport type StnWidgetProps = Omit<HTMLAttributes<HTMLDivElement>, 'className' | 'title'> & {\n className?: string\n /** Pub 위젯 셸 — card | fault-panel | board | board-item | canvas (맵/토폴로지 마운트 셸) */\n shell?: StnWidgetShell\n /** 위젯 variant 별칭 (shell과 동일: canvas 등 지정 가능) */\n variant?: StnWidgetShell\n /**\n * Figma Widget Container 186:114582 — 설정 시 `background` 대신 appearance 면·그림자 사용\n */\n appearance?: StnWidgetAppearance\n /**\n * 배경 · L1 elevation (`appearance` 미설정 시)\n * - true | 'surface' — surface-widget + shadow\n * - false | 'none' — Pub `none-bg`\n */\n background?: StnWidgetBackground\n /** 위젯 관제/장애 상태 — 'critical' 시 2px 레드 보더 및 네온 글로우 */\n status?: StnWidgetStatus\n /** 심각 장애 상태 편의 플래그 (.critical) */\n isCritical?: boolean\n /** 위젯 종류 id (sample PNG 파일명 · data-stn-widget-kind) */\n kind?: string\n title?: ReactNode\n /** 타이틀 우측에 붙는 뱃지 슬롯 (예: <StnSeverityBadge />) */\n badge?: ReactNode\n titleActions?: ReactNode\n /** Figma 헤더 — 차트 아이콘 (appearance 설정 시 기본 true) */\n showHeaderIcon?: boolean\n /** Iconography slug — `line/chart-histogram` 등 (`headerIcon` 미지정 시) */\n headerIconName?: string\n headerIcon?: ReactNode\n /** Figma 헤더 — 우측 슬롯: plain text (`periodLabel`) 또는 `periodActions` / `PeriodSelect` · `PeriodPager` */\n periodLabel?: ReactNode\n periodActions?: ReactNode\n /** card 셸 본문 — ds-widget-item__con */\n contentClassName?: string\n /** 내부 여백 모드 — 기본(12px), compact(8px), none(0px) */\n padding?: StnWidgetPadding\n /** padding: 0 (Pub none-bg 차트 위젯) */\n noPadding?: boolean\n /** 로딩 상태 여부 */\n loading?: boolean\n /** 빈 상태 여부 */\n empty?: boolean\n /** 빈 상태 안내 문구 */\n emptyMessage?: ReactNode\n /** 하단 푸터 슬롯 */\n footer?: ReactNode\n /**\n * 카드 바깥에 붙는 플로팅 슬롯. `StnEventBanner`면 `status`와 같은 위험도로 맞춥니다.\n */\n banner?: ReactNode\n /** hover 애니메이션 및 인터랙션 유무 */\n interactive?: boolean\n /** 문서용 hover 상태 고정 (appearance map · translucent) */\n docHover?: boolean\n /** 너비 100% 채움 여부 (기본: true) */\n fullWidth?: boolean\n /** 높이 100% 채움 여부 (기본: true) */\n fullHeight?: boolean\n /** 헤더 우측 컨트롤이 많을 때 아랫줄로 개행(2행 구조) 허용 여부 (기본: false, 1줄 말줄임) */\n wrapActions?: boolean\n children?: ReactNode\n}\n\n/** appearance는 셸 면만 변경 — 헤더 IconBox 기본 sm */\nfunction defaultHeaderIconName(_appearance?: StnWidgetAppearance): string {\n return 'line/chart-histogram'\n}\n\nfunction bannerSeverityFromStatus(status: StnWidgetStatus, isCritical: boolean): StnEventBannerSeverity | undefined {\n if (isCritical || status === 'critical') return 'critical'\n if (status === 'major') return 'major'\n if (status === 'minor') return 'minor'\n if (status === 'warning') return 'warning'\n return undefined\n}\n\nfunction withBannerSeverity(banner: ReactNode, severity: StnEventBannerSeverity | undefined) {\n if (!severity || !isValidElement(banner) || banner.type !== StnEventBanner) return banner\n return cloneElement(banner as ReactElement<{ severity?: StnEventBannerSeverity }>, { severity })\n}\n\ntype StnWidgetSlotName = 'header' | 'body' | 'footer'\n\nfunction markWidgetSlot<T extends (...args: never[]) => ReactNode>(component: T, slot: StnWidgetSlotName): T {\n ;(component as T & { __stnWidgetSlot?: StnWidgetSlotName }).__stnWidgetSlot = slot\n return component\n}\n\nfunction readWidgetSlot(type: unknown): StnWidgetSlotName | null {\n if (type == null || (typeof type !== 'function' && typeof type !== 'object')) return null\n const slot = (type as { __stnWidgetSlot?: string }).__stnWidgetSlot\n return slot === 'header' || slot === 'body' || slot === 'footer' ? slot : null\n}\n\nfunction flattenWidgetChildren(children: ReactNode): ReactNode[] {\n const out: ReactNode[] = []\n Children.forEach(children, (child) => {\n if (isValidElement(child) && child.type === Fragment) {\n const fragmentProps = child.props as { children?: ReactNode }\n out.push(...flattenWidgetChildren(fragmentProps.children))\n return\n }\n out.push(child)\n })\n return out\n}\n\ntype WidgetSlotElement = ReactElement<{ className?: string; style?: CSSProperties; children?: ReactNode }>\n\ntype WidgetChildSlots = {\n headers: WidgetSlotElement[]\n bodies: WidgetSlotElement[]\n footers: WidgetSlotElement[]\n rest: ReactNode[]\n}\n\nfunction partitionWidgetChildren(children: ReactNode): WidgetChildSlots {\n const slots: WidgetChildSlots = { headers: [], bodies: [], footers: [], rest: [] }\n for (const child of flattenWidgetChildren(children)) {\n if (child == null || child === false || child === true) continue\n if (isValidElement(child)) {\n const slot = readWidgetSlot(child.type)\n if (slot === 'header') {\n slots.headers.push(child as WidgetSlotElement)\n continue\n }\n if (slot === 'body') {\n slots.bodies.push(child as WidgetSlotElement)\n continue\n }\n if (slot === 'footer') {\n slots.footers.push(child as WidgetSlotElement)\n continue\n }\n }\n slots.rest.push(child)\n }\n return slots\n}\n\nfunction mergeBodySlot(\n body: ReactElement<{ className?: string; style?: CSSProperties; children?: ReactNode }>,\n extra: ReactNode[],\n contentClassName: string | undefined,\n isEmptyState: boolean,\n emptyStyle: CSSProperties | undefined,\n) {\n const prev = body.props\n return cloneElement(\n body,\n {\n className: cn(prev.className, contentClassName, isEmptyState && 'empty'),\n style: emptyStyle ? { ...emptyStyle, ...prev.style } : prev.style,\n },\n extra.length > 0 ? [prev.children, ...extra] : prev.children,\n )\n}\n\n/** 헤더 우측 — title과 동일 타이포의 plain text */\nexport function StnWidgetPeriodText({\n children,\n className,\n ...rest\n}: { children: ReactNode } & HTMLAttributes<HTMLSpanElement>) {\n return (\n <span className={cn('stn-widget__period-text', className)} {...rest}>\n {children}\n </span>\n )\n}\n\n/** 헤더 우측 — 드롭다운(라벨 + chevron). 메뉴는 `onClick` · 외부 Dropdown 연결 */\nexport function StnWidgetPeriodSelect({\n label,\n className,\n ...rest\n}: { label: ReactNode } & Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'color'>) {\n return (\n <StnButton\n variant=\"ghost\"\n size=\"sm\"\n shape=\"square\"\n icon={<StnIcon name=\"line/chevron-down\" />}\n iconPosition=\"right\"\n className={className}\n {...rest}\n >\n {label}\n </StnButton>\n )\n}\n\n/** 헤더 우측 — 이전/다음 화살표 + 가운데 라벨 */\nexport function StnWidgetPeriodPager({\n label,\n className,\n onPrev,\n onNext,\n prevLabel = '이전',\n nextLabel = '다음',\n ...rest\n}: {\n label: ReactNode\n className?: string\n onPrev?: () => void\n onNext?: () => void\n prevLabel?: string\n nextLabel?: string\n} & HTMLAttributes<HTMLDivElement>) {\n return (\n <div className={cn('stn-widget__period-pager', className)} {...rest}>\n <StnButton\n variant=\"ghost\"\n size=\"sm\"\n shape=\"square\"\n icon={<StnIcon name=\"line/arrow-narrow-left\" />}\n onClick={onPrev}\n aria-label={prevLabel}\n />\n <span className=\"stn-widget__period-pager-label\">{label}</span>\n <StnButton\n variant=\"ghost\"\n size=\"sm\"\n shape=\"square\"\n icon={<StnIcon name=\"line/arrow-narrow-right\" />}\n onClick={onNext}\n aria-label={nextLabel}\n />\n </div>\n )\n}\n\nfunction StnWidgetHeaderInner({\n appearance,\n title,\n badge,\n titleActions,\n periodLabel,\n periodActions,\n showHeaderIcon,\n headerIconName,\n headerIcon,\n wrapActions = false,\n}: {\n title?: ReactNode\n badge?: ReactNode\n titleActions?: ReactNode\n periodLabel?: ReactNode\n periodActions?: ReactNode\n showHeaderIcon: boolean\n headerIconName?: string\n headerIcon?: ReactNode\n appearance: StnWidgetAppearance\n wrapActions?: boolean\n}) {\n const resolvedIconName = headerIconName ?? defaultHeaderIconName(appearance)\n\n return (\n <div className={cn('stn-widget__head', wrapActions && 'stn-widget__head--wrap')}>\n <div className=\"stn-widget__head-start\">\n {showHeaderIcon ? (\n headerIcon != null ? (\n <StnWidgetInsetIcon size=\"sm\">{headerIcon}</StnWidgetInsetIcon>\n ) : resolvedIconName ? (\n <StnWidgetInsetIcon size=\"sm\" icon={resolvedIconName} />\n ) : null\n ) : null}\n {title != null || badge != null ? (\n typeof title === 'string' || title == null ? (\n <div className=\"stn-widget__title-wrap\">\n {typeof title === 'string' ? (\n <p className=\"stn-widget__title\" title={title}>\n {title}\n </p>\n ) : null}\n {badge}\n </div>\n ) : (\n <>\n {title}\n {badge}\n </>\n )\n ) : null}\n </div>\n {titleActions != null || periodActions != null || (periodLabel != null && periodLabel !== '') ? (\n <div className=\"stn-widget__head-end\">\n {titleActions ??\n (periodActions != null ? (\n periodActions\n ) : periodLabel != null && periodLabel !== '' ? (\n <StnWidgetPeriodText>{periodLabel}</StnWidgetPeriodText>\n ) : null)}\n </div>\n ) : null}\n </div>\n )\n}\n\nexport function StnWidgetRoot({\n shell: shellProp,\n variant,\n appearance,\n background,\n status = 'default',\n isCritical = false,\n kind,\n title,\n badge,\n titleActions,\n showHeaderIcon,\n headerIconName,\n headerIcon,\n periodLabel,\n periodActions,\n children,\n className,\n contentClassName,\n padding = 'default',\n noPadding = false,\n loading = false,\n empty = false,\n emptyMessage,\n footer,\n banner,\n interactive = false,\n docHover = false,\n fullWidth = true,\n fullHeight = true,\n wrapActions = false,\n style,\n ...rest\n}: StnWidgetProps) {\n const shell = variant ?? shellProp ?? 'card'\n const isCanvas = shell === 'canvas'\n const isFigmaShell = appearance != null\n const appearanceShell = appearance != null ? normalizeStnWidgetAppearance(appearance) : undefined\n const defaultBg = isCanvas ? false : true\n const bgMode = resolveStnWidgetBackground(background ?? defaultBg)\n const pubShell = SHELL_PUB_CLASS[shell]\n const resolvedShowIcon = showHeaderIcon ?? (isFigmaShell && !isCanvas)\n const resolvedCritical = isCritical || status === 'critical'\n const emptyText = typeof empty === 'string' ? empty : emptyMessage\n const isEmptyState = Boolean(empty)\n const emptyStyle: CSSProperties | undefined = emptyText\n ? { ['--stn-widget-empty-text' as string]: `\"${emptyText}\"` }\n : undefined\n\n const rootClass = cn(\n 'stn-widget',\n pubShell,\n /* appearance: translucent / solid / line / transparent / overlay */\n appearanceShell,\n appearanceShell && docHover && 'doc-hover',\n /* background=false → no-bg (default는 surface) */\n !appearanceShell && bgMode !== 'surface' && 'no-bg',\n (noPadding || padding === 'none') && 'padding-none',\n padding === 'compact' && 'padding-compact',\n resolvedCritical && 'critical',\n status === 'major' && 'major',\n (status === 'minor' || status === 'warning') && 'minor',\n interactive && 'interactive',\n isEmptyState && 'empty',\n wrapActions && 'stn-widget--wrap-actions',\n !fullWidth && 'stn-widget--fit-width',\n !fullHeight && 'stn-widget--fit-height',\n className,\n )\n\n const rootProps = {\n className: rootClass,\n style,\n 'data-stn-widget': 'react',\n 'data-stn-widget-shell': shell,\n 'data-stn-widget-background': appearance ?? bgMode,\n ...(appearance ? { 'data-stn-widget-appearance': appearance } : {}),\n ...(kind ? { 'data-stn-widget-kind': kind } : {}),\n ...rest,\n }\n\n const slots = partitionWidgetChildren(children)\n\n const propHead =\n shell === 'fault-panel' && !isFigmaShell ? (\n title != null || titleActions ? (\n <div className=\"app_bar\">\n <div className=\"fault_title_box\">{typeof title === 'string' ? <span>{title}</span> : title}</div>\n {titleActions}\n </div>\n ) : null\n ) : shell === 'board' || shell === 'board-item' ? (\n title != null ? (\n <div className=\"stn-widget__head\">{typeof title === 'string' ? <p>{title}</p> : title}</div>\n ) : null\n ) : isFigmaShell ? (\n <StnWidgetHeaderInner\n appearance={appearance}\n title={title}\n badge={badge}\n titleActions={titleActions}\n periodLabel={periodLabel}\n periodActions={periodActions}\n showHeaderIcon={resolvedShowIcon}\n headerIconName={headerIconName}\n headerIcon={headerIcon}\n wrapActions={wrapActions}\n />\n ) : title != null || badge != null || titleActions ? (\n <div className={cn('stn-widget__head', wrapActions && 'stn-widget__head--wrap')}>\n <div className=\"stn-widget__head-start\">\n {title != null ? (\n typeof title === 'string' ? (\n <p className=\"stn-widget__title\" title={title}>\n {title}\n </p>\n ) : (\n title\n )\n ) : null}\n {badge}\n </div>\n {titleActions ? <div className=\"stn-widget__head-end\">{titleActions}</div> : null}\n </div>\n ) : null\n\n const head = slots.headers.length > 0 ? slots.headers : propHead\n const autoBodyClass = shell === 'fault-panel' && !isFigmaShell ? 'table_area' : undefined\n\n let body: ReactNode\n if (loading) {\n body = (\n <div className={cn('stn-widget__body', autoBodyClass, contentClassName)}>\n <StnWidgetLoading />\n </div>\n )\n } else if (slots.bodies.length > 0) {\n body = slots.bodies.map((slot, index) =>\n mergeBodySlot(slot, index === 0 ? slots.rest : [], contentClassName, isEmptyState, emptyStyle),\n )\n } else {\n body = (\n <div className={cn('stn-widget__body', autoBodyClass, isEmptyState && 'empty', contentClassName)} style={emptyStyle}>\n {slots.rest}\n </div>\n )\n }\n\n const footerNode =\n slots.footers.length > 0 ? slots.footers : footer ? <div className=\"stn-widget__footer\">{footer}</div> : null\n\n const card = (\n <div {...rootProps}>\n {isFigmaShell && appearanceShell === 'overlay' ? <div className=\"stn-widget__map-deco\" aria-hidden /> : null}\n {head}\n {body}\n {footerNode}\n </div>\n )\n\n if (banner == null || banner === false) return card\n\n return (\n <div className=\"stn-widget-anchor\">\n {withBannerSeverity(banner, bannerSeverityFromStatus(status, isCritical))}\n {card}\n </div>\n )\n}\n\nexport type StnWidgetHeaderProps = HTMLAttributes<HTMLDivElement> & {\n /** 헤더 우측 컨트롤이 많을 때 아랫줄로 개행(2행 구조) 허용 여부 */\n wrap?: boolean\n}\n\nexport function StnWidgetHeader({ className, wrap = false, children, ...rest }: StnWidgetHeaderProps) {\n return (\n <div className={cn('stn-widget__head', wrap && 'stn-widget__head--wrap', className)} {...rest}>\n {children}\n </div>\n )\n}\n\nmarkWidgetSlot(StnWidgetHeader, 'header')\n\nexport function StnWidgetTitle({ className, children, title, ...rest }: HTMLAttributes<HTMLHeadingElement>) {\n const titleAttr = title ?? (typeof children === 'string' ? children : undefined)\n return (\n <p className={cn('stn-widget__title', className)} title={titleAttr} {...rest}>\n {children}\n </p>\n )\n}\n\nexport function StnWidgetActions({ className, children, ...rest }: HTMLAttributes<HTMLDivElement>) {\n return (\n <div className={cn('stn-widget__head-end', className)} {...rest}>\n {children}\n </div>\n )\n}\n\nexport type StnWidgetBodyProps = HTMLAttributes<HTMLDivElement> & {\n /** 본문 내부 여백 규격 — 기본 12px, compact 8px, none 0px */\n padding?: StnWidgetPadding\n /** 내용이 넘칠 때 내부 스크롤 활성화 여부 (기본 true) */\n scrollable?: boolean\n /** 본문 서피스 배경 — 'default' | 'canvas' (차트용 다크 캔버스) | 'transparent' | 'subtle' */\n surface?: 'default' | 'canvas' | 'transparent' | 'subtle'\n /** 빈 깡통 슬롯 표시 (점선 테두리 및 'Widget Content Shell' 라벨) */\n empty?: boolean | string\n}\n\nexport function StnWidgetBody({\n padding,\n scrollable = true,\n surface = 'default',\n empty,\n className,\n style,\n children,\n ...rest\n}: StnWidgetBodyProps) {\n const emptyText = typeof empty === 'string' ? empty : undefined\n const mergedStyle = emptyText\n ? { ['--stn-widget-empty-text' as any]: `\"${emptyText}\"`, ...style }\n : style\n\n return (\n <div\n className={cn(\n 'stn-widget__body',\n Boolean(empty) && 'empty',\n padding === 'compact' && 'padding-compact',\n padding === 'none' && 'padding-none',\n surface === 'canvas' && 'stn-widget__body--surface-canvas',\n surface === 'transparent' && 'stn-widget__body--surface-transparent',\n surface === 'subtle' && 'stn-widget__body--surface-subtle',\n !scrollable && 'stn-widget__body--no-scroll',\n className,\n )}\n style={mergedStyle}\n {...rest}\n >\n {children}\n </div>\n )\n}\n\nmarkWidgetSlot(StnWidgetBody, 'body')\n\nexport type StnWidgetChartSlotProps = HTMLAttributes<HTMLDivElement> & {\n label?: string\n}\n\n/** Figma slot — dashed chart mount area */\nexport function StnWidgetChartSlot({ label = 'select chart', className, children, ...rest }: StnWidgetChartSlotProps) {\n return (\n <div className={cn('stn-widget__chart-slot', className)} data-stn-widget-chart-slot {...rest}>\n {children ?? <span className=\"stn-widget__chart-slot-label\">{label}</span>}\n </div>\n )\n}\n\nexport type StnWidgetStatusGrade = 'critical' | 'major' | 'minor' | 'info' | 'normal'\n\nexport type StnWidgetStatusItemProps = HTMLAttributes<HTMLDivElement> & {\n label: ReactNode\n value: ReactNode\n grade?: StnWidgetStatusGrade\n /** @deprecated grade 사용 권장 */\n status?: StnWidgetStatusGrade | 'warning'\n showDot?: boolean\n}\n\nexport function StnWidgetStatusItem({\n label,\n value,\n grade: gradeProp,\n status,\n showDot = true,\n className,\n ...rest\n}: StnWidgetStatusItemProps) {\n const grade = gradeProp ?? (status === 'warning' ? 'minor' : status) ?? 'normal'\n return (\n <div className={cn('stn-widget__status-item', className)} {...rest}>\n <span className=\"stn-widget__status-label\">\n {showDot ? (\n <span\n className={cn('stn-widget__status-dot', `stn-widget__status-dot--${grade}`)}\n aria-hidden=\"true\"\n />\n ) : null}\n {label}\n </span>\n <span className=\"stn-widget__status-val\">{value}</span>\n </div>\n )\n}\n\nexport function StnWidgetStatusList({ className, children, ...rest }: HTMLAttributes<HTMLDivElement>) {\n return (\n <div className={cn('stn-widget__status-list', className)} {...rest}>\n {children}\n </div>\n )\n}\n\nexport function StnWidgetStatGroup({ className, children, ...rest }: HTMLAttributes<HTMLDivElement>) {\n return (\n <div className={cn('stn-widget__stat-group', className)} {...rest}>\n {children}\n </div>\n )\n}\n\nexport type StnWidgetStatCardProps = HTMLAttributes<HTMLDivElement> & {\n label: ReactNode\n count: ReactNode\n}\n\nexport function StnWidgetStatCard({ label, count, className, ...rest }: StnWidgetStatCardProps) {\n return (\n <div className={cn('stn-widget__stat-card', className)} {...rest}>\n <span className=\"stn-widget__stat-label\">{label}</span>\n <span className=\"stn-widget__stat-count\">{count}</span>\n </div>\n )\n}\n\n/** DS · 스토리용 빈 본문 */\nexport function StnWidgetPlaceholder({ label = '콘텐츠 영역' }: { label?: string }) {\n return <div className=\"stn-widget__placeholder\">{label}</div>\n}\n\nconst GRADE_ROW_ICON: Record<StnWidgetGradeRowGrade, string> = {\n critical: 'fill/alert4',\n major: 'fill/alert3',\n minor: 'fill/alert2',\n default: 'fill/alert1',\n}\n\n\nexport type StnWidgetGradeRowProps = HTMLAttributes<HTMLDivElement> & {\n grade: StnWidgetGradeRowGrade\n label: ReactNode\n value: ReactNode\n /** 0–100 — progress bar width · percent label */\n percent: number\n percentLabel?: ReactNode\n}\n\nfunction formatGradePercent(percent: number): string {\n const rounded = Math.round(percent * 10) / 10\n return Number.isInteger(rounded) ? `${rounded}%` : `${rounded.toFixed(1)}%`\n}\n\n/** Figma dark dashboard — grade row + 2px progress bar */\nexport function StnWidgetGradeRow({\n grade,\n label,\n value,\n percent,\n percentLabel,\n className,\n ...rest\n}: StnWidgetGradeRowProps) {\n const clamped = Math.max(0, Math.min(100, percent))\n const resolvedPercentLabel = percentLabel ?? formatGradePercent(clamped)\n\n return (\n <div className={cn('stn-widget__grade-row', `stn-widget__grade-row--${grade}`, className)} {...rest}>\n <div className=\"stn-widget__grade-row-left\">\n <span className=\"stn-widget__grade-row-label\">\n <StnIcon name={GRADE_ROW_ICON[grade]} size={20} className=\"stn-widget__grade-row-icon\" aria-hidden />\n {label}\n </span>\n <div className=\"stn-widget__grade-row-track\" aria-hidden>\n <span className=\"stn-widget__grade-row-fill\" style={{ width: `${clamped}%` }} />\n </div>\n </div>\n <div className=\"stn-widget__grade-row-right\">\n <span className=\"stn-widget__grade-row-value\">{value}</span>\n <span className=\"stn-widget__grade-row-percent\">{resolvedPercentLabel}</span>\n </div>\n </div>\n )\n}\n\nexport function StnWidgetGradeRowList({ className, children, ...rest }: HTMLAttributes<HTMLDivElement>) {\n return (\n <div className={cn('stn-widget__grade-row-list', className)} {...rest}>\n {children}\n </div>\n )\n}\n\nexport function StnWidgetFooter({ className, children, ...rest }: HTMLAttributes<HTMLDivElement>) {\n return (\n <div className={cn('stn-widget__footer', className)} {...rest}>\n {children}\n </div>\n )\n}\n\nmarkWidgetSlot(StnWidgetFooter, 'footer')\n\nexport function StnWidgetEmpty({ className, children, ...rest }: HTMLAttributes<HTMLDivElement>) {\n return (\n <div className={cn('stn-widget__empty', className)} {...rest}>\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\" style={{ opacity: 0.6 }}>\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\" />\n </svg>\n <div>{children ?? '데이터가 없습니다.'}</div>\n </div>\n )\n}\n\nexport interface StnWidgetLoadingProps extends HTMLAttributes<HTMLDivElement> {\n lines?: number\n}\n\nexport function StnWidgetLoading({ lines = 3, className, children, ...rest }: StnWidgetLoadingProps) {\n return (\n <div className={cn('stn-widget__loading', className)} {...rest}>\n {children ?? <StnLoadingSkeleton.Widget lines={lines} />}\n </div>\n )\n}\n\nexport type StnWidgetInsetIconProps = StnIconBoxProps\n\n/** 위젯 헤더 아이콘 슬롯 — `StnIconBox` (기본 size=`sm`) */\nexport function StnWidgetInsetIcon({ className, size = 'sm', ...rest }: StnWidgetInsetIconProps) {\n return <StnIconBox size={size} className={cn('stn-widget__inset-icon', className)} {...rest} />\n}\n\nexport const StnWidget = Object.assign(StnWidgetRoot, {\n Header: StnWidgetHeader,\n Title: StnWidgetTitle,\n Actions: StnWidgetActions,\n Body: StnWidgetBody,\n Footer: StnWidgetFooter,\n Empty: StnWidgetEmpty,\n Loading: StnWidgetLoading,\n InsetIcon: StnWidgetInsetIcon,\n ChartSlot: StnWidgetChartSlot,\n PeriodText: StnWidgetPeriodText,\n PeriodSelect: StnWidgetPeriodSelect,\n PeriodPager: StnWidgetPeriodPager,\n StatusList: StnWidgetStatusList,\n StatusItem: StnWidgetStatusItem,\n StatGroup: StnWidgetStatGroup,\n StatCard: StnWidgetStatCard,\n GradeRowList: StnWidgetGradeRowList,\n GradeRow: StnWidgetGradeRow,\n Placeholder: StnWidgetPlaceholder,\n TopologyRing: StnTopologyRing,\n TopologyGraph: StnTopologyGraph,\n})\n","import React from 'react'\nimport { cn } from '../cn'\n\nimport { StnIcon } from './StnIcon'\n\nexport type StnEventBannerPlacement = 'top' | 'bottom' | 'inline'\nexport type StnEventBannerSeverity = 'critical' | 'major' | 'minor' | 'warning'\n/** 위젯과 배너 사이. 시맨틱 스페이스 토큰 space-0 / 4 / 8 / 16. 기본은 `--stn-spacing-event-banner-gap` */\nexport type StnEventBannerGap = 0 | 4 | 8 | 16\n\nexport interface StnEventBannerProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {\n /** 위험도 레벨: 'critical' | 'major' | 'minor' | 'warning' (기본값: 'critical') */\n severity?: StnEventBannerSeverity\n /** 경보 메인 타이틀 (예: 'DISK 임계치 92.4% 초과', 'CPU/MEM 자원 사용률 초과') */\n title?: React.ReactNode\n /** 발생 시간 또는 부가 정보 (예: '발생 시간 09:25:11') */\n time?: React.ReactNode\n /** 우측 액션 버튼 텍스트 (예: '이벤트 정보') */\n actionText?: React.ReactNode\n /** 우측 액션 버튼 클릭 핸들러 */\n onAction?: (e: React.MouseEvent<HTMLButtonElement>) => void\n /** 커스텀 좌측 아이콘 (미지정 시 위험도별 기본 시스템 아이콘) */\n icon?: React.ReactNode\n /** 배치. top/bottom은 위젯 바깥 위·아래에 자리를 차지하지 않음. inline은 흐름 안에 둠 */\n placement?: StnEventBannerPlacement\n /** 위젯과의 간격. 0=붙임, 4/8/16은 `--stn-space-*`. 생략하면 `--stn-spacing-event-banner-gap` */\n gap?: StnEventBannerGap\n /** 네온 인셋 숨쉬기 애니메이션 활성화 여부 (기본값: true) */\n blink?: boolean\n /** 우측 추가 커스텀 액션 컨트롤 */\n actions?: React.ReactNode\n /** 닫기 버튼 핸들러 (지정 시 닫기 버튼 노출) */\n onClose?: (e: React.MouseEvent<HTMLButtonElement>) => void\n /** 추가 클래스 */\n className?: string\n /** 인라인 스타일 */\n style?: React.CSSProperties\n}\n\nconst SEVERITY_ICONS: Record<StnEventBannerSeverity, string> = {\n critical: 'fill/alert4',\n major: 'fill/alert3',\n minor: 'fill/alert2',\n warning: 'fill/alert1',\n}\n\n/** 기본 경고 삼각 아이콘 */\nfunction DefaultTriangleIcon() {\n return (\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <path\n d=\"M10.29 3.86L1.82 18A2 2 0 0 0 3.54 21H20.46A2 2 0 0 0 22.18 18L13.71 3.86A2 2 0 0 0 10.29 3.86Z\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n <circle cx=\"12\" cy=\"17\" r=\"1\" fill=\"currentColor\" />\n </svg>\n )\n}\n\nfunction resolveDefaultIcon(severity: StnEventBannerSeverity) {\n if (severity === 'critical') {\n return <DefaultTriangleIcon />\n }\n return <StnIcon name={SEVERITY_ICONS[severity] || 'fill/alert4'} size={20} />\n}\n\n/** 위험도별 이벤트 배너. placement와 severity로 배치·스타일을 고릅니다. */\nexport const StnEventBanner = React.forwardRef<HTMLDivElement, StnEventBannerProps>(\n (\n {\n severity = 'critical',\n title = 'DISK 임계치 92.4% 초과',\n time,\n actionText = '이벤트 정보',\n onAction,\n icon,\n placement = 'top',\n gap,\n blink = true,\n actions,\n onClose,\n className,\n id,\n ...restProps\n },\n ref\n ) => {\n return (\n <div\n ref={ref}\n id={id}\n role=\"alert\"\n aria-live=\"assertive\"\n className={cn(\n 'stn-event-banner',\n placement,\n severity,\n !blink && 'no-blink',\n gap != null && `gap-${gap}`,\n className\n )}\n {...restProps}\n >\n <div className=\"stn-event-banner__left\">\n <div className=\"stn-event-banner__icon-wrap\">\n {icon ?? resolveDefaultIcon(severity)}\n </div>\n <div className=\"stn-event-banner__text\">\n {title && (\n <span className=\"stn-event-banner__title\" title={typeof title === 'string' ? title : undefined}>\n {title}\n </span>\n )}\n {time && (\n <span className=\"stn-event-banner__time\" title={typeof time === 'string' ? time : undefined}>\n {time}\n </span>\n )}\n </div>\n </div>\n\n <div className=\"stn-event-banner__actions\">\n {actions}\n {actionText && (\n <button\n type=\"button\"\n className=\"stn-event-banner__btn\"\n onClick={onAction}\n >\n {actionText}\n </button>\n )}\n {onClose && (\n <button\n type=\"button\"\n className=\"stn-event-banner__btn\"\n onClick={onClose}\n aria-label=\"배너 닫기\"\n >\n 닫기\n </button>\n )}\n </div>\n </div>\n )\n }\n)\n\nStnEventBanner.displayName = 'StnEventBanner'\n","import type { CSSProperties, HTMLAttributes, ReactNode } from 'react'\n\nimport { cn } from '../../cn'\n\nexport type StnLoadingSkeletonVariant =\n | 'line'\n | 'circle'\n | 'block'\n | 'profile'\n | 'widget'\n | 'table'\n\nexport type StnLoadingSkeletonLineProps = HTMLAttributes<HTMLDivElement> & {\n width?: 'full' | 'medium' | 'short'\n className?: string\n style?: CSSProperties\n}\n\nexport function StnLoadingSkeletonLine({ width = 'full', className, style, ...rest }: StnLoadingSkeletonLineProps) {\n return (\n <div\n className={cn(\n 'stn-loading-skeleton__line',\n width === 'medium' && 'stn-loading-skeleton__line--medium',\n width === 'short' && 'stn-loading-skeleton__line--short',\n className,\n )}\n style={style}\n aria-hidden\n {...rest}\n />\n )\n}\n\nexport type StnLoadingSkeletonBlockProps = HTMLAttributes<HTMLDivElement> & {\n minHeight?: number | string\n className?: string\n style?: CSSProperties\n}\n\nexport function StnLoadingSkeletonBlock({ minHeight = 48, className, style, ...rest }: StnLoadingSkeletonBlockProps) {\n return (\n <div\n className={cn('stn-loading-skeleton__block', className)}\n style={{ minHeight, ...style }}\n aria-hidden\n {...rest}\n />\n )\n}\n\nexport type StnLoadingSkeletonCircleProps = HTMLAttributes<HTMLDivElement> & {\n size?: number\n className?: string\n style?: CSSProperties\n}\n\nexport function StnLoadingSkeletonCircle({ size = 40, className, style, ...rest }: StnLoadingSkeletonCircleProps) {\n return (\n <div\n className={cn('stn-loading-skeleton__circle', className)}\n style={{ width: size, height: size, ...style }}\n aria-hidden\n {...rest}\n />\n )\n}\n\nexport type StnLoadingSkeletonProfileProps = HTMLAttributes<HTMLDivElement> & {\n /** 아바타 원형 크기 (기본: 40px) */\n avatarSize?: number\n className?: string\n style?: CSSProperties\n}\n\nexport function StnLoadingSkeletonProfile({ avatarSize = 40, className, style, ...rest }: StnLoadingSkeletonProfileProps) {\n return (\n <div\n className={cn('stn-loading-skeleton--profile', className)}\n style={style}\n aria-busy=\"true\"\n aria-label=\"프로필 로딩 중\"\n {...rest}\n >\n <StnLoadingSkeletonCircle size={avatarSize} />\n <div className=\"stn-loading-skeleton__profile-content\">\n <StnLoadingSkeletonLine width=\"medium\" />\n <StnLoadingSkeletonLine width=\"short\" />\n </div>\n </div>\n )\n}\n\nexport type StnLoadingSkeletonWidgetProps = HTMLAttributes<HTMLDivElement> & {\n lines?: number\n className?: string\n style?: CSSProperties\n}\n\n/** 위젯 본문 로딩 — StnWidget children 자리 */\nexport function StnLoadingSkeletonWidget({ lines = 4, className, style, ...rest }: StnLoadingSkeletonWidgetProps) {\n return (\n <div\n className={cn('stn-loading-skeleton', 'stn-loading-skeleton--widget', className)}\n style={style}\n aria-busy=\"true\"\n aria-label=\"로딩 중\"\n {...rest}\n >\n {Array.from({ length: lines }, (_, i) => (\n <StnLoadingSkeletonLine key={i} width={i % 3 === 0 ? 'short' : i % 2 === 0 ? 'medium' : 'full'} />\n ))}\n </div>\n )\n}\n\nexport type StnLoadingSkeletonTableProps = HTMLAttributes<HTMLDivElement> & {\n rows?: number\n cols?: number\n className?: string\n style?: CSSProperties\n}\n\nexport function StnLoadingSkeletonTable({ rows = 5, cols = 4, className, style, ...rest }: StnLoadingSkeletonTableProps) {\n return (\n <div\n className={cn('stn-loading-skeleton', 'stn-loading-skeleton--table', className)}\n style={{ ...style, ['--stn-skeleton-cols' as string]: String(cols) }}\n aria-busy=\"true\"\n aria-label=\"테이블 로딩 중\"\n {...rest}\n >\n {Array.from({ length: rows }, (_, row) => (\n <div key={row} className=\"stn-loading-skeleton__table-row\">\n {Array.from({ length: cols }, (_, col) => (\n <StnLoadingSkeletonLine key={col} />\n ))}\n </div>\n ))}\n </div>\n )\n}\n\nexport type StnLoadingSkeletonProps = HTMLAttributes<HTMLDivElement> & {\n /**\n * 스켈레톤 형태:\n * - 'line': 텍스트 라인 (기본)\n * - 'circle': 원형 아바타 / 아이콘\n * - 'block': 카드 / 차트 / 배너 면 영역\n * - 'profile': 아바타 + 2줄 텍스트 복합 프리셋\n * - 'widget': 위젯용 다중 라인\n * - 'table': 그리드형 테이블 프리셋\n */\n variant?: StnLoadingSkeletonVariant\n /** variant=\"line\" 전용: 가로 너비 ('full' | 'medium' | 'short') */\n width?: 'full' | 'medium' | 'short'\n /** variant=\"circle\" 및 \"profile\" 아바타 크기 (px) */\n size?: number\n avatarSize?: number\n /** variant=\"block\" 전용: 최소 높이 (px 또는 string) */\n minHeight?: number | string\n /** variant=\"widget\" 전용: 라인 수 */\n lines?: number\n /** variant=\"table\" 전용: 행/열 수 */\n rows?: number\n cols?: number\n className?: string\n style?: CSSProperties\n children?: ReactNode\n}\n\n/**\n * StnLoadingSkeleton\n * 단일 컴포넌트에 variant prop을 지정하거나, children을 넘겨 복합 레이아웃 컨테이너로 사용합니다.\n * 하위 호환을 위해 StnLoadingSkeleton.Line 등의 서브컴포넌트도 동일하게 지원합니다.\n */\nfunction StnLoadingSkeletonRoot({\n variant,\n width,\n size,\n avatarSize,\n minHeight,\n lines,\n rows,\n cols,\n children,\n className,\n style,\n ...rest\n}: StnLoadingSkeletonProps) {\n // children이 제공되면 커스텀 스켈레톤을 묶는 컨테이너로 동작\n if (children != null) {\n return (\n <div className={cn('stn-loading-skeleton', className)} style={style} aria-busy=\"true\" {...rest}>\n {children}\n </div>\n )\n }\n\n // variant에 따라 해당 원자/프리셋 렌더링 (기본값: 'line')\n const resolvedVariant = variant ?? 'line'\n\n switch (resolvedVariant) {\n case 'circle':\n return <StnLoadingSkeletonCircle size={size} className={className} style={style} {...rest} />\n case 'block':\n return <StnLoadingSkeletonBlock minHeight={minHeight} className={className} style={style} {...rest} />\n case 'profile':\n return <StnLoadingSkeletonProfile avatarSize={avatarSize ?? size} className={className} style={style} {...rest} />\n case 'widget':\n return <StnLoadingSkeletonWidget lines={lines} className={className} style={style} {...rest} />\n case 'table':\n return <StnLoadingSkeletonTable rows={rows} cols={cols} className={className} style={style} {...rest} />\n case 'line':\n default:\n return <StnLoadingSkeletonLine width={width} className={className} style={style} {...rest} />\n }\n}\n\n/** 로딩 스켈레톤 UI — 단일 컴포넌트(<StnLoadingSkeleton variant=\"...\" />) 또는 서브컴포넌트 네임스페이스 지원 */\nexport const StnLoadingSkeleton = Object.assign(StnLoadingSkeletonRoot, {\n Line: StnLoadingSkeletonLine,\n Block: StnLoadingSkeletonBlock,\n Circle: StnLoadingSkeletonCircle,\n Profile: StnLoadingSkeletonProfile,\n Widget: StnLoadingSkeletonWidget,\n Table: StnLoadingSkeletonTable,\n})\n\n/** 레거시 RootProps 호환 alias */\nexport type StnLoadingSkeletonRootProps = StnLoadingSkeletonProps\n","import { useId, type CSSProperties, type HTMLAttributes } from 'react'\nimport { cn } from '../../cn'\nimport { StnTopologyNodeMark } from './StnTopologyNodeMark'\nimport {\n ringOrbitRadius,\n STN_TOPOLOGY_STATUS_COLORS,\n type StnTopologyCore,\n type StnTopologyNode,\n type StnTopologyNodeSize,\n type StnTopologyNodeStatus,\n} from './stnTopologyShared'\n\nexport type {\n StnTopologyCore,\n StnTopologyNode,\n StnTopologyNodeContent,\n StnTopologyNodeIcon,\n StnTopologyNodeShape,\n StnTopologyNodeSize,\n StnTopologyNodeStatus,\n} from './stnTopologyShared'\n\nexport type StnTopologyRingProps = Omit<HTMLAttributes<HTMLDivElement>, 'title'> & {\n /** 중앙 코어 노드 정보 */\n core?: StnTopologyCore\n /** 둘레 궤도 상의 관제 노드 목록 */\n nodes?: StnTopologyNode[]\n /** 궤도(링) 개수 (기본 3단계 동심원) */\n ringCount?: number\n /** 메인 궤도 반경 (SVG 단위, 기본 115) */\n orbitRadius?: number\n /** 궤도 간격 (기본 36) */\n ringGap?: number\n /** 노드 기본 크기 */\n nodeSize?: StnTopologyNodeSize\n /** 중앙 연결 선 스타일 */\n connectionLineStyle?: 'solid' | 'dashed' | 'none'\n /** 선택 하이라이트 노드 id */\n selectedId?: string\n /** 노드 클릭 핸들러 */\n onNodeClick?: (node: StnTopologyNode) => void\n /** 스켈레톤 로딩 상태 */\n loading?: boolean\n className?: string\n style?: CSSProperties\n}\n\n/**\n * StnTopologyRing — 종합 관제 원형 궤도 토폴로지\n *\n * - 동심원 궤도 (orbitRadius · ringCount · 노드별 orbit)\n * - 노드 크기(xs~lg) · 모양(circle/hexagon/diamond/square) · 상태색\n * - 본문 타입: 아이콘 또는 수량 숫자\n */\nexport function StnTopologyRing({\n core = {\n title: '에스티엔인포텍',\n subTitle: 'STN',\n status: 'normal',\n statusLabel: '정상',\n },\n nodes = [],\n ringCount = 3,\n orbitRadius = 115,\n ringGap = 36,\n nodeSize = 'md',\n connectionLineStyle = 'solid',\n selectedId,\n onNodeClick,\n loading = false,\n className,\n style,\n ...rest\n}: StnTopologyRingProps) {\n const gradientId = useId()\n const coreGlowId = useId()\n\n const safeRingCount = Math.max(1, ringCount)\n const radii = Array.from({ length: safeRingCount }, (_, i) =>\n ringOrbitRadius(i + 1, safeRingCount, orbitRadius, ringGap),\n )\n const maxOrbit = Math.max(...radii)\n const vb = Math.max(380, Math.ceil((maxOrbit + 72) * 2))\n const centerX = vb / 2\n const centerY = vb / 2\n\n const coreStatus: StnTopologyNodeStatus = core.status ?? 'normal'\n const coreColor = core.color ?? STN_TOPOLOGY_STATUS_COLORS[coreStatus].main\n const coreStatusLabel = core.statusLabel ?? STN_TOPOLOGY_STATUS_COLORS[coreStatus].label\n const mainOrbit = Math.ceil(safeRingCount / 2)\n\n const calculatedNodes = nodes.map((node, index) => {\n const orbit = node.orbit ?? mainOrbit\n const radius = ringOrbitRadius(orbit, safeRingCount, orbitRadius, ringGap)\n const angleDegree = node.angle ?? index * (360 / Math.max(1, nodes.length)) - 90\n const angleRad = (angleDegree * Math.PI) / 180\n const x = centerX + radius * Math.cos(angleRad)\n const y = centerY + radius * Math.sin(angleRad)\n const status = node.status ?? 'normal'\n const color = node.color ?? STN_TOPOLOGY_STATUS_COLORS[status].main\n const statusLabel = node.statusLabel ?? STN_TOPOLOGY_STATUS_COLORS[status].label\n\n return {\n ...node,\n orbit,\n radius,\n angleDegree,\n x,\n y,\n status,\n color,\n statusLabel,\n }\n })\n\n if (loading) {\n return (\n <div\n className={cn('stn-topology-ring', 'stn-topology-ring--loading', className)}\n style={style}\n {...rest}\n >\n <div className=\"stn-topology-ring__loading-label\">토폴로지 링 데이터를 불러오는 중...</div>\n </div>\n )\n }\n\n return (\n <div\n className={cn('stn-topology-ring', className)}\n style={style}\n data-stn-topology-ring\n data-ring-count={safeRingCount}\n {...rest}\n >\n <svg\n className=\"stn-topology-ring__svg\"\n width=\"100%\"\n height=\"100%\"\n viewBox={`0 0 ${vb} ${vb}`}\n overflow=\"visible\"\n >\n <defs>\n <radialGradient id={coreGlowId} cx=\"50%\" cy=\"50%\" r=\"50%\">\n <stop offset=\"0%\" stopColor=\"#722ed1\" stopOpacity=\"0.8\" />\n <stop offset=\"100%\" stopColor=\"#120338\" stopOpacity=\"0\" />\n </radialGradient>\n <linearGradient id={gradientId} x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"100%\">\n <stop offset=\"0%\" stopColor=\"#00e5ff\" stopOpacity=\"0.4\" />\n <stop offset=\"100%\" stopColor=\"#722ed1\" stopOpacity=\"0.4\" />\n </linearGradient>\n </defs>\n\n {radii.map((r, idx) => {\n const isMain = idx + 1 === mainOrbit\n return (\n <circle\n key={`orbit-${idx}`}\n cx={centerX}\n cy={centerY}\n r={r}\n fill=\"none\"\n stroke={isMain ? `url(#${gradientId})` : 'rgba(255, 255, 255, 0.08)'}\n strokeWidth={isMain ? 1.5 : 1}\n strokeDasharray={isMain ? undefined : '4 4'}\n />\n )\n })}\n\n {connectionLineStyle !== 'none' &&\n calculatedNodes.map((node) => (\n <line\n key={`line-${node.id}`}\n x1={centerX}\n y1={centerY}\n x2={node.x}\n y2={node.y}\n stroke={\n node.status === 'critical'\n ? 'rgba(255, 77, 79, 0.45)'\n : node.status === 'warning' || node.status === 'major'\n ? 'rgba(250, 140, 22, 0.4)'\n : 'rgba(255, 255, 255, 0.12)'\n }\n strokeWidth={node.status === 'critical' ? 1.5 : 1}\n strokeDasharray={connectionLineStyle === 'dashed' ? '3 3' : undefined}\n />\n ))}\n\n <g className=\"stn-topology-ring__core\">\n <circle cx={centerX} cy={centerY} r={54} fill={`url(#${coreGlowId})`} />\n <circle\n cx={centerX}\n cy={centerY}\n r={42}\n fill=\"rgba(12, 14, 28, 0.95)\"\n stroke=\"#722ed1\"\n strokeWidth=\"2\"\n style={{ filter: 'drop-shadow(0 0 12px rgba(114, 46, 209, 0.6))' }}\n />\n {core.subTitle && (\n <text\n x={centerX}\n y={centerY - 10}\n textAnchor=\"middle\"\n fill=\"#00e5ff\"\n fontSize=\"14\"\n fontWeight=\"800\"\n letterSpacing=\"1\"\n >\n {core.subTitle}\n </text>\n )}\n {core.title && (\n <text x={centerX} y={centerY + 8} textAnchor=\"middle\" fill=\"#f0f2f5\" fontSize=\"10\" fontWeight=\"600\">\n {core.title}\n </text>\n )}\n <text x={centerX} y={centerY + 22} textAnchor=\"middle\" fill={coreColor} fontSize=\"9\" fontWeight=\"500\">\n ● {coreStatusLabel}\n </text>\n </g>\n\n {calculatedNodes.map((node) => (\n <StnTopologyNodeMark\n key={node.id}\n x={node.x}\n y={node.y}\n size={node.size ?? nodeSize}\n shape={node.shape ?? 'circle'}\n status={node.status}\n color={node.color}\n content={node.content ?? (node.count != null && !node.icon ? 'count' : 'icon')}\n icon={node.icon}\n count={node.count}\n label={node.label}\n statusLabel={node.statusLabel}\n pulse={node.pulse}\n selected={selectedId === node.id}\n onClick={onNodeClick ? () => onNodeClick(node) : undefined}\n />\n ))}\n </svg>\n </div>\n )\n}\n","import type { ReactNode } from 'react'\n\nexport type StnTopologyNodeStatus = 'normal' | 'minor' | 'major' | 'critical' | 'warning'\n\nexport type StnTopologyNodeShape = 'circle' | 'hexagon' | 'diamond' | 'square'\n\nexport type StnTopologyNodeSize = 'xs' | 'sm' | 'md' | 'lg'\n\n/** 노드 본문 — 아이콘 또는 수량 숫자 */\nexport type StnTopologyNodeContent = 'icon' | 'count'\n\nexport type StnTopologyNodeIcon =\n | 'server'\n | 'cloud'\n | 'ai'\n | 'network'\n | 'shield'\n | 'user'\n | 'database'\n | 'wifi'\n\nexport const STN_TOPOLOGY_NODE_SHAPES: readonly StnTopologyNodeShape[] = [\n 'circle',\n 'hexagon',\n 'diamond',\n 'square',\n]\n\nexport const STN_TOPOLOGY_NODE_SIZES: readonly StnTopologyNodeSize[] = ['xs', 'sm', 'md', 'lg']\n\nexport const STN_TOPOLOGY_NODE_STATUSES: readonly StnTopologyNodeStatus[] = [\n 'normal',\n 'minor',\n 'warning',\n 'major',\n 'critical',\n]\n\nexport const STN_TOPOLOGY_NODE_ICONS: readonly StnTopologyNodeIcon[] = [\n 'server',\n 'cloud',\n 'ai',\n 'network',\n 'shield',\n 'user',\n 'database',\n 'wifi',\n]\n\nexport type StnTopologyStatusTone = {\n main: string\n glow: string\n text: string\n label: string\n}\n\nexport const STN_TOPOLOGY_STATUS_COLORS: Record<StnTopologyNodeStatus, StnTopologyStatusTone> = {\n normal: {\n main: '#52c41a',\n glow: 'rgba(82, 196, 26, 0.35)',\n text: '#95de64',\n label: '정상',\n },\n minor: {\n main: '#fadb14',\n glow: 'rgba(250, 219, 20, 0.5)',\n text: '#ffd666',\n label: '주의',\n },\n warning: {\n main: '#13c2c2',\n glow: 'rgba(19, 194, 194, 0.5)',\n text: '#36cfc9',\n label: '경고',\n },\n major: {\n main: '#fa8c16',\n glow: 'rgba(250, 140, 22, 0.65)',\n text: '#ffa940',\n label: '위험',\n },\n critical: {\n main: '#ff4d4f',\n glow: 'rgba(255, 77, 79, 0.8)',\n text: '#ff7875',\n label: '심각',\n },\n}\n\nexport const STN_TOPOLOGY_NODE_SIZE: Record<\n StnTopologyNodeSize,\n { r: number; icon: number; countFont: number; labelFont: number; statusFont: number; stroke: number }\n> = {\n xs: { r: 9, icon: 10, countFont: 8, labelFont: 9, statusFont: 8, stroke: 1.2 },\n sm: { r: 12, icon: 12, countFont: 10, labelFont: 10, statusFont: 8.5, stroke: 1.4 },\n md: { r: 16, icon: 14, countFont: 13, labelFont: 11, statusFont: 9.5, stroke: 1.8 },\n lg: { r: 22, icon: 18, countFont: 16, labelFont: 12, statusFont: 10, stroke: 2.2 },\n}\n\nexport function formatTopologyCount(count: number | string | undefined): string {\n if (count == null || count === '') return '0'\n if (typeof count === 'string') return count\n if (count > 999) return '999+'\n return String(count)\n}\n\nexport function topologyStatusColor(status: StnTopologyNodeStatus | undefined, fallback?: string): string {\n if (fallback) return fallback\n return STN_TOPOLOGY_STATUS_COLORS[status ?? 'normal'].main\n}\n\nexport function hexToRgba(hex: string, alpha: number): string {\n const raw = hex.trim()\n if (!raw.startsWith('#')) return raw\n const h = raw.slice(1)\n const full = h.length === 3 ? h.split('').map((c) => c + c).join('') : h\n if (full.length !== 6) return raw\n const n = Number.parseInt(full, 16)\n if (Number.isNaN(n)) return raw\n const r = (n >> 16) & 255\n const g = (n >> 8) & 255\n const b = n & 255\n return `rgba(${r}, ${g}, ${b}, ${alpha})`\n}\n\nexport function polygonPoints(cx: number, cy: number, r: number, sides: number, rotationDeg: number): string {\n const rot = (rotationDeg * Math.PI) / 180\n return Array.from({ length: sides }, (_, i) => {\n const a = rot + (i * 2 * Math.PI) / sides\n return `${cx + r * Math.cos(a)},${cy + r * Math.sin(a)}`\n }).join(' ')\n}\n\nexport function topologyShapePoints(shape: StnTopologyNodeShape, cx: number, cy: number, r: number): string {\n if (shape === 'hexagon') return polygonPoints(cx, cy, r, 6, -90)\n if (shape === 'diamond') return polygonPoints(cx, cy, r, 4, 0)\n return polygonPoints(cx, cy, r, 4, 45)\n}\n\nexport function ringOrbitRadius(orbit: number, ringCount: number, baseRadius: number, gap = 36): number {\n const safeCount = Math.max(1, ringCount)\n const safeOrbit = Math.min(Math.max(1, orbit), safeCount)\n const mid = Math.ceil(safeCount / 2)\n return Math.max(100, baseRadius + (safeOrbit - mid) * gap)\n}\n\nexport type StnTopologyNode = {\n id: string\n label: string\n status?: StnTopologyNodeStatus\n statusLabel?: string\n icon?: StnTopologyNodeIcon | ReactNode\n shape?: StnTopologyNodeShape\n size?: StnTopologyNodeSize\n content?: StnTopologyNodeContent\n /** 노드 본문 숫자(`content: 'count'`) 또는 아이콘 위 뱃지 */\n count?: number | string\n color?: string\n /** 링 상의 각도 (0~360). 미지정 시 균등 분할 */\n angle?: number\n /** 1-based 궤도 번호 (안쪽 → 바깥쪽). 미지정 시 메인 궤도 */\n orbit?: number\n subText?: string\n data?: unknown\n pulse?: boolean\n}\n\nexport type StnTopologyCore = {\n title?: string\n subTitle?: string\n status?: StnTopologyNodeStatus\n statusLabel?: string\n icon?: ReactNode\n color?: string\n}\n","import type { ReactNode, SVGAttributes } from 'react'\nimport { cn } from '../../cn'\nimport {\n STN_TOPOLOGY_NODE_SIZE,\n STN_TOPOLOGY_STATUS_COLORS,\n formatTopologyCount,\n hexToRgba,\n topologyShapePoints,\n topologyStatusColor,\n type StnTopologyNodeContent,\n type StnTopologyNodeIcon,\n type StnTopologyNodeShape,\n type StnTopologyNodeSize,\n type StnTopologyNodeStatus,\n} from './stnTopologyShared'\n\nexport type StnTopologyNodeMarkProps = Omit<SVGAttributes<SVGGElement>, 'onClick'> & {\n x: number\n y: number\n size?: StnTopologyNodeSize\n shape?: StnTopologyNodeShape\n status?: StnTopologyNodeStatus\n color?: string\n content?: StnTopologyNodeContent\n icon?: StnTopologyNodeIcon | ReactNode\n count?: number | string\n label?: string\n statusLabel?: string\n pulse?: boolean\n selected?: boolean\n showLabel?: boolean\n showStatus?: boolean\n onClick?: () => void\n}\n\nfunction renderTopologyIcon(icon: StnTopologyNodeIcon | ReactNode | undefined, color: string, px: number) {\n if (!icon) return null\n if (typeof icon !== 'string') return icon\n\n const iconProps = {\n width: px,\n height: px,\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: color,\n strokeWidth: 2,\n strokeLinecap: 'round' as const,\n strokeLinejoin: 'round' as const,\n }\n\n switch (icon) {\n case 'server':\n return (\n <svg {...iconProps}>\n <rect x=\"2\" y=\"2\" width=\"20\" height=\"8\" rx=\"2\" ry=\"2\" />\n <rect x=\"2\" y=\"14\" width=\"20\" height=\"8\" rx=\"2\" ry=\"2\" />\n <line x1=\"6\" y1=\"6\" x2=\"6.01\" y2=\"6\" />\n <line x1=\"6\" y1=\"18\" x2=\"6.01\" y2=\"18\" />\n </svg>\n )\n case 'cloud':\n return (\n <svg {...iconProps}>\n <path d=\"M18 10h-1.26A8 8 0 1 0 9 20h9a5 5 0 0 0 0-10z\" />\n </svg>\n )\n case 'ai':\n return (\n <svg {...iconProps}>\n <rect x=\"4\" y=\"4\" width=\"16\" height=\"16\" rx=\"2\" />\n <rect x=\"9\" y=\"9\" width=\"6\" height=\"6\" />\n <line x1=\"9\" y1=\"1\" x2=\"9\" y2=\"4\" />\n <line x1=\"15\" y1=\"1\" x2=\"15\" y2=\"4\" />\n <line x1=\"9\" y1=\"20\" x2=\"9\" y2=\"23\" />\n <line x1=\"15\" y1=\"20\" x2=\"15\" y2=\"23\" />\n <line x1=\"20\" y1=\"9\" x2=\"23\" y2=\"9\" />\n <line x1=\"20\" y1=\"14\" x2=\"23\" y2=\"14\" />\n <line x1=\"1\" y1=\"9\" x2=\"4\" y2=\"9\" />\n <line x1=\"1\" y1=\"14\" x2=\"4\" y2=\"14\" />\n </svg>\n )\n case 'network':\n return (\n <svg {...iconProps}>\n <rect x=\"2\" y=\"2\" width=\"6\" height=\"6\" rx=\"1\" />\n <rect x=\"16\" y=\"2\" width=\"6\" height=\"6\" rx=\"1\" />\n <rect x=\"9\" y=\"16\" width=\"6\" height=\"6\" rx=\"1\" />\n <line x1=\"5\" y1=\"8\" x2=\"5\" y2=\"12\" />\n <line x1=\"19\" y1=\"8\" x2=\"19\" y2=\"12\" />\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\" />\n <line x1=\"12\" y1=\"12\" x2=\"12\" y2=\"16\" />\n </svg>\n )\n case 'shield':\n return (\n <svg {...iconProps}>\n <path d=\"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z\" />\n </svg>\n )\n case 'user':\n return (\n <svg {...iconProps}>\n <path d=\"M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2\" />\n <circle cx=\"12\" cy=\"7\" r=\"4\" />\n </svg>\n )\n case 'database':\n return (\n <svg {...iconProps}>\n <ellipse cx=\"12\" cy=\"5\" rx=\"9\" ry=\"3\" />\n <path d=\"M21 12c0 1.66-4 3-9 3s-9-1.34-9-3\" />\n <path d=\"M3 5v14c0 1.66 4 3 9 3s9-1.34 9-3V5\" />\n </svg>\n )\n case 'wifi':\n return (\n <svg {...iconProps}>\n <path d=\"M5 12.55a11 11 0 0 1 14.08 0\" />\n <path d=\"M1.42 9a16 16 0 0 1 21.16 0\" />\n <path d=\"M8.53 16.11a6 6 0 0 1 6.95 0\" />\n <line x1=\"12\" y1=\"20\" x2=\"12.01\" y2=\"20\" />\n </svg>\n )\n default:\n return null\n }\n}\n\nfunction NodeShape({\n shape,\n x,\n y,\n r,\n fill,\n stroke,\n strokeWidth,\n glow,\n}: {\n shape: StnTopologyNodeShape\n x: number\n y: number\n r: number\n fill: string\n stroke: string\n strokeWidth: number\n glow: string\n}) {\n const filter = glow ? `drop-shadow(0 0 8px ${glow})` : 'drop-shadow(0 2px 4px rgba(0, 0, 0, 0.4))'\n\n if (shape === 'circle') {\n return <circle cx={x} cy={y} r={r} fill={fill} stroke={stroke} strokeWidth={strokeWidth} style={{ filter }} />\n }\n\n if (shape === 'square') {\n const size = r * 2\n return (\n <rect\n x={x - r}\n y={y - r}\n width={size}\n height={size}\n rx={Math.max(2, r * 0.18)}\n fill={fill}\n stroke={stroke}\n strokeWidth={strokeWidth}\n style={{ filter }}\n />\n )\n }\n\n return (\n <polygon\n points={topologyShapePoints(shape, x, y, r)}\n fill={fill}\n stroke={stroke}\n strokeWidth={strokeWidth}\n strokeLinejoin=\"round\"\n style={{ filter }}\n />\n )\n}\n\n/**\n * StnTopologyNodeMark — 토폴로지 노드 시각 단위 (크기 · 모양 · 색 · 아이콘/숫자)\n */\nexport function StnTopologyNodeMark({\n x,\n y,\n size = 'md',\n shape = 'circle',\n status = 'normal',\n color,\n content = 'icon',\n icon,\n count,\n label,\n statusLabel,\n pulse = false,\n selected = false,\n showLabel = true,\n showStatus = true,\n onClick,\n className,\n ...rest\n}: StnTopologyNodeMarkProps) {\n const metrics = STN_TOPOLOGY_NODE_SIZE[size]\n const tone = STN_TOPOLOGY_STATUS_COLORS[status]\n const stroke = topologyStatusColor(status, color)\n const isAlert = status === 'critical' || pulse\n const isCount = content === 'count'\n const fill = isCount ? hexToRgba(stroke, 0.28) : 'rgba(16, 20, 34, 0.95)'\n const r = isAlert ? metrics.r + 1.5 : metrics.r\n const resolvedStatusLabel = statusLabel ?? tone.label\n const countText = formatTopologyCount(count)\n const iconPx = metrics.icon\n const showCornerBadge = !isCount && count != null && count !== ''\n\n return (\n <g\n className={cn('stn-topology-node', selected && 'stn-topology-node--selected', className)}\n data-shape={shape}\n data-size={size}\n data-status={status}\n data-content={content}\n onClick={onClick}\n style={{ cursor: onClick ? 'pointer' : 'default' }}\n {...rest}\n >\n {isAlert && (\n <circle\n className=\"stn-topology-node__pulse\"\n cx={x}\n cy={y}\n r={r + 6}\n fill=\"none\"\n stroke={stroke}\n strokeWidth=\"1.5\"\n opacity=\"0.55\"\n >\n <animate attributeName=\"r\" values={`${r + 4};${r + 12};${r + 4}`} dur=\"2s\" repeatCount=\"indefinite\" />\n <animate attributeName=\"opacity\" values=\"0.75;0.15;0.75\" dur=\"2s\" repeatCount=\"indefinite\" />\n </circle>\n )}\n\n {selected && (\n <circle cx={x} cy={y} r={r + 6} fill=\"none\" stroke=\"#00e5ff\" strokeWidth=\"1.5\" strokeDasharray=\"3 3\" />\n )}\n\n <NodeShape\n shape={shape}\n x={x}\n y={y}\n r={r}\n fill={fill}\n stroke={stroke}\n strokeWidth={isAlert ? metrics.stroke + 0.6 : metrics.stroke}\n glow={isAlert || isCount ? tone.glow : ''}\n />\n\n {isCount ? (\n <text\n x={x}\n y={y}\n textAnchor=\"middle\"\n dominantBaseline=\"central\"\n fill=\"#ffffff\"\n fontSize={metrics.countFont}\n fontWeight=\"800\"\n style={{ textShadow: '0 1px 2px rgba(0, 0, 0, 0.85)' }}\n >\n {countText}\n </text>\n ) : (\n <g transform={`translate(${x - iconPx / 2}, ${y - iconPx / 2})`}>{renderTopologyIcon(icon, stroke, iconPx)}</g>\n )}\n\n {showCornerBadge && (\n <g className=\"stn-topology-node__badge\">\n <circle cx={x + r * 0.72} cy={y - r * 0.72} r={Math.max(6, r * 0.38)} fill={stroke} stroke=\"rgba(6,7,15,0.9)\" strokeWidth=\"1\" />\n <text\n x={x + r * 0.72}\n y={y - r * 0.72}\n textAnchor=\"middle\"\n dominantBaseline=\"central\"\n fill=\"#0b0d14\"\n fontSize={Math.max(7, r * 0.42)}\n fontWeight=\"800\"\n >\n {countText}\n </text>\n </g>\n )}\n\n {showLabel && label && (\n <text\n x={x}\n y={y - r - 6}\n textAnchor=\"middle\"\n fill=\"#ffffff\"\n fontSize={metrics.labelFont}\n fontWeight=\"700\"\n style={{ textShadow: '0 1px 3px rgba(0, 0, 0, 0.9)' }}\n >\n {label}\n </text>\n )}\n\n {showStatus && resolvedStatusLabel && (\n <text\n x={x}\n y={y + r + 12}\n textAnchor=\"middle\"\n fill={stroke}\n fontSize={metrics.statusFont}\n fontWeight=\"600\"\n style={{ textShadow: '0 1px 2px rgba(0, 0, 0, 0.8)' }}\n >\n ● {resolvedStatusLabel}\n </text>\n )}\n </g>\n )\n}\n\nexport type StnTopologyNodePreviewProps = Omit<StnTopologyNodeMarkProps, 'x' | 'y'> & {\n width?: number\n height?: number\n}\n\n/** 문서·팔레트용 단독 노드 프리뷰 */\nexport function StnTopologyNodePreview({\n width,\n height,\n size = 'md',\n showLabel = true,\n showStatus = false,\n ...rest\n}: StnTopologyNodePreviewProps) {\n const r = STN_TOPOLOGY_NODE_SIZE[size].r\n const w = width ?? r * 2 + (showLabel ? 88 : 28)\n const h = height ?? r * 2 + (showLabel || showStatus ? 56 : 28)\n return (\n <svg className=\"stn-topology-node-preview\" width={w} height={h} viewBox={`0 0 ${w} ${h}`} overflow=\"visible\">\n <StnTopologyNodeMark x={w / 2} y={h / 2} size={size} showLabel={showLabel} showStatus={showStatus} {...rest} />\n </svg>\n )\n}\n","import { useState, type CSSProperties, type HTMLAttributes } from 'react'\nimport { cn } from '../../cn'\nimport { StnSegmented } from '../StnSegmented'\nimport { StnTopologyNodeMark } from './StnTopologyNodeMark'\nimport {\n STN_TOPOLOGY_STATUS_COLORS,\n type StnTopologyNodeContent,\n type StnTopologyNodeIcon,\n type StnTopologyNodeShape,\n type StnTopologyNodeSize,\n type StnTopologyNodeStatus,\n} from './stnTopologyShared'\n\nexport type StnTopologyGraphNode = {\n id: string\n x: number\n y: number\n z?: number\n label?: string\n status?: StnTopologyNodeStatus\n statusLabel?: string\n isCore?: boolean\n color?: string\n pulse?: boolean\n shape?: StnTopologyNodeShape\n size?: StnTopologyNodeSize\n content?: StnTopologyNodeContent\n count?: number | string\n icon?: StnTopologyNodeIcon\n}\n\nexport type StnTopologyGraphLink = {\n source: string\n target: string\n status?: StnTopologyNodeStatus\n dashed?: boolean\n}\n\nexport type StnTopologyGraphProps = Omit<HTMLAttributes<HTMLDivElement>, 'title'> & {\n defaultMode?: '2D' | '3D'\n showModeToggle?: boolean\n showMinimap?: boolean\n nodes?: StnTopologyGraphNode[]\n links?: StnTopologyGraphLink[]\n nodeSize?: StnTopologyNodeSize\n selectedId?: string\n onNodeClick?: (node: StnTopologyGraphNode) => void\n loading?: boolean\n className?: string\n style?: CSSProperties\n}\n\nconst DEFAULT_GRAPH_NODES: StnTopologyGraphNode[] = [\n { id: 'n1', x: 200, y: 58, status: 'minor', label: 'GW-01', shape: 'circle', content: 'icon', icon: 'wifi' },\n { id: 'n2', x: 118, y: 118, status: 'critical', label: 'BACKUP', shape: 'hexagon', content: 'count', count: 4, pulse: true },\n { id: 'n3', x: 282, y: 118, status: 'critical', label: 'PROXY', shape: 'diamond', content: 'count', count: 2 },\n { id: 'core', x: 200, y: 158, isCore: true, status: 'normal', label: 'CORE', shape: 'diamond', size: 'lg' },\n { id: 'n4', x: 110, y: 210, status: 'normal', label: 'DB-01', shape: 'square', content: 'icon', icon: 'database' },\n { id: 'n5', x: 200, y: 248, status: 'major', label: 'NAS', shape: 'hexagon', content: 'count', count: 12 },\n { id: 'n6', x: 300, y: 210, status: 'normal', label: 'FW-01', shape: 'circle', content: 'icon', icon: 'shield' },\n]\n\nconst DEFAULT_GRAPH_LINKS: StnTopologyGraphLink[] = [\n { source: 'n1', target: 'n2' },\n { source: 'n1', target: 'n3' },\n { source: 'n2', target: 'core' },\n { source: 'n3', target: 'core' },\n { source: 'core', target: 'n4' },\n { source: 'core', target: 'n5' },\n { source: 'core', target: 'n6' },\n { source: 'n2', target: 'n4', dashed: true },\n]\n\n/**\n * StnTopologyGraph — 관제 2D/3D 퍼스펙티브 네트워크 토폴로지\n */\nexport function StnTopologyGraph({\n defaultMode = '3D',\n showModeToggle = true,\n showMinimap = true,\n nodes = DEFAULT_GRAPH_NODES,\n links = DEFAULT_GRAPH_LINKS,\n nodeSize = 'sm',\n selectedId,\n onNodeClick,\n loading = false,\n className,\n style,\n ...rest\n}: StnTopologyGraphProps) {\n const [viewMode, setViewMode] = useState<'2D' | '3D'>(defaultMode)\n\n if (loading) {\n return (\n <div className={cn('stn-topology-graph', 'stn-topology-graph--loading', className)} style={style} {...rest}>\n <div className=\"stn-topology-graph__loading-label\">토폴로지 캔버스 데이터를 불러오는 중...</div>\n </div>\n )\n }\n\n const nodeMap = new Map(nodes.map((n) => [n.id, n]))\n\n return (\n <div\n className={cn('stn-topology-graph', className)}\n style={style}\n data-stn-topology-graph\n data-view-mode={viewMode}\n {...rest}\n >\n {showModeToggle && (\n <div className=\"stn-topology-graph__mode\">\n <StnSegmented\n size=\"sm\"\n value={viewMode}\n onChange={(val) => setViewMode(val as '2D' | '3D')}\n options={[\n { value: '2D', label: '2D' },\n { value: '3D', label: '3D' },\n ]}\n />\n </div>\n )}\n\n <svg className=\"stn-topology-graph__svg\" width=\"100%\" height=\"100%\" viewBox=\"0 0 400 300\" overflow=\"visible\">\n {viewMode === '3D' ? (\n <g opacity=\"0.6\">\n <line x1=\"60\" y1=\"260\" x2=\"200\" y2=\"80\" stroke=\"rgba(255,255,255,0.06)\" strokeDasharray=\"3 3\" />\n <line x1=\"130\" y1=\"260\" x2=\"200\" y2=\"80\" stroke=\"rgba(255,255,255,0.08)\" strokeDasharray=\"3 3\" />\n <line x1=\"200\" y1=\"260\" x2=\"200\" y2=\"80\" stroke=\"rgba(255,255,255,0.14)\" strokeDasharray=\"3 3\" />\n <line x1=\"270\" y1=\"260\" x2=\"200\" y2=\"80\" stroke=\"rgba(255,255,255,0.08)\" strokeDasharray=\"3 3\" />\n <line x1=\"340\" y1=\"260\" x2=\"200\" y2=\"80\" stroke=\"rgba(255,255,255,0.06)\" strokeDasharray=\"3 3\" />\n <line x1=\"100\" y1=\"230\" x2=\"300\" y2=\"230\" stroke=\"rgba(255,255,255,0.06)\" />\n <line x1=\"130\" y1=\"190\" x2=\"270\" y2=\"190\" stroke=\"rgba(255,255,255,0.06)\" />\n <line x1=\"160\" y1=\"140\" x2=\"240\" y2=\"140\" stroke=\"rgba(255,255,255,0.06)\" />\n </g>\n ) : (\n <g opacity=\"0.3\">\n <line x1=\"40\" y1=\"60\" x2=\"360\" y2=\"60\" stroke=\"rgba(255,255,255,0.08)\" strokeDasharray=\"4 4\" />\n <line x1=\"40\" y1=\"150\" x2=\"360\" y2=\"150\" stroke=\"rgba(255,255,255,0.08)\" strokeDasharray=\"4 4\" />\n <line x1=\"40\" y1=\"240\" x2=\"360\" y2=\"240\" stroke=\"rgba(255,255,255,0.08)\" strokeDasharray=\"4 4\" />\n <line x1=\"100\" y1=\"20\" x2=\"100\" y2=\"280\" stroke=\"rgba(255,255,255,0.08)\" strokeDasharray=\"4 4\" />\n <line x1=\"200\" y1=\"20\" x2=\"200\" y2=\"280\" stroke=\"rgba(255,255,255,0.08)\" strokeDasharray=\"4 4\" />\n <line x1=\"300\" y1=\"20\" x2=\"300\" y2=\"280\" stroke=\"rgba(255,255,255,0.08)\" strokeDasharray=\"4 4\" />\n </g>\n )}\n\n {links.map((link, idx) => {\n const s = nodeMap.get(link.source)\n const t = nodeMap.get(link.target)\n if (!s || !t) return null\n\n const isAlert = s.status === 'critical' || t.status === 'critical' || link.status === 'critical'\n const strokeColor = isAlert ? 'rgba(255, 77, 79, 0.65)' : 'rgba(255, 255, 255, 0.2)'\n\n return (\n <line\n key={`link-${idx}`}\n x1={s.x}\n y1={s.y}\n x2={t.x}\n y2={t.y}\n stroke={strokeColor}\n strokeWidth={isAlert ? 2 : 1}\n strokeDasharray={link.dashed ? '4 4' : undefined}\n />\n )\n })}\n\n {nodes.map((node) => {\n const status = node.status ?? 'normal'\n const isCore = Boolean(node.isCore)\n\n return (\n <StnTopologyNodeMark\n key={node.id}\n x={node.x}\n y={node.y}\n size={node.size ?? (isCore ? 'lg' : nodeSize)}\n shape={node.shape ?? (isCore ? 'diamond' : 'circle')}\n status={status}\n color={node.color ?? (isCore ? '#00e5ff' : undefined)}\n content={node.content ?? (node.count != null && !node.icon ? 'count' : 'icon')}\n icon={node.icon}\n count={node.count}\n label={node.label}\n statusLabel={node.statusLabel}\n pulse={node.pulse}\n selected={selectedId === node.id}\n showStatus={false}\n onClick={onNodeClick ? () => onNodeClick(node) : undefined}\n />\n )\n })}\n </svg>\n\n {showMinimap && (\n <div className=\"stn-topology-graph__minimap\">\n <div className=\"stn-topology-graph__minimap-head\">\n <span>미리보기</span>\n <span>—</span>\n </div>\n <svg width=\"100%\" height=\"40\" viewBox=\"0 0 100 50\">\n <polyline points=\"50,10 40,25 50,40 60,30\" fill=\"none\" stroke=\"rgba(255,77,79,0.5)\" strokeWidth=\"1\" />\n <circle cx=\"50\" cy=\"10\" r=\"2\" fill={STN_TOPOLOGY_STATUS_COLORS.critical.main} />\n <circle cx=\"40\" cy=\"25\" r=\"2.5\" fill={STN_TOPOLOGY_STATUS_COLORS.critical.main} />\n <circle cx=\"50\" cy=\"40\" r=\"2\" fill=\"#00e5ff\" />\n <circle cx=\"60\" cy=\"30\" r=\"2\" fill={STN_TOPOLOGY_STATUS_COLORS.normal.main} />\n </svg>\n </div>\n )}\n </div>\n )\n}\n","import {\n Children,\n forwardRef,\n Fragment,\n isValidElement,\n type CSSProperties,\n type ElementType,\n type ReactNode,\n} from 'react'\n\nimport { cn } from '../cn'\n\nexport type StnStackDirection = 'row' | 'row-reverse' | 'column' | 'column-reverse'\nexport type StnStackBreakpoint = 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n/** 값 하나, 또는 xs 기본 · sm 768 · md 1024 · lg 1280 · xl 1440 */\nexport type StnStackResponsive<T> = T | Partial<Record<StnStackBreakpoint, T>>\nexport type StnStackWrap = 'nowrap' | 'wrap' | 'wrap-reverse'\nexport type StnStackScrollable = boolean | 'auto' | 'y' | 'x'\n\nconst BREAKPOINTS = ['xs', 'sm', 'md', 'lg', 'xl'] as const\nconst DIRECTION_CLASS = new Set<StnStackDirection>(['row', 'row-reverse', 'column', 'column-reverse'])\n\nexport type StnStackProps<T extends ElementType = 'div'> = {\n /** 렌더링할 HTML 태그 또는 컴포넌트 (기본: 'div') */\n component?: T\n /** @alias component */\n as?: T\n /**\n * 플렉스 방향. 브레이크포인트 맵이면 xs가 기본이다.\n * `direction={{ xs: 'column', sm: 'row' }}`\n * @default 'column'\n */\n direction?: StnStackResponsive<StnStackDirection>\n /**\n * 아이템 간격.\n * 숫자는 8px 스텝으로 `.stn-stack--spacing-*`가 `--stn-spacing-stack-*`를 고른다.\n * `1` → `--stn-spacing-stack-8`. `spacing={{ xs: 1, sm: 2, md: 4 }}`\n * @default 0\n */\n spacing?: StnStackResponsive<number | string>\n /** 가로/세로 정렬 */\n alignItems?: CSSProperties['alignItems']\n /** 주축 정렬 */\n justifyContent?: CSSProperties['justifyContent']\n /** 줄바꿈 여부 */\n wrap?: StnStackWrap\n /**\n * 스크롤 가능 여부 및 축\n * - true | 'auto' | 'y': 세로 스크롤 (overflow-y: auto, overflow-x: hidden, min-height: 0, flex: 1 1 0%)\n * - 'x': 가로 스크롤 (overflow-x: auto, overflow-y: hidden, min-width: 0)\n */\n scrollable?: StnStackScrollable\n /**\n * 주축 방향으로 자식을 균등 분할 (`.is-fill`).\n * L1 높이 체인 안에서 위젯·패널을 세로/가로로 나눠 채울 때 사용.\n */\n fill?: boolean\n /**\n * 자식 사이에 끼우는 구분선. 선 자체에는 간격을 넣지 않습니다.\n * `spacing`(gap)이 선 양쪽에 그대로 적용됩니다.\n */\n divider?: ReactNode\n className?: string\n style?: CSSProperties\n children?: ReactNode\n} & Omit<React.ComponentPropsWithoutRef<T>, 'as' | 'component' | 'children' | 'className' | 'style'>\n\nconst STACK_SPACE_TOKENS = new Set([2, 4, 6, 8, 10, 12, 14, 16, 20, 24, 32, 36, 40, 44, 48, 56, 64, 80, 84])\n\nconst JUSTIFY_CLASS = new Set([\n 'flex-start',\n 'center',\n 'flex-end',\n 'space-between',\n 'space-around',\n 'space-evenly',\n])\n\nconst ALIGN_CLASS = new Set(['flex-start', 'center', 'flex-end', 'stretch', 'baseline'])\n\nfunction isResponsiveObject<T>(value: StnStackResponsive<T>): value is Partial<Record<StnStackBreakpoint, T>> {\n return typeof value === 'object' && value !== null\n}\n\nfunction directionClasses(direction: StnStackResponsive<StnStackDirection> = 'column') {\n const resolved = isResponsiveObject(direction) ? direction : { xs: direction }\n const classes: string[] = []\n if (!resolved.xs) classes.push('stn-stack--direction-column')\n for (const bp of BREAKPOINTS) {\n const next = resolved[bp]\n if (!next || !DIRECTION_CLASS.has(next)) continue\n classes.push(bp === 'xs' ? `stn-stack--direction-${next}` : `stn-stack--direction-${bp}-${next}`)\n }\n return classes\n}\n\nconst DIRECT_PX_TO_STEP: Record<number, number> = {\n 2: 0.25,\n 4: 0.5,\n 6: 0.75,\n 8: 1,\n 10: 1.25,\n 12: 1.5,\n 14: 1.75,\n 16: 2,\n 20: 2.5,\n 24: 3,\n 32: 4,\n 36: 4.5,\n 40: 5,\n 44: 5.5,\n 48: 6,\n 56: 7,\n 64: 8,\n 80: 10,\n 84: 10.5,\n}\n\nfunction normalizeSpacingVal(val: number | string): number | string {\n if (typeof val === 'string') {\n const parsed = parseFloat(val)\n if (!Number.isNaN(parsed)) {\n if (val.endsWith('px') && DIRECT_PX_TO_STEP[parsed] != null) {\n return DIRECT_PX_TO_STEP[parsed]\n }\n return parsed\n }\n }\n return val\n}\n\nfunction resolveSpacing(val: number | string): { slug?: string; inlineGap?: string } {\n if (val === 0 || val === '0' || val === '0px') return { slug: '0' }\n const norm = normalizeSpacingVal(val)\n if (typeof norm === 'number') {\n // 1. Direct step match (e.g. 1 -> 8px, 1.5 -> 12px, 2 -> 16px)\n const px = norm * 8\n if (Number.isFinite(px) && Number.isInteger(px) && STACK_SPACE_TOKENS.has(px)) {\n return { slug: String(norm).replace('.', '-') }\n }\n // 2. Direct px number match (e.g. 12 -> step 1.5 -> 12px)\n if (DIRECT_PX_TO_STEP[norm] != null) {\n const step = DIRECT_PX_TO_STEP[norm]\n return { slug: String(step).replace('.', '-') }\n }\n // 3. Fallback arbitrary number\n return { inlineGap: `${norm}px` }\n }\n return { inlineGap: String(val) }\n}\n\nfunction spacingClassesAndStyle(spacing: StnStackResponsive<number | string> | undefined) {\n if (spacing == null) return { classes: [], inlineGap: undefined }\n const resolved = isResponsiveObject(spacing) ? spacing : { xs: spacing }\n const classes: string[] = []\n let inlineGap: string | undefined\n\n for (const bp of BREAKPOINTS) {\n const next = resolved[bp]\n if (next == null) continue\n const res = resolveSpacing(next)\n if (res.slug) {\n classes.push(bp === 'xs' ? `stn-stack--spacing-${res.slug}` : `stn-stack--spacing-${bp}-${res.slug}`)\n } else if (bp === 'xs' && res.inlineGap) {\n inlineGap = res.inlineGap\n }\n }\n return { classes, inlineGap }\n}\n\n/**\n * 1차원 Flex 스택 레이아웃 컴포넌트.\n * 수직/수평 방향(direction), 간격(spacing), 구분선(divider)을 쉽게 다룰 수 있습니다.\n */\nexport const StnStack = forwardRef(function StnStack<T extends ElementType = 'div'>(\n {\n component,\n as,\n direction = 'column',\n spacing = 0,\n alignItems,\n justifyContent,\n wrap,\n scrollable,\n fill = false,\n divider,\n className,\n style,\n children,\n ...rest\n }: StnStackProps<T>,\n ref: React.ForwardedRef<any>,\n) {\n const Component = component ?? as ?? 'div'\n const isScrollY = scrollable === true || scrollable === 'auto' || scrollable === 'y'\n const isScrollX = scrollable === 'x'\n const justify = typeof justifyContent === 'string' && JUSTIFY_CLASS.has(justifyContent) ? justifyContent : undefined\n const align = typeof alignItems === 'string' && ALIGN_CLASS.has(alignItems) ? alignItems : undefined\n\n const { classes: spacingClass, inlineGap } = spacingClassesAndStyle(spacing)\n const mergedStyle = inlineGap ? { gap: inlineGap, ...style } : style\n\n const validChildren = Children.toArray(children).filter(Boolean)\n const renderedChildren = divider\n ? validChildren.map((child, index) => {\n const key = isValidElement(child) && child.key != null ? child.key : index\n return (\n <Fragment key={key}>\n {index > 0 ? divider : null}\n {child}\n </Fragment>\n )\n })\n : children\n\n return (\n <Component\n ref={ref}\n className={cn(\n 'stn-stack',\n ...directionClasses(direction),\n ...spacingClass,\n wrap && `stn-stack--wrap-${wrap}`,\n justify && `stn-stack--justify-${justify}`,\n align && `stn-stack--align-${align}`,\n isScrollY && 'is-scrollable',\n isScrollX && 'is-scrollable-x',\n fill && 'is-fill',\n className,\n )}\n style={mergedStyle}\n {...rest}\n >\n {renderedChildren}\n </Component>\n )\n})\n","import { StnWidget, type StnWidgetAppearance } from '../../components/StnWidget'\nimport { StnStack } from '../../layouts/StnStack'\nimport { StnLoadingSkeleton } from '../scaffold/StnLoadingSkeleton'\n\nconst TOP5_ROWS = [\n { label: '그랑시아', percent: 80, value: '80건', grade: 'critical' as const },\n { label: '연립주택 15세대', percent: 74, value: '74건', grade: 'major' as const },\n { label: '영동고등학교', percent: 69, value: '69건', grade: 'major' as const },\n { label: '리오빌딩', percent: 69, value: '69건', grade: 'minor' as const },\n { label: 'PRADA', percent: 68, value: '68건', grade: 'default' as const },\n]\n\nexport type AlertCenterDashboardProps = {\n className?: string\n appearance?: StnWidgetAppearance\n /** 위젯 본문 로딩 스켈레톤 표출 유무 */\n loading?: boolean\n}\n\n/**\n * alert_center 우측 위젯 묶음 — `.dashboard_right` 슬롯(StnDashboard.Right) 안에 넣음\n */\nexport function AlertCenterDashboard({ className, appearance = 'translucent', loading = false }: AlertCenterDashboardProps) {\n return (\n <StnStack\n direction=\"column\"\n spacing={1}\n className={className}\n style={{ flex: '1 1 0%', minHeight: 0, height: '100%', width: '100%' }}\n data-stn-dashboard=\"alert-widgets\"\n >\n <StnWidget title=\"시설 현황\" appearance={appearance} interactive>\n {loading ? (\n <StnLoadingSkeleton.Widget lines={3} />\n ) : (\n <StnWidget.StatusList>\n <StnWidget.StatusItem label=\"PTN\" value=\"179\" showDot={false} />\n <StnWidget.StatusItem label=\"MSPP\" value=\"63\" showDot={false} />\n <StnWidget.StatusItem label=\"L3스위치\" value=\"27\" showDot={false} />\n </StnWidget.StatusList>\n )}\n </StnWidget>\n\n <StnWidget title=\"장애 현황\" appearance={appearance} interactive>\n {loading ? (\n <StnLoadingSkeleton.Widget lines={3} />\n ) : (\n <StnWidget.StatusList>\n <StnWidget.StatusItem label=\"Critical\" value=\"43\" grade=\"critical\" />\n <StnWidget.StatusItem label=\"Major\" value=\"79\" grade=\"major\" />\n <StnWidget.StatusItem label=\"Minor\" value=\"3\" grade=\"minor\" />\n </StnWidget.StatusList>\n )}\n </StnWidget>\n\n <StnWidget title=\"일일 장비별 장애 TOP5\" appearance={appearance} interactive>\n {loading ? (\n <StnLoadingSkeleton.Widget lines={4} />\n ) : (\n <StnWidget.GradeRowList>\n {TOP5_ROWS.map((row) => (\n <StnWidget.GradeRow\n key={row.label}\n grade={row.grade}\n label={row.label}\n value={row.value}\n percent={row.percent}\n />\n ))}\n </StnWidget.GradeRowList>\n )}\n </StnWidget>\n\n <StnWidget title=\"일일 장애 통계\" appearance={appearance} interactive>\n {loading ? (\n <StnLoadingSkeleton.Widget lines={3} />\n ) : (\n <StnWidget.ChartSlot label=\"일일 장애 통계 차트\" />\n )}\n </StnWidget>\n </StnStack>\n )\n}\n","import type { CSSProperties, ReactNode } from 'react'\r\n\r\n/** Pub dashboard_right 위젯 본문 — alert_center.html · dashboard-map.html 공통 마크업 */\r\n\r\nexport type PubDisabilityStatusItem = {\r\n label: ReactNode\r\n value: ReactNode\r\n grade?: 'critical' | 'major' | 'minor' | 'warning' | 'normal'\r\n showDot?: boolean\r\n}\r\n\r\ntype PubDisabilityStatusListProps = {\r\n items: PubDisabilityStatusItem[]\r\n summary?: { label: string; value: ReactNode }[]\r\n}\r\n\r\nexport function PubDisabilityStatusList({ items, summary }: PubDisabilityStatusListProps) {\r\n return (\r\n <div className=\"ds-disability-status\">\r\n <ul className=\"ds-disability-status__list\">\r\n {items.map((item, i) => (\r\n <li\r\n key={i}\r\n className={['ds-disability-status__item', item.grade].filter(Boolean).join(' ')}\r\n >\r\n <span>\r\n {item.showDot !== false && item.grade ? <span className=\"dot\" aria-hidden /> : null}\r\n {item.label}\r\n </span>\r\n <p>{item.value}</p>\r\n </li>\r\n ))}\r\n </ul>\r\n {summary && summary.length > 0 ? (\r\n <div className=\"ds-disability-status__summary\">\r\n {summary.map((row, i) => (\r\n <p key={i} className=\"ds-disability-status__value\">\r\n {row.label}\r\n <span>{row.value}</span>\r\n </p>\r\n ))}\r\n </div>\r\n ) : null}\r\n </div>\r\n )\r\n}\r\n\r\nexport type PubTop5BarRow = { label: string; percent: number; status: string }\r\n\r\nexport type PubTrafficTop5BarRow = { label: string; percent: number; value: string }\r\n\r\nexport function PubTrafficTop5Bars({ rows }: { rows: PubTrafficTop5BarRow[] }) {\r\n const maxPercent = Math.max(...rows.map((row) => row.percent), 0)\r\n return (\r\n <div className=\"ds-bar-group\">\r\n {rows.map((row) => (\r\n <div key={row.label} className={['ds-bar', row.percent === maxPercent ? 'max' : ''].filter(Boolean).join(' ')}>\r\n <p className=\"ds-bar-name\" title={row.label}>\r\n {row.label}\r\n </p>\r\n <div className=\"ds-bar-con\" title={`${row.percent}%`}>\r\n <span className=\"ds-bar-gauge\" style={{ '--percent': `${row.percent}%` } as CSSProperties} />\r\n </div>\r\n <p className=\"ds-bar-value\" title={row.value}>\r\n {row.value}\r\n </p>\r\n </div>\r\n ))}\r\n </div>\r\n )\r\n}\r\n\r\nexport function PubTop5EquipmentBars({ rows }: { rows: PubTop5BarRow[] }) {\r\n return (\r\n <div className=\"ds-group\">\r\n <div className=\"ds-group-box\">\r\n <div className=\"ds-equipment-ico\">\r\n <span className=\"blind\">장비 이미지</span>\r\n </div>\r\n </div>\r\n <div className=\"ds-group-box\">\r\n <div className=\"ds-bar-group\">\r\n {rows.map((row) => (\r\n <div key={row.label} className=\"ds-bar type-2\">\r\n <div className=\"ds-bar-con\" title={`${row.percent}%`}>\r\n <span className=\"ds-bar-gauge\" style={{ '--percent': `${row.percent}%` } as CSSProperties} />\r\n <div className=\"ds-bar-status\">{row.status}</div>\r\n </div>\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n </div>\r\n )\r\n}\r\n\r\nexport function PubChartSample({\r\n src,\r\n alt = '차트',\r\n onError,\r\n}: {\r\n src: string\r\n alt?: string\r\n onError?: () => void\r\n}) {\r\n return (\r\n <div className=\"ds-chart\">\r\n <img src={src} alt={alt} className=\"chart_sample\" onError={onError} />\r\n </div>\r\n )\r\n}\r\n","import { useId, useState } from 'react'\n\nimport type {\n StnAlertCenterAlertItem,\n StnAlertCenterTab,\n StnAlertCenterWorkItem,\n} from '@stn-uiux/pub-ui/data/stnAlertCenter'\nimport {\n STN_ALERT_CENTER_TAB_IDS,\n STN_ALERT_CENTER_TABS,\n} from '@stn-uiux/pub-ui/data/stnAlertCenter'\n\nimport { cn } from '../../cn'\nimport { StnChip } from '../../components/StnChip'\nimport { StnButton } from '../../components/StnButton'\n\nexport type StnAlertCenterPanelProps = {\n title?: string\n alerts?: StnAlertCenterAlertItem[]\n workItems?: StnAlertCenterWorkItem[]\n deployItems?: StnAlertCenterWorkItem[]\n defaultTab?: StnAlertCenterTab\n /** Pub `:has(#gnb-alert-tab-*)` — 기본 Pub id 사용 권장 */\n tabIds?: Partial<Record<StnAlertCenterTab, string>>\n tabName?: string\n onClose?: () => void\n closeLabel?: string\n className?: string\n}\n\nfunction listWrapStyle(active: boolean): React.CSSProperties | undefined {\n return active ? undefined : { display: 'none' }\n}\n\nexport function StnAlertCenterPanel({\n title = '알림센터',\n alerts = [],\n workItems = [],\n deployItems = [],\n defaultTab = 'error',\n tabIds,\n tabName: tabNameProp,\n onClose,\n closeLabel = '닫기',\n className,\n}: StnAlertCenterPanelProps) {\n const uid = useId().replace(/:/g, '')\n const tabName = tabNameProp ?? `gnb-alert-status-${uid}`\n const [activeTab, setActiveTab] = useState<StnAlertCenterTab>(defaultTab)\n\n const ids = {\n error: tabIds?.error ?? STN_ALERT_CENTER_TAB_IDS.error,\n work: tabIds?.work ?? STN_ALERT_CENTER_TAB_IDS.work,\n deploy: tabIds?.deploy ?? STN_ALERT_CENTER_TAB_IDS.deploy,\n }\n\n return (\n <div className={cn('stn-alert-center gnb_alert_modal', className)} data-stn-alert-center>\n <div className=\"stn-alert-center__header alert_header\">\n <div className=\"stn-alert-center__header-left header_left\">\n <span className=\"stn-alert-center__title title\">{title}</span>\n <div className=\"stn-alert-center__toggle alert_toggle\">\n {STN_ALERT_CENTER_TABS.map((tab) => (\n <span key={tab.id}>\n <input\n type=\"radio\"\n id={ids[tab.id]}\n name={tabName}\n checked={activeTab === tab.id}\n onChange={() => setActiveTab(tab.id)}\n />\n <label htmlFor={ids[tab.id]}>{tab.label}</label>\n </span>\n ))}\n </div>\n </div>\n <StnButton\n icon=\"line/x\"\n variant=\"ghost\"\n size=\"small\"\n className=\"stn-alert-center__close close_alert_modal\"\n aria-label={closeLabel}\n onClick={onClose}\n />\n </div>\n\n <div className=\"stn-alert-center__list-wrap alert_list_wrap\" style={listWrapStyle(activeTab === 'error')}>\n <ul className=\"stn-alert-center__list alert_list\">\n {alerts.map((row) => (\n <li key={row.id ?? row.title} className=\"stn-alert-center__item alert_item\">\n <span className=\"stn-alert-center__dot dot\" aria-hidden />\n <StnChip grade={row.grade} />\n <span title={row.title} className=\"stn-alert-center__title-cell title_cell\">\n {row.title}\n </span>\n <span className=\"stn-alert-center__desc-cell desc_cell\">{row.description}</span>\n <span className=\"stn-alert-center__time-cell time_cell\">{row.time}</span>\n </li>\n ))}\n </ul>\n </div>\n\n <div className=\"stn-alert-center__list-wrap work_list_wrap\" style={listWrapStyle(activeTab === 'work')}>\n <ul className=\"stn-alert-center__list work_list\">\n {workItems.map((row) => (\n <li key={row.id ?? `${row.typeLabel}-${row.time}`} className=\"stn-alert-center__item work_item\">\n <span className=\"stn-alert-center__dot dot\" aria-hidden />\n <span className=\"stn-alert-center__work-type work_type\">{row.typeLabel}</span>\n <span className=\"stn-alert-center__work-text work_text\">{row.text}</span>\n <span className=\"stn-alert-center__time-cell time_cell\">{row.time}</span>\n </li>\n ))}\n </ul>\n </div>\n\n <div className=\"stn-alert-center__list-wrap deploy_list_wrap\" style={listWrapStyle(activeTab === 'deploy')}>\n <ul className=\"stn-alert-center__list work_list\">\n {deployItems.map((row) => (\n <li key={row.id ?? `${row.typeLabel}-${row.time}`} className=\"stn-alert-center__item work_item\">\n <span className=\"stn-alert-center__dot dot\" aria-hidden />\n <span className=\"stn-alert-center__work-type work_type\">{row.typeLabel}</span>\n <span className=\"stn-alert-center__work-text work_text\">{row.text}</span>\n <span className=\"stn-alert-center__time-cell time_cell\">{row.time}</span>\n </li>\n ))}\n </ul>\n </div>\n\n </div>\n )\n}\n","import type { ReactNode } from 'react'\n\nimport type { StnTheme } from '../../StnContext'\nimport { StnProvider } from '../../StnProvider'\nimport { StnAlertCenterPanel, type StnAlertCenterPanelProps } from './StnAlertCenterPanel'\n\nexport type StnAlertCenterDocPreviewProps = StnAlertCenterPanelProps & {\n theme?: StnTheme\n /** DS iframe·Color doc용 GNB 크롬 래퍼 */\n withDocChrome?: boolean\n children?: ReactNode\n}\n\n/**\n * 문서·데모 — `stn-doc-frame--alert-center` + SideNav bottom shell.\n * 제품 앱에서는 `StnSideNavigation` bottom 슬롯에 `StnAlertCenterPanel`만 넣으면 됩니다.\n */\nexport function StnAlertCenterDocPreview({\n theme = 'light',\n withDocChrome = true,\n children,\n ...panelProps\n}: StnAlertCenterDocPreviewProps) {\n const panel = children ?? <StnAlertCenterPanel {...panelProps} />\n\n if (!withDocChrome) {\n return (\n <StnProvider theme={theme} applyThemeToDocument={false}>\n {panel}\n </StnProvider>\n )\n }\n\n return (\n <div className=\"stn-doc-frame stn-doc-frame--alert-center\" data-theme={theme}>\n <div className=\"stn-alert-center-preview-shell\">\n {panel}\n </div>\n </div>\n )\n}\n","import { createContext, useContext } from 'react'\n\nexport type SideNavContextValue = {\n collapsed: boolean\n activeId?: string\n onSelect?: (id: string) => void\n onToggleCollapse?: () => void\n mobileOpen?: boolean\n onToggleMobileOpen?: () => void\n setMobileOpen?: (open: boolean) => void\n isDrawer?: boolean\n}\n\nexport const SideNavContext = createContext<SideNavContextValue>({\n collapsed: false,\n mobileOpen: false,\n})\n\nexport const useSideNav = () => useContext(SideNavContext)\n\n","import { forwardRef, type ButtonHTMLAttributes, type MouseEvent, type ReactNode } from 'react'\n\nimport { STN_NAV_MENU_SUB_ICON } from '@stn-uiux/pub-ui/data/stnSideNavItem'\n\nimport { cn } from '../../cn'\nimport type { StnWithoutStyle } from '../../stnStrictProps'\nimport { StnBadge } from '../StnBadge'\nimport { useSideNav } from './SideNavContext'\n\nexport type StnSideNavItemVariant = 'item' | 'sub'\nexport type StnSideNavItemIconPosition = 'left' | 'right'\n\nexport type StnSideNavItemProps = StnWithoutStyle<Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'children'>> & {\n label: string\n id?: string\n /** 1depth line icon (mask URL) 또는 2depth sub-icon mask URL */\n iconSrc?: string\n /** active 시 대체 아이콘 — Figma apps gradient URL */\n activeIconSrc?: string\n /** ReactNode 커스텀 아이콘 (1depth 및 2depth sub-icon 모두 지원) */\n icon?: ReactNode\n /** 아이콘 위치 — 기본 left, 우측 배치 시 'right' */\n iconPosition?: StnSideNavItemIconPosition\n variant?: StnSideNavItemVariant\n /** 선택됨 (Figma의 state=clicked 동일) */\n active?: boolean\n /** Figma state=clicked 지원용 별칭 (active와 동일하게 동작) */\n clicked?: boolean\n /** hover 가상 상태 강제 적용 (문서/데모용) */\n hovered?: boolean\n /** 사이드바 접힘 여부 (미지정 시 SideNavContext 값 사용) */\n collapsed?: boolean\n /** 하위 메뉴 존재 표시 (chevron 꺽쇠) — 1depth/2depth 모두 지원 */\n showChevron?: boolean\n /** 하위 메뉴 펼침 여부 (chevron 회전) */\n chevronOpen?: boolean\n /** chevron 기본 방향 및 펼침 방향 (기본: 'down', 위로 펼쳐지는 경우 'up') */\n chevronDirection?: 'down' | 'up'\n /** 숫자/텍스트 배지 (StnBadge 자동 연동) 또는 StnBadge 컴포넌트 직주입 — 1depth/2depth 모두 지원 */\n badge?: ReactNode\n /** 점 배지 표시 (StnBadge dot) */\n showBadgeDot?: boolean\n /** 2depth 서브 도트(stn-side-nav-item__sub-dot) 표시 여부 (기본값: icon이 없으면 true, icon이 있으면 false. 둘 다 원할 시 true 지정) */\n showSubDot?: boolean\n /** 2depth 서브 들여쓰기(stn-side-nav-item__sub-indent) 표시 여부 (기본값: variant=\"sub\"일 때 true) */\n showSubIndent?: boolean\n}\n\nfunction maskStyle(src: string) {\n return { maskImage: `url('${src}')`, WebkitMaskImage: `url('${src}')` } as const\n}\n\n/**\n * SideNav 메뉴 행 항목 컴포넌트 — 1depth 및 2depth sub 지원\n */\nexport const StnSideNavItem = forwardRef<HTMLButtonElement, StnSideNavItemProps>(function StnSideNavItem(\n {\n label,\n id,\n iconSrc,\n activeIconSrc,\n icon,\n iconPosition = 'left',\n variant = 'item',\n active: activeProp,\n clicked = false,\n hovered = false,\n collapsed: collapsedProp,\n showChevron = false,\n chevronOpen = false,\n chevronDirection = 'down',\n badge,\n showBadgeDot = false,\n showSubDot,\n showSubIndent = true,\n className,\n type = 'button',\n onClick,\n ...rest\n },\n ref,\n) {\n const sideNav = useSideNav()\n const collapsed = collapsedProp ?? sideNav.collapsed ?? false\n const active = Boolean(activeProp || clicked || (id != null && sideNav.activeId != null ? sideNav.activeId === id : false))\n\n const isSub = variant === 'sub'\n const hasIcon = Boolean(icon || iconSrc)\n const resolvedIconSrc = active && activeIconSrc ? activeIconSrc : iconSrc\n\n // 2depth 서브 도트 표시 여부: 명시적 prop이 있으면 그 값 사용, 없으면 icon이 없을 때 기본 표시\n const shouldShowSubDot = isSub && (showSubDot !== undefined ? showSubDot : !hasIcon)\n\n const hasBadge = badge !== undefined && badge !== null && badge !== ''\n /** 접힘: dot 배지 오버레이 */\n const showDot = collapsed && (hasBadge || showBadgeDot)\n /** 펼침: 숫자/텍스트 배지 또는 도트 배지 */\n const renderBadge = !collapsed && (hasBadge || showBadgeDot)\n\n const spreadTrail = Boolean(\n (!isSub && showChevron && !collapsed) ||\n renderBadge ||\n (iconPosition === 'right' && hasIcon),\n )\n\n const handleClick = (e: MouseEvent<HTMLButtonElement>) => {\n onClick?.(e)\n if (id && sideNav.onSelect) {\n sideNav.onSelect(id)\n }\n }\n\n // 1depth 전용 아이콘\n const iconElement = hasIcon && !isSub ? (\n <span className=\"stn-side-nav-item__icon-wrap\">\n <span className=\"stn-side-nav-item__icon\" aria-hidden=\"true\">\n {icon ??\n (resolvedIconSrc ? (\n <span className=\"stn-side-nav-item__icon-glyph\" style={maskStyle(resolvedIconSrc)} />\n ) : null)}\n </span>\n {showDot ? (\n <span className=\"stn-side-nav-item__dot-wrap\" aria-hidden=\"true\">\n <StnBadge variant=\"dot\" color=\"error\" />\n </span>\n ) : null}\n </span>\n ) : null\n\n // 2depth 전용 서브 아이콘\n const subIconElement = hasIcon && isSub ? (\n <span className=\"stn-side-nav-item__sub-icon\" aria-hidden=\"true\">\n {icon ??\n (resolvedIconSrc ? (\n <span className=\"stn-side-nav-item__icon-glyph\" style={maskStyle(resolvedIconSrc)} />\n ) : null)}\n </span>\n ) : null\n\n const activeIconElement = isSub ? subIconElement : iconElement\n\n return (\n <button\n ref={ref}\n type={type}\n className={cn(\n 'stn-side-nav-item',\n isSub && 'sub',\n active && 'active',\n hovered && 'hovered',\n collapsed && 'collapsed',\n active && activeIconSrc && 'gradient-icon',\n iconPosition === 'right' && 'icon-right',\n className,\n )}\n aria-current={active ? 'page' : undefined}\n title={collapsed ? label : undefined}\n onClick={handleClick}\n {...rest}\n >\n <span className={cn('stn-side-nav-item__inner', spreadTrail && 'spread')}>\n <span className=\"stn-side-nav-item__lead\">\n {isSub && showSubIndent ? <span className=\"stn-side-nav-item__sub-indent\" aria-hidden=\"true\" /> : null}\n {shouldShowSubDot ? (\n <span\n className={cn(\n 'stn-side-nav-item__sub-dot',\n hasIcon && iconPosition === 'left' && 'compact',\n )}\n aria-hidden=\"true\"\n >\n <span className=\"stn-side-nav-item__sub-dot-glyph\" style={maskStyle(STN_NAV_MENU_SUB_ICON)} />\n </span>\n ) : null}\n {iconPosition === 'left' ? activeIconElement : null}\n <span className=\"stn-side-nav-item__label\">{label}</span>\n </span>\n {iconPosition === 'right' ? activeIconElement : null}\n {renderBadge ? (\n typeof badge === 'string' || typeof badge === 'number' ? (\n <StnBadge\n badgeContent={badge}\n color=\"error\"\n appearance=\"subtle\"\n className=\"stn-side-nav-item__badge\"\n />\n ) : badge ? (\n <span className=\"stn-side-nav-item__badge\">{badge}</span>\n ) : showBadgeDot ? (\n <StnBadge\n variant=\"dot\"\n color=\"error\"\n className=\"stn-side-nav-item__badge\"\n />\n ) : null\n ) : null}\n {!isSub && showChevron && !collapsed ? (\n <span\n className={cn(\n 'stn-side-nav-item__chevron',\n chevronDirection === 'up' && 'up',\n chevronOpen && (chevronDirection === 'up' ? 'up open' : 'open'),\n )}\n aria-hidden=\"true\"\n />\n ) : null}\n </span>\n </button>\n )\n})\n","import { forwardRef, type HTMLAttributes, type ReactNode } from 'react'\n\nimport { cn } from '../../cn'\nimport { StnButton } from '../StnButton'\nimport { useSideNav } from './SideNavContext'\nimport { StnSideNavLogo } from './StnSideNavLogo'\n\nexport type StnSideNavHeaderProps = HTMLAttributes<HTMLDivElement> & {\n children?: ReactNode\n /** 하단 경계선(divider/border) 표시 여부 (기본값: false, 목업 규격 준수) */\n border?: boolean\n /** border 별칭 */\n hasBorder?: boolean\n /** 접기/펼치기 토글 버튼 표시 여부 @default true */\n showToggle?: boolean\n /** 드로어 모드 닫기 버튼 표시 여부 (드로어 활성화 시 기본 true) */\n showClose?: boolean\n}\n\n/**\n * SideNav 상단 헤더 영역\n * - 가운데: InfoMap 브랜드 로고 (펼침: horizontal, 접힘: onlyimg 자동 전환)\n * - 우측 플로팅: 표준 StnButton 기반 접기/펼치기 아이콘 버튼 또는 드로어 닫기 버튼\n * - 경계선: border / hasBorder prop으로 하단 구분선 유무 제어 가능 (기본값: false)\n */\nexport const StnSideNavHeader = forwardRef<HTMLDivElement, StnSideNavHeaderProps>(function StnSideNavHeader(\n {\n children,\n border = false,\n hasBorder = false,\n showToggle = true,\n showClose,\n className,\n ...rest\n },\n ref,\n) {\n const { collapsed, onToggleCollapse, isDrawer, setMobileOpen } = useSideNav()\n const withBorder = Boolean(border || hasBorder)\n const shouldShowClose = showClose ?? Boolean(isDrawer)\n\n return (\n <div\n ref={ref}\n className={cn(\n 'stn-side-nav__header',\n collapsed && 'collapsed',\n withBorder && 'has-border',\n className,\n )}\n {...rest}\n >\n {children ?? (\n <>\n <StnSideNavLogo />\n {shouldShowClose ? (\n <StnButton\n size=\"sm\"\n variant=\"ghost\"\n shape=\"square\"\n icon=\"line/x\"\n aria-label=\"사이드바 닫기\"\n title=\"사이드바 닫기\"\n className=\"stn-side-nav__collapse-btn\"\n onClick={() => setMobileOpen?.(false)}\n />\n ) : showToggle ? (\n <StnButton\n size=\"sm\"\n variant=\"ghost\"\n shape=\"square\"\n icon={collapsed ? 'line/arrow-right' : 'line/arrow-left'}\n aria-label={collapsed ? '사이드바 펼치기' : '사이드바 접기'}\n title={collapsed ? '사이드바 펼치기' : '사이드바 접기'}\n className=\"stn-side-nav__collapse-btn\"\n onClick={onToggleCollapse}\n />\n ) : null}\n </>\n )}\n </div>\n )\n})\n\n","import { forwardRef, type HTMLAttributes } from 'react'\n\nimport { cn } from '../../cn'\nimport { StnLogo, type StnLogoProps } from '../StnLogo'\nimport { useSideNav } from './SideNavContext'\n\nexport type StnSideNavLogoProps = HTMLAttributes<HTMLDivElement> & {\n logoProps?: Partial<StnLogoProps>\n}\n\n/**\n * 사이드바 로고 영역\n * - 펼침 상태: InfoMap 가로 로고 (horizontal)\n * - 접힘 상태: logo-onlyimg 심볼 (onlyimg)로 자동 대체\n */\nexport const StnSideNavLogo = forwardRef<HTMLDivElement, StnSideNavLogoProps>(\n function StnSideNavLogo({ className, logoProps, ...rest }, ref) {\n const { collapsed } = useSideNav()\n\n return (\n <div\n ref={ref}\n className={cn(\n 'stn-side-nav__logo-wrap',\n collapsed ? 'collapsed' : null,\n className,\n )}\n title=\"InfoMap\"\n {...rest}\n >\n <StnLogo\n variant={collapsed ? 'onlyimg' : 'horizontal'}\n size={collapsed ? 'md' : 'sm'}\n {...logoProps}\n />\n </div>\n )\n },\n)\n\n","import { forwardRef, type HTMLAttributes, type ReactNode } from 'react'\n\nimport { cn } from '../../cn'\nimport type { StnScrollColor, StnScrollSize } from '../StnScroll'\n\nexport type StnSideNavMenuProps = HTMLAttributes<HTMLElement> & {\n children?: ReactNode\n /** StnScroll 두께 프리셋 ('thin' | 'default' | 'thick') @default 'thin' */\n scrollSize?: StnScrollSize\n /** StnScroll 색상/스타일 프리셋 ('default' | 'primary' | 'teal' | 'muted' | 'fade') @default 'fade' */\n scrollColor?: StnScrollColor\n}\n\n/**\n * SideNav 메인 내비게이션 메뉴 컨테이너 (`<nav>`)\n * - STN StnScroll (.stn-scroll) 커스텀 스크롤바 내장\n */\nexport const StnSideNavMenu = forwardRef<HTMLElement, StnSideNavMenuProps>(function StnSideNavMenu(\n {\n children,\n className,\n scrollSize = 'thin',\n scrollColor = 'fade',\n ...rest\n },\n ref,\n) {\n return (\n <nav\n ref={ref}\n className={cn(\n 'stn-side-nav__menu',\n 'stn-scroll',\n 'stn-scroll--vertical',\n scrollSize && `stn-scroll--${scrollSize}`,\n scrollColor && `stn-scroll--${scrollColor}`,\n className,\n )}\n aria-label=\"사이드 내비게이션\"\n {...rest}\n >\n {children}\n </nav>\n )\n})\n","import {\n forwardRef,\n useEffect,\n useRef,\n useState,\n type HTMLAttributes,\n type ReactNode,\n} from 'react'\n\nimport { cn } from '../../cn'\nimport { useSideNav } from './SideNavContext'\n\nexport type StnSideNavGroupDirection = 'down' | 'up'\nexport type StnSideNavGroupVariant = 'inline' | 'dropdown'\nexport type StnSideNavDropdownVariant = 'filled' | 'transparent'\n\nexport type StnSideNavGroupProps = HTMLAttributes<HTMLDivElement> & {\n /** 그룹 타이틀 레이블 (대문자 캡션 형태로 표시) */\n label?: ReactNode\n /** 펼침/접힘 트리 부모 아이템 (예: StnSideNavItem) */\n parent?: ReactNode\n /** 펼침 방향 (기본: 'down' 아래로 펼쳐짐, 'up' 위로 펼쳐짐) */\n direction?: StnSideNavGroupDirection\n /**\n * 서브메뉴 표시 모드\n * - 'inline': 일반 문서 흐름에서 상/하로 밀면서 펼침 (기본값)\n * - 'dropdown': 위아래 레이아웃 밀림 없이 플로팅 드롭다운/팝오버 형태로 띄움\n */\n variant?: StnSideNavGroupVariant\n /** dropdown 모드 단축 boolean prop (variant=\"dropdown\"과 동일) */\n dropdown?: boolean\n /**\n * 드롭다운 서브메뉴 배경 스타일\n * - 'filled': 배경, 경계선, 블러, 그림자가 적용된 카드 팝오버 (기본값)\n * - 'transparent': 배경 및 그림자 없이 투명하게 플로팅되는 형태\n * @default 'filled'\n */\n dropdownVariant?: StnSideNavDropdownVariant\n /** 드롭다운 배경 표시 여부 (false 시 dropdownVariant=\"transparent\"와 동일) @default true */\n dropdownBackground?: boolean\n /** 펼침 상태 (controlled) */\n open?: boolean\n /** 기본 펼침 상태 (uncontrolled) */\n defaultOpen?: boolean\n /** 펼침 상태 변경 핸들러 */\n onOpenChange?: (open: boolean) => void\n children?: ReactNode\n}\n\n/**\n * SideNav 메뉴 그룹 컴포넌트\n * - `label`: 섹션 헤더 레이블로 아이템 그룹핑\n * - `parent`: 1depth 부모 아이템 클릭 시 2depth 서브메뉴 펼침/접힘 제어\n * - `variant`: 'inline'(아코디언 형태) | 'dropdown'(플로팅 팝업 드롭다운 형태)\n * - `direction`: 'down'(아래 방향) | 'up'(위 방향)\n */\nexport const StnSideNavGroup = forwardRef<HTMLDivElement, StnSideNavGroupProps>(function StnSideNavGroup(\n {\n label,\n parent,\n direction = 'down',\n variant = 'inline',\n dropdown = false,\n dropdownVariant = 'filled',\n dropdownBackground = true,\n open: openProp,\n defaultOpen = true,\n onOpenChange,\n className,\n children,\n ...rest\n },\n ref,\n) {\n const { collapsed } = useSideNav()\n const [internalOpen, setInternalOpen] = useState(defaultOpen)\n const isOpen = openProp ?? internalOpen\n const isDropdown = Boolean(dropdown || variant === 'dropdown')\n const isTransparent = dropdownVariant === 'transparent' || dropdownBackground === false\n const isUp = direction === 'up'\n\n const groupRef = useRef<HTMLDivElement | null>(null)\n\n // 드롭다운 모드일 때 외부 클릭 시 닫힘 처리\n useEffect(() => {\n if (!isDropdown || !isOpen) return\n\n const handlePointerDown = (e: globalThis.MouseEvent) => {\n if (groupRef.current && !groupRef.current.contains(e.target as Node)) {\n if (openProp === undefined) {\n setInternalOpen(false)\n }\n onOpenChange?.(false)\n }\n }\n\n document.addEventListener('mousedown', handlePointerDown)\n return () => {\n document.removeEventListener('mousedown', handlePointerDown)\n }\n }, [isDropdown, isOpen, openProp, onOpenChange])\n\n const handleToggle = () => {\n const next = !isOpen\n if (openProp === undefined) {\n setInternalOpen(next)\n }\n onOpenChange?.(next)\n }\n\n const subnavNode =\n children && (!collapsed && isOpen) ? (\n <div\n className={cn(\n 'stn-side-nav__subnav',\n isUp && 'up',\n isDropdown && 'dropdown',\n isDropdown && (isUp ? 'up' : 'down'),\n isDropdown && isTransparent && 'transparent',\n )}\n data-dropdown-variant={isDropdown ? (isTransparent ? 'transparent' : 'filled') : undefined}\n role=\"group\"\n >\n {children}\n </div>\n ) : null\n\n return (\n <div\n ref={(node) => {\n groupRef.current = node\n if (typeof ref === 'function') {\n ref(node)\n } else if (ref) {\n ref.current = node\n }\n }}\n className={cn(\n 'stn-side-nav__group',\n isUp && 'up',\n isDropdown && 'dropdown',\n className,\n )}\n role=\"group\"\n aria-label={typeof label === 'string' ? label : undefined}\n {...rest}\n >\n {label && !collapsed ? (\n <span className=\"stn-side-nav__group-label\" onClick={handleToggle}>\n {label}\n </span>\n ) : null}\n\n {/* direction=\"up\"인 경우 서브메뉴(children)가 부모(parent) 위에 위치 */}\n {isUp ? subnavNode : null}\n {parent}\n {!isUp ? subnavNode : null}\n </div>\n )\n})\n","import { forwardRef, type HTMLAttributes } from 'react'\n\nimport { cn } from '../../cn'\n\nexport type StnSideNavSpacerProps = HTMLAttributes<HTMLDivElement>\n\n/**\n * SideNav 상단 메뉴와 하단 푸터 사이의 여백을 밀어내는 Flex Spacer\n */\nexport const StnSideNavSpacer = forwardRef<HTMLDivElement, StnSideNavSpacerProps>(function StnSideNavSpacer(\n { className, style, ...rest },\n ref,\n) {\n return (\n <div\n ref={ref}\n className={cn('stn-side-nav__spacer', className)}\n style={{ flex: '1 1 0%', minHeight: '12px', ...style }}\n aria-hidden=\"true\"\n {...rest}\n />\n )\n})\n","import { forwardRef, type HTMLAttributes, type ReactNode } from 'react'\n\nimport { cn } from '../../cn'\n\nexport type StnSideNavFooterProps = HTMLAttributes<HTMLElement> & {\n /** mockup/index.html 스타일의 상단 우측 32px 곡면 라운드 및 글래스 효과 */\n curved?: boolean\n children?: ReactNode\n}\n\n/**\n * SideNav 하단 푸터 영역 (도움말, 설정, 사용자 프로필, 로그아웃 등)\n */\nexport const StnSideNavFooter = forwardRef<HTMLElement, StnSideNavFooterProps>(function StnSideNavFooter(\n { curved = false, children, className, ...rest },\n ref,\n) {\n return (\n <nav\n ref={ref}\n className={cn('stn-side-nav__footer', curved && 'curved', className)}\n aria-label=\"보조 내비게이션\"\n {...rest}\n >\n {children}\n </nav>\n )\n})\n","import { forwardRef, type ButtonHTMLAttributes } from 'react'\n\nimport { cn } from '../../cn'\nimport { useSideNav } from './SideNavContext'\n\nexport type StnSideNavToggleProps = ButtonHTMLAttributes<HTMLButtonElement>\n\n/**\n * mockup/index.html의 플로팅 원형 사이드바 접기/펼치기 버튼 (Figma 40004302:30002)\n * 접힘 시 사이드바 우측 경계선에 걸치고, 펼침 시 헤더 우측 상단으로 이동하며 180도 회전\n */\nexport const StnSideNavToggle = forwardRef<HTMLButtonElement, StnSideNavToggleProps>(\n function StnSideNavToggle({ className, onClick, ...rest }, ref) {\n const { collapsed, onToggleCollapse } = useSideNav()\n\n return (\n <button\n ref={ref}\n type=\"button\"\n className={cn('stn-side-nav__toggle', className)}\n onClick={(e) => {\n onToggleCollapse?.()\n onClick?.(e)\n }}\n aria-label={collapsed ? '사이드바 펼치기' : '사이드바 접기'}\n title={collapsed ? '사이드바 펼치기' : '사이드바 접기'}\n {...rest}\n >\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M9 18l6-6-6-6\" />\n </svg>\n </button>\n )\n },\n)\n\n","import { forwardRef, type HTMLAttributes } from 'react'\n\nimport { cn } from '../../cn'\nimport { StnLogo, type StnLogoSize, type StnLogoTheme } from '../StnLogo'\n\nexport type StnSideNavWatermarkProps = HTMLAttributes<HTMLDivElement> & {\n /**\n * 워터마크 로고 크기 (xs, sm, md, lg, xl).\n * 사이드바 기본 규격에 최적화된 'xl' (120px)이 기본값입니다.\n * @default 'xl'\n */\n size?: StnLogoSize\n /**\n * 다크 / 라이트 테마 (미지정 시 상위 data-theme에 따라 자동 전환)\n */\n theme?: StnLogoTheme\n}\n\n/**\n * 사이드바 하단 3D 엠보싱 브랜드 워터마크 카드 (Figma 40004218:102473)\n * StnLogo(variant=\"watermark\") 기반으로 크기(size prop) 및 테마 제어를 지원합니다.\n */\nexport const StnSideNavWatermark = forwardRef<HTMLDivElement, StnSideNavWatermarkProps>(\n function StnSideNavWatermark({ size = 'xl', theme, className, ...rest }, ref) {\n return (\n <div\n ref={ref}\n className={cn('stn-side-nav__watermark', className)}\n aria-hidden=\"true\"\n {...rest}\n >\n <StnLogo variant=\"watermark\" size={size} theme={theme} />\n </div>\n )\n },\n)\n\n","import { forwardRef, type ButtonHTMLAttributes, type ReactNode } from 'react'\nimport { cn } from '../../cn'\nimport { useSideNav } from './SideNavContext'\n\nexport type StnSideNavMobileTriggerProps = ButtonHTMLAttributes<HTMLButtonElement> & {\n /** 화면 좌하단 플로팅 고정 여부 @default false */\n floating?: boolean\n children?: ReactNode\n}\n\n/**\n * 모바일 화면에서 사이드 내비게이션 드로어를 열고 닫는 햄버거 토글 버튼\n * - \floating 속성 지정 시 화면 좌하단에 플로팅 버튼으로 고정됩니다.\n * - 컴포넌트 단독 또는 StnSideNavigation.MobileTrigger로 접근할 수 있습니다.\n */\nexport const StnSideNavMobileTrigger = forwardRef<HTMLButtonElement, StnSideNavMobileTriggerProps>(\n function StnSideNavMobileTrigger({ floating = false, className, children, onClick, ...rest }, ref) {\n const { onToggleMobileOpen, mobileOpen } = useSideNav()\n\n return (\n <button\n ref={ref}\n type=\"button\"\n className={cn(\n 'stn-side-nav__mobile-trigger',\n floating && 'floating',\n mobileOpen && 'is-open',\n className,\n )}\n aria-label={mobileOpen ? '사이드 내비게이션 닫기' : '사이드 내비게이션 열기'}\n aria-expanded={mobileOpen}\n onClick={(e) => {\n onClick?.(e)\n onToggleMobileOpen?.()\n }}\n {...rest}\n >\n {children ?? (\n <span className=\"stn-side-nav__hamburger-bars\" aria-hidden=\"true\">\n <span />\n <span />\n <span />\n </span>\n )}\n </button>\n )\n },\n)\r\n","import {\n forwardRef,\n type HTMLAttributes,\n type ReactNode,\n} from 'react'\n\nimport { cn } from '../../cn'\nimport { StnButton, type StnButtonProps } from '../StnButton'\nimport { useSideNav } from './SideNavContext'\n\nexport type StnSideNavSubProps = HTMLAttributes<HTMLDivElement> & {\n children?: ReactNode\n}\n\n/**\n * SideNav 하단 푸터 바로 위의 서브/유틸리티 액션 영역 (화면 조정, 테마 전환 등)\n * - 내부에 StnButton(variant=\"ghost\") 또는 StnSideNavigation.SubItem / Button을 배치할 수 있습니다.\n * - 접힘 상태(collapsed): 세로 1열 32px 원형 아이콘 버튼 배치\n * - 펼침 상태(expanded): 가로 2열 캡슐형 Ghost 버튼 배치\n */\nexport const StnSideNavSub = forwardRef<HTMLDivElement, StnSideNavSubProps>(\n function StnSideNavSub({ children, className, ...rest }, ref) {\n return (\n <div\n ref={ref}\n className={cn('stn-side-nav__sub', className)}\n role=\"toolbar\"\n aria-label=\"보조 유틸리티\"\n {...rest}\n >\n {children}\n </div>\n )\n },\n)\n\nexport type StnSideNavSubItemProps = Omit<StnButtonProps, 'variant' | 'size' | 'shape'> & {\n /** 버튼 변형 (기본: 'ghost') */\n variant?: StnButtonProps['variant']\n /** 버튼 크기 (기본: 'md') */\n size?: StnButtonProps['size']\n /** 버튼 형태 (기본: 'pill') */\n shape?: StnButtonProps['shape']\n /** 좌측 또는 단독 아이콘 (ReactNode 또는 아이콘명 slug) */\n icon?: ReactNode\n /** 아이콘 이미지 경로 (SVG 등) */\n iconSrc?: string\n /** 펼쳤을 때 표시되는 버튼 텍스트 라벨 (children 대신 지정 가능) */\n label?: string\n /** 툴팁 또는 접근성 타이틀 (미지정 시 label 사용) */\n title?: string\n children?: ReactNode\n className?: string\n}\n\n/**\n * StnSideNavSub 내부에서 사용하는 보조 액션 버튼 (StnButton variant=\"ghost\" 기반)\n */\nexport const StnSideNavSubItem = forwardRef<HTMLButtonElement, StnSideNavSubItemProps>(\n function StnSideNavSubItem(\n {\n variant = 'ghost',\n size = 'md',\n shape = 'pill',\n icon,\n iconSrc,\n label,\n title,\n children,\n className,\n ...rest\n },\n ref,\n ) {\n const { collapsed } = useSideNav()\n const content = children ?? label\n const computedTitle = title ?? (typeof content === 'string' ? content : undefined)\n const resolvedIcon =\n icon ??\n (iconSrc ? (\n <span className=\"stn-side-nav__sub-icon\">\n <span\n className=\"stn-side-nav__sub-glyph\"\n style={{ maskImage: `url('${iconSrc}')`, WebkitMaskImage: `url('${iconSrc}')` }}\n />\n </span>\n ) : null)\n\n return (\n <StnButton\n ref={ref}\n variant={variant}\n size={size}\n shape={shape}\n icon={resolvedIcon}\n className={cn('stn-side-nav__sub-btn', className)}\n title={computedTitle}\n aria-label={computedTitle}\n {...rest}\n >\n {collapsed ? null : content}\n </StnButton>\n )\n },\n)\n\n","import { forwardRef, type HTMLAttributes, type ReactNode } from 'react'\nimport { cn } from '../../cn'\n\nexport type StnSideNavSubNavVariant = 'filled' | 'transparent'\nexport type StnSideNavSubNavDirection = 'down' | 'up'\n\nexport type StnSideNavSubNavProps = HTMLAttributes<HTMLDivElement> & {\n /** 드롭다운(플로팅 팝오버) 모드 여부 @default false */\n dropdown?: boolean\n /** 드롭다운 펼침 방향 ('down' 아래로 | 'up' 위로) @default 'down' */\n direction?: StnSideNavSubNavDirection\n /** 드롭다운 배경 스타일 ('filled' 기본 배경/보더/그림자 | 'transparent' 배경 없는 투명) @default 'filled' */\n variant?: StnSideNavSubNavVariant\n /** 배경 표시 여부 (false 시 variant=\"transparent\"와 동일) @default true */\n background?: boolean\n children?: ReactNode\n}\n\n/**\n * Side Navigation 서브메뉴(2depth) 컨테이너 컴포넌트 (`.stn-side-nav__subnav`)\n * - 인라인 아코디언 서브메뉴 목록 또는 플로팅 드롭다운 서브메뉴 목록을 감싸는 전용 래퍼입니다.\n * - `dropdown`: true 지정 시 플로팅 드롭다운 팝오버 모드로 전환됩니다.\n * - `variant`: 'filled'(배경/보더/그림자 카드) | 'transparent'(배경 없는 투명 모드)\n * - `background`: false 지정 시 투명 모드로 전환됩니다.\n */\nexport const StnSideNavSubNav = forwardRef<HTMLDivElement, StnSideNavSubNavProps>(\n function StnSideNavSubNav(\n {\n dropdown = false,\n direction = 'down',\n variant = 'filled',\n background = true,\n className,\n children,\n ...rest\n },\n ref,\n ) {\n const isUp = direction === 'up'\n const isTransparent = variant === 'transparent' || background === false\n\n return (\n <div\n ref={ref}\n className={cn(\n 'stn-side-nav__subnav',\n isUp && 'up',\n dropdown && 'dropdown',\n dropdown && (isUp ? 'up' : 'down'),\n dropdown && isTransparent && 'transparent',\n className,\n )}\n data-dropdown-variant={dropdown ? (isTransparent ? 'transparent' : 'filled') : undefined}\n role=\"group\"\n {...rest}\n >\n {children}\n </div>\n )\n },\n)\n","import {\n forwardRef,\n useCallback,\n useMemo,\n useState,\n type HTMLAttributes,\n type ReactNode,\n} from 'react'\n\nimport { cn } from '../../cn'\nimport {\n SideNavContext,\n StnSideNavFooter,\n StnSideNavGroup,\n StnSideNavHeader,\n StnSideNavItem,\n StnSideNavLogo,\n StnSideNavMenu,\n StnSideNavMobileTrigger,\n StnSideNavSpacer,\n StnSideNavSub,\n StnSideNavSubItem,\n StnSideNavSubNav,\n StnSideNavToggle,\n StnSideNavWatermark,\n type SideNavContextValue,\n} from '../../components/sideNav'\n\nexport type StnSideNavigationVariant = 'default' | 'glassmorphism'\n\nexport type StnSideNavigationProps = HTMLAttributes<HTMLElement> & {\n /** 사이드바 배경 및 외형 스타일 ('default' 불투명 솔리드 | 'glassmorphism' 반투명 블러) @default 'default' */\n variant?: StnSideNavigationVariant\n /** variant 별칭 */\n appearance?: StnSideNavigationVariant\n /** 모바일 드로어 모드에서의 배경 스타일 (미지정 시 variant 값을 상속) */\n drawerVariant?: StnSideNavigationVariant\n /** drawerVariant 별칭 */\n drawerAppearance?: StnSideNavigationVariant\n /** 사이드바 접힘 상태 (controlled) */\n collapsed?: boolean\n /** 기본 접힘 상태 (uncontrolled) @default false */\n defaultCollapsed?: boolean\n /** 접힘 상태 변경 콜백 */\n onCollapseChange?: (collapsed: boolean) => void\n /** 활성화된 메뉴 아이템 id (controlled) */\n activeId?: string\n /** 기본 활성 메뉴 아이템 id (uncontrolled) */\n defaultActiveId?: string\n /** 메뉴 선택 변경 콜백 */\n onActiveChange?: (activeId: string) => void\n /** 모바일 드로어 열림 상태 (controlled) */\n mobileOpen?: boolean\n /** 기본 모바일 드로어 열림 상태 (uncontrolled) @default false */\n defaultMobileOpen?: boolean\n /** 모바일 드로어 열림 상태 변경 콜백 */\n onMobileOpenChange?: (open: boolean) => void\n /** 상시 드로어 모드 활성화 (화면 오버레이 슬라이드아웃 패널) @default false */\n drawer?: boolean\n /** 반응형 자동 드로어 모드 (모바일 화면 <= 768px / 1024px 시 자동으로 드로어로 변환) @default true */\n responsiveDrawer?: boolean\n /** 화면 좌하단 플로팅 햄버거 토글 버튼 자동 렌더 여부 @default false */\n showMobileTrigger?: boolean\n children?: ReactNode\n}\n\nfunction useControllableState<T>(\n controlledValue: T | undefined,\n defaultValue: T,\n onChange?: (value: T) => void,\n) {\n const [internalState, setInternalState] = useState<T>(defaultValue)\n const isControlled = controlledValue !== undefined\n const value = isControlled ? controlledValue : internalState\n\n const setValue = useCallback(\n (next: T) => {\n if (!isControlled) {\n setInternalState(next)\n }\n onChange?.(next)\n },\n [isControlled, onChange],\n )\n\n return [value, setValue] as const\n}\n\n/**\n * 현대적인 합성(Compound) 사이드 내비게이션 패턴\n *\n * Header, Menu, Group, Item, Spacer, Footer, MobileTrigger를 자유롭게 조립하여 사용합니다.\n * 모바일 화면을 위한 햄버거 토글 버튼(`StnSideNavigation.MobileTrigger`) 및 슬라이드아웃 드로어(`drawer`, `responsiveDrawer`)를 기본 지원합니다.\n *\n * @example\n * ```tsx\n * <StnSideNavigation\n * collapsed={collapsed}\n * onCollapseChange={setCollapsed}\n * responsiveDrawer\n * showMobileTrigger\n * >\n * <StnSideNavigation.Header />\n * <StnSideNavigation.Menu>\n * <StnSideNavigation.Item iconSrc={...} label=\"대시보드\" active />\n * </StnSideNavigation.Menu>\n * </StnSideNavigation>\n * ```\n */\nconst StnSideNavigationRoot = forwardRef<HTMLElement, StnSideNavigationProps>(function StnSideNavigationRoot(\n {\n variant: variantProp,\n appearance,\n drawerVariant: drawerVariantProp,\n drawerAppearance,\n collapsed: collapsedProp,\n defaultCollapsed = false,\n onCollapseChange,\n activeId: activeIdProp,\n defaultActiveId,\n onActiveChange,\n mobileOpen: mobileOpenProp,\n defaultMobileOpen = false,\n onMobileOpenChange,\n drawer = false,\n responsiveDrawer = true,\n showMobileTrigger = false,\n className,\n children,\n ...rest\n },\n ref,\n) {\n const variant = variantProp ?? appearance ?? 'default'\n const drawerVariant = drawerVariantProp ?? drawerAppearance ?? variant\n\n const [collapsed, setCollapsed] = useControllableState(\n collapsedProp,\n defaultCollapsed,\n onCollapseChange,\n )\n\n const [activeId, setActiveId] = useControllableState(\n activeIdProp,\n defaultActiveId ?? '',\n onActiveChange,\n )\n\n const [mobileOpen, setMobileOpen] = useControllableState(\n mobileOpenProp,\n defaultMobileOpen,\n onMobileOpenChange,\n )\n\n const handleToggleCollapse = useCallback(() => {\n setCollapsed(!collapsed)\n }, [collapsed, setCollapsed])\n\n const handleToggleMobileOpen = useCallback(() => {\n setMobileOpen(!mobileOpen)\n }, [mobileOpen, setMobileOpen])\n\n const isDrawerMode = Boolean(drawer || (responsiveDrawer && mobileOpen))\n // 모바일 드로어가 열려있을 때(mobileOpen)는 collapsed 상태를 해제하여 항상 전체 메뉴와 라벨이 보이도록 함\n const isEffectiveCollapsed = isDrawerMode && mobileOpen ? false : collapsed\n\n // 드로어 모드일 때는 drawerVariant를 우선 적용 (미지정 시 variant 상속)\n const activeVariant = isDrawerMode && mobileOpen ? drawerVariant : variant\n const isGlassmorphism = activeVariant === 'glassmorphism'\n\n const contextValue: SideNavContextValue = useMemo(\n () => ({\n collapsed: isEffectiveCollapsed,\n activeId,\n onSelect: setActiveId,\n onToggleCollapse: handleToggleCollapse,\n mobileOpen,\n onToggleMobileOpen: handleToggleMobileOpen,\n setMobileOpen,\n isDrawer: isDrawerMode,\n }),\n [isEffectiveCollapsed, activeId, setActiveId, handleToggleCollapse, mobileOpen, handleToggleMobileOpen, setMobileOpen, isDrawerMode],\n )\n\n return (\n <SideNavContext.Provider value={contextValue}>\n {showMobileTrigger && (\n <StnSideNavMobileTrigger floating />\n )}\n {(drawer || responsiveDrawer) && (\n <div\n className={cn('stn-side-nav__backdrop', mobileOpen && 'is-open')}\n onClick={() => setMobileOpen(false)}\n aria-hidden={!mobileOpen}\n />\n )}\n <aside\n ref={ref}\n className={cn(\n 'stn-side-nav',\n isGlassmorphism ? 'glassmorphism' : 'default',\n isEffectiveCollapsed && 'collapsed',\n drawer && 'drawer',\n responsiveDrawer && 'responsive-drawer',\n mobileOpen && (drawer || responsiveDrawer) && 'open is-open',\n className,\n )}\n data-stn-side-nav-variant={variant}\n data-stn-side-nav-drawer-variant={drawerVariant}\n aria-label=\"사이드 내비게이션 바\"\n {...rest}\n >\n {children}\n </aside>\n </SideNavContext.Provider>\n )\n})\n\nexport const StnSideNavigation = Object.assign(StnSideNavigationRoot, {\n Header: StnSideNavHeader,\n Toggle: StnSideNavToggle,\n Logo: StnSideNavLogo,\n Menu: StnSideNavMenu,\n Group: StnSideNavGroup,\n Item: StnSideNavItem,\n SubNav: StnSideNavSubNav,\n Spacer: StnSideNavSpacer,\n Sub: StnSideNavSub,\n SubItem: StnSideNavSubItem,\n Footer: StnSideNavFooter,\n Watermark: StnSideNavWatermark,\n MobileTrigger: StnSideNavMobileTrigger,\n})\n\n","import {\n Fragment,\n useEffect,\n useId,\n useRef,\n useState,\n type AnchorHTMLAttributes,\n type ButtonHTMLAttributes,\n type ReactNode,\n} from 'react'\n\nimport {\n STN_BREADCRUMB_ICON_SRC,\n type StnBreadcrumbIconId,\n} from '@stn-uiux/pub-ui/data/stnBreadcrumb'\n\nimport { cn } from '../cn'\n\nfunction maskStyle(src: string) {\n return { maskImage: `url('${src}')`, WebkitMaskImage: `url('${src}')` } as const\n}\n\nexport type StnBreadcrumbSize = 'sm' | 'md' | 'lg'\nexport type StnBreadcrumbVariant = 'default' | 'chip'\n\n/** Sibling / alternate path option shown in a segment dropdown */\nexport type StnBreadcrumbMenuItem = {\n id: string\n label: string\n href?: string\n onClick?: () => void\n /** Marks the active sibling in the menu */\n current?: boolean\n}\n\nexport type StnBreadcrumbItem = {\n id: string\n label: string\n /** line icon mask src — defaults from `icon` id */\n iconSrc?: string\n icon?: Exclude<StnBreadcrumbIconId, 'home' | 'separator' | 'caret'>\n /**\n * Show caret and open sibling picker when `menuItems` is provided.\n * Without `menuItems`, caret is decorative only (prefer passing `menuItems`).\n */\n menu?: boolean\n /** Dropdown options under this segment */\n menuItems?: StnBreadcrumbMenuItem[]\n href?: string\n onClick?: () => void\n current?: boolean\n}\n\nexport type StnBreadcrumbProps = {\n items: StnBreadcrumbItem[]\n className?: string\n /** 크기: sm · md(기본) · lg — 클래스 `.sm` `.md` `.lg` */\n size?: StnBreadcrumbSize\n /** `chip`이면 루트에 `.chip` */\n variant?: StnBreadcrumbVariant\n /** 이 개수를 넘으면 중간을 `.collapsed` 버튼으로 접음 */\n maxItems?: number\n itemsBeforeCollapse?: number\n itemsAfterCollapse?: number\n homeHref?: string\n onHomeClick?: () => void\n showHome?: boolean\n homeLabel?: string\n renderItem?: (item: StnBreadcrumbItem, segment: ReactNode) => ReactNode\n}\n\nfunction resolveIconSrc(item: StnBreadcrumbItem) {\n if (item.iconSrc) return item.iconSrc\n if (item.icon) return STN_BREADCRUMB_ICON_SRC[item.icon]\n return undefined\n}\n\nfunction hasSegmentMenu(item: StnBreadcrumbItem) {\n return Boolean(item.menu || (item.menuItems && item.menuItems.length > 0))\n}\n\nfunction BreadcrumbSeparator() {\n return (\n <li className=\"separator\" aria-hidden=\"true\">\n <span style={maskStyle(STN_BREADCRUMB_ICON_SRC.separator)} />\n </li>\n )\n}\n\nfunction BreadcrumbIcon({ src }: { src: string }) {\n return <span className=\"stn-breadcrumb__icon-glyph\" style={maskStyle(src)} aria-hidden=\"true\" />\n}\n\nfunction BreadcrumbCaret() {\n return (\n <span\n className=\"stn-breadcrumb__caret\"\n style={maskStyle(STN_BREADCRUMB_ICON_SRC.caret)}\n aria-hidden=\"true\"\n />\n )\n}\n\nfunction SegmentContent({\n iconSrc,\n label,\n menu,\n}: {\n iconSrc?: string\n label: string\n menu?: boolean\n}) {\n return (\n <>\n {iconSrc ? <BreadcrumbIcon src={iconSrc} /> : null}\n <span className=\"stn-breadcrumb__label\">{label}</span>\n {menu ? <BreadcrumbCaret /> : null}\n </>\n )\n}\n\nfunction BreadcrumbMenuList({\n id,\n items,\n onPick,\n}: {\n id: string\n items: StnBreadcrumbMenuItem[]\n onPick: () => void\n}) {\n return (\n <ul id={id} className=\"stn-breadcrumb__menu\" role=\"menu\">\n {items.map((option) => (\n <li key={option.id} role=\"none\">\n {option.href ? (\n <a\n role=\"menuitem\"\n href={option.href}\n aria-current={option.current ? 'true' : undefined}\n onClick={() => {\n option.onClick?.()\n onPick()\n }}\n >\n {option.label}\n </a>\n ) : (\n <button\n type=\"button\"\n role=\"menuitem\"\n aria-current={option.current ? 'true' : undefined}\n onClick={() => {\n option.onClick?.()\n onPick()\n }}\n >\n {option.label}\n </button>\n )}\n </li>\n ))}\n </ul>\n )\n}\n\nfunction useDismissibleMenu<T extends HTMLElement>(open: boolean, onClose: () => void) {\n const rootRef = useRef<T | null>(null)\n\n useEffect(() => {\n if (!open) return\n\n const onPointerDown = (event: PointerEvent) => {\n if (!rootRef.current?.contains(event.target as Node)) onClose()\n }\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') onClose()\n }\n\n document.addEventListener('pointerdown', onPointerDown)\n document.addEventListener('keydown', onKeyDown)\n return () => {\n document.removeEventListener('pointerdown', onPointerDown)\n document.removeEventListener('keydown', onKeyDown)\n }\n }, [open, onClose])\n\n return rootRef\n}\n\nfunction BreadcrumbSegment({\n item,\n isCurrent,\n}: {\n item: StnBreadcrumbItem\n isCurrent: boolean\n}) {\n const menuId = useId()\n const [open, setOpen] = useState(false)\n const menuItems = item.menuItems ?? []\n const showMenu = hasSegmentMenu(item) && !isCurrent\n const canOpenMenu = showMenu && menuItems.length > 0\n const rootRef = useDismissibleMenu<HTMLSpanElement>(open, () => setOpen(false))\n const iconSrc = resolveIconSrc(item)\n const content = <SegmentContent iconSrc={iconSrc} label={item.label} menu={showMenu} />\n\n if (isCurrent) {\n return (\n <span className=\"stn-breadcrumb__segment\" aria-current=\"page\" aria-label={item.label}>\n {content}\n </span>\n )\n }\n\n if (canOpenMenu) {\n return (\n <span ref={rootRef} className=\"stn-breadcrumb__segment-wrap\">\n <button\n type=\"button\"\n className=\"stn-breadcrumb__segment\"\n aria-label={item.label}\n aria-haspopup=\"menu\"\n aria-expanded={open}\n aria-controls={menuId}\n onClick={() => {\n item.onClick?.()\n setOpen((value) => !value)\n }}\n >\n {content}\n </button>\n {open ? (\n <BreadcrumbMenuList id={menuId} items={menuItems} onPick={() => setOpen(false)} />\n ) : null}\n </span>\n )\n }\n\n if (item.menu || item.onClick) {\n const buttonProps: ButtonHTMLAttributes<HTMLButtonElement> = {\n type: 'button',\n className: 'stn-breadcrumb__segment',\n onClick: item.onClick,\n 'aria-label': item.label,\n 'aria-haspopup': item.menu ? 'menu' : undefined,\n 'aria-expanded': item.menu ? false : undefined,\n }\n return <button {...buttonProps}>{content}</button>\n }\n\n if (item.href) {\n const linkProps: AnchorHTMLAttributes<HTMLAnchorElement> = {\n href: item.href,\n className: 'stn-breadcrumb__segment',\n onClick: item.onClick,\n 'aria-label': item.label,\n }\n return <a {...linkProps}>{content}</a>\n }\n\n return (\n <span className=\"stn-breadcrumb__segment\" aria-label={item.label}>\n {content}\n </span>\n )\n}\n\nfunction BreadcrumbBack({\n label,\n href,\n onClick,\n}: {\n label: string\n href?: string\n onClick?: () => void\n}) {\n const content = (\n <>\n <span\n className=\"stn-breadcrumb__back-glyph\"\n style={maskStyle(STN_BREADCRUMB_ICON_SRC.separator)}\n aria-hidden=\"true\"\n />\n <span className=\"stn-breadcrumb__label\">{label}</span>\n </>\n )\n\n if (href) {\n return (\n <a className=\"stn-breadcrumb__back\" href={href} onClick={onClick} aria-label={`뒤로: ${label}`}>\n {content}\n </a>\n )\n }\n\n return (\n <button type=\"button\" className=\"stn-breadcrumb__back\" onClick={onClick} aria-label={`뒤로: ${label}`}>\n {content}\n </button>\n )\n}\n\nfunction splitCollapsedItems(\n items: StnBreadcrumbItem[],\n maxItems: number | undefined,\n itemsBeforeCollapse: number,\n itemsAfterCollapse: number,\n) {\n if (!maxItems || items.length <= maxItems) {\n return { head: items, hidden: [] as StnBreadcrumbItem[], tail: [] as StnBreadcrumbItem[] }\n }\n\n const before = Math.max(1, itemsBeforeCollapse)\n const after = Math.max(1, itemsAfterCollapse)\n const reserved = before + after\n if (items.length <= reserved) {\n return { head: items, hidden: [] as StnBreadcrumbItem[], tail: [] as StnBreadcrumbItem[] }\n }\n\n return {\n head: items.slice(0, before),\n hidden: items.slice(before, items.length - after),\n tail: items.slice(items.length - after),\n }\n}\n\nfunction BreadcrumbCollapsed({\n items,\n menuId,\n}: {\n items: StnBreadcrumbItem[]\n menuId: string\n}) {\n const [open, setOpen] = useState(false)\n const rootRef = useDismissibleMenu<HTMLLIElement>(open, () => setOpen(false))\n\n const menuItems: StnBreadcrumbMenuItem[] = items.map((item) => ({\n id: item.id,\n label: item.label,\n href: item.href,\n onClick: item.onClick,\n current: item.current,\n }))\n\n return (\n <li className=\"stn-breadcrumb__item\" ref={rootRef}>\n <button\n type=\"button\"\n className=\"collapsed\"\n aria-expanded={open}\n aria-haspopup=\"menu\"\n aria-controls={menuId}\n aria-label=\"숨긴 경로 펼치기\"\n onClick={() => setOpen((value) => !value)}\n >\n ⋯\n </button>\n {open ? (\n <BreadcrumbMenuList id={menuId} items={menuItems} onPick={() => setOpen(false)} />\n ) : null}\n </li>\n )\n}\n\nexport function StnBreadcrumb({\n items,\n className,\n size = 'md',\n variant = 'default',\n maxItems,\n itemsBeforeCollapse = 1,\n itemsAfterCollapse = 1,\n homeHref = '#',\n onHomeClick,\n showHome = true,\n homeLabel = '홈',\n renderItem,\n}: StnBreadcrumbProps) {\n const menuId = useId()\n const currentIndex = items.findIndex((item, index) => item.current ?? index === items.length - 1)\n const currentItem = currentIndex >= 0 ? items[currentIndex] : items[items.length - 1]\n const previousItem = currentIndex > 0 ? items[currentIndex - 1] : null\n const backHref = previousItem?.href ?? (showHome ? homeHref : undefined)\n const backOnClick = previousItem?.onClick ?? onHomeClick\n const { head, hidden, tail } = splitCollapsedItems(\n items,\n maxItems,\n itemsBeforeCollapse,\n itemsAfterCollapse,\n )\n\n const lastId = items[items.length - 1]?.id\n\n const renderTrailItem = (item: StnBreadcrumbItem) => {\n const isCurrent = Boolean(item.current) || item.id === lastId\n const segment = <BreadcrumbSegment item={item} isCurrent={isCurrent} />\n\n return (\n <li\n className={cn(\n 'stn-breadcrumb__item',\n isCurrent ? 'stn-breadcrumb__item--current' : 'stn-breadcrumb__item--middle',\n )}\n >\n {renderItem ? renderItem(item, segment) : segment}\n </li>\n )\n }\n\n return (\n <nav\n className={cn('stn-breadcrumb', size, variant === 'chip' && 'chip', className)}\n aria-label=\"Breadcrumb\"\n >\n <ol className=\"stn-breadcrumb__list\">\n {currentItem ? (\n <li className=\"stn-breadcrumb__item stn-breadcrumb__item--back\">\n <BreadcrumbBack label={currentItem.label} href={backHref} onClick={backOnClick} />\n </li>\n ) : null}\n\n {showHome ? (\n <li className=\"stn-breadcrumb__item stn-breadcrumb__item--home\">\n <a className=\"stn-breadcrumb__home\" href={homeHref} onClick={onHomeClick}>\n <BreadcrumbIcon src={STN_BREADCRUMB_ICON_SRC.home} />\n <span className=\"blind\">{homeLabel}</span>\n </a>\n </li>\n ) : null}\n\n {head.map((item, index) => (\n <Fragment key={item.id}>\n {showHome || index > 0 ? <BreadcrumbSeparator /> : null}\n {renderTrailItem(item)}\n </Fragment>\n ))}\n\n {hidden.length > 0 ? (\n <>\n <BreadcrumbSeparator />\n <BreadcrumbCollapsed items={hidden} menuId={menuId} />\n </>\n ) : null}\n\n {tail.map((item) => (\n <Fragment key={item.id}>\n <BreadcrumbSeparator />\n {renderTrailItem(item)}\n </Fragment>\n ))}\n </ol>\n </nav>\n )\n}\n","import { useEffect, useState, type HTMLAttributes, type ReactNode } from 'react'\n\nimport { STN_HEADER_TITLE_FRAME } from '@stn-uiux/pub-ui/data/stnHeaderTitle'\n\nimport { cn } from '../cn'\n\nconst KO_WEEKDAY_SHORT = ['일', '월', '화', '수', '목', '금', '토'] as const\nconst KO_WEEKDAY_LONG = [\n '일요일',\n '월요일',\n '화요일',\n '수요일',\n '목요일',\n '금요일',\n '토요일',\n] as const\n\nexport interface StnHeaderTitleDateOptions {\n /** 요일 포함 여부 (기본 true) */\n includeWeekday?: boolean\n /** 요일 표기 형식 ('short': '(화)' · 'long': '(화요일)', 기본 'short') */\n weekdayFormat?: 'short' | 'long'\n}\n\nexport interface StnHeaderTitleTimeOptions {\n /** 초(Seconds) 포함 여부 (기본 true, false 시 'HH:mm') */\n showSeconds?: boolean\n}\n\nexport function formatStnHeaderTitleDate(date: Date, options?: StnHeaderTitleDateOptions) {\n const y = date.getFullYear()\n const m = String(date.getMonth() + 1).padStart(2, '0')\n const d = String(date.getDate()).padStart(2, '0')\n const base = `${y}.${m}.${d}`\n if (options?.includeWeekday === false) {\n return base\n }\n const dayIdx = date.getDay()\n const weekdayText =\n options?.weekdayFormat === 'long' ? KO_WEEKDAY_LONG[dayIdx] : KO_WEEKDAY_SHORT[dayIdx]\n return `${base}(${weekdayText})`\n}\n\nexport function formatStnHeaderTitleWeekday(\n date: Date,\n format: 'short' | 'long' = 'short',\n wrapped = true,\n) {\n const dayIdx = date.getDay()\n const text = format === 'long' ? KO_WEEKDAY_LONG[dayIdx] : KO_WEEKDAY_SHORT[dayIdx]\n return wrapped ? `(${text})` : text\n}\n\nexport function formatStnHeaderTitleTime(date: Date, options?: StnHeaderTitleTimeOptions) {\n const h = String(date.getHours()).padStart(2, '0')\n const m = String(date.getMinutes()).padStart(2, '0')\n if (options?.showSeconds === false) {\n return `${h}:${m}`\n }\n const s = String(date.getSeconds()).padStart(2, '0')\n return `${h}:${m}:${s}`\n}\n\nexport type StnHeaderTitleVariant = 'title' | 'dual' | 'clock'\nexport type StnHeaderTitleSize = 'sm' | 'md' | 'lg'\n\ntype StnHeaderTitleBaseProps = Omit<HTMLAttributes<HTMLElement>, 'children' | 'title'> & {\n className?: string\n /** 프레임 그래픽 표시 · 기본 true · false면 텍스트만 */\n framed?: boolean\n /** 글자 크기 ('sm': 24/16px · 'md': 32/18px · 'lg': 40/20px) · 기본 'md' */\n size?: StnHeaderTitleSize\n}\n\nexport type StnHeaderTitleTitleProps = StnHeaderTitleBaseProps & {\n variant?: 'title'\n /** 단일 타이틀 텍스트 (children 또는 title) */\n title?: ReactNode\n children?: ReactNode\n}\n\nexport type StnHeaderTitleDualProps = StnHeaderTitleBaseProps & {\n variant?: 'dual'\n /** 앞부분 일반 굵기 보조 텍스트 (18px Medium) */\n subText?: ReactNode\n /** 뒷부분 굵은 메인 타이틀 텍스트 (32px SemiBold) */\n mainText?: ReactNode\n /** title 또는 children도 mainText로 사용 가능 */\n title?: ReactNode\n children?: ReactNode\n}\n\nexport type StnHeaderTitleClockProps = StnHeaderTitleBaseProps & {\n variant: 'clock'\n /** 지정 날짜 문자열 (생략 시 현재 날짜) */\n date?: string\n /** 지정 시각 문자열 (생략 시 현재 시각) */\n time?: string\n /** 지정 요일 문자열 (생략 시 현재 요일 또는 날짜 포맷에 포함) */\n weekday?: string\n /** 1초마다 실시간 갱신 (기본: date와 time이 모두 없을 때 true) */\n live?: boolean\n /** 날짜 표시 여부 (기본 true) */\n showDate?: boolean\n /** 요일 표시 여부 (기본 true, showDate=true일 때 날짜 뒤에 포함되거나 단독 표시) */\n showWeekday?: boolean\n /** 시각 표시 여부 (기본 true) */\n showTime?: boolean\n /** 시각 표시 시 초(Seconds) 포함 여부 (기본 true, false 시 'HH:mm') */\n showSeconds?: boolean\n /** 요일 표기 형식 ('short': '(화)' · 'long': '(화요일)', 기본 'short') */\n weekdayFormat?: 'short' | 'long'\n /** 커스텀 날짜 포맷 함수 */\n dateFormat?: (date: Date) => string\n /** 커스텀 시간 포맷 함수 */\n timeFormat?: (date: Date) => string\n /** 커스텀 요일 포맷 함수 */\n weekdayFormatFn?: (date: Date) => string\n /** 직접 하위 컴포넌트(StnHeaderTitle.Date, Time, Weekday 등)를 구성할 경우 */\n children?: ReactNode\n}\n\nexport type StnHeaderTitleProps =\n | StnHeaderTitleTitleProps\n | StnHeaderTitleDualProps\n | StnHeaderTitleClockProps\n\nfunction HeaderTitleFrame({ preview = false }: { preview?: boolean }) {\n const frameClass = preview ? 'stn-header-title__frame-preview' : 'stn-header-title__frame'\n\n return (\n <div className={frameClass} aria-hidden=\"true\">\n <div className=\"stn-header-title__frame-bleed stn-header-title__frame-bleed--outer\">\n <img\n className=\"stn-header-title__frame-img\"\n src={STN_HEADER_TITLE_FRAME.outer}\n alt=\"\"\n draggable={false}\n />\n </div>\n <div className=\"stn-header-title__frame-bleed stn-header-title__frame-bleed--inner\">\n <img\n className=\"stn-header-title__frame-img stn-header-title__frame-img--dark\"\n src={STN_HEADER_TITLE_FRAME.innerDark}\n alt=\"\"\n draggable={false}\n />\n <img\n className=\"stn-header-title__frame-img stn-header-title__frame-img--light\"\n src={STN_HEADER_TITLE_FRAME.innerLight}\n alt=\"\"\n draggable={false}\n />\n </div>\n </div>\n )\n}\n\n/** 문서용 — 프레임 그래픽만 */\nexport function StnHeaderTitleFramePreview({ className }: { className?: string }) {\n return (\n <div className={cn('stn-header-title__frame-only', className)}>\n <HeaderTitleFrame preview />\n </div>\n )\n}\n\nfunction useLiveClock(enabled: boolean) {\n const [now, setNow] = useState(() => new Date())\n\n useEffect(() => {\n if (!enabled) return\n const id = window.setInterval(() => setNow(new Date()), 1000)\n return () => window.clearInterval(id)\n }, [enabled])\n\n return now\n}\n\nexport function StnHeaderTitleMainText({\n className,\n children,\n ...rest\n}: HTMLAttributes<HTMLHeadingElement>) {\n return (\n <h1 className={cn('stn-header-title__text', className)} {...rest}>\n {children}\n </h1>\n )\n}\n\nexport function StnHeaderTitleSubText({\n className,\n children,\n ...rest\n}: HTMLAttributes<HTMLSpanElement>) {\n return (\n <span className={cn('stn-header-title__sub-text', className)} {...rest}>\n {children}\n </span>\n )\n}\n\nexport function StnHeaderTitleDate({\n className,\n children,\n ...rest\n}: HTMLAttributes<HTMLElement>) {\n return (\n <time className={cn('stn-header-title__date', className)} {...rest}>\n {children}\n </time>\n )\n}\n\nexport function StnHeaderTitleWeekday({\n className,\n children,\n ...rest\n}: HTMLAttributes<HTMLSpanElement>) {\n return (\n <span className={cn('stn-header-title__weekday', className)} {...rest}>\n {children}\n </span>\n )\n}\n\nexport function StnHeaderTitleTime({\n className,\n children,\n ...rest\n}: HTMLAttributes<HTMLSpanElement>) {\n return (\n <span className={cn('stn-header-title__time', className)} aria-label=\"현재 시각\" {...rest}>\n {children}\n </span>\n )\n}\n\nfunction StnHeaderTitleClock({\n className,\n size = 'md',\n date,\n time,\n weekday,\n live = date == null && time == null,\n showDate = true,\n showWeekday = true,\n showTime = true,\n showSeconds = true,\n weekdayFormat = 'short',\n dateFormat,\n timeFormat,\n weekdayFormatFn,\n framed = true,\n children,\n ...rest\n}: StnHeaderTitleClockProps) {\n const now = useLiveClock(live)\n\n if (children != null) {\n return (\n <header\n className={cn(\n 'stn-header-title',\n 'stn-header-title--clock',\n size,\n !framed && 'stn-header-title--plain',\n className,\n )}\n {...rest}\n >\n {framed ? <HeaderTitleFrame /> : null}\n <div className=\"stn-header-title__content\">{children}</div>\n </header>\n )\n }\n\n // 1. 날짜 문자열 계산\n let resolvedDate: string | undefined\n if (showDate) {\n if (date != null) {\n resolvedDate = date\n } else if (dateFormat) {\n resolvedDate = dateFormat(now)\n } else {\n resolvedDate = formatStnHeaderTitleDate(now, {\n includeWeekday: showWeekday,\n weekdayFormat,\n })\n }\n }\n\n // 2. 요일 단독 표시 (날짜 미표시 상태에서 요일만 표시할 때)\n const resolvedWeekday =\n weekday ??\n (weekdayFormatFn ? weekdayFormatFn(now) : formatStnHeaderTitleWeekday(now, weekdayFormat))\n const showWeekdayOnly = !showDate && showWeekday\n\n // 3. 시간 문자열 계산\n let resolvedTime: string | undefined\n if (showTime) {\n if (time != null) {\n resolvedTime = time\n } else if (timeFormat) {\n resolvedTime = timeFormat(now)\n } else {\n resolvedTime = formatStnHeaderTitleTime(now, { showSeconds })\n }\n }\n\n return (\n <header\n className={cn(\n 'stn-header-title',\n 'stn-header-title--clock',\n size,\n !framed && 'stn-header-title--plain',\n className,\n )}\n {...rest}\n >\n {framed ? <HeaderTitleFrame /> : null}\n <div className=\"stn-header-title__content\">\n {resolvedDate ? (\n <time className=\"stn-header-title__date\" dateTime={resolvedDate}>\n {resolvedDate}\n </time>\n ) : null}\n {showWeekdayOnly ? (\n <span className=\"stn-header-title__weekday\">{resolvedWeekday}</span>\n ) : null}\n {resolvedTime ? (\n <span className=\"stn-header-title__time\" aria-label=\"현재 시각\">\n {resolvedTime}\n </span>\n ) : null}\n </div>\n </header>\n )\n}\n\nfunction StnHeaderTitleDual({\n className,\n size = 'md',\n subText,\n mainText,\n title,\n children,\n framed = true,\n ...rest\n}: StnHeaderTitleDualProps) {\n const resolvedMain = mainText ?? title ?? children\n\n return (\n <header\n className={cn(\n 'stn-header-title',\n 'stn-header-title--dual',\n size,\n !framed && 'stn-header-title--plain',\n className,\n )}\n {...rest}\n >\n {framed ? <HeaderTitleFrame /> : null}\n <div className=\"stn-header-title__content\">\n {subText != null ? (\n <span className=\"stn-header-title__sub-text\">{subText}</span>\n ) : null}\n {resolvedMain != null ? (\n typeof resolvedMain === 'string' || typeof resolvedMain === 'number' ? (\n <h1 className=\"stn-header-title__text\">{resolvedMain}</h1>\n ) : (\n resolvedMain\n )\n ) : null}\n </div>\n </header>\n )\n}\n\nfunction StnHeaderTitleText({\n className,\n size = 'md',\n title,\n children,\n framed = true,\n ...rest\n}: StnHeaderTitleTitleProps) {\n const resolved = title ?? children\n\n return (\n <header\n className={cn(\n 'stn-header-title',\n 'stn-header-title--title',\n size,\n !framed && 'stn-header-title--plain',\n className,\n )}\n {...rest}\n >\n {framed ? <HeaderTitleFrame /> : null}\n <div className=\"stn-header-title__content\">\n {typeof resolved === 'string' || typeof resolved === 'number' ? (\n <h1 className=\"stn-header-title__text\">{resolved}</h1>\n ) : (\n resolved\n )}\n </div>\n </header>\n )\n}\n\nfunction StnHeaderTitleRoot(props: StnHeaderTitleProps) {\n if (props.variant === 'clock') {\n return <StnHeaderTitleClock {...props} />\n }\n if (props.variant === 'dual' || ('subText' in props && props.subText != null)) {\n return <StnHeaderTitleDual {...(props as StnHeaderTitleDualProps)} />\n }\n return <StnHeaderTitleText {...(props as StnHeaderTitleTitleProps)} />\n}\n\nexport const StnHeaderTitle = Object.assign(StnHeaderTitleRoot, {\n Text: StnHeaderTitleMainText,\n SubText: StnHeaderTitleSubText,\n Date: StnHeaderTitleDate,\n Weekday: StnHeaderTitleWeekday,\n Time: StnHeaderTitleTime,\n Frame: StnHeaderTitleFramePreview,\n})\n","import {\n forwardRef,\n type CSSProperties,\n type ElementType,\n type ReactNode,\n} from 'react'\n\nimport { cn } from '../cn'\n\nexport type StnContainerMaxWidth = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | false\n\nexport type StnContainerProps<T extends ElementType = 'div'> = {\n /** 렌더링할 HTML 태그 또는 컴포넌트 (기본: 'div') */\n component?: T\n /** @alias component */\n as?: T\n /**\n * 콘텐츠 최대 너비. 기본은 화면이 커지면 따라 늘다 이 값에서 멈춘다.\n * - 'xs' (444px)\n * - 'sm' (768px)\n * - 'md' (1024px)\n * - 'lg' (1280px)\n * - 'xl' (1440px)\n * - false (상한 없음)\n * @default 'lg'\n */\n maxWidth?: StnContainerMaxWidth\n /** 좌우 패딩 거터 비활성화 여부 */\n disableGutters?: boolean\n /**\n * true면 breakpoint마다 그 구간 폭으로 고정된다. 구간 안에서는 안 늘어난다.\n * `maxWidth`가 마지막 계단이다. 기본 `lg`면 768 → 1024 → 1280에서 멈춘다.\n */\n fixed?: boolean\n className?: string\n style?: CSSProperties\n children?: ReactNode\n} & Omit<React.ComponentPropsWithoutRef<T>, 'as' | 'component' | 'children' | 'className' | 'style'>\n\n/**\n * 본문 폭을 가운데로 제한하는 컨테이너.\n * 기본은 화면이 커지면 따라 늘다 `maxWidth`에서 멈춘다.\n * `fixed`는 breakpoint(768 / 1024 / 1280 / 1440)마다 폭이 한 단계씩 고정된다.\n */\nexport const StnContainer = forwardRef(function StnContainer<T extends ElementType = 'div'>(\n {\n component,\n as,\n maxWidth = 'lg',\n disableGutters = false,\n fixed = false,\n className,\n style,\n children,\n ...rest\n }: StnContainerProps<T>,\n ref: React.ForwardedRef<any>,\n) {\n const Component = component ?? as ?? 'div'\n\n const maxWidthClass = maxWidth ? `stn-container--${maxWidth}` : 'stn-container--fluid'\n\n return (\n <Component\n ref={ref}\n className={cn(\n 'stn-container',\n maxWidthClass,\n disableGutters && 'stn-container--disable-gutters',\n fixed && 'stn-container--fixed',\n className,\n )}\n style={style}\n {...rest}\n >\n {children}\n </Component>\n )\n})\n","import { forwardRef, type CSSProperties, type ElementType, type ReactNode } from 'react'\n\nimport { cn } from '../cn'\n\nexport type StnGridBreakpoint = 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n\n/** 숫자 또는 브레이크포인트 맵. xs는 기본, sm 768 · md 1024 · lg 1280 · xl 1440 */\nexport type StnGridResponsive<T> = T | Partial<Record<StnGridBreakpoint, T>>\n\n/**\n * MUI spacing 스텝. 8px 단위로 `--stn-spacing-grid-*`에 연결된다.\n * 0 → 0, 0.5 → 4, 1 → 8, 2 → 16, 3 → 24, 4 → 32, 8 → 64, 12 → 96\n */\nexport type StnGridSpacing = 0 | 0.5 | 1 | 2 | 3 | 4 | 8 | 12\n\nexport type StnGridDirection = 'row' | 'row-reverse' | 'column' | 'column-reverse'\n\n/** 12열 기준 칸 수, 남는 폭을 나누는 grow, 콘텐츠 폭 auto */\nexport type StnGridSize = number | 'grow' | 'auto'\n\nconst BREAKPOINTS = ['xs', 'sm', 'md', 'lg', 'xl'] as const\n\nconst SPACING_CLASS: Record<string, string> = {\n '0': '0',\n '0.5': '0-5',\n '1': '1',\n '2': '2',\n '3': '3',\n '4': '4',\n '8': '8',\n '12': '12',\n}\n\nconst JUSTIFY_CLASS = new Set([\n 'flex-start',\n 'center',\n 'flex-end',\n 'space-between',\n 'space-around',\n 'space-evenly',\n])\n\nconst ALIGN_CLASS = new Set(['flex-start', 'center', 'flex-end', 'stretch', 'baseline'])\n\nexport type StnGridProps<T extends ElementType = 'div'> = {\n /** 렌더링할 HTML 태그 또는 컴포넌트 (기본: 'div') */\n component?: T\n /** @alias component */\n as?: T\n /** true면 그리드 컨테이너 */\n container?: boolean\n /**\n * 열 수. 기본 12.\n * `columns={{ xs: 4, sm: 8, md: 12 }}`\n */\n columns?: StnGridResponsive<number>\n /**\n * 행·열 간격 스텝. `--stn-spacing-grid-*`를 사용한다.\n * `spacing={2}` → `var(--stn-spacing-grid-16)`\n */\n spacing?: StnGridResponsive<StnGridSpacing>\n /** 행 간격. 없으면 spacing을 따른다 */\n rowSpacing?: StnGridResponsive<StnGridSpacing>\n /** 열 간격. 없으면 spacing을 따른다 */\n columnSpacing?: StnGridResponsive<StnGridSpacing>\n /**\n * 칸 너비. 12열 기준 숫자, 남는 폭을 나누는 grow, 콘텐츠 폭 auto.\n * `size={8}` · `size=\"grow\"` · `size=\"auto\"` · `size={{ xs: 6, md: 'grow' }}`\n */\n size?: StnGridResponsive<StnGridSize>\n /**\n * 정렬 축. 지정하면 flex wrap 컨테이너가 된다.\n * row · row-reverse · column · column-reverse\n */\n direction?: StnGridDirection\n /** 주축 정렬. flex-start · center · flex-end · space-between · space-around · space-evenly */\n justifyContent?: CSSProperties['justifyContent']\n /** 교차축 정렬. flex-start · center · flex-end · stretch · baseline */\n alignItems?: CSSProperties['alignItems']\n className?: string\n style?: CSSProperties\n children?: ReactNode\n} & Omit<React.ComponentPropsWithoutRef<T>, 'as' | 'component' | 'children' | 'className' | 'style'>\n\nfunction isResponsiveObject<T>(value: StnGridResponsive<T>): value is Partial<Record<StnGridBreakpoint, T>> {\n return typeof value === 'object' && value !== null\n}\n\nfunction asMap<T>(value: StnGridResponsive<T> | undefined): Partial<Record<StnGridBreakpoint, T>> | undefined {\n if (value == null) return undefined\n return isResponsiveObject(value) ? value : { xs: value }\n}\n\nfunction classSuffix(bp: StnGridBreakpoint, token: string) {\n return bp === 'xs' ? token : `${bp}-${token}`\n}\n\nfunction modifierClasses<T>(\n prefix: string,\n value: StnGridResponsive<T> | undefined,\n tokenOf: (value: T) => string | undefined,\n) {\n const resolved = asMap(value)\n if (!resolved) return []\n const classes: string[] = []\n for (const bp of BREAKPOINTS) {\n const next = resolved[bp]\n if (next == null) continue\n const token = tokenOf(next)\n if (!token) continue\n classes.push(`${prefix}-${classSuffix(bp, token)}`)\n }\n return classes\n}\n\nfunction spacingSlug(step: number) {\n return SPACING_CLASS[String(step)]\n}\n\nfunction trackSlug(count: number) {\n return Number.isInteger(count) && count >= 1 && count <= 12 ? String(count) : undefined\n}\n\nfunction sizeClasses(size: StnGridResponsive<StnGridSize> | undefined) {\n const resolved = asMap(size)\n if (!resolved) return []\n const classes: string[] = []\n for (const bp of BREAKPOINTS) {\n const next = resolved[bp]\n if (next == null) continue\n if (next === 'grow' || next === 'auto') {\n classes.push(`stn-grid__item--size-${classSuffix(bp, next)}`)\n continue\n }\n const track = trackSlug(next)\n if (track) classes.push(`stn-grid__item--span-${classSuffix(bp, track)}`)\n }\n return classes\n}\n\n/**\n * 12열 flex 그리드. 컨테이너와 칸을 같은 컴포넌트로 쓴다.\n */\nexport const StnGrid = forwardRef(function StnGrid<T extends ElementType = 'div'>(\n {\n component,\n as,\n container = false,\n columns,\n spacing,\n rowSpacing,\n columnSpacing,\n size,\n direction,\n justifyContent,\n alignItems,\n className,\n style,\n children,\n ...rest\n }: StnGridProps<T>,\n ref: React.ForwardedRef<any>,\n) {\n const Component = component ?? as ?? 'div'\n const justify = typeof justifyContent === 'string' && JUSTIFY_CLASS.has(justifyContent) ? justifyContent : undefined\n const align = typeof alignItems === 'string' && ALIGN_CLASS.has(alignItems) ? alignItems : undefined\n\n return (\n <Component\n ref={ref}\n className={cn(\n container && 'stn-grid',\n ...(container ? modifierClasses('stn-grid--columns', columns ?? 12, trackSlug) : []),\n ...(container ? modifierClasses('stn-grid--row-spacing', rowSpacing ?? spacing, spacingSlug) : []),\n ...(container ? modifierClasses('stn-grid--column-spacing', columnSpacing ?? spacing, spacingSlug) : []),\n container && direction && `stn-grid--direction-${direction}`,\n container && justify && `stn-grid--justify-${justify}`,\n container && align && `stn-grid--align-${align}`,\n size != null && 'stn-grid__item',\n ...sizeClasses(size),\n className,\n )}\n style={style}\n {...rest}\n >\n {children}\n </Component>\n )\n})\n","import type { ReactNode } from 'react'\nimport type { StnLnbSide } from '@stn-uiux/pub-ui/data/stnLayout'\n\nimport { cn } from '../cn'\n\nexport type StnLayerShellProps = {\n /** L1 Main UI — 사이드 내비게이션 레일 (StnSideNavigation 등) */\n gnb?: ReactNode\n /** L1 Main UI — 사이드 네비 위치 @default 'left' */\n gnbSide?: StnLnbSide\n /** L1 Main UI — 상단 바 (StnHeader 등) · 네비 제외 영역 */\n header?: ReactNode\n /** L1 Content 본문 — layer1 미지정 시 children 사용 */\n children?: ReactNode\n /** 루트 래퍼 id */\n wrapId?: string\n /** 루트 래퍼 추가 클래스명 */\n wrapClassName?: string\n /** L1 Content 컨테이너 id */\n containerId?: string\n /** L1 Content 컨테이너 추가 클래스명 */\n containerClassName?: string\n /** 본문 추가 클래스명 */\n contentClassName?: string\n /** LNB·데이터 트리 열 위치 */\n lnbSide?: StnLnbSide\n\n // === 3단계 표준 레이어 슬롯 (L0 / L1 / L2) ===\n /** 본문 스크롤 허용 여부 (기본: true). 화면 높이 초과 시 내부 스크롤 허용 */\n scrollable?: boolean | 'auto' | 'y' | 'x'\n /** L0 배경 레이어 — `StnLayer.Background` / `StnLayer0Background` 등 (z-index: 0) */\n layer0?: ReactNode\n /** L1 메인 화면 본문 — `children`의 명시적 3단계 층위 슬롯 명칭 (z-index: 100) */\n layer1?: ReactNode\n /** L2 모달 다이얼로그 — `StnPopup` 등 (Dim 스크림 내장, z-index: 200) */\n layer2?: ReactNode\n /** toast · audio 등 유틸리티 오버레이 — `data-stn-layer-role=\"utility\"` */\n utilities?: ReactNode\n}\n\n/**\n * StnLayer role 기반 페이지 셸 — 3단계 층위 표준:\n * L0 Background · L1 Main UI (사이드바 + 우측 헤더/본문 스택 2분할 구조) · L2 Modal\n */\nexport function StnLayerShell({\n gnb,\n gnbSide = 'left',\n header,\n children,\n wrapId,\n wrapClassName,\n containerId,\n containerClassName,\n contentClassName,\n lnbSide: _lnbSide = 'left',\n scrollable = true,\n layer0,\n layer1,\n layer2,\n utilities,\n}: StnLayerShellProps) {\n const resolvedMainContent = layer1 ?? children\n const resolvedModal = layer2\n const isGnbRight = gnbSide === 'right'\n\n return (\n <div\n id={wrapId}\n data-stn-layer-mode=\"v2\"\n data-stn-gnb-side={gnbSide}\n className={cn('stn-wrap', isGnbRight && 'stn-wrap--gnb-right', wrapClassName)}\n >\n {/* L0: Background 레이어 */}\n {layer0}\n\n {/* L2: 유틸리티 (토스트 등) - 존재할 때만 렌더링 */}\n {utilities ? (\n <div className=\"stn-page-utilities\" data-stn-layer-role=\"utility\">\n {utilities}\n </div>\n ) : null}\n\n {/* L1: Main UI 도화지 (사이드 네비 + [헤더 + 본문]) */}\n <main\n id={containerId}\n data-stn-layer=\"1\"\n data-stn-layer-role=\"content\"\n className={cn('stn-layer-1', scrollable && 'scroll', containerClassName)}\n >\n {/* 좌측 사이드 네비 (gnbSide === 'left') */}\n {!isGnbRight && gnb}\n\n <div className=\"stn-layer-1__main\">\n {header ? <header className=\"stn-layer-1__header\">{header}</header> : null}\n <div className={cn('stn-layer-1__body', scrollable && 'stn-scroll', contentClassName)}>\n {resolvedMainContent}\n </div>\n </div>\n\n {/* 우측 사이드 네비 (gnbSide === 'right') */}\n {isGnbRight && gnb}\n </main>\n\n {/* L2: Modal / Dialog 레이어 */}\n {resolvedModal}\n </div>\n )\n}\n","import type { HTMLAttributes, ReactNode } from 'react'\nimport { cn } from '../../cn'\n\nexport type StnMapCanvasProps = HTMLAttributes<HTMLDivElement> & {\n children?: ReactNode\n className?: string\n}\n\n/**\n * 맵·토폴로지·차트 캔버스 마운트 컨테이너 컴포넌트\n * `.stn-map-canvas`를 제공하여 GIS 엔진 및 토폴로지 라이브러리를 안전하게 마운트합니다.\n */\nexport function StnMapCanvas({\n children,\n className,\n ...rest\n}: StnMapCanvasProps) {\n return (\n <div\n className={cn('stn-map-canvas', className)}\n data-stn-dashboard=\"canvas\"\n {...rest}\n >\n {children}\n </div>\n )\n}\n","import type { CSSProperties, HTMLAttributes, ReactNode } from 'react'\n\nimport { cn } from '../../cn'\nimport { StnMapCanvas, type StnMapCanvasProps } from './StnMapCanvas'\n\nexport type StnDashboardWidgetPosition = 'right' | 'left' | 'both' | 'none'\n\nexport type StnDashboardProps = HTMLAttributes<HTMLDivElement> & {\n children?: ReactNode\n className?: string\n /** 위젯 패널 위치 — 기본값 'right' */\n widgetPosition?: StnDashboardWidgetPosition\n /** 빈 대시보드 상태 (L0 배경만 노출) */\n empty?: boolean\n}\n\nexport type StnDashboardRegionProps = HTMLAttributes<HTMLDivElement> & {\n children?: ReactNode\n className?: string\n}\n\nconst fillStyle: CSSProperties = {\n flex: '1 1 0%',\n minHeight: 0,\n minWidth: 0,\n height: '100%',\n width: '100%',\n alignItems: 'stretch',\n}\n\nfunction StnDashboardRoot({\n children,\n className,\n widgetPosition = 'right',\n empty = false,\n style,\n ...rest\n}: StnDashboardProps) {\n const isLeft = widgetPosition === 'left'\n const isBoth = widgetPosition === 'both'\n\n return (\n <div\n className={cn(\n 'stn-dashboard',\n empty && 'stn-dashboard--empty',\n isLeft && 'stn-dashboard--widget-left',\n isBoth && 'stn-dashboard--widget-both',\n className,\n )}\n style={{\n ...fillStyle,\n display: 'flex',\n flexDirection: isLeft ? 'row-reverse' : 'row',\n gap: 8,\n ...style,\n }}\n data-stn-dashboard=\"root\"\n {...rest}\n >\n {children}\n </div>\n )\n}\n\nfunction StnDashboardLeft({\n children,\n className,\n style,\n ...rest\n}: StnDashboardRegionProps) {\n return (\n <div\n className={cn('stn-dashboard__left', className)}\n style={{\n minWidth: 0,\n minHeight: 0,\n flex: '1 1 0%',\n display: 'flex',\n flexDirection: 'column',\n gap: 8,\n height: '100%',\n ...style,\n }}\n data-stn-dashboard=\"left\"\n {...rest}\n >\n {children}\n </div>\n )\n}\n\nfunction StnDashboardRight({\n children,\n className,\n style,\n ...rest\n}: StnDashboardRegionProps) {\n return (\n <div\n className={cn('stn-dashboard__right', className)}\n style={{\n width: 320,\n flex: '0 0 320px',\n minWidth: 0,\n minHeight: 0,\n height: '100%',\n display: 'flex',\n flexDirection: 'column',\n gap: 8,\n overflow: 'hidden',\n boxSizing: 'border-box',\n ...style,\n }}\n data-stn-dashboard=\"right\"\n {...rest}\n >\n {children}\n </div>\n )\n}\n\nfunction StnDashboardTopRight({\n children,\n className,\n ...rest\n}: StnDashboardRegionProps) {\n return (\n <div\n className={cn('stn-dashboard__top-right', className)}\n data-stn-dashboard=\"top-right\"\n {...rest}\n >\n {children}\n </div>\n )\n}\n\n/**\n * 대시보드 레이아웃 — Pub 클래스(`.dashboard` / `_left` / `_right`)\n * Compound: `Left` · `Right` · `TopRight` · `Canvas`\n */\nexport const StnDashboard = Object.assign(StnDashboardRoot, {\n Root: StnDashboardRoot,\n Left: StnDashboardLeft,\n Right: StnDashboardRight,\n TopRight: StnDashboardTopRight,\n Canvas: StnMapCanvas,\n})\n\nexport type { StnMapCanvasProps }\n","import type { HTMLAttributes, ReactNode } from 'react'\n\nimport type { StnLnbSide } from '@stn-uiux/pub-ui/data/stnLayout'\n\nimport { cn } from '../../cn'\nimport { StnContainer } from '../../layouts/StnContainer'\nimport { StnLayerShell, type StnLayerShellProps } from '../../layouts/StnLayerShell'\nimport { StnHeader, StnHeaderPageTitle } from '../header/StnHeader'\nimport { StnDashboard } from '../dashboard/StnDashboard'\nimport { StnLayer, type StnLayerProps } from '../layer/StnLayer'\n\nexport type StnPageScaffoldRootProps = HTMLAttributes<HTMLDivElement> & {\n children?: ReactNode\n className?: string\n}\n\n/** 페이지 뼈대 루트 — 구역 조립용 래퍼 (로딩 UI 아님) */\nexport function StnPageScaffoldRoot({ children, className, ...rest }: StnPageScaffoldRootProps) {\n return (\n <div\n className={cn('stn-page-scaffold', className)}\n data-stn-page-scaffold=\"root\"\n {...rest}\n >\n {children}\n </div>\n )\n}\n\nexport type StnPageScaffoldRegionProps = HTMLAttributes<HTMLDivElement> & {\n label: string\n hint?: string\n children?: ReactNode\n className?: string\n}\n\n/** 빈 구역 라벨 — LNB·search·팝업 본문 등 */\nexport function StnPageScaffoldRegion({\n label,\n hint,\n children,\n className,\n ...rest\n}: StnPageScaffoldRegionProps) {\n return (\n <div className={cn('stn-page-scaffold__region', className)} data-stn-page-scaffold=\"region\" {...rest}>\n <span className=\"stn-page-scaffold__region-label\">{label}</span>\n {hint ? <span className=\"stn-page-scaffold__region-hint\">{hint}</span> : null}\n {children}\n </div>\n )\n}\n\nexport type StnPageScaffoldMapPlaceholderProps = HTMLAttributes<HTMLDivElement> & {\n message?: string\n note?: string\n className?: string\n}\n\n/** 맵·토폴로지 자리 — 실제 맵 JS 대신 안내 박스 */\nexport function StnPageScaffoldMapPlaceholder({\n message = '캔버스는 추후 연동',\n note = '토폴로지/맵 엔진은 이 영역(StnWidget variant=\"canvas\")에 마운트합니다.',\n className,\n children,\n ...rest\n}: StnPageScaffoldMapPlaceholderProps) {\n return (\n <div className=\"stn-widget shell-canvas stn-map-canvas\" data-stn-dashboard=\"canvas\">\n <div\n className={cn('stn-page-scaffold__canvas-placeholder', className)}\n data-stn-page-scaffold=\"canvas\"\n role=\"status\"\n {...rest}\n >\n <p className=\"stn-page-scaffold__canvas-placeholder-title\">{message}</p>\n {note ? <p className=\"stn-page-scaffold__canvas-placeholder-note\">{note}</p> : null}\n {children}\n </div>\n </div>\n )\n}\n\nexport type StnPageScaffoldMapCanvasProps = HTMLAttributes<HTMLDivElement> & {\n className?: string\n}\n\n/** 맵·토폴로지 마운트 — L0 배경만 보이는 빈 본문 (placeholder 박스 없음) */\nexport function StnPageScaffoldMapCanvas({\n className,\n children,\n ...rest\n}: StnPageScaffoldMapCanvasProps) {\n return (\n <div\n className={cn('stn-widget', 'shell-canvas', 'stn-map-canvas', 'stn-page-scaffold__canvas', className)}\n data-stn-page-scaffold=\"canvas\"\n data-stn-dashboard=\"canvas\"\n {...rest}\n >\n {children}\n </div>\n )\n}\n\nexport type StnPageScaffoldLayerProps = StnLayerProps & {\n /** DS·개발용 구역 라벨 (L3 팝업 본문 등) */\n label?: string\n hint?: string\n}\n\n/**\n * StnLayer + 뼈대 슬롯 — 예: L3 팝업 층에 “여기 본문” 표시\n * elevation은 StnLayer가 담당, 레이아웃 구역은 Page scaffold.\n */\nexport function StnPageScaffoldLayer({ label, hint, children, className, ...layerProps }: StnPageScaffoldLayerProps) {\n const labelText = label ? (hint ? `${label} · ${hint}` : label) : undefined\n return (\n <StnLayer\n className={cn(\n 'stn-page-scaffold__layer-slot',\n labelText && 'stn-page-scaffold__layer-slot--labeled',\n className,\n )}\n data-stn-scaffold-label={labelText}\n {...layerProps}\n >\n {children}\n </StnLayer>\n )\n}\n\n/** 토스 ListRow.AssetIcon 스타일 — StnPageScaffold.Region 조합 */\nexport const StnPageScaffold = Object.assign(StnPageScaffoldRoot, {\n Region: StnPageScaffoldRegion,\n MapPlaceholder: StnPageScaffoldMapPlaceholder,\n MapCanvas: StnPageScaffoldMapCanvas,\n Layer: StnPageScaffoldLayer,\n})\n\nexport type ListPageScaffoldProps = Omit<StnLayerShellProps, 'children' | 'header'> & {\n /** L1 Main UI — 사이드 네비 (StnSideNavigation) */\n gnb?: ReactNode\n /**\n * L1 Main UI — App header (`StnHeader` page 등).\n * `null`이면 헤더 없음. Map과 같이 `StnHeader` 전달 가능.\n */\n header?: ReactNode | null\n /** `header` 미지정 시 page title 기본값 */\n title?: string\n lnbHint?: string\n searchHint?: string\n tableHint?: string\n /** false면 LNB 영역 미렌더 */\n showLnb?: boolean\n /** `lnb_box` 슬롯 — 미지정 시 placeholder Region (보통 `StnSectionSide` + `StnTree`) */\n lnb?: ReactNode\n /** `search_area` 슬롯 — 미지정 시 placeholder Region */\n search?: ReactNode\n /** false면 search_area 미렌더 (has_sch는 호출측에서 빼세요) */\n showSearch?: boolean\n children?: ReactNode\n /** @deprecated StnLayerShell이 기본 표준 셸입니다. 생략 가능합니다. */\n shell?: 'layer'\n /** LNB 열 위치 — `has_lnb` ↔ `has_lnb_right` 자동 치환 (layer 셸) */\n lnbSide?: StnLnbSide\n /** L0 배경 — `StnLayer0Background` 등 */\n layer0?: ReactNode\n /** L1 메인 화면 본문 — `children`의 명시적 레이어 슬롯 명칭 */\n layer1?: ReactNode\n /** L2 모달 다이얼로그 — `StnPopup` 등 (Dim 스크림 내장) */\n layer2?: ReactNode\n}\n\nfunction listPageLnbClass(lnbSide: StnLnbSide): string {\n return lnbSide === 'right'\n ? 'stn-page-scaffold__lnb lnb_box lnb_box_right'\n : 'stn-page-scaffold__lnb lnb_box'\n}\n\n/** interface_list 계열 — Header · LNB · search · table 구역 */\nexport function ListPageScaffold({\n gnb,\n header,\n title = 'PAGE',\n lnbHint = 'LNB 트리 — 앱/도메인 마크업',\n searchHint = '검색 영역 (Search Area) + StnButton',\n tableHint = 'StnTable · 페이지네이션',\n showLnb = true,\n lnb,\n search,\n showSearch = true,\n children,\n lnbSide = 'left',\n scrollable = true,\n layer0,\n layer1,\n layer2,\n ...shellProps\n}: ListPageScaffoldProps & { scrollable?: boolean | 'auto' | 'y' | 'x' }) {\n const lnbClass = listPageLnbClass(lnbSide)\n const lnbAside = showLnb ? (\n <aside className={lnbClass}>{lnb ?? <StnPageScaffold.Region label=\"LNB\" hint={lnbHint} />}</aside>\n ) : null\n\n const resolvedContent = layer1 ?? children\n\n const body = (\n <StnPageScaffold>\n {lnbSide === 'left' ? lnbAside : null}\n {showSearch ? (\n <div className=\"stn-page-scaffold__search search_area\">\n {search ?? <StnPageScaffold.Region label=\"Search\" hint={searchHint} />}\n </div>\n ) : null}\n <div className={cn('stn-page-scaffold__content content_box', scrollable && 'is-scrollable')}>\n {resolvedContent ?? (\n <div className=\"stn-table stn-table--fill\">\n <StnPageScaffold.Region label=\"Table\" hint={tableHint} />\n </div>\n )}\n </div>\n {lnbSide === 'right' ? lnbAside : null}\n </StnPageScaffold>\n )\n\n const resolvedHeader =\n header === null\n ? undefined\n : (header ?? (\n <StnHeader variant=\"page\">\n <StnHeader.Left>\n <StnHeaderPageTitle>{title}</StnHeaderPageTitle>\n </StnHeader.Left>\n </StnHeader>\n ))\n\n return (\n <StnLayerShell\n gnb={gnb}\n lnbSide={lnbSide}\n header={resolvedHeader}\n scrollable={scrollable}\n layer0={layer0}\n layer1={body}\n layer2={layer2}\n {...shellProps}\n />\n )\n}\n\nexport type DashboardType = 'map' | 'topology' | 'widget-grid'\n\nexport type DashboardPageScaffoldProps = Omit<StnLayerShellProps, 'children' | 'header' | 'layer1'> & {\n /** 대시보드 스펙 구분자 — 'map' (GIS/맵) | 'topology' (네트워크 토폴로지) | 'widget-grid' (자유 위젯 그리드) */\n type?: DashboardType\n /** L1 content 본문 커스텀 — 미지정 시 left/right/MapPlaceholder 로 `.dashboard` 조립. layer1 슬롯을 따로 두지 않음 */\n children?: ReactNode\n gnb: ReactNode\n header?: ReactNode\n mapMessage?: string\n mapNote?: string\n kind?: 'map' | 'topology' | 'canvas'\n left?: ReactNode | null\n right?: ReactNode | null\n faultPanel?: ReactNode\n /** 위젯 패널 배치 위치 — 'right' (우측) | 'left' (좌측) | 'both' (양쪽) | 'none' (없음 - 100% Full Map) */\n widgetPosition?: 'right' | 'left' | 'both' | 'none'\n /** 우측 `stn-page-scaffold__region` / `dashboard_right` 영역 표시 여부 (기본 true, false 시 100% Full Map) */\n showRightRegion?: boolean\n /**\n * L1 content 비움 — `.dashboard` 자식 없이 L0 배경만\n * (`stn-dashboard--empty`)\n */\n bodyEmpty?: boolean\n wrapClassName?: string\n /** 본문 Container 스크롤 가능 여부 (기본: true). 초과 컨텐츠 시 내부 스크롤 허용 */\n scrollable?: boolean | 'auto' | 'y' | 'x'\n /** @deprecated StnLayerShell이 기본 표준 셸입니다. 생략 가능합니다. */\n shell?: 'layer'\n /** L0 배경 — `StnLayer0Background` */\n layer0?: ReactNode\n /** L2 모달 / 팝업 다이얼로그 (StnPopup 등) */\n layer2?: ReactNode\n}\n\n/** 대시보드 공통 스캐폴드 — type('map' | 'topology' | 'widget-grid')에 맞춰 Header/GNB/캔버스/L0 자동 매핑.\n * L1 `.stn-layer-1`: 좌측 사이드바 + 우측 본문 스택(Header + Grid) 2분할 구조.\n */\nexport function DashboardPageScaffold({\n type,\n children,\n gnb,\n header,\n mapMessage,\n mapNote,\n kind,\n left,\n right,\n faultPanel,\n widgetPosition = 'right',\n showRightRegion = true,\n bodyEmpty = false,\n wrapClassName,\n scrollable = true,\n layer0,\n layer2,\n ...shellProps\n}: DashboardPageScaffoldProps) {\n const resolvedType: DashboardType = type ?? (kind === 'topology' ? 'topology' : 'map')\n\n const finalWrapClassName =\n wrapClassName ??\n (resolvedType === 'map'\n ? 'stn-page--map-bg'\n : resolvedType === 'topology'\n ? 'stn-page--topology-bg'\n : '')\n\n const finalMapMessage =\n mapMessage ??\n (resolvedType === 'topology'\n ? 'Topology Dashboard 캔버스'\n : resolvedType === 'widget-grid'\n ? 'Widget Grid Board 캔버스'\n : 'Map Dashboard 캔버스')\n\n const finalMapNote =\n mapNote ??\n (resolvedType === 'topology'\n ? '네트워크 토폴로지 캔버스 마운트 영역'\n : resolvedType === 'widget-grid'\n ? 'Widget Grid (12열 자유 배치 보드) 마운트 영역'\n : 'GIS / 맵 엔진 마운트 영역')\n\n const isLeft = widgetPosition === 'left'\n const isBoth = widgetPosition === 'both'\n const isNone = widgetPosition === 'none' || !showRightRegion\n\n const mapColumn = (\n <StnDashboard.Left>\n <StnPageScaffold.MapPlaceholder message={finalMapMessage} note={finalMapNote} />\n {faultPanel}\n </StnDashboard.Left>\n )\n\n const rightWidgets = right ?? (\n <StnPageScaffold.Region label=\"dashboard_right\" hint=\"위젯·장애 패널\" />\n )\n\n const leftWidgets = left ?? right ?? (\n <StnPageScaffold.Region label=\"dashboard_right\" hint=\"좌측 위젯·장애 패널\" />\n )\n\n const dashboardGrid = bodyEmpty ? (\n <StnDashboard empty widgetPosition={widgetPosition} data-stn-page-scaffold=\"dashboard-empty\" />\n ) : isBoth ? (\n <StnDashboard widgetPosition=\"both\">\n <StnDashboard.Right>{leftWidgets}</StnDashboard.Right>\n {mapColumn}\n <StnDashboard.Right>{rightWidgets}</StnDashboard.Right>\n </StnDashboard>\n ) : isLeft ? (\n <StnDashboard widgetPosition=\"left\">\n <StnDashboard.Right>{leftWidgets}</StnDashboard.Right>\n {mapColumn}\n </StnDashboard>\n ) : (\n <StnDashboard widgetPosition={isNone ? 'none' : 'right'}>\n {mapColumn}\n {!isNone ? <StnDashboard.Right>{rightWidgets}</StnDashboard.Right> : null}\n </StnDashboard>\n )\n\n const contentNode = children ?? dashboardGrid\n\n return (\n <StnLayerShell\n gnb={gnb}\n wrapClassName={finalWrapClassName}\n header={header}\n layer0={layer0}\n layer2={layer2}\n {...shellProps}\n >\n {/* L1 높이 체인 앵커 — body > Container > (Stack|Grid|scroll-region) */}\n <StnContainer\n maxWidth={false}\n disableGutters\n className={scrollable === true || scrollable === 'auto' || scrollable === 'y' ? 'is-scrollable' : undefined}\n >\n {contentNode}\n </StnContainer>\n </StnLayerShell>\n )\n}\n","import type { HTMLAttributes, ReactNode } from 'react'\n\nimport { cn } from '../cn'\nimport { StnHeader, StnHeaderPageTitle } from '../patterns/header/StnHeader'\nimport { StnPageScaffold } from '../patterns/scaffold/StnPageScaffold'\n\nexport type StnListViewLayoutProps = Omit<HTMLAttributes<HTMLDivElement>, 'title'> & {\n /**\n * `StnLayerShell` / `ListPageScaffold` 안에서 쓸 때 `true`.\n * L0 · GNB · Header · `stn-content-area` 래퍼 없이\n * `StnPageScaffold`(LNB · search · table)만 렌더합니다.\n * @alias noShell\n */\n bare?: boolean\n /** @deprecated `bare` 사용 */\n noShell?: boolean\n /** 페이지 타이틀 (header 미지정 시 기본 StnHeader에 전달) */\n title?: string\n /** 상단 헤더 슬롯 (null 전달 시 헤더 안 함). `bare`일 때는 무시(셸이 담당) */\n header?: ReactNode | null\n /** 검색 조건 슬롯 (StnSearchRequirementBar 등) */\n search?: ReactNode\n /** LNB 사이드바 슬롯 (StnSectionSide + StnTree 등) */\n sidebar?: ReactNode\n /** 메인 데이터 테이블 슬롯 (StnTable 등) */\n table?: ReactNode\n /** 테이블 하단 페이징 슬롯 (StnPagination 등) */\n pagination?: ReactNode\n /** LNB 위치 — 'left' | 'right' (기본 'left') */\n lnbSide?: 'left' | 'right'\n /** 커스텀 본문 (search, table, pagination 조합 대신 직접 전달할 때) */\n children?: ReactNode\n}\n\nexport type StnListViewLayoutBodyProps = Pick<\n StnListViewLayoutProps,\n 'search' | 'sidebar' | 'table' | 'pagination' | 'lnbSide' | 'children' | 'className'\n>\n\n/** L1 listview 그리드 — `StnLayerShell` `stn-content-area` 직하위 또는 `bare` 루트 */\nexport function StnListViewLayoutBody({\n search,\n sidebar,\n table,\n pagination,\n lnbSide = 'left',\n children,\n className,\n}: StnListViewLayoutBodyProps) {\n const lnbClass =\n lnbSide === 'right'\n ? 'stn-page-scaffold__lnb lnb_box lnb_box_right'\n : 'stn-page-scaffold__lnb lnb_box'\n\n return (\n <StnPageScaffold className={cn('stn-list-view-layout__body', className)}>\n {lnbSide === 'left' && sidebar ? <aside className={lnbClass}>{sidebar}</aside> : null}\n\n {search ? <div className=\"stn-page-scaffold__search search_area\">{search}</div> : null}\n\n <div className=\"stn-page-scaffold__content content_box\">\n {children ?? (\n <div className=\"stn-table stn-table--fill\">\n {table}\n {pagination}\n </div>\n )}\n </div>\n\n {lnbSide === 'right' && sidebar ? <aside className={lnbClass}>{sidebar}</aside> : null}\n </StnPageScaffold>\n )\n}\n\nexport function StnListViewLayoutRoot({\n bare: bareProp,\n noShell,\n title = '목록 조회',\n header,\n search,\n sidebar,\n table,\n pagination,\n lnbSide = 'left',\n children,\n className,\n ...rest\n}: StnListViewLayoutProps) {\n const bare = bareProp ?? noShell ?? false\n const hasLnbClass = lnbSide === 'right' ? 'has_lnb_right' : 'has_lnb'\n\n const body = (\n <StnListViewLayoutBody\n search={search}\n sidebar={sidebar}\n table={table}\n pagination={pagination}\n lnbSide={lnbSide}\n className={bare ? className : undefined}\n >\n {children}\n </StnListViewLayoutBody>\n )\n\n if (bare) {\n return body\n }\n\n const renderedHeader =\n header === null ? null : header !== undefined ? (\n header\n ) : (\n <div className=\"stn-layer-1__header\">\n <StnHeader variant=\"page\">\n <StnHeader.Left>\n <StnHeaderPageTitle>{title}</StnHeaderPageTitle>\n </StnHeader.Left>\n </StnHeader>\n </div>\n )\n\n return (\n <div className={cn('stn-list-view-layout', 'stn-layer-1', className)} {...rest}>\n {renderedHeader}\n\n <div\n className={cn('stn-content-area', sidebar ? hasLnbClass : null, search ? 'has_sch' : null)}\n >\n {body}\n </div>\n </div>\n )\n}\n\nexport function StnListViewLayoutHeader({ className, children, ...rest }: HTMLAttributes<HTMLDivElement>) {\n return (\n <div className={cn('stn-layer-1__header', className)} {...rest}>\n {children}\n </div>\n )\n}\n\nexport function StnListViewLayoutSearch({ className, children, ...rest }: HTMLAttributes<HTMLDivElement>) {\n return (\n <div className={cn('search_area', className)} {...rest}>\n {children}\n </div>\n )\n}\n\nexport function StnListViewLayoutSidebar({\n side = 'left',\n className,\n children,\n ...rest\n}: HTMLAttributes<HTMLElement> & { side?: 'left' | 'right' }) {\n const lnbClass = side === 'right' ? 'lnb_box_right' : 'lnb_box'\n return (\n <aside className={cn(lnbClass, className)} {...rest}>\n {children}\n </aside>\n )\n}\n\nexport function StnListViewLayoutContent({ className, children, ...rest }: HTMLAttributes<HTMLDivElement>) {\n return (\n <div className={cn('content_box', className)} {...rest}>\n {children}\n </div>\n )\n}\n\nexport function StnListViewLayoutTable({ className, children, ...rest }: HTMLAttributes<HTMLDivElement>) {\n return (\n <div className={cn('stn-table', className)} {...rest}>\n {children}\n </div>\n )\n}\n\nexport function StnListViewLayoutPagination({ className, children, ...rest }: HTMLAttributes<HTMLDivElement>) {\n return (\n <div className={cn('stn-list-view-layout__pagination-wrap', className)} {...rest}>\n {children}\n </div>\n )\n}\n\nexport const StnListViewLayout = Object.assign(StnListViewLayoutRoot, {\n Body: StnListViewLayoutBody,\n Header: StnListViewLayoutHeader,\n Search: StnListViewLayoutSearch,\n Sidebar: StnListViewLayoutSidebar,\n Content: StnListViewLayoutContent,\n Table: StnListViewLayoutTable,\n Pagination: StnListViewLayoutPagination,\n})\n","import { useMemo, useState, type ReactNode } from 'react'\n\nimport {\n STN_ALERT_CENTER_DEMO_ALERTS,\n STN_ALERT_CENTER_DEMO_DEPLOY,\n STN_ALERT_CENTER_DEMO_WORK,\n} from '@stn-uiux/pub-ui/data/stnAlertCenter'\nimport { systemIconSrc } from '@stn-uiux/pub-ui/data/stnSystemIcons'\n\nimport { StnAlertCenterPanel } from '../alertCenter/StnAlertCenterPanel'\nimport { AlertCenterDashboard } from '../dashboard/AlertCenterDashboard'\nimport { StnSideNavigation } from '../sideNav/StnSideNavigation'\nimport { StnHeader } from '../header/StnHeader'\nimport { DashboardPageScaffold, StnPageScaffold, type DashboardPageScaffoldProps } from './StnPageScaffold'\n\nexport type AlertCenterPageScaffoldProps = Omit<\n DashboardPageScaffoldProps,\n 'gnb' | 'right' | 'faultPanel' | 'mapMessage' | 'mapNote'\n> & {\n /** 알림 패널 — 미지정 시 데모 StnAlertCenterPanel */\n gnbAlertPanel?: ReactNode\n defaultAlertOpen?: boolean\n mapMessage?: string\n mapNote?: string\n /** `.real_time_fault_status` 자리 placeholder */\n showFaultPanelPlaceholder?: boolean\n faultPanel?: ReactNode\n /** 우측 4위젯 — 기본 AlertCenterDashboard */\n right?: ReactNode\n clock?: ReactNode\n gnb?: ReactNode\n defaultGnbOpen?: boolean\n}\n\n/**\n * CLI(`widget-grid` · `map-dashboard` · `topology-dashboard`)와 동일한 기본 헤더.\n * `StnHeader variant=\"widget\"`\n */\nfunction defaultTopologyHeader(_clock?: ReactNode) {\n return <StnHeader variant=\"widget\" />\n}\n\n/**\n * `alert_center.html` 1단계 페이지 뼈대 — 맵 빈 칸 + 사이드바·알림 + 헤더(StnHeader widget) + 우측 위젯\n */\nexport function AlertCenterPageScaffold({\n gnbAlertPanel,\n defaultAlertOpen: _defaultAlertOpen = false,\n mapMessage = '맵은 추후 연동',\n mapNote,\n showFaultPanelPlaceholder = false,\n faultPanel,\n right,\n clock,\n header,\n wrapId,\n gnb: gnbProp,\n defaultGnbOpen = true,\n ...shellProps\n}: AlertCenterPageScaffoldProps) {\n const [gnbOpen, setGnbOpen] = useState(defaultGnbOpen)\n\n const panel = useMemo(\n () =>\n gnbAlertPanel ?? (\n <StnAlertCenterPanel\n alerts={STN_ALERT_CENTER_DEMO_ALERTS}\n workItems={STN_ALERT_CENTER_DEMO_WORK}\n deployItems={STN_ALERT_CENTER_DEMO_DEPLOY}\n />\n ),\n [gnbAlertPanel],\n )\n\n const sideNav = useMemo(\n () =>\n gnbProp ?? (\n <>\n <StnSideNavigation\n collapsed={!gnbOpen}\n onCollapseChange={(col) => setGnbOpen(!col)}\n >\n <StnSideNavigation.Header>\n <StnSideNavigation.Logo />\n <StnSideNavigation.Toggle />\n </StnSideNavigation.Header>\n <StnSideNavigation.Menu>\n <StnSideNavigation.Item iconSrc={systemIconSrc('line/layout-grid')} label=\"메인 대시보드\" active />\n <StnSideNavigation.Item iconSrc={systemIconSrc('line/server_2')} label=\"서버 모니터링\" />\n <StnSideNavigation.Item iconSrc={systemIconSrc('line/activity')} label=\"네트워크 분석\" />\n </StnSideNavigation.Menu>\n <StnSideNavigation.Spacer />\n <StnSideNavigation.Footer curved>\n <StnSideNavigation.Watermark />\n <StnSideNavigation.Item\n iconSrc={systemIconSrc('line/bell')}\n label=\"알림\"\n badge={12}\n // 알림센터 리디자인 전까지 패널 비활성\n onClick={undefined}\n />\n <StnSideNavigation.Item iconSrc={systemIconSrc('line/settings')} label=\"설정\" />\n </StnSideNavigation.Footer>\n </StnSideNavigation>\n {false ? panel : null}\n </>\n ),\n [gnbProp, gnbOpen, panel],\n )\n\n const faultSlot =\n faultPanel ??\n (showFaultPanelPlaceholder ? (\n <div className=\"wrap_real_time stn-page-scaffold__fault-ph\">\n <StnPageScaffold.Region label=\"실시간 장애 현황\" hint=\"StnWidget shell=fault-panel · 선택\" />\n </div>\n ) : null)\n\n return (\n <DashboardPageScaffold\n gnb={sideNav}\n header={header ?? defaultTopologyHeader(clock)}\n mapMessage={mapMessage}\n mapNote={mapNote}\n faultPanel={faultSlot}\n right={right ?? <AlertCenterDashboard />}\n wrapId={wrapId}\n wrapClassName=\"stn-page--map-bg\"\n {...shellProps}\n />\n )\n}\n","import { useState, type FormEvent, type ReactNode } from 'react'\n\nimport { cn } from '../../cn'\nimport { StnButton } from '../../components/StnButton'\nimport { StnLogo } from '../../components/StnLogo'\nimport { StnSegmented } from '../../components/StnSegmented'\nimport { StnLoginTextField } from '../login/StnLoginTextField'\nimport {\n StnLoginBrandStack,\n StnLoginCard,\n StnLoginFormFields,\n StnLoginFormLinks,\n StnLoginFormStack,\n StnLoginPlaceholder,\n type StnLoginCardVariant,\n} from '../login/StnLoginCard'\nimport { StnLayer0Background } from '../background/StnLayer0Background'\nimport type { StnLayerShellProps } from '../../layouts/StnLayerShell'\n\nexport type LoginPageScaffoldProps = Omit<StnLayerShellProps, 'children' | 'gnb' | 'header' | 'layer1' | 'layer2'> & {\n /** L0 배경 — 기본 `StnLayer0Background variant=\"login\"` */\n layer0?: ReactNode\n /** 기본 카드의 로고 — `children`을 넘기면 무시 */\n logo?: ReactNode\n productCaption?: string\n /** 카드 테두리 회전 레이저 빔 애니메이션 여부 */\n cardGlow?: boolean\n /** 카드 스타일 변형 ('default' | 'glow') */\n cardVariant?: StnLoginCardVariant\n /** 소셜 로그인 탭 선택 시 노출할 커스텀 콘텐츠. 미지정 시 기본 `<StnLoginPlaceholder />` 노출 */\n socialContent?: ReactNode\n /** L1 카드. 기본은 `StnLoginCard` + 기본 폼. 직접 넘기면 카드 전체를 교체 */\n children?: ReactNode\n onLogin?: (id: string, password: string) => void\n signUpHref?: string\n recoverHref?: string\n}\n\nconst LOGIN_TABS = [\n { value: 'normal', label: '일반 로그인' },\n { value: 'social', label: '소셜 로그인' },\n] as const\n\nfunction DefaultLoginForm({\n onLogin,\n socialContent,\n signUpHref = '#',\n recoverHref = '#',\n}: {\n onLogin?: (id: string, password: string) => void\n socialContent?: ReactNode\n signUpHref?: string\n recoverHref?: string\n}) {\n const [mode, setMode] = useState<'normal' | 'social'>('normal')\n const [userId, setUserId] = useState('')\n const [password, setPassword] = useState('')\n\n function handleSubmit(e: FormEvent) {\n e.preventDefault()\n onLogin?.(userId, password)\n }\n\n return (\n <StnLoginFormStack onSubmit={handleSubmit}>\n <StnSegmented\n aria-label=\"로그인 방식\"\n value={mode}\n onChange={(v) => setMode(v as 'normal' | 'social')}\n options={LOGIN_TABS}\n />\n {mode === 'normal' ? (\n <StnLoginFormFields>\n <StnLoginTextField\n icon=\"line/user\"\n name=\"username\"\n autoComplete=\"username\"\n placeholder=\"아이디\"\n value={userId}\n onChange={(e) => setUserId(e.target.value)}\n aria-label=\"아이디\"\n />\n <StnLoginTextField\n icon=\"line/lock\"\n type=\"password\"\n name=\"password\"\n autoComplete=\"current-password\"\n placeholder=\"비밀번호\"\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n aria-label=\"비밀번호\"\n />\n </StnLoginFormFields>\n ) : (\n socialContent ?? <StnLoginPlaceholder />\n )}\n <StnButton type=\"submit\" size=\"xl\" fullWidth>\n 로그인\n </StnButton>\n <StnLoginFormLinks>\n <a href={signUpHref}>회원가입</a>\n <a href={recoverHref}>아이디 / 비밀번호 찾기</a>\n </StnLoginFormLinks>\n </StnLoginFormStack>\n )\n}\n\nfunction DefaultLoginCard({\n logo,\n productCaption,\n glow,\n variant,\n socialContent,\n onLogin,\n signUpHref,\n recoverHref,\n}: {\n logo?: ReactNode\n productCaption: string\n glow?: boolean\n variant?: StnLoginCardVariant\n socialContent?: ReactNode\n onLogin?: (id: string, password: string) => void\n signUpHref?: string\n recoverHref?: string\n}) {\n return (\n <StnLoginCard\n glow={glow}\n variant={variant}\n brand={\n <StnLoginBrandStack>\n {logo ?? <StnLogo variant=\"vertical\" size=\"xl\" />}\n <p className=\"stn-login-card__caption\">{productCaption}</p>\n </StnLoginBrandStack>\n }\n >\n <DefaultLoginForm\n onLogin={onLogin}\n socialContent={socialContent}\n signUpHref={signUpHref}\n recoverHref={recoverHref}\n />\n </StnLoginCard>\n )\n}\n\n/**\n * Login 화면 레시피 — L0 + L1 중앙. 카드는 `StnLoginCard`, 배경은 `StnLayer0Background`.\n */\nexport function LoginPageScaffold({\n layer0,\n logo,\n productCaption = 'Server Resource Monitoring',\n cardGlow,\n cardVariant,\n socialContent,\n children,\n wrapClassName,\n onLogin,\n signUpHref,\n recoverHref,\n ...shellProps\n}: LoginPageScaffoldProps) {\n const resolvedLayer0 = layer0 ?? <StnLayer0Background variant=\"login\" />\n const resolvedCard =\n children ?? (\n <DefaultLoginCard\n logo={logo}\n productCaption={productCaption}\n glow={cardGlow}\n variant={cardVariant}\n socialContent={socialContent}\n onLogin={onLogin}\n signUpHref={signUpHref}\n recoverHref={recoverHref}\n />\n )\n\n\n return (\n <div\n className={cn('stn-wrap stn-page--login', wrapClassName)}\n data-stn-layer-mode=\"v2\"\n {...shellProps}\n >\n {resolvedLayer0}\n <div className=\"stn-login\">\n {resolvedCard}\n </div>\n </div>\n )\n}\n","import React from 'react';\nimport { cn } from '../../cn';\nimport { StnButton } from '../../components/StnButton';\nimport { StnDropdown, type StnDropdownOption } from '../../components/StnDropdown';\n\nexport type StnToolbarOrientation = 'horizontal' | 'vertical';\n\nexport type StnFloatingToolbarPlacement =\n | 'none'\n | 'bottom-left'\n | 'bottom-center'\n | 'bottom-right'\n | 'top-left'\n | 'top-right'\n | 'center-left'\n | 'center-right';\n\nexport interface StnFloatingToolbarProps extends React.HTMLAttributes<HTMLDivElement> {\n /** 캔버스 기준 고정 위치 (기본값: 'none' - 인라인 플렉스) */\n placement?: StnFloatingToolbarPlacement;\n /** 툴바 방향 (기본값: 'horizontal') */\n orientation?: StnToolbarOrientation;\n /** 추가 클래스 */\n className?: string;\n children?: React.ReactNode;\n}\n\nexport interface StnMapToolbarProps extends StnFloatingToolbarProps {\n /** 뷰 모드 드롭다운 옵션 (미지정 시 기본 ['구면', '평면', '원형'] 제공) */\n modeOptions?: StnDropdownOption[];\n /** 현재 선택된 뷰 모드 값 */\n modeValue?: string;\n /** 뷰 모드 변경 콜백 */\n onModeChange?: (value: string) => void;\n /** 드롭다운 너비 (기본값: 110px) */\n dropdownWidth?: number | string;\n /** 툴바 버튼 스타일 (기본값: 'ghost') */\n buttonVariant?: 'ghost' | 'outlined';\n /** 초기화(Restore) 버튼 클릭 핸들러 */\n onRestore?: () => void;\n /** 전체화면(Fullscreen) 버튼 클릭 핸들러 */\n onFullscreen?: () => void;\n /** 확대(Zoom In) 버튼 클릭 핸들러 */\n onZoomIn?: () => void;\n /** 축소(Zoom Out) 버튼 클릭 핸들러 */\n onZoomOut?: () => void;\n /** 새로고침(Refresh) 버튼 클릭 핸들러 */\n onRefresh?: () => void;\n /** 추가 커스텀 액션 버튼들 */\n extraActions?: React.ReactNode;\n}\n\nconst DEFAULT_MAP_MODES: StnDropdownOption[] = [\n { value: 'sphere', label: '구면' },\n { value: 'plane', label: '평면' },\n { value: 'circle', label: '원형' },\n];\n\n/**\n * StnFloatingToolbar\n * 지도, 차트, 토폴로지 캔버스 위에 플로팅되는 툴바 컨테이너입니다.\n */\nexport const StnFloatingToolbar = React.forwardRef<HTMLDivElement, StnFloatingToolbarProps>(\n ({ placement = 'none', orientation = 'horizontal', className, children, ...restProps }, ref) => {\n const placementClass = placement !== 'none' ? `stn-floating-toolbar--${placement}` : '';\n const orientationClass = orientation === 'vertical' ? 'stn-floating-toolbar--vertical' : '';\n\n return (\n <div\n ref={ref}\n className={cn('stn-floating-toolbar', placementClass, orientationClass, className)}\n data-orientation={orientation}\n role=\"toolbar\"\n {...restProps}\n >\n {children}\n </div>\n );\n }\n);\n\nStnFloatingToolbar.displayName = 'StnFloatingToolbar';\n\n/**\n * StnMapToolbar\n * mockup/index.html의 토폴로지/지도 하단 툴바(topo-toolbar-container)를\n * 완벽히 재현한 통합 패턴 컴포넌트입니다.\n * 32px 드롭다운과 4px 각진 아이콘 버튼(StnButton shape=\"square\")으로 구성됩니다.\n */\nexport const StnMapToolbar = React.forwardRef<HTMLDivElement, StnMapToolbarProps>(\n (\n {\n placement = 'none',\n orientation = 'horizontal',\n modeOptions = DEFAULT_MAP_MODES,\n modeValue = 'sphere',\n onModeChange,\n dropdownWidth = 110,\n buttonVariant = 'ghost',\n onRestore,\n onFullscreen,\n onZoomIn,\n onZoomOut,\n onRefresh,\n extraActions,\n className,\n children,\n ...restProps\n },\n ref\n ) => {\n return (\n <StnFloatingToolbar\n ref={ref}\n placement={placement}\n orientation={orientation}\n className={cn('stn-map-toolbar', className)}\n aria-label=\"지도 및 토폴로지 도구 모음\"\n {...restProps}\n >\n {/* 1. 뷰 모드 드롭다운 */}\n {modeOptions && modeOptions.length > 0 && (\n <StnDropdown\n size=\"md\"\n width={dropdownWidth}\n options={modeOptions}\n value={modeValue}\n onChange={onModeChange}\n aria-label=\"투영 모드 선택\"\n />\n )}\n\n {/* 2. 표준 컨트롤 버튼들 (shape=\"square\" 32px 아이콘 버튼) */}\n {onRestore && (\n <StnButton\n variant={buttonVariant}\n size=\"md\"\n shape=\"square\"\n icon={\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M3.06006 13C3.30547 15.1939 4.34865 17.221 5.9912 18.696C7.63374 20.1709 9.76108 20.9907 11.9686 20.9994C14.1762 21.0081 16.3099 20.2052 17.9641 18.7434C19.6183 17.2815 20.6775 15.2627 20.9403 13.0708C21.2031 10.879 20.6511 8.66696 19.3894 6.85551C18.1276 5.04406 16.2441 3.75951 14.0971 3.24618C11.95 2.73284 9.68922 3.02652 7.74457 4.07135C5.79993 5.11619 4.30712 6.83931 3.55006 8.913\" />\n <path d=\"M3 4.00098V9.00098H8\" />\n <circle cx=\"12\" cy=\"12\" r=\"1\" fill=\"currentColor\" />\n </svg>\n }\n aria-label=\"초기화 (Restore)\"\n title=\"초기화 (Restore)\"\n onClick={onRestore}\n />\n )}\n\n {onFullscreen && (\n <StnButton\n variant={buttonVariant}\n size=\"md\"\n shape=\"square\"\n icon={\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M16 4H20V8\" />\n <path d=\"M14 10L20 4\" />\n <path d=\"M8 20H4V16\" />\n <path d=\"M4 20L10 14\" />\n </svg>\n }\n aria-label=\"전체화면\"\n title=\"전체화면\"\n onClick={onFullscreen}\n />\n )}\n\n {onZoomIn && (\n <StnButton\n variant={buttonVariant}\n size=\"md\"\n shape=\"square\"\n icon={\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M12 5V19\" />\n <path d=\"M5 12H19\" />\n </svg>\n }\n aria-label=\"확대\"\n title=\"확대\"\n onClick={onZoomIn}\n />\n )}\n\n {onZoomOut && (\n <StnButton\n variant={buttonVariant}\n size=\"md\"\n shape=\"square\"\n icon={\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M5 12H19\" />\n </svg>\n }\n aria-label=\"축소\"\n title=\"축소\"\n onClick={onZoomOut}\n />\n )}\n\n {onRefresh && (\n <StnButton\n variant={buttonVariant}\n size=\"md\"\n shape=\"square\"\n icon={\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M20 11C19.7554 9.24023 18.9391 7.60967 17.6766 6.35951C16.4142 5.10934 14.7758 4.30893 13.0137 4.08156C11.2516 3.8542 9.46362 4.21249 7.9252 5.10126C6.38678 5.99002 5.18325 7.35995 4.5 9.00001M4 5.00001V9.00001H8\" />\n <path d=\"M4 13C4.24456 14.7598 5.06093 16.3903 6.32336 17.6405C7.58579 18.8907 9.22424 19.6911 10.9863 19.9184C12.7484 20.1458 14.5364 19.7875 16.0748 18.8988C17.6132 18.01 18.8168 16.6401 19.5 15M20 19V15H16\" />\n </svg>\n }\n aria-label=\"새로고침\"\n title=\"새로고침\"\n onClick={onRefresh}\n />\n )}\n\n {extraActions}\n {children}\n </StnFloatingToolbar>\n );\n }\n);\n\nStnMapToolbar.displayName = 'StnMapToolbar';\n\nexport type StnFloatingToolbarPresetProps = StnMapToolbarProps;\nexport const StnFloatingToolbarPreset = StnMapToolbar;\n"],"mappings":"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","names":["jsx","jsx","StnButton","forwardRef","useCallback","useState","jsx","jsxs","forwardRef","StnSlider","useState","useCallback","sizeClass","systemIconSrc","resolveSystemIconSrcFromName","jsx","forwardRef","jsx","jsxs","forwardRef","StnPagination","forwardRef","useEffect","forwardRef","jsx","forwardRef","StnLayer","jsx","jsxs","forwardRef","StnPopup","useEffect","jsx","jsx","forwardRef","useEffect","jsx","jsxs","forwardRef","StnProgressBar","useEffect","forwardRef","useId","jsx","jsxs","forwardRef","StnCircularProgress","useId","forwardRef","createContext","useContext","useEffect","useRef","useState","forwardRef","useEffect","useId","useRef","jsx","jsxs","forwardRef","StnCheckbox","useId","useRef","useEffect","jsx","jsxs","createContext","useState","useRef","useEffect","forwardRef","StnTableGrid","StnTableHead","StnTableBody","StnTableRow","useContext","StnTableTh","StnTableTd","StnTableThCheck","StnTableTdCheck","StnTableSort","StnTableRowActions","forwardRef","useCallback","useMemo","useState","forwardRef","resolveSystemIconSrcFromName","jsx","jsxs","resolveSystemIconSrcFromName","forwardRef","StnTreeNode","jsx","jsxs","useState","useCallback","forwardRef","StnTree","useMemo","forwardRef","useId","jsx","jsxs","forwardRef","StnScroll","useId","forwardRef","jsx","forwardRef","StnSectionSide","forwardRef","jsx","jsxs","forwardRef","StnLoginCardGlowWrapper","StnLoginCard","StnLoginBrandStack","StnLoginFormStack","StnLoginFormFields","StnLoginFormLinks","StnLoginPlaceholder","cloneElement","forwardRef","isValidElement","jsx","jsxs","forwardRef","StnLoginTextField","isValidElement","cloneElement","forwardRef","jsx","jsxs","forwardRef","StnLogo","jsx","jsxs","colorClass","jsx","jsxs","variantClass","React","jsx","jsxs","React","jsx","jsxs","forwardRef","useState","Fragment","jsx","jsxs","forwardRef","StnToggleButton","useState","forwardRef","useId","jsx","jsxs","forwardRef","StnSwitch","useId","sizeClass","forwardRef","useId","jsx","jsxs","forwardRef","StnRadio","useId","sizeClass","useId","jsx","useId","useId","jsx","jsxs","useId","useCallback","useEffect","useId","useRef","useState","jsx","jsxs","useState","useCallback","useId","useRef","useEffect","jsx","forwardRef","useId","jsx","jsxs","sizeClass","variantClass","forwardRef","StnTextField","useId","forwardRef","jsx","jsxs","normalizeSize","sizeClass","forwardRef","StnDateRangeField","STN_DATE_RANGE_FIELD_DEMO","formatStnDateRangeFieldValue","parseStnDateRangeFieldValue","STN_SEARCH_REQUIREMENT_DEMO_FIELDS","jsx","jsxs","useCallback","useEffect","useRef","useState","createPortal","formatStnDateRangeFieldValue","useCallback","useEffect","useId","useMemo","useState","jsx","jsxs","useState","useEffect","useMemo","useId","useCallback","jsx","jsxs","useState","useCallback","formatStnDateRangeFieldValue","useRef","useEffect","createPortal","jsx","jsxs","jsx","variantClass","STN_LAYER0_BACKGROUND_DEMO_IMAGES","STN_LAYER0_MAP_LIGHT_OVERLAY","jsx","jsxs","STN_DATE_PICKER_WEEKDAYS","Children","Fragment","cloneElement","isValidElement","React","jsx","jsxs","SEVERITY_ICONS","React","jsx","jsxs","_","useId","jsx","jsxs","jsx","jsxs","useId","useState","jsx","jsxs","useState","Fragment","jsx","jsxs","isValidElement","cloneElement","Children","resolveStnWidgetBackground","Children","forwardRef","Fragment","isValidElement","jsx","jsxs","forwardRef","StnStack","Children","isValidElement","Fragment","jsx","jsxs","jsx","jsxs","useId","useState","jsx","jsxs","useId","useState","jsx","STN_ALERT_CENTER_TABS","STN_ALERT_CENTER_TAB_IDS","STN_ALERT_CENTER_DEMO_ALERTS","STN_ALERT_CENTER_DEMO_WORK","STN_ALERT_CENTER_DEMO_DEPLOY","createContext","useContext","forwardRef","jsx","jsxs","maskStyle","forwardRef","StnSideNavItem","forwardRef","forwardRef","jsx","forwardRef","StnSideNavLogo","Fragment","jsx","jsxs","forwardRef","StnSideNavHeader","forwardRef","jsx","forwardRef","StnSideNavMenu","forwardRef","useEffect","useRef","useState","jsx","jsxs","forwardRef","StnSideNavGroup","useState","useRef","useEffect","forwardRef","jsx","forwardRef","StnSideNavSpacer","forwardRef","jsx","forwardRef","StnSideNavFooter","forwardRef","jsx","forwardRef","StnSideNavToggle","forwardRef","jsx","forwardRef","StnSideNavWatermark","forwardRef","jsx","jsxs","forwardRef","StnSideNavMobileTrigger","forwardRef","jsx","forwardRef","StnSideNavSub","StnSideNavSubItem","forwardRef","jsx","forwardRef","StnSideNavSubNav","forwardRef","useCallback","useMemo","useState","jsx","jsxs","useState","useCallback","forwardRef","StnSideNavigationRoot","useMemo","Fragment","useEffect","useId","useRef","useState","Fragment","jsx","jsxs","maskStyle","useRef","useEffect","useId","useState","useEffect","useState","jsx","jsxs","useState","useEffect","forwardRef","jsx","forwardRef","StnContainer","forwardRef","jsx","BREAKPOINTS","JUSTIFY_CLASS","ALIGN_CLASS","isResponsiveObject","forwardRef","StnGrid","jsx","jsxs","jsx","jsx","jsx","jsxs","StnLayer","jsx","jsxs","useMemo","useState","Fragment","jsx","jsxs","useState","useMemo","useState","jsx","jsxs","useState","STN_LAYER_ROLE_TO_LEVEL","React","jsx","jsxs","React"]}
|