@reopt-ai/opt-ui 1.6.0 → 1.7.0
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/COMPONENT_CATALOG.md +95 -12
- package/dist/app.css +24 -0
- package/dist/core/index.cjs +3 -3
- package/dist/core/index.d.cts +1 -1
- package/dist/core/index.d.ts +1 -1
- package/dist/core/index.js +2 -2
- package/dist/docs/02-components/03-shells.md +104 -11
- package/dist/docs/02-components/index.md +3 -3
- package/dist/docs/05-migration/01-breaking-changes.md +18 -1
- package/dist/field-sidebar-BTZCBviA.d.cts +1031 -0
- package/dist/field-sidebar-BTZCBviA.d.cts.map +1 -0
- package/dist/field-sidebar-CB8vjvUM.d.ts +1031 -0
- package/dist/field-sidebar-CB8vjvUM.d.ts.map +1 -0
- package/dist/{workflow-canvas-BGBAcjf-.js → field-sidebar-Cs-J-5VE.js} +1882 -52
- package/dist/field-sidebar-Cs-J-5VE.js.map +1 -0
- package/dist/{workflow-canvas-3Jeevkgy.cjs → field-sidebar-CzIQX70-.cjs} +2010 -48
- package/dist/id-registry.cjs +41 -1
- package/dist/id-registry.d.cts +1 -1
- package/dist/id-registry.d.cts.map +1 -1
- package/dist/id-registry.d.ts +1 -1
- package/dist/id-registry.d.ts.map +1 -1
- package/dist/id-registry.js +41 -1
- package/dist/id-registry.js.map +1 -1
- package/dist/id-registry.json +85 -0
- package/dist/index.cjs +142 -56
- package/dist/index.d.cts +149 -80
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.ts +149 -80
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +73 -11
- package/dist/index.js.map +1 -1
- package/dist/meta.cjs +292 -0
- package/dist/meta.d.cts.map +1 -1
- package/dist/meta.d.ts.map +1 -1
- package/dist/meta.js +292 -0
- package/dist/meta.js.map +1 -1
- package/dist/{pagination-By7Ozv3U.js → pagination-DWbvACuN.js} +93 -31
- package/dist/pagination-DWbvACuN.js.map +1 -0
- package/dist/{pagination-Uv3CnGJz.cjs → pagination-DjfxBcjX.cjs} +98 -36
- package/dist/query.cjs +386 -0
- package/dist/query.d.cts +141 -0
- package/dist/query.d.cts.map +1 -0
- package/dist/query.d.ts +141 -0
- package/dist/query.d.ts.map +1 -0
- package/dist/query.js +371 -0
- package/dist/query.js.map +1 -0
- package/dist/{shader-surface-BWhO2xkk.js → shader-surface-BUPZ0P-n.js} +22 -83
- package/dist/shader-surface-BUPZ0P-n.js.map +1 -0
- package/dist/{shader-surface-DIVWtpFl.d.ts → shader-surface-BfTP9c1Q.d.ts} +139 -139
- package/dist/shader-surface-BfTP9c1Q.d.ts.map +1 -0
- package/dist/{shader-surface-BK1GMt5_.d.cts → shader-surface-DRrcLrWf.d.cts} +139 -139
- package/dist/shader-surface-DRrcLrWf.d.cts.map +1 -0
- package/dist/{shader-surface-DxLLfrE6.cjs → shader-surface-Fav5K9UC.cjs} +20 -87
- package/dist/shells/index.cjs +31 -24
- package/dist/shells/index.d.cts +2 -2
- package/dist/shells/index.d.ts +2 -2
- package/dist/shells/index.js +3 -2
- package/dist/theme/presets/default.css +2 -2
- package/dist/theme/presets/minimal.css +2 -2
- package/dist/theme/presets/mono-dark.css +2 -2
- package/dist/theme/presets/natural.css +1 -1
- package/dist/theme/presets/pro.css +2 -2
- package/package.json +17 -6
- package/dist/pagination-By7Ozv3U.js.map +0 -1
- package/dist/shader-surface-BK1GMt5_.d.cts.map +0 -1
- package/dist/shader-surface-BWhO2xkk.js.map +0 -1
- package/dist/shader-surface-DIVWtpFl.d.ts.map +0 -1
- package/dist/workflow-canvas-BGBAcjf-.js.map +0 -1
- package/dist/workflow-canvas-Bar_O2SQ.d.ts +0 -494
- package/dist/workflow-canvas-Bar_O2SQ.d.ts.map +0 -1
- package/dist/workflow-canvas-DghDRtHn.d.cts +0 -494
- package/dist/workflow-canvas-DghDRtHn.d.cts.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["defaultLabels","defaultLabels","defaultLabels","defaultLabels","defaultLabels","defaultLabels","defaultLabels","defaultLabels","defaultLabels","defaultLabels","defaultLabels","defaultLabels","OPERATORS","defaultLabels","defaultLabels","defaultLabels","defaultLabels","defaultLabels","defaultLabels","defaultLabels","DEFAULT_PRESETS","defaultLabels","makePresetSpec","defaultLabels","defaultLabels","defaultLabels","defaultLabels","defaultLabels","defaultLabels","defaultLabels","defaultLabels","defaultLabels","defaultLabels","defaultLabels","Section"],"sources":["../src/lib/schema-validator.ts","../src/core/error-boundary.tsx","../src/shells/page-aside.tsx","../src/shells/task-list.tsx","../src/shells/activity-feed.tsx","../src/shells/filter-bar.tsx","../src/shells/quick-actions.tsx","../src/shells/team-member-list.tsx","../src/shells/auth-form.tsx","../src/shells/dynamic-field-form.tsx","../src/shells/file-upload-form.tsx","../src/shells/wizard-form.tsx","../src/shells/event-icon.tsx","../src/shells/connection-indicator.tsx","../src/shells/floating-action-bar.tsx","../src/shells/template-picker.tsx","../src/shells/code-snippet-viewer.tsx","../src/shells/property-explorer.tsx","../src/shells/query-results-table.tsx","../src/shells/alert-builder.tsx","../src/shells/sql-editor.tsx","../src/shells/event-meta-editor.tsx","../src/shells/widget-grid.tsx","../src/shells/report-builder.tsx","../src/shells/audit-timeline.tsx","../src/shells/segment-builder.tsx","../src/shells/insights-panel.tsx","../src/shells/time-range-selector.tsx","../src/shells/export-button.tsx","../src/shells/summary-row.tsx","../src/shells/comparison-selector.tsx","../src/lib/theme/presets/index.ts","../src/lib/theme/theme-types.ts","../src/lib/theme/theme-serialize.ts","../src/lib/theme/theme-resolution.ts","../src/lib/theme/theme-controller-context.tsx","../src/lib/theme/theme-provider.tsx","../src/shells/theme-switcher.tsx","../src/shells/prompt-template.tsx","../src/shells/sidebar.tsx","../src/shells/app-shell.tsx","../src/shells/confirm-dialog.tsx","../src/shells/async-combobox.tsx","../src/shells/vertical-tabs.tsx","../src/shells/column-toggler.tsx","../src/shells/bulk-actions.tsx","../src/shells/saved-filters.tsx","../src/shells/notification-center.tsx","../src/shells/audit-log.tsx","../src/shells/tree-table.tsx","../src/shells/inline-edit-table.tsx","../src/shells/kanban-board.tsx","../src/shells/rich-text-editor.tsx","../src/shells/code-diff-viewer.tsx","../src/shells/webhook-config.tsx","../src/shells/feature-flag-panel.tsx","../src/shells/data-import-wizard.tsx","../src/shells/mega-menu.tsx","../src/shells/chat-sidebar.tsx","../src/shells/chat-input.tsx","../src/shells/chat-message-list.tsx","../src/utils/route-focus-manager.tsx","../src/devtools/design-guide-panel.tsx","../src/lib/spatial-nav.ts","../src/i18n/en.ts"],"sourcesContent":["import type { FormErrors } from \"@reopt-ai/opt-ui-primitives\";\n\n/**\n * Adapter for schema-based validation (Zod, Valibot, or any library with safeParse).\n * No direct dependency on any schema library.\n *\n * @example\n * ```ts\n * import { schemaValidator } from \"@reopt-ai/opt-ui\";\n * import { z } from \"zod\";\n *\n * const form = useFormStore({\n * defaultValues: { email: \"\", age: 0 },\n * validate: schemaValidator(z.object({\n * email: z.string().email(\"유효한 이메일을 입력하세요\"),\n * age: z.number().min(1, \"나이를 입력하세요\"),\n * })),\n * });\n * ```\n */\n\ninterface ParseSuccess {\n success: true;\n}\n\ninterface ParseFailure {\n success: false;\n error: {\n issues: { path: (string | number)[]; message: string }[];\n };\n}\n\ntype ParseResult = ParseSuccess | ParseFailure;\n\n/**\n * Minimal interface satisfied by Zod schemas, Valibot schemas, and similar\n * libraries that implement `safeParse`. No runtime dependency required.\n */\nexport interface SchemaLike {\n safeParse(data: unknown): ParseResult;\n}\n\n/** Handles schema validator. */\nexport function schemaValidator<V extends Record<string, unknown>>(\n schema: SchemaLike,\n): (values: V) => FormErrors {\n return (values) => {\n const result = schema.safeParse(values);\n if (result.success) return {};\n const errors: Record<string, string> = {};\n for (const issue of result.error.issues) {\n const key = issue.path.join(\".\");\n if (!errors[key]) errors[key] = issue.message;\n }\n return errors;\n };\n}\n","\"use client\";\n\nimport { Component, type ReactNode, type ErrorInfo } from \"react\";\nimport { Alert } from \"./alert\";\n\n/** Props for the error boundary component. */\nexport interface ErrorBoundaryProps {\n children: ReactNode;\n fallback?: ReactNode | ((error: Error) => ReactNode);\n onError?: (error: Error, info: ErrorInfo) => void;\n}\n\ninterface ErrorBoundaryState {\n error: Error | null;\n}\n\nexport class ErrorBoundary extends Component<\n ErrorBoundaryProps,\n ErrorBoundaryState\n> {\n static displayName = \"ErrorBoundary\";\n\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = { error: null };\n }\n\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\n return { error };\n }\n\n componentDidCatch(error: Error, info: ErrorInfo): void {\n this.props.onError?.(error, info);\n }\n\n render() {\n if (this.state.error) {\n const { fallback } = this.props;\n if (typeof fallback === \"function\") {\n return fallback(this.state.error);\n }\n if (fallback !== undefined) {\n return fallback;\n }\n return (\n <Alert variant=\"error\">\n {this.state.error.message || \"Something went wrong\"}\n </Alert>\n );\n }\n return this.props.children;\n }\n}\n","import type { ReactNode } from \"react\";\nimport { cn } from \"../lib/cn\";\n\n/** i18n labels for {@link PageAside}. */\nexport interface PageAsideLabels {\n /** `aria-label` fallback when `label` prop is not provided. */\n ariaLabel: string;\n}\n\n/** Default English labels for {@link PageAside}. */\nexport const defaultLabels: PageAsideLabels = {\n ariaLabel: \"Page navigation\",\n};\n\n/** Props for {@link PageAside}. */\nexport interface PageAsideProps {\n /** Content rendered in the sticky top slot (e.g. package switcher). */\n header?: ReactNode;\n /** Main scrollable nav area. */\n children: ReactNode;\n /** Content rendered in the bottom slot (e.g. version label). */\n footer?: ReactNode;\n /**\n * Width utility class. Defaults to `w-60`. Pass `\"w-56\"`, `\"w-64\"`, etc.\n */\n widthClassName?: string;\n /** `aria-label` for the underlying `<aside>`. */\n label?: string;\n /** Hide aside below `md` breakpoint. Defaults to true. */\n hideOnMobile?: boolean;\n className?: string;\n /** Override the header slot's chrome (default: `px-3 py-3`). */\n headerClassName?: string;\n /** Override the body slot's chrome (default: `px-3 py-3`). */\n bodyClassName?: string;\n /** Override the footer slot's chrome (default: `px-4 py-3`). */\n footerClassName?: string;\n}\n\n/**\n * Sticky page-level sidebar chrome. Owns position/border/surface and a\n * three-slot layout (header / scroll body / footer). Doesn't prescribe the\n * nav surface — drop `SidebarNav`, custom tree, tag list, etc. into `children`.\n */\nexport function PageAside({\n header,\n children,\n footer,\n widthClassName = \"w-60\",\n label,\n hideOnMobile = true,\n className,\n headerClassName,\n bodyClassName,\n footerClassName,\n}: PageAsideProps) {\n return (\n <aside\n aria-label={label}\n className={cn(\n \"bg-surface sticky top-[var(--global-header-height)] h-[calc(100vh-var(--global-header-height))] shrink-0 flex-col\",\n widthClassName,\n hideOnMobile ? \"hidden md:flex\" : \"flex\",\n className,\n )}\n data-opt-id=\"ZQDMX\"\n data-opt-slug=\"page-aside.PageAside\"\n >\n {header ? (\n <div className={cn(\"shrink-0\", headerClassName ?? \"px-3 py-3\")}>\n {header}\n </div>\n ) : null}\n <div\n className={cn(\"flex-1 overflow-y-auto\", bodyClassName ?? \"px-3 py-3\")}\n >\n {children}\n </div>\n {footer ? (\n <div className={cn(\"shrink-0\", footerClassName ?? \"px-4 py-3\")}>\n {footer}\n </div>\n ) : null}\n </aside>\n );\n}\n\nPageAside.displayName = \"PageAside\";\n","\"use client\";\n\nimport {\n Composite,\n CompositeItem,\n CompositeProvider,\n} from \"../core/composite-zone\";\nimport type { TaskDef } from \"../lib/types\";\nimport {\n OPT_FOCUS,\n OPT_TEXT_PRIMARY,\n OPT_TEXT_SECONDARY,\n OPT_TEXT_TERTIARY,\n OPT_BADGE_GREEN,\n OPT_BADGE_YELLOW,\n OPT_BADGE_RED,\n OPT_BADGE_NEUTRAL,\n OPT_BADGE_BLUE,\n OPT_BORDER,\n} from \"../lib/styles\";\nimport { Avatar } from \"../core/avatar\";\nimport { Checkbox } from \"../core/checkbox\";\n\n/** Localized labels for the task list component. */\nexport interface TaskListLabels {\n title?: string;\n emptyMessage?: string;\n completedOf?: string; // \"{completed}/{total} 완료\" pattern\n priority?: {\n low?: string;\n medium?: string;\n high?: string;\n urgent?: string;\n };\n status?: {\n todo?: string;\n \"in-progress\"?: string;\n review?: string;\n done?: string;\n };\n moreItems?: string; // \"+{count}\" pattern\n}\n\nconst defaultLabels: Required<TaskListLabels> = {\n title: \"작업 목록\",\n emptyMessage: \"작업이 없습니다\",\n completedOf: \"{completed}/{total} 완료\",\n priority: {\n low: \"낮음\",\n medium: \"보통\",\n high: \"높음\",\n urgent: \"긴급\",\n },\n status: {\n todo: \"할 일\",\n \"in-progress\": \"진행 중\",\n review: \"검토\",\n done: \"완료\",\n },\n moreItems: \"+{count}\",\n};\n\n/** Props for the task list component. */\nexport interface TaskListProps {\n tasks: TaskDef[];\n title?: string;\n onTaskClick?: (task: TaskDef) => void;\n onTaskStatusChange?: (task: TaskDef, completed: boolean) => void;\n emptyMessage?: string;\n showSubtasks?: boolean;\n /** Maximum number of tasks to display */\n maxItems?: number;\n /** Custom labels for i18n support */\n labels?: TaskListLabels;\n className?: string;\n}\n\n/** Renders the task list component. */\nexport function TaskList({\n tasks,\n title,\n onTaskClick,\n onTaskStatusChange,\n emptyMessage,\n showSubtasks = false,\n maxItems,\n labels: customLabels,\n className,\n}: TaskListProps) {\n const labels = {\n ...defaultLabels,\n ...customLabels,\n priority: { ...defaultLabels.priority, ...customLabels?.priority },\n status: { ...defaultLabels.status, ...customLabels?.status },\n };\n\n const displayTitle = title ?? labels.title;\n const displayEmptyMessage = emptyMessage ?? labels.emptyMessage;\n\n const displayTasks = maxItems ? tasks.slice(0, maxItems) : tasks;\n const remainingCount = maxItems ? Math.max(0, tasks.length - maxItems) : 0;\n\n const completedCount = tasks.filter((t) => t.status === \"done\").length;\n const progress = tasks.length > 0 ? (completedCount / tasks.length) * 100 : 0;\n\n const priorityBadge: Record<TaskDef[\"priority\"], string> = {\n low: OPT_BADGE_NEUTRAL,\n medium: OPT_BADGE_BLUE,\n high: OPT_BADGE_YELLOW,\n urgent: OPT_BADGE_RED,\n };\n\n const statusBadge: Record<TaskDef[\"status\"], string> = {\n todo: OPT_BADGE_NEUTRAL,\n \"in-progress\": OPT_BADGE_BLUE,\n review: OPT_BADGE_YELLOW,\n done: OPT_BADGE_GREEN,\n };\n\n const completedText = labels.completedOf\n .replace(\"{completed}\", String(completedCount))\n .replace(\"{total}\", String(tasks.length));\n\n return (\n <div\n className={className}\n data-opt-id=\"0DK79\"\n data-opt-slug=\"task-list.TaskList\"\n >\n <div className=\"gap-group flex flex-col\">\n <div className=\"flex items-center justify-between\">\n <h3 className={`text-sm font-semibold ${OPT_TEXT_PRIMARY}`}>\n {displayTitle}\n </h3>\n <span className={`text-xs ${OPT_TEXT_TERTIARY}`}>\n {completedText}\n </span>\n </div>\n\n {/* Progress bar with accessibility */}\n <div\n role=\"progressbar\"\n aria-valuenow={Math.round(progress)}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-label={`${displayTitle} 진행률`}\n className=\"bg-bg-subtle h-1.5 w-full rounded-full\"\n >\n <div\n className=\"bg-success h-full rounded-full transition-all duration-300\"\n style={{ width: `${progress}%` }}\n />\n </div>\n\n {tasks.length === 0 ? (\n <div\n role=\"status\"\n className={`py-8 text-center text-sm ${OPT_TEXT_SECONDARY}`}\n >\n {displayEmptyMessage}\n </div>\n ) : (\n <CompositeProvider focusLoop orientation=\"vertical\">\n <Composite\n role=\"list\"\n aria-label={displayTitle}\n className={`rounded-lg ${OPT_BORDER} divide-border-subtle bg-surface divide-y`}\n >\n {displayTasks.map((task) => (\n <CompositeItem\n key={task.id}\n role=\"listitem\"\n className={`group gap-group flex w-full items-start p-3 ${OPT_FOCUS} data-[active-item]:bg-accent-subtle ${\n onTaskClick ? \"cursor-pointer\" : \"\"\n }`}\n onClick={() => onTaskClick?.(task)}\n >\n {onTaskStatusChange && (\n <div\n className=\"pt-0.5\"\n role=\"presentation\"\n onClick={(e) => e.stopPropagation()}\n >\n <Checkbox\n checked={task.status === \"done\"}\n onChange={(checked) =>\n onTaskStatusChange(task, checked)\n }\n aria-label={`${task.title} 완료 표시`}\n />\n </div>\n )}\n\n <div className=\"min-w-0 flex-1\">\n <div className=\"gap-element flex items-center\">\n <span\n className={`text-sm font-medium ${OPT_TEXT_PRIMARY} ${\n task.status === \"done\"\n ? \"line-through opacity-60\"\n : \"\"\n }`}\n >\n {task.title}\n </span>\n <span className={priorityBadge[task.priority]}>\n {labels.priority[task.priority]}\n </span>\n <span className={statusBadge[task.status]}>\n {labels.status[task.status]}\n </span>\n </div>\n\n {task.description && (\n <p\n className={`mt-1 text-xs ${OPT_TEXT_SECONDARY} line-clamp-1`}\n >\n {task.description}\n </p>\n )}\n\n {showSubtasks &&\n task.subtasks &&\n task.subtasks.length > 0 && (\n <div className=\"gap-element mt-2 flex flex-col\">\n {task.subtasks.map((subtask) => (\n <div\n key={subtask.id}\n className={`text-xs ${OPT_TEXT_TERTIARY} flex items-center gap-1.5`}\n >\n <Checkbox\n checked={subtask.completed}\n disabled\n aria-label={subtask.title}\n className=\"scale-75\"\n />\n <span\n className={\n subtask.completed ? \"line-through\" : \"\"\n }\n >\n {subtask.title}\n </span>\n </div>\n ))}\n </div>\n )}\n\n <div className=\"gap-group mt-2 flex items-center\">\n {task.assignee && (\n <div className=\"flex items-center gap-1.5\">\n <Avatar\n name={task.assignee.name}\n src={task.assignee.avatar}\n size=\"xs\"\n />\n <span className={`text-xs ${OPT_TEXT_TERTIARY}`}>\n {task.assignee.name}\n </span>\n </div>\n )}\n {task.dueDate && (\n <span className={`text-xs ${OPT_TEXT_TERTIARY}`}>\n 📅 {task.dueDate}\n </span>\n )}\n {task.tags && task.tags.length > 0 && (\n <div className=\"flex items-center gap-1\">\n {task.tags.slice(0, 2).map((tag) => (\n <span\n key={tag}\n className={`bg-bg-subtle rounded px-1.5 py-0.5 text-xs ${OPT_TEXT_TERTIARY}`}\n >\n {tag}\n </span>\n ))}\n {task.tags.length > 2 && (\n <span\n className={`text-xs ${OPT_TEXT_TERTIARY}`}\n aria-label={`${task.tags.length - 2}개 추가 태그`}\n >\n {labels.moreItems.replace(\n \"{count}\",\n String(task.tags.length - 2),\n )}\n </span>\n )}\n </div>\n )}\n </div>\n </div>\n </CompositeItem>\n ))}\n\n {remainingCount > 0 && (\n <div\n className={`p-3 text-center text-xs ${OPT_TEXT_TERTIARY} hover:text-accent cursor-pointer transition-colors`}\n >\n {remainingCount}개 더 보기\n </div>\n )}\n </Composite>\n </CompositeProvider>\n )}\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport {\n CircleCheck,\n FilePen,\n GitMerge,\n type LucideIcon,\n MessageSquare,\n Rocket,\n Sparkles,\n User,\n} from \"lucide-react\";\nimport type { KeyboardEvent, ReactNode } from \"react\";\nimport {\n Composite,\n CompositeItem,\n CompositeProvider,\n} from \"../core/composite-zone\";\nimport type { ActivityDef } from \"../lib/types\";\nimport {\n OPT_FOCUS,\n OPT_FOCUS_VISIBLE,\n OPT_TEXT_PRIMARY,\n OPT_TEXT_SECONDARY,\n OPT_TEXT_TERTIARY,\n OPT_BORDER,\n} from \"../lib/styles\";\nimport { cn } from \"../lib/cn\";\nimport { Avatar } from \"../core/avatar\";\n\ninterface TimeAgoLabels {\n justNow: string;\n minutesAgo: string;\n hoursAgo: string;\n daysAgo: string;\n}\n\ninterface ActivityVerbLabels {\n created: string;\n updated: string;\n completed: string;\n commented: string;\n assigned: string;\n deployed: string;\n merged: string;\n}\n\n/** Localized labels for the activity feed component. */\nexport interface ActivityFeedLabels {\n title?: string;\n emptyMessage?: string;\n moreItems?: string; // \"{count}개 더 보기\" pattern\n timeAgo?: Partial<TimeAgoLabels>;\n activityVerbs?: Partial<ActivityVerbLabels>;\n}\n\ninterface DefaultLabels {\n title: string;\n emptyMessage: string;\n moreItems: string;\n timeAgo: TimeAgoLabels;\n activityVerbs: ActivityVerbLabels;\n}\n\nconst defaultLabels: DefaultLabels = {\n title: \"활동 피드\",\n emptyMessage: \"활동이 없습니다\",\n moreItems: \"{count}개 더 보기\",\n timeAgo: {\n justNow: \"방금 전\",\n minutesAgo: \"{minutes}분 전\",\n hoursAgo: \"{hours}시간 전\",\n daysAgo: \"{days}일 전\",\n },\n activityVerbs: {\n created: \"생성\",\n updated: \"수정\",\n completed: \"완료\",\n commented: \"댓글\",\n assigned: \"할당\",\n deployed: \"배포\",\n merged: \"병합\",\n },\n};\n\nconst activityIcon = {\n created: Sparkles,\n updated: FilePen,\n completed: CircleCheck,\n commented: MessageSquare,\n assigned: User,\n deployed: Rocket,\n merged: GitMerge,\n} satisfies Record<ActivityDef[\"type\"], LucideIcon>;\n\n/** Props for the activity feed component. */\nexport interface ActivityFeedProps {\n activities: ActivityDef[];\n title?: string;\n maxItems?: number;\n onActivityClick?: (activity: ActivityDef) => void;\n /** Called when \"show more\" button is clicked */\n onShowMore?: () => void;\n emptyMessage?: string;\n /** Custom labels for i18n support */\n labels?: ActivityFeedLabels;\n /** Locale for date formatting (default: 'ko-KR') */\n locale?: string;\n /** Show loading state */\n loading?: boolean;\n /** Layout style: list (default) shows time below, compact shows time inline */\n layout?: \"list\" | \"compact\";\n /** Render action buttons for each activity item */\n renderActions?: (activity: ActivityDef) => ReactNode;\n className?: string;\n}\n\nfunction formatRelativeTime(\n timestamp: string,\n timeLabels: {\n justNow: string;\n minutesAgo: string;\n hoursAgo: string;\n daysAgo: string;\n },\n locale: string,\n): string {\n const now = new Date();\n const date = new Date(timestamp);\n const diffMs = now.getTime() - date.getTime();\n const diffMins = Math.floor(diffMs / 60000);\n const diffHours = Math.floor(diffMs / 3600000);\n const diffDays = Math.floor(diffMs / 86400000);\n\n if (diffMins < 1) return timeLabels.justNow;\n if (diffMins < 60)\n return timeLabels.minutesAgo.replace(\"{minutes}\", String(diffMins));\n if (diffHours < 24)\n return timeLabels.hoursAgo.replace(\"{hours}\", String(diffHours));\n if (diffDays < 7)\n return timeLabels.daysAgo.replace(\"{days}\", String(diffDays));\n return date.toLocaleDateString(locale);\n}\n\nconst variantBorder: Record<string, string> = {\n error: \"border-l-2 border-l-danger\",\n warning: \"border-l-2 border-l-warning\",\n};\n\n/** Renders the activity feed component. */\nexport function ActivityFeed({\n activities,\n title,\n maxItems,\n onActivityClick,\n onShowMore,\n emptyMessage,\n labels: customLabels,\n locale = \"ko-KR\",\n loading = false,\n layout = \"list\",\n renderActions,\n className,\n}: ActivityFeedProps) {\n const mergedTimeAgo: {\n justNow: string;\n minutesAgo: string;\n hoursAgo: string;\n daysAgo: string;\n } = {\n justNow: customLabels?.timeAgo?.justNow ?? defaultLabels.timeAgo.justNow,\n minutesAgo:\n customLabels?.timeAgo?.minutesAgo ?? defaultLabels.timeAgo.minutesAgo,\n hoursAgo: customLabels?.timeAgo?.hoursAgo ?? defaultLabels.timeAgo.hoursAgo,\n daysAgo: customLabels?.timeAgo?.daysAgo ?? defaultLabels.timeAgo.daysAgo,\n };\n const mergedActivityVerbs = {\n created:\n customLabels?.activityVerbs?.created ??\n defaultLabels.activityVerbs.created,\n updated:\n customLabels?.activityVerbs?.updated ??\n defaultLabels.activityVerbs.updated,\n completed:\n customLabels?.activityVerbs?.completed ??\n defaultLabels.activityVerbs.completed,\n commented:\n customLabels?.activityVerbs?.commented ??\n defaultLabels.activityVerbs.commented,\n assigned:\n customLabels?.activityVerbs?.assigned ??\n defaultLabels.activityVerbs.assigned,\n deployed:\n customLabels?.activityVerbs?.deployed ??\n defaultLabels.activityVerbs.deployed,\n merged:\n customLabels?.activityVerbs?.merged ?? defaultLabels.activityVerbs.merged,\n };\n const labels = {\n title: customLabels?.title ?? defaultLabels.title,\n emptyMessage: customLabels?.emptyMessage ?? defaultLabels.emptyMessage,\n moreItems: customLabels?.moreItems ?? defaultLabels.moreItems,\n timeAgo: mergedTimeAgo,\n activityVerbs: mergedActivityVerbs,\n };\n\n const displayTitle = title ?? labels.title;\n const displayEmptyMessage = emptyMessage ?? labels.emptyMessage;\n\n const displayActivities = maxItems\n ? activities.slice(0, maxItems)\n : activities;\n const remainingCount = maxItems\n ? Math.max(0, activities.length - maxItems)\n : 0;\n const handleActivityKeyDown = (\n event: KeyboardEvent,\n activity: ActivityDef,\n ) => {\n if (!onActivityClick) return;\n if (event.key !== \"Enter\" && event.key !== \" \") return;\n event.preventDefault();\n onActivityClick(activity);\n };\n\n return (\n <div\n className={className}\n data-opt-id=\"DB87Z\"\n data-opt-slug=\"activity-feed.ActivityFeed\"\n >\n <div className=\"gap-group flex flex-col\">\n {displayTitle && (\n <h3 className={`text-sm font-semibold ${OPT_TEXT_PRIMARY}`}>\n {displayTitle}\n </h3>\n )}\n\n {activities.length === 0 ? (\n <div\n role=\"status\"\n className={`py-8 text-center text-sm ${OPT_TEXT_SECONDARY}`}\n >\n {displayEmptyMessage}\n </div>\n ) : (\n <CompositeProvider focusLoop orientation=\"vertical\">\n <Composite\n role=\"feed\"\n aria-label={displayTitle}\n aria-busy={loading}\n className={`rounded-lg ${OPT_BORDER} bg-surface`}\n >\n {displayActivities.map((activity, index) => {\n const ActivityIcon = activityIcon[activity.type];\n const isLast =\n index === displayActivities.length - 1 &&\n remainingCount === 0;\n const activityId = `activity-${activity.id}`;\n\n return (\n <CompositeItem\n render={<article />}\n key={activity.id}\n role=\"article\"\n aria-labelledby={activityId}\n className={cn(\n \"group gap-group relative flex w-full p-3\",\n OPT_FOCUS_VISIBLE,\n \"data-[active-item]:bg-accent-subtle\",\n onActivityClick && \"cursor-pointer\",\n !isLast && \"border-border-subtle border-b\",\n variantBorder[activity.variant ?? \"\"],\n )}\n onClick={() => onActivityClick?.(activity)}\n onKeyDown={(event) =>\n handleActivityKeyDown(event, activity)\n }\n >\n {/* Avatar with timeline connector */}\n <div className=\"relative flex flex-col items-center\">\n <Avatar\n name={activity.actor.name}\n src={activity.actor.avatar}\n size=\"sm\"\n />\n {layout === \"list\" && !isLast && (\n <div\n className=\"bg-border-subtle absolute top-8 h-[calc(100%-16px)] w-px\"\n aria-hidden=\"true\"\n />\n )}\n </div>\n\n {/* Content */}\n <div className=\"min-w-0 flex-1 pt-0.5\">\n <div className=\"gap-element flex items-center justify-between\">\n <div className=\"gap-element flex min-w-0 items-center\">\n <ActivityIcon\n className=\"shrink-0\"\n size={16}\n aria-hidden\n />\n <span\n id={activityId}\n className={`text-sm ${OPT_TEXT_PRIMARY} truncate`}\n >\n <span className=\"font-medium\">\n {activity.actor.name}\n </span>{\" \"}\n <span className={OPT_TEXT_SECONDARY}>\n {labels.activityVerbs[activity.type]}\n </span>{\" \"}\n <span className=\"font-medium\">\n {activity.title}\n </span>\n </span>\n </div>\n {layout === \"compact\" && (\n <time\n dateTime={activity.timestamp}\n className={`text-xs ${OPT_TEXT_TERTIARY} shrink-0`}\n >\n {formatRelativeTime(\n activity.timestamp,\n mergedTimeAgo,\n locale,\n )}\n </time>\n )}\n </div>\n\n {layout === \"list\" && activity.description && (\n <p\n className={`mt-1 text-xs ${OPT_TEXT_SECONDARY} line-clamp-2`}\n >\n {activity.description}\n </p>\n )}\n\n {layout === \"list\" && (\n <time\n dateTime={activity.timestamp}\n className={`mt-1 block text-xs ${OPT_TEXT_TERTIARY}`}\n >\n {formatRelativeTime(\n activity.timestamp,\n mergedTimeAgo,\n locale,\n )}\n </time>\n )}\n </div>\n\n {renderActions && (\n <div className=\"flex shrink-0 items-center gap-1\">\n {renderActions(activity)}\n </div>\n )}\n </CompositeItem>\n );\n })}\n\n {remainingCount > 0 && (\n <CompositeItem\n render={<button type=\"button\" />}\n onClick={onShowMore}\n className={`border-border-subtle w-full border-t p-3 text-center text-xs font-medium ${OPT_TEXT_SECONDARY} ${OPT_FOCUS} hover:text-accent data-[active-item]:bg-accent-subtle transition-colors`}\n aria-label={`${remainingCount}개의 활동 더 보기`}\n >\n {labels.moreItems.replace(\"{count}\", String(remainingCount))}\n </CompositeItem>\n )}\n </Composite>\n </CompositeProvider>\n )}\n </div>\n </div>\n );\n}\n\nActivityFeed.displayName = \"ActivityFeed\";\n","\"use client\";\n\nimport { useState, useRef, useCallback, type ReactNode } from \"react\";\nimport { Search } from \"lucide-react\";\nimport type { FilterGroupDef } from \"../lib/types\";\nimport { OPT_TEXT_PRIMARY, OPT_BORDER, OPT_FOCUS } from \"../lib/styles\";\nimport { PopoverRoot, PopoverTrigger, PopoverContent } from \"../core/popover\";\nimport {\n SelectRoot,\n SelectTrigger,\n SelectPopover,\n SelectItem,\n} from \"../core/select\";\nimport { Input } from \"../core/input\";\nimport { Button } from \"../core/button\";\nimport { Switch } from \"../core/switch\";\nimport { Checkbox } from \"../core/checkbox\";\nimport { DateRangePicker, type DateRange } from \"../core/date-range-picker\";\n\n/** Localized labels for the filter bar component. */\nexport interface FilterBarLabels {\n clearAll?: string;\n searchPlaceholder?: string;\n}\n\nconst defaultLabels: Required<FilterBarLabels> = {\n clearAll: \"필터 초기화\",\n searchPlaceholder: \"검색...\",\n};\n\n/**\n * Composable filter bar supporting 5 filter types:\n * - `search`: Free-text input with debounce\n * - `select`: Single-value dropdown\n * - `multiselect`: Multi-value checkbox dropdown with popover\n * - `toggle`: Boolean switch\n * - `dateRange`: Date range picker\n *\n * Each filter is defined via `FilterGroupDef` (see lib/types.ts).\n * The parent component manages filter state and passes it back via `onFilterChange`.\n */\nexport interface FilterBarProps {\n filters: FilterGroupDef[];\n onFilterChange?: (\n filterId: string,\n value: string | string[] | boolean,\n ) => void;\n onDateRangeChange?: (filterId: string, range: DateRange) => void;\n onClearAll?: () => void;\n labels?: FilterBarLabels;\n /** Slot next to Clear All button (e.g. SavedFilters) */\n presetActions?: ReactNode;\n className?: string;\n}\n\n/** Renders the filter bar component. */\nexport function FilterBar({\n filters,\n onFilterChange,\n onDateRangeChange,\n onClearAll,\n labels: customLabels,\n presetActions,\n className,\n}: FilterBarProps) {\n const labels = { ...defaultLabels, ...customLabels };\n const [searchValues, setSearchValues] = useState<Record<string, string>>({});\n const [tagInputValues, setTagInputValues] = useState<Record<string, string>>(\n {},\n );\n const [multiSelectOpen, setMultiSelectOpen] = useState<\n Record<string, boolean>\n >({});\n const triggerRefs = useRef<Record<string, HTMLButtonElement | null>>({});\n\n const hasActiveFilters = filters.some((f) => {\n if (f.type === \"search\") {\n return searchValues[f.id]?.length > 0;\n }\n if (f.type === \"toggle\") {\n return f.value === true;\n }\n return f.value && (Array.isArray(f.value) ? f.value.length > 0 : f.value);\n });\n\n const handleMultiSelectToggle = (filterId: string, optionValue: string) => {\n const filter = filters.find((f) => f.id === filterId);\n if (!filter) return;\n\n const currentValues = (filter.value as string[]) ?? [];\n const newValues = currentValues.includes(optionValue)\n ? currentValues.filter((v) => v !== optionValue)\n : [...currentValues, optionValue];\n\n onFilterChange?.(filterId, newValues);\n };\n\n const handleTagAdd = useCallback(\n (filterId: string) => {\n const val = tagInputValues[filterId]?.trim();\n if (!val) return;\n const filter = filters.find((f) => f.id === filterId);\n const currentTags = (filter?.value as string[]) ?? [];\n if (currentTags.includes(val)) return;\n onFilterChange?.(filterId, [...currentTags, val]);\n setTagInputValues((prev) => ({ ...prev, [filterId]: \"\" }));\n },\n [filters, tagInputValues, onFilterChange],\n );\n\n const handleTagRemove = useCallback(\n (filterId: string, tag: string) => {\n const filter = filters.find((f) => f.id === filterId);\n const currentTags = (filter?.value as string[]) ?? [];\n onFilterChange?.(\n filterId,\n currentTags.filter((t) => t !== tag),\n );\n },\n [filters, onFilterChange],\n );\n\n return (\n <div\n role=\"search\"\n aria-label=\"필터\"\n className={`gap-group flex flex-wrap items-center ${className ?? \"\"}`}\n data-opt-id=\"BS5N0\"\n data-opt-slug=\"filter-bar.FilterBar\"\n >\n {filters.map((filter) => {\n // ── Search ──\n if (filter.type === \"search\") {\n return (\n <div key={filter.id} className=\"relative\">\n <Input\n placeholder={filter.label || labels.searchPlaceholder}\n value={searchValues[filter.id] ?? \"\"}\n onChange={(e) => {\n const value = e.target.value;\n setSearchValues((prev) => ({ ...prev, [filter.id]: value }));\n onFilterChange?.(filter.id, value);\n }}\n aria-label={filter.label || labels.searchPlaceholder}\n className=\"h-9 w-48 pl-8 text-sm\"\n />\n <span\n className=\"text-text-tertiary absolute top-1/2 left-2.5 -translate-y-1/2\"\n aria-hidden=\"true\"\n >\n <Search className=\"size-4\" />\n </span>\n </div>\n );\n }\n\n // ── Select ──\n if (filter.type === \"select\" && filter.options) {\n return (\n <SelectRoot\n key={filter.id}\n value={filter.value as string}\n onValueChange={(value) => onFilterChange?.(filter.id, value)}\n >\n <SelectTrigger\n className=\"h-9 min-w-[120px] text-sm\"\n aria-label={filter.label}\n >\n {filter.options.find((o) => o.value === filter.value)?.label ??\n filter.label}\n </SelectTrigger>\n <SelectPopover>\n {filter.options.map((option) => (\n <SelectItem key={option.id} value={option.value}>\n {option.label}\n </SelectItem>\n ))}\n </SelectPopover>\n </SelectRoot>\n );\n }\n\n // ── Multi-select ──\n if (filter.type === \"multi-select\" && filter.options) {\n const selectedValues = (filter.value as string[]) ?? [];\n const isOpen = multiSelectOpen[filter.id] ?? false;\n\n const handleOpenChange = (open: boolean) => {\n setMultiSelectOpen((prev) => ({ ...prev, [filter.id]: open }));\n if (!open) {\n requestAnimationFrame(() => {\n triggerRefs.current[filter.id]?.focus();\n });\n }\n };\n\n return (\n <PopoverRoot\n key={filter.id}\n open={isOpen}\n onOpenChange={handleOpenChange}\n >\n <PopoverTrigger\n ref={(el) => {\n triggerRefs.current[filter.id] = el;\n }}\n className={`gap-element inline-flex h-9 items-center rounded-lg px-3 text-sm ${OPT_BORDER} bg-surface ${OPT_TEXT_PRIMARY} ${OPT_FOCUS} hover:bg-bg-subtle transition-colors`}\n aria-expanded={isOpen}\n aria-label={`${filter.label} 필터 ${selectedValues.length > 0 ? `(${selectedValues.length}개 선택됨)` : \"\"}`}\n >\n {filter.label}\n {selectedValues.length > 0 && (\n <span\n className=\"bg-accent text-accent-fg inline-flex h-5 w-5 items-center justify-center rounded-full text-xs\"\n aria-hidden=\"true\"\n >\n {selectedValues.length}\n </span>\n )}\n <span\n className={`transition-transform ${isOpen ? \"rotate-180\" : \"\"}`}\n aria-hidden=\"true\"\n >\n ▼\n </span>\n </PopoverTrigger>\n <PopoverContent\n className={`z-50 mt-1 min-w-[180px] rounded-lg ${OPT_BORDER} bg-surface p-2 shadow-lg`}\n >\n <div className=\"gap-element flex flex-col\">\n {filter.options.map((option) => {\n const isChecked = selectedValues.includes(option.value);\n return (\n <label\n key={option.id}\n className={`hover:bg-bg-subtle gap-element flex cursor-pointer items-center rounded-md px-2 py-1.5 text-sm ${OPT_TEXT_PRIMARY}`}\n >\n <Checkbox\n checked={isChecked}\n onChange={() =>\n handleMultiSelectToggle(filter.id, option.value)\n }\n aria-label={option.label}\n />\n {option.label}\n </label>\n );\n })}\n </div>\n </PopoverContent>\n </PopoverRoot>\n );\n }\n\n // ── Date Range ──\n if (filter.type === \"date-range\") {\n return (\n <DateRangePicker\n key={filter.id}\n aria-label={filter.label}\n placeholder={filter.label}\n onChange={(range) => onDateRangeChange?.(filter.id, range)}\n className=\"max-w-[280px]\"\n />\n );\n }\n\n // ── Tag ──\n if (filter.type === \"tag\") {\n const tags = (filter.value as string[]) ?? [];\n return (\n <div\n key={filter.id}\n className=\"flex flex-wrap items-center gap-1.5\"\n >\n {tags.map((tag) => (\n <span\n key={tag}\n className=\"bg-accent-subtle text-accent inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-[11px] font-medium\"\n >\n {tag}\n <button\n type=\"button\"\n onClick={() => handleTagRemove(filter.id, tag)}\n className=\"hover:bg-accent-subtle ml-0.5 rounded-full p-0.5\"\n aria-label={`Remove ${tag}`}\n >\n <svg\n width=\"8\"\n height=\"8\"\n viewBox=\"0 0 10 10\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M2.5 2.5L7.5 7.5M7.5 2.5L2.5 7.5\" />\n </svg>\n </button>\n </span>\n ))}\n <div className=\"flex items-center gap-1\">\n <input\n type=\"text\"\n value={tagInputValues[filter.id] ?? \"\"}\n onChange={(e) =>\n setTagInputValues((prev) => ({\n ...prev,\n [filter.id]: e.target.value,\n }))\n }\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n handleTagAdd(filter.id);\n }\n }}\n placeholder={filter.label}\n className={`border-border bg-surface placeholder:text-text-tertiary focus-visible:ring-ring h-8 w-24 rounded-md border px-2 text-xs outline-none focus-visible:ring-2 ${OPT_TEXT_PRIMARY}`}\n aria-label={filter.label}\n />\n </div>\n </div>\n );\n }\n\n // ── Toggle ──\n if (filter.type === \"toggle\") {\n return (\n <Switch\n key={filter.id}\n label={filter.label}\n size=\"sm\"\n checked={filter.value === true}\n onChange={(checked) => onFilterChange?.(filter.id, checked)}\n />\n );\n }\n\n return null;\n })}\n\n {hasActiveFilters && onClearAll && (\n <Button\n onClick={onClearAll}\n variant=\"ghost\"\n className=\"text-danger-fg hover:bg-danger-subtle h-9 px-3 text-sm\"\n >\n {labels.clearAll}\n </Button>\n )}\n {presetActions}\n </div>\n );\n}\n","\"use client\";\n\nimport { useId, useEffect } from \"react\";\nimport {\n Composite,\n CompositeItem,\n CompositeProvider,\n} from \"../core/composite-zone\";\nimport type { QuickActionDef } from \"../lib/types\";\nimport {\n OPT_FOCUS,\n OPT_TEXT_PRIMARY,\n OPT_TEXT_SECONDARY,\n OPT_BORDER,\n OPT_HOVER_ITEM,\n} from \"../lib/styles\";\nimport { Kbd } from \"../core/kbd\";\n\n/**\n * Parse shortcut string and check if event matches\n * Supports: Ctrl+K, Cmd+Shift+P, Alt+N, etc.\n */\nfunction matchesShortcut(event: KeyboardEvent, shortcut: string): boolean {\n const parts = shortcut.toLowerCase().split(\"+\");\n const key = parts[parts.length - 1];\n const modifiers = parts.slice(0, -1);\n\n const requiresCtrl = modifiers.includes(\"ctrl\") || modifiers.includes(\"cmd\");\n const requiresShift = modifiers.includes(\"shift\");\n const requiresAlt = modifiers.includes(\"alt\") || modifiers.includes(\"opt\");\n const requiresMeta = modifiers.includes(\"meta\");\n\n // Check modifiers (Cmd maps to metaKey on Mac, ctrlKey elsewhere)\n const ctrlOrMeta = event.ctrlKey || event.metaKey;\n if (requiresCtrl && !ctrlOrMeta) return false;\n if (requiresShift && !event.shiftKey) return false;\n if (requiresAlt && !event.altKey) return false;\n if (requiresMeta && !event.metaKey) return false;\n\n // Check key\n return event.key.toLowerCase() === key;\n}\n\n/** Localized labels for the quick actions component. */\nexport interface QuickActionsLabels {\n title?: string;\n}\n\nconst defaultLabels: Required<QuickActionsLabels> = {\n title: \"빠른 작업\",\n};\n\n/** Props for the quick actions component. */\nexport interface QuickActionsProps {\n actions: QuickActionDef[];\n title?: string;\n layout?: \"grid\" | \"list\";\n columns?: 2 | 3 | 4;\n /** Show descriptions in grid layout via tooltip */\n showDescriptionInGrid?: boolean;\n /** Enable keyboard shortcut bindings for actions with shortcuts defined */\n bindShortcuts?: boolean;\n /** Custom labels for i18n support */\n labels?: QuickActionsLabels;\n className?: string;\n}\n\n/** Renders the quick actions component. */\nexport function QuickActions({\n actions,\n title,\n layout = \"grid\",\n columns = 3,\n showDescriptionInGrid = false,\n bindShortcuts = false,\n labels: customLabels,\n className,\n}: QuickActionsProps) {\n const labels = { ...defaultLabels, ...customLabels };\n const displayTitle = title ?? labels.title;\n const titleId = useId();\n\n // Bind keyboard shortcuts when enabled\n useEffect(() => {\n if (!bindShortcuts) return;\n\n const handleKeyDown = (event: KeyboardEvent) => {\n // 입력 필드 포커스 중에는 단축키를 가로채지 않음.\n // 사용자가 텍스트를 타이핑할 때 의도하지 않게 액션이 실행되는 사고 방지.\n const target = event.target;\n if (\n target instanceof HTMLInputElement ||\n target instanceof HTMLTextAreaElement ||\n target instanceof HTMLSelectElement ||\n (target instanceof HTMLElement && target.isContentEditable)\n ) {\n return;\n }\n for (const action of actions) {\n if (!action.shortcut || action.disabled) continue;\n if (matchesShortcut(event, action.shortcut)) {\n event.preventDefault();\n action.onClick?.();\n return;\n }\n }\n };\n\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => document.removeEventListener(\"keydown\", handleKeyDown);\n }, [actions, bindShortcuts]);\n\n const gridCols = {\n 2: \"grid-cols-2\",\n 3: \"grid-cols-3\",\n 4: \"grid-cols-4\",\n };\n\n return (\n <div\n className={className}\n data-opt-id=\"CEM9F\"\n data-opt-slug=\"quick-actions.QuickActions\"\n >\n <div className=\"gap-group flex flex-col\">\n {displayTitle && (\n <h3\n id={titleId}\n className={`text-sm font-semibold ${OPT_TEXT_PRIMARY}`}\n >\n {displayTitle}\n </h3>\n )}\n\n <CompositeProvider focusLoop focusWrap>\n <Composite\n role=\"toolbar\"\n aria-labelledby={displayTitle ? titleId : undefined}\n aria-label={displayTitle ? undefined : labels.title}\n className={\n layout === \"grid\"\n ? `gap-element grid ${gridCols[columns]}`\n : `flex flex-col rounded-lg ${OPT_BORDER} divide-border-subtle bg-surface divide-y`\n }\n >\n {actions.map((action) => (\n <CompositeItem\n key={action.id}\n onClick={action.onClick}\n disabled={action.disabled}\n aria-label={\n action.icon && typeof action.icon === \"string\"\n ? `${action.label}${action.description ? `: ${action.description}` : \"\"}`\n : undefined\n }\n className={\n layout === \"grid\"\n ? `gap-element flex flex-col items-center rounded-lg p-4 ${OPT_BORDER} bg-surface ${OPT_FOCUS} ${OPT_HOVER_ITEM} cursor-pointer transition-colors disabled:cursor-not-allowed disabled:opacity-50`\n : `gap-group flex w-full items-center p-3 ${OPT_FOCUS} ${OPT_HOVER_ITEM} cursor-pointer first:rounded-t-lg last:rounded-b-lg disabled:cursor-not-allowed disabled:opacity-50`\n }\n >\n {action.icon && (\n <span\n className={\n layout === \"grid\"\n ? \"text-2xl\"\n : \"bg-bg-subtle flex h-8 w-8 items-center justify-center rounded-lg text-lg\"\n }\n aria-hidden=\"true\"\n >\n {action.icon}\n </span>\n )}\n\n <div\n className={\n layout === \"grid\" ? \"text-center\" : \"min-w-0 flex-1\"\n }\n >\n <span\n className={`text-sm font-medium ${OPT_TEXT_PRIMARY} ${\n layout === \"grid\" ? \"block\" : \"\"\n }`}\n >\n {action.label}\n </span>\n {action.description &&\n (layout === \"list\" || showDescriptionInGrid) && (\n <p\n className={`text-xs ${OPT_TEXT_SECONDARY} ${\n layout === \"grid\" ? \"mt-1\" : \"mt-0.5\"\n }`}\n >\n {action.description}\n </p>\n )}\n </div>\n\n {action.shortcut && (\n <Kbd className={layout === \"grid\" ? \"mt-1\" : \"\"}>\n {action.shortcut}\n </Kbd>\n )}\n </CompositeItem>\n ))}\n </Composite>\n </CompositeProvider>\n </div>\n </div>\n );\n}\n\nQuickActions.displayName = \"QuickActions\";\n","\"use client\";\n\nimport { useId } from \"react\";\nimport {\n Composite,\n CompositeItem,\n CompositeProvider,\n} from \"../core/composite-zone\";\nimport type { TeamMemberDef } from \"../lib/types\";\nimport {\n OPT_FOCUS,\n OPT_TEXT_PRIMARY,\n OPT_TEXT_SECONDARY,\n OPT_TEXT_TERTIARY,\n OPT_BORDER,\n OPT_DOT_GREEN,\n OPT_DOT_YELLOW,\n OPT_DOT_RED,\n OPT_DOT_GRAY,\n} from \"../lib/styles\";\nimport { Avatar, AvatarGroup } from \"../core/avatar\";\n\n/** Localized labels for the team member list component. */\nexport interface TeamMemberListLabels {\n title?: string;\n emptyMessage?: string;\n onlineCount?: string; // \"{online}/{total} 온라인\" pattern\n moreMembers?: string; // \"{count}명 더 보기\" pattern\n moreCompact?: string; // \"+{count}명\" pattern\n status?: {\n online?: string;\n away?: string;\n busy?: string;\n offline?: string;\n };\n}\n\nconst defaultLabels: Required<TeamMemberListLabels> = {\n title: \"팀원\",\n emptyMessage: \"팀원이 없습니다\",\n onlineCount: \"{online}/{total} 온라인\",\n moreMembers: \"{count}명 더 보기\",\n moreCompact: \"+{count}명\",\n status: {\n online: \"온라인\",\n away: \"자리 비움\",\n busy: \"바쁨\",\n offline: \"오프라인\",\n },\n};\n\n/** Props for the team member list component. */\nexport interface TeamMemberListProps {\n members: TeamMemberDef[];\n title?: string;\n layout?: \"list\" | \"compact\" | \"avatars-only\";\n maxDisplay?: number;\n onMemberClick?: (member: TeamMemberDef) => void;\n /** Called when \"more\" button is clicked */\n onShowMore?: () => void;\n emptyMessage?: string;\n /** Custom labels for i18n support */\n labels?: TeamMemberListLabels;\n className?: string;\n}\n\nconst statusDot: Record<NonNullable<TeamMemberDef[\"status\"]>, string> = {\n online: OPT_DOT_GREEN,\n away: OPT_DOT_YELLOW,\n busy: OPT_DOT_RED,\n offline: OPT_DOT_GRAY,\n};\n\n/** Renders the team member list component. */\nexport function TeamMemberList({\n members,\n title,\n layout = \"list\",\n maxDisplay,\n onMemberClick,\n onShowMore,\n emptyMessage,\n labels: customLabels,\n className,\n}: TeamMemberListProps) {\n const labels = {\n ...defaultLabels,\n ...customLabels,\n status: { ...defaultLabels.status, ...customLabels?.status },\n };\n\n const displayTitle = title ?? labels.title;\n const displayEmptyMessage = emptyMessage ?? labels.emptyMessage;\n const titleId = useId();\n\n const displayMembers = maxDisplay ? members.slice(0, maxDisplay) : members;\n const remainingCount = maxDisplay\n ? Math.max(0, members.length - maxDisplay)\n : 0;\n\n const onlineCount = members.filter((m) => m.status === \"online\").length;\n const onlineText = labels.onlineCount\n .replace(\"{online}\", String(onlineCount))\n .replace(\"{total}\", String(members.length));\n\n if (layout === \"avatars-only\") {\n return (\n <div\n className={className}\n data-opt-id=\"6FTC5\"\n data-opt-slug=\"team-member-list.TeamMemberList\"\n >\n <div className=\"gap-group flex flex-col\">\n {displayTitle && (\n <h3 className={`text-sm font-semibold ${OPT_TEXT_PRIMARY}`}>\n {displayTitle}\n </h3>\n )}\n <AvatarGroup max={maxDisplay ?? 5} size=\"md\">\n {members.map((m) => (\n <Avatar\n key={m.id}\n name={m.name}\n src={m.avatar}\n size=\"md\"\n onClick={onMemberClick ? () => onMemberClick(m) : undefined}\n className={onMemberClick ? \"cursor-pointer\" : \"\"}\n />\n ))}\n </AvatarGroup>\n </div>\n </div>\n );\n }\n\n if (layout === \"compact\") {\n return (\n <div\n className={className}\n data-opt-id=\"6FTC5\"\n data-opt-slug=\"team-member-list.TeamMemberList\"\n >\n <div className=\"gap-group flex flex-col\">\n {displayTitle && (\n <h3 className={`text-sm font-semibold ${OPT_TEXT_PRIMARY}`}>\n {displayTitle}\n </h3>\n )}\n <CompositeProvider focusLoop focusWrap>\n <Composite\n className=\"gap-element flex flex-wrap\"\n role=\"list\"\n aria-label={displayTitle}\n >\n {displayMembers.map((member) => (\n <CompositeItem\n key={member.id}\n role=\"listitem\"\n onClick={() => onMemberClick?.(member)}\n className={`gap-element inline-flex items-center rounded-full py-1 pr-3 pl-1 ${OPT_BORDER} bg-surface ${OPT_FOCUS} hover:bg-bg-subtle data-[active-item]:bg-accent-subtle transition-colors`}\n >\n <div className=\"relative\">\n <Avatar name={member.name} src={member.avatar} size=\"xs\" />\n {member.status && (\n <span\n className={`absolute -right-0.5 -bottom-0.5 ${statusDot[member.status]} ring-surface ring-2`}\n aria-label={labels.status[member.status]}\n />\n )}\n </div>\n <span className={`text-sm ${OPT_TEXT_PRIMARY}`}>\n {member.name}\n </span>\n </CompositeItem>\n ))}\n {remainingCount > 0 && (\n <CompositeItem\n render={<button type=\"button\" />}\n onClick={onShowMore}\n className={`inline-flex items-center rounded-full px-3 py-1 text-sm ${OPT_BORDER} ${OPT_TEXT_TERTIARY} ${OPT_FOCUS} hover:text-accent data-[active-item]:bg-accent-subtle transition-colors`}\n aria-label={`${remainingCount}명의 팀원 더 보기`}\n >\n {labels.moreCompact.replace(\n \"{count}\",\n String(remainingCount),\n )}\n </CompositeItem>\n )}\n </Composite>\n </CompositeProvider>\n </div>\n </div>\n );\n }\n\n // Default: list layout\n return (\n <div\n className={className}\n data-opt-id=\"6FTC5\"\n data-opt-slug=\"team-member-list.TeamMemberList\"\n >\n <div className=\"gap-group flex flex-col\">\n {displayTitle && (\n <div className=\"flex items-center justify-between\">\n <h3\n id={titleId}\n className={`text-sm font-semibold ${OPT_TEXT_PRIMARY}`}\n >\n {displayTitle}\n </h3>\n <span className={`text-xs ${OPT_TEXT_TERTIARY}`}>{onlineText}</span>\n </div>\n )}\n\n {members.length === 0 ? (\n <div\n role=\"status\"\n className={`py-8 text-center text-sm ${OPT_TEXT_SECONDARY}`}\n >\n {displayEmptyMessage}\n </div>\n ) : (\n <CompositeProvider focusLoop orientation=\"vertical\">\n <Composite\n role=\"list\"\n aria-labelledby={displayTitle ? titleId : undefined}\n aria-label={displayTitle ? undefined : labels.title}\n className={`rounded-lg ${OPT_BORDER} divide-border-subtle bg-surface divide-y`}\n >\n {displayMembers.map((member) => (\n <CompositeItem\n key={member.id}\n role=\"listitem\"\n onClick={() => onMemberClick?.(member)}\n className={`group gap-group flex w-full items-center p-3 ${OPT_FOCUS} data-[active-item]:bg-accent-subtle ${\n onMemberClick ? \"cursor-pointer\" : \"\"\n }`}\n >\n <div className=\"relative\">\n <Avatar name={member.name} src={member.avatar} size=\"md\" />\n {member.status && (\n <span\n className={`absolute right-0 bottom-0 ${statusDot[member.status]} ring-surface ring-2`}\n aria-label={labels.status[member.status]}\n />\n )}\n </div>\n\n <div className=\"min-w-0 flex-1\">\n <div className=\"gap-element flex items-center\">\n <span\n className={`text-sm font-medium ${OPT_TEXT_PRIMARY}`}\n >\n {member.name}\n </span>\n {member.status && (\n <span className={`text-xs ${OPT_TEXT_TERTIARY}`}>\n · {labels.status[member.status]}\n </span>\n )}\n </div>\n <div className={`text-xs ${OPT_TEXT_SECONDARY}`}>\n {member.role && <span>{member.role}</span>}\n {member.role && member.email && <span> · </span>}\n <span>{member.email}</span>\n </div>\n </div>\n </CompositeItem>\n ))}\n\n {remainingCount > 0 && (\n <button\n type=\"button\"\n onClick={onShowMore}\n className={`w-full p-3 text-center text-xs ${OPT_TEXT_TERTIARY} ${OPT_FOCUS} hover:text-accent cursor-pointer transition-colors`}\n aria-label={`${remainingCount}명의 팀원 더 보기`}\n >\n {labels.moreMembers.replace(\n \"{count}\",\n String(remainingCount),\n )}\n </button>\n )}\n </Composite>\n </CompositeProvider>\n )}\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { useState, type ReactNode } from \"react\";\nimport {\n FormRoot,\n FormInput,\n FormSwitch,\n FormLabel,\n FormError,\n FormSubmit,\n useFormStore,\n} from \"../core/form\";\n\n/** Localized labels for the auth form component. */\nexport interface AuthFormLabels {\n loginTitle?: string;\n signupTitle?: string;\n emailLabel?: string;\n passwordLabel?: string;\n confirmPasswordLabel?: string;\n rememberMeLabel?: string;\n loginButton?: string;\n signupButton?: string;\n emailRequired?: string;\n emailInvalid?: string;\n passwordRequired?: string;\n passwordMinLength?: string;\n passwordMismatch?: string;\n}\n\n/** Props for the auth form component. */\nexport interface AuthFormProps {\n defaultMode?: \"login\" | \"signup\";\n mode?: \"login\" | \"signup\";\n onModeChange?: (mode: \"login\" | \"signup\") => void;\n showRememberMe?: boolean;\n minPasswordLength?: number;\n onSubmit?: (values: {\n email: string;\n password: string;\n confirmPassword?: string;\n rememberMe?: boolean;\n mode: \"login\" | \"signup\";\n }) => void;\n /** Custom fields rendered between email and password (e.g., name fields for signup) */\n renderExtraFields?: (mode: \"login\" | \"signup\") => ReactNode;\n labels?: AuthFormLabels;\n ariaLabel?: string;\n}\n\ntype AuthFormValues = {\n email: string;\n password: string;\n confirmPassword: string;\n rememberMe: boolean;\n};\n\n/** Renders the auth form component. */\nexport function AuthForm({\n defaultMode = \"login\",\n mode: controlledMode,\n onModeChange,\n showRememberMe = true,\n minPasswordLength = 8,\n onSubmit,\n renderExtraFields,\n labels = {},\n ariaLabel,\n}: AuthFormProps) {\n const [uncontrolledMode, setUncontrolledMode] = useState(defaultMode);\n const [submitted, setSubmitted] = useState(false);\n\n const mode = controlledMode ?? uncontrolledMode;\n\n const handleModeChange = (newMode: \"login\" | \"signup\") => {\n if (controlledMode === undefined) {\n setUncontrolledMode(newMode);\n }\n onModeChange?.(newMode);\n };\n\n const form = useFormStore<AuthFormValues>({\n defaultValues: {\n email: \"\",\n password: \"\",\n confirmPassword: \"\",\n rememberMe: false,\n },\n validate: (values) => {\n const errors: Record<string, string> = {};\n const email = values.email;\n if (!email) {\n errors.email = labels.emailRequired ?? \"이메일을 입력해주세요.\";\n } else if (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email)) {\n errors.email = labels.emailInvalid ?? \"유효한 이메일을 입력해주세요.\";\n }\n\n const password = values.password;\n if (!password) {\n errors.password = labels.passwordRequired ?? \"비밀번호를 입력해주세요.\";\n } else if (password.length < minPasswordLength) {\n errors.password =\n labels.passwordMinLength ??\n `비밀번호는 ${minPasswordLength}자 이상이어야 합니다.`;\n }\n\n if (mode === \"signup\") {\n const confirm = values.confirmPassword;\n if (password !== confirm) {\n errors.confirmPassword =\n labels.passwordMismatch ?? \"비밀번호가 일치하지 않습니다.\";\n }\n }\n\n return errors;\n },\n onSubmit: (values) => {\n setSubmitted(true);\n setTimeout(() => setSubmitted(false), 3000);\n if (onSubmit) {\n onSubmit({\n email: values.email,\n password: values.password,\n ...(mode === \"signup\"\n ? { confirmPassword: values.confirmPassword }\n : {}),\n ...(mode === \"login\" ? { rememberMe: values.rememberMe } : {}),\n mode,\n });\n }\n },\n });\n\n const loginTitle = labels.loginTitle ?? \"로그인\";\n const signupTitle = labels.signupTitle ?? \"회원가입\";\n\n return (\n <div\n className=\"gap-section flex flex-col\"\n data-opt-id=\"Z415Y\"\n data-opt-slug=\"form-login.AuthForm\"\n >\n {/* 모드 토글 */}\n <div className=\"border-border flex rounded-lg border\">\n <button\n type=\"button\"\n className={`flex-1 rounded-l-lg px-4 py-2 text-sm font-medium transition-colors ${\n mode === \"login\"\n ? \"bg-accent text-accent-fg\"\n : \"text-text-secondary hover:bg-bg-subtle\"\n }`}\n onClick={() => handleModeChange(\"login\")}\n >\n {loginTitle}\n </button>\n <button\n type=\"button\"\n className={`flex-1 rounded-r-lg px-4 py-2 text-sm font-medium transition-colors ${\n mode === \"signup\"\n ? \"bg-accent text-accent-fg\"\n : \"text-text-secondary hover:bg-bg-subtle\"\n }`}\n onClick={() => handleModeChange(\"signup\")}\n >\n {signupTitle}\n </button>\n </div>\n\n <FormRoot\n store={form}\n aria-label={\n ariaLabel ?? (mode === \"login\" ? \"로그인 폼\" : \"회원가입 폼\")\n }\n >\n <div className=\"gap-element flex flex-col\">\n <FormLabel name=\"email\">{labels.emailLabel ?? \"이메일\"}</FormLabel>\n <FormInput\n name=\"email\"\n type=\"email\"\n placeholder=\"email@example.com\"\n />\n <FormError name=\"email\" />\n </div>\n\n {renderExtraFields?.(mode)}\n\n <div className=\"gap-element flex flex-col\">\n <FormLabel name=\"password\">\n {labels.passwordLabel ?? \"비밀번호\"}\n </FormLabel>\n <FormInput\n name=\"password\"\n type=\"password\"\n placeholder={`${minPasswordLength}자 이상 입력하세요`}\n />\n <FormError name=\"password\" />\n </div>\n\n {mode === \"signup\" && (\n <div className=\"gap-element flex flex-col\">\n <FormLabel name=\"confirmPassword\">\n {labels.confirmPasswordLabel ?? \"비밀번호 확인\"}\n </FormLabel>\n <FormInput\n name=\"confirmPassword\"\n type=\"password\"\n placeholder=\"비밀번호를 다시 입력하세요\"\n />\n <FormError name=\"confirmPassword\" />\n </div>\n )}\n\n {mode === \"login\" && showRememberMe && (\n <label className=\"gap-group flex items-center\">\n <FormSwitch name=\"rememberMe\" size=\"sm\" />\n <span className=\"text-text-secondary text-sm\">\n {labels.rememberMeLabel ?? \"로그인 상태 유지\"}\n </span>\n </label>\n )}\n\n <FormSubmit disabled={form.isSubmitting()}>\n {mode === \"login\"\n ? (labels.loginButton ?? \"로그인\")\n : (labels.signupButton ?? \"회원가입\")}\n </FormSubmit>\n </FormRoot>\n\n {submitted && (\n <div className=\"border-success bg-success-subtle text-success-fg rounded-lg border p-3 text-sm\">\n {mode === \"login\" ? \"로그인 성공!\" : \"회원가입 완료!\"}\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport {\n FormRoot,\n FormInput,\n FormLabel,\n FormError,\n FormSubmit,\n useFormStore,\n} from \"../core/form\";\n\n/** Localized labels for the dynamic field form component. */\nexport interface DynamicFieldFormLabels {\n addButton?: string;\n submitButton?: string;\n removeAriaLabel?: string;\n itemLabel?: string;\n itemPlaceholder?: string;\n itemRequired?: string;\n}\n\n/** Props for the dynamic field form component. */\nexport interface DynamicFieldFormProps {\n initialCount?: number;\n minFields?: number;\n maxFields?: number;\n fieldType?: \"text\" | \"email\" | \"url\" | \"number\";\n validateField?: (value: string, index: number) => string | undefined;\n onSubmit?: (values: string[]) => void;\n onFieldsChange?: (count: number) => void;\n labels?: DynamicFieldFormLabels;\n ariaLabel?: string;\n}\n\ninterface DynamicField {\n id: number;\n}\n\ntype DynamicFieldValues = { items: string[] };\n\n/** Renders the dynamic field form component. */\nexport function DynamicFieldForm({\n initialCount = 1,\n minFields = 1,\n maxFields,\n fieldType = \"text\",\n validateField,\n onSubmit,\n onFieldsChange,\n labels = {},\n ariaLabel,\n}: DynamicFieldFormProps) {\n const initialFields: DynamicField[] = Array.from(\n { length: initialCount },\n (_, i) => ({ id: i + 1 }),\n );\n\n const [fields, setFields] = useState<DynamicField[]>(initialFields);\n const [nextId, setNextId] = useState(initialCount + 1);\n const [submitted, setSubmitted] = useState(false);\n const [submittedValues, setSubmittedValues] = useState<string[]>([]);\n\n const form = useFormStore<DynamicFieldValues>({\n defaultValues: {\n items: Array.from({ length: initialCount }, () => \"\"),\n },\n validate: (values) => {\n const errors: Record<string, string> = {};\n for (let i = 0; i < values.items.length; i++) {\n const fieldName = `items.${i}`;\n const value = values.items[i] ?? \"\";\n if (validateField) {\n const error = validateField(value, i);\n if (error) {\n errors[fieldName] = error;\n continue;\n }\n }\n if (!value?.trim()) {\n errors[fieldName] = labels.itemRequired ?? \"항목을 입력해주세요.\";\n }\n }\n return errors;\n },\n onSubmit: (values) => {\n const items = [...values.items];\n setSubmittedValues(items);\n setSubmitted(true);\n setTimeout(() => setSubmitted(false), 3000);\n onSubmit?.(items);\n },\n });\n\n const addField = () => {\n if (maxFields !== undefined && fields.length >= maxFields) return;\n const items = form.getValue(\"items\");\n const newFields = [...fields, { id: nextId }];\n setFields(newFields);\n form.setValue(\"items\", [...items, \"\"]);\n setNextId(nextId + 1);\n onFieldsChange?.(newFields.length);\n };\n\n const removeField = (id: number) => {\n if (fields.length <= minFields) return;\n const removeIndex = fields.findIndex((field) => field.id === id);\n if (removeIndex < 0) return;\n\n const newFields = fields.filter((field) => field.id !== id);\n const nextItems = [...form.getValue(\"items\")];\n nextItems.splice(removeIndex, 1);\n\n setFields(newFields);\n form.setValue(\"items\", nextItems);\n onFieldsChange?.(newFields.length);\n };\n\n const itemLabel = labels.itemLabel ?? \"항목 {index}\";\n const itemPlaceholder = labels.itemPlaceholder ?? \"항목 {index}을 입력하세요\";\n const removeAriaLabel = labels.removeAriaLabel ?? \"항목 {index} 삭제\";\n\n const formatTemplate = (template: string, index: number) =>\n template.replace(\"{index}\", String(index));\n\n return (\n <div\n className=\"gap-group flex flex-col\"\n data-opt-id=\"8RYG7\"\n data-opt-slug=\"form-dynamic.DynamicFieldForm\"\n >\n <FormRoot store={form} aria-label={ariaLabel ?? \"동적 필드 폼\"}>\n <div className=\"gap-group flex flex-col\">\n {fields.map((field, displayIndex) => {\n const fieldName = `items.${displayIndex}`;\n return (\n <div key={field.id} className=\"gap-element flex flex-col\">\n <FormLabel name={fieldName}>\n {formatTemplate(itemLabel, displayIndex + 1)}\n </FormLabel>\n <div className=\"gap-element flex\">\n <div className=\"flex-1\">\n <FormInput\n name={fieldName}\n type={fieldType}\n placeholder={formatTemplate(\n itemPlaceholder,\n displayIndex + 1,\n )}\n />\n </div>\n <button\n type=\"button\"\n onClick={() => removeField(field.id)}\n disabled={fields.length <= minFields}\n className=\"border-border text-text-tertiary hover:border-danger hover:bg-danger-subtle hover:text-danger-fg inline-flex h-10 w-10 shrink-0 items-center justify-center rounded-lg border transition-colors disabled:cursor-not-allowed disabled:opacity-30\"\n aria-label={formatTemplate(\n removeAriaLabel,\n displayIndex + 1,\n )}\n >\n ✕\n </button>\n </div>\n <FormError name={fieldName} />\n </div>\n );\n })}\n </div>\n\n <button\n type=\"button\"\n onClick={addField}\n disabled={maxFields !== undefined && fields.length >= maxFields}\n className=\"border-border text-text-secondary hover:border-accent hover:bg-accent-subtle hover:text-accent w-full rounded-lg border border-dashed px-4 py-2.5 text-sm font-medium transition-colors disabled:cursor-not-allowed disabled:opacity-30\"\n >\n {labels.addButton ?? \"+ 항목 추가\"}\n </button>\n\n <FormSubmit disabled={form.isSubmitting()}>\n {labels.submitButton ?? \"제출\"}\n </FormSubmit>\n </FormRoot>\n\n {submitted && submittedValues.length > 0 && (\n <div className=\"border-success bg-success-subtle rounded-lg border p-3\">\n <p className=\"text-success-fg mb-2 text-sm font-medium\">제출된 값:</p>\n <ul className=\"text-success-fg gap-element flex flex-col text-sm\">\n {submittedValues.map((val, i) => (\n <li key={i}>\n {formatTemplate(itemLabel, i + 1)}: <strong>{val}</strong>\n </li>\n ))}\n </ul>\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport { useState, type ReactNode } from \"react\";\nimport {\n FormRoot,\n FormInput,\n FormTextarea,\n FormLabel,\n FormError,\n FormSubmit,\n useFormStore,\n} from \"../core/form\";\n\n/** Localized labels for the file upload form component. */\nexport interface FileUploadFormLabels {\n titleLabel?: string;\n titlePlaceholder?: string;\n titleRequired?: string;\n descriptionLabel?: string;\n descriptionPlaceholder?: string;\n fileLabel?: string;\n submitButton?: string;\n successMessage?: string;\n columnMappingLabel?: string;\n}\n\n/** Props for the file upload form component. */\nexport interface FileUploadFormProps {\n accept?: string;\n showPreview?: boolean;\n showFileInfo?: boolean;\n showDescription?: boolean;\n descriptionRows?: number;\n titleRequired?: boolean;\n maxFileSize?: number;\n onSubmit?: (values: {\n title: string;\n description: string;\n file: File | null;\n }) => void;\n onFileChange?: (file: File | null) => void;\n /** Called after file is selected to allow parsing/preview. Return ReactNode to show column mapping UI. */\n onPreview?: (file: File) => void;\n /** Custom column mapping UI rendered after file selection */\n columnMapping?: ReactNode;\n labels?: FileUploadFormLabels;\n ariaLabel?: string;\n}\n\ntype FormValues = { title: string; description: string };\n\nfunction formatFileSize(bytes: number) {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\n/** Renders the file upload form component. */\nexport function FileUploadForm({\n accept = \"image/*,.pdf,.doc,.docx\",\n showPreview = true,\n showFileInfo = true,\n showDescription = true,\n descriptionRows = 3,\n titleRequired = true,\n maxFileSize,\n onSubmit,\n onFileChange,\n onPreview,\n columnMapping,\n labels = {},\n ariaLabel,\n}: FileUploadFormProps) {\n const [selectedFile, setSelectedFile] = useState<File | null>(null);\n const [preview, setPreview] = useState<string | null>(null);\n const [submitted, setSubmitted] = useState(false);\n const [fileSizeError, setFileSizeError] = useState<string | null>(null);\n\n const form = useFormStore<FormValues>({\n defaultValues: {\n title: \"\",\n description: \"\",\n },\n validate: (values) => {\n const errors: Record<string, string> = {};\n if (titleRequired) {\n if (!values.title?.trim()) {\n errors.title = labels.titleRequired ?? \"제목을 입력해주세요.\";\n }\n }\n return errors;\n },\n onSubmit: (values) => {\n setSubmitted(true);\n setTimeout(() => setSubmitted(false), 3000);\n if (onSubmit) {\n onSubmit({\n title: values.title,\n description: values.description,\n file: selectedFile,\n });\n }\n },\n });\n\n const handleFileChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0] ?? null;\n setFileSizeError(null);\n\n if (file) {\n if (maxFileSize && file.size > maxFileSize) {\n setFileSizeError(\n `파일 크기가 ${formatFileSize(maxFileSize)}를 초과합니다.`,\n );\n setSelectedFile(null);\n setPreview(null);\n onFileChange?.(null);\n return;\n }\n setSelectedFile(file);\n onPreview?.(file);\n if (file.type.startsWith(\"image/\")) {\n const reader = new FileReader();\n reader.onloadend = () => setPreview(reader.result as string);\n reader.readAsDataURL(file);\n } else {\n setPreview(null);\n }\n } else {\n setSelectedFile(null);\n setPreview(null);\n }\n onFileChange?.(file);\n };\n\n return (\n <div\n className=\"gap-group flex flex-col\"\n data-opt-id=\"4E3MD\"\n data-opt-slug=\"form-upload.FileUploadForm\"\n >\n <FormRoot store={form} aria-label={ariaLabel ?? \"파일 업로드 폼\"}>\n <div className=\"gap-element flex flex-col\">\n <FormLabel name=\"title\">{labels.titleLabel ?? \"제목\"}</FormLabel>\n <FormInput\n name=\"title\"\n placeholder={labels.titlePlaceholder ?? \"파일 제목을 입력하세요\"}\n />\n <FormError name=\"title\" />\n </div>\n\n {showDescription && (\n <div className=\"gap-element flex flex-col\">\n <FormLabel name=\"description\">\n {labels.descriptionLabel ?? \"설명\"}\n </FormLabel>\n <FormTextarea\n name=\"description\"\n placeholder={\n labels.descriptionPlaceholder ?? \"파일에 대한 설명을 입력하세요\"\n }\n rows={descriptionRows}\n resize=\"none\"\n />\n </div>\n )}\n\n <div className=\"gap-element flex flex-col\">\n <label className=\"text-text-primary text-sm font-medium\">\n {labels.fileLabel ?? \"파일 선택\"}\n </label>\n <div className=\"relative\">\n <input\n type=\"file\"\n onChange={handleFileChange}\n accept={accept}\n className=\"border-border bg-surface text-text-primary file:bg-accent-subtle file:text-accent hover:file:bg-accent-subtle block w-full cursor-pointer rounded-lg border px-4 py-2.5 text-sm file:mr-4 file:cursor-pointer file:rounded-md file:border-0 file:px-3 file:py-1 file:text-sm file:font-medium\"\n />\n </div>\n {fileSizeError && (\n <p className=\"text-danger-fg text-xs\">{fileSizeError}</p>\n )}\n </div>\n\n {selectedFile && showFileInfo && (\n <div className=\"border-border-subtle rounded-lg border p-4\">\n <div className=\"gap-element flex flex-col\">\n <div className=\"flex items-center justify-between text-sm\">\n <span className=\"text-text-primary font-medium\">\n {selectedFile.name}\n </span>\n <span className=\"text-text-tertiary\">\n {formatFileSize(selectedFile.size)}\n </span>\n </div>\n <div className=\"text-text-tertiary text-xs\">\n 타입: {selectedFile.type || \"알 수 없음\"}\n </div>\n {showPreview && preview && (\n <div className=\"border-border-subtle overflow-hidden rounded-lg border\">\n <img\n src={preview}\n alt=\"미리보기\"\n className=\"max-h-48 w-full object-contain\"\n />\n </div>\n )}\n </div>\n </div>\n )}\n\n {columnMapping && selectedFile && (\n <div\n className=\"gap-element flex flex-col\"\n aria-label={labels.columnMappingLabel ?? \"Column mapping\"}\n >\n {columnMapping}\n </div>\n )}\n\n <FormSubmit disabled={form.isSubmitting()}>\n {labels.submitButton ?? \"업로드\"}\n </FormSubmit>\n </FormRoot>\n\n {submitted && (\n <div className=\"border-success bg-success-subtle text-success-fg rounded-lg border p-3 text-sm\">\n {labels.successMessage ?? \"업로드가 완료되었습니다!\"}\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport type { FormFieldDef } from \"../lib/types\";\nimport {\n FormRoot,\n FormInput,\n FormTextarea,\n FormSelect,\n FormSelectPopover,\n FormSelectItem,\n FormSwitch,\n FormLabel,\n FormError,\n FormSubmit,\n FormCheckbox,\n FormRadioGroup,\n FormRadio,\n useFormStore,\n} from \"../core/form\";\n\n/** Defines the wizard step shape. */\nexport interface WizardStepDef {\n id: string;\n label: string;\n fields: string[];\n}\n\n/** Localized labels for the wizard form component. */\nexport interface WizardFormLabels {\n stepsLabel?: string;\n backButton?: string;\n nextButton?: string;\n submitButton?: string;\n successMessage?: string;\n resetLink?: string;\n reviewTitle?: string;\n emptyValue?: string;\n}\n\n/** Props for the wizard form component. */\nexport interface WizardFormProps {\n fields: FormFieldDef[];\n steps: WizardStepDef[];\n showReview?: boolean;\n onSubmit?: (values: Record<string, unknown>) => void;\n onStepChange?: (stepIndex: number) => void;\n resetOnSuccess?: boolean;\n labels?: WizardFormLabels;\n ariaLabel?: string;\n}\n\n/** Renders the wizard form component. */\nexport function WizardForm({\n fields,\n steps,\n showReview = true,\n onSubmit,\n onStepChange,\n resetOnSuccess = false,\n labels = {},\n ariaLabel,\n}: WizardFormProps) {\n const [currentStep, setCurrentStep] = useState(0);\n const [submitted, setSubmitted] = useState(false);\n\n const totalSteps = showReview ? steps.length + 1 : steps.length;\n const isReviewStep = showReview && currentStep === steps.length;\n const isLastStep = currentStep === totalSteps - 1;\n\n const defaultValues: Record<string, unknown> = {};\n for (const field of fields) {\n defaultValues[field.name] =\n field.defaultValue ??\n (field.type === \"switch\" || field.type === \"checkbox\" ? false : \"\");\n }\n\n const form = useFormStore({\n defaultValues,\n validate: (values) => {\n if (isReviewStep) return;\n const currentStepDef = steps[currentStep];\n if (!currentStepDef) return;\n const currentFieldNames = new Set(currentStepDef.fields);\n const errors: Record<string, string> = {};\n for (const field of fields) {\n if (!currentFieldNames.has(field.name)) continue;\n if (field.required) {\n const value = values[field.name];\n if (!value || (typeof value === \"string\" && !value.trim())) {\n errors[field.name] =\n field.requiredMessage ?? `${field.label}을(를) 입력해주세요.`;\n }\n }\n if (field.validate) {\n const value = values[field.name];\n const error = field.validate(value);\n if (error) {\n errors[field.name] = error;\n }\n }\n }\n return errors;\n },\n onSubmit: (values) => {\n if (!isLastStep) {\n const next = currentStep + 1;\n setCurrentStep(next);\n onStepChange?.(next);\n } else {\n setSubmitted(true);\n onSubmit?.(values);\n if (resetOnSuccess) {\n setTimeout(() => {\n setCurrentStep(0);\n setSubmitted(false);\n form.reset();\n }, 3000);\n }\n }\n },\n });\n\n const handleBack = () => {\n if (currentStep > 0) {\n const prev = currentStep - 1;\n setCurrentStep(prev);\n onStepChange?.(prev);\n }\n };\n\n const handleReset = () => {\n setCurrentStep(0);\n setSubmitted(false);\n form.reset();\n };\n\n const renderField = (field: FormFieldDef) => {\n if (field.type === \"radio\") {\n return (\n <fieldset key={field.name} className=\"gap-element flex flex-col\">\n <legend className=\"text-text-primary text-sm font-medium\">\n {field.label}\n </legend>\n <FormRadioGroup>\n <div className=\"gap-group flex\">\n {field.options?.map((option) => (\n <label\n key={option.value}\n className=\"text-text-primary gap-element flex items-center text-sm\"\n >\n <FormRadio name={field.name} value={option.value} />\n {option.label}\n </label>\n ))}\n </div>\n </FormRadioGroup>\n <FormError name={field.name} />\n </fieldset>\n );\n }\n\n if (field.type === \"checkbox\") {\n return (\n <div key={field.name} className=\"gap-element flex flex-col\">\n <label className=\"text-text-primary gap-element flex items-center text-sm\">\n <FormCheckbox name={field.name} />\n <span>{field.label}</span>\n </label>\n <FormError name={field.name} />\n </div>\n );\n }\n\n if (field.type === \"textarea\") {\n return (\n <div key={field.name} className=\"gap-element flex flex-col\">\n <FormLabel name={field.name}>{field.label}</FormLabel>\n <FormTextarea\n name={field.name}\n placeholder={field.placeholder}\n rows={field.rows ?? 4}\n resize={field.resize ?? \"vertical\"}\n />\n <FormError name={field.name} />\n </div>\n );\n }\n\n if (field.type === \"select\") {\n return (\n <div key={field.name} className=\"gap-element flex flex-col\">\n <FormLabel name={field.name}>{field.label}</FormLabel>\n <FormSelect name={field.name} placeholder={field.placeholder}>\n <FormSelectPopover>\n {field.options?.map((option) => (\n <FormSelectItem key={option.value} value={option.value}>\n {option.label}\n </FormSelectItem>\n ))}\n </FormSelectPopover>\n </FormSelect>\n <FormError name={field.name} />\n </div>\n );\n }\n\n if (field.type === \"switch\") {\n return (\n <label key={field.name} className=\"gap-group flex items-center\">\n <FormSwitch name={field.name} />\n <div className=\"flex flex-col\">\n <span className=\"text-text-primary text-sm font-medium\">\n {field.label}\n </span>\n {field.description && (\n <span className=\"text-text-secondary text-sm\">\n {field.description}\n </span>\n )}\n </div>\n </label>\n );\n }\n\n return (\n <div key={field.name} className=\"gap-element flex flex-col\">\n <FormLabel name={field.name}>{field.label}</FormLabel>\n <FormInput\n name={field.name}\n type={field.type ?? \"text\"}\n placeholder={field.placeholder}\n />\n <FormError name={field.name} />\n </div>\n );\n };\n\n const stepLabels = [\n ...steps.map((s) => s.label),\n ...(showReview ? [labels.reviewTitle ?? \"확인\"] : []),\n ];\n\n const currentStepFields = !isReviewStep\n ? (() => {\n const stepDef = steps[currentStep];\n if (!stepDef) return [];\n const fieldNameSet = new Set(stepDef.fields);\n return fields.filter((f) => fieldNameSet.has(f.name));\n })()\n : [];\n\n return (\n <div\n className=\"gap-section flex flex-col\"\n data-opt-id=\"SFY8G\"\n data-opt-slug=\"form-wizard.WizardForm\"\n >\n {/* 진행 표시기 */}\n <ol\n className=\"gap-element flex list-none items-center p-0\"\n aria-label={labels.stepsLabel ?? \"다단계 폼 단계\"}\n >\n {stepLabels.map((label, i) => (\n <li\n key={label}\n className=\"gap-element flex flex-1 items-center\"\n aria-current={i === currentStep ? \"step\" : undefined}\n >\n <div\n aria-hidden=\"true\"\n className={`flex h-8 w-8 shrink-0 items-center justify-center rounded-full text-xs font-medium ${\n i <= currentStep\n ? \"bg-accent text-accent-fg\"\n : \"bg-bg-subtle text-text-secondary\"\n }`}\n >\n {i + 1}\n </div>\n <span\n className={`hidden text-sm sm:inline ${\n i <= currentStep\n ? \"text-text-primary font-medium\"\n : \"text-text-secondary\"\n }`}\n >\n {label}\n </span>\n {i < stepLabels.length - 1 && (\n <div\n aria-hidden=\"true\"\n className={`h-px flex-1 ${\n i < currentStep ? \"bg-accent\" : \"bg-border-subtle\"\n }`}\n />\n )}\n </li>\n ))}\n </ol>\n\n <FormRoot store={form} aria-label={ariaLabel ?? \"다단계 폼\"}>\n {/* 입력 단계 */}\n {!isReviewStep && (\n <div className=\"gap-group flex flex-col\">\n {currentStepFields.map(renderField)}\n </div>\n )}\n\n {/* 리뷰 단계 */}\n {isReviewStep && !submitted && (\n <div className=\"gap-group flex flex-col\">\n <div className=\"border-border rounded-lg border p-4\">\n <h4 className=\"text-text-primary mb-3 text-sm font-semibold\">\n {labels.reviewTitle ?? \"입력 내용 확인\"}\n </h4>\n <dl className=\"gap-element flex flex-col text-sm\">\n {fields.map((field) => {\n const val = form.getValue(field.name);\n const display =\n val === true\n ? \"Yes\"\n : val === false\n ? \"No\"\n : String(val || labels.emptyValue || \"—\");\n return (\n <div key={field.name} className=\"gap-group flex\">\n <dt className=\"text-text-secondary w-20 shrink-0 font-medium\">\n {field.label}\n </dt>\n <dd className=\"text-text-primary\">{display}</dd>\n </div>\n );\n })}\n </dl>\n </div>\n </div>\n )}\n\n {/* 네비게이션 */}\n {!submitted && (\n <div className=\"flex justify-between pt-2\">\n {currentStep > 0 ? (\n <button\n type=\"button\"\n onClick={handleBack}\n className=\"border-border text-text-primary hover:bg-bg-subtle rounded-lg border px-4 py-2 text-sm font-medium\"\n >\n {labels.backButton ?? \"이전\"}\n </button>\n ) : (\n <div />\n )}\n <FormSubmit>\n {isLastStep\n ? (labels.submitButton ?? \"제출\")\n : (labels.nextButton ?? \"다음\")}\n </FormSubmit>\n </div>\n )}\n </FormRoot>\n\n {submitted && (\n <div className=\"border-success bg-success-subtle rounded-lg border p-4 text-center\">\n <p className=\"text-success-fg text-sm font-medium\">\n {labels.successMessage ?? \"제출이 완료되었습니다!\"}\n </p>\n <button\n type=\"button\"\n onClick={handleReset}\n className=\"text-accent mt-2 text-sm underline hover:no-underline\"\n >\n {labels.resetLink ?? \"다시 작성하기\"}\n </button>\n </div>\n )}\n </div>\n );\n}\n","import * as React from \"react\";\nimport { cn } from \"../lib/cn\";\nimport { getIconRegistryEntry } from \"../lib/icon-registry\";\n\n/** Popular icon names for picker UIs */\nexport const POPULAR_ICONS = [\n \"click\",\n \"eye\",\n \"search\",\n \"user\",\n \"shopping-cart\",\n \"credit-card\",\n \"heart\",\n \"star\",\n \"bell\",\n \"download\",\n \"upload\",\n \"share\",\n \"mail\",\n \"settings\",\n \"globe\",\n \"zap\",\n \"trending-up\",\n \"bar-chart\",\n \"check-circle\",\n \"x-circle\",\n] as const;\n\n/** Color presets for event icon backgrounds */\nexport const COLOR_PRESETS = [\n \"#3b82f6\",\n \"#8b5cf6\",\n \"#ec4899\",\n \"#ef4444\",\n \"#f59e0b\",\n \"#10b981\",\n \"#06b6d4\",\n \"#6366f1\",\n \"#f97316\",\n \"#14b8a6\",\n] as const;\n\n/** Props for the event icon component. */\nexport interface EventIconProps {\n /** Semantic icon key, legacy icon key, or ReactNode */\n icon: string | React.ReactNode;\n /** Custom icon color; when omitted, theme accent tokens are used */\n color?: string;\n /** Icon size */\n size?: \"sm\" | \"md\" | \"lg\";\n className?: string;\n labels?: EventIconLabels;\n}\n\n/** Localized labels for the event icon component. */\nexport interface EventIconLabels {\n eventLabelPrefix?: string;\n defaultAriaLabel?: string;\n}\n\nconst defaultLabels: Required<EventIconLabels> = {\n eventLabelPrefix: \"Event\",\n defaultAriaLabel: \"Event icon\",\n};\n\nconst SIZE_MAP = {\n sm: { container: \"h-5 w-5\", text: \"text-[10px]\", iconSize: 12 },\n md: { container: \"h-7 w-7\", text: \"text-sm\", iconSize: 16 },\n lg: { container: \"h-9 w-9\", text: \"text-base\", iconSize: 20 },\n};\n\nfunction getEventIconStyle(color?: string): React.CSSProperties | undefined {\n if (!color) {\n return undefined;\n }\n\n return {\n color,\n backgroundColor: `color-mix(in srgb, ${color} 16%, transparent)`,\n };\n}\n\n/** Renders the event icon component. */\nexport function EventIcon({\n icon,\n color,\n size = \"md\",\n className,\n labels: customLabels,\n}: EventIconProps) {\n const labels = { ...defaultLabels, ...customLabels };\n const sizes = SIZE_MAP[size];\n const resolvedColor = color?.trim() ? color : undefined;\n const iconEntry =\n typeof icon === \"string\" ? getIconRegistryEntry(icon) : undefined;\n const iconElement = React.isValidElement<{\n size?: number;\n className?: string;\n \"aria-hidden\"?: boolean;\n }>(icon)\n ? icon\n : null;\n const ariaLabel =\n typeof icon === \"string\"\n ? `${labels.eventLabelPrefix}: ${iconEntry?.label ?? icon}`\n : labels.defaultAriaLabel;\n let iconContent: React.ReactNode;\n\n if (iconEntry) {\n iconContent = <iconEntry.Icon aria-hidden size={sizes.iconSize} />;\n } else if (typeof icon === \"string\") {\n iconContent = (\n <span className={cn(sizes.text, \"leading-none\")}>{icon}</span>\n );\n } else if (iconElement) {\n iconContent = React.cloneElement(iconElement, {\n \"aria-hidden\": true,\n size: sizes.iconSize,\n className: cn(\"shrink-0\", iconElement.props.className),\n });\n } else {\n iconContent = (\n <span className=\"flex shrink-0 items-center justify-center\">{icon}</span>\n );\n }\n\n return (\n <span\n role=\"img\"\n aria-label={ariaLabel}\n className={cn(\n \"inline-flex shrink-0 items-center justify-center rounded-lg\",\n !resolvedColor && \"bg-accent-subtle text-accent\",\n sizes.container,\n className,\n )}\n style={getEventIconStyle(resolvedColor)}\n data-opt-id=\"ZNSD9\"\n data-opt-slug=\"event-icon.EventIcon\"\n >\n {iconContent}\n </span>\n );\n}\n\nEventIcon.displayName = \"EventIcon\";\n","import * as React from \"react\";\nimport { cn } from \"../lib/cn\";\n\n/** Type definition for connection status. */\nexport type ConnectionStatus =\n | \"connected\"\n | \"disconnected\"\n | \"connecting\"\n | \"error\";\n\n/**\n * 점 색상 톤. `status` 프리셋으로 표현되지 않는 도메인 상태\n * (예: \"Persistent\" / \"Volatile\" / \"Recovered\")를 직접 칠할 때 쓴다.\n */\nexport type ConnectionTone =\n | \"neutral\"\n | \"success\"\n | \"warning\"\n | \"danger\"\n | \"info\";\n\n/** Localized labels for the connection indicator component. */\nexport type ConnectionIndicatorLabels = Record<never, never>;\n\n/** Props for the connection indicator component. */\nexport interface ConnectionIndicatorProps {\n /**\n * 연결 상태 프리셋. tone과 pulse의 기본값을 정한다.\n * 생략하면 `tone`(기본 neutral)이 색을 결정한다.\n */\n status?: ConnectionStatus;\n /** status 프리셋 대신 색만 지정. status와 함께 주면 이 값이 이긴다. */\n tone?: ConnectionTone;\n label?: string;\n showLabel?: boolean;\n /** 점 애니메이션. 생략하면 status 프리셋을 따른다. */\n pulse?: boolean;\n className?: string;\n}\n\nconst TONE_CLASS: Record<ConnectionTone, string> = {\n neutral: \"bg-text-tertiary\",\n success: \"bg-success\",\n warning: \"bg-warning\",\n danger: \"bg-danger\",\n info: \"bg-info\",\n};\n\nconst STATUS_CONFIG: Record<\n ConnectionStatus,\n { tone: ConnectionTone; pulse: boolean; defaultLabel: string }\n> = {\n connected: {\n tone: \"success\",\n pulse: false,\n defaultLabel: \"Connected\",\n },\n connecting: {\n tone: \"warning\",\n pulse: true,\n defaultLabel: \"Connecting...\",\n },\n disconnected: {\n tone: \"neutral\",\n pulse: false,\n defaultLabel: \"Disconnected\",\n },\n error: {\n tone: \"danger\",\n pulse: true,\n defaultLabel: \"Error\",\n },\n};\n\n/** Renders the connection indicator component. */\nexport function ConnectionIndicator({\n status,\n tone,\n label,\n showLabel = true,\n pulse,\n className,\n}: ConnectionIndicatorProps) {\n const preset = status ? STATUS_CONFIG[status] : null;\n const resolvedTone = tone ?? preset?.tone ?? \"neutral\";\n const resolvedPulse = pulse ?? preset?.pulse ?? false;\n const displayLabel = label ?? preset?.defaultLabel ?? \"\";\n const dotClass = TONE_CLASS[resolvedTone];\n\n return (\n <span\n role=\"status\"\n aria-label={displayLabel || undefined}\n className={cn(\"inline-flex min-w-0 items-center gap-1.5\", className)}\n data-opt-id=\"191EC\"\n data-opt-slug=\"connection-indicator.ConnectionIndicator\"\n >\n <span className=\"relative flex h-2.5 w-2.5 flex-none\">\n {resolvedPulse && (\n <span\n className={cn(\n \"absolute inline-flex h-full w-full animate-ping rounded-full opacity-75\",\n dotClass,\n )}\n />\n )}\n <span\n className={cn(\n \"relative inline-flex h-2.5 w-2.5 rounded-full\",\n dotClass,\n )}\n />\n </span>\n {showLabel && displayLabel && (\n <span className=\"text-text-secondary truncate text-xs\">\n {displayLabel}\n </span>\n )}\n </span>\n );\n}\n\nConnectionIndicator.displayName = \"ConnectionIndicator\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../lib/cn\";\nimport { Button } from \"../core/button\";\n\n/** Defines the floating action shape. */\nexport interface FloatingAction {\n id: string;\n label: string;\n icon?: React.ReactNode;\n variant?: \"default\" | \"primary\" | \"danger\";\n disabled?: boolean;\n}\n\n/** Props for the floating action bar component. */\nexport interface FloatingActionBarProps {\n actions: FloatingAction[];\n selectedCount?: number;\n onAction: (actionId: string) => void;\n onDismiss?: () => void;\n className?: string;\n labels?: FloatingActionBarLabels;\n}\n\n/** Localized labels for the floating action bar component. */\nexport interface FloatingActionBarLabels {\n toolbarAriaLabel?: string;\n selectedLabel?: (count: number) => string;\n dismissAriaLabel?: string;\n}\n\nconst defaultLabels: Required<FloatingActionBarLabels> = {\n toolbarAriaLabel: \"Actions\",\n selectedLabel: (count) => `${count} selected`,\n dismissAriaLabel: \"Dismiss\",\n};\n\n/** Renders the floating action bar component. */\nexport function FloatingActionBar({\n actions,\n selectedCount,\n onAction,\n onDismiss,\n className,\n labels: customLabels,\n}: FloatingActionBarProps) {\n const labels = { ...defaultLabels, ...customLabels };\n\n if (actions.length === 0) return null;\n\n return (\n <div\n role=\"toolbar\"\n aria-label={labels.toolbarAriaLabel}\n className={cn(\n \"fixed bottom-6 left-1/2 z-50 -translate-x-1/2\",\n \"gap-element flex items-center rounded-xl px-4 py-2.5\",\n // eslint-disable-next-line opt-ui/no-raw-color -- floating action bar는 라이트/다크 공통 dark surface 의도\n \"bg-black/90 shadow-xl\",\n \"backdrop-blur-sm\",\n className,\n )}\n data-opt-id=\"S390B\"\n data-opt-slug=\"floating-action-bar.FloatingActionBar\"\n >\n {selectedCount !== undefined && (\n // eslint-disable-next-line opt-ui/no-raw-color -- dark surface 위 흰 텍스트\n <span className=\"mr-2 text-sm font-medium text-white\">\n {labels.selectedLabel(selectedCount)}\n </span>\n )}\n {actions.map((action) => {\n const variant =\n action.variant === \"danger\"\n ? \"danger\"\n : action.variant === \"primary\"\n ? \"primary\"\n : \"ghost\";\n return (\n <Button\n key={action.id}\n variant={variant}\n size=\"sm\"\n disabled={action.disabled}\n onClick={() => onAction(action.id)}\n className={cn(\n // eslint-disable-next-line opt-ui/no-raw-color -- dark surface 위 ghost 버튼 색\n variant === \"ghost\" && \"text-white hover:bg-white/10\",\n )}\n >\n {action.icon}\n {action.label}\n </Button>\n );\n })}\n {onDismiss && (\n <button\n type=\"button\"\n onClick={onDismiss}\n // eslint-disable-next-line opt-ui/no-raw-color -- dark surface 위 dismiss 버튼 + focus ring\n className=\"ml-1 rounded text-sm text-white/60 hover:text-white focus-visible:ring-2 focus-visible:ring-white/60 focus-visible:outline-none\"\n aria-label={labels.dismissAriaLabel}\n >\n ✕\n </button>\n )}\n </div>\n );\n}\n\nFloatingActionBar.displayName = \"FloatingActionBar\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport { matchSorter } from \"match-sorter\";\nimport { cn } from \"../lib/cn\";\nimport { Badge } from \"../core/badge\";\nimport { OPT_FOCUS_VISIBLE } from \"../lib/styles\";\n\n/** Defines the template shape. */\nexport interface TemplateDef {\n id: string;\n name: string;\n description?: string;\n icon?: React.ReactNode;\n category?: string;\n featured?: boolean;\n tags?: string[];\n}\n\n/** Localized labels for the template picker component. */\nexport interface TemplatePickerLabels {\n ariaLabel?: string;\n defaultCategory?: string;\n searchPlaceholder?: string;\n featuredBadge?: string;\n}\n\nconst defaultLabels: Required<TemplatePickerLabels> = {\n ariaLabel: \"Templates\",\n defaultCategory: \"General\",\n searchPlaceholder: \"Search templates...\",\n featuredBadge: \"Featured\",\n};\n\n/** Props for the template picker component. */\nexport interface TemplatePickerProps {\n templates: TemplateDef[];\n selected?: string;\n onSelect: (templateId: string) => void;\n labels?: TemplatePickerLabels;\n showSearch?: boolean;\n className?: string;\n}\n\n/** Renders the template picker component. */\nexport function TemplatePicker({\n templates,\n selected,\n onSelect,\n labels: customLabels,\n showSearch = false,\n className,\n}: TemplatePickerProps) {\n const labels = { ...defaultLabels, ...customLabels };\n const [search, setSearch] = React.useState(\"\");\n\n // Filter by search\n const filtered = React.useMemo(() => {\n if (!showSearch || !search) return templates;\n return matchSorter(templates, search, {\n keys: [\"name\", \"description\", \"tags\"],\n });\n }, [templates, search, showSearch]);\n\n // Group by category\n const grouped = React.useMemo(() => {\n const map = new Map<string, TemplateDef[]>();\n for (const t of filtered) {\n const cat = t.category ?? labels.defaultCategory;\n if (!map.has(cat)) map.set(cat, []);\n map.get(cat)!.push(t);\n }\n return map;\n }, [filtered, labels.defaultCategory]);\n\n return (\n <div\n className={cn(\"gap-group flex flex-col\", className)}\n role=\"listbox\"\n aria-label={labels.ariaLabel}\n data-opt-id=\"PVFJP\"\n data-opt-slug=\"template-picker.TemplatePicker\"\n >\n {showSearch && (\n <input\n type=\"search\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder={labels.searchPlaceholder}\n aria-label={labels.searchPlaceholder}\n className={cn(\n \"border-border bg-surface text-text-primary placeholder:text-text-tertiary focus:border-accent w-full rounded-lg border px-3 py-2 text-sm\",\n OPT_FOCUS_VISIBLE,\n )}\n />\n )}\n {Array.from(grouped).map(([category, items]) => (\n <div key={category}>\n <h3 className=\"text-text-tertiary mb-2 text-xs font-semibold tracking-wider uppercase\">\n {category}\n </h3>\n <div className=\"gap-element grid grid-cols-2 sm:grid-cols-3\">\n {items.map((t) => (\n <button\n key={t.id}\n role=\"option\"\n aria-selected={selected === t.id}\n onClick={() => onSelect(t.id)}\n className={cn(\n \"flex flex-col items-start gap-1 rounded-lg border p-3 text-left transition-colors\",\n \"hover:bg-bg-subtle\",\n selected === t.id\n ? \"border-accent bg-accent-subtle\"\n : \"border-border\",\n )}\n >\n <div className=\"gap-element flex w-full items-center\">\n {t.icon && (\n <span className=\"flex size-5 items-center justify-center\">\n {t.icon}\n </span>\n )}\n <span className=\"text-text-primary text-sm font-medium\">\n {t.name}\n </span>\n {t.featured && (\n <Badge variant=\"info\" size=\"sm\" className=\"ml-auto\">\n {labels.featuredBadge}\n </Badge>\n )}\n </div>\n {t.description && (\n <span className=\"text-text-tertiary line-clamp-2 text-xs\">\n {t.description}\n </span>\n )}\n {t.tags && t.tags.length > 0 && (\n <div className=\"flex flex-wrap gap-1\">\n {t.tags.map((tag) => (\n <span\n key={tag}\n className=\"bg-bg-subtle text-text-tertiary rounded px-1.5 py-0.5 text-[10px]\"\n >\n {tag}\n </span>\n ))}\n </div>\n )}\n </button>\n ))}\n </div>\n </div>\n ))}\n </div>\n );\n}\n\nTemplatePicker.displayName = \"TemplatePicker\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../lib/cn\";\nimport { OPT_FOCUS_VISIBLE } from \"../lib/styles\";\n\n/** Localized labels for the code snippet viewer component. */\nexport interface CodeSnippetViewerLabels {\n copy?: string;\n copied?: string;\n codeRegion?: string;\n}\n\nconst defaultLabels: Required<CodeSnippetViewerLabels> = {\n copy: \"Copy\",\n copied: \"Copied!\",\n codeRegion: \"Code snippet\",\n};\n\n/** Visual tone options for code snippet syntax surfaces. */\nexport type CodeSnippetSyntaxTheme = \"default\" | \"muted\" | \"dark\" | \"terminal\";\n\nconst syntaxThemeClasses: Record<\n CodeSnippetSyntaxTheme,\n {\n root: string;\n header: string;\n pre: string;\n lineNumber: string;\n code: string;\n }\n> = {\n default: {\n root: \"bg-surface\",\n header: \"bg-surface-inset\",\n pre: \"bg-surface\",\n lineNumber: \"text-text-tertiary\",\n code: \"text-text-primary\",\n },\n muted: {\n root: \"bg-surface-inset\",\n header: \"bg-bg-subtle\",\n pre: \"bg-surface-inset\",\n lineNumber: \"text-text-tertiary\",\n code: \"text-text-primary\",\n },\n dark: {\n root: \"bg-bg-inverse\",\n header: \"bg-bg-inverse text-text-inverse\",\n pre: \"bg-bg-inverse\",\n lineNumber: \"text-text-inverse/60\",\n code: \"text-text-inverse\",\n },\n terminal: {\n root: \"bg-bg-inverse\",\n header: \"bg-bg-inverse text-success-fg\",\n pre: \"bg-bg-inverse\",\n lineNumber: \"text-text-inverse/50\",\n code: \"text-success-fg\",\n },\n};\n\n/** Props for the code snippet viewer component. */\nexport interface CodeSnippetViewerProps {\n code: string;\n language?: string;\n title?: string;\n showLineNumbers?: boolean;\n showCopyButton?: boolean;\n maxHeight?: number;\n syntaxTheme?: CodeSnippetSyntaxTheme;\n className?: string;\n labels?: CodeSnippetViewerLabels;\n}\n\n/** Renders the code snippet viewer component. */\nexport function CodeSnippetViewer({\n code,\n language = \"text\",\n title,\n showLineNumbers = true,\n showCopyButton = true,\n maxHeight = 400,\n syntaxTheme = \"default\",\n className,\n labels: customLabels,\n}: CodeSnippetViewerProps) {\n const labels = { ...defaultLabels, ...customLabels };\n const [copied, setCopied] = React.useState(false);\n\n const lines = code.split(\"\\n\");\n const theme = syntaxThemeClasses[syntaxTheme] ?? syntaxThemeClasses.default;\n const regionLabel = title\n ? `${labels.codeRegion}: ${title}`\n : `${labels.codeRegion}: ${language}`;\n\n const handleCopy = React.useCallback(async () => {\n try {\n await navigator.clipboard.writeText(code);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch {\n // Fallback silently\n }\n }, [code]);\n\n return (\n <div\n className={cn(\n \"border-border overflow-hidden rounded-lg border\",\n theme.root,\n className,\n )}\n data-opt-id=\"9GDXY\"\n data-opt-slug=\"code-snippet-viewer.CodeSnippetViewer\"\n >\n {(title || showCopyButton) && (\n <div\n className={cn(\n \"border-border flex items-center justify-between border-b px-3 py-1.5\",\n theme.header,\n )}\n >\n <span className=\"text-text-tertiary text-xs font-medium\">\n {title ?? language}\n </span>\n {showCopyButton && (\n <button\n onClick={handleCopy}\n className=\"text-text-tertiary hover:text-text-primary text-xs transition-colors\"\n aria-label=\"Copy code\"\n >\n {copied ? labels.copied : labels.copy}\n </button>\n )}\n </div>\n )}\n <div\n className={cn(\"overflow-auto\", OPT_FOCUS_VISIBLE)}\n style={{ maxHeight }}\n tabIndex={0}\n role=\"region\"\n aria-label={regionLabel}\n >\n <pre className={cn(\"p-3 font-mono text-sm\", theme.pre)}>\n <code>\n {lines.map((line, i) => (\n <div key={i} className=\"flex\">\n {showLineNumbers && (\n <span\n className={cn(\n \"min-w-[2.5rem] pr-4 text-right select-none\",\n theme.lineNumber,\n )}\n >\n {i + 1}\n </span>\n )}\n <span className={cn(\"whitespace-pre\", theme.code)}>{line}</span>\n </div>\n ))}\n </code>\n </pre>\n </div>\n </div>\n );\n}\n\nCodeSnippetViewer.displayName = \"CodeSnippetViewer\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../lib/cn\";\nimport { formatOptNumber } from \"../lib/formatters\";\nimport { Input } from \"../core/input\";\n\n/** Defines the property shape. */\nexport interface PropertyDef {\n name: string;\n type: string;\n description?: string;\n exampleValue?: string;\n eventCount?: number;\n}\n\n/** Defines the property group shape. */\nexport interface PropertyGroup {\n name: string;\n properties: PropertyDef[];\n}\n\n/** Localized labels for the property explorer component. */\nexport interface PropertyExplorerLabels {\n searchPlaceholder?: string;\n noPropertiesFound?: string;\n}\n\nconst defaultLabels: Required<PropertyExplorerLabels> = {\n searchPlaceholder: \"Search properties...\",\n noPropertiesFound: \"No properties found\",\n};\n\n/** Props for the property explorer component. */\nexport interface PropertyExplorerProps {\n groups: PropertyGroup[];\n onSelect?: (property: PropertyDef) => void;\n className?: string;\n labels?: PropertyExplorerLabels;\n}\n\n/** Renders the property explorer component. */\nexport function PropertyExplorer({\n groups,\n onSelect,\n className,\n labels: customLabels,\n}: PropertyExplorerProps) {\n const labels = { ...defaultLabels, ...customLabels };\n const [search, setSearch] = React.useState(\"\");\n\n const filtered = React.useMemo(() => {\n if (!search) return groups;\n const q = search.toLowerCase();\n return groups\n .map((g) => ({\n ...g,\n properties: g.properties.filter(\n (p) =>\n p.name.toLowerCase().includes(q) ||\n p.type.toLowerCase().includes(q) ||\n p.description?.toLowerCase().includes(q),\n ),\n }))\n .filter((g) => g.properties.length > 0);\n }, [groups, search]);\n\n return (\n <div\n className={cn(\"gap-element flex flex-col\", className)}\n data-opt-id=\"HJF32\"\n data-opt-slug=\"property-explorer.PropertyExplorer\"\n >\n <Input\n placeholder={labels.searchPlaceholder}\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n aria-label=\"Search properties\"\n />\n <div className=\"gap-group flex max-h-96 flex-col overflow-y-auto\">\n {filtered.map((group) => (\n <div key={group.name}>\n <h4 className=\"text-text-tertiary mb-1.5 text-xs font-semibold tracking-wider uppercase\">\n {group.name}\n </h4>\n <div className=\"gap-element flex flex-col\">\n {group.properties.map((prop) => (\n <button\n key={prop.name}\n onClick={() => onSelect?.(prop)}\n className={cn(\n \"flex w-full items-center justify-between rounded-md px-2.5 py-1.5 text-left\",\n \"hover:bg-bg-subtle transition-colors\",\n )}\n >\n <div className=\"min-w-0\">\n <span className=\"text-text-primary text-sm font-medium\">\n {prop.name}\n </span>\n <span className=\"text-text-tertiary ml-2 font-mono text-xs\">\n {prop.type}\n </span>\n {prop.description && (\n <p className=\"text-text-tertiary truncate text-xs\">\n {prop.description}\n </p>\n )}\n </div>\n {prop.eventCount !== undefined && (\n <span className=\"text-text-tertiary ml-2 shrink-0 text-xs\">\n {formatOptNumber(prop.eventCount)}\n </span>\n )}\n </button>\n ))}\n </div>\n </div>\n ))}\n {filtered.length === 0 && (\n <p className=\"text-text-tertiary py-4 text-center text-sm\">\n {labels.noPropertiesFound}\n </p>\n )}\n </div>\n </div>\n );\n}\n\nPropertyExplorer.displayName = \"PropertyExplorer\";\n","import * as React from \"react\";\nimport { cn } from \"../lib/cn\";\n\n/** Localized labels for the query results table component. */\nexport interface QueryResultsTableLabels {\n emptyMessage?: string;\n loadingMessage?: string;\n rowsSuffix?: string;\n}\n\nconst defaultLabels: Required<QueryResultsTableLabels> = {\n emptyMessage: \"No results\",\n loadingMessage: \"Running query...\",\n rowsSuffix: \"row(s)\",\n};\n\n/** Props for the query results table component. */\nexport interface QueryResultsTableProps {\n columns: string[];\n rows: Array<Record<string, unknown>>;\n maxHeight?: number;\n emptyMessage?: string;\n loading?: boolean;\n error?: string;\n labels?: QueryResultsTableLabels;\n className?: string;\n}\n\n/** Renders the query results table component. */\nexport function QueryResultsTable({\n columns,\n rows,\n maxHeight = 400,\n emptyMessage,\n loading = false,\n error,\n labels: customLabels,\n className,\n}: QueryResultsTableProps) {\n const labels = { ...defaultLabels, ...customLabels };\n if (error) {\n return (\n <div\n className={cn(\n \"border-danger bg-danger-subtle rounded-lg border p-4\",\n className,\n )}\n role=\"alert\"\n aria-live=\"assertive\"\n data-opt-id=\"PNC1V\"\n data-opt-slug=\"query-results-table.QueryResultsTable\"\n >\n <p className=\"text-danger-fg font-mono text-sm\">{error}</p>\n </div>\n );\n }\n\n if (loading) {\n return (\n <div\n className={cn(\n \"border-border rounded-lg border p-8 text-center\",\n className,\n )}\n role=\"status\"\n aria-live=\"polite\"\n aria-busy=\"true\"\n data-opt-id=\"PNC1V\"\n data-opt-slug=\"query-results-table.QueryResultsTable\"\n >\n <div\n className=\"border-border border-t-accent inline-block h-5 w-5 animate-spin rounded-full border-2\"\n aria-hidden=\"true\"\n />\n <p className=\"text-text-tertiary mt-2 text-sm\">\n {labels.loadingMessage}\n </p>\n </div>\n );\n }\n\n if (rows.length === 0) {\n return (\n <div\n className={cn(\n \"border-border rounded-lg border p-8 text-center\",\n className,\n )}\n data-opt-id=\"PNC1V\"\n data-opt-slug=\"query-results-table.QueryResultsTable\"\n >\n <p className=\"text-text-tertiary text-sm\">\n {emptyMessage ?? labels.emptyMessage}\n </p>\n </div>\n );\n }\n\n return (\n <div\n className={cn(\n \"border-border overflow-hidden rounded-lg border\",\n className,\n )}\n data-opt-id=\"PNC1V\"\n data-opt-slug=\"query-results-table.QueryResultsTable\"\n >\n <div className=\"overflow-auto\" style={{ maxHeight }}>\n <table className=\"w-full text-sm\">\n <thead className=\"bg-surface-inset sticky top-0\">\n <tr>\n <th className=\"text-text-tertiary w-10 px-3 py-2 text-left text-xs font-medium\">\n #\n </th>\n {columns.map((col) => (\n <th\n key={col}\n className=\"text-text-tertiary px-3 py-2 text-left text-xs font-medium whitespace-nowrap\"\n >\n {col}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.map((row, ri) => (\n <tr\n key={ri}\n className=\"border-border-subtle hover:bg-bg-subtle border-t\"\n >\n <td className=\"text-text-tertiary px-3 py-1.5 font-mono text-xs\">\n {ri + 1}\n </td>\n {columns.map((col) => (\n <td\n key={col}\n className=\"text-text-primary px-3 py-1.5 font-mono whitespace-nowrap\"\n >\n {String(row[col] ?? \"\")}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n <div className=\"border-border-subtle bg-surface-inset border-t px-3 py-1.5\">\n <span className=\"text-text-tertiary text-xs\">\n {rows.length} {labels.rowsSuffix}\n </span>\n </div>\n </div>\n );\n}\n\nQueryResultsTable.displayName = \"QueryResultsTable\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../lib/cn\";\nimport { Button } from \"../core/button\";\nimport { Input } from \"../core/input\";\n\n/** Defines the alert condition shape. */\nexport interface AlertCondition {\n metric: string;\n operator: \"gt\" | \"lt\" | \"eq\" | \"gte\" | \"lte\";\n threshold: number;\n}\n\n/** Configuration for alert. */\nexport interface AlertConfig {\n name: string;\n conditions: AlertCondition[];\n channels: string[];\n frequency: \"realtime\" | \"hourly\" | \"daily\";\n enabled: boolean;\n}\n\n/** Localized labels for the alert builder component. */\nexport interface AlertBuilderLabels {\n alertNameLabel?: string;\n conditionsLabel?: string;\n metricLabel?: string;\n operatorLabel?: string;\n thresholdLabel?: string;\n removeConditionLabel?: string;\n addConditionButton?: string;\n checkFrequencyLabel?: string;\n notificationChannelsLabel?: string;\n emptyMessage?: string;\n}\n\nconst defaultLabels: Required<AlertBuilderLabels> = {\n alertNameLabel: \"Alert name\",\n conditionsLabel: \"Conditions\",\n metricLabel: \"Metric\",\n operatorLabel: \"Operator\",\n thresholdLabel: \"Threshold\",\n removeConditionLabel: \"Remove condition\",\n addConditionButton: \"+ Add condition\",\n checkFrequencyLabel: \"Check frequency\",\n notificationChannelsLabel: \"Notification channels\",\n emptyMessage: \"Alert builder requires at least one metric and one channel.\",\n};\n\n/** Props for the alert builder component. */\nexport interface AlertBuilderProps {\n value: AlertConfig;\n onChange: (config: AlertConfig) => void;\n metrics?: string[];\n /** Dynamic event options for the metric selector. When provided, overrides `metrics`. */\n eventOptions?: { id: string; name: string }[];\n channels?: { id: string; label: string }[];\n labels?: AlertBuilderLabels;\n className?: string;\n}\n\nconst OPERATORS: { value: AlertCondition[\"operator\"]; label: string }[] = [\n { value: \"gt\", label: \">\" },\n { value: \"gte\", label: \">=\" },\n { value: \"lt\", label: \"<\" },\n { value: \"lte\", label: \"<=\" },\n { value: \"eq\", label: \"=\" },\n];\n\nconst FREQUENCIES: { value: AlertConfig[\"frequency\"]; label: string }[] = [\n { value: \"realtime\", label: \"Real-time\" },\n { value: \"hourly\", label: \"Hourly\" },\n { value: \"daily\", label: \"Daily\" },\n];\n\n/** Renders the alert builder component. */\nexport function AlertBuilder({\n value,\n onChange,\n metrics = [\"page_view\", \"click\", \"conversion\", \"error_rate\", \"latency_p99\"],\n eventOptions,\n channels = [\n { id: \"email\", label: \"Email\" },\n { id: \"slack\", label: \"Slack\" },\n { id: \"webhook\", label: \"Webhook\" },\n ],\n labels: customLabels,\n className,\n}: AlertBuilderProps) {\n const resolvedMetrics = eventOptions\n ? eventOptions.map((e) => e.id)\n : metrics;\n const metricLabelMap = eventOptions\n ? Object.fromEntries(eventOptions.map((e) => [e.id, e.name]))\n : null;\n const labels = { ...defaultLabels, ...customLabels };\n const alertNameId = React.useId();\n const conditionsId = React.useId();\n const checkFrequencyId = React.useId();\n const notificationChannelsId = React.useId();\n const update = (partial: Partial<AlertConfig>) => {\n onChange({ ...value, ...partial });\n };\n\n if (resolvedMetrics.length === 0 || channels.length === 0) {\n return (\n <div\n className={cn(\"text-text-secondary text-sm\", className)}\n data-opt-id=\"VTENR\"\n data-opt-slug=\"alert-builder.AlertBuilder\"\n >\n {labels.emptyMessage}\n </div>\n );\n }\n\n const addCondition = () => {\n update({\n conditions: [\n ...value.conditions,\n { metric: resolvedMetrics[0], operator: \"gt\", threshold: 0 },\n ],\n });\n };\n\n const updateCondition = (index: number, partial: Partial<AlertCondition>) => {\n const next = value.conditions.map((c, i) =>\n i === index ? { ...c, ...partial } : c,\n );\n update({ conditions: next });\n };\n\n const removeCondition = (index: number) => {\n update({ conditions: value.conditions.filter((_, i) => i !== index) });\n };\n\n const toggleChannel = (channelId: string) => {\n const next = value.channels.includes(channelId)\n ? value.channels.filter((c) => c !== channelId)\n : [...value.channels, channelId];\n update({ channels: next });\n };\n\n return (\n <div\n className={cn(\"gap-group flex flex-col\", className)}\n data-opt-id=\"VTENR\"\n data-opt-slug=\"alert-builder.AlertBuilder\"\n >\n {/* Name */}\n <div>\n <label\n htmlFor={alertNameId}\n className=\"text-text-tertiary mb-1 block text-xs font-medium\"\n >\n {labels.alertNameLabel}\n </label>\n <Input\n id={alertNameId}\n value={value.name}\n onChange={(e) => update({ name: e.target.value })}\n placeholder=\"My alert\"\n />\n </div>\n\n {/* Conditions */}\n <div>\n <span\n id={conditionsId}\n className=\"text-text-tertiary mb-1 block text-xs font-medium\"\n >\n {labels.conditionsLabel}\n </span>\n <div\n className=\"gap-element flex flex-col\"\n role=\"group\"\n aria-labelledby={conditionsId}\n >\n {value.conditions.map((cond, i) => (\n <div key={i} className=\"gap-element flex items-center\">\n <select\n value={cond.metric}\n onChange={(e) => updateCondition(i, { metric: e.target.value })}\n className=\"border-border text-text-primary rounded-md border bg-transparent px-2 py-1.5 text-sm\"\n aria-label={`${labels.metricLabel} ${i + 1}`}\n >\n {resolvedMetrics.map((m) => (\n <option key={m} value={m}>\n {metricLabelMap ? (metricLabelMap[m] ?? m) : m}\n </option>\n ))}\n </select>\n <select\n value={cond.operator}\n onChange={(e) => {\n const v = e.target.value;\n if ([\"gt\", \"lt\", \"eq\", \"gte\", \"lte\"].includes(v))\n updateCondition(i, {\n operator: v as AlertCondition[\"operator\"],\n });\n }}\n className=\"border-border text-text-primary w-14 rounded-md border bg-transparent px-2 py-1.5 text-center text-sm\"\n aria-label={`${labels.operatorLabel} ${i + 1}`}\n >\n {OPERATORS.map((op) => (\n <option key={op.value} value={op.value}>\n {op.label}\n </option>\n ))}\n </select>\n <Input\n type=\"number\"\n value={cond.threshold}\n onChange={(e) =>\n updateCondition(i, {\n threshold: Number(e.target.value),\n })\n }\n aria-label={`${labels.thresholdLabel} ${i + 1}`}\n className=\"w-24\"\n />\n <button\n type=\"button\"\n onClick={() => removeCondition(i)}\n className=\"text-text-tertiary hover:text-danger focus-visible:ring-accent rounded text-sm focus-visible:ring-2 focus-visible:outline-none\"\n aria-label={`${labels.removeConditionLabel} ${i + 1}`}\n >\n ✕\n </button>\n </div>\n ))}\n </div>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={addCondition}\n className=\"mt-1.5\"\n >\n {labels.addConditionButton}\n </Button>\n </div>\n\n {/* Frequency */}\n <div>\n <span\n id={checkFrequencyId}\n className=\"text-text-tertiary mb-1 block text-xs font-medium\"\n >\n {labels.checkFrequencyLabel}\n </span>\n <div\n className=\"gap-element flex\"\n role=\"group\"\n aria-labelledby={checkFrequencyId}\n >\n {FREQUENCIES.map((f) => (\n <button\n type=\"button\"\n key={f.value}\n onClick={() => update({ frequency: f.value })}\n aria-pressed={value.frequency === f.value}\n className={cn(\n \"focus-visible:ring-accent rounded-md px-3 py-1.5 text-sm transition-colors focus-visible:ring-2 focus-visible:outline-none\",\n value.frequency === f.value\n ? \"bg-accent text-accent-fg\"\n : \"bg-bg-subtle text-text-secondary hover:bg-bg-muted\",\n )}\n >\n {f.label}\n </button>\n ))}\n </div>\n </div>\n\n {/* Channels */}\n <div>\n <span\n id={notificationChannelsId}\n className=\"text-text-tertiary mb-1 block text-xs font-medium\"\n >\n {labels.notificationChannelsLabel}\n </span>\n <div\n className=\"gap-element flex\"\n role=\"group\"\n aria-labelledby={notificationChannelsId}\n >\n {channels.map((ch) => (\n <button\n type=\"button\"\n key={ch.id}\n onClick={() => toggleChannel(ch.id)}\n aria-pressed={value.channels.includes(ch.id)}\n className={cn(\n \"focus-visible:ring-accent rounded-md px-3 py-1.5 text-sm transition-colors focus-visible:ring-2 focus-visible:outline-none\",\n value.channels.includes(ch.id)\n ? \"bg-accent text-accent-fg\"\n : \"bg-bg-subtle text-text-secondary hover:bg-bg-muted\",\n )}\n >\n {ch.label}\n </button>\n ))}\n </div>\n </div>\n </div>\n );\n}\n\nAlertBuilder.displayName = \"AlertBuilder\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../lib/cn\";\nimport { Button } from \"../core/button\";\n\n/** CodeMirror 확장. `@codemirror/state`의 `Extension`. */\nexport type SqlEditorExtension = import(\"@codemirror/state\").Extension;\n\n/** CodeMirror 키 바인딩. `@codemirror/view`의 `KeyBinding`. */\nexport type SqlEditorKeyBinding = import(\"@codemirror/view\").KeyBinding;\n\n/**\n * 자동완성 스키마. `@codemirror/lang-sql`의 `SQLNamespace` —\n * `{ table: [\"col\", ...] }` 형태로 테이블/컬럼을 알려준다.\n */\nexport type SqlEditorSchema = import(\"@codemirror/lang-sql\").SQLNamespace;\n\n/** 추가 자동완성 소스. `@codemirror/autocomplete`의 `CompletionSource`. */\nexport type SqlEditorCompletionSource =\n import(\"@codemirror/autocomplete\").CompletionSource;\n\n/** Localized labels for the sql editor component. */\nexport interface SqlEditorLabels {\n placeholder?: string;\n runHint?: string;\n runButton?: string;\n editor?: string;\n}\n\nconst defaultLabels: Required<SqlEditorLabels> = {\n placeholder: \"SELECT * FROM events LIMIT 100\",\n runHint: \"Ctrl+Enter to run\",\n runButton: \"Run Query\",\n editor: \"SQL 편집기\",\n};\n\n/** Props for the sql editor component. */\nexport interface SqlEditorProps {\n value: string;\n onChange: (sql: string) => void;\n /** Mod+Enter. */\n onRun?: (sql: string) => void;\n /** Shift+Enter — 실행 후 다음 셀/탭으로 넘어가는 노트북형 흐름. */\n onRunAndAdvance?: (sql: string) => void;\n placeholder?: string;\n readOnly?: boolean;\n /** px 고정 높이. `\"fill\"`이면 부모가 정한 높이를 채운다. */\n height?: number | \"fill\";\n /**\n * 테이블/컬럼 자동완성 스키마. 값이 바뀌면 에디터를 다시 만들지 않고\n * 자동완성만 재구성하므로, 카탈로그가 자주 갱신되는 화면에서도 커서와\n * 실행 취소 이력이 유지된다.\n */\n schema?: SqlEditorSchema;\n /** 스키마 자동완성에 더해 붙일 완성 소스 (함수 시그니처, 스니펫 등). */\n completionSources?: SqlEditorCompletionSource[];\n /** 추가 키 바인딩. 내장 실행 바인딩보다 먼저 평가된다. */\n keymap?: SqlEditorKeyBinding[];\n /** 임의의 CodeMirror 확장. 내장 확장 뒤에 붙어 우선권을 갖는다. */\n extensions?: SqlEditorExtension[];\n /** 편집 영역의 접근성 레이블. */\n ariaLabel?: string;\n autoFocus?: boolean;\n /**\n * 실행 힌트와 Run 버튼 표시 여부. 기본값은 `onRun`이 있을 때 표시.\n * 자체 툴바를 쓰는 화면에서 `false`로 끈다.\n */\n showFooter?: boolean;\n labels?: SqlEditorLabels;\n className?: string;\n}\n\n/** Renders the sql editor component. */\nexport function SqlEditor({\n value,\n onChange,\n onRun,\n onRunAndAdvance,\n placeholder,\n readOnly = false,\n height = 200,\n schema,\n completionSources,\n keymap: customKeymap,\n extensions: customExtensions,\n ariaLabel,\n autoFocus = false,\n showFooter,\n labels: customLabels,\n className,\n}: SqlEditorProps) {\n const labels = { ...defaultLabels, ...customLabels };\n const fill = height === \"fill\";\n const footerVisible = showFooter ?? Boolean(onRun);\n\n const editorRef = React.useRef<HTMLDivElement>(null);\n const viewRef = React.useRef<import(\"@codemirror/view\").EditorView | null>(\n null,\n );\n const completionCompartmentRef = React.useRef<\n import(\"@codemirror/state\").Compartment | null\n >(null);\n const editableCompartmentRef = React.useRef<\n import(\"@codemirror/state\").Compartment | null\n >(null);\n const buildCompletionRef = React.useRef<\n | ((\n schema: SqlEditorSchema | undefined,\n sources: SqlEditorCompletionSource[] | undefined,\n ) => SqlEditorExtension)\n | null\n >(null);\n\n const latestValueRef = React.useRef(value);\n const onChangeRef = React.useRef(onChange);\n const onRunRef = React.useRef(onRun);\n const onRunAndAdvanceRef = React.useRef(onRunAndAdvance);\n const customKeymapRef = React.useRef(customKeymap);\n const schemaRef = React.useRef(schema);\n const completionSourcesRef = React.useRef(completionSources);\n const autoFocusRef = React.useRef(autoFocus);\n latestValueRef.current = value;\n onChangeRef.current = onChange;\n onRunRef.current = onRun;\n onRunAndAdvanceRef.current = onRunAndAdvance;\n customKeymapRef.current = customKeymap;\n schemaRef.current = schema;\n completionSourcesRef.current = completionSources;\n autoFocusRef.current = autoFocus;\n\n // 자동완성 모듈은 실제로 필요할 때만 불러온다. 첫 렌더 기준으로 결정하므로\n // 스키마를 나중에 채우는 화면은 `schema={{}}`처럼 빈 값이라도 넘겨 둔다.\n const autocompleteEnabled = React.useRef(\n schema !== undefined || completionSources !== undefined,\n ).current;\n\n React.useEffect(() => {\n let view: import(\"@codemirror/view\").EditorView | null = null;\n let cancelled = false;\n\n async function init() {\n const parent = editorRef.current;\n if (!parent) return;\n\n const [\n { EditorView, keymap: cmKeymap, placeholder: cmPlaceholder },\n { Compartment, EditorState },\n langSql,\n { oneDark },\n autocomplete,\n ] = await Promise.all([\n import(\"@codemirror/view\"),\n import(\"@codemirror/state\"),\n import(\"@codemirror/lang-sql\"),\n import(\"@codemirror/theme-one-dark\"),\n autocompleteEnabled\n ? import(\"@codemirror/autocomplete\")\n : Promise.resolve(null),\n ]);\n if (cancelled || !parent.isConnected) return;\n\n const completionCompartment = new Compartment();\n const editableCompartment = new Compartment();\n completionCompartmentRef.current = completionCompartment;\n editableCompartmentRef.current = editableCompartment;\n\n const buildCompletion = (\n nextSchema: SqlEditorSchema | undefined,\n nextSources: SqlEditorCompletionSource[] | undefined,\n ): SqlEditorExtension => {\n if (!autocomplete) return [];\n const dialect = langSql.PostgreSQL;\n const parts: SqlEditorExtension[] = [\n autocomplete.autocompletion({\n override: [\n langSql.schemaCompletionSource({\n dialect,\n schema: nextSchema ?? {},\n }),\n langSql.keywordCompletionSource(dialect),\n ...(nextSources ?? []),\n ],\n }),\n cmKeymap.of(autocomplete.completionKeymap),\n ];\n return parts;\n };\n buildCompletionRef.current = buildCompletion;\n\n const runKeymap: SqlEditorKeyBinding[] = [\n {\n key: \"Shift-Enter\",\n run: (target) => {\n const handler = onRunAndAdvanceRef.current;\n if (!handler) return false;\n handler(target.state.doc.toString());\n return true;\n },\n },\n {\n key: \"Mod-Enter\",\n run: (target) => {\n const handler = onRunRef.current;\n if (!handler) return false;\n handler(target.state.doc.toString());\n return true;\n },\n },\n ];\n\n const extensions: SqlEditorExtension[] = [\n langSql.PostgreSQL.extension,\n completionCompartment.of(\n buildCompletion(schemaRef.current, completionSourcesRef.current),\n ),\n oneDark,\n cmKeymap.of([...(customKeymapRef.current ?? []), ...runKeymap]),\n EditorView.theme({\n \"&\": { height: \"100%\" },\n \"&.cm-focused\": {\n outline: \"2px solid var(--opt-ring)\",\n outlineOffset: \"-2px\",\n },\n \".cm-scroller\": { height: \"100%\", overflow: \"auto\" },\n }),\n cmPlaceholder(placeholder ?? labels.placeholder),\n EditorView.lineWrapping,\n EditorView.updateListener.of((update) => {\n if (update.docChanged) {\n onChangeRef.current(update.state.doc.toString());\n }\n }),\n editableCompartment.of(EditorView.editable.of(!readOnly)),\n EditorView.contentAttributes.of({\n \"aria-label\": ariaLabel ?? labels.editor,\n }),\n ...(customExtensions ?? []),\n ];\n\n view = new EditorView({\n state: EditorState.create({\n doc: latestValueRef.current,\n extensions,\n }),\n parent,\n });\n\n viewRef.current = view;\n if (autoFocusRef.current) view.focus();\n }\n\n void init();\n\n return () => {\n cancelled = true;\n view?.destroy();\n if (viewRef.current === view) {\n viewRef.current = null;\n }\n completionCompartmentRef.current = null;\n editableCompartmentRef.current = null;\n buildCompletionRef.current = null;\n };\n // 에디터는 한 번만 만든다. 재초기화하면 커서와 실행 취소 이력이 날아가므로\n // 이후 prop 변경은 아래 compartment effect들이 반영한다.\n }, []);\n\n // Sync external value changes\n React.useEffect(() => {\n const view = viewRef.current;\n if (view && view.state.doc.toString() !== value) {\n view.dispatch({\n changes: {\n from: 0,\n to: view.state.doc.length,\n insert: value,\n },\n });\n }\n }, [value]);\n\n // 스키마/완성 소스 변경 — 에디터를 다시 만들지 않고 자동완성만 재구성한다.\n React.useEffect(() => {\n const view = viewRef.current;\n const compartment = completionCompartmentRef.current;\n const build = buildCompletionRef.current;\n if (!view || !compartment || !build) return;\n view.dispatch({\n effects: compartment.reconfigure(build(schema, completionSources)),\n });\n }, [schema, completionSources]);\n\n // readOnly 변경 반영.\n React.useEffect(() => {\n const view = viewRef.current;\n const compartment = editableCompartmentRef.current;\n if (!view || !compartment) return;\n let cancelled = false;\n void import(\"@codemirror/view\").then(({ EditorView }) => {\n if (cancelled || viewRef.current !== view) return;\n view.dispatch({\n effects: compartment.reconfigure(EditorView.editable.of(!readOnly)),\n });\n });\n return () => {\n cancelled = true;\n };\n }, [readOnly]);\n\n return (\n <div\n className={cn(\n \"gap-element flex flex-col\",\n fill && \"h-full min-h-0\",\n className,\n )}\n data-opt-id=\"RSGKV\"\n data-opt-slug=\"sql-editor.SqlEditor\"\n >\n <div\n ref={editorRef}\n className={cn(\n \"border-border overflow-hidden rounded-lg border\",\n fill && \"min-h-0 flex-1\",\n )}\n style={fill ? undefined : { height }}\n />\n {footerVisible && (\n <div className=\"flex flex-none items-center justify-between\">\n <span className=\"text-text-tertiary text-xs\">{labels.runHint}</span>\n {onRun && (\n <Button variant=\"primary\" size=\"sm\" onClick={() => onRun(value)}>\n {labels.runButton}\n </Button>\n )}\n </div>\n )}\n </div>\n );\n}\n\nSqlEditor.displayName = \"SqlEditor\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../lib/cn\";\nimport { Input } from \"../core/input\";\nimport { IconPicker, type IconDef } from \"../core/icon-picker\";\nimport { ColorPicker } from \"../core/color-picker\";\nimport { TagInput } from \"../core/tag-input\";\nimport { EventIcon } from \"./event-icon\";\n\n/** Defines the event meta shape. */\nexport interface EventMeta {\n name: string;\n displayName: string;\n icon: string;\n color: string;\n tags: string[];\n description: string;\n}\n\n/** Props for the event meta editor component. */\nexport interface EventMetaEditorProps {\n value: EventMeta;\n onChange: (meta: EventMeta) => void;\n icons?: IconDef[];\n className?: string;\n labels?: EventMetaEditorLabels;\n}\n\n/** Localized labels for the event meta editor component. */\nexport interface EventMetaEditorLabels {\n icon?: string;\n color?: string;\n name?: string;\n displayName?: string;\n description?: string;\n tags?: string;\n namePlaceholder?: string;\n displayNamePlaceholder?: string;\n descriptionPlaceholder?: string;\n tagsPlaceholder?: string;\n emptyTagsMessage?: string;\n}\n\nconst defaultLabels: Required<EventMetaEditorLabels> = {\n icon: \"Icon\",\n color: \"Color\",\n name: \"Event name\",\n displayName: \"Display name\",\n description: \"Description\",\n tags: \"Tags\",\n namePlaceholder: \"page_view\",\n displayNamePlaceholder: \"Page View\",\n descriptionPlaceholder: \"Triggered when a user views a page\",\n tagsPlaceholder: \"Add tag...\",\n emptyTagsMessage: \"No tags added yet.\",\n};\n\n/** Renders the event meta editor component. */\nexport function EventMetaEditor({\n value,\n onChange,\n icons,\n className,\n labels: customLabels,\n}: EventMetaEditorProps) {\n const labels = { ...defaultLabels, ...customLabels };\n const hasTags = value.tags.length > 0;\n const nameId = React.useId();\n const displayNameId = React.useId();\n const descriptionId = React.useId();\n const tagsId = React.useId();\n const update = (partial: Partial<EventMeta>) => {\n onChange({ ...value, ...partial });\n };\n\n return (\n <div\n className={cn(\"gap-group flex flex-col\", className)}\n data-opt-id=\"EZR35\"\n data-opt-slug=\"event-meta-editor.EventMetaEditor\"\n >\n {/* Icon + Color row */}\n <div className=\"gap-group flex items-start\">\n <div>\n <span className=\"text-text-tertiary mb-1 block text-xs font-medium\">\n {labels.icon}\n </span>\n <IconPicker\n value={value.icon}\n onChange={(icon) => update({ icon })}\n icons={icons}\n aria-label={labels.icon}\n />\n </div>\n <div>\n <span className=\"text-text-tertiary mb-1 block text-xs font-medium\">\n {labels.color}\n </span>\n <ColorPicker\n value={value.color}\n onChange={(color) => update({ color })}\n aria-label={labels.color}\n />\n </div>\n {/* Preview */}\n <div className=\"flex flex-1 items-center justify-center\">\n <EventIcon icon={value.icon} color={value.color} size=\"lg\" />\n </div>\n </div>\n\n {/* Name fields */}\n <div className=\"gap-group grid grid-cols-2\">\n <div>\n <label\n htmlFor={nameId}\n className=\"text-text-tertiary mb-1 block text-xs font-medium\"\n >\n {labels.name}\n </label>\n <Input\n id={nameId}\n value={value.name}\n onChange={(e) => update({ name: e.target.value })}\n placeholder={labels.namePlaceholder}\n className=\"font-mono\"\n />\n </div>\n <div>\n <label\n htmlFor={displayNameId}\n className=\"text-text-tertiary mb-1 block text-xs font-medium\"\n >\n {labels.displayName}\n </label>\n <Input\n id={displayNameId}\n value={value.displayName}\n onChange={(e) => update({ displayName: e.target.value })}\n placeholder={labels.displayNamePlaceholder}\n />\n </div>\n </div>\n\n {/* Description */}\n <div>\n <label\n htmlFor={descriptionId}\n className=\"text-text-tertiary mb-1 block text-xs font-medium\"\n >\n {labels.description}\n </label>\n <Input\n id={descriptionId}\n value={value.description}\n onChange={(e) => update({ description: e.target.value })}\n placeholder={labels.descriptionPlaceholder}\n />\n </div>\n\n {/* Tags */}\n <div>\n <span className=\"text-text-tertiary mb-1 block text-xs font-medium\">\n {labels.tags}\n </span>\n <TagInput\n id={tagsId}\n value={value.tags}\n onChange={(tags) => update({ tags })}\n placeholder={labels.tagsPlaceholder}\n aria-label={labels.tags}\n />\n {!hasTags && (\n <span className=\"text-text-tertiary mt-1 block text-xs\">\n {labels.emptyTagsMessage}\n </span>\n )}\n </div>\n </div>\n );\n}\n\nEventMetaEditor.displayName = \"EventMetaEditor\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../lib/cn\";\n\n/** Defines the widget shape. */\nexport interface WidgetDef {\n id: string;\n x: number;\n y: number;\n w: number;\n h: number;\n minW?: number;\n minH?: number;\n content: React.ReactNode;\n}\n\n/** Props for the widget grid component. */\nexport interface WidgetGridProps {\n widgets: WidgetDef[];\n cols?: number;\n rowHeight?: number;\n gap?: number;\n onLayoutChange?: (\n layout: Array<{ id: string; x: number; y: number; w: number; h: number }>,\n ) => void;\n /** Enable drag-to-reorder */\n editable?: boolean;\n /** Called when a widget is dragged to a new position */\n onReorder?: (widgetId: string, fromIndex: number, toIndex: number) => void;\n labels?: WidgetGridLabels;\n className?: string;\n}\n\n/** Localized labels for the widget grid component. */\nexport interface WidgetGridLabels {\n emptyMessage?: string;\n}\n\nconst defaultLabels: Required<WidgetGridLabels> = {\n emptyMessage: \"No widgets to display\",\n};\n\n/** Renders the widget grid component. */\nexport function WidgetGrid({\n widgets,\n cols = 12,\n rowHeight = 80,\n gap = 16,\n editable = false,\n onReorder,\n labels: customLabels,\n className,\n}: WidgetGridProps) {\n const labels = { ...defaultLabels, ...customLabels };\n const [dragIdx, setDragIdx] = React.useState<number | null>(null);\n const [overIdx, setOverIdx] = React.useState<number | null>(null);\n\n if (widgets.length === 0) {\n return (\n <div\n className={cn(\"text-text-secondary text-sm\", className)}\n data-opt-id=\"QJY9W\"\n data-opt-slug=\"widget-grid.WidgetGrid\"\n >\n {labels.emptyMessage}\n </div>\n );\n }\n\n return (\n <div\n className={cn(\"grid\", className)}\n style={{\n gridTemplateColumns: `repeat(${cols}, 1fr)`,\n gap,\n }}\n data-opt-id=\"QJY9W\"\n data-opt-slug=\"widget-grid.WidgetGrid\"\n >\n {widgets.map((w, i) => (\n <div\n key={w.id}\n draggable={editable}\n onDragStart={editable ? () => setDragIdx(i) : undefined}\n onDragOver={\n editable\n ? (e) => {\n e.preventDefault();\n setOverIdx(i);\n }\n : undefined\n }\n onDrop={\n editable\n ? () => {\n if (dragIdx !== null && dragIdx !== i && onReorder) {\n onReorder(widgets[dragIdx].id, dragIdx, i);\n }\n setDragIdx(null);\n setOverIdx(null);\n }\n : undefined\n }\n onDragEnd={\n editable\n ? () => {\n setDragIdx(null);\n setOverIdx(null);\n }\n : undefined\n }\n className={cn(\n \"overflow-hidden rounded-lg\",\n editable && \"cursor-grab\",\n editable && dragIdx === i && \"opacity-50\",\n editable && overIdx === i && dragIdx !== i && \"ring-accent ring-2\",\n )}\n style={{\n gridColumn: `span ${Math.min(w.w, cols)}`,\n minHeight: w.h * rowHeight,\n }}\n >\n {w.content}\n </div>\n ))}\n </div>\n );\n}\n\nWidgetGrid.displayName = \"WidgetGrid\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../lib/cn\";\nimport { Button } from \"../core/button\";\nimport { Input } from \"../core/input\";\nimport { OPT_FOCUS_VISIBLE } from \"../lib/styles\";\n\n// ── Types ──\n\n/** Type definition for report builder chart type. */\nexport type ReportBuilderChartType =\n | \"line\"\n | \"bar\"\n | \"pie\"\n | \"gauge\"\n | \"scatter\"\n | \"number\"\n | \"table\"\n | \"funnel\"\n | \"retention\";\n\n/** Defines the chart type shape. */\nexport interface ChartTypeDef {\n type: ReportBuilderChartType;\n label: string;\n icon: string;\n}\n\n/** Type definition for report builder step. */\nexport type ReportBuilderStep = \"type\" | \"config\" | \"style\" | \"preview\";\n\n/** Defines the data source shape. */\nexport interface DataSourceDef {\n id: string;\n label: string;\n description?: string;\n}\n\n/** Localized labels for the report builder component. */\nexport interface ReportBuilderLabels {\n /** Stepper label */\n stepsLabel?: string;\n /** Step labels */\n stepType?: string;\n stepConfig?: string;\n stepStyle?: string;\n stepPreview?: string;\n /** Button labels */\n nextButton?: string;\n backButton?: string;\n saveButton?: string;\n cancelButton?: string;\n /** Field labels */\n reportNameLabel?: string;\n reportNamePlaceholder?: string;\n reportDescriptionLabel?: string;\n reportDescriptionPlaceholder?: string;\n dataSourceLabel?: string;\n dataSourcePlaceholder?: string;\n chartTypeHeading?: string;\n /** Empty state */\n noPreview?: string;\n noConfigForm?: string;\n noStyleForm?: string;\n}\n\nconst defaultLabels: Required<ReportBuilderLabels> = {\n stepsLabel: \"Report steps\",\n stepType: \"Chart Type\",\n stepConfig: \"Data Config\",\n stepStyle: \"Style\",\n stepPreview: \"Preview\",\n nextButton: \"Next\",\n backButton: \"Back\",\n saveButton: \"Save Report\",\n cancelButton: \"Cancel\",\n reportNameLabel: \"Report Name\",\n reportNamePlaceholder: \"Untitled Report\",\n reportDescriptionLabel: \"Description\",\n reportDescriptionPlaceholder: \"Optional description\",\n dataSourceLabel: \"Data Source\",\n dataSourcePlaceholder: \"Select a data source…\",\n chartTypeHeading: \"Select Chart Type\",\n noPreview: \"No preview available\",\n noConfigForm: \"No configuration form provided\",\n noStyleForm: \"No style form provided\",\n};\n\nconst DEFAULT_CHART_TYPES: ChartTypeDef[] = [\n { type: \"line\", label: \"Line Chart\", icon: \"\\u2014\" },\n { type: \"bar\", label: \"Bar Chart\", icon: \"\\u2593\" },\n { type: \"pie\", label: \"Pie Chart\", icon: \"\\u25CB\" },\n { type: \"gauge\", label: \"Gauge\", icon: \"\\u25D4\" },\n { type: \"scatter\", label: \"Scatter\", icon: \"\\u2022\" },\n { type: \"number\", label: \"Number\", icon: \"#\" },\n { type: \"table\", label: \"Table\", icon: \"\\u2261\" },\n { type: \"funnel\", label: \"Funnel\", icon: \"\\u25BD\" },\n { type: \"retention\", label: \"Retention\", icon: \"\\u25A6\" },\n];\n\nconst STEPS: ReportBuilderStep[] = [\"type\", \"config\", \"style\", \"preview\"];\n\n// ── Props ──\n\n/**\n * 4-step wizard for building custom reports:\n * 1. **Type** — Select chart type from a grid of options\n * 2. **Config** — Configure data source and chart-specific fields (slot: `configForm`)\n * 3. **Style** — Adjust visual styling (slot: `styleForm`)\n * 4. **Preview** — Live preview of the report (slot: `preview`)\n *\n * Steps 2-4 accept ReactNode slots so the parent can inject domain-specific forms.\n */\nexport interface ReportBuilderProps {\n /** Available chart types. Defaults to the built-in 9 types. */\n chartTypes?: ChartTypeDef[];\n /** Available data sources. */\n dataSources?: DataSourceDef[];\n /** Called when the user saves the report. */\n onSave?: (report: {\n name: string;\n description: string;\n chartType: ReportBuilderChartType;\n dataSourceId: string;\n }) => void;\n /** Called when the user cancels. */\n onCancel?: () => void;\n /** ReactNode slot for chart-specific data configuration (step 2). */\n configForm?: React.ReactNode;\n /** ReactNode slot for chart-specific style configuration (step 3). */\n styleForm?: React.ReactNode;\n /** ReactNode slot for the live chart preview (step 4). */\n preview?: React.ReactNode;\n /** Called when the selected chart type changes. */\n onChartTypeChange?: (type: ReportBuilderChartType) => void;\n /** Called when the selected data source changes. */\n onDataSourceChange?: (dataSourceId: string) => void;\n /** Called when the current step changes. */\n onStepChange?: (step: ReportBuilderStep) => void;\n /** Externally controlled chart type selection. */\n selectedChartType?: ReportBuilderChartType;\n /** Externally controlled data source. */\n selectedDataSource?: string;\n /** Label overrides. */\n labels?: ReportBuilderLabels;\n /** Additional CSS classes. */\n className?: string;\n}\n\n// ── Component ──\n\n/** Renders the report builder component. */\nexport function ReportBuilder({\n chartTypes = DEFAULT_CHART_TYPES,\n dataSources = [],\n onSave,\n onCancel,\n configForm,\n styleForm,\n preview,\n onChartTypeChange,\n onDataSourceChange,\n onStepChange,\n selectedChartType: controlledChartType,\n selectedDataSource: controlledDataSource,\n labels: customLabels,\n className,\n}: ReportBuilderProps) {\n const labels = { ...defaultLabels, ...customLabels };\n\n // ── State ──\n const [stepIndex, setStepIndex] = React.useState(0);\n const [internalChartType, setInternalChartType] =\n React.useState<ReportBuilderChartType | null>(null);\n const [internalDataSource, setInternalDataSource] = React.useState(\"\");\n const [reportName, setReportName] = React.useState(\"\");\n const [reportDescription, setReportDescription] = React.useState(\"\");\n const reportNameId = React.useId();\n const reportDescriptionId = React.useId();\n const dataSourceSelectId = React.useId();\n\n const chartType = controlledChartType ?? internalChartType;\n const dataSourceId = controlledDataSource ?? internalDataSource;\n const currentStep = STEPS[stepIndex];\n\n const stepLabels: Record<ReportBuilderStep, string> = {\n type: labels.stepType,\n config: labels.stepConfig,\n style: labels.stepStyle,\n preview: labels.stepPreview,\n };\n\n // ── Navigation ──\n const canGoNext = (): boolean => {\n if (currentStep === \"type\") return chartType !== null;\n if (currentStep === \"config\") return true;\n if (currentStep === \"style\") return true;\n return false;\n };\n\n const goNext = () => {\n if (stepIndex < STEPS.length - 1) {\n const next = stepIndex + 1;\n setStepIndex(next);\n onStepChange?.(STEPS[next]);\n }\n };\n\n const goBack = () => {\n if (stepIndex > 0) {\n const prev = stepIndex - 1;\n setStepIndex(prev);\n onStepChange?.(STEPS[prev]);\n }\n };\n\n const handleChartTypeSelect = (type: ReportBuilderChartType) => {\n setInternalChartType(type);\n onChartTypeChange?.(type);\n };\n\n const handleDataSourceChange = (id: string) => {\n setInternalDataSource(id);\n onDataSourceChange?.(id);\n };\n\n const handleSave = () => {\n if (!chartType) return;\n onSave?.({\n name: reportName || labels.reportNamePlaceholder,\n description: reportDescription,\n chartType,\n dataSourceId,\n });\n };\n\n return (\n <div\n className={cn(\"gap-group flex flex-col\", className)}\n data-opt-id=\"K9STD\"\n data-opt-slug=\"report-builder.ReportBuilder\"\n >\n {/* ── Step Indicator ── */}\n <ol\n className=\"gap-element flex list-none items-center p-0\"\n aria-label={labels.stepsLabel}\n >\n {STEPS.map((step, i) => (\n <li\n key={step}\n className=\"gap-element flex flex-1 items-center\"\n aria-current={i === stepIndex ? \"step\" : undefined}\n >\n <div\n aria-hidden=\"true\"\n className={cn(\n \"flex h-8 w-8 shrink-0 items-center justify-center rounded-full text-xs font-medium\",\n i <= stepIndex\n ? \"bg-accent text-accent-fg\"\n : \"bg-bg-subtle text-text-secondary\",\n )}\n >\n {i + 1}\n </div>\n <span\n className={cn(\n \"hidden text-sm sm:inline\",\n i <= stepIndex\n ? \"text-text-primary font-medium\"\n : \"text-text-secondary\",\n )}\n >\n {stepLabels[step]}\n </span>\n {i < STEPS.length - 1 && (\n <div\n aria-hidden=\"true\"\n className={cn(\n \"h-px flex-1\",\n i < stepIndex ? \"bg-accent\" : \"bg-border-subtle\",\n )}\n />\n )}\n </li>\n ))}\n </ol>\n\n {/* ── Report name + description (always visible) ── */}\n <div className=\"gap-element flex flex-col sm:flex-row sm:items-end\">\n <div className=\"gap-element flex flex-1 flex-col\">\n <label\n htmlFor={reportNameId}\n className=\"text-text-tertiary text-xs font-medium\"\n >\n {labels.reportNameLabel}\n </label>\n <Input\n id={reportNameId}\n value={reportName}\n onChange={(e) => setReportName(e.target.value)}\n placeholder={labels.reportNamePlaceholder}\n />\n </div>\n <div className=\"gap-element flex flex-1 flex-col\">\n <label\n htmlFor={reportDescriptionId}\n className=\"text-text-tertiary text-xs font-medium\"\n >\n {labels.reportDescriptionLabel}\n </label>\n <Input\n id={reportDescriptionId}\n value={reportDescription}\n onChange={(e) => setReportDescription(e.target.value)}\n placeholder={labels.reportDescriptionPlaceholder}\n />\n </div>\n </div>\n\n {/* ── Step Content ── */}\n <div className=\"border-border bg-surface min-h-[320px] rounded-xl border p-4\">\n {/* Step 1: Chart Type Selection */}\n {currentStep === \"type\" && (\n <div className=\"gap-group flex flex-col\">\n <h3 className=\"text-text-tertiary text-xs font-semibold tracking-wider uppercase\">\n {labels.chartTypeHeading}\n </h3>\n <div className=\"gap-element grid grid-cols-3 sm:grid-cols-5\">\n {chartTypes.map((ct) => (\n <button\n key={ct.type}\n type=\"button\"\n onClick={() => handleChartTypeSelect(ct.type)}\n className={cn(\n \"flex cursor-pointer flex-col items-center justify-center gap-1 rounded-lg border p-3 text-center transition-colors\",\n \"focus-visible:ring-ring focus-visible:ring-2 focus-visible:outline-none\",\n chartType === ct.type\n ? \"border-accent bg-accent-subtle\"\n : \"border-border hover:bg-bg-subtle\",\n )}\n aria-pressed={chartType === ct.type}\n >\n <span className=\"text-xl leading-none\" aria-hidden=\"true\">\n {ct.icon}\n </span>\n <span\n className={cn(\n \"text-xs leading-tight\",\n chartType === ct.type\n ? \"text-accent font-medium\"\n : \"text-text-tertiary\",\n )}\n >\n {ct.label}\n </span>\n </button>\n ))}\n </div>\n\n {/* Data source selection */}\n {dataSources.length > 0 && (\n <div className=\"gap-element flex flex-col\">\n <label\n htmlFor={dataSourceSelectId}\n className=\"text-text-tertiary text-xs font-medium\"\n >\n {labels.dataSourceLabel}\n </label>\n <select\n id={dataSourceSelectId}\n value={dataSourceId}\n onChange={(e) => handleDataSourceChange(e.target.value)}\n className={cn(\n \"border-border text-text-primary bg-surface w-full rounded-lg border px-3 py-2 text-sm\",\n OPT_FOCUS_VISIBLE,\n )}\n >\n <option value=\"\">{labels.dataSourcePlaceholder}</option>\n {dataSources.map((ds) => (\n <option key={ds.id} value={ds.id}>\n {ds.label}\n </option>\n ))}\n </select>\n </div>\n )}\n </div>\n )}\n\n {/* Step 2: Data Configuration (delegated) */}\n {currentStep === \"config\" && (\n <div className=\"gap-group flex flex-col\">\n {configForm ?? (\n <div className=\"text-text-tertiary border-border flex h-48 items-center justify-center rounded-lg border border-dashed text-sm\">\n {labels.noConfigForm}\n </div>\n )}\n </div>\n )}\n\n {/* Step 3: Style Configuration (delegated) */}\n {currentStep === \"style\" && (\n <div className=\"gap-group flex flex-col\">\n {styleForm ?? (\n <div className=\"text-text-tertiary border-border flex h-48 items-center justify-center rounded-lg border border-dashed text-sm\">\n {labels.noStyleForm}\n </div>\n )}\n </div>\n )}\n\n {/* Step 4: Preview (delegated) */}\n {currentStep === \"preview\" && (\n <div className=\"gap-group flex flex-col\">\n {preview ?? (\n <div className=\"text-text-tertiary border-border flex h-48 items-center justify-center rounded-lg border border-dashed text-sm\">\n {labels.noPreview}\n </div>\n )}\n </div>\n )}\n </div>\n\n {/* ── Navigation Buttons ── */}\n <div className=\"flex items-center justify-between\">\n <div className=\"gap-element flex\">\n {stepIndex > 0 ? (\n <Button variant=\"secondary\" onClick={goBack}>\n {labels.backButton}\n </Button>\n ) : onCancel ? (\n <Button variant=\"secondary\" onClick={onCancel}>\n {labels.cancelButton}\n </Button>\n ) : (\n <div />\n )}\n </div>\n <div className=\"gap-element flex\">\n {onCancel && stepIndex > 0 && (\n <Button variant=\"ghost\" onClick={onCancel}>\n {labels.cancelButton}\n </Button>\n )}\n {currentStep === \"preview\" ? (\n <Button variant=\"primary\" onClick={handleSave}>\n {labels.saveButton}\n </Button>\n ) : (\n <Button variant=\"primary\" onClick={goNext} disabled={!canGoNext()}>\n {labels.nextButton}\n </Button>\n )}\n </div>\n </div>\n </div>\n );\n}\n\nReportBuilder.displayName = \"ReportBuilder\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../lib/cn\";\nimport {\n OPT_TEXT_PRIMARY,\n OPT_TEXT_SECONDARY,\n OPT_TEXT_TERTIARY,\n OPT_BORDER,\n OPT_FOCUS_VISIBLE,\n} from \"../lib/styles\";\nimport { Button } from \"../core/button\";\nimport { Badge } from \"../core/badge\";\nimport { EmptyState } from \"../core/empty-state\";\n\n// ── Types ──\n\n/** Defines the audit change shape. */\nexport interface AuditChange {\n field: string;\n before: string;\n after: string;\n}\n\n/** Defines the audit entry shape. */\nexport interface AuditEntry {\n id: string;\n timestamp: string;\n actor: string;\n action: \"created\" | \"updated\" | \"deleted\";\n summary: string;\n changes?: AuditChange[];\n}\n\n// ── Labels ──\n\n/** Localized labels for the audit timeline component. */\nexport interface AuditTimelineLabels {\n title?: string;\n empty?: string;\n expand?: string;\n collapse?: string;\n created?: string;\n updated?: string;\n deleted?: string;\n fieldHeader?: string;\n beforeHeader?: string;\n afterHeader?: string;\n diffArrow?: string;\n}\n\nconst defaultLabels: Required<AuditTimelineLabels> = {\n title: \"변경 이력\",\n empty: \"변경 이력이 없습니다\",\n expand: \"상세 보기\",\n collapse: \"접기\",\n created: \"생성\",\n updated: \"수정\",\n deleted: \"삭제\",\n fieldHeader: \"필드\",\n beforeHeader: \"이전\",\n afterHeader: \"이후\",\n diffArrow: \"→\",\n};\n\n// ── Action config ──\n\nconst actionBadgeVariant: Record<\n AuditEntry[\"action\"],\n \"success\" | \"info\" | \"error\"\n> = {\n created: \"success\",\n updated: \"info\",\n deleted: \"error\",\n};\n\nconst actionDotColor: Record<AuditEntry[\"action\"], string> = {\n created: \"bg-success\",\n updated: \"bg-info\",\n deleted: \"bg-danger\",\n};\n\n// ── Props ──\n\n/** Props for the audit timeline component. */\nexport interface AuditTimelineProps {\n entries: AuditEntry[];\n labels?: AuditTimelineLabels;\n className?: string;\n onEntryClick?: (entry: AuditEntry) => void;\n}\n\n// ── Diff Table ──\n\nfunction DiffTable({\n changes,\n labels,\n}: {\n changes: AuditChange[];\n labels: Required<AuditTimelineLabels>;\n}) {\n return (\n <div\n className={cn(\"mt-2 overflow-hidden rounded-md\", OPT_BORDER)}\n role=\"table\"\n aria-label=\"Field changes\"\n >\n {/* Header */}\n <div\n className=\"gap-element bg-bg-subtle grid grid-cols-[1fr_1fr_auto_1fr] px-3 py-1.5\"\n role=\"row\"\n >\n <span\n className={cn(\n \"text-xs font-semibold tracking-wider uppercase\",\n OPT_TEXT_TERTIARY,\n )}\n role=\"columnheader\"\n >\n {labels.fieldHeader}\n </span>\n <span\n className={cn(\n \"text-xs font-semibold tracking-wider uppercase\",\n OPT_TEXT_TERTIARY,\n )}\n role=\"columnheader\"\n >\n {labels.beforeHeader}\n </span>\n <span aria-hidden=\"true\" />\n <span\n className={cn(\n \"text-xs font-semibold tracking-wider uppercase\",\n OPT_TEXT_TERTIARY,\n )}\n role=\"columnheader\"\n >\n {labels.afterHeader}\n </span>\n </div>\n\n {/* Rows */}\n {changes.map((change) => (\n <div\n key={change.field}\n className=\"gap-element border-border-subtle grid grid-cols-[1fr_1fr_auto_1fr] border-t px-3 py-2\"\n role=\"row\"\n >\n <span\n className={cn(\"text-xs font-medium\", OPT_TEXT_PRIMARY)}\n role=\"cell\"\n >\n {change.field}\n </span>\n <span\n className=\"bg-danger-subtle/50 text-danger-fg rounded px-1.5 py-0.5 text-xs line-through\"\n role=\"cell\"\n >\n {change.before || \"\\u2014\"}\n </span>\n <span className={cn(\"text-xs\", OPT_TEXT_TERTIARY)} aria-hidden=\"true\">\n {labels.diffArrow}\n </span>\n <span\n className=\"bg-success-subtle/50 text-success-fg rounded px-1.5 py-0.5 text-xs\"\n role=\"cell\"\n >\n {change.after || \"\\u2014\"}\n </span>\n </div>\n ))}\n </div>\n );\n}\n\n// ── Component ──\n\n/** Renders the audit timeline component. */\nexport function AuditTimeline({\n entries,\n labels: customLabels,\n className,\n onEntryClick,\n}: AuditTimelineProps) {\n const labels: Required<AuditTimelineLabels> = {\n ...defaultLabels,\n ...customLabels,\n };\n\n const [expandedIds, setExpandedIds] = React.useState<Set<string>>(new Set());\n\n const toggleExpanded = React.useCallback((id: string) => {\n setExpandedIds((prev) => {\n const next = new Set(prev);\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n }\n return next;\n });\n }, []);\n\n const actionLabel = React.useCallback(\n (action: AuditEntry[\"action\"]) => {\n return labels[action];\n },\n [labels],\n );\n\n const handleEntryKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>, entry: AuditEntry) => {\n if (!onEntryClick) return;\n if (event.key !== \"Enter\" && event.key !== \" \") return;\n event.preventDefault();\n onEntryClick(entry);\n },\n [onEntryClick],\n );\n\n if (entries.length === 0) {\n return (\n <EmptyState\n title={labels.empty}\n className={className}\n data-opt-id=\"XJQ8A\"\n data-opt-slug=\"audit-timeline.AuditTimeline\"\n />\n );\n }\n\n return (\n <div\n className={cn(\"gap-group flex flex-col\", className)}\n data-opt-id=\"XJQ8A\"\n data-opt-slug=\"audit-timeline.AuditTimeline\"\n >\n {/* Timeline container */}\n <div className=\"relative\" role=\"list\" aria-label={labels.title}>\n {/* Vertical timeline line */}\n <div\n className=\"bg-border absolute top-3 bottom-3 left-[9px] w-px\"\n aria-hidden=\"true\"\n />\n\n {entries.map((entry) => {\n const isExpanded = expandedIds.has(entry.id);\n const hasChanges = entry.changes && entry.changes.length > 0;\n const entryId = `audit-entry-${entry.id}`;\n const contentId = `audit-content-${entry.id}`;\n\n return (\n <div\n key={entry.id}\n className=\"relative pb-4 pl-8 last:pb-0\"\n role=\"listitem\"\n >\n {/* Timeline dot */}\n <div\n className={cn(\n \"border-surface absolute top-1.5 left-1 h-[14px] w-[14px] rounded-full border-2\",\n actionDotColor[entry.action],\n )}\n aria-hidden=\"true\"\n />\n\n {/* Entry content */}\n <div\n className={cn(\n \"rounded-lg p-3\",\n OPT_BORDER,\n \"bg-surface transition-colors\",\n onEntryClick && \"hover:bg-bg-subtle cursor-pointer\",\n )}\n aria-labelledby={entryId}\n >\n <div\n {...(onEntryClick\n ? {\n role: \"button\" as const,\n tabIndex: 0,\n onClick: () => onEntryClick(entry),\n onKeyDown: (\n event: React.KeyboardEvent<HTMLDivElement>,\n ) => handleEntryKeyDown(event, entry),\n }\n : {})}\n className={cn(\n onEntryClick && \"rounded-md\",\n onEntryClick && OPT_FOCUS_VISIBLE,\n )}\n >\n {/* Header row */}\n <div className=\"gap-element flex items-center\">\n <Badge\n variant={actionBadgeVariant[entry.action]}\n size=\"sm\"\n dot\n >\n {actionLabel(entry.action)}\n </Badge>\n <span className={cn(\"text-xs\", OPT_TEXT_TERTIARY)}>\n <time dateTime={entry.timestamp}>{entry.timestamp}</time>\n </span>\n <span\n className={cn(\n \"ml-auto text-xs font-medium\",\n OPT_TEXT_SECONDARY,\n )}\n >\n {entry.actor}\n </span>\n </div>\n\n {/* Summary */}\n <p\n id={entryId}\n className={cn(\"mt-1.5 text-sm\", OPT_TEXT_PRIMARY)}\n >\n {entry.summary}\n </p>\n </div>\n\n {/* Expand/Collapse button */}\n {hasChanges && (\n <div className=\"mt-2\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className={cn(OPT_FOCUS_VISIBLE)}\n onClick={(e) => {\n e.stopPropagation();\n toggleExpanded(entry.id);\n }}\n aria-expanded={isExpanded}\n aria-controls={contentId}\n >\n {isExpanded ? labels.collapse : labels.expand}\n <svg\n className={cn(\n \"ml-1 h-3.5 w-3.5 transition-transform\",\n isExpanded && \"rotate-180\",\n )}\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n aria-hidden=\"true\"\n >\n <path d=\"M4 6l4 4 4-4\" />\n </svg>\n </Button>\n\n {/* Diff view */}\n {isExpanded && (\n <div\n id={contentId}\n role=\"region\"\n aria-label=\"Field changes\"\n >\n <DiffTable changes={entry.changes!} labels={labels} />\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\nAuditTimeline.displayName = \"AuditTimeline\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../lib/cn\";\nimport { Button } from \"../core/button\";\nimport { Input } from \"../core/input\";\n\n/** Type definition for segment condition type. */\nexport type SegmentConditionType = \"event\" | \"property\" | \"cohort\" | \"custom\";\n\n/** Defines the segment condition shape. */\nexport interface SegmentCondition {\n id: string;\n type: SegmentConditionType;\n field: string;\n operator: string;\n value: string;\n}\n\n/** Defines the segment group shape. */\nexport interface SegmentGroup {\n id: string;\n combinator: \"and\" | \"or\";\n conditions: SegmentCondition[];\n}\n\n/** Props for the segment builder component. */\nexport interface SegmentBuilderProps {\n groups: SegmentGroup[];\n onChange: (groups: SegmentGroup[]) => void;\n eventOptions?: string[];\n propertyOptions?: string[];\n cohortOptions?: string[];\n className?: string;\n labels?: SegmentBuilderLabels;\n}\n\n/** Localized labels for the segment builder component. */\nexport interface SegmentBuilderLabels {\n match?: string;\n ofTheFollowing?: string;\n groupLabel?: string;\n conditionLabel?: string;\n useOrCombinatorAriaLabel?: string;\n conditionTypeLabel?: string;\n fieldLabel?: string;\n customFieldLabel?: string;\n operatorLabel?: string;\n valueLabel?: string;\n removeGroupAriaLabel?: string;\n removeConditionAriaLabel?: string;\n addCondition?: string;\n addGroup?: string;\n}\n\nconst defaultLabels: Required<SegmentBuilderLabels> = {\n match: \"Match\",\n ofTheFollowing: \"of the following\",\n groupLabel: \"Segment group\",\n conditionLabel: \"Condition\",\n useOrCombinatorAriaLabel: \"Use OR matching for segment group\",\n conditionTypeLabel: \"Condition type\",\n fieldLabel: \"Field\",\n customFieldLabel: \"Expression\",\n operatorLabel: \"Operator\",\n valueLabel: \"Value\",\n removeGroupAriaLabel: \"Remove group\",\n removeConditionAriaLabel: \"Remove condition\",\n addCondition: \"+ Add condition\",\n addGroup: \"+ Add group\",\n};\n\nconst CONDITION_TYPES: { value: SegmentConditionType; label: string }[] = [\n { value: \"event\", label: \"Event\" },\n { value: \"property\", label: \"Property\" },\n { value: \"cohort\", label: \"Cohort\" },\n { value: \"custom\", label: \"Custom\" },\n];\n\nconst OPERATORS: Record<\n SegmentConditionType,\n { value: string; label: string }[]\n> = {\n event: [\n { value: \"performed\", label: \"performed\" },\n { value: \"not_performed\", label: \"not performed\" },\n { value: \"performed_count\", label: \"performed count\" },\n { value: \"first_time\", label: \"first time\" },\n ],\n property: [\n { value: \"equals\", label: \"equals\" },\n { value: \"not_equals\", label: \"does not equal\" },\n { value: \"contains\", label: \"contains\" },\n { value: \"gt\", label: \">\" },\n { value: \"lt\", label: \"<\" },\n { value: \"is_set\", label: \"is set\" },\n { value: \"is_not_set\", label: \"is not set\" },\n ],\n cohort: [\n { value: \"in\", label: \"is in\" },\n { value: \"not_in\", label: \"is not in\" },\n ],\n custom: [{ value: \"sql\", label: \"SQL expression\" }],\n};\n\nfunction collectSegmentBuilderIds(groups: SegmentGroup[]) {\n const ids = new Set<string>();\n\n for (const group of groups) {\n ids.add(group.id);\n for (const condition of group.conditions) {\n ids.add(condition.id);\n }\n }\n\n return ids;\n}\n\n/** Renders the segment builder component. */\nexport function SegmentBuilder({\n groups,\n onChange,\n eventOptions = [\"page_view\", \"click\", \"purchase\", \"signup\", \"login\"],\n propertyOptions = [\"country\", \"device\", \"browser\", \"plan\", \"age\"],\n cohortOptions = [\"Active Users\", \"New Users\", \"Power Users\"],\n className,\n labels: customLabels,\n}: SegmentBuilderProps) {\n const labels = { ...defaultLabels, ...customLabels };\n const builderId = React.useId().replace(/:/g, \"\");\n const nextIdRef = React.useRef(1);\n\n const createId = React.useCallback(() => {\n const reservedIds = collectSegmentBuilderIds(groups);\n let id = \"\";\n\n do {\n id = `seg_${nextIdRef.current++}`;\n } while (reservedIds.has(id));\n\n return id;\n }, [groups]);\n\n const addGroup = () => {\n onChange([\n ...groups,\n {\n id: createId(),\n combinator: \"and\",\n conditions: [\n {\n id: createId(),\n type: \"event\",\n field: eventOptions[0],\n operator: \"performed\",\n value: \"\",\n },\n ],\n },\n ]);\n };\n\n const removeGroup = (groupId: string) => {\n onChange(groups.filter((g) => g.id !== groupId));\n };\n\n const updateGroup = (groupId: string, partial: Partial<SegmentGroup>) => {\n onChange(groups.map((g) => (g.id === groupId ? { ...g, ...partial } : g)));\n };\n\n const addCondition = (groupId: string) => {\n onChange(\n groups.map((g) =>\n g.id === groupId\n ? {\n ...g,\n conditions: [\n ...g.conditions,\n {\n id: createId(),\n type: \"event\" as const,\n field: eventOptions[0],\n operator: \"performed\",\n value: \"\",\n },\n ],\n }\n : g,\n ),\n );\n };\n\n const updateCondition = (\n groupId: string,\n condId: string,\n partial: Partial<SegmentCondition>,\n ) => {\n onChange(\n groups.map((g) =>\n g.id === groupId\n ? {\n ...g,\n conditions: g.conditions.map((c) =>\n c.id === condId ? { ...c, ...partial } : c,\n ),\n }\n : g,\n ),\n );\n };\n\n const removeCondition = (groupId: string, condId: string) => {\n onChange(\n groups.map((g) =>\n g.id === groupId\n ? {\n ...g,\n conditions: g.conditions.filter((c) => c.id !== condId),\n }\n : g,\n ),\n );\n };\n\n const getFieldOptions = (type: SegmentConditionType) => {\n switch (type) {\n case \"event\":\n return eventOptions;\n case \"property\":\n return propertyOptions;\n case \"cohort\":\n return cohortOptions;\n case \"custom\":\n return [];\n }\n };\n\n return (\n <div\n className={cn(\"gap-group flex flex-col\", className)}\n data-opt-id=\"ZSC94\"\n data-opt-slug=\"segment-builder.SegmentBuilder\"\n >\n {groups.map((group, gi) => {\n const groupPosition = gi + 1;\n const groupLabelId = `${builderId}-${group.id}-label`;\n\n return (\n <React.Fragment key={group.id}>\n {gi > 0 && (\n <div className=\"flex justify-center\">\n <span className=\"text-text-tertiary text-xs font-semibold uppercase\">\n AND\n </span>\n </div>\n )}\n <div\n className=\"border-border gap-element flex flex-col rounded-lg border p-3\"\n role=\"group\"\n aria-labelledby={groupLabelId}\n >\n <span id={groupLabelId} className=\"sr-only\">\n {labels.groupLabel} {groupPosition}\n </span>\n <div className=\"flex items-center justify-between\">\n <div className=\"gap-element flex items-center\">\n <span className=\"text-text-tertiary text-xs\">\n {labels.match}\n </span>\n <button\n type=\"button\"\n onClick={() =>\n updateGroup(group.id, {\n combinator: group.combinator === \"and\" ? \"or\" : \"and\",\n })\n }\n className=\"bg-accent-subtle text-accent rounded px-2 py-0.5 text-xs font-semibold focus-visible:ring-2 focus-visible:ring-blue-600 focus-visible:outline-none\"\n aria-label={`${labels.useOrCombinatorAriaLabel} ${groupPosition}`}\n aria-pressed={group.combinator === \"or\"}\n >\n {group.combinator.toUpperCase()}\n </button>\n <span className=\"text-text-tertiary text-xs\">\n {labels.ofTheFollowing}\n </span>\n </div>\n {groups.length > 1 && (\n <button\n type=\"button\"\n onClick={() => removeGroup(group.id)}\n className=\"text-text-tertiary hover:text-danger-fg text-xs focus-visible:ring-2 focus-visible:ring-blue-600 focus-visible:outline-none\"\n aria-label={`${labels.removeGroupAriaLabel} ${groupPosition}`}\n >\n ✕\n </button>\n )}\n </div>\n\n {group.conditions.map((cond, ci) => {\n const ops = OPERATORS[cond.type];\n const fields = getFieldOptions(cond.type);\n const needsValue =\n cond.operator !== \"is_set\" &&\n cond.operator !== \"is_not_set\" &&\n cond.operator !== \"performed\" &&\n cond.operator !== \"not_performed\" &&\n cond.operator !== \"first_time\";\n const conditionPosition = `${groupPosition}.${ci + 1}`;\n const conditionLabelId = `${builderId}-${cond.id}-label`;\n\n return (\n <div\n key={cond.id}\n className=\"gap-element flex flex-wrap items-center\"\n role=\"group\"\n aria-labelledby={conditionLabelId}\n >\n <span id={conditionLabelId} className=\"sr-only\">\n {labels.conditionLabel} {conditionPosition}\n </span>\n <select\n value={cond.type}\n onChange={(e) => {\n const newType = e.target.value as SegmentConditionType;\n const newFields = getFieldOptions(newType);\n const newOps = OPERATORS[newType];\n updateCondition(group.id, cond.id, {\n type: newType,\n field: newFields[0] ?? \"\",\n operator: newOps[0]?.value ?? \"\",\n value: \"\",\n });\n }}\n className=\"border-border text-text-primary rounded-md border bg-transparent px-2 py-1 text-sm focus-visible:ring-2 focus-visible:ring-blue-600 focus-visible:outline-none\"\n aria-label={`${labels.conditionTypeLabel} ${conditionPosition}`}\n >\n {CONDITION_TYPES.map((ct) => (\n <option key={ct.value} value={ct.value}>\n {ct.label}\n </option>\n ))}\n </select>\n\n {fields.length > 0 ? (\n <select\n value={cond.field}\n onChange={(e) =>\n updateCondition(group.id, cond.id, {\n field: e.target.value,\n })\n }\n className=\"border-border text-text-primary rounded-md border bg-transparent px-2 py-1 text-sm focus-visible:ring-2 focus-visible:ring-blue-600 focus-visible:outline-none\"\n aria-label={`${labels.fieldLabel} ${conditionPosition}`}\n >\n {fields.map((f) => (\n <option key={f} value={f}>\n {f}\n </option>\n ))}\n </select>\n ) : (\n <Input\n value={cond.field}\n onChange={(e) =>\n updateCondition(group.id, cond.id, {\n field: e.target.value,\n })\n }\n placeholder=\"Expression\"\n className=\"w-32\"\n aria-label={`${labels.customFieldLabel} ${conditionPosition}`}\n />\n )}\n\n <select\n value={cond.operator}\n onChange={(e) =>\n updateCondition(group.id, cond.id, {\n operator: e.target.value,\n })\n }\n className=\"border-border text-text-primary rounded-md border bg-transparent px-2 py-1 text-sm focus-visible:ring-2 focus-visible:ring-blue-600 focus-visible:outline-none\"\n aria-label={`${labels.operatorLabel} ${conditionPosition}`}\n >\n {ops.map((op) => (\n <option key={op.value} value={op.value}>\n {op.label}\n </option>\n ))}\n </select>\n\n {needsValue && (\n <Input\n value={cond.value}\n onChange={(e) =>\n updateCondition(group.id, cond.id, {\n value: e.target.value,\n })\n }\n placeholder=\"Value\"\n className=\"w-28\"\n aria-label={`${labels.valueLabel} ${conditionPosition}`}\n />\n )}\n\n <button\n type=\"button\"\n onClick={() => removeCondition(group.id, cond.id)}\n className=\"text-text-tertiary hover:text-danger-fg text-sm focus-visible:ring-2 focus-visible:ring-blue-600 focus-visible:outline-none\"\n aria-label={`${labels.removeConditionAriaLabel} ${conditionPosition}`}\n >\n ✕\n </button>\n </div>\n );\n })}\n\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => addCondition(group.id)}\n >\n {labels.addCondition}\n </Button>\n </div>\n </React.Fragment>\n );\n })}\n\n <Button variant=\"ghost\" size=\"sm\" onClick={addGroup}>\n {labels.addGroup}\n </Button>\n </div>\n );\n}\n\nSegmentBuilder.displayName = \"SegmentBuilder\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../lib/cn\";\nimport { Button } from \"../core/button\";\nimport { Badge } from \"../core/badge\";\nimport {\n OPT_SURFACE,\n OPT_BORDER,\n OPT_TEXT_PRIMARY,\n OPT_TEXT_SECONDARY,\n} from \"../lib/styles\";\n\n/** Type definition for insight severity. */\nexport type InsightSeverity = \"critical\" | \"warning\" | \"info\";\n\n/** Defines the insight item shape. */\nexport interface InsightItem {\n id: string;\n type: string;\n title: string;\n description: string;\n severity: InsightSeverity;\n eventName?: string;\n metrics?: Record<string, string | number>;\n dismissed?: boolean;\n}\n\n/** Defines the insights stat shape. */\nexport interface InsightsStat {\n id: string;\n label: string;\n count: number;\n severity?: InsightSeverity | \"total\";\n}\n\n/** Defines the detection type shape. */\nexport interface DetectionTypeDef {\n id: string;\n label: string;\n enabled: boolean;\n}\n\n/** Configuration for detection. */\nexport interface DetectionConfig {\n days?: number;\n zScoreThreshold?: number;\n}\n\n/** Localized labels for the insights panel component. */\nexport interface InsightsPanelLabels {\n title?: string;\n dismiss?: string;\n showDismissed?: string;\n hideDismissed?: string;\n emptyTitle?: string;\n emptyDescription?: string;\n detectionTitle?: string;\n daysLabel?: string;\n zScoreLabel?: string;\n}\n\nconst defaultLabels: Required<InsightsPanelLabels> = {\n title: \"Insights\",\n dismiss: \"Dismiss\",\n showDismissed: \"Show dismissed\",\n hideDismissed: \"Hide dismissed\",\n emptyTitle: \"No insights\",\n emptyDescription: \"No anomalies or notable events detected.\",\n detectionTitle: \"Detection Settings\",\n daysLabel: \"Days\",\n zScoreLabel: \"Z-Score\",\n};\n\n/** Props for the insights panel component. */\nexport interface InsightsPanelProps {\n insights: InsightItem[];\n stats?: InsightsStat[];\n /** Detection type toggles (e.g., volume_anomaly, new_event, etc.) */\n detectionTypes?: DetectionTypeDef[];\n onDetectionTypeToggle?: (typeId: string, enabled: boolean) => void;\n /** Detection parameters (lookback days, z-score threshold) */\n detectionConfig?: DetectionConfig;\n onDetectionConfigChange?: (config: DetectionConfig) => void;\n onDismiss?: (id: string) => void;\n onInsightClick?: (insight: InsightItem) => void;\n onStatClick?: (statId: string) => void;\n header?: React.ReactNode;\n actions?: React.ReactNode;\n labels?: InsightsPanelLabels;\n className?: string;\n}\n\nconst severityConfig: Record<\n InsightSeverity,\n { icon: string; color: string; bg: string }\n> = {\n critical: {\n icon: \"!!\",\n color: \"text-danger-fg\",\n bg: \"bg-danger-subtle border-danger\",\n },\n warning: {\n icon: \"!\",\n color: \"text-warning-fg\",\n bg: \"bg-warning-subtle border-warning\",\n },\n info: {\n icon: \"i\",\n color: \"text-info-fg\",\n bg: \"bg-info-subtle border-info\",\n },\n};\n\n/** Renders the insights panel component. */\nexport function InsightsPanel({\n insights,\n stats,\n detectionTypes,\n onDetectionTypeToggle,\n detectionConfig,\n onDetectionConfigChange,\n onDismiss,\n onInsightClick,\n onStatClick,\n header,\n actions,\n labels: customLabels,\n className,\n}: InsightsPanelProps) {\n const labels = { ...defaultLabels, ...customLabels };\n const [showDismissed, setShowDismissed] = React.useState(false);\n\n const visibleInsights = showDismissed\n ? insights\n : insights.filter((i) => !i.dismissed);\n const hasStats = stats && stats.length > 0;\n const hasDetection =\n (detectionTypes && detectionTypes.length > 0) || detectionConfig != null;\n const isEmpty = visibleInsights.length === 0;\n\n return (\n <div\n className={cn(\"gap-group flex flex-col\", className)}\n data-opt-id=\"HCYZV\"\n data-opt-slug=\"insights-panel.InsightsPanel\"\n >\n {header || actions ? (\n <div className=\"flex items-center justify-between\">\n {header && <div>{header}</div>}\n {actions && (\n <div className=\"gap-element flex items-center\">{actions}</div>\n )}\n </div>\n ) : (\n <div className=\"flex items-center justify-between\">\n <h2 className=\"text-text-primary text-lg font-semibold\">\n {labels.title}\n </h2>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setShowDismissed((v) => !v)}\n >\n {showDismissed ? labels.hideDismissed : labels.showDismissed}\n </Button>\n </div>\n )}\n\n {hasDetection && (\n <div className={cn(\"rounded-lg border p-3\", OPT_SURFACE, OPT_BORDER)}>\n <h3 className={cn(\"mb-2 text-xs font-medium\", OPT_TEXT_SECONDARY)}>\n {labels.detectionTitle}\n </h3>\n {detectionTypes && detectionTypes.length > 0 && (\n <div className=\"mb-2 flex flex-wrap gap-1.5\">\n {detectionTypes.map((dt) => (\n <button\n key={dt.id}\n type=\"button\"\n onClick={() => onDetectionTypeToggle?.(dt.id, !dt.enabled)}\n className={cn(\n \"focus-visible:ring-accent rounded-md px-2.5 py-1 text-xs font-medium transition-colors focus-visible:ring-2 focus-visible:outline-none\",\n dt.enabled\n ? \"bg-accent text-accent-fg\"\n : \"bg-bg-subtle text-text-secondary\",\n )}\n >\n {dt.label}\n </button>\n ))}\n </div>\n )}\n {detectionConfig != null && onDetectionConfigChange && (\n <div className=\"gap-group flex items-center\">\n <label className=\"flex items-center gap-1.5 text-xs\">\n <span className={OPT_TEXT_SECONDARY}>{labels.daysLabel}</span>\n <input\n type=\"number\"\n min={1}\n max={365}\n value={detectionConfig.days ?? 30}\n onChange={(e) =>\n onDetectionConfigChange({\n ...detectionConfig,\n days: Number(e.target.value) || 30,\n })\n }\n className={cn(\n \"w-16 rounded-md border px-2 py-1 text-xs\",\n OPT_BORDER,\n OPT_TEXT_PRIMARY,\n \"bg-transparent\",\n )}\n />\n </label>\n <label className=\"flex items-center gap-1.5 text-xs\">\n <span className={OPT_TEXT_SECONDARY}>{labels.zScoreLabel}</span>\n <input\n type=\"number\"\n min={0}\n max={10}\n step={0.1}\n value={detectionConfig.zScoreThreshold ?? 2.0}\n onChange={(e) =>\n onDetectionConfigChange({\n ...detectionConfig,\n zScoreThreshold: Number(e.target.value) || 2.0,\n })\n }\n className={cn(\n \"w-16 rounded-md border px-2 py-1 text-xs\",\n OPT_BORDER,\n OPT_TEXT_PRIMARY,\n \"bg-transparent\",\n )}\n />\n </label>\n </div>\n )}\n </div>\n )}\n\n {hasStats && (\n <div className=\"gap-group grid grid-cols-2 sm:grid-cols-4\">\n {stats.map((s) => (\n <button\n key={s.id}\n type=\"button\"\n onClick={() => onStatClick?.(s.id)}\n className={cn(\n OPT_SURFACE,\n OPT_BORDER,\n \"hover:bg-bg-subtle flex flex-col items-center gap-1 rounded-lg p-3 text-center transition-colors\",\n onStatClick && \"cursor-pointer\",\n )}\n >\n <span className={cn(\"text-2xl font-bold\", OPT_TEXT_PRIMARY)}>\n {s.count}\n </span>\n <span className={cn(\"text-xs\", OPT_TEXT_SECONDARY)}>\n {s.label}\n </span>\n </button>\n ))}\n </div>\n )}\n\n {isEmpty ? (\n <div\n role=\"status\"\n className=\"flex flex-col items-center justify-center py-12 text-center\"\n >\n <h3 className=\"text-text-primary text-lg font-medium\">\n {labels.emptyTitle}\n </h3>\n <p className=\"text-text-tertiary mt-1 text-sm\">\n {labels.emptyDescription}\n </p>\n </div>\n ) : (\n <div className=\"gap-element flex flex-col\">\n {visibleInsights.map((insight) => {\n const config = severityConfig[insight.severity];\n const Wrapper = onInsightClick ? \"button\" : \"div\";\n return (\n <Wrapper\n key={insight.id}\n className={cn(\n \"w-full rounded-lg border p-4 text-left\",\n config.bg,\n insight.dismissed && \"opacity-50\",\n onInsightClick && \"cursor-pointer\",\n )}\n {...(onInsightClick\n ? {\n type: \"button\" as const,\n onClick: () => onInsightClick(insight),\n }\n : {})}\n >\n <div className=\"gap-group flex items-start justify-between\">\n <div className=\"gap-group flex items-start\">\n <span\n className={cn(\n \"mt-0.5 inline-flex h-6 w-6 shrink-0 items-center justify-center rounded-full text-xs font-bold\",\n config.color,\n \"bg-surface/60\",\n )}\n aria-hidden=\"true\"\n >\n {config.icon}\n </span>\n <div className=\"min-w-0\">\n <div className=\"gap-element flex items-center\">\n <span\n className={cn(\n \"text-sm font-medium\",\n OPT_TEXT_PRIMARY,\n )}\n >\n {insight.title}\n </span>\n <Badge\n variant={\n insight.severity === \"critical\"\n ? \"error\"\n : insight.severity\n }\n size=\"sm\"\n >\n {insight.severity}\n </Badge>\n {insight.eventName && (\n <code className=\"text-text-tertiary text-xs\">\n {insight.eventName}\n </code>\n )}\n </div>\n <p className={cn(\"mt-0.5 text-sm\", OPT_TEXT_SECONDARY)}>\n {insight.description}\n </p>\n {insight.metrics &&\n Object.keys(insight.metrics).length > 0 && (\n <div className=\"gap-group mt-2 flex flex-wrap\">\n {Object.entries(insight.metrics).map(\n ([key, val]) => (\n <span\n key={key}\n className=\"text-text-tertiary text-xs\"\n >\n <span className=\"font-medium\">{key}:</span>{\" \"}\n {val}\n </span>\n ),\n )}\n </div>\n )}\n </div>\n </div>\n {onDismiss && !insight.dismissed && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={(e) => {\n e.stopPropagation();\n onDismiss(insight.id);\n }}\n className=\"shrink-0\"\n >\n {labels.dismiss}\n </Button>\n )}\n </div>\n </Wrapper>\n );\n })}\n </div>\n )}\n </div>\n );\n}\n\nInsightsPanel.displayName = \"InsightsPanel\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../lib/cn\";\nimport { Button } from \"../core/button\";\nimport { DateRangePicker } from \"../core/date-range-picker\";\nimport type { DateRange, DateRangePreset } from \"../core/date-range-picker\";\n\n/** Defines the time preset shape. */\nexport interface TimePresetDef {\n label: string;\n days: number;\n}\n\n/** Localized labels for the time range selector component. */\nexport interface TimeRangeSelectorLabels {\n title?: string;\n placeholder?: string;\n}\n\n/** Props for the time range selector component. */\nexport interface TimeRangeSelectorProps {\n value?: DateRange;\n onChange?: (range: DateRange) => void;\n presets?: TimePresetDef[];\n labels?: TimeRangeSelectorLabels;\n className?: string;\n}\n\nconst DEFAULT_PRESETS: TimePresetDef[] = [\n { label: \"Today\", days: 0 },\n { label: \"Last 7d\", days: 7 },\n { label: \"Last 30d\", days: 30 },\n { label: \"Last 90d\", days: 90 },\n];\n\nfunction presetToRange(days: number): DateRange {\n const end = new Date();\n end.setHours(0, 0, 0, 0);\n if (days === 0) return { start: new Date(end), end: new Date(end) };\n const start = new Date(end);\n start.setDate(start.getDate() - (days - 1));\n return { start, end };\n}\n\n/** Renders the time range selector component. */\nexport function TimeRangeSelector({\n value,\n onChange,\n presets = DEFAULT_PRESETS,\n labels,\n className,\n}: TimeRangeSelectorProps) {\n const [localRange, setLocalRange] = React.useState<DateRange>({\n start: null,\n end: null,\n });\n const range = value ?? localRange;\n const setRange = onChange ?? setLocalRange;\n\n const handlePreset = React.useCallback(\n (days: number) => {\n setRange(presetToRange(days));\n },\n [setRange],\n );\n\n // Convert TimePresetDef[] to DateRangePreset[] for DateRangePicker\n const datePickerPresets: DateRangePreset[] = React.useMemo(\n () =>\n presets.map((p) => ({\n label: p.label,\n range: () => presetToRange(p.days),\n })),\n [presets],\n );\n\n if (presets.length === 0) {\n return (\n <DateRangePicker\n value={range}\n onChange={setRange}\n placeholder={labels?.placeholder ?? \"Select time range\"}\n label={labels?.title}\n triggerClassName=\"flex h-10 items-center gap-2 rounded-lg px-3 text-sm text-text-secondary transition-colors hover:bg-bg-subtle hover:text-text-primary\"\n data-opt-id=\"K0D7C\"\n data-opt-slug=\"time-range-selector.TimeRangeSelector\"\n />\n );\n }\n\n return (\n <div\n className={cn(\n \"border-border bg-surface inline-flex items-center rounded-lg border\",\n className,\n )}\n data-opt-id=\"K0D7C\"\n data-opt-slug=\"time-range-selector.TimeRangeSelector\"\n >\n {/* Quick presets as buttons */}\n <div className=\"hidden items-center sm:flex\">\n {presets.map((p) => (\n <Button\n key={p.label}\n variant=\"ghost\"\n size=\"md\"\n onClick={() => handlePreset(p.days)}\n >\n {p.label}\n </Button>\n ))}\n </div>\n\n <DateRangePicker\n value={range}\n onChange={setRange}\n presets={datePickerPresets}\n placeholder={labels?.placeholder ?? \"Select time range\"}\n label={labels?.title}\n triggerClassName=\"flex h-10 items-center gap-2 rounded-lg px-3 text-sm text-text-secondary hover:bg-bg-subtle hover:text-text-primary transition-colors cursor-pointer\"\n />\n </div>\n );\n}\n\nTimeRangeSelector.displayName = \"TimeRangeSelector\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../lib/cn\";\nimport {\n DropdownMenu,\n DropdownTrigger,\n DropdownContent,\n DropdownItem,\n DropdownSeparator,\n} from \"../core/dropdown-menu\";\nimport {\n DialogRoot,\n DialogPanel,\n DialogHeading,\n DialogDescription,\n DialogHeader,\n DialogBody,\n DialogFooter,\n} from \"../core/dialog\";\nimport { Button } from \"../core/button\";\nimport type { ExportFormat, ExportColumn } from \"../lib/types\";\n\n/** Localized labels for the export button component. */\nexport interface ExportButtonLabels {\n export?: string;\n csv?: string;\n json?: string;\n pdf?: string;\n guidedTitle?: string;\n guidedDescription?: (rows: number, format: string) => string;\n format?: string;\n cancel?: string;\n}\n\n/** Props for the export button component. */\nexport interface ExportButtonProps {\n data: Record<string, unknown>[];\n columns?: ExportColumn[];\n fileName?: string;\n formats?: ExportFormat[];\n onExport?: (format: ExportFormat) => void;\n labels?: ExportButtonLabels;\n /** Show a step-by-step dialog instead of a dropdown */\n guided?: boolean;\n className?: string;\n}\n\nfunction toCsv(\n data: Record<string, unknown>[],\n columns?: ExportColumn[],\n): string {\n if (data.length === 0) return \"\";\n const cols =\n columns ?? Object.keys(data[0]).map((k) => ({ key: k, header: k }));\n const header = cols.map((c) => `\"${c.header}\"`).join(\",\");\n const rows = data.map((row) =>\n cols\n .map((c) => {\n const val = row[c.key];\n return `\"${String(val ?? \"\").replace(/\"/g, '\"\"')}\"`;\n })\n .join(\",\"),\n );\n return [header, ...rows].join(\"\\n\");\n}\n\nfunction toJson(data: Record<string, unknown>[]): string {\n return JSON.stringify(data, null, 2);\n}\n\nfunction download(content: string, fileName: string, mime: string) {\n const blob = new Blob([content], { type: mime });\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = fileName;\n a.click();\n URL.revokeObjectURL(url);\n}\n\n/** Renders the export button component. */\nexport function ExportButton({\n data,\n columns,\n fileName = \"export\",\n formats = [\"csv\", \"json\"],\n onExport,\n labels: customLabels,\n guided = false,\n className,\n}: ExportButtonProps) {\n const [guidedOpen, setGuidedOpen] = React.useState(false);\n const [guidedFormat, setGuidedFormat] = React.useState<ExportFormat>(\n formats[0],\n );\n const labels = {\n export: \"Export\",\n csv: \"CSV\",\n json: \"JSON\",\n pdf: \"PDF\",\n guidedTitle: \"Export Data\",\n guidedDescription: (rows: number, format: string) =>\n `${rows} rows will be exported as ${format}.`,\n format: \"Format\",\n cancel: \"Cancel\",\n confirm: \"Export\",\n ...customLabels,\n };\n\n const handleExport = React.useCallback(\n (format: ExportFormat) => {\n if (onExport) {\n onExport(format);\n return;\n }\n if (format === \"csv\") {\n download(toCsv(data, columns), `${fileName}.csv`, \"text/csv\");\n } else if (format === \"json\") {\n download(toJson(data), `${fileName}.json`, \"application/json\");\n }\n // PDF is delegated to onExport callback\n },\n [data, columns, fileName, onExport],\n );\n\n const formatLabels: Record<ExportFormat, string> = {\n csv: labels.csv,\n json: labels.json,\n pdf: labels.pdf,\n };\n\n if (guided) {\n return (\n <div\n className=\"inline-flex\"\n data-opt-id=\"MGP2B\"\n data-opt-slug=\"export-button.ExportButton\"\n >\n <Button\n variant=\"secondary\"\n size=\"sm\"\n className={cn(className)}\n onClick={() => setGuidedOpen(true)}\n aria-label={labels.export}\n >\n <span aria-hidden=\"true\">⬇</span>\n {labels.export}\n </Button>\n <DialogRoot open={guidedOpen} onOpenChange={setGuidedOpen}>\n <DialogPanel size=\"xs\">\n <DialogHeader>\n <DialogHeading className=\"text-sm\">\n {labels.guidedTitle}\n </DialogHeading>\n <DialogDescription>\n {labels.guidedDescription(\n data.length,\n formatLabels[guidedFormat],\n )}\n </DialogDescription>\n </DialogHeader>\n <DialogBody>\n <div className=\"gap-element flex flex-col\">\n <label className=\"text-text-secondary text-xs\">\n {labels.format}\n </label>\n <div className=\"gap-element flex\">\n {formats.map((fmt) => (\n <button\n key={fmt}\n type=\"button\"\n onClick={() => setGuidedFormat(fmt)}\n className={cn(\n \"focus-visible:ring-accent rounded-md border px-3 py-1.5 text-sm focus-visible:ring-2 focus-visible:outline-none\",\n guidedFormat === fmt\n ? \"border-accent bg-accent/10 text-accent\"\n : \"border-border text-text-secondary\",\n )}\n >\n {formatLabels[fmt]}\n </button>\n ))}\n </div>\n </div>\n </DialogBody>\n <DialogFooter>\n <Button variant=\"ghost\" onClick={() => setGuidedOpen(false)}>\n {labels.cancel}\n </Button>\n <Button\n onClick={() => {\n handleExport(guidedFormat);\n setGuidedOpen(false);\n }}\n >\n {labels.confirm}\n </Button>\n </DialogFooter>\n </DialogPanel>\n </DialogRoot>\n </div>\n );\n }\n\n return (\n <DropdownMenu\n data-opt-id=\"MGP2B\"\n data-opt-slug=\"export-button.ExportButton\"\n >\n <DropdownTrigger\n className={cn(\n \"inline-flex items-center justify-center rounded-lg font-medium transition-colors\",\n \"border-border bg-surface text-text-primary hover:bg-bg-subtle active:bg-bg-muted border\",\n \"h-8 gap-1.5 px-3 text-xs\",\n className,\n )}\n aria-label={labels.export}\n >\n <span aria-hidden=\"true\">⬇</span>\n {labels.export}\n </DropdownTrigger>\n <DropdownContent>\n {formats.map((fmt, i) => (\n <React.Fragment key={fmt}>\n {i > 0 && fmt === \"pdf\" && <DropdownSeparator />}\n <DropdownItem onClick={() => handleExport(fmt)}>\n {formatLabels[fmt]}\n </DropdownItem>\n </React.Fragment>\n ))}\n </DropdownContent>\n </DropdownMenu>\n );\n}\n\nExportButton.displayName = \"ExportButton\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../lib/cn\";\nimport { EmptyState } from \"../core/empty-state\";\nimport { StatCard } from \"../core/stat-card\";\nimport { SkeletonCard } from \"../core/skeleton\";\nimport type { StatCard as StatCardType } from \"../lib/types\";\n\n/** Localized labels for the summary row component. */\nexport interface SummaryRowLabels {\n emptyTitle?: string;\n emptyDescription?: string;\n}\n\n/** Props for the summary row component. */\nexport interface SummaryRowProps {\n stats: StatCardType[];\n columns?: 2 | 3 | 4;\n onStatClick?: (stat: StatCardType) => void;\n formatValue?: (stat: StatCardType) => string;\n durationFractionDigits?: number;\n percentageFractionDigits?: number;\n loading?: boolean;\n labels?: SummaryRowLabels;\n className?: string;\n}\n\nconst defaultLabels: Required<SummaryRowLabels> = {\n emptyTitle: \"No summary stats\",\n emptyDescription: \"Provide at least one stat to render the summary row.\",\n};\n\nfunction formatDuration(\n value: number,\n unit: StatCardType[\"durationUnit\"],\n fractionDigits: number,\n): string {\n if (unit === \"s\") {\n return `${value.toFixed(fractionDigits)}s`;\n }\n\n if (value >= 1000) {\n return `${(value / 1000).toFixed(fractionDigits)}s`;\n }\n\n return `${value.toFixed(0)}ms`;\n}\n\nfunction formatByStatType(\n stat: StatCardType,\n durationFractionDigits: number,\n percentageFractionDigits: number,\n): string {\n if (\n typeof stat.rawValue !== \"number\" ||\n !stat.format ||\n stat.format === \"text\"\n ) {\n return stat.value;\n }\n\n if (stat.format === \"duration\") {\n return formatDuration(\n stat.rawValue,\n stat.durationUnit,\n durationFractionDigits,\n );\n }\n\n if (stat.format === \"percentage\") {\n return `${stat.rawValue.toFixed(percentageFractionDigits)}%`;\n }\n\n return stat.value;\n}\n\nconst colsClass = {\n 2: \"grid-cols-1 sm:grid-cols-2\",\n 3: \"grid-cols-1 sm:grid-cols-3\",\n 4: \"grid-cols-2 sm:grid-cols-4\",\n} as const;\n\n/** Renders the summary row component. */\nexport function SummaryRow({\n stats,\n columns = 4,\n onStatClick,\n formatValue,\n durationFractionDigits = 1,\n percentageFractionDigits = 1,\n loading = false,\n labels: customLabels,\n className,\n}: SummaryRowProps) {\n const labels = { ...defaultLabels, ...customLabels };\n\n if (loading) {\n return (\n <div\n className={cn(\"gap-group grid\", colsClass[columns], className)}\n data-opt-id=\"DA0AX\"\n data-opt-slug=\"summary-row.SummaryRow\"\n >\n {Array.from({ length: columns }).map((_, i) => (\n <SkeletonCard key={i} />\n ))}\n </div>\n );\n }\n\n if (stats.length === 0) {\n return (\n <div\n className={cn(\"flex min-h-40 items-center justify-center\", className)}\n data-opt-id=\"DA0AX\"\n data-opt-slug=\"summary-row.SummaryRow\"\n >\n <EmptyState\n title={labels.emptyTitle}\n description={labels.emptyDescription}\n />\n </div>\n );\n }\n\n return (\n <div\n className={cn(\"gap-group grid\", colsClass[columns], className)}\n data-opt-id=\"DA0AX\"\n data-opt-slug=\"summary-row.SummaryRow\"\n >\n {stats.map((s) => {\n const displayValue = formatValue\n ? formatValue(s)\n : formatByStatType(\n s,\n durationFractionDigits,\n percentageFractionDigits,\n );\n const card = (\n <StatCard\n key={s.id}\n id={s.id}\n title={s.title}\n value={displayValue}\n change={s.change}\n trend={s.trend}\n />\n );\n\n if (onStatClick) {\n return (\n <button\n key={s.id}\n type=\"button\"\n onClick={() => onStatClick(s)}\n className=\"rounded-lg text-left transition-transform hover:scale-[1.02] focus-visible:ring-2 focus-visible:ring-blue-600 focus-visible:ring-offset-2\"\n >\n {card}\n </button>\n );\n }\n\n return card;\n })}\n </div>\n );\n}\n\nSummaryRow.displayName = \"SummaryRow\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../lib/cn\";\nimport {\n SelectRoot,\n SelectTrigger,\n SelectPopover,\n SelectItem,\n} from \"../core/select\";\nimport { Button } from \"../core/button\";\n\n/** Defines the comparison option shape. */\nexport interface ComparisonOption {\n value: string;\n label: string;\n}\n\n/** Localized labels for the comparison selector component. */\nexport interface ComparisonSelectorLabels {\n groupLabel?: string;\n selectorA?: string;\n selectorB?: string;\n swap?: string;\n maxReached?: string;\n}\n\n/** Props for the comparison selector component. */\nexport interface ComparisonSelectorProps {\n segments: ComparisonOption[];\n valueA?: string;\n valueB?: string;\n onChangeA?: (value: string) => void;\n onChangeB?: (value: string) => void;\n /** Multi-select mode: selected values (overrides A/B selectors) */\n values?: string[];\n /** Called when multi-select values change */\n onValuesChange?: (values: string[]) => void;\n /** Maximum selectable items in multi-select mode (default: 5) */\n maxItems?: number;\n labels?: ComparisonSelectorLabels;\n className?: string;\n}\n\n/** Renders the comparison selector component. */\nexport function ComparisonSelector({\n segments,\n valueA,\n valueB,\n onChangeA,\n onChangeB,\n values,\n onValuesChange,\n maxItems = 5,\n labels: customLabels,\n className,\n}: ComparisonSelectorProps) {\n const selectorId = React.useId().replace(/:/g, \"\");\n const labels = {\n groupLabel: \"Comparison selector\",\n selectorA: \"Base\",\n selectorB: \"Compare\",\n swap: \"Swap\",\n maxReached: \"Max items reached\",\n ...customLabels,\n };\n\n const handleSwap = React.useCallback(() => {\n const a = valueA;\n const b = valueB;\n onChangeA?.(b ?? \"\");\n onChangeB?.(a ?? \"\");\n }, [valueA, valueB, onChangeA, onChangeB]);\n\n // Multi-select mode\n if (onValuesChange) {\n const selected = values ?? [];\n const atMax = selected.length >= maxItems;\n return (\n <div\n className={cn(\"gap-group flex flex-wrap items-center\", className)}\n role=\"group\"\n aria-label={labels.groupLabel}\n data-opt-id=\"2EH9H\"\n data-opt-slug=\"comparison-selector.ComparisonSelector\"\n >\n {segments.map((s) => {\n const isSelected = selected.includes(s.value);\n return (\n <button\n key={s.value}\n type=\"button\"\n onClick={() => {\n if (isSelected) {\n onValuesChange(selected.filter((v) => v !== s.value));\n } else if (!atMax) {\n onValuesChange([...selected, s.value]);\n }\n }}\n disabled={!isSelected && atMax}\n aria-pressed={isSelected}\n className={cn(\n \"rounded-full px-3 py-1.5 text-sm font-medium transition-colors\",\n isSelected\n ? \"bg-accent-subtle text-text-primary\"\n : \"bg-bg-subtle text-text-tertiary hover:text-text-secondary\",\n !isSelected && atMax && \"cursor-not-allowed opacity-50\",\n )}\n >\n {s.label}\n </button>\n );\n })}\n </div>\n );\n }\n\n const selectorALabelId = `${selectorId}-selector-a-label`;\n const selectorBLabelId = `${selectorId}-selector-b-label`;\n const selectorAValueId = `${selectorId}-selector-a-value`;\n const selectorBValueId = `${selectorId}-selector-b-value`;\n const selectorAText =\n segments.find((s) => s.value === valueA)?.label ?? \"Select…\";\n const selectorBText =\n segments.find((s) => s.value === valueB)?.label ?? \"Select…\";\n\n return (\n <div\n className={cn(\"gap-group flex items-end\", className)}\n role=\"group\"\n aria-label={labels.groupLabel}\n data-opt-id=\"2EH9H\"\n data-opt-slug=\"comparison-selector.ComparisonSelector\"\n >\n {/* Selector A */}\n <div className=\"flex flex-col gap-1.5\">\n <span\n id={selectorALabelId}\n className=\"text-text-tertiary text-xs font-medium\"\n >\n {labels.selectorA}\n </span>\n <SelectRoot\n value={valueA}\n onValueChange={(v) => onChangeA?.(v as string)}\n >\n <SelectTrigger\n aria-labelledby={`${selectorALabelId} ${selectorAValueId}`}\n className=\"min-w-[140px]\"\n >\n <span id={selectorAValueId}>{selectorAText}</span>\n </SelectTrigger>\n <SelectPopover>\n {segments.map((s) => (\n <SelectItem key={s.value} value={s.value}>\n {s.label}\n </SelectItem>\n ))}\n </SelectPopover>\n </SelectRoot>\n </div>\n\n {/* Swap button */}\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={handleSwap}\n aria-label={labels.swap}\n className=\"mb-0.5\"\n >\n ⇄\n </Button>\n\n {/* Selector B */}\n <div className=\"flex flex-col gap-1.5\">\n <span\n id={selectorBLabelId}\n className=\"text-text-tertiary text-xs font-medium\"\n >\n {labels.selectorB}\n </span>\n <SelectRoot\n value={valueB}\n onValueChange={(v) => onChangeB?.(v as string)}\n >\n <SelectTrigger\n aria-labelledby={`${selectorBLabelId} ${selectorBValueId}`}\n className=\"min-w-[140px]\"\n >\n <span id={selectorBValueId}>{selectorBText}</span>\n </SelectTrigger>\n <SelectPopover>\n {segments.map((s) => (\n <SelectItem key={s.value} value={s.value}>\n {s.label}\n </SelectItem>\n ))}\n </SelectPopover>\n </SelectRoot>\n </div>\n </div>\n );\n}\n\nComparisonSelector.displayName = \"ComparisonSelector\";\n","/**\n * presets/index.ts\n *\n * Single registry of theme preset metadata. Each entry pairs a stable id\n * (used in `<html data-theme>` and localStorage) with display metadata and an\n * optional `PaletteConfig` that approximates the preset's seed for the\n * ThemeSwitcher swatch row and \"clone to custom\" workflow.\n *\n * Token values themselves currently live in the sibling `*.css` files. A\n * follow-up sub-phase will migrate the full token tables into this file and\n * have a codegen step emit the CSS, but the metadata layer is enough to\n * unblock dynamic ThemeSwitcher rendering and type-safe preset id unions.\n */\n\nimport type { PaletteConfig } from \"@reopt-ai/opt-palette\";\n\nexport interface ThemeDescriptor {\n /** Stable id used in `<html data-theme=\"...\">` and localStorage. */\n readonly id: string;\n /** Human-readable label shown in ThemeSwitcher. */\n readonly label: string;\n /** Short description shown under the label. */\n readonly description: string;\n /**\n * Optional engine input that approximates this preset. Used by\n * ThemeSwitcher to derive swatches when `switcherSwatches` is omitted, and\n * as the starting point when a user clones a preset into a custom palette.\n * Codegen does NOT consume this in the current phase — the static `*.css`\n * file remains the source of token values.\n */\n readonly palette?: PaletteConfig;\n /**\n * Three CSS color strings for the ThemeSwitcher swatch row. Falls back to\n * the live `--opt-accent` / `--opt-surface` / `--opt-text` tokens when\n * omitted.\n */\n readonly switcherSwatches?: readonly [string, string, string];\n /** Disable dark variant generation entirely. */\n readonly forceLightOnly?: boolean;\n}\n\nconst DEFAULT_DESCRIPTOR: ThemeDescriptor = {\n id: \"default\",\n label: \"Default\",\n description: \"Blue accent, balanced radius & shadow\",\n palette: {\n seed: \"#2563eb\",\n harmony: \"split-complementary\",\n radiusScale: \"medium\",\n shadowIntensity: \"subtle\",\n neutralTemperature: \"cool\",\n },\n switcherSwatches: [\"hsl(221 83% 53%)\", \"hsl(142 71% 45%)\", \"hsl(38 92% 50%)\"],\n};\n\nconst MINIMAL_DESCRIPTOR: ThemeDescriptor = {\n id: \"minimal\",\n label: \"Minimal\",\n description: \"Monochrome, no shadow, sharp edges\",\n palette: {\n seed: \"#333333\",\n harmony: \"analogous\",\n radiusScale: \"sharp\",\n shadowIntensity: \"none\",\n neutralTemperature: \"cool\",\n },\n switcherSwatches: [\"hsl(0 0% 20%)\", \"hsl(0 0% 45%)\", \"hsl(0 0% 70%)\"],\n};\n\nconst NATURAL_DESCRIPTOR: ThemeDescriptor = {\n id: \"natural\",\n label: \"Natural\",\n description: \"Always light — sage accent, warm cream\",\n forceLightOnly: true,\n palette: {\n seed: \"#5a9376\",\n harmony: \"complementary\",\n radiusScale: \"medium\",\n shadowIntensity: \"subtle\",\n neutralTemperature: \"warm\",\n },\n switcherSwatches: [\"hsl(155 38% 45%)\", \"hsl(25 65% 55%)\", \"hsl(45 75% 50%)\"],\n};\n\nconst PRO_DESCRIPTOR: ThemeDescriptor = {\n id: \"pro\",\n label: \"Pro\",\n description: \"Neon blue accent, mono headings, ultra-dense\",\n palette: {\n seed: \"#0080ff\",\n harmony: \"tetradic\",\n radiusScale: \"sharp\",\n shadowIntensity: \"subtle\",\n neutralTemperature: \"cool\",\n },\n switcherSwatches: [\n \"hsl(210 100% 55%)\",\n \"hsl(170 90% 48%)\",\n \"hsl(290 85% 60%)\",\n ],\n};\n\nconst MONO_DARK_DESCRIPTOR: ThemeDescriptor = {\n id: \"mono-dark\",\n label: \"Mono Dark\",\n description: \"OLED-friendly black, neon cyan accent, mono headings\",\n palette: {\n seed: \"#00d4ff\",\n harmony: \"tetradic\",\n radiusScale: \"sharp\",\n shadowIntensity: \"subtle\",\n neutralTemperature: \"cool\",\n },\n switcherSwatches: [\"hsl(190 100% 50%)\", \"hsl(0 0% 8%)\", \"hsl(280 90% 65%)\"],\n};\n\nexport const THEME_REGISTRY = {\n default: DEFAULT_DESCRIPTOR,\n minimal: MINIMAL_DESCRIPTOR,\n natural: NATURAL_DESCRIPTOR,\n pro: PRO_DESCRIPTOR,\n \"mono-dark\": MONO_DARK_DESCRIPTOR,\n} as const satisfies Record<string, ThemeDescriptor>;\n\n/** Compile-time-derived union of registered preset ids. */\nexport type ThemePresetId = keyof typeof THEME_REGISTRY;\n\n/** All registered preset ids in declaration order. */\nexport const THEME_PRESET_IDS = Object.keys(THEME_REGISTRY) as ThemePresetId[];\n\n/** Look up a descriptor by id. Returns `undefined` for unknown ids. */\nexport function getThemeDescriptor(id: string): ThemeDescriptor | undefined {\n return (THEME_REGISTRY as Record<string, ThemeDescriptor>)[id];\n}\n\n/** Type guard for a known preset id. */\nexport function isThemePresetId(id: string): id is ThemePresetId {\n return id in THEME_REGISTRY;\n}\n\n/** Preset ids that suppress dark mode generation. */\nexport const FORCE_LIGHT_PRESET_IDS: ReadonlySet<ThemePresetId> = new Set(\n THEME_PRESET_IDS.filter((id) => THEME_REGISTRY[id].forceLightOnly),\n);\n\n/**\n * Map from removed preset ids to the closest surviving preset. Boot script and\n * `readStoredTheme` consult this so users with persisted `corporate`/`playful`\n * values silently land on a working preset on next page load instead of\n * showing the global default fallback for an unknown id.\n *\n * Keep this around indefinitely — localStorage values are forever and the\n * cost of two extra entries is negligible.\n */\nexport const DEPRECATED_PRESET_MIGRATIONS: Readonly<\n Record<string, ThemePresetId>\n> = Object.freeze({\n corporate: \"default\",\n playful: \"default\",\n});\n\n/**\n * Resolve a possibly-deprecated preset id to a registered one. Returns the\n * input unchanged when it is already valid; returns the migration target when\n * it is a known deprecated id; returns `null` when the id is unknown\n * altogether (caller should fall back to its default).\n */\nexport function migrateDeprecatedPresetId(\n id: string | null | undefined,\n): ThemePresetId | null {\n if (!id) return null;\n if (isThemePresetId(id)) return id;\n if (id in DEPRECATED_PRESET_MIGRATIONS) {\n return DEPRECATED_PRESET_MIGRATIONS[id]!;\n }\n return null;\n}\n","/**\n * theme-types.ts\n *\n * Discriminated union covering every way a consumer can describe a theme:\n * a registered preset id, an inline `PaletteConfig` to feed the engine, or\n * a fully formed `ThemeDescriptor`. Shared by `OptThemeProvider` and\n * `ShellProvider` so generated themes built in the harness layer can be\n * promoted into the global tree without translation.\n */\n\nimport type { OptTokenName, PaletteConfig } from \"@reopt-ai/opt-palette\";\nimport type { ThemeDescriptor, ThemePresetId } from \"./presets\";\n\n/**\n * Sparse token overrides applied on top of the resolved theme. `light` and\n * `dark` apply only to that mode; `shared` applies to both (handy for\n * typography or radius tokens that should not invert).\n */\nexport interface ThemeOverrides {\n light?: Record<string, string>;\n dark?: Record<string, string>;\n shared?: Record<string, string>;\n}\n\n/** Canonical, typo-safe token map for authored product theme overrides. */\nexport type CanonicalThemeTokenMap = Partial<Record<OptTokenName, string>>;\n\n/** Mode-aware overrides restricted to the canonical token catalog. */\nexport interface CanonicalThemeOverrides {\n light?: CanonicalThemeTokenMap;\n dark?: CanonicalThemeTokenMap;\n shared?: CanonicalThemeTokenMap;\n}\n\n/**\n * Author canonical theme overrides with token-name autocomplete.\n * ThemeOverrides remains broad for backward compatibility with older custom\n * variables; new themes should use this helper as the governed entry point.\n */\nexport function defineThemeOverrides(\n overrides: CanonicalThemeOverrides,\n): CanonicalThemeOverrides {\n return overrides;\n}\n\n/** Reference an entry of `THEME_REGISTRY` by id. */\nexport interface PresetThemeSpec {\n kind: \"preset\";\n preset: ThemePresetId;\n overrides?: ThemeOverrides;\n}\n\n/**\n * Inline `PaletteConfig` consumed by the opt-palette engine to produce a\n * canonical token palette at runtime.\n */\nexport interface GeneratedThemeSpec {\n kind: \"generated\";\n /** Stable id used in `<html data-theme>` and the `<style>` selector. */\n id?: string;\n label?: string;\n palette: PaletteConfig;\n overrides?: ThemeOverrides;\n forceLightOnly?: boolean;\n}\n\n/** Pass an already-built `ThemeDescriptor`. */\nexport interface DescriptorThemeSpec {\n kind: \"descriptor\";\n descriptor: ThemeDescriptor;\n overrides?: ThemeOverrides;\n}\n\n/** Discriminated union covering every supported way to describe a theme. */\nexport type ThemeSpec =\n | PresetThemeSpec\n | GeneratedThemeSpec\n | DescriptorThemeSpec;\n\n/** Construct a `PresetThemeSpec` — convenience for the common case. */\nexport function presetTheme(\n preset: ThemePresetId,\n overrides?: ThemeOverrides,\n): PresetThemeSpec {\n return overrides\n ? { kind: \"preset\", preset, overrides }\n : { kind: \"preset\", preset };\n}\n\n/** Construct a `GeneratedThemeSpec` from an inline `PaletteConfig`. */\nexport function generatedTheme(\n palette: PaletteConfig,\n options?: Omit<GeneratedThemeSpec, \"kind\" | \"palette\">,\n): GeneratedThemeSpec {\n return { kind: \"generated\", palette, ...options };\n}\n\n/** True when `spec` references a registered preset id. */\nexport function isPresetSpec(spec: ThemeSpec): spec is PresetThemeSpec {\n return spec.kind === \"preset\";\n}\n/** True when `spec` carries an inline `PaletteConfig`. */\nexport function isGeneratedSpec(spec: ThemeSpec): spec is GeneratedThemeSpec {\n return spec.kind === \"generated\";\n}\n/** True when `spec` wraps a fully-formed `ThemeDescriptor`. */\nexport function isDescriptorSpec(spec: ThemeSpec): spec is DescriptorThemeSpec {\n return spec.kind === \"descriptor\";\n}\n\n/**\n * Resolve a `ThemeSpec` down to a single descriptor + overrides pair. The\n * returned descriptor is always sourced from the registry or the spec itself —\n * the caller is responsible for engine-driven token generation when the\n * descriptor only carries a `palette`.\n */\nexport interface ResolvedThemeSpec {\n descriptor: ThemeDescriptor;\n overrides?: ThemeOverrides;\n}\n","/**\n * theme-serialize.ts\n *\n * Pure helpers that turn a `ThemeSpec` into the artifacts the runtime needs:\n * resolved descriptor + mode, computed token maps for generated palettes, and\n * `<style>` CSS strings ready to be injected into `<head>`.\n *\n * Kept side-effect free so the boot script and the provider can share the\n * same logic without dragging React into the client bundle's critical path.\n */\n\nimport {\n generatePalette,\n type PaletteConfig,\n type GeneratedPalette,\n} from \"@reopt-ai/opt-palette\";\nimport {\n THEME_REGISTRY,\n isThemePresetId,\n type ThemeDescriptor,\n type ThemePresetId,\n} from \"./presets\";\nimport {\n isDescriptorSpec,\n isGeneratedSpec,\n isPresetSpec,\n type GeneratedThemeSpec,\n type ThemeOverrides,\n type ThemeSpec,\n} from \"./theme-types\";\n\n/** Element id used for the global generated theme style tag. */\nexport const GLOBAL_THEME_STYLE_ID = \"opt-global-theme\";\n\n/** localStorage key for the persisted ThemeSpec (generated mode). */\nexport const THEME_SPEC_STORAGE_KEY = \"opt-theme-spec\";\n\n/**\n * localStorage key for the cached, pre-serialized token maps that match the\n * spec under `THEME_SPEC_STORAGE_KEY`. The boot script reads this directly so\n * it can inline tokens without invoking opt-palette at startup.\n */\nexport const THEME_TOKENS_STORAGE_KEY = \"opt-theme-tokens\";\n\n/** Stable id used for unnamed generated themes. */\nexport const GENERATED_THEME_ID_DEFAULT = \"generated\";\n\n/** Cached token maps keyed by spec hash. Lazy-built per process. */\nconst generatedCache = new Map<string, GeneratedPalette>();\n\n/** Build a stable cache key for a `PaletteConfig`. */\nfunction paletteCacheKey(config: PaletteConfig): string {\n return JSON.stringify(config);\n}\n\n/** Run opt-palette with caching. */\nexport function generatePaletteCached(config: PaletteConfig): GeneratedPalette {\n const key = paletteCacheKey(config);\n let cached = generatedCache.get(key);\n if (!cached) {\n cached = generatePalette(config);\n generatedCache.set(key, cached);\n }\n return cached;\n}\n\n/** Apply sparse override maps onto a base token record. */\nfunction applyOverrides(\n base: Record<string, string>,\n overrides: ThemeOverrides | undefined,\n mode: \"light\" | \"dark\",\n): Record<string, string> {\n if (!overrides) return base;\n const merged: Record<string, string> = { ...base };\n if (overrides.shared) Object.assign(merged, overrides.shared);\n const modeOverrides = mode === \"light\" ? overrides.light : overrides.dark;\n if (modeOverrides) Object.assign(merged, modeOverrides);\n return merged;\n}\n\n/**\n * Stable id used in `<html data-theme>` and the `<style>` selector.\n * - preset → the preset id (force-light) or `${id}` / `${id}-dark`\n * - generated → `spec.id ?? \"generated\"` with `-dark` suffix when applicable\n * - descriptor → `descriptor.id` with same suffix logic\n */\nexport function getCompoundIdForSpec(\n spec: ThemeSpec,\n resolvedMode: \"light\" | \"dark\",\n forceLightOnly: boolean,\n): string {\n const baseId = baseIdFor(spec);\n if (forceLightOnly) return baseId;\n return resolvedMode === \"dark\" ? `${baseId}-dark` : baseId;\n}\n\nfunction baseIdFor(spec: ThemeSpec): string {\n if (isPresetSpec(spec)) return spec.preset;\n if (isDescriptorSpec(spec)) return spec.descriptor.id;\n return spec.id ?? GENERATED_THEME_ID_DEFAULT;\n}\n\n/** Whether the given spec emits dark variants at all. */\nexport function isForceLightSpec(spec: ThemeSpec): boolean {\n if (isPresetSpec(spec)) {\n const desc = THEME_REGISTRY[spec.preset];\n return desc?.forceLightOnly === true;\n }\n if (isDescriptorSpec(spec)) return spec.descriptor.forceLightOnly === true;\n return spec.forceLightOnly === true;\n}\n\n/** Computed token bundle for a generated theme. `dark` is `null` when force-light. */\nexport interface GeneratedTokens {\n id: string;\n light: Record<string, string>;\n dark: Record<string, string> | null;\n}\n\n/**\n * Compute the inline tokens for a `GeneratedThemeSpec` or\n * `DescriptorThemeSpec` whose descriptor carries a `palette`. Returns `null`\n * for preset specs (their tokens live in the static CSS files).\n */\nexport function computeGeneratedTokens(\n spec: ThemeSpec,\n): GeneratedTokens | null {\n if (isPresetSpec(spec)) return null;\n\n let palette: PaletteConfig | undefined;\n let overrides: ThemeOverrides | undefined;\n let id: string;\n let forceLight: boolean;\n\n if (isGeneratedSpec(spec)) {\n palette = spec.palette;\n overrides = spec.overrides;\n id = spec.id ?? GENERATED_THEME_ID_DEFAULT;\n forceLight = spec.forceLightOnly === true;\n } else {\n // descriptor spec\n palette = spec.descriptor.palette;\n overrides = spec.overrides;\n id = spec.descriptor.id;\n forceLight = spec.descriptor.forceLightOnly === true;\n }\n\n if (!palette) return null;\n\n const generated = generatePaletteCached(palette);\n return {\n id,\n light: applyOverrides(generated.light, overrides, \"light\"),\n dark: forceLight ? null : applyOverrides(generated.dark, overrides, \"dark\"),\n };\n}\n\n/**\n * Serialize a token record into a CSS rule body — `--name:value;...` — without\n * surrounding selector or braces. Values are not escaped; callers are\n * responsible for trusted input. Boot script and provider both rely on this\n * shape.\n */\nexport function serializeTokenBody(tokens: Record<string, string>): string {\n return Object.entries(tokens)\n .map(([k, v]) => `${k}:${v}`)\n .join(\";\");\n}\n\n/**\n * Build a CSS rule scoped to `[data-theme=\"<id>\"]`.\n */\nexport function serializeThemeRule(\n themeId: string,\n tokens: Record<string, string>,\n): string {\n return `[data-theme=\"${themeId}\"]{${serializeTokenBody(tokens)}}`;\n}\n\n/**\n * Build the full CSS for a generated theme style tag — covers light + dark\n * selectors based on the computed tokens. Caller chooses the id used in\n * the selector (typically the spec base id).\n */\nexport function serializeGeneratedTheme(tokens: GeneratedTokens): string {\n const { id, light, dark } = tokens;\n let css = serializeThemeRule(id, light);\n if (dark) {\n css += serializeThemeRule(`${id}-dark`, dark);\n }\n return css;\n}\n\n/**\n * Resolve a spec into its descriptor counterpart. Preset specs map to\n * `THEME_REGISTRY[preset]`. Generated specs are wrapped into a synthetic\n * descriptor so callers can treat them uniformly.\n */\nexport function resolveDescriptor(spec: ThemeSpec): ThemeDescriptor {\n if (isPresetSpec(spec)) {\n const desc = THEME_REGISTRY[spec.preset];\n if (!desc) {\n throw new Error(\n `[opt-ui] Unknown theme preset id: \"${spec.preset}\". ` +\n `Registered ids: ${Object.keys(THEME_REGISTRY).join(\", \")}`,\n );\n }\n return desc;\n }\n if (isDescriptorSpec(spec)) return spec.descriptor;\n return generatedSpecToDescriptor(spec);\n}\n\nfunction generatedSpecToDescriptor(spec: GeneratedThemeSpec): ThemeDescriptor {\n return {\n id: spec.id ?? GENERATED_THEME_ID_DEFAULT,\n label: spec.label ?? \"Custom\",\n description: \"Generated theme\",\n palette: spec.palette,\n forceLightOnly: spec.forceLightOnly,\n };\n}\n\n/**\n * Validate a `ThemeSpec` parsed from localStorage. Returns the spec on\n * success or `null` if any required field is missing or the preset id is\n * unknown. Defensive parsing — never throws.\n */\nexport function safeParseStoredSpec(json: string | null): ThemeSpec | null {\n if (!json) return null;\n try {\n const parsed = JSON.parse(json) as Partial<ThemeSpec> & {\n kind?: unknown;\n };\n if (!parsed || typeof parsed !== \"object\" || !(\"kind\" in parsed)) {\n return null;\n }\n if (parsed.kind === \"preset\") {\n const preset = (parsed as { preset?: unknown }).preset;\n if (typeof preset !== \"string\" || !isThemePresetId(preset)) return null;\n return { kind: \"preset\", preset } as ThemeSpec;\n }\n if (parsed.kind === \"generated\") {\n const palette = (parsed as { palette?: unknown }).palette;\n if (!isPaletteConfig(palette)) return null;\n const out: GeneratedThemeSpec = {\n kind: \"generated\",\n palette,\n id: typeof parsed.id === \"string\" ? parsed.id : undefined,\n label: typeof parsed.label === \"string\" ? parsed.label : undefined,\n forceLightOnly: parsed.forceLightOnly === true,\n overrides: isObjectMap(parsed.overrides)\n ? (parsed.overrides as ThemeOverrides)\n : undefined,\n };\n return out;\n }\n return null;\n } catch {\n return null;\n }\n}\n\nfunction isObjectMap(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction isPaletteConfig(value: unknown): value is PaletteConfig {\n if (!isObjectMap(value)) return false;\n const v = value as Partial<PaletteConfig>;\n return (\n typeof v.seed === \"string\" &&\n typeof v.harmony === \"string\" &&\n typeof v.radiusScale === \"string\" &&\n typeof v.shadowIntensity === \"string\" &&\n typeof v.neutralTemperature === \"string\"\n );\n}\n\n/** Cached token payload as written to `opt-theme-tokens`. */\nexport interface StoredTokenCache {\n id: string;\n light: Record<string, string>;\n dark?: Record<string, string>;\n}\n\n/**\n * Parse the cached token payload from localStorage. Returns `null` on any\n * shape mismatch — caller will recompute from the spec.\n */\nexport function safeParseStoredTokens(\n json: string | null,\n): StoredTokenCache | null {\n if (!json) return null;\n try {\n const parsed = JSON.parse(json) as Partial<StoredTokenCache>;\n if (\n !parsed ||\n typeof parsed.id !== \"string\" ||\n !isObjectMap(parsed.light)\n ) {\n return null;\n }\n return {\n id: parsed.id,\n light: parsed.light as Record<string, string>,\n dark: isObjectMap(parsed.dark)\n ? (parsed.dark as Record<string, string>)\n : undefined,\n };\n } catch {\n return null;\n }\n}\n\n/** Build the storage payload that pairs with `opt-theme-spec`. */\nexport function buildTokenCache(tokens: GeneratedTokens): StoredTokenCache {\n return {\n id: tokens.id,\n light: tokens.light,\n dark: tokens.dark ?? undefined,\n };\n}\n\n/** Strip caches — used by tests and when switching back to a preset spec. */\nexport function clearGeneratedCache(): void {\n generatedCache.clear();\n}\n\n/** Re-export descriptor lookups for consumers of the serializer. */\nexport { THEME_REGISTRY, isThemePresetId };\nexport type { ThemePresetId };\n","import {\n DEPRECATED_PRESET_MIGRATIONS,\n FORCE_LIGHT_PRESET_IDS,\n THEME_PRESET_IDS,\n migrateDeprecatedPresetId,\n type ThemePresetId,\n} from \"./presets\";\nimport {\n GLOBAL_THEME_STYLE_ID,\n THEME_SPEC_STORAGE_KEY,\n THEME_TOKENS_STORAGE_KEY,\n} from \"./theme-serialize\";\n\n/**\n * Registered preset id list. Preferred for runtime iteration.\n * @deprecated Prefer `THEME_PRESET_IDS` from `./presets`.\n */\nexport const THEME_PRESET_VALUES: readonly ThemePresetId[] = THEME_PRESET_IDS;\n\n/** Theme preset id — alias of `ThemePresetId` from the registry. */\nexport type ThemePreset = ThemePresetId;\n\nexport const THEME_MODE_VALUES = [\"light\", \"dark\", \"system\"] as const;\n/** Type definition for theme mode. */\nexport type ThemeMode = (typeof THEME_MODE_VALUES)[number];\n\n/** Runtime constraints for apps that expose only a subset of opt-ui theming. */\nexport interface ThemeRuntimeOptions {\n /**\n * Force the root theme to one preset regardless of stored preset/generated\n * theme state. Mode is still resolved normally unless constrained.\n */\n lockedPreset?: ThemePreset;\n /**\n * Restrict mode reads/writes to a smaller set, e.g. `[\"light\", \"dark\"]`.\n * The first value becomes the fallback when the stored/default mode is not\n * allowed.\n */\n allowedModes?: readonly ThemeMode[];\n}\n\n/**\n * Compound theme value applied to `<html data-theme>`. Derived from the\n * registered preset ids: `<id>` (light) or `<id>-dark` (dark). Force-light\n * presets only emit the bare id form.\n */\nexport type CompoundTheme = `${ThemePreset}` | `${ThemePreset}-dark`;\n\nexport const LEGACY_THEME_STORAGE_KEY = \"opt-theme\";\nexport const THEME_PRESET_STORAGE_KEY = \"opt-preset\";\nexport const THEME_MODE_STORAGE_KEY = \"opt-mode\";\nexport const DARK_MQ = \"(prefers-color-scheme: dark)\";\n\n/**\n * Presets that force light mode regardless of system dark/light preference.\n * Mirrors `FORCE_LIGHT_PRESET_IDS` from `./presets` — kept as alias for\n * existing imports.\n */\nexport const FORCE_LIGHT_PRESETS: ReadonlySet<ThemePreset> =\n FORCE_LIGHT_PRESET_IDS;\n\n/** All valid compound theme names. Useful for static enumeration. */\nexport const ALL_COMPOUND_THEMES: CompoundTheme[] = THEME_PRESET_IDS.flatMap(\n (id) =>\n FORCE_LIGHT_PRESET_IDS.has(id)\n ? [id satisfies CompoundTheme]\n : [id satisfies CompoundTheme, `${id}-dark` satisfies CompoundTheme],\n);\n\ninterface ThemeStorageReader {\n getItem(key: string): string | null;\n}\n\ninterface ThemeStorageMutator extends ThemeStorageReader {\n setItem(key: string, value: string): void;\n removeItem(key: string): void;\n}\n\nfunction hasStorageMutation(\n storage: ThemeStorageReader,\n): storage is ThemeStorageMutator {\n return (\n typeof (storage as ThemeStorageMutator).setItem === \"function\" &&\n typeof (storage as ThemeStorageMutator).removeItem === \"function\"\n );\n}\n\n/** Handles is theme preset. */\nexport function isThemePreset(value: string | null): value is ThemePreset {\n return (\n typeof value === \"string\" &&\n THEME_PRESET_VALUES.includes(value as ThemePreset)\n );\n}\n\n/** Handles is theme mode. */\nexport function isThemeMode(value: string | null): value is ThemeMode {\n return (\n typeof value === \"string\" && THEME_MODE_VALUES.includes(value as ThemeMode)\n );\n}\n\n/** Compute compound theme name from preset + resolved mode. */\nexport function getCompoundTheme(\n preset: ThemePreset,\n resolvedMode: \"light\" | \"dark\",\n): CompoundTheme {\n if (FORCE_LIGHT_PRESETS.has(preset)) return preset as CompoundTheme;\n return (resolvedMode === \"dark\" ? `${preset}-dark` : preset) as CompoundTheme;\n}\n\n/** Handles resolve theme mode. */\nexport function resolveThemeMode(\n preset: ThemePreset,\n mode: ThemeMode,\n systemDark: boolean,\n): \"light\" | \"dark\" {\n if (FORCE_LIGHT_PRESETS.has(preset)) return \"light\";\n if (mode === \"system\") return systemDark ? \"dark\" : \"light\";\n return mode;\n}\n\n/** Handles read stored theme. */\nexport function readStoredTheme(\n storage: ThemeStorageReader,\n defaultPreset: ThemePreset,\n defaultMode: ThemeMode,\n options: { migrateLegacy?: boolean } = {},\n): { preset: ThemePreset; mode: ThemeMode } {\n const legacy = storage.getItem(LEGACY_THEME_STORAGE_KEY);\n const storedPreset = storage.getItem(THEME_PRESET_STORAGE_KEY);\n const storedMode = storage.getItem(THEME_MODE_STORAGE_KEY);\n\n let preset = defaultPreset;\n // Legacy `opt-theme` key — migrate to `opt-preset` when valid (or deprecated).\n if (typeof legacy === \"string\") {\n const migratedLegacy = migrateDeprecatedPresetId(legacy);\n if (migratedLegacy) {\n if (options.migrateLegacy && hasStorageMutation(storage)) {\n storage.setItem(THEME_PRESET_STORAGE_KEY, migratedLegacy);\n storage.removeItem(LEGACY_THEME_STORAGE_KEY);\n }\n preset = migratedLegacy;\n }\n } else if (typeof storedPreset === \"string\") {\n const migrated = migrateDeprecatedPresetId(storedPreset);\n if (migrated) {\n preset = migrated;\n // If the stored value was a deprecated id, silently rewrite it to the\n // migration target so the next read is a hit on the registered id.\n if (\n hasStorageMutation(storage) &&\n migrated !== storedPreset &&\n storedPreset in DEPRECATED_PRESET_MIGRATIONS\n ) {\n storage.setItem(THEME_PRESET_STORAGE_KEY, migrated);\n }\n }\n }\n\n const mode = isThemeMode(storedMode) ? storedMode : defaultMode;\n return { preset, mode };\n}\n\n/** Normalize a mode against an optional allowed-mode list. */\nexport function coerceThemeMode(\n mode: ThemeMode,\n allowedModes: readonly ThemeMode[] | undefined,\n fallback: ThemeMode = \"system\",\n): ThemeMode {\n if (!allowedModes || allowedModes.length === 0) return mode;\n if (allowedModes.includes(mode)) return mode;\n if (allowedModes.includes(fallback)) return fallback;\n return allowedModes[0] ?? fallback;\n}\n\n/**\n * Build the inline `<head>` boot script that paints the correct theme before\n * React mounts. Two paths:\n *\n * 1. **Generated** — when both `opt-theme-spec` (kind: \"generated\") and\n * `opt-theme-tokens` are present and well-formed, a `<style id=\"…\">` tag\n * is inserted with the cached tokens and `<html data-theme>` is set to the\n * generated id (with optional `-dark` suffix). This bypasses opt-palette\n * at startup so first paint is instant.\n * 2. **Preset (legacy)** — falls through to the existing preset selector,\n * including legacy `opt-theme` → `opt-preset` migration.\n *\n * Returned as a single minified line; intended for `dangerouslySetInnerHTML`.\n */\nexport function createThemeBootScript(\n defaultPreset: ThemePreset = \"default\",\n defaultMode: ThemeMode = \"system\",\n options: ThemeRuntimeOptions = {},\n): string {\n const presetValues = JSON.stringify(THEME_PRESET_VALUES);\n const modeValues = JSON.stringify(THEME_MODE_VALUES);\n const allowedModes = options.allowedModes?.length\n ? options.allowedModes\n : THEME_MODE_VALUES;\n const allowedModeValues = JSON.stringify(allowedModes);\n const forceLightPresets = JSON.stringify(Array.from(FORCE_LIGHT_PRESETS));\n const deprecatedMap = JSON.stringify(DEPRECATED_PRESET_MIGRATIONS);\n const lockedPreset = options.lockedPreset;\n const resolvedDefaultPreset = lockedPreset ?? defaultPreset;\n const defaultPresetLiteral = JSON.stringify(resolvedDefaultPreset);\n const defaultModeLiteral = JSON.stringify(\n coerceThemeMode(defaultMode, allowedModes, allowedModes[0] ?? \"system\"),\n );\n const lockedPresetLiteral = JSON.stringify(lockedPreset ?? null);\n const styleId = JSON.stringify(GLOBAL_THEME_STYLE_ID);\n const specKey = JSON.stringify(THEME_SPEC_STORAGE_KEY);\n const tokensKey = JSON.stringify(THEME_TOKENS_STORAGE_KEY);\n const presetKey = JSON.stringify(THEME_PRESET_STORAGE_KEY);\n const modeKey = JSON.stringify(THEME_MODE_STORAGE_KEY);\n const legacyKey = JSON.stringify(LEGACY_THEME_STORAGE_KEY);\n const darkMq = JSON.stringify(DARK_MQ);\n\n // Multi-line for readability here; collapsed on emit.\n // `mp(v)` resolves a stored preset id: returns the value itself when\n // registered, the migration target when deprecated, or null otherwise.\n const source = `\ntry {\n var pv=${presetValues},mv=${modeValues},am=${allowedModeValues},fp=${forceLightPresets},dm=${deprecatedMap},lk=${lockedPresetLiteral};\n function mp(v){if(typeof v!==\"string\")return null;if(pv.indexOf(v)>=0)return v;return Object.prototype.hasOwnProperty.call(dm,v)?dm[v]:null;}\n var p=${defaultPresetLiteral};\n if(!lk){\n var lp=localStorage.getItem(${legacyKey}),sp=localStorage.getItem(${presetKey});\n var lpm=mp(lp),spm=mp(sp);\n p=lpm||spm||${defaultPresetLiteral};\n if(lpm){localStorage.setItem(${presetKey},lpm);localStorage.removeItem(${legacyKey});}\n else if(sp&&spm&&sp!==spm){localStorage.setItem(${presetKey},spm);}\n }\n var sm=localStorage.getItem(${modeKey});\n var m=(typeof sm===\"string\"&&mv.indexOf(sm)>=0&&am.indexOf(sm)>=0)?sm:${defaultModeLiteral};\n var spec=null,tk=null;\n if(!lk){try{var sj=localStorage.getItem(${specKey});if(sj)spec=JSON.parse(sj);}catch(e){}}\n if(!lk){try{var tj=localStorage.getItem(${tokensKey});if(tj)tk=JSON.parse(tj);}catch(e){}}\n if(!lk&&spec&&spec.kind===\"generated\"&&tk&&typeof tk.id===\"string\"&&tk.light&&typeof tk.light===\"object\"){\n var fld=spec.forceLightOnly===true;\n var dk=!fld&&(m===\"dark\"||(m===\"system\"&&matchMedia(${darkMq}).matches));\n var tt=(dk&&tk.dark)?tk.dark:tk.light;\n var cid=(dk&&tk.dark)?(tk.id+\"-dark\"):tk.id;\n var css=\"\";\n for(var k in tt){if(Object.prototype.hasOwnProperty.call(tt,k))css+=k+\":\"+tt[k]+\";\"}\n var st=document.getElementById(${styleId});\n if(!st){st=document.createElement(\"style\");st.id=${styleId};document.head.appendChild(st);}\n st.textContent='[data-theme=\"'+cid+'\"]{'+css+'}';\n document.documentElement.setAttribute(\"data-theme\",cid);\n } else {\n var d=fp.indexOf(p)<0&&(m===\"dark\"||(m===\"system\"&&matchMedia(${darkMq}).matches));\n document.documentElement.setAttribute(\"data-theme\",d?p+\"-dark\":p);\n }\n} catch(e){}`;\n\n // Collapse leading newlines + indentation. Safe because all string\n // literals in the source are double-quoted with no embedded newlines.\n return source.replace(/\\n\\s*/g, \"\");\n}\n","\"use client\";\n\nimport { createContext, useContext } from \"react\";\nimport type { ThemeSpec } from \"./theme-types\";\n\n/** A single entry on the theme promotion stack. */\nexport interface ThemeStackEntry {\n /** Stable owner id (e.g. harness id) — used to dedupe and pop. */\n id: string;\n /** Spec the owner wants applied while it is mounted. */\n spec: ThemeSpec;\n}\n\n/**\n * Imperative API exposed by `OptThemeProvider` to descendants that want to\n * temporarily override the global theme without owning persistence (e.g. the\n * harness builder previewing a generated palette).\n *\n * Contract:\n * - `pushTheme(id, spec)` re-pushes (replacing) any existing entry with the\n * same id, preserving stack order otherwise.\n * - `popTheme(id)` removes the entry with the given id, no-op if absent.\n * - The top of the stack wins. When the stack is empty the provider falls\n * back to its `controlledTheme` prop, then to its persisted state.\n */\nexport interface OptThemeController {\n pushTheme: (id: string, spec: ThemeSpec) => void;\n popTheme: (id: string) => void;\n}\n\nexport const OptThemeControllerContext =\n createContext<OptThemeController | null>(null);\n\n/**\n * Reads the controller exposed by the nearest `OptThemeProvider`. Returns\n * `null` when used outside a provider — callers should treat that as \"no\n * promotion available\" and behave as if scope === \"override\".\n */\nexport function useOptThemeController(): OptThemeController | null {\n return useContext(OptThemeControllerContext);\n}\n","\"use client\";\n\nimport {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n useSyncExternalStore,\n} from \"react\";\nimport {\n DARK_MQ,\n LEGACY_THEME_STORAGE_KEY,\n THEME_MODE_STORAGE_KEY,\n THEME_PRESET_STORAGE_KEY,\n coerceThemeMode,\n getCompoundTheme,\n readStoredTheme,\n resolveThemeMode,\n type ThemeMode,\n type ThemePreset,\n type ThemeRuntimeOptions,\n} from \"./theme-resolution\";\nimport {\n GLOBAL_THEME_STYLE_ID,\n THEME_SPEC_STORAGE_KEY,\n THEME_TOKENS_STORAGE_KEY,\n buildTokenCache,\n computeGeneratedTokens,\n getCompoundIdForSpec,\n isForceLightSpec,\n safeParseStoredSpec,\n serializeGeneratedTheme,\n} from \"./theme-serialize\";\nimport {\n isGeneratedSpec,\n isPresetSpec,\n presetTheme as makePresetSpec,\n type ThemeSpec,\n} from \"./theme-types\";\nimport { isThemePresetId, type ThemePresetId } from \"./presets\";\nimport {\n OptThemeControllerContext,\n type OptThemeController,\n type ThemeStackEntry,\n} from \"./theme-controller-context\";\n\nexport type { ThemePreset, ThemeMode, CompoundTheme } from \"./theme-resolution\";\nexport {\n FORCE_LIGHT_PRESETS,\n ALL_COMPOUND_THEMES,\n getCompoundTheme,\n} from \"./theme-resolution\";\n\nconst THEME_STORAGE_KEYS = new Set([\n LEGACY_THEME_STORAGE_KEY,\n THEME_PRESET_STORAGE_KEY,\n THEME_MODE_STORAGE_KEY,\n THEME_SPEC_STORAGE_KEY,\n THEME_TOKENS_STORAGE_KEY,\n]);\n\n// ── Media query helpers ──\n\nfunction getSystemDark(): boolean {\n if (typeof window === \"undefined\") return false;\n return window.matchMedia(DARK_MQ).matches;\n}\n\nfunction subscribeSystemDark(cb: () => void): () => void {\n if (typeof window === \"undefined\") return () => {};\n const mql = window.matchMedia(DARK_MQ);\n mql.addEventListener(\"change\", cb);\n return () => mql.removeEventListener(\"change\", cb);\n}\n\n// ── Storage helpers ──\n\n/**\n * Read the persisted ThemeSpec, preferring a generated spec when present.\n * Falls back to the legacy preset path otherwise. Does not touch localStorage\n * apart from the legacy migration handled by `readStoredTheme`.\n */\nfunction readStoredSpec(\n defaultPreset: ThemePresetId,\n defaultMode: ThemeMode,\n options: { migrateLegacy?: boolean } = {},\n): { spec: ThemeSpec; mode: ThemeMode; presetShadow: ThemePresetId } {\n const generated = safeParseStoredSpec(\n window.localStorage.getItem(THEME_SPEC_STORAGE_KEY),\n );\n const { preset, mode } = readStoredTheme(\n window.localStorage,\n defaultPreset,\n defaultMode,\n options,\n );\n if (generated && generated.kind === \"generated\") {\n return { spec: generated, mode, presetShadow: preset };\n }\n return {\n spec: makePresetSpec(preset),\n mode,\n presetShadow: preset,\n };\n}\n\nfunction persistSpec(spec: ThemeSpec): void {\n if (isPresetSpec(spec)) {\n window.localStorage.setItem(THEME_PRESET_STORAGE_KEY, spec.preset);\n window.localStorage.removeItem(THEME_SPEC_STORAGE_KEY);\n window.localStorage.removeItem(THEME_TOKENS_STORAGE_KEY);\n return;\n }\n if (isGeneratedSpec(spec)) {\n const tokens = computeGeneratedTokens(spec);\n window.localStorage.setItem(THEME_SPEC_STORAGE_KEY, JSON.stringify(spec));\n if (tokens) {\n window.localStorage.setItem(\n THEME_TOKENS_STORAGE_KEY,\n JSON.stringify(buildTokenCache(tokens)),\n );\n } else {\n window.localStorage.removeItem(THEME_TOKENS_STORAGE_KEY);\n }\n return;\n }\n // descriptor spec: persist as preset if id is registered, otherwise as\n // synthetic generated spec.\n const descriptor = spec.descriptor;\n if (isThemePresetId(descriptor.id) && !descriptor.palette) {\n window.localStorage.setItem(THEME_PRESET_STORAGE_KEY, descriptor.id);\n window.localStorage.removeItem(THEME_SPEC_STORAGE_KEY);\n window.localStorage.removeItem(THEME_TOKENS_STORAGE_KEY);\n return;\n }\n if (descriptor.palette) {\n const synthetic: ThemeSpec = {\n kind: \"generated\",\n id: descriptor.id,\n label: descriptor.label,\n palette: descriptor.palette,\n forceLightOnly: descriptor.forceLightOnly,\n };\n persistSpec(synthetic);\n }\n}\n\n// ── Style injection ──\n\nfunction upsertGlobalStyle(css: string): void {\n if (typeof document === \"undefined\") return;\n let node = document.getElementById(\n GLOBAL_THEME_STYLE_ID,\n ) as HTMLStyleElement | null;\n if (!node) {\n node = document.createElement(\"style\");\n node.id = GLOBAL_THEME_STYLE_ID;\n document.head.appendChild(node);\n }\n if (node.textContent !== css) {\n node.textContent = css;\n }\n}\n\nfunction removeGlobalStyle(): void {\n if (typeof document === \"undefined\") return;\n document.getElementById(GLOBAL_THEME_STYLE_ID)?.remove();\n}\n\n// ── Context ──\n\ninterface ThemeContextValue {\n /** Active theme spec — preset or generated. */\n theme: ThemeSpec;\n /** Replace the active theme spec. No-op when controlled. */\n setTheme: (spec: ThemeSpec) => void;\n /**\n * Last known preset id. Mirrors `theme.preset` when active spec is preset;\n * otherwise reflects the most recent preset (useful for \"back to preset\").\n */\n preset: ThemePresetId;\n /** Convenience: equivalent to `setTheme({ kind: \"preset\", preset })`. */\n setPreset: (preset: ThemePresetId) => void;\n mode: ThemeMode;\n setMode: (mode: ThemeMode) => void;\n resolvedMode: \"light\" | \"dark\";\n /** True when `controlledTheme` prop is provided. setTheme is a no-op. */\n isControlled: boolean;\n /** True when the active spec (effective, including stack) is generated. */\n isGenerated: boolean;\n /**\n * True when the effective theme comes from the promotion stack instead of\n * persistence. Useful for surfaces that want to show \"Preview\" affordances.\n */\n isPromoted: boolean;\n}\n\nconst ThemeContext = createContext<ThemeContextValue | undefined>(undefined);\n\n// ── Provider ──\n\n/** Props for `OptThemeProvider`. */\nexport interface OptThemeProviderProps {\n children: React.ReactNode;\n /**\n * Initial theme spec used when nothing is persisted. Takes precedence over\n * `defaultPreset`. Defaults to `{ kind: \"preset\", preset: defaultPreset }`.\n */\n defaultTheme?: ThemeSpec;\n /**\n * Fully controlled mode. When provided the provider mirrors this spec into\n * the DOM but ignores localStorage and `setTheme` mutations. Useful for\n * preview surfaces (e.g. the harness builder's \"Apply globally\").\n */\n controlledTheme?: ThemeSpec;\n /**\n * Legacy alias for `defaultTheme = { kind: \"preset\", preset: defaultPreset }`.\n * Kept for backward compatibility with existing call sites.\n */\n defaultPreset?: ThemePreset;\n defaultMode?: ThemeMode;\n /**\n * Force the root theme to a single preset while still allowing mode changes.\n * Stored preset/generated themes are ignored while this is set.\n */\n lockedPreset?: ThemeRuntimeOptions[\"lockedPreset\"];\n /** Restrict the provider to a subset of modes, e.g. light/black only. */\n allowedModes?: ThemeRuntimeOptions[\"allowedModes\"];\n /**\n * Whether descendants may push transient themes onto the global stack.\n * Defaults to true for backward compatibility.\n */\n allowThemePromotion?: boolean;\n}\n\n/** Renders the opt theme provider component. */\nexport function OptThemeProvider({\n children,\n defaultTheme,\n controlledTheme,\n defaultPreset = \"default\",\n defaultMode = \"system\",\n lockedPreset,\n allowedModes,\n allowThemePromotion = true,\n}: OptThemeProviderProps) {\n const normalizedDefaultMode = coerceThemeMode(\n defaultMode,\n allowedModes,\n allowedModes?.[0] ?? \"system\",\n );\n const initialSpec =\n controlledTheme ??\n (lockedPreset ? makePresetSpec(lockedPreset) : defaultTheme) ??\n makePresetSpec(defaultPreset);\n const initialPresetShadow = isPresetSpec(initialSpec)\n ? initialSpec.preset\n : (lockedPreset ?? defaultPreset);\n\n // Identical first render on server + client; localStorage hydration runs in effect.\n const [theme, setThemeState] = useState<ThemeSpec>(initialSpec);\n const [presetShadow, setPresetShadow] =\n useState<ThemePresetId>(initialPresetShadow);\n const [mode, setModeState] = useState<ThemeMode>(normalizedDefaultMode);\n /**\n * Transient theme override stack — descendants (typically harnesses in\n * promote-global mode) push specs that take priority over `controlledTheme`\n * and persisted state. The stack is intentionally kept out of localStorage.\n */\n const [stack, setStack] = useState<readonly ThemeStackEntry[]>([]);\n\n const isControlled = controlledTheme !== undefined;\n const isLocked = !isControlled && lockedPreset !== undefined;\n\n // Sync controlled prop into state.\n useEffect(() => {\n if (!isControlled) return;\n setThemeState(controlledTheme!);\n if (isPresetSpec(controlledTheme!)) {\n setPresetShadow(controlledTheme!.preset);\n }\n }, [controlledTheme, isControlled]);\n\n // Hydrate from localStorage on first mount (uncontrolled only).\n useEffect(() => {\n if (isControlled) return;\n if (isLocked) {\n const locked = lockedPreset ?? defaultPreset;\n const { mode: storedMode } = readStoredTheme(\n window.localStorage,\n locked,\n normalizedDefaultMode,\n );\n const nextMode = coerceThemeMode(\n storedMode,\n allowedModes,\n normalizedDefaultMode,\n );\n const nextSpec = makePresetSpec(locked);\n setThemeState((prev) => (themeEqual(prev, nextSpec) ? prev : nextSpec));\n setPresetShadow((prev) => (prev === locked ? prev : locked));\n setModeState((prev) => (prev === nextMode ? prev : nextMode));\n return;\n }\n const next = readStoredSpec(defaultPreset, defaultMode, {\n migrateLegacy: true,\n });\n const nextMode = coerceThemeMode(\n next.mode,\n allowedModes,\n normalizedDefaultMode,\n );\n setThemeState((prev) => (themeEqual(prev, next.spec) ? prev : next.spec));\n setPresetShadow((prev) =>\n prev === next.presetShadow ? prev : next.presetShadow,\n );\n setModeState((prev) => (prev === nextMode ? prev : nextMode));\n // Hydration runs once per controlled-mode toggle; defaultPreset/defaultMode\n // are read as initial fallbacks only and intentionally omitted from deps.\n }, [\n allowedModes,\n isControlled,\n isLocked,\n lockedPreset,\n normalizedDefaultMode,\n ]);\n\n // Cross-tab sync via storage events (uncontrolled only).\n useEffect(() => {\n if (isControlled) return;\n function handleStorage(event: StorageEvent) {\n if (event.storageArea && event.storageArea !== window.localStorage)\n return;\n if (event.key != null && !THEME_STORAGE_KEYS.has(event.key)) return;\n if (isLocked) {\n const locked = lockedPreset ?? defaultPreset;\n const { mode: storedMode } = readStoredTheme(\n window.localStorage,\n locked,\n normalizedDefaultMode,\n );\n const nextMode = coerceThemeMode(\n storedMode,\n allowedModes,\n normalizedDefaultMode,\n );\n const nextSpec = makePresetSpec(locked);\n setThemeState((prev) => (themeEqual(prev, nextSpec) ? prev : nextSpec));\n setPresetShadow((prev) => (prev === locked ? prev : locked));\n setModeState((prev) => (prev === nextMode ? prev : nextMode));\n return;\n }\n const next = readStoredSpec(defaultPreset, defaultMode, {\n migrateLegacy: event.key === LEGACY_THEME_STORAGE_KEY,\n });\n const nextMode = coerceThemeMode(\n next.mode,\n allowedModes,\n normalizedDefaultMode,\n );\n setThemeState((prev) => (themeEqual(prev, next.spec) ? prev : next.spec));\n setPresetShadow((prev) =>\n prev === next.presetShadow ? prev : next.presetShadow,\n );\n setModeState((prev) => (prev === nextMode ? prev : nextMode));\n }\n window.addEventListener(\"storage\", handleStorage);\n return () => window.removeEventListener(\"storage\", handleStorage);\n }, [\n allowedModes,\n isControlled,\n isLocked,\n defaultMode,\n defaultPreset,\n lockedPreset,\n normalizedDefaultMode,\n ]);\n\n // Track system dark preference reactively.\n const systemDark = useSyncExternalStore(\n subscribeSystemDark,\n getSystemDark,\n () => false,\n );\n\n // Stack top wins over controlled prop wins over persisted state.\n const stackTop = stack.length > 0 ? stack[stack.length - 1] : null;\n const effectiveStackTop = allowThemePromotion ? stackTop : null;\n const isPromoted = effectiveStackTop !== null;\n const effectiveSpec: ThemeSpec = effectiveStackTop?.spec ?? theme;\n\n const forceLight = isForceLightSpec(effectiveSpec);\n const resolvedMode: \"light\" | \"dark\" = computeResolvedMode(\n forceLight,\n mode,\n systemDark,\n );\n\n const compoundId = getCompoundIdForSpec(\n effectiveSpec,\n resolvedMode,\n forceLight,\n );\n\n // Apply data-theme to <html>, but only after the first post-hydration commit.\n // The boot script (createThemeBootScript) paints the stored theme on <html>\n // before hydration; the provider's first render still reflects the *default*\n // mode (localStorage is read in the hydration effect above, which then fires\n // a re-render). Writing compoundId to <html> before that re-render would\n // clobber the boot value for a frame — a stored dark theme flips to light\n // (white flash). Gate the write on a state flag rather than a one-shot ref:\n // React StrictMode double-invokes effects in dev, which consumes a ref guard\n // and lets the second pass clobber; a state flag is invoked identically on\n // both passes and skips until the hydration re-render lands.\n const [hydrated, setHydrated] = useState(false);\n useEffect(() => {\n setHydrated(true);\n }, []);\n useEffect(() => {\n if (!hydrated) return;\n if (document.documentElement.getAttribute(\"data-theme\") !== compoundId) {\n document.documentElement.setAttribute(\"data-theme\", compoundId);\n }\n }, [compoundId, hydrated]);\n\n // Inject (or remove) global generated style based on the *effective* spec.\n useEffect(() => {\n if (isPresetSpec(effectiveSpec)) {\n removeGlobalStyle();\n return;\n }\n const tokens = computeGeneratedTokens(effectiveSpec);\n if (!tokens) {\n removeGlobalStyle();\n return;\n }\n upsertGlobalStyle(serializeGeneratedTheme(tokens));\n // Persist token cache only for the persisted spec (not promoted/controlled).\n if (!isControlled && !isPromoted && effectiveSpec === theme) {\n try {\n window.localStorage.setItem(\n THEME_TOKENS_STORAGE_KEY,\n JSON.stringify(buildTokenCache(tokens)),\n );\n } catch {\n // localStorage may be disabled — ignore.\n }\n }\n }, [effectiveSpec, theme, isControlled, isPromoted]);\n\n // Cleanup on unmount: leave the boot-script-injected style intact for the\n // next mount (e.g. route transitions in the same SPA shell).\n\n const setTheme = useCallback(\n (next: ThemeSpec) => {\n if (isLocked) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(\n \"[OptThemeProvider] setTheme called while lockedPreset is set — ignoring.\",\n );\n }\n return;\n }\n if (isControlled) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(\n \"[OptThemeProvider] setTheme called while controlledTheme is set — ignoring.\",\n );\n }\n return;\n }\n setThemeState(next);\n if (isPresetSpec(next)) setPresetShadow(next.preset);\n try {\n persistSpec(next);\n } catch {\n // Ignore persistence failures (e.g. storage quota / disabled).\n }\n },\n [isControlled, isLocked],\n );\n\n const setPreset = useCallback(\n (p: ThemePresetId) => {\n setTheme(makePresetSpec(p));\n },\n [setTheme],\n );\n\n const setMode = useCallback(\n (m: ThemeMode) => {\n const nextMode = coerceThemeMode(m, allowedModes, normalizedDefaultMode);\n setModeState(nextMode);\n if (!isControlled) {\n try {\n window.localStorage.setItem(THEME_MODE_STORAGE_KEY, nextMode);\n } catch {\n // ignore\n }\n }\n },\n [allowedModes, isControlled, normalizedDefaultMode],\n );\n\n const controller = useMemo<OptThemeController>(\n () => ({\n pushTheme(id, spec) {\n if (!allowThemePromotion) return;\n setStack((prev) => {\n const filtered = prev.filter((entry) => entry.id !== id);\n return [...filtered, { id, spec }];\n });\n },\n popTheme(id) {\n if (!allowThemePromotion) return;\n setStack((prev) => prev.filter((entry) => entry.id !== id));\n },\n }),\n [allowThemePromotion],\n );\n\n const value = useMemo<ThemeContextValue>(\n () => ({\n theme: effectiveSpec,\n setTheme,\n preset: presetShadow,\n setPreset,\n mode,\n setMode,\n resolvedMode,\n isControlled,\n isGenerated: !isPresetSpec(effectiveSpec),\n isPromoted,\n }),\n [\n effectiveSpec,\n setTheme,\n presetShadow,\n setPreset,\n mode,\n setMode,\n resolvedMode,\n isControlled,\n isPromoted,\n ],\n );\n\n // Reference unused legacy helper to keep API parity for downstream tests.\n void getCompoundTheme;\n void resolveThemeMode;\n\n return (\n <ThemeContext.Provider value={value}>\n <OptThemeControllerContext.Provider value={controller}>\n {children}\n </OptThemeControllerContext.Provider>\n </ThemeContext.Provider>\n );\n}\n\n/** Provides opt theme. */\nexport function useOptTheme() {\n const ctx = useContext(ThemeContext);\n if (!ctx) throw new Error(\"useOptTheme must be used within OptThemeProvider\");\n return ctx;\n}\n\n/** Reads opt theme context when present without requiring a provider. */\nexport function useOptionalOptTheme() {\n return useContext(ThemeContext);\n}\n\nfunction computeResolvedMode(\n forceLight: boolean,\n mode: ThemeMode,\n systemDark: boolean,\n): \"light\" | \"dark\" {\n if (forceLight) return \"light\";\n if (mode === \"system\") return systemDark ? \"dark\" : \"light\";\n return mode;\n}\n\n// ── Spec equality (cheap path) ──\n\nfunction themeEqual(a: ThemeSpec, b: ThemeSpec): boolean {\n if (a === b) return true;\n if (a.kind !== b.kind) return false;\n if (a.kind === \"preset\" && b.kind === \"preset\") {\n return a.preset === b.preset && overridesEqual(a.overrides, b.overrides);\n }\n if (a.kind === \"generated\" && b.kind === \"generated\") {\n return (\n a.id === b.id &&\n a.label === b.label &&\n a.forceLightOnly === b.forceLightOnly &&\n JSON.stringify(a.palette) === JSON.stringify(b.palette) &&\n overridesEqual(a.overrides, b.overrides)\n );\n }\n if (a.kind === \"descriptor\" && b.kind === \"descriptor\") {\n return (\n a.descriptor === b.descriptor && overridesEqual(a.overrides, b.overrides)\n );\n }\n return false;\n}\n\nfunction overridesEqual(\n a: ThemeSpec[\"overrides\"],\n b: ThemeSpec[\"overrides\"],\n): boolean {\n if (a === b) return true;\n if (!a && !b) return true;\n if (!a || !b) return false;\n return JSON.stringify(a) === JSON.stringify(b);\n}\n\n// Re-export descriptor type for downstream consumers using the old import.\nexport type { ThemePresetId as DescriptorThemePresetId } from \"./presets\";\n","\"use client\";\n\nimport { cn } from \"../lib/cn\";\nimport {\n FORCE_LIGHT_PRESET_IDS,\n THEME_PRESET_IDS,\n THEME_REGISTRY,\n useOptionalOptTheme,\n type ThemeMode,\n type ThemePresetId,\n} from \"../lib/theme\";\n\n// ── Types ──\n/** Localized labels for the theme switcher component. */\nexport interface ThemeSwitcherLabels {\n /** Section heading shown above the preset grid. */\n heading?: string;\n /** Localized labels for the mode toggle (light/dark/system). */\n modeLabels?: Partial<Record<ThemeMode, string>>;\n /** Suffix added to the active preset's swatch button (a11y only). */\n activeSuffix?: string;\n}\n\n/** Props for the theme switcher component. */\nexport interface ThemeSwitcherProps {\n className?: string;\n labels?: ThemeSwitcherLabels;\n variant?: \"default\" | \"compact\";\n /** Slot for custom CSS variable editor (e.g. ColorPicker panel) */\n customPresetEditor?: React.ReactNode;\n /**\n * Controlled preset for local preview surfaces. When provided, preset\n * changes call `onPresetChange` instead of mutating the global provider.\n */\n preset?: ThemePresetId;\n onPresetChange?: (preset: ThemePresetId) => void;\n /** Controlled mode for local preview surfaces. */\n mode?: ThemeMode;\n onModeChange?: (mode: ThemeMode) => void;\n}\n\ninterface ThemeOption {\n value: ThemePresetId;\n label: string;\n description: string;\n swatches: readonly [string, string, string];\n}\n\n// ── Theme options derived from THEME_REGISTRY ──\n\nconst FALLBACK_SWATCHES: readonly [string, string, string] = [\n \"var(--opt-accent)\",\n \"var(--opt-bg-subtle)\",\n \"var(--opt-text)\",\n];\n\nfunction buildThemeOptions(): ThemeOption[] {\n return THEME_PRESET_IDS.map((id) => {\n const descriptor = THEME_REGISTRY[id];\n return {\n value: id,\n label: descriptor.label,\n description: descriptor.description,\n swatches: descriptor.switcherSwatches ?? FALLBACK_SWATCHES,\n };\n });\n}\n\nconst MODE_VALUES: readonly ThemeMode[] = [\"light\", \"dark\", \"system\"];\n\nconst DEFAULT_MODE_LABELS: Record<ThemeMode, string> = {\n light: \"Light\",\n dark: \"Dark\",\n system: \"System\",\n};\n\nconst ICON_SIZE = 14;\n\nconst MODE_ICONS: Record<ThemeMode, React.ReactNode> = {\n light: (\n <svg\n width={ICON_SIZE}\n height={ICON_SIZE}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"4\" />\n <path d=\"M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41\" />\n </svg>\n ),\n dark: (\n <svg\n width={ICON_SIZE}\n height={ICON_SIZE}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z\" />\n </svg>\n ),\n system: (\n <svg\n width={ICON_SIZE}\n height={ICON_SIZE}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <rect x=\"2\" y=\"3\" width=\"20\" height=\"14\" rx=\"2\" />\n <path d=\"M8 21h8M12 17v4\" />\n </svg>\n ),\n};\n\nconst DEFAULT_LABELS: Required<Omit<ThemeSwitcherLabels, \"modeLabels\">> & {\n modeLabels: Record<ThemeMode, string>;\n} = {\n heading: \"Theme\",\n activeSuffix: \"(active)\",\n modeLabels: DEFAULT_MODE_LABELS,\n};\n\nfunction resolveLabels(\n user: ThemeSwitcherLabels | undefined,\n): typeof DEFAULT_LABELS {\n return {\n heading: user?.heading ?? DEFAULT_LABELS.heading,\n activeSuffix: user?.activeSuffix ?? DEFAULT_LABELS.activeSuffix,\n modeLabels: { ...DEFAULT_MODE_LABELS, ...user?.modeLabels },\n };\n}\n\n// ── Component ──\n\n/** Renders the theme switcher component. */\nexport function ThemeSwitcher({\n className,\n labels: userLabels,\n variant = \"default\",\n customPresetEditor,\n preset: controlledPreset,\n onPresetChange,\n mode: controlledMode,\n onModeChange,\n}: ThemeSwitcherProps) {\n const themeContext = useOptionalOptTheme();\n const preset = controlledPreset ?? themeContext?.preset;\n const mode = controlledMode ?? themeContext?.mode ?? \"light\";\n const setPreset = onPresetChange ?? themeContext?.setPreset;\n const setMode = onModeChange ?? themeContext?.setMode;\n if (!preset || !setPreset || !setMode) {\n throw new Error(\n \"ThemeSwitcher must be used within OptThemeProvider or receive controlled preset/mode props\",\n );\n }\n const labels = resolveLabels(userLabels);\n const options = buildThemeOptions();\n // The active preset reflects the persisted state; when a generated theme is\n // promoted on top, we still highlight the preset that the user would land on\n // if they popped/cleared the override.\n const activePreset = preset;\n const forcedMode = FORCE_LIGHT_PRESET_IDS.has(activePreset);\n const showCustomBadge =\n controlledPreset === undefined &&\n (themeContext?.isGenerated === true || themeContext?.isPromoted === true);\n\n if (options.length === 0) {\n return null;\n }\n\n if (variant === \"compact\") {\n return (\n <div\n className={cn(\"flex items-center gap-1.5\", className)}\n data-opt-id=\"8JX0N\"\n data-opt-slug=\"theme-switcher.ThemeSwitcher\"\n >\n {options.map((theme) => {\n const isActive = activePreset === theme.value && !showCustomBadge;\n return (\n <button\n key={theme.value}\n title={theme.label}\n aria-label={\n isActive ? `${theme.label} ${labels.activeSuffix}` : theme.label\n }\n aria-pressed={isActive}\n onClick={() => setPreset(theme.value)}\n className={cn(\n \"flex h-7 w-7 items-center justify-center rounded-full transition-all\",\n isActive\n ? \"ring-accent ring-2 ring-offset-1\"\n : \"hover:ring-border-hover hover:ring-1\",\n )}\n >\n <span\n className=\"h-4 w-4 rounded-full\"\n style={{ backgroundColor: theme.swatches[0] }}\n />\n </button>\n );\n })}\n {/* Mode toggle */}\n <span className=\"bg-border mx-0.5 h-4 w-px\" aria-hidden=\"true\" />\n {MODE_VALUES.map((m) => (\n <button\n key={m}\n title={labels.modeLabels[m]}\n aria-label={labels.modeLabels[m]}\n aria-pressed={mode === m}\n onClick={() => setMode(m)}\n disabled={forcedMode}\n className={cn(\n \"flex h-7 w-7 items-center justify-center rounded-full transition-all\",\n forcedMode && \"pointer-events-none opacity-40\",\n mode === m\n ? \"bg-accent/15 text-accent\"\n : \"text-text-tertiary hover:text-text-primary hover:bg-bg-subtle\",\n )}\n >\n {MODE_ICONS[m]}\n </button>\n ))}\n </div>\n );\n }\n\n return (\n <div\n className={cn(\"gap-group flex flex-col\", className)}\n data-opt-id=\"8JX0N\"\n data-opt-slug=\"theme-switcher.ThemeSwitcher\"\n >\n <h3 className=\"text-text-tertiary text-xs font-semibold tracking-wider uppercase\">\n {labels.heading}\n </h3>\n <div className=\"gap-group grid grid-cols-2\">\n {options.map((theme) => {\n const isActive = activePreset === theme.value && !showCustomBadge;\n return (\n <button\n key={theme.value}\n onClick={() => setPreset(theme.value)}\n aria-pressed={isActive}\n className={cn(\n \"gap-element flex flex-col rounded-lg border p-3 text-left transition-all\",\n isActive\n ? \"border-accent bg-accent-subtle ring-accent ring-2\"\n : \"border-border bg-surface hover:border-border-hover hover:bg-bg-subtle\",\n )}\n >\n {/* Color swatches */}\n <div className=\"flex gap-1.5\">\n {theme.swatches.map((color, i) => (\n <span\n key={i}\n className=\"h-4 w-4 rounded-full\"\n style={{ backgroundColor: color }}\n />\n ))}\n </div>\n <div>\n <span className=\"text-text-primary text-sm font-medium\">\n {theme.label}\n </span>\n <p className=\"text-text-tertiary mt-0.5 text-xs\">\n {theme.description}\n </p>\n </div>\n </button>\n );\n })}\n </div>\n\n {/* Mode toggle */}\n <div\n className={cn(\n \"bg-bg-subtle flex gap-1 rounded-lg p-1\",\n forcedMode && \"pointer-events-none opacity-50\",\n )}\n >\n {MODE_VALUES.map((m) => (\n <button\n key={m}\n onClick={() => setMode(m)}\n disabled={forcedMode}\n aria-pressed={mode === m}\n className={cn(\n \"flex-1 rounded-md px-3 py-1.5 text-xs font-medium transition-all\",\n mode === m\n ? \"bg-surface text-text-primary shadow-sm\"\n : \"text-text-tertiary hover:text-text-secondary\",\n )}\n >\n {labels.modeLabels[m]}\n </button>\n ))}\n </div>\n {customPresetEditor && (\n <div className=\"border-border mt-4 border-t pt-4\">\n {customPresetEditor}\n </div>\n )}\n </div>\n );\n}\n\nThemeSwitcher.displayName = \"ThemeSwitcher\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../lib/cn\";\n\n/** Defines the prompt variable shape. */\nexport interface PromptVariable {\n name: string;\n label: string;\n placeholder?: string;\n defaultValue?: string;\n}\n\n/** Localized labels for the prompt template component. */\nexport interface PromptTemplateLabels {\n copy?: string;\n copied?: string;\n copyFailed?: string;\n}\n\nconst defaultLabels: Required<PromptTemplateLabels> = {\n copy: \"Copy\",\n copied: \"Copied!\",\n copyFailed: \"Copy failed\",\n};\n\n/** Props for the prompt template component. */\nexport interface PromptTemplateProps {\n title: string;\n description?: string;\n template: string;\n variables?: PromptVariable[];\n className?: string;\n labels?: PromptTemplateLabels;\n}\n\nfunction renderPrompt(template: string, values: Record<string, string>) {\n return template.replace(/\\{(\\w+)\\}/g, (match, key: string) =>\n values[key] !== undefined && values[key] !== \"\" ? values[key] : match,\n );\n}\n\n/** Renders the prompt template component. */\nexport function PromptTemplate({\n title,\n description,\n template,\n variables = [],\n className,\n labels: customLabels,\n}: PromptTemplateProps) {\n const labels = { ...defaultLabels, ...customLabels };\n\n const [values, setValues] = React.useState<Record<string, string>>(() => {\n const initial: Record<string, string> = {};\n for (const v of variables) {\n if (v.defaultValue) initial[v.name] = v.defaultValue;\n }\n return initial;\n });\n\n const [copied, setCopied] = React.useState(false);\n const copiedTimer = React.useRef<ReturnType<typeof setTimeout>>(null);\n\n const rendered = renderPrompt(template, values);\n\n const handleCopy = React.useCallback(async () => {\n try {\n await navigator.clipboard.writeText(rendered);\n setCopied(true);\n if (copiedTimer.current) clearTimeout(copiedTimer.current);\n copiedTimer.current = setTimeout(() => setCopied(false), 2000);\n } catch {\n // silently fail\n }\n }, [rendered]);\n\n const handleChange = React.useCallback((name: string, value: string) => {\n setValues((prev) => ({ ...prev, [name]: value }));\n }, []);\n\n // Render template with variable highlights\n const renderHighlighted = React.useMemo(() => {\n const parts: React.ReactNode[] = [];\n const regex = /\\{(\\w+)\\}/g;\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n\n while ((match = regex.exec(template)) !== null) {\n // Text before the variable\n if (match.index > lastIndex) {\n parts.push(template.slice(lastIndex, match.index));\n }\n const key = match[1];\n const val = values[key];\n const hasValue = val !== undefined && val !== \"\";\n parts.push(\n <mark\n key={`${key}-${match.index}`}\n className={cn(\n \"rounded px-0.5\",\n hasValue\n ? \"bg-accent/20 text-accent-fg\"\n : \"bg-warning/20 text-warning-fg\",\n )}\n >\n {hasValue ? val : match[0]}\n </mark>,\n );\n lastIndex = match.index + match[0].length;\n }\n if (lastIndex < template.length) {\n parts.push(template.slice(lastIndex));\n }\n return parts;\n }, [template, values]);\n\n return (\n <div\n className={cn(\n \"border-border overflow-hidden rounded-lg border\",\n className,\n )}\n data-opt-id=\"5E56D\"\n data-opt-slug=\"prompt-template.PromptTemplate\"\n >\n {/* Header */}\n <div className=\"border-border bg-surface-inset flex items-center justify-between border-b px-3 py-2\">\n <div className=\"min-w-0 flex-1\">\n <span className=\"text-text-primary text-sm font-medium\">{title}</span>\n {description && (\n <p className=\"text-text-tertiary mt-0.5 text-xs\">{description}</p>\n )}\n </div>\n <button\n type=\"button\"\n onClick={handleCopy}\n className=\"text-text-tertiary hover:text-text-primary ml-2 shrink-0 rounded px-2 py-0.5 text-xs transition-colors\"\n aria-label={labels.copy}\n >\n {copied ? labels.copied : labels.copy}\n </button>\n </div>\n\n {/* Variable inputs */}\n {variables.length > 0 && (\n <div className=\"border-border bg-surface-inset/50 gap-group flex flex-wrap items-center border-b px-3 py-2\">\n {variables.map((v) => (\n <label key={v.name} className=\"flex items-center gap-1.5 text-xs\">\n <span className=\"text-text-secondary font-medium\">{v.label}</span>\n <input\n type=\"text\"\n value={values[v.name] ?? \"\"}\n onChange={(e) => handleChange(v.name, e.target.value)}\n placeholder={v.placeholder ?? v.name}\n className=\"border-border bg-bg text-text-primary placeholder:text-text-tertiary w-32 rounded border px-2 py-1 text-xs\"\n aria-label={v.label}\n />\n </label>\n ))}\n </div>\n )}\n\n {/* Prompt body */}\n <pre className=\"text-text-primary overflow-auto p-3 text-sm whitespace-pre-wrap\">\n {renderHighlighted}\n </pre>\n </div>\n );\n}\n\nPromptTemplate.displayName = \"PromptTemplate\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport { Tooltip, TooltipAnchor, TooltipProvider } from \"../core/toolbar\";\nimport { cn } from \"../lib/cn\";\n\n// ── Context ──\n\ninterface SidebarContextValue {\n collapsed: boolean;\n collapsible: boolean;\n setCollapsed: (value: boolean) => void;\n toggle: () => void;\n width: number;\n collapsedWidth: number;\n}\n\nconst SidebarContext = React.createContext<SidebarContextValue | null>(null);\n\n/** Provides sidebar. */\nexport function useSidebar() {\n const ctx = React.useContext(SidebarContext);\n if (!ctx) {\n throw new Error(\"useSidebar must be used within a <Sidebar>\");\n }\n return ctx;\n}\n\n// ── Props ──\n\n/** Localized labels for the sidebar component. */\nexport type SidebarLabels = Record<never, never>;\n\n/** Props for the sidebar component. */\nexport interface SidebarProps {\n children: React.ReactNode;\n collapsible?: boolean;\n defaultCollapsed?: boolean;\n collapsed?: boolean;\n onCollapsedChange?: (collapsed: boolean) => void;\n width?: number;\n collapsedWidth?: number;\n className?: string;\n side?: \"left\" | \"right\";\n /** aside에 적용할 aria-label */\n label?: string;\n}\n\n// ── Sub-components ──\n\nfunction SidebarHeader({\n children,\n className,\n}: {\n children: React.ReactNode;\n className?: string;\n}) {\n return <div className={cn(\"shrink-0 p-4\", className)}>{children}</div>;\n}\nSidebarHeader.displayName = \"Sidebar.Header\";\n\nfunction SidebarContent({\n children,\n className,\n onKeyDown,\n}: {\n children: React.ReactNode;\n className?: string;\n onKeyDown?: React.KeyboardEventHandler<HTMLElement>;\n}) {\n const handleKeyDown = (event: React.KeyboardEvent<HTMLElement>) => {\n onKeyDown?.(event);\n if (\n event.defaultPrevented ||\n event.altKey ||\n event.ctrlKey ||\n event.metaKey ||\n event.shiftKey\n ) {\n return;\n }\n\n const items = Array.from(\n event.currentTarget.querySelectorAll<HTMLElement>(\n \"[data-sidebar-item]:not([disabled]):not([aria-disabled='true'])\",\n ),\n );\n const target =\n event.target instanceof HTMLElement\n ? event.target.closest<HTMLElement>(\"[data-sidebar-item]\")\n : null;\n const currentIndex = target ? items.indexOf(target) : -1;\n if (currentIndex < 0 || items.length === 0) return;\n\n let nextIndex: number | null = null;\n if (event.key === \"ArrowDown\") {\n nextIndex = (currentIndex + 1) % items.length;\n } else if (event.key === \"ArrowUp\") {\n nextIndex = (currentIndex - 1 + items.length) % items.length;\n } else if (event.key === \"Home\") {\n nextIndex = 0;\n } else if (event.key === \"End\") {\n nextIndex = items.length - 1;\n }\n if (nextIndex === null) return;\n\n event.preventDefault();\n const nextItem = items[nextIndex];\n nextItem?.focus({ preventScroll: true });\n nextItem?.scrollIntoView?.({ block: \"nearest\" });\n };\n\n return (\n <nav\n className={cn(\n \"flex-1 overflow-x-hidden overflow-y-auto px-2 py-1\",\n className,\n )}\n onKeyDown={handleKeyDown}\n >\n {children}\n </nav>\n );\n}\nSidebarContent.displayName = \"Sidebar.Content\";\n\nfunction SidebarFooter({\n children,\n className,\n}: {\n children: React.ReactNode;\n className?: string;\n}) {\n return <div className={cn(\"shrink-0 p-4\", className)}>{children}</div>;\n}\nSidebarFooter.displayName = \"Sidebar.Footer\";\n\nfunction SidebarTrigger({\n className,\n children,\n}: {\n className?: string;\n children?: React.ReactNode;\n}) {\n const { toggle, collapsed, collapsible } = useSidebar();\n\n if (!collapsible) return null;\n\n return (\n <button\n type=\"button\"\n onClick={toggle}\n aria-expanded={!collapsed}\n aria-label={collapsed ? \"사이드바 열기\" : \"사이드바 닫기\"}\n className={cn(\n \"text-text-secondary hover:bg-bg-subtle hover:text-text-primary inline-flex h-8 w-8 items-center justify-center rounded-md transition-colors\",\n className,\n )}\n >\n {children ?? (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n aria-hidden=\"true\"\n className=\"shrink-0\"\n >\n <rect\n x=\"1\"\n y=\"2\"\n width=\"14\"\n height=\"12\"\n rx=\"2\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n <line\n x1=\"5.5\"\n y1=\"2\"\n x2=\"5.5\"\n y2=\"14\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n </svg>\n )}\n </button>\n );\n}\nSidebarTrigger.displayName = \"Sidebar.Trigger\";\n\n// ── Group ──\n\ninterface SidebarGroupProps {\n children: React.ReactNode;\n /** 그룹 레이블. 접힌 상태에서 숨겨짐 */\n label?: string;\n className?: string;\n}\n\nfunction SidebarGroup({ children, label, className }: SidebarGroupProps) {\n const { collapsed } = useSidebar();\n const labelId = React.useId();\n\n return (\n <div\n role=\"group\"\n aria-labelledby={label ? labelId : undefined}\n className={cn(\"flex flex-col gap-0.5\", className)}\n >\n {label && !collapsed && (\n <span\n id={labelId}\n className=\"text-text-tertiary mt-4 mb-1 px-2 text-[11px] font-semibold tracking-wider uppercase\"\n >\n {label}\n </span>\n )}\n {children}\n </div>\n );\n}\nSidebarGroup.displayName = \"Sidebar.Group\";\n\n// ── Item ──\n\ninterface SidebarItemProps {\n children: React.ReactNode;\n /** 아이콘 (접힌 상태에서도 표시) */\n icon?: React.ReactNode;\n /** 활성 상태 */\n active?: boolean;\n /** 클릭 핸들러 */\n onClick?: () => void;\n /** 링크 URL — 설정 시 <a> 태그로 렌더링 */\n href?: string;\n /** 접힌 상태에서 표시할 툴팁 텍스트 */\n tooltip?: string;\n /** 우측 배지 (숫자 또는 ReactNode). 접힌 상태에서 아이콘 위 dot으로 축소 */\n badge?: React.ReactNode;\n className?: string;\n}\n\nfunction SidebarItem({\n children,\n icon,\n active = false,\n onClick,\n href,\n tooltip,\n badge,\n className,\n}: SidebarItemProps) {\n const { collapsed, collapsible } = useSidebar();\n const isCollapsed = collapsible && collapsed;\n\n const tooltipText =\n tooltip ?? (typeof children === \"string\" ? children : undefined);\n\n const sharedClassName = cn(\n \"relative flex w-full items-center gap-2 rounded-md text-left text-sm transition-colors outline-none\",\n isCollapsed ? \"justify-center px-0 py-2\" : \"px-2 py-1.5\",\n active\n ? \"bg-bg-subtle text-text-primary font-medium\"\n : \"text-text-secondary hover:bg-bg-subtle hover:text-text-primary\",\n \"focus-visible:ring-ring focus-visible:ring-2 focus-visible:ring-offset-1\",\n className,\n );\n\n const inner = (\n <>\n {active && (\n <span className=\"bg-accent absolute top-1/2 left-0 h-4 w-0.5 -translate-y-1/2 rounded-full\" />\n )}\n {icon && (\n <span className=\"relative flex h-5 w-5 shrink-0 items-center justify-center\">\n {icon}\n {badge != null && isCollapsed && (\n <span className=\"bg-accent absolute -top-1 -right-1 h-2 w-2 rounded-full\" />\n )}\n </span>\n )}\n {!isCollapsed && (\n <>\n <span className=\"truncate\">{children}</span>\n {badge != null && (\n <span className=\"bg-bg-muted text-text-secondary ml-auto shrink-0 rounded-full px-1.5 py-0.5 text-[10px] leading-none font-medium\">\n {badge}\n </span>\n )}\n </>\n )}\n </>\n );\n\n const ariaLabel = isCollapsed ? tooltipText : undefined;\n\n const element = href ? (\n <a\n href={href}\n onClick={onClick}\n data-sidebar-item=\"\"\n aria-current={active ? \"page\" : undefined}\n aria-label={ariaLabel}\n className={sharedClassName}\n >\n {inner}\n </a>\n ) : (\n <button\n type=\"button\"\n onClick={onClick}\n data-sidebar-item=\"\"\n aria-current={active ? \"page\" : undefined}\n aria-label={ariaLabel}\n className={sharedClassName}\n >\n {inner}\n </button>\n );\n\n if (isCollapsed && tooltipText) {\n return (\n <TooltipProvider placement=\"right\" portal>\n <TooltipAnchor render={element} />\n <Tooltip className=\"bg-foreground text-background z-[120] rounded-md px-2 py-1 text-xs shadow-lg\">\n {tooltipText}\n </Tooltip>\n </TooltipProvider>\n );\n }\n\n return element;\n}\nSidebarItem.displayName = \"Sidebar.Item\";\n\n// ── Separator ──\n\nfunction SidebarSeparator({ className }: { className?: string }) {\n return <hr className={cn(\"my-2 border-0\", className)} />;\n}\nSidebarSeparator.displayName = \"Sidebar.Separator\";\n\n// ── Root ──\n\nfunction SidebarRoot({\n children,\n collapsible = false,\n defaultCollapsed = false,\n collapsed: controlledCollapsed,\n onCollapsedChange,\n width = 280,\n collapsedWidth = 56,\n className,\n side = \"left\",\n label,\n}: SidebarProps) {\n const [internalCollapsed, setInternalCollapsed] =\n React.useState(defaultCollapsed);\n\n const isControlled = controlledCollapsed !== undefined;\n const collapsed = isControlled ? controlledCollapsed : internalCollapsed;\n\n const setCollapsed = React.useCallback(\n (value: boolean) => {\n if (!isControlled) setInternalCollapsed(value);\n onCollapsedChange?.(value);\n },\n [isControlled, onCollapsedChange],\n );\n\n const toggle = React.useCallback(() => {\n setCollapsed(!collapsed);\n }, [collapsed, setCollapsed]);\n\n const ctx = React.useMemo<SidebarContextValue>(\n () => ({\n collapsed,\n collapsible,\n setCollapsed,\n toggle,\n width,\n collapsedWidth,\n }),\n [collapsed, collapsible, setCollapsed, toggle, width, collapsedWidth],\n );\n\n const currentWidth = collapsible && collapsed ? collapsedWidth : width;\n\n // Keyboard shortcut: Ctrl+[ to toggle\n React.useEffect(() => {\n if (!collapsible) return;\n function handleKeyDown(e: KeyboardEvent) {\n if (e.ctrlKey && e.key === \"[\") {\n e.preventDefault();\n toggle();\n }\n }\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => document.removeEventListener(\"keydown\", handleKeyDown);\n }, [collapsible, toggle]);\n\n return (\n <SidebarContext.Provider value={ctx}>\n <aside\n aria-label={label ?? \"사이드바\"}\n data-collapsed={collapsed || undefined}\n data-side={side}\n className={cn(\n \"bg-surface sticky top-0 flex h-screen shrink-0 flex-col transition-[width] duration-200\",\n className,\n )}\n style={{ width: currentWidth }}\n data-opt-id=\"FG8ZG\"\n data-opt-slug=\"sidebar.Sidebar\"\n >\n {children}\n </aside>\n </SidebarContext.Provider>\n );\n}\n\nSidebarRoot.displayName = \"Sidebar\";\n\nexport const Sidebar = Object.assign(SidebarRoot, {\n Header: SidebarHeader,\n Content: SidebarContent,\n Footer: SidebarFooter,\n Trigger: SidebarTrigger,\n Group: SidebarGroup,\n Item: SidebarItem,\n Separator: SidebarSeparator,\n});\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../lib/cn\";\n\n// ── Context ──\n\ninterface AppShellContextValue {\n hasSidebar: boolean;\n}\n\nconst AppShellContext = React.createContext<AppShellContextValue>({\n hasSidebar: false,\n});\n\n// ── Sub-components ──\n\nfunction AppShellHeader({\n children,\n className,\n}: {\n children: React.ReactNode;\n className?: string;\n}) {\n return (\n <header\n className={cn(\n \"border-border bg-surface/80 shrink-0 border-b px-4 py-3 backdrop-blur\",\n className,\n )}\n >\n {children}\n </header>\n );\n}\nAppShellHeader.displayName = \"AppShell.Header\";\n\nfunction AppShellSidebar({\n children,\n className,\n}: {\n children: React.ReactNode;\n className?: string;\n}) {\n return <div className={cn(\"shrink-0\", className)}>{children}</div>;\n}\nAppShellSidebar.displayName = \"AppShell.Sidebar\";\n\nfunction AppShellContent({\n children,\n className,\n}: {\n children: React.ReactNode;\n className?: string;\n}) {\n return (\n <main className={cn(\"min-w-0 flex-1 overflow-auto\", className)}>\n {children}\n </main>\n );\n}\nAppShellContent.displayName = \"AppShell.Content\";\n\nfunction AppShellFooter({\n children,\n className,\n}: {\n children: React.ReactNode;\n className?: string;\n}) {\n return (\n <footer className={cn(\"border-border border-t px-4 py-3\", className)}>\n {children}\n </footer>\n );\n}\nAppShellFooter.displayName = \"AppShell.Footer\";\n\n// ── Root ──\n\n/** Props for the app shell component. */\nexport interface AppShellProps {\n children: React.ReactNode;\n className?: string;\n labels?: AppShellLabels;\n}\n\n/** Localized labels for the app shell component. */\nexport type AppShellLabels = Record<never, never>;\n\nfunction AppShellRoot({ children, className }: AppShellProps) {\n // Detect if sidebar slot is present\n const hasSidebar = React.Children.toArray(children).some(\n (child) =>\n React.isValidElement(child) &&\n (child.type === AppShellSidebar ||\n (child.type as { displayName?: string })?.displayName ===\n \"AppShell.Sidebar\"),\n );\n\n const ctx = React.useMemo(() => ({ hasSidebar }), [hasSidebar]);\n\n // Separate header/footer from body content\n const header: React.ReactNode[] = [];\n const sidebar: React.ReactNode[] = [];\n const content: React.ReactNode[] = [];\n const footer: React.ReactNode[] = [];\n\n React.Children.forEach(children, (child) => {\n if (!React.isValidElement(child)) return;\n const displayName = (child.type as { displayName?: string })?.displayName;\n\n if (child.type === AppShellHeader || displayName === \"AppShell.Header\") {\n header.push(child);\n } else if (\n child.type === AppShellSidebar ||\n displayName === \"AppShell.Sidebar\"\n ) {\n sidebar.push(child);\n } else if (\n child.type === AppShellFooter ||\n displayName === \"AppShell.Footer\"\n ) {\n footer.push(child);\n } else {\n content.push(child);\n }\n });\n\n const slotCount =\n header.length + sidebar.length + content.length + footer.length;\n\n if (slotCount === 0) return null;\n\n return (\n <AppShellContext.Provider value={ctx}>\n <div\n className={cn(\"flex min-h-screen flex-col\", className)}\n data-opt-id=\"EQGGQ\"\n data-opt-slug=\"app-shell.AppShell\"\n >\n {header}\n <div className=\"flex min-h-0 flex-1\">\n {sidebar}\n {content}\n </div>\n {footer}\n </div>\n </AppShellContext.Provider>\n );\n}\n\nAppShellRoot.displayName = \"AppShell\";\n\nexport const AppShell = Object.assign(AppShellRoot, {\n Header: AppShellHeader,\n Sidebar: AppShellSidebar,\n Content: AppShellContent,\n Footer: AppShellFooter,\n});\n","\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport {\n DialogRoot,\n DialogPanel,\n DialogHeading,\n DialogDescription,\n DialogHeader,\n DialogBody,\n DialogFooter,\n} from \"../core/dialog\";\nimport { Button } from \"../core/button\";\n\n/** Localized labels for the confirm dialog component. */\nexport type ConfirmDialogLabels = Record<never, never>;\n\n/** Props for the confirm dialog component. */\nexport interface ConfirmDialogProps {\n open: boolean;\n onConfirm: () => void;\n onCancel: () => void;\n title: string;\n description?: string;\n confirmLabel?: string;\n cancelLabel?: string;\n variant?: \"default\" | \"danger\";\n children?: ReactNode;\n}\n\n/** Renders the confirm dialog component. */\nexport function ConfirmDialog({\n open,\n onConfirm,\n onCancel,\n title,\n description,\n confirmLabel = \"Confirm\",\n cancelLabel = \"Cancel\",\n variant = \"default\",\n children,\n}: ConfirmDialogProps) {\n return (\n <DialogRoot\n open={open}\n onOpenChange={(v) => !v && onCancel()}\n data-opt-id=\"0VNJQ\"\n data-opt-slug=\"confirm-dialog.ConfirmDialog\"\n >\n <DialogPanel size=\"sm\">\n <DialogHeader>\n <DialogHeading>{title}</DialogHeading>\n {description && <DialogDescription>{description}</DialogDescription>}\n </DialogHeader>\n {children && <DialogBody>{children}</DialogBody>}\n <DialogFooter>\n <Button variant=\"secondary\" onClick={onCancel}>\n {cancelLabel}\n </Button>\n <Button\n variant={variant === \"danger\" ? \"danger\" : \"primary\"}\n onClick={onConfirm}\n >\n {confirmLabel}\n </Button>\n </DialogFooter>\n </DialogPanel>\n </DialogRoot>\n );\n}\n\nConfirmDialog.displayName = \"ConfirmDialog\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport {\n ComboboxRoot,\n ComboboxInput,\n ComboboxPopover,\n ComboboxItem,\n ComboboxEmpty,\n} from \"../core/combobox\";\nimport { Spinner } from \"../core/spinner\";\nimport { cn } from \"../lib/cn\";\n\n/** Localized labels for the async combobox component. */\nexport interface AsyncComboboxLabels {\n input?: string;\n loading?: string;\n noResults?: string;\n placeholder?: string;\n}\n\n/** Props for the async combobox component. */\nexport interface AsyncComboboxProps {\n onSearch: (query: string) => Promise<string[]>;\n debounceMs?: number;\n /** @deprecated Use labels.loading instead */\n loadingText?: string;\n minChars?: number;\n /** @deprecated Use labels.placeholder instead */\n placeholder?: string;\n onSelect?: (value: string) => void;\n labels?: AsyncComboboxLabels;\n className?: string;\n}\n\n/** Renders the async combobox component. */\nexport function AsyncCombobox({\n onSearch,\n debounceMs = 300,\n loadingText,\n minChars = 1,\n placeholder,\n onSelect,\n labels: customLabels,\n className,\n}: AsyncComboboxProps) {\n const labels = {\n input: placeholder ?? \"Search\",\n loading: loadingText ?? \"Loading…\",\n noResults: \"No results\",\n placeholder: placeholder ?? \"Search…\",\n ...customLabels,\n };\n const [query, setQuery] = React.useState(\"\");\n const [results, setResults] = React.useState<string[]>([]);\n const [loading, setLoading] = React.useState(false);\n const timerRef = React.useRef<ReturnType<typeof setTimeout>>(undefined);\n const searchGenerationRef = React.useRef(0);\n\n const handleInput = React.useCallback(\n (event: React.FormEvent<HTMLInputElement>) => {\n searchGenerationRef.current += 1;\n setQuery(event.currentTarget.value);\n },\n [],\n );\n\n const handleValueChange = React.useCallback(\n (value: string) => {\n searchGenerationRef.current += 1;\n if (timerRef.current) clearTimeout(timerRef.current);\n setLoading(false);\n setResults([]);\n onSelect?.(value);\n },\n [onSelect],\n );\n\n React.useEffect(() => {\n const generation = ++searchGenerationRef.current;\n\n if (timerRef.current) clearTimeout(timerRef.current);\n\n if (query.length < minChars) {\n setResults([]);\n setLoading(false);\n return;\n }\n setLoading(true);\n timerRef.current = setTimeout(async () => {\n try {\n const items = await onSearch(query);\n if (searchGenerationRef.current !== generation) {\n return;\n }\n setResults(items);\n } finally {\n if (searchGenerationRef.current === generation) {\n setLoading(false);\n }\n }\n }, debounceMs);\n return () => {\n if (timerRef.current) clearTimeout(timerRef.current);\n };\n }, [query, minChars, debounceMs, onSearch]);\n\n return (\n <ComboboxRoot\n onValueChange={handleValueChange}\n data-opt-id=\"KAKTV\"\n data-opt-slug=\"async-combobox.AsyncCombobox\"\n >\n <ComboboxInput\n className={cn(className)}\n aria-label={labels.input}\n aria-busy={loading || undefined}\n placeholder={labels.placeholder}\n onInput={handleInput}\n />\n <ComboboxPopover>\n {loading ? (\n <div\n className=\"text-text-secondary gap-element flex items-center px-3 py-2 text-sm\"\n role=\"status\"\n aria-live=\"polite\"\n aria-busy=\"true\"\n >\n <Spinner size=\"sm\" aria-hidden=\"true\" />\n {labels.loading}\n </div>\n ) : results.length === 0 ? (\n <ComboboxEmpty>{labels.noResults}</ComboboxEmpty>\n ) : (\n results.map((item) => (\n <ComboboxItem key={item} value={item}>\n {item}\n </ComboboxItem>\n ))\n )}\n </ComboboxPopover>\n </ComboboxRoot>\n );\n}\n","import * as React from \"react\";\nimport { TabsRoot, TabList, Tab, TabPanel } from \"../core/tabs\";\nimport { cn } from \"../lib/cn\";\nimport type { TabDef } from \"../lib/types\";\n\n/** Props for the vertical tabs component. */\nexport interface VerticalTabsProps {\n tabs: TabDef[];\n defaultTabId?: string;\n labels?: VerticalTabsLabels;\n className?: string;\n}\n\n/** Localized labels for the vertical tabs component. */\nexport interface VerticalTabsLabels {\n ariaLabel?: string;\n emptyMessage?: string;\n}\n\nconst defaultLabels: Required<VerticalTabsLabels> = {\n ariaLabel: \"Vertical tabs\",\n emptyMessage: \"No tabs available\",\n};\n\n/** Renders the vertical tabs component. */\nexport function VerticalTabs({\n tabs,\n defaultTabId,\n labels: customLabels,\n className,\n}: VerticalTabsProps) {\n const labels = { ...defaultLabels, ...customLabels };\n\n if (tabs.length === 0) {\n return (\n <div\n className={cn(\"text-text-secondary text-sm\", className)}\n data-opt-id=\"J81G4\"\n data-opt-slug=\"vertical-tabs.VerticalTabs\"\n >\n {labels.emptyMessage}\n </div>\n );\n }\n\n return (\n <TabsRoot\n defaultSelectedId={defaultTabId ?? tabs[0]?.id}\n data-opt-id=\"J81G4\"\n data-opt-slug=\"vertical-tabs.VerticalTabs\"\n >\n <div className={cn(\"gap-group flex\", className)}>\n <TabList\n aria-label={labels.ariaLabel}\n className=\"gap-element border-border flex flex-col border-r pr-4\"\n >\n {tabs.map((tab) => (\n <Tab key={tab.id} id={tab.id} className=\"justify-start text-left\">\n {tab.label}\n </Tab>\n ))}\n </TabList>\n <div className=\"flex-1\">\n {tabs.map((tab) => (\n <TabPanel key={tab.id} tabId={tab.id}>\n {tab.content}\n </TabPanel>\n ))}\n </div>\n </div>\n </TabsRoot>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { PopoverRoot, PopoverTrigger, PopoverContent } from \"../core/popover\";\nimport { Checkbox } from \"../core/checkbox\";\nimport { cn } from \"../lib/cn\";\n\n/** Defines the column toggler column shape. */\nexport interface ColumnTogglerColumn {\n id: string;\n header: string;\n}\n\n/** Props for the column toggler component. */\nexport interface ColumnTogglerProps {\n columns: ColumnTogglerColumn[];\n visibleColumns: string[];\n onChange: (visibleColumns: string[]) => void;\n className?: string;\n labels?: ColumnTogglerLabels;\n}\n\n/** Localized labels for the column toggler component. */\nexport interface ColumnTogglerLabels {\n triggerLabel?: (count: number) => string;\n emptyMessage?: string;\n}\n\nconst defaultLabels: Required<ColumnTogglerLabels> = {\n triggerLabel: (count) => `Columns (${count})`,\n emptyMessage: \"No columns available\",\n};\n\n/** Renders the column toggler component. */\nexport function ColumnToggler({\n columns,\n visibleColumns,\n onChange,\n className,\n labels: customLabels,\n}: ColumnTogglerProps) {\n const labels = { ...defaultLabels, ...customLabels };\n const visibleCount = visibleColumns.length;\n const hasColumns = columns.length > 0;\n\n const toggle = (id: string) => {\n if (visibleColumns.includes(id)) {\n onChange(visibleColumns.filter((c) => c !== id));\n } else {\n onChange([...visibleColumns, id]);\n }\n };\n\n return (\n <PopoverRoot\n data-opt-id=\"PPN5M\"\n data-opt-slug=\"column-toggler.ColumnToggler\"\n >\n <PopoverTrigger\n className={cn(\n \"border-border bg-surface text-text-primary hover:bg-bg-subtle inline-flex h-9 items-center gap-1.5 rounded-lg border px-3 text-sm font-medium\",\n className,\n )}\n >\n {labels.triggerLabel(visibleCount)}\n </PopoverTrigger>\n <PopoverContent className=\"w-56\">\n <div className=\"gap-element flex flex-col p-1\">\n {hasColumns ? (\n columns.map((col) => (\n <label\n key={col.id}\n className=\"text-text-primary hover:bg-bg-subtle gap-element flex cursor-pointer items-center rounded-md px-2 py-1.5 text-sm\"\n >\n <Checkbox\n checked={visibleColumns.includes(col.id)}\n onChange={() => toggle(col.id)}\n />\n {col.header}\n </label>\n ))\n ) : (\n <p className=\"text-text-tertiary px-2 py-1 text-sm\">\n {labels.emptyMessage}\n </p>\n )}\n </div>\n </PopoverContent>\n </PopoverRoot>\n );\n}\n\nColumnToggler.displayName = \"ColumnToggler\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport {\n DropdownMenu,\n DropdownTrigger,\n DropdownContent,\n DropdownItem,\n} from \"../core/dropdown-menu\";\nimport { Badge } from \"../core/badge\";\nimport { cn } from \"../lib/cn\";\n\n/** Defines the bulk action shape. */\nexport interface BulkActionDef {\n id: string;\n label: string;\n variant?: \"default\" | \"danger\";\n}\n\n/** Localized labels for the bulk actions component. */\nexport interface BulkActionsLabels {\n selected?: string;\n actions?: string;\n clear?: string;\n noActions?: string;\n}\n\n/** Props for the bulk actions component. */\nexport interface BulkActionsProps {\n selectedCount: number;\n actions: BulkActionDef[];\n onAction: (actionId: string) => void;\n onClear: () => void;\n labels?: BulkActionsLabels;\n className?: string;\n}\n\n/** Renders the bulk actions component. */\nexport function BulkActions({\n selectedCount,\n actions,\n onAction,\n onClear,\n labels: customLabels,\n className,\n}: BulkActionsProps) {\n const labels = {\n selected: \"selected\",\n actions: \"Actions\",\n clear: \"Clear\",\n noActions: \"No actions\",\n ...customLabels,\n };\n if (selectedCount === 0) return null;\n const hasActions = actions.length > 0;\n\n return (\n <div\n className={cn(\n \"gap-group border-border bg-surface flex items-center rounded-lg border px-4 py-2\",\n className,\n )}\n data-opt-id=\"Q3J33\"\n data-opt-slug=\"bulk-actions.BulkActions\"\n >\n <Badge variant=\"info\">\n {selectedCount} {labels.selected}\n </Badge>\n {hasActions ? (\n <DropdownMenu>\n <DropdownTrigger className=\"border-border bg-surface text-text-primary hover:bg-bg-subtle inline-flex h-8 items-center rounded-md border px-3 text-sm font-medium\">\n {labels.actions}\n </DropdownTrigger>\n <DropdownContent>\n {actions.map((action) => (\n <DropdownItem\n key={action.id}\n onClick={() => onAction(action.id)}\n className={\n action.variant === \"danger\" ? \"text-danger\" : undefined\n }\n >\n {action.label}\n </DropdownItem>\n ))}\n </DropdownContent>\n </DropdownMenu>\n ) : (\n <span className=\"text-text-secondary text-sm\">{labels.noActions}</span>\n )}\n <button\n type=\"button\"\n onClick={onClear}\n className=\"text-text-secondary hover:text-text-primary text-sm\"\n >\n {labels.clear}\n </button>\n </div>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { Trash2 } from \"lucide-react\";\nimport { Button } from \"../core/button\";\nimport { PopoverRoot, PopoverTrigger, PopoverContent } from \"../core/popover\";\nimport { Input } from \"../core/input\";\nimport { cn } from \"../lib/cn\";\n\n/** Defines the filter preset shape. */\nexport interface FilterPreset {\n id: string;\n name: string;\n filters: Record<string, unknown>;\n}\n\n/** Props for the saved filters component. */\nexport interface SavedFiltersProps {\n currentFilters: Record<string, unknown>;\n presets: FilterPreset[];\n onSavePreset: (name: string, filters: Record<string, unknown>) => void;\n onLoadPreset: (preset: FilterPreset) => void;\n onDeletePreset: (presetId: string) => void;\n className?: string;\n labels?: SavedFiltersLabels;\n}\n\n/** Localized labels for the saved filters component. */\nexport interface SavedFiltersLabels {\n triggerLabel?: (count: number) => string;\n emptyMessage?: string;\n deleteLabel?: (name: string) => string;\n namePlaceholder?: string;\n saveLabel?: string;\n confirmDeleteLabel?: string;\n cancelDeleteLabel?: string;\n}\n\nconst defaultLabels: Required<SavedFiltersLabels> = {\n triggerLabel: (count) => `Saved Filters (${count})`,\n emptyMessage: \"No saved filters\",\n deleteLabel: (name) => `Delete ${name}`,\n namePlaceholder: \"Filter name…\",\n saveLabel: \"Save\",\n confirmDeleteLabel: \"Confirm\",\n cancelDeleteLabel: \"Cancel\",\n};\n\n/** Renders the saved filters component. */\nexport function SavedFilters({\n currentFilters,\n presets,\n onSavePreset,\n onLoadPreset,\n onDeletePreset,\n className,\n labels: customLabels,\n}: SavedFiltersProps) {\n const labels = { ...defaultLabels, ...customLabels };\n const [newName, setNewName] = React.useState(\"\");\n const [pendingDeleteId, setPendingDeleteId] = React.useState<string | null>(\n null,\n );\n const triggerId = React.useId();\n\n const restoreDeleteTrigger = React.useCallback((presetId: string) => {\n requestAnimationFrame(() => {\n Array.from(\n document.querySelectorAll<HTMLElement>(\"[data-saved-filter-delete]\"),\n )\n .find((element) => element.dataset.savedFilterDelete === presetId)\n ?.focus();\n });\n }, []);\n\n const cancelPendingDelete = React.useCallback(\n (presetId: string) => {\n setPendingDeleteId(null);\n restoreDeleteTrigger(presetId);\n },\n [restoreDeleteTrigger],\n );\n\n React.useEffect(() => {\n if (!pendingDeleteId) return;\n const cancelDelete = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n event.preventDefault();\n cancelPendingDelete(pendingDeleteId);\n }\n };\n window.addEventListener(\"keydown\", cancelDelete);\n return () => window.removeEventListener(\"keydown\", cancelDelete);\n }, [cancelPendingDelete, pendingDeleteId]);\n\n return (\n <PopoverRoot data-opt-id=\"SPRCB\" data-opt-slug=\"saved-filters.SavedFilters\">\n <PopoverTrigger\n id={triggerId}\n className={cn(\n \"border-border bg-surface text-text-primary hover:bg-bg-subtle inline-flex h-9 items-center gap-1.5 rounded-lg border px-3 text-sm font-medium\",\n className,\n )}\n >\n {labels.triggerLabel(presets.length)}\n </PopoverTrigger>\n <PopoverContent className=\"w-72\">\n <section className=\"gap-group flex flex-col p-2\">\n {presets.length > 0 && (\n <ul\n className=\"gap-element m-0 flex list-none flex-col p-0\"\n onKeyDown={(event) => {\n if (\n event.defaultPrevented ||\n event.altKey ||\n event.ctrlKey ||\n event.metaKey ||\n event.shiftKey ||\n !(event.target instanceof HTMLElement)\n ) {\n return;\n }\n const items = Array.from(\n event.currentTarget.querySelectorAll<HTMLElement>(\n \"[data-saved-filter-item]\",\n ),\n );\n const current = event.target.closest<HTMLElement>(\n \"[data-saved-filter-item]\",\n );\n const index = current ? items.indexOf(current) : -1;\n if (index < 0 || items.length === 0) return;\n let next: number | null = null;\n if (event.key === \"ArrowDown\") {\n next = (index + 1) % items.length;\n } else if (event.key === \"ArrowUp\") {\n next = (index - 1 + items.length) % items.length;\n } else if (event.key === \"Home\") {\n next = 0;\n } else if (event.key === \"End\") {\n next = items.length - 1;\n }\n if (next === null) return;\n event.preventDefault();\n items[next]?.focus({ preventScroll: true });\n }}\n >\n {presets.map((preset) => (\n <li\n key={preset.id}\n className=\"gap-element hover:bg-bg-subtle flex min-h-9 items-center justify-between rounded-md px-2 py-1.5\"\n >\n <button\n type=\"button\"\n data-saved-filter-item=\"\"\n className=\"text-text-primary min-w-0 flex-1 truncate text-left text-sm\"\n onClick={() => {\n setPendingDeleteId(null);\n onLoadPreset(preset);\n }}\n >\n {preset.name}\n </button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"text-text-tertiary hover:text-danger size-7 p-0\"\n data-saved-filter-delete={preset.id}\n aria-expanded={pendingDeleteId === preset.id}\n aria-controls={\n pendingDeleteId === preset.id\n ? `${triggerId}-${preset.id}`\n : undefined\n }\n onClick={() => setPendingDeleteId(preset.id)}\n aria-label={labels.deleteLabel(preset.name)}\n >\n <Trash2 size={14} aria-hidden=\"true\" />\n </Button>\n {pendingDeleteId === preset.id ? (\n <span\n className=\"flex flex-none items-center gap-1\"\n onKeyDownCapture={(event) => {\n if (event.key === \"Escape\") {\n event.preventDefault();\n event.stopPropagation();\n cancelPendingDelete(preset.id);\n }\n }}\n >\n <Button\n id={`${triggerId}-${preset.id}`}\n variant=\"danger\"\n size=\"sm\"\n className=\"h-7 px-2\"\n autoFocus\n onClick={() => {\n onDeletePreset(preset.id);\n setPendingDeleteId(null);\n requestAnimationFrame(() => {\n document.getElementById(triggerId)?.focus();\n });\n }}\n >\n {labels.confirmDeleteLabel}\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 px-2\"\n onClick={() => cancelPendingDelete(preset.id)}\n >\n {labels.cancelDeleteLabel}\n </Button>\n </span>\n ) : null}\n </li>\n ))}\n </ul>\n )}\n {presets.length === 0 && (\n <p className=\"text-text-tertiary px-2 py-1 text-sm\">\n {labels.emptyMessage}\n </p>\n )}\n <form\n className=\"gap-element border-border flex border-t pt-2\"\n onSubmit={(event) => {\n event.preventDefault();\n if (newName.trim()) {\n onSavePreset(newName.trim(), currentFilters);\n setNewName(\"\");\n setPendingDeleteId(null);\n }\n }}\n >\n <Input\n value={newName}\n onChange={(e) => setNewName(e.target.value)}\n placeholder={labels.namePlaceholder}\n aria-label={labels.namePlaceholder}\n className=\"h-8 text-sm\"\n />\n <Button\n type=\"submit\"\n size=\"sm\"\n disabled={!newName.trim()}\n className=\"h-8\"\n >\n {labels.saveLabel}\n </Button>\n </form>\n </section>\n </PopoverContent>\n </PopoverRoot>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { PopoverRoot, PopoverTrigger, PopoverContent } from \"../core/popover\";\nimport { ScrollArea } from \"../core/scroll-area\";\nimport { cn } from \"../lib/cn\";\n\n/** Defines the notification item shape. */\nexport interface NotificationItem {\n id: string;\n title: string;\n message: string;\n time: string;\n read: boolean;\n group?: string;\n actionLabel?: string;\n}\n\n/** Props for the notification center component. */\nexport interface NotificationCenterProps {\n notifications: NotificationItem[];\n onMarkRead: (id: string) => void;\n onMarkAllRead: () => void;\n onAction?: (id: string) => void;\n className?: string;\n labels?: NotificationCenterLabels;\n}\n\n/** Localized labels for the notification center component. */\nexport interface NotificationCenterLabels {\n triggerLabel?: string;\n unreadSuffix?: (count: number) => string;\n title?: string;\n markAllRead?: string;\n emptyMessage?: string;\n}\n\nconst defaultLabels: Required<NotificationCenterLabels> = {\n triggerLabel: \"Notifications\",\n unreadSuffix: (count) => `(${count} unread)`,\n title: \"Notifications\",\n markAllRead: \"Mark all read\",\n emptyMessage: \"No notifications\",\n};\n\n/** Renders the notification center component. */\nexport function NotificationCenter({\n notifications,\n onMarkRead,\n onMarkAllRead,\n onAction,\n className,\n labels: customLabels,\n}: NotificationCenterProps) {\n const labels = { ...defaultLabels, ...customLabels };\n const unreadCount = notifications.filter((n) => !n.read).length;\n\n return (\n <PopoverRoot\n data-opt-id=\"7A0XY\"\n data-opt-slug=\"notification-center.NotificationCenter\"\n >\n <PopoverTrigger\n className={cn(\n \"border-border bg-surface hover:bg-bg-subtle relative inline-flex h-9 w-9 items-center justify-center rounded-lg border\",\n className,\n )}\n aria-label={`${labels.triggerLabel}${unreadCount > 0 ? ` ${labels.unreadSuffix(unreadCount)}` : \"\"}`}\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M6 14a2 2 0 0 0 4 0M13 5a5 5 0 0 0-10 0c0 5-2 7-2 7h14s-2-2-2-7\" />\n </svg>\n {unreadCount > 0 && (\n <span className=\"bg-danger text-danger-fg absolute -top-1 -right-1 flex h-4 min-w-4 items-center justify-center rounded-full px-1 text-[10px] font-bold\">\n {unreadCount}\n </span>\n )}\n </PopoverTrigger>\n <PopoverContent className=\"w-80 p-0\">\n <div className=\"border-border flex items-center justify-between border-b px-4 py-3\">\n <h3 className=\"text-text-primary text-sm font-semibold\">\n {labels.title}\n </h3>\n {unreadCount > 0 && (\n <button\n type=\"button\"\n className=\"text-accent text-xs hover:underline\"\n onClick={onMarkAllRead}\n >\n {labels.markAllRead}\n </button>\n )}\n </div>\n <ScrollArea className=\"max-h-80\">\n {notifications.length === 0 ? (\n <p className=\"text-text-tertiary px-4 py-8 text-center text-sm\">\n {labels.emptyMessage}\n </p>\n ) : (\n notifications.map((n) => (\n <div\n key={n.id}\n className={cn(\n \"border-border flex flex-col gap-1 border-b px-4 py-3 last:border-b-0\",\n !n.read && \"bg-accent-subtle/30 cursor-pointer\",\n )}\n {...(!n.read\n ? {\n role: \"button\" as const,\n tabIndex: 0,\n onClick: () => onMarkRead(n.id),\n onKeyDown: (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onMarkRead(n.id);\n }\n },\n }\n : {})}\n >\n <div className=\"gap-element flex items-start justify-between\">\n <p className=\"text-text-primary text-sm font-medium\">\n {n.title}\n </p>\n {!n.read && (\n <span className=\"bg-accent mt-1 h-2 w-2 flex-shrink-0 rounded-full\" />\n )}\n </div>\n <p className=\"text-text-secondary text-xs\">{n.message}</p>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-text-tertiary text-xs\">{n.time}</span>\n {n.actionLabel && onAction && (\n <button\n type=\"button\"\n className=\"text-accent text-xs hover:underline\"\n onClick={(e) => {\n e.stopPropagation();\n onAction(n.id);\n }}\n >\n {n.actionLabel}\n </button>\n )}\n </div>\n </div>\n ))\n )}\n </ScrollArea>\n </PopoverContent>\n </PopoverRoot>\n );\n}\n\nNotificationCenter.displayName = \"NotificationCenter\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport { Avatar } from \"../core/avatar\";\nimport { Badge } from \"../core/badge\";\nimport { EmptyState } from \"../core/empty-state\";\nimport { cn } from \"../lib/cn\";\nimport {\n OPT_TEXT_PRIMARY,\n OPT_TEXT_SECONDARY,\n OPT_TEXT_TERTIARY,\n OPT_BORDER,\n OPT_FOCUS_VISIBLE,\n} from \"../lib/styles\";\n\n// ── Action config ──\n\nconst ACTION_BADGE_VARIANT: Record<string, \"success\" | \"info\" | \"error\"> = {\n created: \"success\",\n updated: \"info\",\n deleted: \"error\",\n};\n\nconst ACTION_DOT_COLOR: Record<string, string> = {\n created: \"bg-success\",\n updated: \"bg-info\",\n deleted: \"bg-danger\",\n};\n\n// ── Types ──\n\n/** Defines the audit entry shape. */\nexport interface AuditEntry {\n id: string;\n user: { name: string; avatar?: string };\n action: string;\n target: string;\n timestamp: string;\n metadata?: Record<string, string>;\n}\n\n/** Localized labels for the audit log component. */\nexport interface AuditLogLabels {\n title?: string;\n loading?: string;\n loadMore?: string;\n empty?: string;\n}\n\n/** Props for the audit log component. */\nexport interface AuditLogProps {\n entries: AuditEntry[];\n onLoadMore?: () => void;\n loading?: boolean;\n labels?: AuditLogLabels;\n className?: string;\n}\n\n// ── Component ──\n\n/** Renders the audit log component. */\nexport function AuditLog({\n entries,\n onLoadMore,\n loading,\n labels: customLabels,\n className,\n}: AuditLogProps) {\n const labels = {\n title: \"Activity log\",\n loading: \"Loading…\",\n loadMore: \"Load more\",\n empty: \"No activity yet\",\n ...customLabels,\n };\n\n if (entries.length === 0) {\n return (\n <EmptyState\n title={labels.empty}\n className={className}\n data-opt-id=\"VZ046\"\n data-opt-slug=\"audit-log.AuditLog\"\n />\n );\n }\n\n return (\n <div\n className={cn(\"gap-group flex flex-col\", className)}\n data-opt-id=\"VZ046\"\n data-opt-slug=\"audit-log.AuditLog\"\n >\n {/* Timeline container */}\n <div className=\"relative\" role=\"list\" aria-label={labels.title}>\n {/* Vertical timeline line — centered on avatar (left-2 + 16px = 24px) */}\n <div\n className=\"bg-border absolute top-6 bottom-6 left-[23px] w-px\"\n aria-hidden=\"true\"\n />\n\n {entries.map((entry) => {\n const badgeVariant = ACTION_BADGE_VARIANT[entry.action];\n const dotColor = ACTION_DOT_COLOR[entry.action];\n\n return (\n <div\n key={entry.id}\n className=\"relative pb-3 pl-14 last:pb-0\"\n role=\"listitem\"\n >\n {/* Timeline avatar + dot — vertically centered with card header */}\n <div className=\"absolute top-4 left-2\">\n <Avatar\n src={entry.user.avatar}\n fallback={entry.user.name[0]}\n size=\"sm\"\n />\n {dotColor && (\n <div\n className={cn(\n \"border-surface absolute -right-0.5 -bottom-0.5 h-3 w-3 rounded-full border-2\",\n dotColor,\n )}\n aria-hidden=\"true\"\n />\n )}\n </div>\n\n {/* Entry card */}\n <div\n className={cn(\n \"rounded-lg p-3\",\n OPT_BORDER,\n \"bg-surface transition-colors\",\n )}\n >\n {/* Header row */}\n <div className=\"gap-element flex items-center\">\n {badgeVariant ? (\n <Badge variant={badgeVariant} size=\"sm\" dot>\n {entry.action}\n </Badge>\n ) : (\n <span\n className={cn(\"text-xs font-medium\", OPT_TEXT_SECONDARY)}\n >\n {entry.action}\n </span>\n )}\n <span className={cn(\"text-xs\", OPT_TEXT_TERTIARY)}>\n <time>{entry.timestamp}</time>\n </span>\n <span\n className={cn(\n \"ml-auto text-xs font-medium\",\n OPT_TEXT_SECONDARY,\n )}\n >\n {entry.user.name}\n </span>\n </div>\n\n {/* Action summary */}\n <p className={cn(\"mt-1.5 text-sm\", OPT_TEXT_PRIMARY)}>\n <span className=\"font-medium\">{entry.user.name}</span>{\" \"}\n {entry.action}{\" \"}\n <span className=\"font-medium\">{entry.target}</span>\n </p>\n\n {/* Metadata tags */}\n {entry.metadata && (\n <div className=\"gap-element mt-2 flex flex-wrap\">\n {Object.entries(entry.metadata).map(([k, v]) => (\n <span\n key={k}\n className=\"bg-bg-subtle text-text-secondary inline-flex items-center rounded px-1.5 py-0.5 text-xs\"\n >\n {k}: {v}\n </span>\n ))}\n </div>\n )}\n </div>\n </div>\n );\n })}\n </div>\n\n {onLoadMore && (\n <button\n type=\"button\"\n onClick={onLoadMore}\n disabled={loading}\n className={cn(\n \"text-accent mt-1 self-center rounded-md px-3 py-1.5 text-sm hover:underline disabled:opacity-50\",\n OPT_FOCUS_VISIBLE,\n )}\n >\n {loading ? labels.loading : labels.loadMore}\n </button>\n )}\n </div>\n );\n}\n\nAuditLog.displayName = \"AuditLog\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../lib/cn\";\nimport { OPT_BORDER, OPT_TH, OPT_TD, OPT_FOCUS_VISIBLE } from \"../lib/styles\";\n\n/** Defines the tree column shape. */\nexport interface TreeColumnDef<T> {\n id: string;\n header: string;\n accessor: keyof T | ((row: T) => React.ReactNode);\n width?: string;\n}\n\n/** Defines the tree node shape. */\nexport interface TreeNode<T> {\n data: T;\n id: string;\n children?: TreeNode<T>[];\n}\n\n/** Localized labels for the tree table component. */\nexport type TreeTableLabels = Record<never, never>;\n\n/** Props for the tree table component. */\nexport interface TreeTableProps<T> {\n data: TreeNode<T>[];\n columns: TreeColumnDef<T>[];\n defaultExpanded?: string[];\n indentSize?: number;\n className?: string;\n}\n\n/** Renders the tree table component. */\nexport function TreeTable<T>({\n data,\n columns,\n defaultExpanded = [],\n indentSize = 24,\n className,\n}: TreeTableProps<T>) {\n const [expanded, setExpanded] = React.useState<Set<string>>(\n () => new Set(defaultExpanded),\n );\n\n const toggle = (id: string) => {\n setExpanded((prev) => {\n const next = new Set(prev);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n };\n\n const getCellValue = (row: T, col: TreeColumnDef<T>) => {\n if (typeof col.accessor === \"function\") return col.accessor(row);\n return String(row[col.accessor] ?? \"\");\n };\n\n const renderRows = (nodes: TreeNode<T>[], depth: number): React.ReactNode[] =>\n nodes.flatMap((node) => {\n const hasChildren = node.children && node.children.length > 0;\n const isExpanded = expanded.has(node.id);\n return [\n <tr key={node.id} className=\"border-border border-b\">\n {columns.map((col, ci) => (\n <td key={col.id} className={cn(OPT_TD)}>\n <div\n className=\"flex items-center\"\n style={\n ci === 0 ? { paddingLeft: depth * indentSize } : undefined\n }\n >\n {ci === 0 && hasChildren && (\n <button\n type=\"button\"\n onClick={() => toggle(node.id)}\n className={cn(\n \"mr-1 flex h-5 w-5 items-center justify-center rounded text-xs\",\n OPT_FOCUS_VISIBLE,\n )}\n aria-expanded={isExpanded}\n aria-label={isExpanded ? \"Collapse\" : \"Expand\"}\n >\n {isExpanded ? \"▼\" : \"▶\"}\n </button>\n )}\n {ci === 0 && !hasChildren && (\n <span className=\"mr-1 inline-block w-5\" />\n )}\n {getCellValue(node.data, col)}\n </div>\n </td>\n ))}\n </tr>,\n ...(isExpanded && hasChildren\n ? renderRows(node.children!, depth + 1)\n : []),\n ];\n });\n\n return (\n <div\n className={cn(\"overflow-auto\", className)}\n data-opt-id=\"EJRTW\"\n data-opt-slug=\"tree-table.TreeTable\"\n >\n <table className={cn(\"w-full border-collapse\", OPT_BORDER)}>\n <thead>\n <tr className=\"border-border border-b\">\n {columns.map((col) => (\n <th\n key={col.id}\n className={cn(OPT_TH)}\n style={{ width: col.width }}\n >\n {col.header}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>{renderRows(data, 0)}</tbody>\n </table>\n </div>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { EmptyState } from \"../core/empty-state\";\nimport { cn } from \"../lib/cn\";\nimport { OPT_BORDER, OPT_TH, OPT_TD, OPT_INPUT } from \"../lib/styles\";\n\n/** Defines the inline edit column shape. */\nexport interface InlineEditColumnDef<T> {\n id: string;\n header: string;\n accessor: keyof T | ((row: T) => React.ReactNode);\n editable?: boolean;\n width?: string;\n}\n\n/** Props for the inline edit table component. */\nexport interface InlineEditTableProps<T> {\n data: T[];\n columns: InlineEditColumnDef<T>[];\n keyExtractor: (row: T) => string;\n onCellEdit?: (rowId: string, columnId: string, value: string) => void;\n labels?: InlineEditTableLabels;\n className?: string;\n}\n\n/** Localized labels for the inline edit table component. */\nexport interface InlineEditTableLabels {\n emptyMessage?: string;\n}\n\nconst defaultLabels: Required<InlineEditTableLabels> = {\n emptyMessage: \"No rows to edit\",\n};\n\n/** Renders the inline edit table component. */\nexport function InlineEditTable<T>({\n data,\n columns,\n keyExtractor,\n onCellEdit,\n labels: customLabels,\n className,\n}: InlineEditTableProps<T>) {\n const labels = { ...defaultLabels, ...customLabels };\n const [editCell, setEditCell] = React.useState<{\n rowId: string;\n colId: string;\n } | null>(null);\n const [editValue, setEditValue] = React.useState(\"\");\n const inputRef = React.useRef<HTMLInputElement>(null);\n\n const getCellValue = (row: T, col: InlineEditColumnDef<T>): string => {\n if (typeof col.accessor === \"function\")\n return String(col.accessor(row) ?? \"\");\n return String(row[col.accessor] ?? \"\");\n };\n\n const startEdit = (rowId: string, colId: string, currentValue: string) => {\n setEditCell({ rowId, colId });\n setEditValue(currentValue);\n };\n\n const confirmEdit = () => {\n if (editCell && onCellEdit) {\n onCellEdit(editCell.rowId, editCell.colId, editValue);\n }\n setEditCell(null);\n };\n\n const cancelEdit = () => setEditCell(null);\n\n React.useEffect(() => {\n if (editCell) inputRef.current?.focus();\n }, [editCell]);\n\n if (data.length === 0) {\n return (\n <div\n className={cn(\"flex min-h-40 items-center justify-center\", className)}\n data-opt-id=\"5W3J1\"\n data-opt-slug=\"inline-edit-table.InlineEditTable\"\n >\n <EmptyState title={labels.emptyMessage} />\n </div>\n );\n }\n\n return (\n <div\n className={cn(\"overflow-auto\", className)}\n data-opt-id=\"5W3J1\"\n data-opt-slug=\"inline-edit-table.InlineEditTable\"\n >\n <table className={cn(\"w-full border-collapse\", OPT_BORDER)}>\n <thead>\n <tr className=\"border-border border-b\">\n {columns.map((col) => (\n <th\n key={col.id}\n className={cn(OPT_TH)}\n style={{ width: col.width }}\n >\n {col.header}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {data.map((row) => {\n const rowId = keyExtractor(row);\n return (\n <tr key={rowId} className=\"border-border border-b\">\n {columns.map((col) => {\n const isEditing =\n editCell?.rowId === rowId && editCell?.colId === col.id;\n const value = getCellValue(row, col);\n return (\n <td key={col.id} className={cn(OPT_TD)}>\n {isEditing ? (\n <input\n ref={inputRef}\n className={cn(\n \"w-full rounded px-2 py-1 text-sm\",\n OPT_INPUT,\n )}\n value={editValue}\n onChange={(e) => setEditValue(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \"Tab\") {\n e.preventDefault();\n confirmEdit();\n }\n if (e.key === \"Escape\") cancelEdit();\n }}\n onBlur={confirmEdit}\n />\n ) : (\n <span\n className={\n col.editable\n ? \"cursor-pointer hover:underline\"\n : undefined\n }\n onDoubleClick={() =>\n col.editable && startEdit(rowId, col.id, value)\n }\n onKeyDown={(e) => {\n if (col.editable && e.key === \"Enter\")\n startEdit(rowId, col.id, value);\n }}\n tabIndex={col.editable ? 0 : undefined}\n role={col.editable ? \"button\" : undefined}\n >\n {value}\n </span>\n )}\n </td>\n );\n })}\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { EmptyState } from \"../core/empty-state\";\nimport { cn } from \"../lib/cn\";\n\n/** Defines the kanban column shape. */\nexport interface KanbanColumn<T> {\n id: string;\n title: string;\n items: T[];\n}\n\n/** Localized labels for the kanban board component. */\nexport type KanbanBoardLabels = Record<never, never>;\n\n/** Props for the kanban board component. */\nexport interface KanbanBoardProps<T> {\n columns: KanbanColumn<T>[];\n onDragEnd: (\n itemId: string,\n fromColumnId: string,\n toColumnId: string,\n toIndex: number,\n ) => void;\n renderCard: (item: T) => React.ReactNode;\n keyExtractor: (item: T) => string;\n emptyMessage?: string;\n className?: string;\n}\n\n/** Renders the kanban board component. */\nexport function KanbanBoard<T>({\n columns,\n onDragEnd,\n renderCard,\n keyExtractor,\n emptyMessage = \"No items yet\",\n className,\n}: KanbanBoardProps<T>) {\n const [dragItem, setDragItem] = React.useState<{\n id: string;\n fromCol: string;\n } | null>(null);\n const [dropTarget, setDropTarget] = React.useState<{\n colId: string;\n index: number;\n } | null>(null);\n\n const handleDragStart =\n (itemId: string, colId: string) => (e: React.DragEvent) => {\n e.dataTransfer.effectAllowed = \"move\";\n setDragItem({ id: itemId, fromCol: colId });\n };\n\n const handleDragOver =\n (colId: string, index: number) => (e: React.DragEvent) => {\n e.preventDefault();\n e.dataTransfer.dropEffect = \"move\";\n setDropTarget({ colId, index });\n };\n\n const handleDrop = (colId: string, index: number) => (e: React.DragEvent) => {\n e.preventDefault();\n if (dragItem) {\n onDragEnd(dragItem.id, dragItem.fromCol, colId, index);\n }\n setDragItem(null);\n setDropTarget(null);\n };\n\n const handleDragEnd = () => {\n setDragItem(null);\n setDropTarget(null);\n };\n\n if (columns.length === 0) {\n return (\n <EmptyState\n title={emptyMessage}\n className={className}\n data-opt-id=\"T6JWY\"\n data-opt-slug=\"kanban-board.KanbanBoard\"\n />\n );\n }\n\n return (\n <div\n className={cn(\"gap-group flex overflow-x-auto\", className)}\n data-opt-id=\"T6JWY\"\n data-opt-slug=\"kanban-board.KanbanBoard\"\n >\n {columns.map((col) => (\n <div\n key={col.id}\n className=\"bg-bg-subtle flex min-w-[280px] flex-1 flex-col rounded-lg p-3\"\n onDragOver={(e) => {\n e.preventDefault();\n if (col.items.length === 0)\n setDropTarget({ colId: col.id, index: 0 });\n }}\n onDrop={(e) => {\n if (col.items.length === 0) handleDrop(col.id, 0)(e);\n }}\n >\n <div className=\"mb-3 flex items-center justify-between\">\n <h3 className=\"text-text-primary text-sm font-semibold\">\n {col.title}\n </h3>\n <span className=\"text-text-tertiary text-xs\">\n {col.items.length}\n </span>\n </div>\n <div className=\"gap-element flex flex-1 flex-col\">\n {col.items.map((item, i) => {\n const id = keyExtractor(item);\n const isDropHere =\n dropTarget?.colId === col.id && dropTarget?.index === i;\n return (\n <React.Fragment key={id}>\n {isDropHere && (\n <div className=\"bg-accent h-0.5 rounded-full\" />\n )}\n <div\n draggable\n onDragStart={handleDragStart(id, col.id)}\n onDragOver={handleDragOver(col.id, i)}\n onDrop={handleDrop(col.id, i)}\n onDragEnd={handleDragEnd}\n className={cn(\n \"bg-surface border-border cursor-grab rounded-lg border p-3 shadow-sm transition-opacity\",\n dragItem?.id === id && \"opacity-50\",\n )}\n >\n {renderCard(item)}\n </div>\n </React.Fragment>\n );\n })}\n {dropTarget?.colId === col.id &&\n dropTarget?.index === col.items.length && (\n <div className=\"bg-accent h-0.5 rounded-full\" />\n )}\n </div>\n </div>\n ))}\n </div>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../lib/cn\";\nimport { OPT_FOCUS_VISIBLE } from \"../lib/styles\";\n\ntype ToolbarAction =\n | \"bold\"\n | \"italic\"\n | \"link\"\n | \"code\"\n | \"heading\"\n | \"list\"\n | \"quote\";\n\n/** Localized labels for the rich text editor component. */\nexport type RichTextEditorLabels = Record<never, never>;\n\n/** Props for the rich text editor component. */\nexport interface RichTextEditorProps {\n value: string;\n onChange: (value: string) => void;\n placeholder?: string;\n toolbar?: ToolbarAction[];\n className?: string;\n}\n\nconst TOOLBAR_BUTTONS: Record<\n ToolbarAction,\n { label: string; prefix: string; suffix: string; block?: boolean }\n> = {\n bold: { label: \"B\", prefix: \"**\", suffix: \"**\" },\n italic: { label: \"I\", prefix: \"_\", suffix: \"_\" },\n code: { label: \"</>\", prefix: \"`\", suffix: \"`\" },\n link: { label: \"\\uD83D\\uDD17\", prefix: \"[\", suffix: \"](url)\" },\n heading: { label: \"H\", prefix: \"## \", suffix: \"\", block: true },\n list: { label: \"\\u2022\", prefix: \"- \", suffix: \"\", block: true },\n quote: { label: \">\", prefix: \"> \", suffix: \"\", block: true },\n};\n\n/** Renders the rich text editor component. */\nexport function RichTextEditor({\n value,\n onChange,\n placeholder = \"Write something\\u2026\",\n toolbar = [\"bold\", \"italic\", \"code\", \"link\", \"heading\", \"list\", \"quote\"],\n className,\n}: RichTextEditorProps) {\n const textareaRef = React.useRef<HTMLTextAreaElement>(null);\n\n const applyFormat = (action: ToolbarAction) => {\n const ta = textareaRef.current;\n if (!ta) return;\n\n const { selectionStart, selectionEnd } = ta;\n const selected = value.slice(selectionStart, selectionEnd);\n const btn = TOOLBAR_BUTTONS[action];\n\n let replacement: string;\n let cursorOffset: number;\n\n if (btn.block) {\n const lineStart = value.lastIndexOf(\"\\n\", selectionStart - 1) + 1;\n const before = value.slice(0, lineStart);\n const after = value.slice(selectionStart);\n const newValue = before + btn.prefix + after;\n onChange(newValue);\n cursorOffset = lineStart + btn.prefix.length;\n setTimeout(() => ta.setSelectionRange(cursorOffset, cursorOffset), 0);\n return;\n }\n\n if (selected) {\n replacement = btn.prefix + selected + btn.suffix;\n cursorOffset = selectionStart + replacement.length;\n } else {\n replacement = btn.prefix + \"text\" + btn.suffix;\n cursorOffset = selectionStart + btn.prefix.length + 4;\n }\n\n const newValue =\n value.slice(0, selectionStart) + replacement + value.slice(selectionEnd);\n onChange(newValue);\n setTimeout(() => {\n if (selected) {\n ta.setSelectionRange(cursorOffset, cursorOffset);\n } else {\n ta.setSelectionRange(\n selectionStart + btn.prefix.length,\n selectionStart + btn.prefix.length + 4,\n );\n }\n }, 0);\n };\n\n return (\n <div\n className={cn(\n \"border-border flex flex-col overflow-hidden rounded-lg border\",\n className,\n )}\n data-opt-id=\"441JQ\"\n data-opt-slug=\"rich-text-editor.RichTextEditor\"\n >\n <div className=\"border-border bg-bg-subtle flex gap-1 border-b px-2 py-1.5\">\n {toolbar.map((action) => (\n <button\n key={action}\n type=\"button\"\n onClick={() => applyFormat(action)}\n className={cn(\n \"text-text-secondary hover:bg-surface hover:text-text-primary inline-flex h-7 min-w-7 items-center justify-center rounded px-1.5 text-xs font-medium\",\n OPT_FOCUS_VISIBLE,\n )}\n title={action}\n aria-label={action}\n >\n {TOOLBAR_BUTTONS[action].label}\n </button>\n ))}\n </div>\n <textarea\n ref={textareaRef}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n placeholder={placeholder}\n aria-label=\"Rich text editor\"\n className=\"text-text-primary placeholder:text-text-tertiary focus-visible:ring-ring focus-visible:ring-offset-ring-offset min-h-[160px] resize-y bg-transparent px-3 py-2 font-mono text-sm outline-none focus-visible:ring-2 focus-visible:ring-offset-1\"\n />\n </div>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../lib/cn\";\nimport { OPT_FOCUS_VISIBLE } from \"../lib/styles\";\n\n/** Localized labels for the code diff viewer component. */\nexport type CodeDiffViewerLabels = Record<never, never>;\n\n/** Props for the code diff viewer component. */\nexport interface CodeDiffViewerProps {\n original: string;\n modified: string;\n mode?: \"split\" | \"unified\";\n showLineNumbers?: boolean;\n scrollLabel?: string;\n className?: string;\n}\n\ninterface DiffLine {\n type: \"equal\" | \"add\" | \"remove\";\n content: string;\n oldLineNo?: number;\n newLineNo?: number;\n}\n\nfunction computeDiff(original: string, modified: string): DiffLine[] {\n const oldLines = original.split(\"\\n\");\n const newLines = modified.split(\"\\n\");\n const m = oldLines.length;\n const n = newLines.length;\n\n // LCS DP\n const dp: number[][] = Array.from({ length: m + 1 }, () =>\n Array(n + 1).fill(0),\n );\n for (let i = 1; i <= m; i++) {\n for (let j = 1; j <= n; j++) {\n dp[i][j] =\n oldLines[i - 1] === newLines[j - 1]\n ? dp[i - 1][j - 1] + 1\n : Math.max(dp[i - 1][j], dp[i][j - 1]);\n }\n }\n\n // Backtrack\n const result: DiffLine[] = [];\n let i = m,\n j = n;\n while (i > 0 || j > 0) {\n if (i > 0 && j > 0 && oldLines[i - 1] === newLines[j - 1]) {\n result.unshift({\n type: \"equal\",\n content: oldLines[i - 1],\n oldLineNo: i,\n newLineNo: j,\n });\n i--;\n j--;\n } else if (j > 0 && (i === 0 || dp[i][j - 1] >= dp[i - 1][j])) {\n result.unshift({ type: \"add\", content: newLines[j - 1], newLineNo: j });\n j--;\n } else {\n result.unshift({\n type: \"remove\",\n content: oldLines[i - 1],\n oldLineNo: i,\n });\n i--;\n }\n }\n return result;\n}\n\nconst LINE_STYLES: Record<DiffLine[\"type\"], string> = {\n equal: \"\",\n add: \"bg-success-subtle text-success-fg\",\n remove: \"bg-danger-subtle text-danger-fg\",\n};\n\nconst LINE_PREFIXES: Record<DiffLine[\"type\"], string> = {\n equal: \" \",\n add: \"+\",\n remove: \"-\",\n};\n\n/** Renders the code diff viewer component. */\nexport function CodeDiffViewer({\n original,\n modified,\n mode = \"unified\",\n showLineNumbers = true,\n scrollLabel,\n className,\n}: CodeDiffViewerProps) {\n const diff = React.useMemo(\n () => computeDiff(original, modified),\n [original, modified],\n );\n\n if (mode === \"split\") {\n return (\n <div\n className={cn(\n \"border-border overflow-auto rounded-lg border\",\n OPT_FOCUS_VISIBLE,\n className,\n )}\n tabIndex={0}\n role=\"region\"\n aria-label={scrollLabel ?? \"Code diff\"}\n data-opt-id=\"GSDVD\"\n data-opt-slug=\"code-diff-viewer.CodeDiffViewer\"\n >\n <div className=\"flex\">\n <div className=\"flex-1 overflow-auto\">\n <pre className=\"font-mono text-xs leading-6\">\n {diff\n .filter((l) => l.type !== \"add\")\n .map((line, i) => (\n <div key={i} className={cn(\"px-3\", LINE_STYLES[line.type])}>\n {showLineNumbers && (\n <span className=\"text-text-tertiary mr-4 inline-block w-8 text-right select-none\">\n {line.oldLineNo ?? \"\"}\n </span>\n )}\n {LINE_PREFIXES[line.type]} {line.content}\n </div>\n ))}\n </pre>\n </div>\n <div className=\"bg-border w-px\" />\n <div className=\"flex-1 overflow-auto\">\n <pre className=\"font-mono text-xs leading-6\">\n {diff\n .filter((l) => l.type !== \"remove\")\n .map((line, i) => (\n <div key={i} className={cn(\"px-3\", LINE_STYLES[line.type])}>\n {showLineNumbers && (\n <span className=\"text-text-tertiary mr-4 inline-block w-8 text-right select-none\">\n {line.newLineNo ?? \"\"}\n </span>\n )}\n {LINE_PREFIXES[line.type]} {line.content}\n </div>\n ))}\n </pre>\n </div>\n </div>\n </div>\n );\n }\n\n return (\n <div\n className={cn(\n \"border-border overflow-auto rounded-lg border\",\n OPT_FOCUS_VISIBLE,\n className,\n )}\n tabIndex={0}\n role=\"region\"\n aria-label={scrollLabel ?? \"Code diff\"}\n data-opt-id=\"GSDVD\"\n data-opt-slug=\"code-diff-viewer.CodeDiffViewer\"\n >\n <pre className=\"font-mono text-xs leading-6\">\n {diff.map((line, i) => (\n <div key={i} className={cn(\"px-3\", LINE_STYLES[line.type])}>\n {showLineNumbers && (\n <>\n <span className=\"text-text-tertiary mr-2 inline-block w-8 text-right select-none\">\n {line.oldLineNo ?? \"\"}\n </span>\n <span className=\"text-text-tertiary mr-4 inline-block w-8 text-right select-none\">\n {line.newLineNo ?? \"\"}\n </span>\n </>\n )}\n {LINE_PREFIXES[line.type]} {line.content}\n </div>\n ))}\n </pre>\n </div>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { Input } from \"../core/input\";\nimport { Button } from \"../core/button\";\nimport { Checkbox } from \"../core/checkbox\";\nimport { NumberInput } from \"../core/number-input\";\nimport { cn } from \"../lib/cn\";\n\n/** Defines the webhook shape. */\nexport interface WebhookDef {\n url: string;\n events: string[];\n retries: number;\n active: boolean;\n}\n\n/** Props for the webhook component. */\nexport interface WebhookConfigProps {\n webhook: WebhookDef;\n onChange: (webhook: WebhookDef) => void;\n availableEvents: string[];\n onTest?: () => void;\n className?: string;\n labels?: WebhookConfigLabels;\n}\n\n/** Localized labels for the webhook component. */\nexport interface WebhookConfigLabels {\n webhookUrl?: string;\n events?: string;\n retries?: string;\n testWebhook?: string;\n emptyEventsMessage?: string;\n}\n\nconst defaultLabels: Required<WebhookConfigLabels> = {\n webhookUrl: \"Webhook URL\",\n events: \"Events\",\n retries: \"Retries\",\n testWebhook: \"Test Webhook\",\n emptyEventsMessage: \"No events available\",\n};\n\n/** Renders the webhook config component. */\nexport function WebhookConfig({\n webhook,\n onChange,\n availableEvents,\n onTest,\n className,\n labels: customLabels,\n}: WebhookConfigProps) {\n const labels = { ...defaultLabels, ...customLabels };\n const toggleEvent = (event: string) => {\n const events = webhook.events.includes(event)\n ? webhook.events.filter((e) => e !== event)\n : [...webhook.events, event];\n onChange({ ...webhook, events });\n };\n\n return (\n <div\n className={cn(\"gap-group flex flex-col\", className)}\n data-opt-id=\"B6B1Z\"\n data-opt-slug=\"webhook-config.WebhookConfig\"\n >\n <div className=\"gap-element flex flex-col\">\n <label className=\"text-text-primary text-sm font-medium\">\n {labels.webhookUrl}\n </label>\n <Input\n value={webhook.url}\n onChange={(e) => onChange({ ...webhook, url: e.target.value })}\n placeholder=\"https://example.com/webhook\"\n />\n </div>\n\n <div className=\"gap-element flex flex-col\">\n <label className=\"text-text-primary text-sm font-medium\">\n {labels.events}\n </label>\n <div className=\"gap-element flex flex-wrap\">\n {availableEvents.length > 0 ? (\n availableEvents.map((event) => (\n <label key={event} className=\"flex items-center gap-1.5 text-sm\">\n <Checkbox\n name={`event-${event}`}\n checked={webhook.events.includes(event)}\n onChange={() => toggleEvent(event)}\n />\n <span className=\"text-text-secondary\">{event}</span>\n </label>\n ))\n ) : (\n <span className=\"text-text-tertiary text-sm\">\n {labels.emptyEventsMessage}\n </span>\n )}\n </div>\n </div>\n\n <div className=\"gap-element flex flex-col\">\n <label className=\"text-text-primary text-sm font-medium\">\n {labels.retries}\n </label>\n <NumberInput\n value={webhook.retries}\n onChange={(v) => onChange({ ...webhook, retries: v })}\n min={0}\n max={10}\n />\n </div>\n\n {onTest && (\n <div className=\"flex justify-end\">\n <Button variant=\"secondary\" onClick={onTest}>\n {labels.testWebhook}\n </Button>\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { Switch } from \"../core/switch\";\nimport { Badge } from \"../core/badge\";\nimport { NumberInput } from \"../core/number-input\";\nimport { cn } from \"../lib/cn\";\n\n/** Defines the feature flag shape. */\nexport interface FeatureFlag {\n id: string;\n name: string;\n description?: string;\n enabled: boolean;\n environments: string[];\n rolloutPercentage?: number;\n}\n\n/** Props for the feature flag panel component. */\nexport interface FeatureFlagPanelProps {\n flags: FeatureFlag[];\n onToggle: (flagId: string, enabled: boolean) => void;\n onRolloutChange?: (flagId: string, percentage: number) => void;\n environments: string[];\n className?: string;\n labels?: FeatureFlagPanelLabels;\n}\n\n/** Localized labels for the feature flag panel component. */\nexport interface FeatureFlagPanelLabels {\n enabled?: string;\n disabled?: string;\n rolloutLabel?: string;\n emptyMessage?: string;\n}\n\nconst defaultLabels: Required<FeatureFlagPanelLabels> = {\n enabled: \"Enabled\",\n disabled: \"Disabled\",\n rolloutLabel: \"Rollout %\",\n emptyMessage: \"No feature flags configured.\",\n};\n\n/** Renders the feature flag panel component. */\nexport function FeatureFlagPanel({\n flags,\n onToggle,\n onRolloutChange,\n environments,\n className,\n labels: customLabels,\n}: FeatureFlagPanelProps) {\n const labels = { ...defaultLabels, ...customLabels };\n\n if (flags.length === 0) {\n return (\n <div\n className={cn(\"text-text-tertiary text-sm\", className)}\n data-opt-id=\"JW164\"\n data-opt-slug=\"feature-flag-panel.FeatureFlagPanel\"\n >\n {labels.emptyMessage}\n </div>\n );\n }\n\n return (\n <div\n className={cn(\"gap-group flex flex-col\", className)}\n data-opt-id=\"JW164\"\n data-opt-slug=\"feature-flag-panel.FeatureFlagPanel\"\n >\n {flags.map((flag) => (\n <div\n key={flag.id}\n className=\"border-border bg-surface gap-element flex flex-col rounded-lg border p-4\"\n >\n <div className=\"flex items-center justify-between\">\n <div className=\"flex flex-col gap-0.5\">\n <span className=\"text-text-primary text-sm font-medium\">\n {flag.name}\n </span>\n {flag.description && (\n <span className=\"text-text-tertiary text-xs\">\n {flag.description}\n </span>\n )}\n </div>\n <Switch\n checked={flag.enabled}\n onChange={(checked) => onToggle(flag.id, checked)}\n label={flag.enabled ? labels.enabled : labels.disabled}\n />\n </div>\n\n <div className=\"flex flex-wrap gap-1\">\n {environments.map((env) => (\n <Badge\n key={env}\n variant={\n flag.environments.includes(env) ? \"success\" : \"default\"\n }\n >\n {env}\n </Badge>\n ))}\n </div>\n\n {onRolloutChange && flag.rolloutPercentage !== undefined && (\n <div className=\"gap-element flex items-center\">\n <span className=\"text-text-secondary text-xs\">\n {labels.rolloutLabel}\n </span>\n <NumberInput\n value={flag.rolloutPercentage}\n onChange={(v) => onRolloutChange(flag.id, v)}\n min={0}\n max={100}\n step={5}\n />\n </div>\n )}\n </div>\n ))}\n </div>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { Button } from \"../core/button\";\nimport { cn } from \"../lib/cn\";\n\n/** Defines the import field shape. */\nexport interface ImportFieldDef {\n id: string;\n label: string;\n required?: boolean;\n}\n\n/** Localized labels for the data import wizard component. */\nexport interface DataImportWizardLabels {\n stepsLabel?: string;\n upload?: string;\n mapColumns?: string;\n preview?: string;\n confirm?: string;\n dropPrompt?: string;\n selectColumn?: string;\n back?: string;\n next?: string;\n import?: string;\n uploadFileAriaLabel?: string;\n previewSummary?: (shown: number, total: number) => string;\n confirmSummary?: (rows: number, mappedFields: number) => string;\n}\n\n/** Props for the data import wizard component. */\nexport interface DataImportWizardProps {\n fields: ImportFieldDef[];\n onImport: (mapping: Record<string, string>, data: string[][]) => void;\n acceptedFormats?: string;\n labels?: DataImportWizardLabels;\n className?: string;\n}\n\n/** Renders the data import wizard component. */\nexport function DataImportWizard({\n fields,\n onImport,\n acceptedFormats = \".csv\",\n labels: customLabels,\n className,\n}: DataImportWizardProps) {\n const labels = {\n stepsLabel: \"Import steps\",\n upload: \"Upload\",\n mapColumns: \"Map Columns\",\n preview: \"Preview\",\n confirm: \"Confirm\",\n dropPrompt: \"Drop a file or click to upload\",\n selectColumn: \"Select column…\",\n back: \"Back\",\n next: \"Next\",\n import: \"Import\",\n uploadFileAriaLabel: \"Upload file\",\n previewSummary: (shown: number, total: number) =>\n `Showing ${shown} of ${total} rows`,\n confirmSummary: (rows: number, mappedFields: number) =>\n `Ready to import ${rows} rows with ${mappedFields} mapped fields.`,\n ...customLabels,\n };\n const [step, setStep] = React.useState(0);\n const [headers, setHeaders] = React.useState<string[]>([]);\n const [rows, setRows] = React.useState<string[][]>([]);\n const [mapping, setMapping] = React.useState<Record<string, string>>({});\n\n const handleFileChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file) return;\n const reader = new FileReader();\n reader.onload = (ev) => {\n const text = ev.target?.result as string;\n const lines = text.split(\"\\n\").filter(Boolean);\n if (lines.length > 0) {\n setHeaders(lines[0].split(\",\").map((h) => h.trim()));\n setRows(lines.slice(1).map((l) => l.split(\",\").map((c) => c.trim())));\n setStep(1);\n }\n };\n reader.readAsText(file);\n };\n\n const steps = [\n labels.upload,\n labels.mapColumns,\n labels.preview,\n labels.confirm,\n ];\n\n return (\n <div\n className={cn(\"gap-group flex flex-col\", className)}\n data-opt-id=\"QD9XR\"\n data-opt-slug=\"data-import-wizard.DataImportWizard\"\n >\n {/* Step indicator */}\n <ol\n className=\"gap-element flex list-none p-0\"\n aria-label={labels.stepsLabel}\n >\n {steps.map((s, i) => (\n <li\n key={s}\n className=\"flex items-center gap-1\"\n aria-current={i === step ? \"step\" : undefined}\n >\n <div\n aria-hidden=\"true\"\n className={cn(\n \"flex h-6 w-6 items-center justify-center rounded-full text-xs font-medium\",\n i <= step\n ? \"bg-accent text-accent-fg\"\n : \"bg-bg-subtle text-text-tertiary\",\n )}\n >\n {i + 1}\n </div>\n <span\n className={cn(\n \"text-xs\",\n i <= step ? \"text-text-primary\" : \"text-text-tertiary\",\n )}\n >\n {s}\n </span>\n {i < steps.length - 1 && (\n <div className=\"bg-border mx-1 h-px w-4\" aria-hidden=\"true\" />\n )}\n </li>\n ))}\n </ol>\n\n {/* Step 0: Upload */}\n {step === 0 && (\n <div className=\"border-border gap-element flex flex-col items-center rounded-lg border border-dashed p-8\">\n <p className=\"text-text-secondary text-sm\">{labels.dropPrompt}</p>\n <input\n type=\"file\"\n accept={acceptedFormats}\n onChange={handleFileChange}\n className=\"text-sm\"\n aria-label={labels.uploadFileAriaLabel}\n />\n </div>\n )}\n\n {/* Step 1: Map columns */}\n {step === 1 && (\n <div className=\"gap-element flex flex-col\">\n {fields.map((field) => (\n <div key={field.id} className=\"gap-element flex items-center\">\n <span className=\"text-text-primary w-32 text-sm\">\n {field.label}\n {field.required && <span className=\"text-danger\">*</span>}\n </span>\n <select\n className=\"border-border bg-surface text-text-primary rounded-md border px-2 py-1 text-sm\"\n value={mapping[field.id] || \"\"}\n onChange={(e) =>\n setMapping({ ...mapping, [field.id]: e.target.value })\n }\n aria-label={`Map ${field.label}`}\n >\n <option value=\"\">{labels.selectColumn}</option>\n {headers.map((h) => (\n <option key={h} value={h}>\n {h}\n </option>\n ))}\n </select>\n </div>\n ))}\n <div className=\"gap-element flex justify-end\">\n <Button variant=\"secondary\" onClick={() => setStep(0)}>\n {labels.back}\n </Button>\n <Button onClick={() => setStep(2)}>{labels.next}</Button>\n </div>\n </div>\n )}\n\n {/* Step 2: Preview */}\n {step === 2 && (\n <div className=\"gap-element flex flex-col\">\n <div className=\"overflow-auto\">\n <table className=\"border-border w-full border-collapse text-sm\">\n <thead>\n <tr className=\"border-border border-b\">\n {headers.map((h) => (\n <th\n key={h}\n className=\"text-text-primary px-3 py-2 text-left font-medium\"\n >\n {h}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.slice(0, 5).map((row, i) => (\n <tr key={i} className=\"border-border border-b\">\n {row.map((cell, j) => (\n <td key={j} className=\"text-text-secondary px-3 py-2\">\n {cell}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n <p className=\"text-text-tertiary text-xs\">\n {labels.previewSummary(Math.min(5, rows.length), rows.length)}\n </p>\n <div className=\"gap-element flex justify-end\">\n <Button variant=\"secondary\" onClick={() => setStep(1)}>\n {labels.back}\n </Button>\n <Button onClick={() => setStep(3)}>{labels.next}</Button>\n </div>\n </div>\n )}\n\n {/* Step 3: Confirm */}\n {step === 3 && (\n <div className=\"gap-group flex flex-col items-center py-8\">\n <p className=\"text-text-primary text-sm\">\n {labels.confirmSummary(rows.length, Object.keys(mapping).length)}\n </p>\n <div className=\"gap-element flex\">\n <Button variant=\"secondary\" onClick={() => setStep(2)}>\n {labels.back}\n </Button>\n <Button onClick={() => onImport(mapping, rows)}>\n {labels.import}\n </Button>\n </div>\n </div>\n )}\n </div>\n );\n}\n","import * as React from \"react\";\nimport { PopoverRoot, PopoverTrigger, PopoverContent } from \"../core/popover\";\nimport { cn } from \"../lib/cn\";\n\n/** Defines the mega menu item shape. */\nexport interface MegaMenuItem {\n label: string;\n href?: string;\n description?: string;\n icon?: React.ReactNode;\n}\n\n/** Defines the mega menu section shape. */\nexport interface MegaMenuSection {\n title: string;\n items: MegaMenuItem[];\n}\n\n/** Props for the mega menu component. */\nexport interface MegaMenuProps {\n menus: MegaMenuSection[];\n columns?: number;\n footer?: React.ReactNode;\n triggerLabel?: string;\n labels?: MegaMenuLabels;\n className?: string;\n}\n\n/** Localized labels for the mega menu component. */\nexport interface MegaMenuLabels {\n trigger?: string;\n}\n\nconst defaultLabels: Required<MegaMenuLabels> = {\n trigger: \"Menu\",\n};\n\n/** Renders the mega menu component. */\nexport function MegaMenu({\n menus,\n columns = 3,\n footer,\n triggerLabel,\n labels: customLabels,\n className,\n}: MegaMenuProps) {\n const labels = { ...defaultLabels, ...customLabels };\n const resolvedTriggerLabel = triggerLabel ?? labels.trigger;\n\n if (menus.length === 0) {\n return null;\n }\n\n return (\n <PopoverRoot data-opt-id=\"42177\" data-opt-slug=\"mega-menu.MegaMenu\">\n <PopoverTrigger\n className={cn(\n \"border-border bg-surface text-text-primary hover:bg-bg-subtle inline-flex h-9 items-center gap-1.5 rounded-lg border px-3 text-sm font-medium\",\n className,\n )}\n >\n {resolvedTriggerLabel}\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path d=\"M3 5l3 3 3-3\" />\n </svg>\n </PopoverTrigger>\n <PopoverContent className=\"w-auto max-w-2xl p-0\">\n <div\n className=\"gap-group grid p-4\"\n style={{ gridTemplateColumns: `repeat(${columns}, minmax(0, 1fr))` }}\n >\n {menus.map((section) => (\n <div key={section.title} className=\"gap-element flex flex-col\">\n <h4 className=\"text-text-tertiary text-xs font-semibold tracking-wider uppercase\">\n {section.title}\n </h4>\n {section.items.map((item) => (\n <a\n key={item.label}\n href={item.href || \"#\"}\n className=\"hover:bg-bg-subtle gap-element flex items-start rounded-md p-2 transition-colors\"\n >\n {item.icon && (\n <span className=\"text-text-secondary mt-0.5 flex-shrink-0\">\n {item.icon}\n </span>\n )}\n <div className=\"flex flex-col\">\n <span className=\"text-text-primary text-sm font-medium\">\n {item.label}\n </span>\n {item.description && (\n <span className=\"text-text-tertiary text-xs\">\n {item.description}\n </span>\n )}\n </div>\n </a>\n ))}\n </div>\n ))}\n </div>\n {footer && (\n <div className=\"border-border bg-bg-subtle border-t px-4 py-3\">\n {footer}\n </div>\n )}\n </PopoverContent>\n </PopoverRoot>\n );\n}\n\nMegaMenu.displayName = \"MegaMenu\";\n","\"use client\";\n\nimport { useState, useEffect, useCallback } from \"react\";\nimport { cn } from \"../lib/cn\";\nimport { Button } from \"../core/button\";\nimport { Input } from \"../core/input\";\nimport { ScrollArea } from \"../core/scroll-area\";\nimport { EmptyState } from \"../core/empty-state\";\nimport type { ChatConversationDef } from \"../lib/types\";\nimport { formatOptShortDate, formatOptTime } from \"../lib/formatters\";\nimport {\n OPT_FOCUS_VISIBLE,\n OPT_TEXT_PRIMARY,\n OPT_TEXT_SECONDARY,\n OPT_TEXT_TERTIARY,\n} from \"../lib/styles\";\n\n/** Localized labels for the chat sidebar component. */\nexport interface ChatSidebarLabels {\n newChat?: string;\n searchPlaceholder?: string;\n emptyTitle?: string;\n emptyDescription?: string;\n}\n\nconst defaultLabels: Required<ChatSidebarLabels> = {\n newChat: \"새 대화\",\n searchPlaceholder: \"대화 검색...\",\n emptyTitle: \"대화 없음\",\n emptyDescription: \"새 대화를 시작해보세요\",\n};\n\n/** Props for the chat sidebar component. */\nexport interface ChatSidebarProps {\n conversations: ChatConversationDef[];\n activeConversationId?: string;\n onConversationSelect?: (conversation: ChatConversationDef) => void;\n onNewChat?: () => void;\n onSearch?: (query: string) => void;\n labels?: ChatSidebarLabels;\n className?: string;\n}\n\n/** Renders the chat sidebar component. */\nexport function ChatSidebar({\n conversations,\n activeConversationId,\n onConversationSelect,\n onNewChat,\n onSearch,\n labels: customLabels,\n className,\n}: ChatSidebarProps) {\n const labels = { ...defaultLabels, ...customLabels };\n const [searchQuery, setSearchQuery] = useState(\"\");\n const [isHydrated, setIsHydrated] = useState(false);\n\n useEffect(() => {\n setIsHydrated(true);\n }, []);\n\n const handleSearch = useCallback(\n (value: string) => {\n setSearchQuery(value);\n onSearch?.(value);\n },\n [onSearch],\n );\n\n const filtered = searchQuery\n ? conversations.filter(\n (c) =>\n c.title.toLowerCase().includes(searchQuery.toLowerCase()) ||\n c.lastMessage?.toLowerCase().includes(searchQuery.toLowerCase()),\n )\n : conversations;\n\n return (\n <div\n className={cn(\"gap-group flex h-full flex-col\", className)}\n data-opt-id=\"TBVMY\"\n data-opt-slug=\"chat-sidebar.ChatSidebar\"\n >\n {/* New Chat Button */}\n <Button onClick={onNewChat} className=\"w-full\" size=\"sm\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n className=\"mr-2\"\n >\n <line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\" />\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\" />\n </svg>\n {labels.newChat}\n </Button>\n\n {/* Search */}\n <Input\n placeholder={labels.searchPlaceholder}\n value={searchQuery}\n onChange={(e) => handleSearch(e.target.value)}\n size=\"sm\"\n aria-label={labels.searchPlaceholder}\n />\n\n {/* Conversation List */}\n {filtered.length === 0 ? (\n <EmptyState\n title={labels.emptyTitle}\n description={labels.emptyDescription}\n />\n ) : (\n <ScrollArea className=\"flex-1\">\n <div\n className=\"gap-element flex flex-col\"\n role=\"listbox\"\n aria-label={labels.searchPlaceholder}\n >\n {filtered.map((conversation) => {\n const isActive = conversation.id === activeConversationId;\n return (\n <button\n key={conversation.id}\n type=\"button\"\n role=\"option\"\n aria-selected={isActive}\n onClick={() => onConversationSelect?.(conversation)}\n className={cn(\n \"relative rounded-lg px-3 py-2.5 text-left transition-colors\",\n OPT_FOCUS_VISIBLE,\n isActive ? \"bg-accent-subtle\" : \"hover:bg-bg-subtle\",\n )}\n >\n {/* Active indicator */}\n {isActive && (\n <span className=\"bg-accent absolute top-1/2 left-0 h-5 w-0.5 -translate-y-1/2 rounded-full\" />\n )}\n\n <div className=\"gap-element flex items-start justify-between\">\n <span\n className={cn(\n \"truncate text-sm font-medium\",\n isActive ? \"text-accent\" : OPT_TEXT_PRIMARY,\n )}\n >\n {conversation.title}\n </span>\n <div className=\"flex shrink-0 items-center gap-1.5\">\n {conversation.unread && (\n <span className=\"bg-accent h-2 w-2 rounded-full\" />\n )}\n <time\n className={cn(\"text-[11px]\", OPT_TEXT_TERTIARY)}\n dateTime={conversation.timestamp}\n >\n {formatTimestamp(\n conversation.timestamp,\n isHydrated ? new Date() : null,\n )}\n </time>\n </div>\n </div>\n {conversation.lastMessage && (\n <p\n className={cn(\n \"mt-0.5 truncate text-xs\",\n OPT_TEXT_SECONDARY,\n )}\n >\n {conversation.lastMessage}\n </p>\n )}\n </button>\n );\n })}\n </div>\n </ScrollArea>\n )}\n </div>\n );\n}\n\nfunction formatTimestamp(timestamp: string, now: Date | null): string {\n const date = new Date(timestamp);\n\n if (!now) {\n return formatOptShortDate(date);\n }\n\n const diffMs = now.getTime() - date.getTime();\n const diffDays = Math.floor(diffMs / 86400000);\n\n if (diffMs >= 0 && diffDays === 0) {\n return formatOptTime(date);\n }\n if (diffMs >= 0 && diffDays < 7) {\n return `${diffDays}d`;\n }\n return formatOptShortDate(date);\n}\n\nChatSidebar.displayName = \"ChatSidebar\";\n","\"use client\";\n\nimport {\n useRef,\n useCallback,\n useLayoutEffect,\n type KeyboardEvent,\n} from \"react\";\nimport { cn } from \"../lib/cn\";\nimport { Button } from \"../core/button\";\nimport { Kbd } from \"../core/kbd\";\nimport {\n SelectRoot,\n SelectTrigger,\n SelectPopover,\n SelectItem,\n} from \"../core/select\";\nimport { useControlledState } from \"../lib/use-controlled-state\";\nimport type { ChatModelDef, ChatStylePresetDef } from \"../lib/types\";\nimport { OPT_BORDER, OPT_TEXT_TERTIARY } from \"../lib/styles\";\n\n/** Localized labels for the chat input component. */\nexport interface ChatInputLabels {\n placeholder?: string;\n send?: string;\n attach?: string;\n hint?: string;\n modelLabel?: string;\n styleLabel?: string;\n shiftKey?: string;\n enterKey?: string;\n}\n\nconst defaultLabels: Required<ChatInputLabels> = {\n placeholder: \"메시지를 입력하세요...\",\n send: \"전송\",\n attach: \"파일 첨부\",\n hint: \"로 줄바꿈\",\n modelLabel: \"모델\",\n styleLabel: \"스타일\",\n shiftKey: \"Shift\",\n enterKey: \"Enter\",\n};\n\n/** Props for the chat input component. */\nexport interface ChatInputProps {\n value?: string;\n defaultValue?: string;\n onChange?: (value: string) => void;\n onSend?: (message: string) => void;\n onFileAttach?: () => void;\n models?: ChatModelDef[];\n selectedModel?: string;\n onModelChange?: (modelId: string) => void;\n stylePresets?: ChatStylePresetDef[];\n selectedStyle?: string;\n onStyleChange?: (styleId: string) => void;\n disabled?: boolean;\n maxRows?: number;\n showHint?: boolean;\n labels?: ChatInputLabels;\n className?: string;\n}\n\n/** Renders the chat input component. */\nexport function ChatInput({\n value: controlledValue,\n defaultValue = \"\",\n onChange,\n onSend,\n onFileAttach,\n models,\n selectedModel,\n onModelChange,\n stylePresets,\n selectedStyle,\n onStyleChange,\n disabled = false,\n maxRows = 6,\n showHint = true,\n labels: customLabels,\n className,\n}: ChatInputProps) {\n const labels = { ...defaultLabels, ...customLabels };\n const [value, setValue] = useControlledState(\n defaultValue,\n controlledValue,\n onChange,\n );\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n\n const hasToolbar =\n (models && models.length > 0) || (stylePresets && stylePresets.length > 0);\n\n // Auto-resize textarea\n useLayoutEffect(() => {\n const textarea = textareaRef.current;\n if (!textarea) return;\n\n textarea.style.height = \"auto\";\n const lineHeight = parseInt(getComputedStyle(textarea).lineHeight) || 20;\n const maxHeight = lineHeight * maxRows;\n textarea.style.height = `${Math.min(textarea.scrollHeight, maxHeight)}px`;\n }, [value, maxRows]);\n\n const handleSend = useCallback(() => {\n const trimmed = value.trim();\n if (!trimmed || disabled) return;\n onSend?.(trimmed);\n setValue(\"\");\n }, [value, disabled, onSend, setValue]);\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n handleSend();\n }\n },\n [handleSend],\n );\n\n return (\n <div\n className={cn(\"gap-element flex flex-col\", className)}\n data-opt-id=\"M8KX1\"\n data-opt-slug=\"chat-input.ChatInput\"\n >\n {/* Toolbar */}\n {hasToolbar && (\n <div className=\"gap-element flex items-center\">\n {models && models.length > 0 && (\n <SelectRoot\n value={selectedModel ?? models[0]?.id}\n onValueChange={(v) => onModelChange?.(v as string)}\n >\n <SelectTrigger minWidth={120} className=\"h-8 text-xs\">\n {models.find((m) => m.id === (selectedModel ?? models[0]?.id))\n ?.label ?? labels.modelLabel}\n </SelectTrigger>\n <SelectPopover>\n {models.map((model) => (\n <SelectItem key={model.id} value={model.id}>\n <div>\n <div className=\"text-sm\">{model.label}</div>\n {model.description && (\n <div className={cn(\"text-xs\", OPT_TEXT_TERTIARY)}>\n {model.description}\n </div>\n )}\n </div>\n </SelectItem>\n ))}\n </SelectPopover>\n </SelectRoot>\n )}\n\n {stylePresets && stylePresets.length > 0 && (\n <SelectRoot\n value={selectedStyle ?? stylePresets[0]?.id}\n onValueChange={(v) => onStyleChange?.(v as string)}\n >\n <SelectTrigger minWidth={100} className=\"h-8 text-xs\">\n {stylePresets.find(\n (s) => s.id === (selectedStyle ?? stylePresets[0]?.id),\n )?.label ?? labels.styleLabel}\n </SelectTrigger>\n <SelectPopover>\n {stylePresets.map((preset) => (\n <SelectItem key={preset.id} value={preset.id}>\n {preset.label}\n </SelectItem>\n ))}\n </SelectPopover>\n </SelectRoot>\n )}\n </div>\n )}\n\n {/* Input Container */}\n <div\n className={cn(\n \"bg-surface rounded-lg\",\n OPT_BORDER,\n \"focus-within:ring-ring focus-within:ring-offset-ring-offset focus-within:ring-2 focus-within:ring-offset-1\",\n )}\n >\n <textarea\n ref={textareaRef}\n value={value}\n onChange={(e) => setValue(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={labels.placeholder}\n disabled={disabled}\n rows={1}\n className={cn(\n \"text-text-primary placeholder:text-text-tertiary focus-visible:ring-ring focus-visible:ring-offset-ring-offset w-full resize-none border-none bg-transparent px-4 pt-3 pb-2 text-sm outline-none focus-visible:ring-2 focus-visible:ring-offset-1\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n )}\n aria-label={labels.placeholder}\n />\n\n {/* Bottom bar */}\n <div className=\"flex items-center justify-between px-3 pb-2\">\n {/* Left: attach */}\n <div className=\"flex items-center gap-1\">\n {onFileAttach && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={onFileAttach}\n disabled={disabled}\n aria-label={labels.attach}\n className=\"h-7 w-7 p-0\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M21.44 11.05l-9.19 9.19a6 6 0 01-8.49-8.49l9.19-9.19a4 4 0 015.66 5.66l-9.2 9.19a2 2 0 01-2.83-2.83l8.49-8.48\" />\n </svg>\n </Button>\n )}\n </div>\n\n {/* Center: hint */}\n {showHint && (\n <span\n className={cn(\n \"flex items-center gap-1 text-xs\",\n OPT_TEXT_TERTIARY,\n )}\n >\n <Kbd>{labels.shiftKey}</Kbd>\n <Kbd>{labels.enterKey}</Kbd>\n <span>{labels.hint}</span>\n </span>\n )}\n\n {/* Right: send */}\n <Button\n size=\"sm\"\n onClick={handleSend}\n disabled={disabled || !value.trim()}\n aria-label={labels.send}\n className=\"h-7 px-3\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n className=\"mr-1\"\n >\n <line x1=\"22\" y1=\"2\" x2=\"11\" y2=\"13\" />\n <polygon points=\"22 2 15 22 11 13 2 9 22 2\" />\n </svg>\n {labels.send}\n </Button>\n </div>\n </div>\n </div>\n );\n}\n\nChatInput.displayName = \"ChatInput\";\n","\"use client\";\n\nimport {\n useRef,\n useEffect,\n useCallback,\n useState,\n type ReactNode,\n} from \"react\";\nimport { cn } from \"../lib/cn\";\nimport { ScrollArea } from \"../core/scroll-area\";\nimport { Avatar } from \"../core/avatar\";\nimport { EmptyState } from \"../core/empty-state\";\nimport type { ChatMessageDef } from \"../lib/types\";\nimport { formatOptTime } from \"../lib/formatters\";\nimport { OPT_TEXT_TERTIARY } from \"../lib/styles\";\n\n/** Localized labels for the chat message list component. */\nexport interface ChatMessageListLabels {\n emptyTitle?: string;\n emptyDescription?: string;\n userLabel?: string;\n assistantLabel?: string;\n typingLabel?: string;\n}\n\nconst defaultLabels: Required<ChatMessageListLabels> = {\n emptyTitle: \"대화 시작\",\n emptyDescription: \"메시지를 보내 대화를 시작하세요\",\n userLabel: \"나\",\n assistantLabel: \"AI\",\n typingLabel: \"입력 중...\",\n};\n\n/** Props for the chat message list component. */\nexport interface ChatMessageListProps {\n messages: ChatMessageDef[];\n loading?: boolean;\n renderContent?: (message: ChatMessageDef) => ReactNode;\n assistantAvatar?: string;\n userName?: string;\n showTimestamps?: boolean;\n autoScroll?: boolean;\n labels?: ChatMessageListLabels;\n className?: string;\n}\n\n/** Renders the chat message list component. */\nexport function ChatMessageList({\n messages,\n loading = false,\n renderContent,\n assistantAvatar,\n userName,\n showTimestamps = true,\n autoScroll = true,\n labels: customLabels,\n className,\n}: ChatMessageListProps) {\n const labels = {\n ...defaultLabels,\n ...customLabels,\n ...(userName ? { userLabel: userName } : {}),\n };\n const scrollRef = useRef<HTMLDivElement>(null);\n const [isUserScrolledUp, setIsUserScrolledUp] = useState(false);\n\n // Auto-scroll to bottom\n const scrollToBottom = useCallback(() => {\n const el = scrollRef.current;\n if (!el) return;\n el.scrollTop = el.scrollHeight;\n }, []);\n\n // Detect user scroll\n const handleScroll = useCallback(() => {\n const el = scrollRef.current;\n if (!el) return;\n const threshold = 50;\n const isAtBottom =\n el.scrollHeight - el.scrollTop - el.clientHeight < threshold;\n setIsUserScrolledUp(!isAtBottom);\n }, []);\n\n useEffect(() => {\n if (autoScroll && !isUserScrolledUp) {\n scrollToBottom();\n }\n }, [messages, loading, autoScroll, isUserScrolledUp, scrollToBottom]);\n\n if (messages.length === 0 && !loading) {\n return (\n <div\n className={cn(\"flex flex-1 items-center justify-center\", className)}\n data-opt-id=\"YK725\"\n data-opt-slug=\"chat-message-list.ChatMessageList\"\n >\n <EmptyState\n title={labels.emptyTitle}\n description={labels.emptyDescription}\n />\n </div>\n );\n }\n\n return (\n <ScrollArea\n className={cn(\"flex-1\", className)}\n data-opt-id=\"YK725\"\n data-opt-slug=\"chat-message-list.ChatMessageList\"\n >\n <div\n ref={scrollRef}\n onScroll={handleScroll}\n className=\"gap-group flex flex-col p-4\"\n role=\"log\"\n aria-label=\"messages\"\n aria-live=\"polite\"\n >\n {messages.map((message) => {\n const isUser = message.role === \"user\";\n return (\n <div\n key={message.id}\n className={cn(\n \"gap-element flex\",\n isUser ? \"flex-row-reverse\" : \"flex-row\",\n )}\n >\n {/* Avatar */}\n {!isUser && (\n <Avatar\n name={labels.assistantLabel}\n src={assistantAvatar}\n size=\"sm\"\n className=\"mt-1 shrink-0\"\n />\n )}\n\n {/* Bubble */}\n <div\n className={cn(\n \"max-w-[80%] rounded-2xl px-4 py-2.5\",\n isUser\n ? \"bg-accent text-accent-fg rounded-tr-sm\"\n : \"bg-surface-input text-text-primary rounded-tl-sm\",\n )}\n >\n {renderContent ? (\n renderContent(message)\n ) : (\n <p className=\"text-sm whitespace-pre-wrap\">\n {message.content}\n </p>\n )}\n {showTimestamps && (\n <time\n dateTime={message.timestamp}\n className={cn(\n \"mt-1 block text-[11px]\",\n isUser ? \"text-accent-fg/70\" : OPT_TEXT_TERTIARY,\n )}\n >\n {formatMessageTime(message.timestamp)}\n </time>\n )}\n </div>\n </div>\n );\n })}\n\n {/* Typing Indicator */}\n {loading && (\n <div className=\"gap-element flex items-start\">\n <Avatar\n name={labels.assistantLabel}\n src={assistantAvatar}\n size=\"sm\"\n className=\"mt-1 shrink-0\"\n />\n <div className=\"bg-surface-input rounded-2xl rounded-tl-sm px-4 py-3\">\n <div\n className=\"flex items-center gap-1\"\n role=\"status\"\n aria-label={labels.typingLabel}\n >\n <span className=\"bg-text-tertiary h-2 w-2 animate-bounce rounded-full [animation-delay:0ms]\" />\n <span className=\"bg-text-tertiary h-2 w-2 animate-bounce rounded-full [animation-delay:150ms]\" />\n <span className=\"bg-text-tertiary h-2 w-2 animate-bounce rounded-full [animation-delay:300ms]\" />\n </div>\n </div>\n </div>\n )}\n </div>\n </ScrollArea>\n );\n}\n\nfunction formatMessageTime(timestamp: string): string {\n return formatOptTime(timestamp);\n}\n\nChatMessageList.displayName = \"ChatMessageList\";\n","\"use client\";\n\nimport { usePathname } from \"next/navigation\";\nimport { useEffect, useRef } from \"react\";\n\n/**\n * 페이지 전환 시 새 콘텐츠의 h1으로 포커스를 이동한다.\n * 포커스가 body로 빠지는 것을 방지하고,\n * 스크린 리더가 새 페이지 제목을 즉시 읽어줄 수 있게 한다.\n */\nexport function RouteFocusManager() {\n const pathname = usePathname();\n const prevPathname = useRef(pathname);\n\n useEffect(() => {\n // 최초 마운트 시에는 이동하지 않음\n if (prevPathname.current === pathname) return;\n prevPathname.current = pathname;\n\n // Next.js 렌더링이 완료된 뒤 포커스 이동\n const timer = setTimeout(() => {\n const heading = document.querySelector<HTMLElement>(\n \"main h1, [role='main'] h1, h1\",\n );\n if (!heading) return;\n\n // 프로그래밍 포커스를 받을 수 있도록 임시 tabindex 부여\n const hadTabIndex = heading.hasAttribute(\"tabindex\");\n if (!hadTabIndex) {\n heading.setAttribute(\"tabindex\", \"-1\");\n }\n\n heading.focus({ preventScroll: false });\n\n // 포커스를 잃으면 임시 tabindex 제거 (Tab 순서 오염 방지)\n if (!hadTabIndex) {\n heading.addEventListener(\n \"blur\",\n () => heading.removeAttribute(\"tabindex\"),\n { once: true },\n );\n }\n }, 60);\n\n return () => clearTimeout(timer);\n }, [pathname]);\n\n return null;\n}\n","\"use client\";\n\nimport {\n DisclosureRoot,\n DisclosureTrigger,\n DisclosureContent,\n} from \"../core/disclosure\";\nimport { cn } from \"../lib/cn\";\n\nfunction Section({\n title,\n children,\n}: {\n title: string;\n children: React.ReactNode;\n}) {\n return (\n <div>\n <h3 className=\"text-text-primary mb-2 text-sm font-semibold\">{title}</h3>\n {children}\n </div>\n );\n}\n\nfunction Code({ children }: { children: React.ReactNode }) {\n return (\n <code className=\"bg-bg-subtle text-text-secondary rounded px-1 py-0.5 font-mono text-xs\">\n {children}\n </code>\n );\n}\n\nfunction CodeBlock({ children }: { children: string }) {\n return (\n <pre className=\"bg-bg-subtle text-text-secondary overflow-x-auto rounded-lg p-3 font-mono text-xs leading-relaxed\">\n {children}\n </pre>\n );\n}\n\nfunction Table({ headers, rows }: { headers: string[]; rows: string[][] }) {\n return (\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-left text-xs\">\n <thead>\n <tr className=\"border-border border-b\">\n {headers.map((h) => (\n <th\n key={h}\n className=\"text-text-secondary pr-4 pb-2 font-semibold\"\n >\n {h}\n </th>\n ))}\n </tr>\n </thead>\n <tbody className=\"divide-border-subtle divide-y\">\n {rows.map((row, i) => (\n <tr key={i}>\n {row.map((cell, j) => (\n <td key={j} className=\"text-text-secondary py-1.5 pr-4\">\n {cell}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n\n// ─── 섹션 1: Primitives 컴포넌트 맵 ───\n\nfunction PrimitiveComponentMap() {\n return (\n <Section title=\"1. Primitives 컴포넌트 맵\">\n <p className=\"text-text-tertiary mb-3 text-xs\">\n 각 예제에서 사용된 프리미티브 컴포넌트와 대응하는 WAI-ARIA 역할.\n </p>\n <Table\n headers={[\"예제\", \"프리미티브 컴포넌트\", \"WAI-ARIA role\"]}\n rows={[\n [\n \"Command Palette\",\n \"Dialog, DialogDismiss, Combobox, ComboboxProvider, ComboboxGroup, ComboboxGroupLabel, ComboboxItem, ComboboxPopover\",\n \"dialog, combobox, listbox, option, group\",\n ],\n [\n \"Dashboard Grid\",\n \"Composite, CompositeItem, CompositeProvider, CompositeRow\",\n \"grid, gridcell\",\n ],\n [\n \"Menubar\",\n \"Menubar, MenubarProvider, Menu, MenuButton, MenuButtonArrow, MenuItem, MenuItemCheckbox, MenuItemRadio, MenuSeparator\",\n \"menubar, menu, menuitem, menuitemcheckbox, menuitemradio, separator\",\n ],\n [\n \"Toolbar\",\n \"Toolbar, ToolbarItem, ToolbarProvider, ToolbarSeparator, Tooltip, TooltipAnchor, TooltipProvider\",\n \"toolbar, separator, tooltip\",\n ],\n [\n \"Tabs\",\n \"Tab, TabList, TabPanel, TabProvider\",\n \"tablist, tab, tabpanel\",\n ],\n [\n \"Select & Combobox\",\n \"Select, SelectItem, SelectLabel, SelectPopover, SelectProvider, Combobox, ComboboxItem, ComboboxPopover, ComboboxProvider\",\n \"listbox, option, combobox\",\n ],\n [\n \"Form\",\n \"Form, FormError, FormInput, FormLabel, FormSubmit, useFormStore, Checkbox, Radio, RadioProvider\",\n \"form, radio, radiogroup, checkbox\",\n ],\n [\n \"Accordion\",\n \"Disclosure, DisclosureContent, DisclosureProvider, Composite, CompositeItem, CompositeProvider\",\n \"region, button (disclosure trigger)\",\n ],\n [\n \"사이드바\",\n \"Composite, CompositeItem, CompositeProvider\",\n \"navigation\",\n ],\n [\n \"예제 목록 (이 페이지)\",\n \"Composite, CompositeItem, CompositeProvider, CompositeRow\",\n \"grid, gridcell\",\n ],\n ]}\n />\n </Section>\n );\n}\n\n// ─── 섹션 2: 키보드 네비게이션 패턴 ───\n\nfunction KeyboardNavigationPatterns() {\n return (\n <Section title=\"2. 키보드 네비게이션 패턴\">\n <div className=\"gap-group flex flex-col\">\n <div>\n <h4 className=\"text-text-secondary mb-1 text-xs font-medium\">\n 전역 단축키\n </h4>\n <Table\n headers={[\"키\", \"동작\", \"구현\"]}\n rows={[\n [\n \"Cmd+K\",\n \"Command Palette 열기/닫기\",\n \"useEffect + keydown 리스너 (layout)\",\n ],\n [\n \"Ctrl+Shift+F\",\n \"UI Debugger 토글\",\n \"useEffect + keydown 리스너 (dev only)\",\n ],\n ]}\n />\n </div>\n\n <div>\n <h4 className=\"text-text-secondary mb-1 text-xs font-medium\">\n Composite / Roving Tabindex 패턴\n </h4>\n <p className=\"text-text-tertiary mb-2 text-xs\">\n <Code>CompositeProvider</Code>는 자동으로 roving tabindex를\n 관리한다. 컨테이너는 단일 Tab Stop이며, 내부 항목은 화살표 키로\n 이동한다.\n </p>\n <Table\n headers={[\"컨텍스트\", \"방향\", \"focusLoop\", \"focusWrap\"]}\n rows={[\n [\"예제 목록 Grid\", \"4방향 (↑↓←→)\", \"O\", \"O\"],\n [\"Dashboard Grid\", \"4방향 (↑↓←→)\", \"O\", \"O\"],\n [\"사이드바\", \"수직 (↑↓)\", \"O\", \"X\"],\n [\"Menubar\", \"수평 (←→)\", \"기본값\", \"기본값\"],\n [\"Toolbar\", \"수평 (←→)\", \"O\", \"X\"],\n [\"Tabs\", \"수평 (←→)\", \"기본값\", \"기본값\"],\n [\"Accordion (FAQ)\", \"수직 (↑↓)\", \"O\", \"X\"],\n ]}\n />\n </div>\n\n <div>\n <h4 className=\"text-text-secondary mb-1 text-xs font-medium\">\n 예제별 키보드 조작\n </h4>\n <Table\n headers={[\"예제\", \"키보드 조작\"]}\n rows={[\n [\n \"Command Palette\",\n \"Cmd+K 열기, ↑↓ 항목 이동, Enter 실행, Esc 닫기, 타이핑으로 필터\",\n ],\n [\"Dashboard Grid\", \"Tab 진입, ←→↑↓ 카드 이동, Enter 선택\"],\n [\"Menubar\", \"←→ 메뉴 전환, ↑↓ 항목 이동, Enter 실행, Esc 닫기\"],\n [\"Toolbar\", \"Tab 진입, ←→ 버튼 이동, Enter/Space 실행\"],\n [\"Tabs\", \"←→ 탭 전환, Tab으로 패널 진입\"],\n [\"Select\", \"Enter/Space 열기, ↑↓ 항목 이동, Enter 선택\"],\n [\"Combobox\", \"타이핑으로 필터, ↑↓ 항목 이동, Enter 선택\"],\n [\"Form\", \"Tab 필드 이동, Space 체크박스 토글, ←→ 라디오 전환\"],\n [\"Accordion\", \"↑↓ 항목 이동, Enter/Space 토글\"],\n ]}\n />\n </div>\n </div>\n </Section>\n );\n}\n\n// ─── 섹션 3: Tailwind Data Attribute 셀렉터 ───\n\nfunction TailwindDataAttributes() {\n return (\n <Section title=\"3. Tailwind Data Attribute 셀렉터\">\n <p className=\"text-text-tertiary mb-3 text-xs\">\n 프리미티브는 상태를 data attribute로 노출한다. Tailwind v4의{\" \"}\n <Code>data-[attr]:</Code> 셀렉터로 스타일링한다.\n </p>\n\n <div className=\"gap-group flex flex-col\">\n <div>\n <h4 className=\"text-text-secondary mb-1 text-xs font-medium\">\n data-[active-item] — 현재 활성 항목\n </h4>\n <CodeBlock>{`// ComboboxItem, SelectItem, MenuItem, CompositeItem\nclassName=\"data-[active-item]:bg-zinc-100\n dark:data-[active-item]:bg-zinc-800\"\n\n// 예제 목록 카드 (ring 스타일)\nclassName=\"data-[active-item]:ring-2\n data-[active-item]:ring-blue-500\n data-[active-item]:ring-offset-2\"`}</CodeBlock>\n </div>\n\n <div>\n <h4 className=\"text-text-secondary mb-1 text-xs font-medium\">\n data-[focus-visible] — 키보드 포커스 링\n </h4>\n <CodeBlock>{`// 모든 인터랙티브 요소에 공통 적용\nclassName=\"data-[focus-visible]:ring-2\n data-[focus-visible]:ring-blue-500\n dark:data-[focus-visible]:ring-offset-zinc-950\"\n\n// inset 변형 (Accordion, Tab)\nclassName=\"data-[focus-visible]:ring-inset\"`}</CodeBlock>\n </div>\n\n <div>\n <h4 className=\"text-text-secondary mb-1 text-xs font-medium\">\n data-[enter] / data-[leave] — 애니메이션\n </h4>\n <CodeBlock>{`// Dialog, Popover, DisclosureContent 공통\nclassName=\"data-[enter]:animate-in\n data-[enter]:fade-in\n data-[enter]:slide-in-from-top-1\n data-[leave]:animate-out\n data-[leave]:fade-out\"\n\n// Dialog 백드롭\nclassName=\"data-[enter]:animate-in\n data-[enter]:fade-in\n data-[leave]:animate-out\n data-[leave]:fade-out\"`}</CodeBlock>\n </div>\n\n <div>\n <h4 className=\"text-text-secondary mb-1 text-xs font-medium\">\n data-[open] — 열림/닫힘 상태\n </h4>\n <CodeBlock>{`// Accordion 화살표 회전\nclassName=\"[[data-open]>&]:rotate-180\"\n// 부모가 data-open일 때 자식 SVG를 180도 회전`}</CodeBlock>\n </div>\n\n <div>\n <h4 className=\"text-text-secondary mb-1 text-xs font-medium\">\n data-[active] — 메뉴 버튼 활성\n </h4>\n <CodeBlock>{`// MenuButton이 열려있을 때\nclassName=\"data-[active]:bg-zinc-100\n dark:data-[active]:bg-zinc-800\"`}</CodeBlock>\n </div>\n\n <div>\n <h4 className=\"text-text-secondary mb-1 text-xs font-medium\">\n aria-[invalid=true] — 폼 유효성 오류\n </h4>\n <CodeBlock>{`// FormInput 유효성 검증 실패 시\nclassName=\"aria-[invalid=true]:border-red-500\"`}</CodeBlock>\n </div>\n </div>\n </Section>\n );\n}\n\n// ─── 섹션 4: 접근성 속성 ───\n\nfunction AccessibilityAttributes() {\n return (\n <Section title=\"4. 접근성 속성\">\n <p className=\"text-text-tertiary mb-3 text-xs\">\n 프로젝트에서 사용된 WAI-ARIA 속성과 적용 사례.\n </p>\n <Table\n headers={[\"속성\", \"사용처\", \"설명\"]}\n rows={[\n [\n 'role=\"grid\"',\n \"예제 목록, Dashboard Grid\",\n \"2D 화살표 키 네비게이션 컨테이너. gridcell과 함께 사용\",\n ],\n [\n 'role=\"gridcell\"',\n \"예제 목록 카드, Dashboard 카드\",\n \"grid 내부 셀. CompositeRow로 행 구분\",\n ],\n [\n 'role=\"navigation\"',\n \"사이드바\",\n \"네비게이션 랜드마크. 수직 Composite로 구현\",\n ],\n ['role=\"region\"', \"Accordion\", \"FAQ 섹션의 랜드마크\"],\n ['role=\"toolbar\"', \"Toolbar\", \"단일 Tab Stop, 수평 화살표 키 이동\"],\n [\n 'role=\"menubar\"',\n \"Menubar\",\n \"수평 메뉴 컨테이너. MenuProvider로 자동 부여\",\n ],\n [\n \"aria-label\",\n \"Composite, Toolbar, TabList, Form, Menubar\",\n '스크린 리더에 영역 이름 전달. 예: \"예제 목록\", \"텍스트 편집기 툴바\"',\n ],\n [\n \"aria-invalid\",\n \"FormInput\",\n \"유효성 검증 실패 시 자동 부여. CSS로 border-red-500 스타일링\",\n ],\n [\n \"aria-expanded\",\n \"Disclosure, MenuButton, Select\",\n \"열림/닫힘 상태. 프리미티브가 자동 관리\",\n ],\n [\n \"aria-live\",\n \"FormError\",\n \"검증 오류 메시지를 스크린 리더에 즉시 전달\",\n ],\n ]}\n />\n </Section>\n );\n}\n\n// ─── 섹션 5: 포커스 관리 전략 ───\n\nfunction FocusManagementStrategies() {\n return (\n <Section title=\"5. 포커스 관리 전략\">\n <div className=\"gap-group flex flex-col\">\n <div>\n <h4 className=\"text-text-secondary mb-1 text-xs font-medium\">\n RouteFocusManager — 페이지 전환 포커스\n </h4>\n <p className=\"text-text-tertiary mb-2 text-xs\">\n 페이지 전환 시 새 콘텐츠의 <Code>h1</Code>으로 포커스를 이동한다.\n body로 포커스가 빠지는 것을 방지하고, 스크린 리더가 새 페이지 제목을\n 즉시 읽어준다.\n </p>\n <CodeBlock>{`// components/shared/route-focus-manager.tsx\n// 1. usePathname() 변경 감지\n// 2. setTimeout(60ms) 후 h1 탐색\n// 3. tabindex=\"-1\" 임시 부여 → focus()\n// 4. blur 시 tabindex 제거 (Tab 순서 오염 방지)`}</CodeBlock>\n </div>\n\n <div>\n <h4 className=\"text-text-secondary mb-1 text-xs font-medium\">\n 사이드바 activeId 동기화\n </h4>\n <p className=\"text-text-tertiary mb-2 text-xs\">\n <Code>usePathname()</Code>으로 현재 경로를 감지하여{\" \"}\n <Code>CompositeProvider</Code>의 <Code>activeId</Code>를 동기화한다.\n Shift+Tab으로 사이드바에 돌아올 때 현재 페이지 항목에 포커스가\n 위치한다.\n </p>\n <CodeBlock>{`// components/sidebar/sidebar-nav.tsx\nconst [activeId, setActiveId] = useState(...)\nuseEffect(() => {\n const match = navItems.find(item => item.href === pathname)\n if (match) setActiveId(domId(match.id))\n}, [pathname])\n\n<CompositeProvider\n activeId={activeId}\n onActiveIdChange={setActiveId}\n focusLoop orientation=\"vertical\"\n/>`}</CodeBlock>\n </div>\n\n <div>\n <h4 className=\"text-text-secondary mb-1 text-xs font-medium\">\n Composite focusLoop / focusWrap\n </h4>\n <p className=\"text-text-tertiary text-xs\">\n <Code>focusLoop</Code> — 마지막 항목에서 화살표 키를 누르면 첫\n 항목으로 순환.\n <br />\n <Code>focusWrap</Code> — Grid에서 행 끝에 도달하면 다음 행으로 자동\n 이동.\n <br />\n <Code>orientation</Code> — {`\"vertical\"`}이면 ↑↓만, {`\"horizontal\"`}\n 이면 ←→만 반응. 생략 시 4방향 모두 반응 (Grid 용도).\n </p>\n </div>\n\n <div>\n <h4 className=\"text-text-secondary mb-1 text-xs font-medium\">\n Dialog 포커스 트랩\n </h4>\n <p className=\"text-text-tertiary text-xs\">\n Command Palette의 <Code>Dialog</Code>는 열리면 자동으로 포커스를\n 트랩한다. Tab 키가 Dialog 내부에서만 순환하며, Esc로 닫으면 트리거\n 요소로 포커스가 복원된다.\n </p>\n </div>\n\n <div>\n <h4 className=\"text-text-secondary mb-1 text-xs font-medium\">\n UI Debugger (개발 전용)\n </h4>\n <p className=\"text-text-tertiary text-xs\">\n Ctrl+Shift+F로 토글. 현재 포커스된 요소의 정보(tag, role, aria-*,\n data-*), Tab 순서(이전/다음), 방향키 컨텍스트(Composite 타입/위치),\n 이동 기록을 실시간으로 표시한다. SVG 오버레이로 포커스 가이드 라인과\n Tab 순서 배지도 시각화한다. 컴포넌트 추적 기능으로 포커스된 요소가\n 속한 React 컴포넌트 체인도 확인할 수 있다.\n </p>\n </div>\n </div>\n </Section>\n );\n}\n\n// ─── 섹션 6: 프로젝트 구조 ───\n\nfunction ProjectStructure() {\n return (\n <Section title=\"6. 프로젝트 구조\">\n <CodeBlock>{`app/\n├── layout.tsx # 루트 레이아웃 (Cmd+K 바인딩, OptDevtool)\n├── page.tsx # 홈페이지\n├── globals.css # 전역 스타일 (Tailwind v4)\n└── examples/\n ├── layout.tsx # 사이드바 + 본문 레이아웃\n ├── page.tsx # 예제 목록 (Composite Grid)\n ├── command-palette/ # Dialog + Combobox 조합\n ├── dashboard/ # 2D Composite Grid\n ├── menubar/ # Menubar + 체크/라디오 메뉴\n ├── toolbar/ # Toolbar + Tooltip\n ├── tabs/ # Tab + TabPanel\n ├── select/ # Select + Combobox 검색\n ├── form/ # Form 유효성 검증\n └── accordion/ # Disclosure + Composite\n\ncomponents/\n├── command-palette/\n│ ├── command-palette.tsx # Dialog + Combobox + match-sorter\n│ └── commands.ts # 명령어 데이터\n├── dashboard/\n│ ├── dashboard-grid.tsx # CompositeProvider + Grid 레이아웃\n│ └── stat-card.tsx # 개별 통계 카드\n├── dev/\n│ └── opt-devtool.tsx # Dev overlay: 포커스 추적 + bridge panel (dev only)\n├── disclosure/\n│ └── faq-accordion.tsx # Disclosure + Composite 아코디언\n├── form/\n│ └── settings-form.tsx # Form + Radio + Checkbox 검증\n├── guide/\n│ └── design-guide-panel.tsx # 이 파일: 디자인 가이드 패널\n├── menubar/\n│ └── app-menubar.tsx # MenubarProvider + 4개 메뉴\n├── select/\n│ ├── status-select.tsx # Select 드롭다운\n│ └── search-combobox.tsx # Combobox 자동완성\n├── shared/\n│ ├── kbd.tsx # 키보드 단축키 배지\n│ └── route-focus-manager.tsx # 페이지 전환 포커스 관리\n├── sidebar/\n│ └── sidebar-nav.tsx # Composite 수직 네비게이션\n├── tabs/\n│ └── content-tabs.tsx # TabProvider + 4개 탭\n└── toolbar/\n └── editor-toolbar.tsx # ToolbarProvider + Tooltip`}</CodeBlock>\n\n <div className=\"mt-3\">\n <h4 className=\"text-text-secondary mb-1 text-xs font-medium\">\n 핵심 의존성\n </h4>\n <Table\n headers={[\"패키지\", \"용도\"]}\n rows={[\n [\n \"@reopt-ai/opt-ui-primitives\",\n \"접근성 UI 프리미티브 (WAI-ARIA 패턴)\",\n ],\n [\n \"match-sorter ^8.2.0\",\n \"퍼지 검색/정렬 (Command Palette, Combobox)\",\n ],\n [\"next 16.x\", \"App Router, 서버/클라이언트 컴포넌트\"],\n [\"react 19.x\", \"UI 렌더링\"],\n [\"tailwindcss ^4\", \"유틸리티 CSS (data attribute 셀렉터 지원)\"],\n ]}\n />\n </div>\n </Section>\n );\n}\n\n// ─── 메인 패널 ───\n\n/** Props for the design guide panel component. */\nexport interface DesignGuidePanelProps {\n className?: string;\n}\n\n/** Renders the design guide panel component. */\nexport function DesignGuidePanel({ className }: DesignGuidePanelProps) {\n return (\n <DisclosureRoot\n data-opt-id=\"65F6W\"\n data-opt-slug=\"design-guide-panel.DesignGuidePanel\"\n >\n <div\n className={cn(\"border-border bg-surface rounded-xl border\", className)}\n >\n <DisclosureTrigger className=\"hover:bg-bg-subtle data-[focus-visible]:ring-ring flex w-full items-center justify-between px-5 py-4 text-left transition-colors outline-none data-[focus-visible]:ring-2 data-[focus-visible]:ring-inset\">\n <div>\n <h2 className=\"text-text-primary text-sm font-semibold\">\n 디자인 가이드\n </h2>\n <p className=\"text-text-tertiary mt-0.5 text-xs\">\n 프리미티브 컴포넌트, 키보드 패턴, Tailwind 셀렉터, 접근성 속성,\n 포커스 관리, 프로젝트 구조\n </p>\n </div>\n <svg\n className=\"text-text-tertiary h-4 w-4 shrink-0 transition-transform [[data-open]>&]:rotate-180\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"m19.5 8.25-7.5 7.5-7.5-7.5\"\n />\n </svg>\n </DisclosureTrigger>\n <DisclosureContent>\n <div className=\"border-border gap-section flex flex-col border-t px-5 py-5\">\n <PrimitiveComponentMap />\n <KeyboardNavigationPatterns />\n <TailwindDataAttributes />\n <AccessibilityAttributes />\n <FocusManagementStrategies />\n <ProjectStructure />\n </div>\n </DisclosureContent>\n </div>\n </DisclosureRoot>\n );\n}\n","\"use client\";\n\nimport { useEffect } from \"react\";\n\n// ---------------------------------------------------------------------------\n// 상수\n// ---------------------------------------------------------------------------\n\nconst TABBABLE_SELECTOR = [\n \"a[href]:not([tabindex='-1'])\",\n \"button:not([disabled]):not([tabindex='-1'])\",\n \"input:not([disabled]):not([type='hidden']):not([tabindex='-1'])\",\n \"select:not([disabled]):not([tabindex='-1'])\",\n \"textarea:not([disabled]):not([tabindex='-1'])\",\n \"[tabindex]:not([tabindex='-1'])\",\n \"[contenteditable='true']:not([tabindex='-1'])\",\n].join(\",\");\n\nconst ARROW_KEYS = new Set([\"ArrowUp\", \"ArrowDown\", \"ArrowLeft\", \"ArrowRight\"]);\n\nconst TEXT_INPUT_TYPES = new Set([\n \"text\",\n \"search\",\n \"email\",\n \"url\",\n \"tel\",\n \"password\",\n]);\n\nconst SECONDARY_WEIGHT = 2.0;\n\n// ---------------------------------------------------------------------------\n// 순수 함수\n// ---------------------------------------------------------------------------\n\n/** Type definition for direction. */\nexport type Direction = \"up\" | \"down\" | \"left\" | \"right\";\n\nfunction getDirection(key: string): Direction | null {\n switch (key) {\n case \"ArrowUp\":\n return \"up\";\n case \"ArrowDown\":\n return \"down\";\n case \"ArrowLeft\":\n return \"left\";\n case \"ArrowRight\":\n return \"right\";\n default:\n return null;\n }\n}\n\nfunction isVisible(el: HTMLElement): boolean {\n if (el.offsetWidth === 0 && el.offsetHeight === 0) return false;\n const style = getComputedStyle(el);\n return style.visibility !== \"hidden\" && style.display !== \"none\";\n}\n\nfunction getTabbableElements(): HTMLElement[] {\n const nodes = document.querySelectorAll<HTMLElement>(TABBABLE_SELECTOR);\n const result: HTMLElement[] = [];\n for (let i = 0; i < nodes.length; i++) {\n if (isVisible(nodes[i])) {\n result.push(nodes[i]);\n }\n }\n return result;\n}\n\n/** Handles should skip arrow. */\nexport function shouldSkipArrow(el: HTMLElement, dir: Direction): boolean {\n const tag = el.tagName.toLowerCase();\n\n // textarea, contenteditable — 모든 방향키 건너뜀\n if (tag === \"textarea\" || el.isContentEditable) return true;\n\n // native select — 모든 방향키 건너뜀\n if (tag === \"select\") return true;\n\n if (tag === \"input\") {\n const type = (el as HTMLInputElement).type.toLowerCase();\n\n // text-like input: ←→ 건너뜀 (커서), ↑↓ 공간 네비게이션\n if (TEXT_INPUT_TYPES.has(type)) {\n return dir === \"left\" || dir === \"right\";\n }\n\n // number input: ↑↓ 건너뜀 (증감), ←→ 공간 네비게이션\n if (type === \"number\") {\n return dir === \"up\" || dir === \"down\";\n }\n\n // range input: ←→ 건너뜀 (값 조절), ↑↓ 공간 네비게이션\n if (type === \"range\") {\n return dir === \"left\" || dir === \"right\";\n }\n }\n\n // ARIA role 기반 보호\n const role = el.getAttribute(\"role\");\n const hasPopup = el.getAttribute(\"aria-haspopup\");\n\n // combobox (Select 등): ↑↓ 팝업 열기/탐색\n if (role === \"combobox\") {\n return dir === \"up\" || dir === \"down\";\n }\n\n // 팝업을 여는 트리거: ↓ 보호 (listbox, menu, dialog 등)\n if (hasPopup && hasPopup !== \"false\") {\n return dir === \"down\";\n }\n\n // spinbutton: ↑↓ 값 증감\n if (role === \"spinbutton\") {\n return dir === \"up\" || dir === \"down\";\n }\n\n // slider: 모든 방향키가 값 조절\n if (role === \"slider\") return true;\n\n return false;\n}\n\n/** Returns trapped context role. */\nexport function getTrappedContextRole(el: HTMLElement): string | null {\n let node: HTMLElement | null = el;\n while (node) {\n const role = node.getAttribute(\"role\");\n if (\n role === \"dialog\" ||\n role === \"alertdialog\" ||\n role === \"menu\" ||\n role === \"listbox\" ||\n role === \"tree\"\n ) {\n return role;\n }\n if (node.hasAttribute(\"data-dialog\")) return \"dialog\";\n if (node.hasAttribute(\"data-popover\")) return \"popover\";\n node = node.parentElement;\n }\n return null;\n}\n\nfunction isInsideTrappedContext(el: HTMLElement): boolean {\n return getTrappedContextRole(el) !== null;\n}\n\nfunction computeScore(\n current: DOMRect,\n candidate: DOMRect,\n dir: Direction,\n): number | null {\n let primaryDistance: number;\n let secondaryOffset: number;\n\n switch (dir) {\n case \"right\":\n if (candidate.left < current.right) return null;\n primaryDistance = candidate.left - current.right;\n secondaryOffset = Math.abs(\n (candidate.top + candidate.bottom) / 2 -\n (current.top + current.bottom) / 2,\n );\n break;\n case \"left\":\n if (candidate.right > current.left) return null;\n primaryDistance = current.left - candidate.right;\n secondaryOffset = Math.abs(\n (candidate.top + candidate.bottom) / 2 -\n (current.top + current.bottom) / 2,\n );\n break;\n case \"down\":\n if (candidate.top < current.bottom) return null;\n primaryDistance = candidate.top - current.bottom;\n secondaryOffset = Math.abs(\n (candidate.left + candidate.right) / 2 -\n (current.left + current.right) / 2,\n );\n break;\n case \"up\":\n if (candidate.bottom > current.top) return null;\n primaryDistance = current.top - candidate.bottom;\n secondaryOffset = Math.abs(\n (candidate.left + candidate.right) / 2 -\n (current.left + current.right) / 2,\n );\n break;\n }\n\n return primaryDistance + secondaryOffset * SECONDARY_WEIGHT;\n}\n\nfunction findBestCandidate(\n current: HTMLElement,\n candidates: HTMLElement[],\n dir: Direction,\n): HTMLElement | null {\n const currentRect = current.getBoundingClientRect();\n let bestScore = Infinity;\n let bestEl: HTMLElement | null = null;\n\n for (let i = 0; i < candidates.length; i++) {\n const cand = candidates[i];\n if (cand === current) continue;\n const candRect = cand.getBoundingClientRect();\n const score = computeScore(currentRect, candRect, dir);\n if (score !== null && score < bestScore) {\n bestScore = score;\n bestEl = cand;\n }\n }\n\n return bestEl;\n}\n\n// ---------------------------------------------------------------------------\n// 디버거용 API\n// ---------------------------------------------------------------------------\n\n/** Defines the spatial target shape. */\nexport interface SpatialTarget {\n direction: Direction;\n element: HTMLElement;\n score: number;\n}\n\n/** Handles compute spatial targets. */\nexport function computeSpatialTargets(current: HTMLElement): SpatialTarget[] {\n const candidates = getTabbableElements();\n const currentRect = current.getBoundingClientRect();\n const results: SpatialTarget[] = [];\n\n for (const dir of [\"up\", \"down\", \"left\", \"right\"] as Direction[]) {\n let bestScore = Infinity;\n let bestEl: HTMLElement | null = null;\n\n for (let i = 0; i < candidates.length; i++) {\n const cand = candidates[i];\n if (cand === current) continue;\n const candRect = cand.getBoundingClientRect();\n const score = computeScore(currentRect, candRect, dir);\n if (score !== null && score < bestScore) {\n bestScore = score;\n bestEl = cand;\n }\n }\n\n if (bestEl) {\n results.push({\n direction: dir,\n element: bestEl,\n score: Math.round(bestScore),\n });\n }\n }\n\n return results;\n}\n\n/** Defines the spatial nav decision detail shape. */\nexport interface SpatialNavDecisionDetail {\n direction: Direction;\n result: \"moved\" | \"skipped\";\n reason?:\n | \"defaultPrevented\"\n | \"input-protection\"\n | \"trapped-context\"\n | \"no-candidate\";\n context?: string;\n target?: HTMLElement;\n}\n\nfunction emitDecision(detail: SpatialNavDecisionDetail): void {\n if (process.env.NODE_ENV === \"development\") {\n document.dispatchEvent(\n new CustomEvent<SpatialNavDecisionDetail>(\"spatial-nav-decision\", {\n detail,\n }),\n );\n }\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\nfunction useSpatialNav(): void {\n useEffect(() => {\n function handleKeyDown(e: KeyboardEvent): void {\n // 1. 방향키 확인\n if (!ARROW_KEYS.has(e.key)) return;\n\n const dir = getDirection(e.key);\n if (!dir) return;\n\n // 2. 이미 처리됨 (Composite 등)\n if (e.defaultPrevented) {\n emitDecision({\n direction: dir,\n result: \"skipped\",\n reason: \"defaultPrevented\",\n });\n return;\n }\n\n // 3. 수식키 동반\n if (e.ctrlKey || e.metaKey || e.altKey || e.shiftKey) return;\n\n // 4. activeElement 확인\n const active = document.activeElement;\n if (!active || active === document.body) return;\n\n const el = active as HTMLElement;\n\n // 5. 입력 필드 보호\n if (shouldSkipArrow(el, dir)) {\n emitDecision({\n direction: dir,\n result: \"skipped\",\n reason: \"input-protection\",\n });\n return;\n }\n\n // 6. dialog/menu/listbox 내부\n if (isInsideTrappedContext(el)) {\n emitDecision({\n direction: dir,\n result: \"skipped\",\n reason: \"trapped-context\",\n context: getTrappedContextRole(el) ?? undefined,\n });\n return;\n }\n\n // 7. 후보 계산 및 포커스 이동\n const candidates = getTabbableElements();\n const target = findBestCandidate(el, candidates, dir);\n if (target) {\n e.preventDefault();\n target.focus({ preventScroll: false });\n emitDecision({ direction: dir, result: \"moved\", target });\n } else {\n emitDecision({\n direction: dir,\n result: \"skipped\",\n reason: \"no-candidate\",\n });\n }\n }\n\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => document.removeEventListener(\"keydown\", handleKeyDown);\n }, []);\n}\n\n// ---------------------------------------------------------------------------\n// Provider 컴포넌트\n// ---------------------------------------------------------------------------\n\n/** Renders the spatial nav provider component. */\nexport function SpatialNavProvider(): null {\n useSpatialNav();\n return null;\n}\n","/** opt-ui English label catalog (opt-in alternative to `koLabels`). */\nexport const enComboboxLabels = {\n empty: \"No results.\",\n} as const;\n\nexport const enStarRatingLabels = {\n readonlyAriaLabel: \"{value} out of {max} stars\",\n groupAriaLabel: \"Rating\",\n starAriaLabel: \"{star} stars\",\n} as const;\n\nexport const enBreadcrumbLabels = {\n navAriaLabel: \"Go to {label}\",\n} as const;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["defaultLabels","defaultLabels","defaultLabels","defaultLabels","defaultLabels","defaultLabels","defaultLabels","defaultLabels","defaultLabels","defaultLabels","defaultLabels","defaultLabels","OPERATORS","defaultLabels","defaultLabels","defaultLabels","defaultLabels","defaultLabels","defaultLabels","defaultLabels","DEFAULT_PRESETS","defaultLabels","formatDuration","makePresetSpec","defaultLabels","defaultLabels","defaultLabels","defaultLabels","defaultLabels","defaultLabels","defaultLabels","defaultLabels","defaultLabels","defaultLabels","defaultLabels","Section"],"sources":["../src/lib/schema-validator.ts","../src/core/error-boundary.tsx","../src/shells/page-aside.tsx","../src/shells/task-list.tsx","../src/shells/activity-feed.tsx","../src/shells/filter-bar.tsx","../src/shells/quick-actions.tsx","../src/shells/team-member-list.tsx","../src/shells/auth-form.tsx","../src/shells/dynamic-field-form.tsx","../src/shells/file-upload-form.tsx","../src/shells/wizard-form.tsx","../src/shells/event-icon.tsx","../src/shells/connection-indicator.tsx","../src/shells/floating-action-bar.tsx","../src/shells/template-picker.tsx","../src/shells/code-snippet-viewer.tsx","../src/shells/property-explorer.tsx","../src/shells/query-results-table.tsx","../src/shells/alert-builder.tsx","../src/shells/sql-editor.tsx","../src/shells/event-meta-editor.tsx","../src/shells/widget-grid.tsx","../src/shells/report-builder.tsx","../src/shells/audit-timeline.tsx","../src/shells/segment-builder.tsx","../src/shells/insights-panel.tsx","../src/shells/time-range-selector.tsx","../src/shells/export-button.tsx","../src/shells/summary-row.tsx","../src/shells/comparison-selector.tsx","../src/lib/theme/presets/index.ts","../src/lib/theme/theme-types.ts","../src/lib/theme/theme-serialize.ts","../src/lib/theme/theme-resolution.ts","../src/lib/theme/theme-controller-context.tsx","../src/lib/theme/theme-provider.tsx","../src/shells/theme-switcher.tsx","../src/shells/prompt-template.tsx","../src/shells/sidebar.tsx","../src/shells/app-shell.tsx","../src/shells/confirm-dialog.tsx","../src/shells/async-combobox.tsx","../src/shells/vertical-tabs.tsx","../src/shells/column-toggler.tsx","../src/shells/bulk-actions.tsx","../src/shells/saved-filters.tsx","../src/shells/notification-center.tsx","../src/shells/audit-log.tsx","../src/shells/tree-table.tsx","../src/shells/inline-edit-table.tsx","../src/shells/kanban-board.tsx","../src/shells/rich-text-editor.tsx","../src/shells/code-diff-viewer.tsx","../src/shells/webhook-config.tsx","../src/shells/feature-flag-panel.tsx","../src/shells/data-import-wizard.tsx","../src/shells/mega-menu.tsx","../src/shells/chat-sidebar.tsx","../src/shells/chat-input.tsx","../src/shells/chat-message-list.tsx","../src/utils/route-focus-manager.tsx","../src/devtools/design-guide-panel.tsx","../src/lib/spatial-nav.ts","../src/i18n/en.ts","../src/lib/query/query-match.ts"],"sourcesContent":["import type { FormErrors } from \"@reopt-ai/opt-ui-primitives\";\n\n/**\n * Adapter for schema-based validation (Zod, Valibot, or any library with safeParse).\n * No direct dependency on any schema library.\n *\n * @example\n * ```ts\n * import { schemaValidator } from \"@reopt-ai/opt-ui\";\n * import { z } from \"zod\";\n *\n * const form = useFormStore({\n * defaultValues: { email: \"\", age: 0 },\n * validate: schemaValidator(z.object({\n * email: z.string().email(\"유효한 이메일을 입력하세요\"),\n * age: z.number().min(1, \"나이를 입력하세요\"),\n * })),\n * });\n * ```\n */\n\ninterface ParseSuccess {\n success: true;\n}\n\ninterface ParseFailure {\n success: false;\n error: {\n issues: { path: (string | number)[]; message: string }[];\n };\n}\n\ntype ParseResult = ParseSuccess | ParseFailure;\n\n/**\n * Minimal interface satisfied by Zod schemas, Valibot schemas, and similar\n * libraries that implement `safeParse`. No runtime dependency required.\n */\nexport interface SchemaLike {\n safeParse(data: unknown): ParseResult;\n}\n\n/** Handles schema validator. */\nexport function schemaValidator<V extends Record<string, unknown>>(\n schema: SchemaLike,\n): (values: V) => FormErrors {\n return (values) => {\n const result = schema.safeParse(values);\n if (result.success) return {};\n const errors: Record<string, string> = {};\n for (const issue of result.error.issues) {\n const key = issue.path.join(\".\");\n if (!errors[key]) errors[key] = issue.message;\n }\n return errors;\n };\n}\n","\"use client\";\n\nimport { Component, type ReactNode, type ErrorInfo } from \"react\";\nimport { Alert } from \"./alert\";\n\n/** Props for the error boundary component. */\nexport interface ErrorBoundaryProps {\n children: ReactNode;\n fallback?: ReactNode | ((error: Error) => ReactNode);\n onError?: (error: Error, info: ErrorInfo) => void;\n}\n\ninterface ErrorBoundaryState {\n error: Error | null;\n}\n\nexport class ErrorBoundary extends Component<\n ErrorBoundaryProps,\n ErrorBoundaryState\n> {\n static displayName = \"ErrorBoundary\";\n\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = { error: null };\n }\n\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\n return { error };\n }\n\n componentDidCatch(error: Error, info: ErrorInfo): void {\n this.props.onError?.(error, info);\n }\n\n render() {\n if (this.state.error) {\n const { fallback } = this.props;\n if (typeof fallback === \"function\") {\n return fallback(this.state.error);\n }\n if (fallback !== undefined) {\n return fallback;\n }\n return (\n <Alert variant=\"error\">\n {this.state.error.message || \"Something went wrong\"}\n </Alert>\n );\n }\n return this.props.children;\n }\n}\n","import type { ReactNode } from \"react\";\nimport { cn } from \"../lib/cn\";\n\n/** i18n labels for {@link PageAside}. */\nexport interface PageAsideLabels {\n /** `aria-label` fallback when `label` prop is not provided. */\n ariaLabel: string;\n}\n\n/** Default English labels for {@link PageAside}. */\nexport const defaultLabels: PageAsideLabels = {\n ariaLabel: \"Page navigation\",\n};\n\n/** Props for {@link PageAside}. */\nexport interface PageAsideProps {\n /** Content rendered in the sticky top slot (e.g. package switcher). */\n header?: ReactNode;\n /** Main scrollable nav area. */\n children: ReactNode;\n /** Content rendered in the bottom slot (e.g. version label). */\n footer?: ReactNode;\n /**\n * Width utility class. Defaults to `w-60`. Pass `\"w-56\"`, `\"w-64\"`, etc.\n */\n widthClassName?: string;\n /** `aria-label` for the underlying `<aside>`. */\n label?: string;\n /** Hide aside below `md` breakpoint. Defaults to true. */\n hideOnMobile?: boolean;\n className?: string;\n /** Override the header slot's chrome (default: `px-3 py-3`). */\n headerClassName?: string;\n /** Override the body slot's chrome (default: `px-3 py-3`). */\n bodyClassName?: string;\n /** Override the footer slot's chrome (default: `px-4 py-3`). */\n footerClassName?: string;\n}\n\n/**\n * Sticky page-level sidebar chrome. Owns position/border/surface and a\n * three-slot layout (header / scroll body / footer). Doesn't prescribe the\n * nav surface — drop `SidebarNav`, custom tree, tag list, etc. into `children`.\n */\nexport function PageAside({\n header,\n children,\n footer,\n widthClassName = \"w-60\",\n label,\n hideOnMobile = true,\n className,\n headerClassName,\n bodyClassName,\n footerClassName,\n}: PageAsideProps) {\n return (\n <aside\n aria-label={label}\n className={cn(\n \"bg-surface sticky top-[var(--global-header-height)] h-[calc(100vh-var(--global-header-height))] shrink-0 flex-col\",\n widthClassName,\n hideOnMobile ? \"hidden md:flex\" : \"flex\",\n className,\n )}\n data-opt-id=\"ZQDMX\"\n data-opt-slug=\"page-aside.PageAside\"\n >\n {header ? (\n <div className={cn(\"shrink-0\", headerClassName ?? \"px-3 py-3\")}>\n {header}\n </div>\n ) : null}\n <div\n className={cn(\"flex-1 overflow-y-auto\", bodyClassName ?? \"px-3 py-3\")}\n >\n {children}\n </div>\n {footer ? (\n <div className={cn(\"shrink-0\", footerClassName ?? \"px-4 py-3\")}>\n {footer}\n </div>\n ) : null}\n </aside>\n );\n}\n\nPageAside.displayName = \"PageAside\";\n","\"use client\";\n\nimport {\n Composite,\n CompositeItem,\n CompositeProvider,\n} from \"../core/composite-zone\";\nimport type { TaskDef } from \"../lib/types\";\nimport {\n OPT_FOCUS,\n OPT_TEXT_PRIMARY,\n OPT_TEXT_SECONDARY,\n OPT_TEXT_TERTIARY,\n OPT_BADGE_GREEN,\n OPT_BADGE_YELLOW,\n OPT_BADGE_RED,\n OPT_BADGE_NEUTRAL,\n OPT_BADGE_BLUE,\n OPT_BORDER,\n} from \"../lib/styles\";\nimport { Avatar } from \"../core/avatar\";\nimport { Checkbox } from \"../core/checkbox\";\n\n/** Localized labels for the task list component. */\nexport interface TaskListLabels {\n title?: string;\n emptyMessage?: string;\n completedOf?: string; // \"{completed}/{total} 완료\" pattern\n priority?: {\n low?: string;\n medium?: string;\n high?: string;\n urgent?: string;\n };\n status?: {\n todo?: string;\n \"in-progress\"?: string;\n review?: string;\n done?: string;\n };\n moreItems?: string; // \"+{count}\" pattern\n}\n\nconst defaultLabels: Required<TaskListLabels> = {\n title: \"작업 목록\",\n emptyMessage: \"작업이 없습니다\",\n completedOf: \"{completed}/{total} 완료\",\n priority: {\n low: \"낮음\",\n medium: \"보통\",\n high: \"높음\",\n urgent: \"긴급\",\n },\n status: {\n todo: \"할 일\",\n \"in-progress\": \"진행 중\",\n review: \"검토\",\n done: \"완료\",\n },\n moreItems: \"+{count}\",\n};\n\n/** Props for the task list component. */\nexport interface TaskListProps {\n tasks: TaskDef[];\n title?: string;\n onTaskClick?: (task: TaskDef) => void;\n onTaskStatusChange?: (task: TaskDef, completed: boolean) => void;\n emptyMessage?: string;\n showSubtasks?: boolean;\n /** Maximum number of tasks to display */\n maxItems?: number;\n /** Custom labels for i18n support */\n labels?: TaskListLabels;\n className?: string;\n}\n\n/** Renders the task list component. */\nexport function TaskList({\n tasks,\n title,\n onTaskClick,\n onTaskStatusChange,\n emptyMessage,\n showSubtasks = false,\n maxItems,\n labels: customLabels,\n className,\n}: TaskListProps) {\n const labels = {\n ...defaultLabels,\n ...customLabels,\n priority: { ...defaultLabels.priority, ...customLabels?.priority },\n status: { ...defaultLabels.status, ...customLabels?.status },\n };\n\n const displayTitle = title ?? labels.title;\n const displayEmptyMessage = emptyMessage ?? labels.emptyMessage;\n\n const displayTasks = maxItems ? tasks.slice(0, maxItems) : tasks;\n const remainingCount = maxItems ? Math.max(0, tasks.length - maxItems) : 0;\n\n const completedCount = tasks.filter((t) => t.status === \"done\").length;\n const progress = tasks.length > 0 ? (completedCount / tasks.length) * 100 : 0;\n\n const priorityBadge: Record<TaskDef[\"priority\"], string> = {\n low: OPT_BADGE_NEUTRAL,\n medium: OPT_BADGE_BLUE,\n high: OPT_BADGE_YELLOW,\n urgent: OPT_BADGE_RED,\n };\n\n const statusBadge: Record<TaskDef[\"status\"], string> = {\n todo: OPT_BADGE_NEUTRAL,\n \"in-progress\": OPT_BADGE_BLUE,\n review: OPT_BADGE_YELLOW,\n done: OPT_BADGE_GREEN,\n };\n\n const completedText = labels.completedOf\n .replace(\"{completed}\", String(completedCount))\n .replace(\"{total}\", String(tasks.length));\n\n return (\n <div\n className={className}\n data-opt-id=\"0DK79\"\n data-opt-slug=\"task-list.TaskList\"\n >\n <div className=\"gap-group flex flex-col\">\n <div className=\"flex items-center justify-between\">\n <h3 className={`text-sm font-semibold ${OPT_TEXT_PRIMARY}`}>\n {displayTitle}\n </h3>\n <span className={`text-xs ${OPT_TEXT_TERTIARY}`}>\n {completedText}\n </span>\n </div>\n\n {/* Progress bar with accessibility */}\n <div\n role=\"progressbar\"\n aria-valuenow={Math.round(progress)}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-label={`${displayTitle} 진행률`}\n className=\"bg-bg-subtle h-1.5 w-full rounded-full\"\n >\n <div\n className=\"bg-success h-full rounded-full transition-all duration-300\"\n style={{ width: `${progress}%` }}\n />\n </div>\n\n {tasks.length === 0 ? (\n <div\n role=\"status\"\n className={`py-8 text-center text-sm ${OPT_TEXT_SECONDARY}`}\n >\n {displayEmptyMessage}\n </div>\n ) : (\n <CompositeProvider focusLoop orientation=\"vertical\">\n <Composite\n role=\"list\"\n aria-label={displayTitle}\n className={`rounded-lg ${OPT_BORDER} divide-border-subtle bg-surface divide-y`}\n >\n {displayTasks.map((task) => (\n <CompositeItem\n key={task.id}\n role=\"listitem\"\n className={`group gap-group flex w-full items-start p-3 ${OPT_FOCUS} data-[active-item]:bg-accent-subtle ${\n onTaskClick ? \"cursor-pointer\" : \"\"\n }`}\n onClick={() => onTaskClick?.(task)}\n >\n {onTaskStatusChange && (\n <div\n className=\"pt-0.5\"\n role=\"presentation\"\n onClick={(e) => e.stopPropagation()}\n >\n <Checkbox\n checked={task.status === \"done\"}\n onChange={(checked) =>\n onTaskStatusChange(task, checked)\n }\n aria-label={`${task.title} 완료 표시`}\n />\n </div>\n )}\n\n <div className=\"min-w-0 flex-1\">\n <div className=\"gap-element flex items-center\">\n <span\n className={`text-sm font-medium ${OPT_TEXT_PRIMARY} ${\n task.status === \"done\"\n ? \"line-through opacity-60\"\n : \"\"\n }`}\n >\n {task.title}\n </span>\n <span className={priorityBadge[task.priority]}>\n {labels.priority[task.priority]}\n </span>\n <span className={statusBadge[task.status]}>\n {labels.status[task.status]}\n </span>\n </div>\n\n {task.description && (\n <p\n className={`mt-1 text-xs ${OPT_TEXT_SECONDARY} line-clamp-1`}\n >\n {task.description}\n </p>\n )}\n\n {showSubtasks &&\n task.subtasks &&\n task.subtasks.length > 0 && (\n <div className=\"gap-element mt-2 flex flex-col\">\n {task.subtasks.map((subtask) => (\n <div\n key={subtask.id}\n className={`text-xs ${OPT_TEXT_TERTIARY} flex items-center gap-1.5`}\n >\n <Checkbox\n checked={subtask.completed}\n disabled\n aria-label={subtask.title}\n className=\"scale-75\"\n />\n <span\n className={\n subtask.completed ? \"line-through\" : \"\"\n }\n >\n {subtask.title}\n </span>\n </div>\n ))}\n </div>\n )}\n\n <div className=\"gap-group mt-2 flex items-center\">\n {task.assignee && (\n <div className=\"flex items-center gap-1.5\">\n <Avatar\n name={task.assignee.name}\n src={task.assignee.avatar}\n size=\"xs\"\n />\n <span className={`text-xs ${OPT_TEXT_TERTIARY}`}>\n {task.assignee.name}\n </span>\n </div>\n )}\n {task.dueDate && (\n <span className={`text-xs ${OPT_TEXT_TERTIARY}`}>\n 📅 {task.dueDate}\n </span>\n )}\n {task.tags && task.tags.length > 0 && (\n <div className=\"flex items-center gap-1\">\n {task.tags.slice(0, 2).map((tag) => (\n <span\n key={tag}\n className={`bg-bg-subtle rounded px-1.5 py-0.5 text-xs ${OPT_TEXT_TERTIARY}`}\n >\n {tag}\n </span>\n ))}\n {task.tags.length > 2 && (\n <span\n className={`text-xs ${OPT_TEXT_TERTIARY}`}\n aria-label={`${task.tags.length - 2}개 추가 태그`}\n >\n {labels.moreItems.replace(\n \"{count}\",\n String(task.tags.length - 2),\n )}\n </span>\n )}\n </div>\n )}\n </div>\n </div>\n </CompositeItem>\n ))}\n\n {remainingCount > 0 && (\n <div\n className={`p-3 text-center text-xs ${OPT_TEXT_TERTIARY} hover:text-accent cursor-pointer transition-colors`}\n >\n {remainingCount}개 더 보기\n </div>\n )}\n </Composite>\n </CompositeProvider>\n )}\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport {\n CircleCheck,\n FilePen,\n GitMerge,\n type LucideIcon,\n MessageSquare,\n Rocket,\n Sparkles,\n User,\n} from \"lucide-react\";\nimport type { KeyboardEvent, ReactNode } from \"react\";\nimport {\n Composite,\n CompositeItem,\n CompositeProvider,\n} from \"../core/composite-zone\";\nimport type { ActivityDef } from \"../lib/types\";\nimport {\n OPT_FOCUS,\n OPT_FOCUS_VISIBLE,\n OPT_TEXT_PRIMARY,\n OPT_TEXT_SECONDARY,\n OPT_TEXT_TERTIARY,\n OPT_BORDER,\n} from \"../lib/styles\";\nimport { cn } from \"../lib/cn\";\nimport { Avatar } from \"../core/avatar\";\n\ninterface TimeAgoLabels {\n justNow: string;\n minutesAgo: string;\n hoursAgo: string;\n daysAgo: string;\n}\n\ninterface ActivityVerbLabels {\n created: string;\n updated: string;\n completed: string;\n commented: string;\n assigned: string;\n deployed: string;\n merged: string;\n}\n\n/** Localized labels for the activity feed component. */\nexport interface ActivityFeedLabels {\n title?: string;\n emptyMessage?: string;\n moreItems?: string; // \"{count}개 더 보기\" pattern\n timeAgo?: Partial<TimeAgoLabels>;\n activityVerbs?: Partial<ActivityVerbLabels>;\n}\n\ninterface DefaultLabels {\n title: string;\n emptyMessage: string;\n moreItems: string;\n timeAgo: TimeAgoLabels;\n activityVerbs: ActivityVerbLabels;\n}\n\nconst defaultLabels: DefaultLabels = {\n title: \"활동 피드\",\n emptyMessage: \"활동이 없습니다\",\n moreItems: \"{count}개 더 보기\",\n timeAgo: {\n justNow: \"방금 전\",\n minutesAgo: \"{minutes}분 전\",\n hoursAgo: \"{hours}시간 전\",\n daysAgo: \"{days}일 전\",\n },\n activityVerbs: {\n created: \"생성\",\n updated: \"수정\",\n completed: \"완료\",\n commented: \"댓글\",\n assigned: \"할당\",\n deployed: \"배포\",\n merged: \"병합\",\n },\n};\n\nconst activityIcon = {\n created: Sparkles,\n updated: FilePen,\n completed: CircleCheck,\n commented: MessageSquare,\n assigned: User,\n deployed: Rocket,\n merged: GitMerge,\n} satisfies Record<ActivityDef[\"type\"], LucideIcon>;\n\n/** Props for the activity feed component. */\nexport interface ActivityFeedProps {\n activities: ActivityDef[];\n title?: string;\n maxItems?: number;\n onActivityClick?: (activity: ActivityDef) => void;\n /** Called when \"show more\" button is clicked */\n onShowMore?: () => void;\n emptyMessage?: string;\n /** Custom labels for i18n support */\n labels?: ActivityFeedLabels;\n /** Locale for date formatting (default: 'ko-KR') */\n locale?: string;\n /** Show loading state */\n loading?: boolean;\n /** Layout style: list (default) shows time below, compact shows time inline */\n layout?: \"list\" | \"compact\";\n /** Render action buttons for each activity item */\n renderActions?: (activity: ActivityDef) => ReactNode;\n className?: string;\n}\n\nfunction formatRelativeTime(\n timestamp: string,\n timeLabels: {\n justNow: string;\n minutesAgo: string;\n hoursAgo: string;\n daysAgo: string;\n },\n locale: string,\n): string {\n const now = new Date();\n const date = new Date(timestamp);\n const diffMs = now.getTime() - date.getTime();\n const diffMins = Math.floor(diffMs / 60000);\n const diffHours = Math.floor(diffMs / 3600000);\n const diffDays = Math.floor(diffMs / 86400000);\n\n if (diffMins < 1) return timeLabels.justNow;\n if (diffMins < 60)\n return timeLabels.minutesAgo.replace(\"{minutes}\", String(diffMins));\n if (diffHours < 24)\n return timeLabels.hoursAgo.replace(\"{hours}\", String(diffHours));\n if (diffDays < 7)\n return timeLabels.daysAgo.replace(\"{days}\", String(diffDays));\n return date.toLocaleDateString(locale);\n}\n\nconst variantBorder: Record<string, string> = {\n error: \"border-l-2 border-l-danger\",\n warning: \"border-l-2 border-l-warning\",\n};\n\n/** Renders the activity feed component. */\nexport function ActivityFeed({\n activities,\n title,\n maxItems,\n onActivityClick,\n onShowMore,\n emptyMessage,\n labels: customLabels,\n locale = \"ko-KR\",\n loading = false,\n layout = \"list\",\n renderActions,\n className,\n}: ActivityFeedProps) {\n const mergedTimeAgo: {\n justNow: string;\n minutesAgo: string;\n hoursAgo: string;\n daysAgo: string;\n } = {\n justNow: customLabels?.timeAgo?.justNow ?? defaultLabels.timeAgo.justNow,\n minutesAgo:\n customLabels?.timeAgo?.minutesAgo ?? defaultLabels.timeAgo.minutesAgo,\n hoursAgo: customLabels?.timeAgo?.hoursAgo ?? defaultLabels.timeAgo.hoursAgo,\n daysAgo: customLabels?.timeAgo?.daysAgo ?? defaultLabels.timeAgo.daysAgo,\n };\n const mergedActivityVerbs = {\n created:\n customLabels?.activityVerbs?.created ??\n defaultLabels.activityVerbs.created,\n updated:\n customLabels?.activityVerbs?.updated ??\n defaultLabels.activityVerbs.updated,\n completed:\n customLabels?.activityVerbs?.completed ??\n defaultLabels.activityVerbs.completed,\n commented:\n customLabels?.activityVerbs?.commented ??\n defaultLabels.activityVerbs.commented,\n assigned:\n customLabels?.activityVerbs?.assigned ??\n defaultLabels.activityVerbs.assigned,\n deployed:\n customLabels?.activityVerbs?.deployed ??\n defaultLabels.activityVerbs.deployed,\n merged:\n customLabels?.activityVerbs?.merged ?? defaultLabels.activityVerbs.merged,\n };\n const labels = {\n title: customLabels?.title ?? defaultLabels.title,\n emptyMessage: customLabels?.emptyMessage ?? defaultLabels.emptyMessage,\n moreItems: customLabels?.moreItems ?? defaultLabels.moreItems,\n timeAgo: mergedTimeAgo,\n activityVerbs: mergedActivityVerbs,\n };\n\n const displayTitle = title ?? labels.title;\n const displayEmptyMessage = emptyMessage ?? labels.emptyMessage;\n\n const displayActivities = maxItems\n ? activities.slice(0, maxItems)\n : activities;\n const remainingCount = maxItems\n ? Math.max(0, activities.length - maxItems)\n : 0;\n const handleActivityKeyDown = (\n event: KeyboardEvent,\n activity: ActivityDef,\n ) => {\n if (!onActivityClick) return;\n if (event.key !== \"Enter\" && event.key !== \" \") return;\n event.preventDefault();\n onActivityClick(activity);\n };\n\n return (\n <div\n className={className}\n data-opt-id=\"DB87Z\"\n data-opt-slug=\"activity-feed.ActivityFeed\"\n >\n <div className=\"gap-group flex flex-col\">\n {displayTitle && (\n <h3 className={`text-sm font-semibold ${OPT_TEXT_PRIMARY}`}>\n {displayTitle}\n </h3>\n )}\n\n {activities.length === 0 ? (\n <div\n role=\"status\"\n className={`py-8 text-center text-sm ${OPT_TEXT_SECONDARY}`}\n >\n {displayEmptyMessage}\n </div>\n ) : (\n <CompositeProvider focusLoop orientation=\"vertical\">\n <Composite\n role=\"feed\"\n aria-label={displayTitle}\n aria-busy={loading}\n className={`rounded-lg ${OPT_BORDER} bg-surface`}\n >\n {displayActivities.map((activity, index) => {\n const ActivityIcon = activityIcon[activity.type];\n const isLast =\n index === displayActivities.length - 1 &&\n remainingCount === 0;\n const activityId = `activity-${activity.id}`;\n\n return (\n <CompositeItem\n render={<article />}\n key={activity.id}\n role=\"article\"\n aria-labelledby={activityId}\n className={cn(\n \"group gap-group relative flex w-full p-3\",\n OPT_FOCUS_VISIBLE,\n \"data-[active-item]:bg-accent-subtle\",\n onActivityClick && \"cursor-pointer\",\n !isLast && \"border-border-subtle border-b\",\n variantBorder[activity.variant ?? \"\"],\n )}\n onClick={() => onActivityClick?.(activity)}\n onKeyDown={(event) =>\n handleActivityKeyDown(event, activity)\n }\n >\n {/* Avatar with timeline connector */}\n <div className=\"relative flex flex-col items-center\">\n <Avatar\n name={activity.actor.name}\n src={activity.actor.avatar}\n size=\"sm\"\n />\n {layout === \"list\" && !isLast && (\n <div\n className=\"bg-border-subtle absolute top-8 h-[calc(100%-16px)] w-px\"\n aria-hidden=\"true\"\n />\n )}\n </div>\n\n {/* Content */}\n <div className=\"min-w-0 flex-1 pt-0.5\">\n <div className=\"gap-element flex items-center justify-between\">\n <div className=\"gap-element flex min-w-0 items-center\">\n <ActivityIcon\n className=\"shrink-0\"\n size={16}\n aria-hidden\n />\n <span\n id={activityId}\n className={`text-sm ${OPT_TEXT_PRIMARY} truncate`}\n >\n <span className=\"font-medium\">\n {activity.actor.name}\n </span>{\" \"}\n <span className={OPT_TEXT_SECONDARY}>\n {labels.activityVerbs[activity.type]}\n </span>{\" \"}\n <span className=\"font-medium\">\n {activity.title}\n </span>\n </span>\n </div>\n {layout === \"compact\" && (\n <time\n dateTime={activity.timestamp}\n className={`text-xs ${OPT_TEXT_TERTIARY} shrink-0`}\n >\n {formatRelativeTime(\n activity.timestamp,\n mergedTimeAgo,\n locale,\n )}\n </time>\n )}\n </div>\n\n {layout === \"list\" && activity.description && (\n <p\n className={`mt-1 text-xs ${OPT_TEXT_SECONDARY} line-clamp-2`}\n >\n {activity.description}\n </p>\n )}\n\n {layout === \"list\" && (\n <time\n dateTime={activity.timestamp}\n className={`mt-1 block text-xs ${OPT_TEXT_TERTIARY}`}\n >\n {formatRelativeTime(\n activity.timestamp,\n mergedTimeAgo,\n locale,\n )}\n </time>\n )}\n </div>\n\n {renderActions && (\n <div className=\"flex shrink-0 items-center gap-1\">\n {renderActions(activity)}\n </div>\n )}\n </CompositeItem>\n );\n })}\n\n {remainingCount > 0 && (\n <CompositeItem\n render={<button type=\"button\" />}\n onClick={onShowMore}\n className={`border-border-subtle w-full border-t p-3 text-center text-xs font-medium ${OPT_TEXT_SECONDARY} ${OPT_FOCUS} hover:text-accent data-[active-item]:bg-accent-subtle transition-colors`}\n aria-label={`${remainingCount}개의 활동 더 보기`}\n >\n {labels.moreItems.replace(\"{count}\", String(remainingCount))}\n </CompositeItem>\n )}\n </Composite>\n </CompositeProvider>\n )}\n </div>\n </div>\n );\n}\n\nActivityFeed.displayName = \"ActivityFeed\";\n","\"use client\";\n\nimport { useState, useRef, useCallback, type ReactNode } from \"react\";\nimport { Search } from \"lucide-react\";\nimport type { FilterGroupDef } from \"../lib/types\";\nimport { OPT_TEXT_PRIMARY, OPT_BORDER, OPT_FOCUS } from \"../lib/styles\";\nimport { PopoverRoot, PopoverTrigger, PopoverContent } from \"../core/popover\";\nimport {\n SelectRoot,\n SelectTrigger,\n SelectPopover,\n SelectItem,\n} from \"../core/select\";\nimport { Input } from \"../core/input\";\nimport { Button } from \"../core/button\";\nimport { Switch } from \"../core/switch\";\nimport { Checkbox } from \"../core/checkbox\";\nimport { DateRangePicker, type DateRange } from \"../core/date-range-picker\";\n\n/** Localized labels for the filter bar component. */\nexport interface FilterBarLabels {\n clearAll?: string;\n searchPlaceholder?: string;\n}\n\nconst defaultLabels: Required<FilterBarLabels> = {\n clearAll: \"필터 초기화\",\n searchPlaceholder: \"검색...\",\n};\n\n/**\n * Composable filter bar supporting 5 filter types:\n * - `search`: Free-text input with debounce\n * - `select`: Single-value dropdown\n * - `multiselect`: Multi-value checkbox dropdown with popover\n * - `toggle`: Boolean switch\n * - `dateRange`: Date range picker\n *\n * Each filter is defined via `FilterGroupDef` (see lib/types.ts).\n * The parent component manages filter state and passes it back via `onFilterChange`.\n */\nexport interface FilterBarProps {\n filters: FilterGroupDef[];\n onFilterChange?: (\n filterId: string,\n value: string | string[] | boolean,\n ) => void;\n onDateRangeChange?: (filterId: string, range: DateRange) => void;\n onClearAll?: () => void;\n labels?: FilterBarLabels;\n /** Slot next to Clear All button (e.g. SavedFilters) */\n presetActions?: ReactNode;\n className?: string;\n}\n\n/** Renders the filter bar component. */\nexport function FilterBar({\n filters,\n onFilterChange,\n onDateRangeChange,\n onClearAll,\n labels: customLabels,\n presetActions,\n className,\n}: FilterBarProps) {\n const labels = { ...defaultLabels, ...customLabels };\n const [searchValues, setSearchValues] = useState<Record<string, string>>({});\n const [tagInputValues, setTagInputValues] = useState<Record<string, string>>(\n {},\n );\n const [multiSelectOpen, setMultiSelectOpen] = useState<\n Record<string, boolean>\n >({});\n const triggerRefs = useRef<Record<string, HTMLButtonElement | null>>({});\n\n const hasActiveFilters = filters.some((f) => {\n if (f.type === \"search\") {\n return searchValues[f.id]?.length > 0;\n }\n if (f.type === \"toggle\") {\n return f.value === true;\n }\n return f.value && (Array.isArray(f.value) ? f.value.length > 0 : f.value);\n });\n\n const handleMultiSelectToggle = (filterId: string, optionValue: string) => {\n const filter = filters.find((f) => f.id === filterId);\n if (!filter) return;\n\n const currentValues = (filter.value as string[]) ?? [];\n const newValues = currentValues.includes(optionValue)\n ? currentValues.filter((v) => v !== optionValue)\n : [...currentValues, optionValue];\n\n onFilterChange?.(filterId, newValues);\n };\n\n const handleTagAdd = useCallback(\n (filterId: string) => {\n const val = tagInputValues[filterId]?.trim();\n if (!val) return;\n const filter = filters.find((f) => f.id === filterId);\n const currentTags = (filter?.value as string[]) ?? [];\n if (currentTags.includes(val)) return;\n onFilterChange?.(filterId, [...currentTags, val]);\n setTagInputValues((prev) => ({ ...prev, [filterId]: \"\" }));\n },\n [filters, tagInputValues, onFilterChange],\n );\n\n const handleTagRemove = useCallback(\n (filterId: string, tag: string) => {\n const filter = filters.find((f) => f.id === filterId);\n const currentTags = (filter?.value as string[]) ?? [];\n onFilterChange?.(\n filterId,\n currentTags.filter((t) => t !== tag),\n );\n },\n [filters, onFilterChange],\n );\n\n return (\n <div\n role=\"search\"\n aria-label=\"필터\"\n className={`gap-group flex flex-wrap items-center ${className ?? \"\"}`}\n data-opt-id=\"BS5N0\"\n data-opt-slug=\"filter-bar.FilterBar\"\n >\n {filters.map((filter) => {\n // ── Search ──\n if (filter.type === \"search\") {\n return (\n <div key={filter.id} className=\"relative\">\n <Input\n placeholder={filter.label || labels.searchPlaceholder}\n value={searchValues[filter.id] ?? \"\"}\n onChange={(e) => {\n const value = e.target.value;\n setSearchValues((prev) => ({ ...prev, [filter.id]: value }));\n onFilterChange?.(filter.id, value);\n }}\n aria-label={filter.label || labels.searchPlaceholder}\n className=\"h-9 w-48 pl-8 text-sm\"\n />\n <span\n className=\"text-text-tertiary absolute top-1/2 left-2.5 -translate-y-1/2\"\n aria-hidden=\"true\"\n >\n <Search className=\"size-4\" />\n </span>\n </div>\n );\n }\n\n // ── Select ──\n if (filter.type === \"select\" && filter.options) {\n return (\n <SelectRoot\n key={filter.id}\n value={filter.value as string}\n onValueChange={(value) => onFilterChange?.(filter.id, value)}\n >\n <SelectTrigger\n className=\"h-9 min-w-[120px] text-sm\"\n aria-label={filter.label}\n >\n {filter.options.find((o) => o.value === filter.value)?.label ??\n filter.label}\n </SelectTrigger>\n <SelectPopover>\n {filter.options.map((option) => (\n <SelectItem key={option.id} value={option.value}>\n {option.label}\n </SelectItem>\n ))}\n </SelectPopover>\n </SelectRoot>\n );\n }\n\n // ── Multi-select ──\n if (filter.type === \"multi-select\" && filter.options) {\n const selectedValues = (filter.value as string[]) ?? [];\n const isOpen = multiSelectOpen[filter.id] ?? false;\n\n const handleOpenChange = (open: boolean) => {\n setMultiSelectOpen((prev) => ({ ...prev, [filter.id]: open }));\n if (!open) {\n requestAnimationFrame(() => {\n triggerRefs.current[filter.id]?.focus();\n });\n }\n };\n\n return (\n <PopoverRoot\n key={filter.id}\n open={isOpen}\n onOpenChange={handleOpenChange}\n >\n <PopoverTrigger\n ref={(el) => {\n triggerRefs.current[filter.id] = el;\n }}\n className={`gap-element inline-flex h-9 items-center rounded-lg px-3 text-sm ${OPT_BORDER} bg-surface ${OPT_TEXT_PRIMARY} ${OPT_FOCUS} hover:bg-bg-subtle transition-colors`}\n aria-expanded={isOpen}\n aria-label={`${filter.label} 필터 ${selectedValues.length > 0 ? `(${selectedValues.length}개 선택됨)` : \"\"}`}\n >\n {filter.label}\n {selectedValues.length > 0 && (\n <span\n className=\"bg-accent text-accent-fg inline-flex h-5 w-5 items-center justify-center rounded-full text-xs\"\n aria-hidden=\"true\"\n >\n {selectedValues.length}\n </span>\n )}\n <span\n className={`transition-transform ${isOpen ? \"rotate-180\" : \"\"}`}\n aria-hidden=\"true\"\n >\n ▼\n </span>\n </PopoverTrigger>\n <PopoverContent\n className={`z-50 mt-1 min-w-[180px] rounded-lg ${OPT_BORDER} bg-surface p-2 shadow-lg`}\n >\n <div className=\"gap-element flex flex-col\">\n {filter.options.map((option) => {\n const isChecked = selectedValues.includes(option.value);\n return (\n <label\n key={option.id}\n className={`hover:bg-bg-subtle gap-element flex cursor-pointer items-center rounded-md px-2 py-1.5 text-sm ${OPT_TEXT_PRIMARY}`}\n >\n <Checkbox\n checked={isChecked}\n onChange={() =>\n handleMultiSelectToggle(filter.id, option.value)\n }\n aria-label={option.label}\n />\n {option.label}\n </label>\n );\n })}\n </div>\n </PopoverContent>\n </PopoverRoot>\n );\n }\n\n // ── Date Range ──\n if (filter.type === \"date-range\") {\n return (\n <DateRangePicker\n key={filter.id}\n aria-label={filter.label}\n placeholder={filter.label}\n onChange={(range) => onDateRangeChange?.(filter.id, range)}\n className=\"max-w-[280px]\"\n />\n );\n }\n\n // ── Tag ──\n if (filter.type === \"tag\") {\n const tags = (filter.value as string[]) ?? [];\n return (\n <div\n key={filter.id}\n className=\"flex flex-wrap items-center gap-1.5\"\n >\n {tags.map((tag) => (\n <span\n key={tag}\n className=\"bg-accent-subtle text-accent inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-[11px] font-medium\"\n >\n {tag}\n <button\n type=\"button\"\n onClick={() => handleTagRemove(filter.id, tag)}\n className=\"hover:bg-accent-subtle ml-0.5 rounded-full p-0.5\"\n aria-label={`Remove ${tag}`}\n >\n <svg\n width=\"8\"\n height=\"8\"\n viewBox=\"0 0 10 10\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M2.5 2.5L7.5 7.5M7.5 2.5L2.5 7.5\" />\n </svg>\n </button>\n </span>\n ))}\n <div className=\"flex items-center gap-1\">\n <input\n type=\"text\"\n value={tagInputValues[filter.id] ?? \"\"}\n onChange={(e) =>\n setTagInputValues((prev) => ({\n ...prev,\n [filter.id]: e.target.value,\n }))\n }\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n handleTagAdd(filter.id);\n }\n }}\n placeholder={filter.label}\n className={`border-border bg-surface placeholder:text-text-tertiary focus-visible:ring-ring h-8 w-24 rounded-md border px-2 text-xs outline-none focus-visible:ring-2 ${OPT_TEXT_PRIMARY}`}\n aria-label={filter.label}\n />\n </div>\n </div>\n );\n }\n\n // ── Toggle ──\n if (filter.type === \"toggle\") {\n return (\n <Switch\n key={filter.id}\n label={filter.label}\n size=\"sm\"\n checked={filter.value === true}\n onChange={(checked) => onFilterChange?.(filter.id, checked)}\n />\n );\n }\n\n return null;\n })}\n\n {hasActiveFilters && onClearAll && (\n <Button\n onClick={onClearAll}\n variant=\"ghost\"\n className=\"text-danger-fg hover:bg-danger-subtle h-9 px-3 text-sm\"\n >\n {labels.clearAll}\n </Button>\n )}\n {presetActions}\n </div>\n );\n}\n","\"use client\";\n\nimport { useId, useEffect } from \"react\";\nimport {\n Composite,\n CompositeItem,\n CompositeProvider,\n} from \"../core/composite-zone\";\nimport type { QuickActionDef } from \"../lib/types\";\nimport {\n OPT_FOCUS,\n OPT_TEXT_PRIMARY,\n OPT_TEXT_SECONDARY,\n OPT_BORDER,\n OPT_HOVER_ITEM,\n} from \"../lib/styles\";\nimport { Kbd } from \"../core/kbd\";\n\n/**\n * Parse shortcut string and check if event matches\n * Supports: Ctrl+K, Cmd+Shift+P, Alt+N, etc.\n */\nfunction matchesShortcut(event: KeyboardEvent, shortcut: string): boolean {\n const parts = shortcut.toLowerCase().split(\"+\");\n const key = parts[parts.length - 1];\n const modifiers = parts.slice(0, -1);\n\n const requiresCtrl = modifiers.includes(\"ctrl\") || modifiers.includes(\"cmd\");\n const requiresShift = modifiers.includes(\"shift\");\n const requiresAlt = modifiers.includes(\"alt\") || modifiers.includes(\"opt\");\n const requiresMeta = modifiers.includes(\"meta\");\n\n // Check modifiers (Cmd maps to metaKey on Mac, ctrlKey elsewhere)\n const ctrlOrMeta = event.ctrlKey || event.metaKey;\n if (requiresCtrl && !ctrlOrMeta) return false;\n if (requiresShift && !event.shiftKey) return false;\n if (requiresAlt && !event.altKey) return false;\n if (requiresMeta && !event.metaKey) return false;\n\n // Check key\n return event.key.toLowerCase() === key;\n}\n\n/** Localized labels for the quick actions component. */\nexport interface QuickActionsLabels {\n title?: string;\n}\n\nconst defaultLabels: Required<QuickActionsLabels> = {\n title: \"빠른 작업\",\n};\n\n/** Props for the quick actions component. */\nexport interface QuickActionsProps {\n actions: QuickActionDef[];\n title?: string;\n layout?: \"grid\" | \"list\";\n columns?: 2 | 3 | 4;\n /** Show descriptions in grid layout via tooltip */\n showDescriptionInGrid?: boolean;\n /** Enable keyboard shortcut bindings for actions with shortcuts defined */\n bindShortcuts?: boolean;\n /** Custom labels for i18n support */\n labels?: QuickActionsLabels;\n className?: string;\n}\n\n/** Renders the quick actions component. */\nexport function QuickActions({\n actions,\n title,\n layout = \"grid\",\n columns = 3,\n showDescriptionInGrid = false,\n bindShortcuts = false,\n labels: customLabels,\n className,\n}: QuickActionsProps) {\n const labels = { ...defaultLabels, ...customLabels };\n const displayTitle = title ?? labels.title;\n const titleId = useId();\n\n // Bind keyboard shortcuts when enabled\n useEffect(() => {\n if (!bindShortcuts) return;\n\n const handleKeyDown = (event: KeyboardEvent) => {\n // 입력 필드 포커스 중에는 단축키를 가로채지 않음.\n // 사용자가 텍스트를 타이핑할 때 의도하지 않게 액션이 실행되는 사고 방지.\n const target = event.target;\n if (\n target instanceof HTMLInputElement ||\n target instanceof HTMLTextAreaElement ||\n target instanceof HTMLSelectElement ||\n (target instanceof HTMLElement && target.isContentEditable)\n ) {\n return;\n }\n for (const action of actions) {\n if (!action.shortcut || action.disabled) continue;\n if (matchesShortcut(event, action.shortcut)) {\n event.preventDefault();\n action.onClick?.();\n return;\n }\n }\n };\n\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => document.removeEventListener(\"keydown\", handleKeyDown);\n }, [actions, bindShortcuts]);\n\n const gridCols = {\n 2: \"grid-cols-2\",\n 3: \"grid-cols-3\",\n 4: \"grid-cols-4\",\n };\n\n return (\n <div\n className={className}\n data-opt-id=\"CEM9F\"\n data-opt-slug=\"quick-actions.QuickActions\"\n >\n <div className=\"gap-group flex flex-col\">\n {displayTitle && (\n <h3\n id={titleId}\n className={`text-sm font-semibold ${OPT_TEXT_PRIMARY}`}\n >\n {displayTitle}\n </h3>\n )}\n\n <CompositeProvider focusLoop focusWrap>\n <Composite\n role=\"toolbar\"\n aria-labelledby={displayTitle ? titleId : undefined}\n aria-label={displayTitle ? undefined : labels.title}\n className={\n layout === \"grid\"\n ? `gap-element grid ${gridCols[columns]}`\n : `flex flex-col rounded-lg ${OPT_BORDER} divide-border-subtle bg-surface divide-y`\n }\n >\n {actions.map((action) => (\n <CompositeItem\n key={action.id}\n onClick={action.onClick}\n disabled={action.disabled}\n aria-label={\n action.icon && typeof action.icon === \"string\"\n ? `${action.label}${action.description ? `: ${action.description}` : \"\"}`\n : undefined\n }\n className={\n layout === \"grid\"\n ? `gap-element flex flex-col items-center rounded-lg p-4 ${OPT_BORDER} bg-surface ${OPT_FOCUS} ${OPT_HOVER_ITEM} cursor-pointer transition-colors disabled:cursor-not-allowed disabled:opacity-50`\n : `gap-group flex w-full items-center p-3 ${OPT_FOCUS} ${OPT_HOVER_ITEM} cursor-pointer first:rounded-t-lg last:rounded-b-lg disabled:cursor-not-allowed disabled:opacity-50`\n }\n >\n {action.icon && (\n <span\n className={\n layout === \"grid\"\n ? \"text-2xl\"\n : \"bg-bg-subtle flex h-8 w-8 items-center justify-center rounded-lg text-lg\"\n }\n aria-hidden=\"true\"\n >\n {action.icon}\n </span>\n )}\n\n <div\n className={\n layout === \"grid\" ? \"text-center\" : \"min-w-0 flex-1\"\n }\n >\n <span\n className={`text-sm font-medium ${OPT_TEXT_PRIMARY} ${\n layout === \"grid\" ? \"block\" : \"\"\n }`}\n >\n {action.label}\n </span>\n {action.description &&\n (layout === \"list\" || showDescriptionInGrid) && (\n <p\n className={`text-xs ${OPT_TEXT_SECONDARY} ${\n layout === \"grid\" ? \"mt-1\" : \"mt-0.5\"\n }`}\n >\n {action.description}\n </p>\n )}\n </div>\n\n {action.shortcut && (\n <Kbd className={layout === \"grid\" ? \"mt-1\" : \"\"}>\n {action.shortcut}\n </Kbd>\n )}\n </CompositeItem>\n ))}\n </Composite>\n </CompositeProvider>\n </div>\n </div>\n );\n}\n\nQuickActions.displayName = \"QuickActions\";\n","\"use client\";\n\nimport { useId } from \"react\";\nimport {\n Composite,\n CompositeItem,\n CompositeProvider,\n} from \"../core/composite-zone\";\nimport type { TeamMemberDef } from \"../lib/types\";\nimport {\n OPT_FOCUS,\n OPT_TEXT_PRIMARY,\n OPT_TEXT_SECONDARY,\n OPT_TEXT_TERTIARY,\n OPT_BORDER,\n OPT_DOT_GREEN,\n OPT_DOT_YELLOW,\n OPT_DOT_RED,\n OPT_DOT_GRAY,\n} from \"../lib/styles\";\nimport { Avatar, AvatarGroup } from \"../core/avatar\";\n\n/** Localized labels for the team member list component. */\nexport interface TeamMemberListLabels {\n title?: string;\n emptyMessage?: string;\n onlineCount?: string; // \"{online}/{total} 온라인\" pattern\n moreMembers?: string; // \"{count}명 더 보기\" pattern\n moreCompact?: string; // \"+{count}명\" pattern\n status?: {\n online?: string;\n away?: string;\n busy?: string;\n offline?: string;\n };\n}\n\nconst defaultLabels: Required<TeamMemberListLabels> = {\n title: \"팀원\",\n emptyMessage: \"팀원이 없습니다\",\n onlineCount: \"{online}/{total} 온라인\",\n moreMembers: \"{count}명 더 보기\",\n moreCompact: \"+{count}명\",\n status: {\n online: \"온라인\",\n away: \"자리 비움\",\n busy: \"바쁨\",\n offline: \"오프라인\",\n },\n};\n\n/** Props for the team member list component. */\nexport interface TeamMemberListProps {\n members: TeamMemberDef[];\n title?: string;\n layout?: \"list\" | \"compact\" | \"avatars-only\";\n maxDisplay?: number;\n onMemberClick?: (member: TeamMemberDef) => void;\n /** Called when \"more\" button is clicked */\n onShowMore?: () => void;\n emptyMessage?: string;\n /** Custom labels for i18n support */\n labels?: TeamMemberListLabels;\n className?: string;\n}\n\nconst statusDot: Record<NonNullable<TeamMemberDef[\"status\"]>, string> = {\n online: OPT_DOT_GREEN,\n away: OPT_DOT_YELLOW,\n busy: OPT_DOT_RED,\n offline: OPT_DOT_GRAY,\n};\n\n/** Renders the team member list component. */\nexport function TeamMemberList({\n members,\n title,\n layout = \"list\",\n maxDisplay,\n onMemberClick,\n onShowMore,\n emptyMessage,\n labels: customLabels,\n className,\n}: TeamMemberListProps) {\n const labels = {\n ...defaultLabels,\n ...customLabels,\n status: { ...defaultLabels.status, ...customLabels?.status },\n };\n\n const displayTitle = title ?? labels.title;\n const displayEmptyMessage = emptyMessage ?? labels.emptyMessage;\n const titleId = useId();\n\n const displayMembers = maxDisplay ? members.slice(0, maxDisplay) : members;\n const remainingCount = maxDisplay\n ? Math.max(0, members.length - maxDisplay)\n : 0;\n\n const onlineCount = members.filter((m) => m.status === \"online\").length;\n const onlineText = labels.onlineCount\n .replace(\"{online}\", String(onlineCount))\n .replace(\"{total}\", String(members.length));\n\n if (layout === \"avatars-only\") {\n return (\n <div\n className={className}\n data-opt-id=\"6FTC5\"\n data-opt-slug=\"team-member-list.TeamMemberList\"\n >\n <div className=\"gap-group flex flex-col\">\n {displayTitle && (\n <h3 className={`text-sm font-semibold ${OPT_TEXT_PRIMARY}`}>\n {displayTitle}\n </h3>\n )}\n <AvatarGroup max={maxDisplay ?? 5} size=\"md\">\n {members.map((m) => (\n <Avatar\n key={m.id}\n name={m.name}\n src={m.avatar}\n size=\"md\"\n onClick={onMemberClick ? () => onMemberClick(m) : undefined}\n className={onMemberClick ? \"cursor-pointer\" : \"\"}\n />\n ))}\n </AvatarGroup>\n </div>\n </div>\n );\n }\n\n if (layout === \"compact\") {\n return (\n <div\n className={className}\n data-opt-id=\"6FTC5\"\n data-opt-slug=\"team-member-list.TeamMemberList\"\n >\n <div className=\"gap-group flex flex-col\">\n {displayTitle && (\n <h3 className={`text-sm font-semibold ${OPT_TEXT_PRIMARY}`}>\n {displayTitle}\n </h3>\n )}\n <CompositeProvider focusLoop focusWrap>\n <Composite\n className=\"gap-element flex flex-wrap\"\n role=\"list\"\n aria-label={displayTitle}\n >\n {displayMembers.map((member) => (\n <CompositeItem\n key={member.id}\n role=\"listitem\"\n onClick={() => onMemberClick?.(member)}\n className={`gap-element inline-flex items-center rounded-full py-1 pr-3 pl-1 ${OPT_BORDER} bg-surface ${OPT_FOCUS} hover:bg-bg-subtle data-[active-item]:bg-accent-subtle transition-colors`}\n >\n <div className=\"relative\">\n <Avatar name={member.name} src={member.avatar} size=\"xs\" />\n {member.status && (\n <span\n className={`absolute -right-0.5 -bottom-0.5 ${statusDot[member.status]} ring-surface ring-2`}\n aria-label={labels.status[member.status]}\n />\n )}\n </div>\n <span className={`text-sm ${OPT_TEXT_PRIMARY}`}>\n {member.name}\n </span>\n </CompositeItem>\n ))}\n {remainingCount > 0 && (\n <CompositeItem\n render={<button type=\"button\" />}\n onClick={onShowMore}\n className={`inline-flex items-center rounded-full px-3 py-1 text-sm ${OPT_BORDER} ${OPT_TEXT_TERTIARY} ${OPT_FOCUS} hover:text-accent data-[active-item]:bg-accent-subtle transition-colors`}\n aria-label={`${remainingCount}명의 팀원 더 보기`}\n >\n {labels.moreCompact.replace(\n \"{count}\",\n String(remainingCount),\n )}\n </CompositeItem>\n )}\n </Composite>\n </CompositeProvider>\n </div>\n </div>\n );\n }\n\n // Default: list layout\n return (\n <div\n className={className}\n data-opt-id=\"6FTC5\"\n data-opt-slug=\"team-member-list.TeamMemberList\"\n >\n <div className=\"gap-group flex flex-col\">\n {displayTitle && (\n <div className=\"flex items-center justify-between\">\n <h3\n id={titleId}\n className={`text-sm font-semibold ${OPT_TEXT_PRIMARY}`}\n >\n {displayTitle}\n </h3>\n <span className={`text-xs ${OPT_TEXT_TERTIARY}`}>{onlineText}</span>\n </div>\n )}\n\n {members.length === 0 ? (\n <div\n role=\"status\"\n className={`py-8 text-center text-sm ${OPT_TEXT_SECONDARY}`}\n >\n {displayEmptyMessage}\n </div>\n ) : (\n <CompositeProvider focusLoop orientation=\"vertical\">\n <Composite\n role=\"list\"\n aria-labelledby={displayTitle ? titleId : undefined}\n aria-label={displayTitle ? undefined : labels.title}\n className={`rounded-lg ${OPT_BORDER} divide-border-subtle bg-surface divide-y`}\n >\n {displayMembers.map((member) => (\n <CompositeItem\n key={member.id}\n role=\"listitem\"\n onClick={() => onMemberClick?.(member)}\n className={`group gap-group flex w-full items-center p-3 ${OPT_FOCUS} data-[active-item]:bg-accent-subtle ${\n onMemberClick ? \"cursor-pointer\" : \"\"\n }`}\n >\n <div className=\"relative\">\n <Avatar name={member.name} src={member.avatar} size=\"md\" />\n {member.status && (\n <span\n className={`absolute right-0 bottom-0 ${statusDot[member.status]} ring-surface ring-2`}\n aria-label={labels.status[member.status]}\n />\n )}\n </div>\n\n <div className=\"min-w-0 flex-1\">\n <div className=\"gap-element flex items-center\">\n <span\n className={`text-sm font-medium ${OPT_TEXT_PRIMARY}`}\n >\n {member.name}\n </span>\n {member.status && (\n <span className={`text-xs ${OPT_TEXT_TERTIARY}`}>\n · {labels.status[member.status]}\n </span>\n )}\n </div>\n <div className={`text-xs ${OPT_TEXT_SECONDARY}`}>\n {member.role && <span>{member.role}</span>}\n {member.role && member.email && <span> · </span>}\n <span>{member.email}</span>\n </div>\n </div>\n </CompositeItem>\n ))}\n\n {remainingCount > 0 && (\n <button\n type=\"button\"\n onClick={onShowMore}\n className={`w-full p-3 text-center text-xs ${OPT_TEXT_TERTIARY} ${OPT_FOCUS} hover:text-accent cursor-pointer transition-colors`}\n aria-label={`${remainingCount}명의 팀원 더 보기`}\n >\n {labels.moreMembers.replace(\n \"{count}\",\n String(remainingCount),\n )}\n </button>\n )}\n </Composite>\n </CompositeProvider>\n )}\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { useState, type ReactNode } from \"react\";\nimport {\n FormRoot,\n FormInput,\n FormSwitch,\n FormLabel,\n FormError,\n FormSubmit,\n useFormStore,\n} from \"../core/form\";\n\n/** Localized labels for the auth form component. */\nexport interface AuthFormLabels {\n loginTitle?: string;\n signupTitle?: string;\n emailLabel?: string;\n passwordLabel?: string;\n confirmPasswordLabel?: string;\n rememberMeLabel?: string;\n loginButton?: string;\n signupButton?: string;\n emailRequired?: string;\n emailInvalid?: string;\n passwordRequired?: string;\n passwordMinLength?: string;\n passwordMismatch?: string;\n}\n\n/** Props for the auth form component. */\nexport interface AuthFormProps {\n defaultMode?: \"login\" | \"signup\";\n mode?: \"login\" | \"signup\";\n onModeChange?: (mode: \"login\" | \"signup\") => void;\n showRememberMe?: boolean;\n minPasswordLength?: number;\n onSubmit?: (values: {\n email: string;\n password: string;\n confirmPassword?: string;\n rememberMe?: boolean;\n mode: \"login\" | \"signup\";\n }) => void;\n /** Custom fields rendered between email and password (e.g., name fields for signup) */\n renderExtraFields?: (mode: \"login\" | \"signup\") => ReactNode;\n labels?: AuthFormLabels;\n ariaLabel?: string;\n}\n\ntype AuthFormValues = {\n email: string;\n password: string;\n confirmPassword: string;\n rememberMe: boolean;\n};\n\n/** Renders the auth form component. */\nexport function AuthForm({\n defaultMode = \"login\",\n mode: controlledMode,\n onModeChange,\n showRememberMe = true,\n minPasswordLength = 8,\n onSubmit,\n renderExtraFields,\n labels = {},\n ariaLabel,\n}: AuthFormProps) {\n const [uncontrolledMode, setUncontrolledMode] = useState(defaultMode);\n const [submitted, setSubmitted] = useState(false);\n\n const mode = controlledMode ?? uncontrolledMode;\n\n const handleModeChange = (newMode: \"login\" | \"signup\") => {\n if (controlledMode === undefined) {\n setUncontrolledMode(newMode);\n }\n onModeChange?.(newMode);\n };\n\n const form = useFormStore<AuthFormValues>({\n defaultValues: {\n email: \"\",\n password: \"\",\n confirmPassword: \"\",\n rememberMe: false,\n },\n validate: (values) => {\n const errors: Record<string, string> = {};\n const email = values.email;\n if (!email) {\n errors.email = labels.emailRequired ?? \"이메일을 입력해주세요.\";\n } else if (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email)) {\n errors.email = labels.emailInvalid ?? \"유효한 이메일을 입력해주세요.\";\n }\n\n const password = values.password;\n if (!password) {\n errors.password = labels.passwordRequired ?? \"비밀번호를 입력해주세요.\";\n } else if (password.length < minPasswordLength) {\n errors.password =\n labels.passwordMinLength ??\n `비밀번호는 ${minPasswordLength}자 이상이어야 합니다.`;\n }\n\n if (mode === \"signup\") {\n const confirm = values.confirmPassword;\n if (password !== confirm) {\n errors.confirmPassword =\n labels.passwordMismatch ?? \"비밀번호가 일치하지 않습니다.\";\n }\n }\n\n return errors;\n },\n onSubmit: (values) => {\n setSubmitted(true);\n setTimeout(() => setSubmitted(false), 3000);\n if (onSubmit) {\n onSubmit({\n email: values.email,\n password: values.password,\n ...(mode === \"signup\"\n ? { confirmPassword: values.confirmPassword }\n : {}),\n ...(mode === \"login\" ? { rememberMe: values.rememberMe } : {}),\n mode,\n });\n }\n },\n });\n\n const loginTitle = labels.loginTitle ?? \"로그인\";\n const signupTitle = labels.signupTitle ?? \"회원가입\";\n\n return (\n <div\n className=\"gap-section flex flex-col\"\n data-opt-id=\"Z415Y\"\n data-opt-slug=\"form-login.AuthForm\"\n >\n {/* 모드 토글 */}\n <div className=\"border-border flex rounded-lg border\">\n <button\n type=\"button\"\n className={`flex-1 rounded-l-lg px-4 py-2 text-sm font-medium transition-colors ${\n mode === \"login\"\n ? \"bg-accent text-accent-fg\"\n : \"text-text-secondary hover:bg-bg-subtle\"\n }`}\n onClick={() => handleModeChange(\"login\")}\n >\n {loginTitle}\n </button>\n <button\n type=\"button\"\n className={`flex-1 rounded-r-lg px-4 py-2 text-sm font-medium transition-colors ${\n mode === \"signup\"\n ? \"bg-accent text-accent-fg\"\n : \"text-text-secondary hover:bg-bg-subtle\"\n }`}\n onClick={() => handleModeChange(\"signup\")}\n >\n {signupTitle}\n </button>\n </div>\n\n <FormRoot\n store={form}\n aria-label={\n ariaLabel ?? (mode === \"login\" ? \"로그인 폼\" : \"회원가입 폼\")\n }\n >\n <div className=\"gap-element flex flex-col\">\n <FormLabel name=\"email\">{labels.emailLabel ?? \"이메일\"}</FormLabel>\n <FormInput\n name=\"email\"\n type=\"email\"\n placeholder=\"email@example.com\"\n />\n <FormError name=\"email\" />\n </div>\n\n {renderExtraFields?.(mode)}\n\n <div className=\"gap-element flex flex-col\">\n <FormLabel name=\"password\">\n {labels.passwordLabel ?? \"비밀번호\"}\n </FormLabel>\n <FormInput\n name=\"password\"\n type=\"password\"\n placeholder={`${minPasswordLength}자 이상 입력하세요`}\n />\n <FormError name=\"password\" />\n </div>\n\n {mode === \"signup\" && (\n <div className=\"gap-element flex flex-col\">\n <FormLabel name=\"confirmPassword\">\n {labels.confirmPasswordLabel ?? \"비밀번호 확인\"}\n </FormLabel>\n <FormInput\n name=\"confirmPassword\"\n type=\"password\"\n placeholder=\"비밀번호를 다시 입력하세요\"\n />\n <FormError name=\"confirmPassword\" />\n </div>\n )}\n\n {mode === \"login\" && showRememberMe && (\n <label className=\"gap-group flex items-center\">\n <FormSwitch name=\"rememberMe\" size=\"sm\" />\n <span className=\"text-text-secondary text-sm\">\n {labels.rememberMeLabel ?? \"로그인 상태 유지\"}\n </span>\n </label>\n )}\n\n <FormSubmit disabled={form.isSubmitting()}>\n {mode === \"login\"\n ? (labels.loginButton ?? \"로그인\")\n : (labels.signupButton ?? \"회원가입\")}\n </FormSubmit>\n </FormRoot>\n\n {submitted && (\n <div className=\"border-success bg-success-subtle text-success-fg rounded-lg border p-3 text-sm\">\n {mode === \"login\" ? \"로그인 성공!\" : \"회원가입 완료!\"}\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport {\n FormRoot,\n FormInput,\n FormLabel,\n FormError,\n FormSubmit,\n useFormStore,\n} from \"../core/form\";\n\n/** Localized labels for the dynamic field form component. */\nexport interface DynamicFieldFormLabels {\n addButton?: string;\n submitButton?: string;\n removeAriaLabel?: string;\n itemLabel?: string;\n itemPlaceholder?: string;\n itemRequired?: string;\n}\n\n/** Props for the dynamic field form component. */\nexport interface DynamicFieldFormProps {\n initialCount?: number;\n minFields?: number;\n maxFields?: number;\n fieldType?: \"text\" | \"email\" | \"url\" | \"number\";\n validateField?: (value: string, index: number) => string | undefined;\n onSubmit?: (values: string[]) => void;\n onFieldsChange?: (count: number) => void;\n labels?: DynamicFieldFormLabels;\n ariaLabel?: string;\n}\n\ninterface DynamicField {\n id: number;\n}\n\ntype DynamicFieldValues = { items: string[] };\n\n/** Renders the dynamic field form component. */\nexport function DynamicFieldForm({\n initialCount = 1,\n minFields = 1,\n maxFields,\n fieldType = \"text\",\n validateField,\n onSubmit,\n onFieldsChange,\n labels = {},\n ariaLabel,\n}: DynamicFieldFormProps) {\n const initialFields: DynamicField[] = Array.from(\n { length: initialCount },\n (_, i) => ({ id: i + 1 }),\n );\n\n const [fields, setFields] = useState<DynamicField[]>(initialFields);\n const [nextId, setNextId] = useState(initialCount + 1);\n const [submitted, setSubmitted] = useState(false);\n const [submittedValues, setSubmittedValues] = useState<string[]>([]);\n\n const form = useFormStore<DynamicFieldValues>({\n defaultValues: {\n items: Array.from({ length: initialCount }, () => \"\"),\n },\n validate: (values) => {\n const errors: Record<string, string> = {};\n for (let i = 0; i < values.items.length; i++) {\n const fieldName = `items.${i}`;\n const value = values.items[i] ?? \"\";\n if (validateField) {\n const error = validateField(value, i);\n if (error) {\n errors[fieldName] = error;\n continue;\n }\n }\n if (!value?.trim()) {\n errors[fieldName] = labels.itemRequired ?? \"항목을 입력해주세요.\";\n }\n }\n return errors;\n },\n onSubmit: (values) => {\n const items = [...values.items];\n setSubmittedValues(items);\n setSubmitted(true);\n setTimeout(() => setSubmitted(false), 3000);\n onSubmit?.(items);\n },\n });\n\n const addField = () => {\n if (maxFields !== undefined && fields.length >= maxFields) return;\n const items = form.getValue(\"items\");\n const newFields = [...fields, { id: nextId }];\n setFields(newFields);\n form.setValue(\"items\", [...items, \"\"]);\n setNextId(nextId + 1);\n onFieldsChange?.(newFields.length);\n };\n\n const removeField = (id: number) => {\n if (fields.length <= minFields) return;\n const removeIndex = fields.findIndex((field) => field.id === id);\n if (removeIndex < 0) return;\n\n const newFields = fields.filter((field) => field.id !== id);\n const nextItems = [...form.getValue(\"items\")];\n nextItems.splice(removeIndex, 1);\n\n setFields(newFields);\n form.setValue(\"items\", nextItems);\n onFieldsChange?.(newFields.length);\n };\n\n const itemLabel = labels.itemLabel ?? \"항목 {index}\";\n const itemPlaceholder = labels.itemPlaceholder ?? \"항목 {index}을 입력하세요\";\n const removeAriaLabel = labels.removeAriaLabel ?? \"항목 {index} 삭제\";\n\n const formatTemplate = (template: string, index: number) =>\n template.replace(\"{index}\", String(index));\n\n return (\n <div\n className=\"gap-group flex flex-col\"\n data-opt-id=\"8RYG7\"\n data-opt-slug=\"form-dynamic.DynamicFieldForm\"\n >\n <FormRoot store={form} aria-label={ariaLabel ?? \"동적 필드 폼\"}>\n <div className=\"gap-group flex flex-col\">\n {fields.map((field, displayIndex) => {\n const fieldName = `items.${displayIndex}`;\n return (\n <div key={field.id} className=\"gap-element flex flex-col\">\n <FormLabel name={fieldName}>\n {formatTemplate(itemLabel, displayIndex + 1)}\n </FormLabel>\n <div className=\"gap-element flex\">\n <div className=\"flex-1\">\n <FormInput\n name={fieldName}\n type={fieldType}\n placeholder={formatTemplate(\n itemPlaceholder,\n displayIndex + 1,\n )}\n />\n </div>\n <button\n type=\"button\"\n onClick={() => removeField(field.id)}\n disabled={fields.length <= minFields}\n className=\"border-border text-text-tertiary hover:border-danger hover:bg-danger-subtle hover:text-danger-fg inline-flex h-10 w-10 shrink-0 items-center justify-center rounded-lg border transition-colors disabled:cursor-not-allowed disabled:opacity-30\"\n aria-label={formatTemplate(\n removeAriaLabel,\n displayIndex + 1,\n )}\n >\n ✕\n </button>\n </div>\n <FormError name={fieldName} />\n </div>\n );\n })}\n </div>\n\n <button\n type=\"button\"\n onClick={addField}\n disabled={maxFields !== undefined && fields.length >= maxFields}\n className=\"border-border text-text-secondary hover:border-accent hover:bg-accent-subtle hover:text-accent w-full rounded-lg border border-dashed px-4 py-2.5 text-sm font-medium transition-colors disabled:cursor-not-allowed disabled:opacity-30\"\n >\n {labels.addButton ?? \"+ 항목 추가\"}\n </button>\n\n <FormSubmit disabled={form.isSubmitting()}>\n {labels.submitButton ?? \"제출\"}\n </FormSubmit>\n </FormRoot>\n\n {submitted && submittedValues.length > 0 && (\n <div className=\"border-success bg-success-subtle rounded-lg border p-3\">\n <p className=\"text-success-fg mb-2 text-sm font-medium\">제출된 값:</p>\n <ul className=\"text-success-fg gap-element flex flex-col text-sm\">\n {submittedValues.map((val, i) => (\n <li key={i}>\n {formatTemplate(itemLabel, i + 1)}: <strong>{val}</strong>\n </li>\n ))}\n </ul>\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport { useState, type ReactNode } from \"react\";\nimport {\n FormRoot,\n FormInput,\n FormTextarea,\n FormLabel,\n FormError,\n FormSubmit,\n useFormStore,\n} from \"../core/form\";\n\n/** Localized labels for the file upload form component. */\nexport interface FileUploadFormLabels {\n titleLabel?: string;\n titlePlaceholder?: string;\n titleRequired?: string;\n descriptionLabel?: string;\n descriptionPlaceholder?: string;\n fileLabel?: string;\n submitButton?: string;\n successMessage?: string;\n columnMappingLabel?: string;\n}\n\n/** Props for the file upload form component. */\nexport interface FileUploadFormProps {\n accept?: string;\n showPreview?: boolean;\n showFileInfo?: boolean;\n showDescription?: boolean;\n descriptionRows?: number;\n titleRequired?: boolean;\n maxFileSize?: number;\n onSubmit?: (values: {\n title: string;\n description: string;\n file: File | null;\n }) => void;\n onFileChange?: (file: File | null) => void;\n /** Called after file is selected to allow parsing/preview. Return ReactNode to show column mapping UI. */\n onPreview?: (file: File) => void;\n /** Custom column mapping UI rendered after file selection */\n columnMapping?: ReactNode;\n labels?: FileUploadFormLabels;\n ariaLabel?: string;\n}\n\ntype FormValues = { title: string; description: string };\n\nfunction formatFileSize(bytes: number) {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\n/** Renders the file upload form component. */\nexport function FileUploadForm({\n accept = \"image/*,.pdf,.doc,.docx\",\n showPreview = true,\n showFileInfo = true,\n showDescription = true,\n descriptionRows = 3,\n titleRequired = true,\n maxFileSize,\n onSubmit,\n onFileChange,\n onPreview,\n columnMapping,\n labels = {},\n ariaLabel,\n}: FileUploadFormProps) {\n const [selectedFile, setSelectedFile] = useState<File | null>(null);\n const [preview, setPreview] = useState<string | null>(null);\n const [submitted, setSubmitted] = useState(false);\n const [fileSizeError, setFileSizeError] = useState<string | null>(null);\n\n const form = useFormStore<FormValues>({\n defaultValues: {\n title: \"\",\n description: \"\",\n },\n validate: (values) => {\n const errors: Record<string, string> = {};\n if (titleRequired) {\n if (!values.title?.trim()) {\n errors.title = labels.titleRequired ?? \"제목을 입력해주세요.\";\n }\n }\n return errors;\n },\n onSubmit: (values) => {\n setSubmitted(true);\n setTimeout(() => setSubmitted(false), 3000);\n if (onSubmit) {\n onSubmit({\n title: values.title,\n description: values.description,\n file: selectedFile,\n });\n }\n },\n });\n\n const handleFileChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0] ?? null;\n setFileSizeError(null);\n\n if (file) {\n if (maxFileSize && file.size > maxFileSize) {\n setFileSizeError(\n `파일 크기가 ${formatFileSize(maxFileSize)}를 초과합니다.`,\n );\n setSelectedFile(null);\n setPreview(null);\n onFileChange?.(null);\n return;\n }\n setSelectedFile(file);\n onPreview?.(file);\n if (file.type.startsWith(\"image/\")) {\n const reader = new FileReader();\n reader.onloadend = () => setPreview(reader.result as string);\n reader.readAsDataURL(file);\n } else {\n setPreview(null);\n }\n } else {\n setSelectedFile(null);\n setPreview(null);\n }\n onFileChange?.(file);\n };\n\n return (\n <div\n className=\"gap-group flex flex-col\"\n data-opt-id=\"4E3MD\"\n data-opt-slug=\"form-upload.FileUploadForm\"\n >\n <FormRoot store={form} aria-label={ariaLabel ?? \"파일 업로드 폼\"}>\n <div className=\"gap-element flex flex-col\">\n <FormLabel name=\"title\">{labels.titleLabel ?? \"제목\"}</FormLabel>\n <FormInput\n name=\"title\"\n placeholder={labels.titlePlaceholder ?? \"파일 제목을 입력하세요\"}\n />\n <FormError name=\"title\" />\n </div>\n\n {showDescription && (\n <div className=\"gap-element flex flex-col\">\n <FormLabel name=\"description\">\n {labels.descriptionLabel ?? \"설명\"}\n </FormLabel>\n <FormTextarea\n name=\"description\"\n placeholder={\n labels.descriptionPlaceholder ?? \"파일에 대한 설명을 입력하세요\"\n }\n rows={descriptionRows}\n resize=\"none\"\n />\n </div>\n )}\n\n <div className=\"gap-element flex flex-col\">\n <label className=\"text-text-primary text-sm font-medium\">\n {labels.fileLabel ?? \"파일 선택\"}\n </label>\n <div className=\"relative\">\n <input\n type=\"file\"\n onChange={handleFileChange}\n accept={accept}\n className=\"border-border bg-surface text-text-primary file:bg-accent-subtle file:text-accent hover:file:bg-accent-subtle block w-full cursor-pointer rounded-lg border px-4 py-2.5 text-sm file:mr-4 file:cursor-pointer file:rounded-md file:border-0 file:px-3 file:py-1 file:text-sm file:font-medium\"\n />\n </div>\n {fileSizeError && (\n <p className=\"text-danger-fg text-xs\">{fileSizeError}</p>\n )}\n </div>\n\n {selectedFile && showFileInfo && (\n <div className=\"border-border-subtle rounded-lg border p-4\">\n <div className=\"gap-element flex flex-col\">\n <div className=\"flex items-center justify-between text-sm\">\n <span className=\"text-text-primary font-medium\">\n {selectedFile.name}\n </span>\n <span className=\"text-text-tertiary\">\n {formatFileSize(selectedFile.size)}\n </span>\n </div>\n <div className=\"text-text-tertiary text-xs\">\n 타입: {selectedFile.type || \"알 수 없음\"}\n </div>\n {showPreview && preview && (\n <div className=\"border-border-subtle overflow-hidden rounded-lg border\">\n <img\n src={preview}\n alt=\"미리보기\"\n className=\"max-h-48 w-full object-contain\"\n />\n </div>\n )}\n </div>\n </div>\n )}\n\n {columnMapping && selectedFile && (\n <div\n className=\"gap-element flex flex-col\"\n aria-label={labels.columnMappingLabel ?? \"Column mapping\"}\n >\n {columnMapping}\n </div>\n )}\n\n <FormSubmit disabled={form.isSubmitting()}>\n {labels.submitButton ?? \"업로드\"}\n </FormSubmit>\n </FormRoot>\n\n {submitted && (\n <div className=\"border-success bg-success-subtle text-success-fg rounded-lg border p-3 text-sm\">\n {labels.successMessage ?? \"업로드가 완료되었습니다!\"}\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport { useState } from \"react\";\nimport type { FormFieldDef } from \"../lib/types\";\nimport {\n FormRoot,\n FormInput,\n FormTextarea,\n FormSelect,\n FormSelectPopover,\n FormSelectItem,\n FormSwitch,\n FormLabel,\n FormError,\n FormSubmit,\n FormCheckbox,\n FormRadioGroup,\n FormRadio,\n useFormStore,\n} from \"../core/form\";\n\n/** Defines the wizard step shape. */\nexport interface WizardStepDef {\n id: string;\n label: string;\n fields: string[];\n}\n\n/** Localized labels for the wizard form component. */\nexport interface WizardFormLabels {\n stepsLabel?: string;\n backButton?: string;\n nextButton?: string;\n submitButton?: string;\n successMessage?: string;\n resetLink?: string;\n reviewTitle?: string;\n emptyValue?: string;\n}\n\n/** Props for the wizard form component. */\nexport interface WizardFormProps {\n fields: FormFieldDef[];\n steps: WizardStepDef[];\n showReview?: boolean;\n onSubmit?: (values: Record<string, unknown>) => void;\n onStepChange?: (stepIndex: number) => void;\n resetOnSuccess?: boolean;\n labels?: WizardFormLabels;\n ariaLabel?: string;\n}\n\n/** Renders the wizard form component. */\nexport function WizardForm({\n fields,\n steps,\n showReview = true,\n onSubmit,\n onStepChange,\n resetOnSuccess = false,\n labels = {},\n ariaLabel,\n}: WizardFormProps) {\n const [currentStep, setCurrentStep] = useState(0);\n const [submitted, setSubmitted] = useState(false);\n\n const totalSteps = showReview ? steps.length + 1 : steps.length;\n const isReviewStep = showReview && currentStep === steps.length;\n const isLastStep = currentStep === totalSteps - 1;\n\n const defaultValues: Record<string, unknown> = {};\n for (const field of fields) {\n defaultValues[field.name] =\n field.defaultValue ??\n (field.type === \"switch\" || field.type === \"checkbox\" ? false : \"\");\n }\n\n const form = useFormStore({\n defaultValues,\n validate: (values) => {\n if (isReviewStep) return;\n const currentStepDef = steps[currentStep];\n if (!currentStepDef) return;\n const currentFieldNames = new Set(currentStepDef.fields);\n const errors: Record<string, string> = {};\n for (const field of fields) {\n if (!currentFieldNames.has(field.name)) continue;\n if (field.required) {\n const value = values[field.name];\n if (!value || (typeof value === \"string\" && !value.trim())) {\n errors[field.name] =\n field.requiredMessage ?? `${field.label}을(를) 입력해주세요.`;\n }\n }\n if (field.validate) {\n const value = values[field.name];\n const error = field.validate(value);\n if (error) {\n errors[field.name] = error;\n }\n }\n }\n return errors;\n },\n onSubmit: (values) => {\n if (!isLastStep) {\n const next = currentStep + 1;\n setCurrentStep(next);\n onStepChange?.(next);\n } else {\n setSubmitted(true);\n onSubmit?.(values);\n if (resetOnSuccess) {\n setTimeout(() => {\n setCurrentStep(0);\n setSubmitted(false);\n form.reset();\n }, 3000);\n }\n }\n },\n });\n\n const handleBack = () => {\n if (currentStep > 0) {\n const prev = currentStep - 1;\n setCurrentStep(prev);\n onStepChange?.(prev);\n }\n };\n\n const handleReset = () => {\n setCurrentStep(0);\n setSubmitted(false);\n form.reset();\n };\n\n const renderField = (field: FormFieldDef) => {\n if (field.type === \"radio\") {\n return (\n <fieldset key={field.name} className=\"gap-element flex flex-col\">\n <legend className=\"text-text-primary text-sm font-medium\">\n {field.label}\n </legend>\n <FormRadioGroup>\n <div className=\"gap-group flex\">\n {field.options?.map((option) => (\n <label\n key={option.value}\n className=\"text-text-primary gap-element flex items-center text-sm\"\n >\n <FormRadio name={field.name} value={option.value} />\n {option.label}\n </label>\n ))}\n </div>\n </FormRadioGroup>\n <FormError name={field.name} />\n </fieldset>\n );\n }\n\n if (field.type === \"checkbox\") {\n return (\n <div key={field.name} className=\"gap-element flex flex-col\">\n <label className=\"text-text-primary gap-element flex items-center text-sm\">\n <FormCheckbox name={field.name} />\n <span>{field.label}</span>\n </label>\n <FormError name={field.name} />\n </div>\n );\n }\n\n if (field.type === \"textarea\") {\n return (\n <div key={field.name} className=\"gap-element flex flex-col\">\n <FormLabel name={field.name}>{field.label}</FormLabel>\n <FormTextarea\n name={field.name}\n placeholder={field.placeholder}\n rows={field.rows ?? 4}\n resize={field.resize ?? \"vertical\"}\n />\n <FormError name={field.name} />\n </div>\n );\n }\n\n if (field.type === \"select\") {\n return (\n <div key={field.name} className=\"gap-element flex flex-col\">\n <FormLabel name={field.name}>{field.label}</FormLabel>\n <FormSelect name={field.name} placeholder={field.placeholder}>\n <FormSelectPopover>\n {field.options?.map((option) => (\n <FormSelectItem key={option.value} value={option.value}>\n {option.label}\n </FormSelectItem>\n ))}\n </FormSelectPopover>\n </FormSelect>\n <FormError name={field.name} />\n </div>\n );\n }\n\n if (field.type === \"switch\") {\n return (\n <label key={field.name} className=\"gap-group flex items-center\">\n <FormSwitch name={field.name} />\n <div className=\"flex flex-col\">\n <span className=\"text-text-primary text-sm font-medium\">\n {field.label}\n </span>\n {field.description && (\n <span className=\"text-text-secondary text-sm\">\n {field.description}\n </span>\n )}\n </div>\n </label>\n );\n }\n\n return (\n <div key={field.name} className=\"gap-element flex flex-col\">\n <FormLabel name={field.name}>{field.label}</FormLabel>\n <FormInput\n name={field.name}\n type={field.type ?? \"text\"}\n placeholder={field.placeholder}\n />\n <FormError name={field.name} />\n </div>\n );\n };\n\n const stepLabels = [\n ...steps.map((s) => s.label),\n ...(showReview ? [labels.reviewTitle ?? \"확인\"] : []),\n ];\n\n const currentStepFields = !isReviewStep\n ? (() => {\n const stepDef = steps[currentStep];\n if (!stepDef) return [];\n const fieldNameSet = new Set(stepDef.fields);\n return fields.filter((f) => fieldNameSet.has(f.name));\n })()\n : [];\n\n return (\n <div\n className=\"gap-section flex flex-col\"\n data-opt-id=\"SFY8G\"\n data-opt-slug=\"form-wizard.WizardForm\"\n >\n {/* 진행 표시기 */}\n <ol\n className=\"gap-element flex list-none items-center p-0\"\n aria-label={labels.stepsLabel ?? \"다단계 폼 단계\"}\n >\n {stepLabels.map((label, i) => (\n <li\n key={label}\n className=\"gap-element flex flex-1 items-center\"\n aria-current={i === currentStep ? \"step\" : undefined}\n >\n <div\n aria-hidden=\"true\"\n className={`flex h-8 w-8 shrink-0 items-center justify-center rounded-full text-xs font-medium ${\n i <= currentStep\n ? \"bg-accent text-accent-fg\"\n : \"bg-bg-subtle text-text-secondary\"\n }`}\n >\n {i + 1}\n </div>\n <span\n className={`hidden text-sm sm:inline ${\n i <= currentStep\n ? \"text-text-primary font-medium\"\n : \"text-text-secondary\"\n }`}\n >\n {label}\n </span>\n {i < stepLabels.length - 1 && (\n <div\n aria-hidden=\"true\"\n className={`h-px flex-1 ${\n i < currentStep ? \"bg-accent\" : \"bg-border-subtle\"\n }`}\n />\n )}\n </li>\n ))}\n </ol>\n\n <FormRoot store={form} aria-label={ariaLabel ?? \"다단계 폼\"}>\n {/* 입력 단계 */}\n {!isReviewStep && (\n <div className=\"gap-group flex flex-col\">\n {currentStepFields.map(renderField)}\n </div>\n )}\n\n {/* 리뷰 단계 */}\n {isReviewStep && !submitted && (\n <div className=\"gap-group flex flex-col\">\n <div className=\"border-border rounded-lg border p-4\">\n <h4 className=\"text-text-primary mb-3 text-sm font-semibold\">\n {labels.reviewTitle ?? \"입력 내용 확인\"}\n </h4>\n <dl className=\"gap-element flex flex-col text-sm\">\n {fields.map((field) => {\n const val = form.getValue(field.name);\n const display =\n val === true\n ? \"Yes\"\n : val === false\n ? \"No\"\n : String(val || labels.emptyValue || \"—\");\n return (\n <div key={field.name} className=\"gap-group flex\">\n <dt className=\"text-text-secondary w-20 shrink-0 font-medium\">\n {field.label}\n </dt>\n <dd className=\"text-text-primary\">{display}</dd>\n </div>\n );\n })}\n </dl>\n </div>\n </div>\n )}\n\n {/* 네비게이션 */}\n {!submitted && (\n <div className=\"flex justify-between pt-2\">\n {currentStep > 0 ? (\n <button\n type=\"button\"\n onClick={handleBack}\n className=\"border-border text-text-primary hover:bg-bg-subtle rounded-lg border px-4 py-2 text-sm font-medium\"\n >\n {labels.backButton ?? \"이전\"}\n </button>\n ) : (\n <div />\n )}\n <FormSubmit>\n {isLastStep\n ? (labels.submitButton ?? \"제출\")\n : (labels.nextButton ?? \"다음\")}\n </FormSubmit>\n </div>\n )}\n </FormRoot>\n\n {submitted && (\n <div className=\"border-success bg-success-subtle rounded-lg border p-4 text-center\">\n <p className=\"text-success-fg text-sm font-medium\">\n {labels.successMessage ?? \"제출이 완료되었습니다!\"}\n </p>\n <button\n type=\"button\"\n onClick={handleReset}\n className=\"text-accent mt-2 text-sm underline hover:no-underline\"\n >\n {labels.resetLink ?? \"다시 작성하기\"}\n </button>\n </div>\n )}\n </div>\n );\n}\n","import * as React from \"react\";\nimport { cn } from \"../lib/cn\";\nimport { getIconRegistryEntry } from \"../lib/icon-registry\";\n\n/** Popular icon names for picker UIs */\nexport const POPULAR_ICONS = [\n \"click\",\n \"eye\",\n \"search\",\n \"user\",\n \"shopping-cart\",\n \"credit-card\",\n \"heart\",\n \"star\",\n \"bell\",\n \"download\",\n \"upload\",\n \"share\",\n \"mail\",\n \"settings\",\n \"globe\",\n \"zap\",\n \"trending-up\",\n \"bar-chart\",\n \"check-circle\",\n \"x-circle\",\n] as const;\n\n/** Color presets for event icon backgrounds */\nexport const COLOR_PRESETS = [\n \"#3b82f6\",\n \"#8b5cf6\",\n \"#ec4899\",\n \"#ef4444\",\n \"#f59e0b\",\n \"#10b981\",\n \"#06b6d4\",\n \"#6366f1\",\n \"#f97316\",\n \"#14b8a6\",\n] as const;\n\n/** Props for the event icon component. */\nexport interface EventIconProps {\n /** Semantic icon key, legacy icon key, or ReactNode */\n icon: string | React.ReactNode;\n /** Custom icon color; when omitted, theme accent tokens are used */\n color?: string;\n /** Icon size */\n size?: \"sm\" | \"md\" | \"lg\";\n className?: string;\n labels?: EventIconLabels;\n}\n\n/** Localized labels for the event icon component. */\nexport interface EventIconLabels {\n eventLabelPrefix?: string;\n defaultAriaLabel?: string;\n}\n\nconst defaultLabels: Required<EventIconLabels> = {\n eventLabelPrefix: \"Event\",\n defaultAriaLabel: \"Event icon\",\n};\n\nconst SIZE_MAP = {\n sm: { container: \"h-5 w-5\", text: \"text-[10px]\", iconSize: 12 },\n md: { container: \"h-7 w-7\", text: \"text-sm\", iconSize: 16 },\n lg: { container: \"h-9 w-9\", text: \"text-base\", iconSize: 20 },\n};\n\nfunction getEventIconStyle(color?: string): React.CSSProperties | undefined {\n if (!color) {\n return undefined;\n }\n\n return {\n color,\n backgroundColor: `color-mix(in srgb, ${color} 16%, transparent)`,\n };\n}\n\n/** Renders the event icon component. */\nexport function EventIcon({\n icon,\n color,\n size = \"md\",\n className,\n labels: customLabels,\n}: EventIconProps) {\n const labels = { ...defaultLabels, ...customLabels };\n const sizes = SIZE_MAP[size];\n const resolvedColor = color?.trim() ? color : undefined;\n const iconEntry =\n typeof icon === \"string\" ? getIconRegistryEntry(icon) : undefined;\n const iconElement = React.isValidElement<{\n size?: number;\n className?: string;\n \"aria-hidden\"?: boolean;\n }>(icon)\n ? icon\n : null;\n const ariaLabel =\n typeof icon === \"string\"\n ? `${labels.eventLabelPrefix}: ${iconEntry?.label ?? icon}`\n : labels.defaultAriaLabel;\n let iconContent: React.ReactNode;\n\n if (iconEntry) {\n iconContent = <iconEntry.Icon aria-hidden size={sizes.iconSize} />;\n } else if (typeof icon === \"string\") {\n iconContent = (\n <span className={cn(sizes.text, \"leading-none\")}>{icon}</span>\n );\n } else if (iconElement) {\n iconContent = React.cloneElement(iconElement, {\n \"aria-hidden\": true,\n size: sizes.iconSize,\n className: cn(\"shrink-0\", iconElement.props.className),\n });\n } else {\n iconContent = (\n <span className=\"flex shrink-0 items-center justify-center\">{icon}</span>\n );\n }\n\n return (\n <span\n role=\"img\"\n aria-label={ariaLabel}\n className={cn(\n \"inline-flex shrink-0 items-center justify-center rounded-lg\",\n !resolvedColor && \"bg-accent-subtle text-accent\",\n sizes.container,\n className,\n )}\n style={getEventIconStyle(resolvedColor)}\n data-opt-id=\"ZNSD9\"\n data-opt-slug=\"event-icon.EventIcon\"\n >\n {iconContent}\n </span>\n );\n}\n\nEventIcon.displayName = \"EventIcon\";\n","import * as React from \"react\";\nimport { cn } from \"../lib/cn\";\n\n/** Type definition for connection status. */\nexport type ConnectionStatus =\n | \"connected\"\n | \"disconnected\"\n | \"connecting\"\n | \"error\";\n\n/**\n * 점 색상 톤. `status` 프리셋으로 표현되지 않는 도메인 상태\n * (예: \"Persistent\" / \"Volatile\" / \"Recovered\")를 직접 칠할 때 쓴다.\n */\nexport type ConnectionTone =\n | \"neutral\"\n | \"success\"\n | \"warning\"\n | \"danger\"\n | \"info\";\n\n/** Localized labels for the connection indicator component. */\nexport type ConnectionIndicatorLabels = Record<never, never>;\n\n/** Props for the connection indicator component. */\nexport interface ConnectionIndicatorProps {\n /**\n * 연결 상태 프리셋. tone과 pulse의 기본값을 정한다.\n * 생략하면 `tone`(기본 neutral)이 색을 결정한다.\n */\n status?: ConnectionStatus;\n /** status 프리셋 대신 색만 지정. status와 함께 주면 이 값이 이긴다. */\n tone?: ConnectionTone;\n label?: string;\n showLabel?: boolean;\n /** 점 애니메이션. 생략하면 status 프리셋을 따른다. */\n pulse?: boolean;\n className?: string;\n}\n\nconst TONE_CLASS: Record<ConnectionTone, string> = {\n neutral: \"bg-text-tertiary\",\n success: \"bg-success\",\n warning: \"bg-warning\",\n danger: \"bg-danger\",\n info: \"bg-info\",\n};\n\nconst STATUS_CONFIG: Record<\n ConnectionStatus,\n { tone: ConnectionTone; pulse: boolean; defaultLabel: string }\n> = {\n connected: {\n tone: \"success\",\n pulse: false,\n defaultLabel: \"Connected\",\n },\n connecting: {\n tone: \"warning\",\n pulse: true,\n defaultLabel: \"Connecting...\",\n },\n disconnected: {\n tone: \"neutral\",\n pulse: false,\n defaultLabel: \"Disconnected\",\n },\n error: {\n tone: \"danger\",\n pulse: true,\n defaultLabel: \"Error\",\n },\n};\n\n/** Renders the connection indicator component. */\nexport function ConnectionIndicator({\n status,\n tone,\n label,\n showLabel = true,\n pulse,\n className,\n}: ConnectionIndicatorProps) {\n const preset = status ? STATUS_CONFIG[status] : null;\n const resolvedTone = tone ?? preset?.tone ?? \"neutral\";\n const resolvedPulse = pulse ?? preset?.pulse ?? false;\n const displayLabel = label ?? preset?.defaultLabel ?? \"\";\n const dotClass = TONE_CLASS[resolvedTone];\n\n return (\n <span\n role=\"status\"\n aria-label={displayLabel || undefined}\n className={cn(\"inline-flex min-w-0 items-center gap-1.5\", className)}\n data-opt-id=\"191EC\"\n data-opt-slug=\"connection-indicator.ConnectionIndicator\"\n >\n <span className=\"relative flex h-2.5 w-2.5 flex-none\">\n {resolvedPulse && (\n <span\n className={cn(\n \"absolute inline-flex h-full w-full animate-ping rounded-full opacity-75\",\n dotClass,\n )}\n />\n )}\n <span\n className={cn(\n \"relative inline-flex h-2.5 w-2.5 rounded-full\",\n dotClass,\n )}\n />\n </span>\n {showLabel && displayLabel && (\n <span className=\"text-text-secondary truncate text-xs\">\n {displayLabel}\n </span>\n )}\n </span>\n );\n}\n\nConnectionIndicator.displayName = \"ConnectionIndicator\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../lib/cn\";\nimport { Button } from \"../core/button\";\n\n/** Defines the floating action shape. */\nexport interface FloatingAction {\n id: string;\n label: string;\n icon?: React.ReactNode;\n variant?: \"default\" | \"primary\" | \"danger\";\n disabled?: boolean;\n}\n\n/** Props for the floating action bar component. */\nexport interface FloatingActionBarProps {\n actions: FloatingAction[];\n selectedCount?: number;\n onAction: (actionId: string) => void;\n onDismiss?: () => void;\n className?: string;\n labels?: FloatingActionBarLabels;\n}\n\n/** Localized labels for the floating action bar component. */\nexport interface FloatingActionBarLabels {\n toolbarAriaLabel?: string;\n selectedLabel?: (count: number) => string;\n dismissAriaLabel?: string;\n}\n\nconst defaultLabels: Required<FloatingActionBarLabels> = {\n toolbarAriaLabel: \"Actions\",\n selectedLabel: (count) => `${count} selected`,\n dismissAriaLabel: \"Dismiss\",\n};\n\n/** Renders the floating action bar component. */\nexport function FloatingActionBar({\n actions,\n selectedCount,\n onAction,\n onDismiss,\n className,\n labels: customLabels,\n}: FloatingActionBarProps) {\n const labels = { ...defaultLabels, ...customLabels };\n\n if (actions.length === 0) return null;\n\n return (\n <div\n role=\"toolbar\"\n aria-label={labels.toolbarAriaLabel}\n className={cn(\n \"fixed bottom-6 left-1/2 z-50 -translate-x-1/2\",\n \"gap-element flex items-center rounded-xl px-4 py-2.5\",\n // eslint-disable-next-line opt-ui/no-raw-color -- floating action bar는 라이트/다크 공통 dark surface 의도\n \"bg-black/90 shadow-xl\",\n \"backdrop-blur-sm\",\n className,\n )}\n data-opt-id=\"S390B\"\n data-opt-slug=\"floating-action-bar.FloatingActionBar\"\n >\n {selectedCount !== undefined && (\n // eslint-disable-next-line opt-ui/no-raw-color -- dark surface 위 흰 텍스트\n <span className=\"mr-2 text-sm font-medium text-white\">\n {labels.selectedLabel(selectedCount)}\n </span>\n )}\n {actions.map((action) => {\n const variant =\n action.variant === \"danger\"\n ? \"danger\"\n : action.variant === \"primary\"\n ? \"primary\"\n : \"ghost\";\n return (\n <Button\n key={action.id}\n variant={variant}\n size=\"sm\"\n disabled={action.disabled}\n onClick={() => onAction(action.id)}\n className={cn(\n // eslint-disable-next-line opt-ui/no-raw-color -- dark surface 위 ghost 버튼 색\n variant === \"ghost\" && \"text-white hover:bg-white/10\",\n )}\n >\n {action.icon}\n {action.label}\n </Button>\n );\n })}\n {onDismiss && (\n <button\n type=\"button\"\n onClick={onDismiss}\n // eslint-disable-next-line opt-ui/no-raw-color -- dark surface 위 dismiss 버튼 + focus ring\n className=\"ml-1 rounded text-sm text-white/60 hover:text-white focus-visible:ring-2 focus-visible:ring-white/60 focus-visible:outline-none\"\n aria-label={labels.dismissAriaLabel}\n >\n ✕\n </button>\n )}\n </div>\n );\n}\n\nFloatingActionBar.displayName = \"FloatingActionBar\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport { matchSorter } from \"match-sorter\";\nimport { cn } from \"../lib/cn\";\nimport { Badge } from \"../core/badge\";\nimport { OPT_FOCUS_VISIBLE } from \"../lib/styles\";\n\n/** Defines the template shape. */\nexport interface TemplateDef {\n id: string;\n name: string;\n description?: string;\n icon?: React.ReactNode;\n category?: string;\n featured?: boolean;\n tags?: string[];\n}\n\n/** Localized labels for the template picker component. */\nexport interface TemplatePickerLabels {\n ariaLabel?: string;\n defaultCategory?: string;\n searchPlaceholder?: string;\n featuredBadge?: string;\n}\n\nconst defaultLabels: Required<TemplatePickerLabels> = {\n ariaLabel: \"Templates\",\n defaultCategory: \"General\",\n searchPlaceholder: \"Search templates...\",\n featuredBadge: \"Featured\",\n};\n\n/** Props for the template picker component. */\nexport interface TemplatePickerProps {\n templates: TemplateDef[];\n selected?: string;\n onSelect: (templateId: string) => void;\n labels?: TemplatePickerLabels;\n showSearch?: boolean;\n className?: string;\n}\n\n/** Renders the template picker component. */\nexport function TemplatePicker({\n templates,\n selected,\n onSelect,\n labels: customLabels,\n showSearch = false,\n className,\n}: TemplatePickerProps) {\n const labels = { ...defaultLabels, ...customLabels };\n const [search, setSearch] = React.useState(\"\");\n\n // Filter by search\n const filtered = React.useMemo(() => {\n if (!showSearch || !search) return templates;\n return matchSorter(templates, search, {\n keys: [\"name\", \"description\", \"tags\"],\n });\n }, [templates, search, showSearch]);\n\n // Group by category\n const grouped = React.useMemo(() => {\n const map = new Map<string, TemplateDef[]>();\n for (const t of filtered) {\n const cat = t.category ?? labels.defaultCategory;\n if (!map.has(cat)) map.set(cat, []);\n map.get(cat)!.push(t);\n }\n return map;\n }, [filtered, labels.defaultCategory]);\n\n return (\n <div\n className={cn(\"gap-group flex flex-col\", className)}\n role=\"listbox\"\n aria-label={labels.ariaLabel}\n data-opt-id=\"PVFJP\"\n data-opt-slug=\"template-picker.TemplatePicker\"\n >\n {showSearch && (\n <input\n type=\"search\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder={labels.searchPlaceholder}\n aria-label={labels.searchPlaceholder}\n className={cn(\n \"border-border bg-surface text-text-primary placeholder:text-text-tertiary focus:border-accent w-full rounded-lg border px-3 py-2 text-sm\",\n OPT_FOCUS_VISIBLE,\n )}\n />\n )}\n {Array.from(grouped).map(([category, items]) => (\n <div key={category}>\n <h3 className=\"text-text-tertiary mb-2 text-xs font-semibold tracking-wider uppercase\">\n {category}\n </h3>\n <div className=\"gap-element grid grid-cols-2 sm:grid-cols-3\">\n {items.map((t) => (\n <button\n key={t.id}\n role=\"option\"\n aria-selected={selected === t.id}\n onClick={() => onSelect(t.id)}\n className={cn(\n \"flex flex-col items-start gap-1 rounded-lg border p-3 text-left transition-colors\",\n \"hover:bg-bg-subtle\",\n selected === t.id\n ? \"border-accent bg-accent-subtle\"\n : \"border-border\",\n )}\n >\n <div className=\"gap-element flex w-full items-center\">\n {t.icon && (\n <span className=\"flex size-5 items-center justify-center\">\n {t.icon}\n </span>\n )}\n <span className=\"text-text-primary text-sm font-medium\">\n {t.name}\n </span>\n {t.featured && (\n <Badge variant=\"info\" size=\"sm\" className=\"ml-auto\">\n {labels.featuredBadge}\n </Badge>\n )}\n </div>\n {t.description && (\n <span className=\"text-text-tertiary line-clamp-2 text-xs\">\n {t.description}\n </span>\n )}\n {t.tags && t.tags.length > 0 && (\n <div className=\"flex flex-wrap gap-1\">\n {t.tags.map((tag) => (\n <span\n key={tag}\n className=\"bg-bg-subtle text-text-tertiary rounded px-1.5 py-0.5 text-[10px]\"\n >\n {tag}\n </span>\n ))}\n </div>\n )}\n </button>\n ))}\n </div>\n </div>\n ))}\n </div>\n );\n}\n\nTemplatePicker.displayName = \"TemplatePicker\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../lib/cn\";\nimport { OPT_FOCUS_VISIBLE } from \"../lib/styles\";\n\n/** Localized labels for the code snippet viewer component. */\nexport interface CodeSnippetViewerLabels {\n copy?: string;\n copied?: string;\n codeRegion?: string;\n}\n\nconst defaultLabels: Required<CodeSnippetViewerLabels> = {\n copy: \"Copy\",\n copied: \"Copied!\",\n codeRegion: \"Code snippet\",\n};\n\n/** Visual tone options for code snippet syntax surfaces. */\nexport type CodeSnippetSyntaxTheme = \"default\" | \"muted\" | \"dark\" | \"terminal\";\n\nconst syntaxThemeClasses: Record<\n CodeSnippetSyntaxTheme,\n {\n root: string;\n header: string;\n pre: string;\n lineNumber: string;\n code: string;\n }\n> = {\n default: {\n root: \"bg-surface\",\n header: \"bg-surface-inset\",\n pre: \"bg-surface\",\n lineNumber: \"text-text-tertiary\",\n code: \"text-text-primary\",\n },\n muted: {\n root: \"bg-surface-inset\",\n header: \"bg-bg-subtle\",\n pre: \"bg-surface-inset\",\n lineNumber: \"text-text-tertiary\",\n code: \"text-text-primary\",\n },\n dark: {\n root: \"bg-bg-inverse\",\n header: \"bg-bg-inverse text-text-inverse\",\n pre: \"bg-bg-inverse\",\n lineNumber: \"text-text-inverse/60\",\n code: \"text-text-inverse\",\n },\n terminal: {\n root: \"bg-bg-inverse\",\n header: \"bg-bg-inverse text-success-fg\",\n pre: \"bg-bg-inverse\",\n lineNumber: \"text-text-inverse/50\",\n code: \"text-success-fg\",\n },\n};\n\n/** Props for the code snippet viewer component. */\nexport interface CodeSnippetViewerProps {\n code: string;\n language?: string;\n title?: string;\n showLineNumbers?: boolean;\n showCopyButton?: boolean;\n maxHeight?: number;\n syntaxTheme?: CodeSnippetSyntaxTheme;\n className?: string;\n labels?: CodeSnippetViewerLabels;\n}\n\n/** Renders the code snippet viewer component. */\nexport function CodeSnippetViewer({\n code,\n language = \"text\",\n title,\n showLineNumbers = true,\n showCopyButton = true,\n maxHeight = 400,\n syntaxTheme = \"default\",\n className,\n labels: customLabels,\n}: CodeSnippetViewerProps) {\n const labels = { ...defaultLabels, ...customLabels };\n const [copied, setCopied] = React.useState(false);\n\n const lines = code.split(\"\\n\");\n const theme = syntaxThemeClasses[syntaxTheme] ?? syntaxThemeClasses.default;\n const regionLabel = title\n ? `${labels.codeRegion}: ${title}`\n : `${labels.codeRegion}: ${language}`;\n\n const handleCopy = React.useCallback(async () => {\n try {\n await navigator.clipboard.writeText(code);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch {\n // Fallback silently\n }\n }, [code]);\n\n return (\n <div\n className={cn(\n \"border-border overflow-hidden rounded-lg border\",\n theme.root,\n className,\n )}\n data-opt-id=\"9GDXY\"\n data-opt-slug=\"code-snippet-viewer.CodeSnippetViewer\"\n >\n {(title || showCopyButton) && (\n <div\n className={cn(\n \"border-border flex items-center justify-between border-b px-3 py-1.5\",\n theme.header,\n )}\n >\n <span className=\"text-text-tertiary text-xs font-medium\">\n {title ?? language}\n </span>\n {showCopyButton && (\n <button\n onClick={handleCopy}\n className=\"text-text-tertiary hover:text-text-primary text-xs transition-colors\"\n aria-label=\"Copy code\"\n >\n {copied ? labels.copied : labels.copy}\n </button>\n )}\n </div>\n )}\n <div\n className={cn(\"overflow-auto\", OPT_FOCUS_VISIBLE)}\n style={{ maxHeight }}\n tabIndex={0}\n role=\"region\"\n aria-label={regionLabel}\n >\n <pre className={cn(\"p-3 font-mono text-sm\", theme.pre)}>\n <code>\n {lines.map((line, i) => (\n <div key={i} className=\"flex\">\n {showLineNumbers && (\n <span\n className={cn(\n \"min-w-[2.5rem] pr-4 text-right select-none\",\n theme.lineNumber,\n )}\n >\n {i + 1}\n </span>\n )}\n <span className={cn(\"whitespace-pre\", theme.code)}>{line}</span>\n </div>\n ))}\n </code>\n </pre>\n </div>\n </div>\n );\n}\n\nCodeSnippetViewer.displayName = \"CodeSnippetViewer\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../lib/cn\";\nimport { formatOptNumber } from \"../lib/formatters\";\nimport { Input } from \"../core/input\";\n\n/** Defines the property shape. */\nexport interface PropertyDef {\n name: string;\n type: string;\n description?: string;\n exampleValue?: string;\n eventCount?: number;\n}\n\n/** Defines the property group shape. */\nexport interface PropertyGroup {\n name: string;\n properties: PropertyDef[];\n}\n\n/** Localized labels for the property explorer component. */\nexport interface PropertyExplorerLabels {\n searchPlaceholder?: string;\n noPropertiesFound?: string;\n}\n\nconst defaultLabels: Required<PropertyExplorerLabels> = {\n searchPlaceholder: \"Search properties...\",\n noPropertiesFound: \"No properties found\",\n};\n\n/** Props for the property explorer component. */\nexport interface PropertyExplorerProps {\n groups: PropertyGroup[];\n onSelect?: (property: PropertyDef) => void;\n className?: string;\n labels?: PropertyExplorerLabels;\n}\n\n/** Renders the property explorer component. */\nexport function PropertyExplorer({\n groups,\n onSelect,\n className,\n labels: customLabels,\n}: PropertyExplorerProps) {\n const labels = { ...defaultLabels, ...customLabels };\n const [search, setSearch] = React.useState(\"\");\n\n const filtered = React.useMemo(() => {\n if (!search) return groups;\n const q = search.toLowerCase();\n return groups\n .map((g) => ({\n ...g,\n properties: g.properties.filter(\n (p) =>\n p.name.toLowerCase().includes(q) ||\n p.type.toLowerCase().includes(q) ||\n p.description?.toLowerCase().includes(q),\n ),\n }))\n .filter((g) => g.properties.length > 0);\n }, [groups, search]);\n\n return (\n <div\n className={cn(\"gap-element flex flex-col\", className)}\n data-opt-id=\"HJF32\"\n data-opt-slug=\"property-explorer.PropertyExplorer\"\n >\n <Input\n placeholder={labels.searchPlaceholder}\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n aria-label=\"Search properties\"\n />\n <div className=\"gap-group flex max-h-96 flex-col overflow-y-auto\">\n {filtered.map((group) => (\n <div key={group.name}>\n <h4 className=\"text-text-tertiary mb-1.5 text-xs font-semibold tracking-wider uppercase\">\n {group.name}\n </h4>\n <div className=\"gap-element flex flex-col\">\n {group.properties.map((prop) => (\n <button\n key={prop.name}\n onClick={() => onSelect?.(prop)}\n className={cn(\n \"flex w-full items-center justify-between rounded-md px-2.5 py-1.5 text-left\",\n \"hover:bg-bg-subtle transition-colors\",\n )}\n >\n <div className=\"min-w-0\">\n <span className=\"text-text-primary text-sm font-medium\">\n {prop.name}\n </span>\n <span className=\"text-text-tertiary ml-2 font-mono text-xs\">\n {prop.type}\n </span>\n {prop.description && (\n <p className=\"text-text-tertiary truncate text-xs\">\n {prop.description}\n </p>\n )}\n </div>\n {prop.eventCount !== undefined && (\n <span className=\"text-text-tertiary ml-2 shrink-0 text-xs\">\n {formatOptNumber(prop.eventCount)}\n </span>\n )}\n </button>\n ))}\n </div>\n </div>\n ))}\n {filtered.length === 0 && (\n <p className=\"text-text-tertiary py-4 text-center text-sm\">\n {labels.noPropertiesFound}\n </p>\n )}\n </div>\n </div>\n );\n}\n\nPropertyExplorer.displayName = \"PropertyExplorer\";\n","import * as React from \"react\";\nimport { cn } from \"../lib/cn\";\n\n/** Localized labels for the query results table component. */\nexport interface QueryResultsTableLabels {\n emptyMessage?: string;\n loadingMessage?: string;\n rowsSuffix?: string;\n}\n\nconst defaultLabels: Required<QueryResultsTableLabels> = {\n emptyMessage: \"No results\",\n loadingMessage: \"Running query...\",\n rowsSuffix: \"row(s)\",\n};\n\n/** Props for the query results table component. */\nexport interface QueryResultsTableProps {\n columns: string[];\n rows: Array<Record<string, unknown>>;\n maxHeight?: number;\n emptyMessage?: string;\n loading?: boolean;\n error?: string;\n labels?: QueryResultsTableLabels;\n className?: string;\n}\n\n/** Renders the query results table component. */\nexport function QueryResultsTable({\n columns,\n rows,\n maxHeight = 400,\n emptyMessage,\n loading = false,\n error,\n labels: customLabels,\n className,\n}: QueryResultsTableProps) {\n const labels = { ...defaultLabels, ...customLabels };\n if (error) {\n return (\n <div\n className={cn(\n \"border-danger bg-danger-subtle rounded-lg border p-4\",\n className,\n )}\n role=\"alert\"\n aria-live=\"assertive\"\n data-opt-id=\"PNC1V\"\n data-opt-slug=\"query-results-table.QueryResultsTable\"\n >\n <p className=\"text-danger-fg font-mono text-sm\">{error}</p>\n </div>\n );\n }\n\n if (loading) {\n return (\n <div\n className={cn(\n \"border-border rounded-lg border p-8 text-center\",\n className,\n )}\n role=\"status\"\n aria-live=\"polite\"\n aria-busy=\"true\"\n data-opt-id=\"PNC1V\"\n data-opt-slug=\"query-results-table.QueryResultsTable\"\n >\n <div\n className=\"border-border border-t-accent inline-block h-5 w-5 animate-spin rounded-full border-2\"\n aria-hidden=\"true\"\n />\n <p className=\"text-text-tertiary mt-2 text-sm\">\n {labels.loadingMessage}\n </p>\n </div>\n );\n }\n\n if (rows.length === 0) {\n return (\n <div\n className={cn(\n \"border-border rounded-lg border p-8 text-center\",\n className,\n )}\n data-opt-id=\"PNC1V\"\n data-opt-slug=\"query-results-table.QueryResultsTable\"\n >\n <p className=\"text-text-tertiary text-sm\">\n {emptyMessage ?? labels.emptyMessage}\n </p>\n </div>\n );\n }\n\n return (\n <div\n className={cn(\n \"border-border overflow-hidden rounded-lg border\",\n className,\n )}\n data-opt-id=\"PNC1V\"\n data-opt-slug=\"query-results-table.QueryResultsTable\"\n >\n <div className=\"overflow-auto\" style={{ maxHeight }}>\n <table className=\"w-full text-sm\">\n <thead className=\"bg-surface-inset sticky top-0\">\n <tr>\n <th className=\"text-text-tertiary w-10 px-3 py-2 text-left text-xs font-medium\">\n #\n </th>\n {columns.map((col) => (\n <th\n key={col}\n className=\"text-text-tertiary px-3 py-2 text-left text-xs font-medium whitespace-nowrap\"\n >\n {col}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.map((row, ri) => (\n <tr\n key={ri}\n className=\"border-border-subtle hover:bg-bg-subtle border-t\"\n >\n <td className=\"text-text-tertiary px-3 py-1.5 font-mono text-xs\">\n {ri + 1}\n </td>\n {columns.map((col) => (\n <td\n key={col}\n className=\"text-text-primary px-3 py-1.5 font-mono whitespace-nowrap\"\n >\n {String(row[col] ?? \"\")}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n <div className=\"border-border-subtle bg-surface-inset border-t px-3 py-1.5\">\n <span className=\"text-text-tertiary text-xs\">\n {rows.length} {labels.rowsSuffix}\n </span>\n </div>\n </div>\n );\n}\n\nQueryResultsTable.displayName = \"QueryResultsTable\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../lib/cn\";\nimport { Button } from \"../core/button\";\nimport { Input } from \"../core/input\";\n\n/** Defines the alert condition shape. */\nexport interface AlertCondition {\n metric: string;\n operator: \"gt\" | \"lt\" | \"eq\" | \"gte\" | \"lte\";\n threshold: number;\n}\n\n/** Configuration for alert. */\nexport interface AlertConfig {\n name: string;\n conditions: AlertCondition[];\n channels: string[];\n frequency: \"realtime\" | \"hourly\" | \"daily\";\n enabled: boolean;\n}\n\n/** Localized labels for the alert builder component. */\nexport interface AlertBuilderLabels {\n alertNameLabel?: string;\n conditionsLabel?: string;\n metricLabel?: string;\n operatorLabel?: string;\n thresholdLabel?: string;\n removeConditionLabel?: string;\n addConditionButton?: string;\n checkFrequencyLabel?: string;\n notificationChannelsLabel?: string;\n emptyMessage?: string;\n}\n\nconst defaultLabels: Required<AlertBuilderLabels> = {\n alertNameLabel: \"Alert name\",\n conditionsLabel: \"Conditions\",\n metricLabel: \"Metric\",\n operatorLabel: \"Operator\",\n thresholdLabel: \"Threshold\",\n removeConditionLabel: \"Remove condition\",\n addConditionButton: \"+ Add condition\",\n checkFrequencyLabel: \"Check frequency\",\n notificationChannelsLabel: \"Notification channels\",\n emptyMessage: \"Alert builder requires at least one metric and one channel.\",\n};\n\n/** Props for the alert builder component. */\nexport interface AlertBuilderProps {\n value: AlertConfig;\n onChange: (config: AlertConfig) => void;\n metrics?: string[];\n /** Dynamic event options for the metric selector. When provided, overrides `metrics`. */\n eventOptions?: { id: string; name: string }[];\n channels?: { id: string; label: string }[];\n labels?: AlertBuilderLabels;\n className?: string;\n}\n\nconst OPERATORS: { value: AlertCondition[\"operator\"]; label: string }[] = [\n { value: \"gt\", label: \">\" },\n { value: \"gte\", label: \">=\" },\n { value: \"lt\", label: \"<\" },\n { value: \"lte\", label: \"<=\" },\n { value: \"eq\", label: \"=\" },\n];\n\nconst FREQUENCIES: { value: AlertConfig[\"frequency\"]; label: string }[] = [\n { value: \"realtime\", label: \"Real-time\" },\n { value: \"hourly\", label: \"Hourly\" },\n { value: \"daily\", label: \"Daily\" },\n];\n\n/** Renders the alert builder component. */\nexport function AlertBuilder({\n value,\n onChange,\n metrics = [\"page_view\", \"click\", \"conversion\", \"error_rate\", \"latency_p99\"],\n eventOptions,\n channels = [\n { id: \"email\", label: \"Email\" },\n { id: \"slack\", label: \"Slack\" },\n { id: \"webhook\", label: \"Webhook\" },\n ],\n labels: customLabels,\n className,\n}: AlertBuilderProps) {\n const resolvedMetrics = eventOptions\n ? eventOptions.map((e) => e.id)\n : metrics;\n const metricLabelMap = eventOptions\n ? Object.fromEntries(eventOptions.map((e) => [e.id, e.name]))\n : null;\n const labels = { ...defaultLabels, ...customLabels };\n const alertNameId = React.useId();\n const conditionsId = React.useId();\n const checkFrequencyId = React.useId();\n const notificationChannelsId = React.useId();\n const update = (partial: Partial<AlertConfig>) => {\n onChange({ ...value, ...partial });\n };\n\n if (resolvedMetrics.length === 0 || channels.length === 0) {\n return (\n <div\n className={cn(\"text-text-secondary text-sm\", className)}\n data-opt-id=\"VTENR\"\n data-opt-slug=\"alert-builder.AlertBuilder\"\n >\n {labels.emptyMessage}\n </div>\n );\n }\n\n const addCondition = () => {\n update({\n conditions: [\n ...value.conditions,\n { metric: resolvedMetrics[0], operator: \"gt\", threshold: 0 },\n ],\n });\n };\n\n const updateCondition = (index: number, partial: Partial<AlertCondition>) => {\n const next = value.conditions.map((c, i) =>\n i === index ? { ...c, ...partial } : c,\n );\n update({ conditions: next });\n };\n\n const removeCondition = (index: number) => {\n update({ conditions: value.conditions.filter((_, i) => i !== index) });\n };\n\n const toggleChannel = (channelId: string) => {\n const next = value.channels.includes(channelId)\n ? value.channels.filter((c) => c !== channelId)\n : [...value.channels, channelId];\n update({ channels: next });\n };\n\n return (\n <div\n className={cn(\"gap-group flex flex-col\", className)}\n data-opt-id=\"VTENR\"\n data-opt-slug=\"alert-builder.AlertBuilder\"\n >\n {/* Name */}\n <div>\n <label\n htmlFor={alertNameId}\n className=\"text-text-tertiary mb-1 block text-xs font-medium\"\n >\n {labels.alertNameLabel}\n </label>\n <Input\n id={alertNameId}\n value={value.name}\n onChange={(e) => update({ name: e.target.value })}\n placeholder=\"My alert\"\n />\n </div>\n\n {/* Conditions */}\n <div>\n <span\n id={conditionsId}\n className=\"text-text-tertiary mb-1 block text-xs font-medium\"\n >\n {labels.conditionsLabel}\n </span>\n <div\n className=\"gap-element flex flex-col\"\n role=\"group\"\n aria-labelledby={conditionsId}\n >\n {value.conditions.map((cond, i) => (\n <div key={i} className=\"gap-element flex items-center\">\n <select\n value={cond.metric}\n onChange={(e) => updateCondition(i, { metric: e.target.value })}\n className=\"border-border text-text-primary rounded-md border bg-transparent px-2 py-1.5 text-sm\"\n aria-label={`${labels.metricLabel} ${i + 1}`}\n >\n {resolvedMetrics.map((m) => (\n <option key={m} value={m}>\n {metricLabelMap ? (metricLabelMap[m] ?? m) : m}\n </option>\n ))}\n </select>\n <select\n value={cond.operator}\n onChange={(e) => {\n const v = e.target.value;\n if ([\"gt\", \"lt\", \"eq\", \"gte\", \"lte\"].includes(v))\n updateCondition(i, {\n operator: v as AlertCondition[\"operator\"],\n });\n }}\n className=\"border-border text-text-primary w-14 rounded-md border bg-transparent px-2 py-1.5 text-center text-sm\"\n aria-label={`${labels.operatorLabel} ${i + 1}`}\n >\n {OPERATORS.map((op) => (\n <option key={op.value} value={op.value}>\n {op.label}\n </option>\n ))}\n </select>\n <Input\n type=\"number\"\n value={cond.threshold}\n onChange={(e) =>\n updateCondition(i, {\n threshold: Number(e.target.value),\n })\n }\n aria-label={`${labels.thresholdLabel} ${i + 1}`}\n className=\"w-24\"\n />\n <button\n type=\"button\"\n onClick={() => removeCondition(i)}\n className=\"text-text-tertiary hover:text-danger focus-visible:ring-accent rounded text-sm focus-visible:ring-2 focus-visible:outline-none\"\n aria-label={`${labels.removeConditionLabel} ${i + 1}`}\n >\n ✕\n </button>\n </div>\n ))}\n </div>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={addCondition}\n className=\"mt-1.5\"\n >\n {labels.addConditionButton}\n </Button>\n </div>\n\n {/* Frequency */}\n <div>\n <span\n id={checkFrequencyId}\n className=\"text-text-tertiary mb-1 block text-xs font-medium\"\n >\n {labels.checkFrequencyLabel}\n </span>\n <div\n className=\"gap-element flex\"\n role=\"group\"\n aria-labelledby={checkFrequencyId}\n >\n {FREQUENCIES.map((f) => (\n <button\n type=\"button\"\n key={f.value}\n onClick={() => update({ frequency: f.value })}\n aria-pressed={value.frequency === f.value}\n className={cn(\n \"focus-visible:ring-accent rounded-md px-3 py-1.5 text-sm transition-colors focus-visible:ring-2 focus-visible:outline-none\",\n value.frequency === f.value\n ? \"bg-accent text-accent-fg\"\n : \"bg-bg-subtle text-text-secondary hover:bg-bg-muted\",\n )}\n >\n {f.label}\n </button>\n ))}\n </div>\n </div>\n\n {/* Channels */}\n <div>\n <span\n id={notificationChannelsId}\n className=\"text-text-tertiary mb-1 block text-xs font-medium\"\n >\n {labels.notificationChannelsLabel}\n </span>\n <div\n className=\"gap-element flex\"\n role=\"group\"\n aria-labelledby={notificationChannelsId}\n >\n {channels.map((ch) => (\n <button\n type=\"button\"\n key={ch.id}\n onClick={() => toggleChannel(ch.id)}\n aria-pressed={value.channels.includes(ch.id)}\n className={cn(\n \"focus-visible:ring-accent rounded-md px-3 py-1.5 text-sm transition-colors focus-visible:ring-2 focus-visible:outline-none\",\n value.channels.includes(ch.id)\n ? \"bg-accent text-accent-fg\"\n : \"bg-bg-subtle text-text-secondary hover:bg-bg-muted\",\n )}\n >\n {ch.label}\n </button>\n ))}\n </div>\n </div>\n </div>\n );\n}\n\nAlertBuilder.displayName = \"AlertBuilder\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../lib/cn\";\nimport { Button } from \"../core/button\";\n\n/** CodeMirror 확장. `@codemirror/state`의 `Extension`. */\nexport type SqlEditorExtension = import(\"@codemirror/state\").Extension;\n\n/** CodeMirror 키 바인딩. `@codemirror/view`의 `KeyBinding`. */\nexport type SqlEditorKeyBinding = import(\"@codemirror/view\").KeyBinding;\n\n/**\n * 자동완성 스키마. `@codemirror/lang-sql`의 `SQLNamespace` —\n * `{ table: [\"col\", ...] }` 형태로 테이블/컬럼을 알려준다.\n */\nexport type SqlEditorSchema = import(\"@codemirror/lang-sql\").SQLNamespace;\n\n/** 추가 자동완성 소스. `@codemirror/autocomplete`의 `CompletionSource`. */\nexport type SqlEditorCompletionSource =\n import(\"@codemirror/autocomplete\").CompletionSource;\n\n/** Localized labels for the sql editor component. */\nexport interface SqlEditorLabels {\n placeholder?: string;\n runHint?: string;\n runButton?: string;\n editor?: string;\n}\n\nconst defaultLabels: Required<SqlEditorLabels> = {\n placeholder: \"SELECT * FROM events LIMIT 100\",\n runHint: \"Ctrl+Enter to run\",\n runButton: \"Run Query\",\n editor: \"SQL 편집기\",\n};\n\n/** Props for the sql editor component. */\nexport interface SqlEditorProps {\n value: string;\n onChange: (sql: string) => void;\n /** Mod+Enter. */\n onRun?: (sql: string) => void;\n /** Shift+Enter — 실행 후 다음 셀/탭으로 넘어가는 노트북형 흐름. */\n onRunAndAdvance?: (sql: string) => void;\n placeholder?: string;\n readOnly?: boolean;\n /** px 고정 높이. `\"fill\"`이면 부모가 정한 높이를 채운다. */\n height?: number | \"fill\";\n /**\n * 테이블/컬럼 자동완성 스키마. 값이 바뀌면 에디터를 다시 만들지 않고\n * 자동완성만 재구성하므로, 카탈로그가 자주 갱신되는 화면에서도 커서와\n * 실행 취소 이력이 유지된다.\n */\n schema?: SqlEditorSchema;\n /** 스키마 자동완성에 더해 붙일 완성 소스 (함수 시그니처, 스니펫 등). */\n completionSources?: SqlEditorCompletionSource[];\n /** 추가 키 바인딩. 내장 실행 바인딩보다 먼저 평가된다. */\n keymap?: SqlEditorKeyBinding[];\n /** 임의의 CodeMirror 확장. 내장 확장 뒤에 붙어 우선권을 갖는다. */\n extensions?: SqlEditorExtension[];\n /** 편집 영역의 접근성 레이블. */\n ariaLabel?: string;\n autoFocus?: boolean;\n /**\n * 실행 힌트와 Run 버튼 표시 여부. 기본값은 `onRun`이 있을 때 표시.\n * 자체 툴바를 쓰는 화면에서 `false`로 끈다.\n */\n showFooter?: boolean;\n labels?: SqlEditorLabels;\n className?: string;\n}\n\n/** Renders the sql editor component. */\nexport function SqlEditor({\n value,\n onChange,\n onRun,\n onRunAndAdvance,\n placeholder,\n readOnly = false,\n height = 200,\n schema,\n completionSources,\n keymap: customKeymap,\n extensions: customExtensions,\n ariaLabel,\n autoFocus = false,\n showFooter,\n labels: customLabels,\n className,\n}: SqlEditorProps) {\n const labels = { ...defaultLabels, ...customLabels };\n const fill = height === \"fill\";\n const footerVisible = showFooter ?? Boolean(onRun);\n\n const editorRef = React.useRef<HTMLDivElement>(null);\n const viewRef = React.useRef<import(\"@codemirror/view\").EditorView | null>(\n null,\n );\n const completionCompartmentRef = React.useRef<\n import(\"@codemirror/state\").Compartment | null\n >(null);\n const editableCompartmentRef = React.useRef<\n import(\"@codemirror/state\").Compartment | null\n >(null);\n const buildCompletionRef = React.useRef<\n | ((\n schema: SqlEditorSchema | undefined,\n sources: SqlEditorCompletionSource[] | undefined,\n ) => SqlEditorExtension)\n | null\n >(null);\n\n const latestValueRef = React.useRef(value);\n const onChangeRef = React.useRef(onChange);\n const onRunRef = React.useRef(onRun);\n const onRunAndAdvanceRef = React.useRef(onRunAndAdvance);\n const customKeymapRef = React.useRef(customKeymap);\n const schemaRef = React.useRef(schema);\n const completionSourcesRef = React.useRef(completionSources);\n const autoFocusRef = React.useRef(autoFocus);\n latestValueRef.current = value;\n onChangeRef.current = onChange;\n onRunRef.current = onRun;\n onRunAndAdvanceRef.current = onRunAndAdvance;\n customKeymapRef.current = customKeymap;\n schemaRef.current = schema;\n completionSourcesRef.current = completionSources;\n autoFocusRef.current = autoFocus;\n\n // 자동완성 모듈은 실제로 필요할 때만 불러온다. 첫 렌더 기준으로 결정하므로\n // 스키마를 나중에 채우는 화면은 `schema={{}}`처럼 빈 값이라도 넘겨 둔다.\n const autocompleteEnabled = React.useRef(\n schema !== undefined || completionSources !== undefined,\n ).current;\n\n React.useEffect(() => {\n let view: import(\"@codemirror/view\").EditorView | null = null;\n let cancelled = false;\n\n async function init() {\n const parent = editorRef.current;\n if (!parent) return;\n\n const [\n { EditorView, keymap: cmKeymap, placeholder: cmPlaceholder },\n { Compartment, EditorState },\n langSql,\n { oneDark },\n autocomplete,\n ] = await Promise.all([\n import(\"@codemirror/view\"),\n import(\"@codemirror/state\"),\n import(\"@codemirror/lang-sql\"),\n import(\"@codemirror/theme-one-dark\"),\n autocompleteEnabled\n ? import(\"@codemirror/autocomplete\")\n : Promise.resolve(null),\n ]);\n if (cancelled || !parent.isConnected) return;\n\n const completionCompartment = new Compartment();\n const editableCompartment = new Compartment();\n completionCompartmentRef.current = completionCompartment;\n editableCompartmentRef.current = editableCompartment;\n\n const buildCompletion = (\n nextSchema: SqlEditorSchema | undefined,\n nextSources: SqlEditorCompletionSource[] | undefined,\n ): SqlEditorExtension => {\n if (!autocomplete) return [];\n const dialect = langSql.PostgreSQL;\n const parts: SqlEditorExtension[] = [\n autocomplete.autocompletion({\n override: [\n langSql.schemaCompletionSource({\n dialect,\n schema: nextSchema ?? {},\n }),\n langSql.keywordCompletionSource(dialect),\n ...(nextSources ?? []),\n ],\n }),\n cmKeymap.of(autocomplete.completionKeymap),\n ];\n return parts;\n };\n buildCompletionRef.current = buildCompletion;\n\n const runKeymap: SqlEditorKeyBinding[] = [\n {\n key: \"Shift-Enter\",\n run: (target) => {\n const handler = onRunAndAdvanceRef.current;\n if (!handler) return false;\n handler(target.state.doc.toString());\n return true;\n },\n },\n {\n key: \"Mod-Enter\",\n run: (target) => {\n const handler = onRunRef.current;\n if (!handler) return false;\n handler(target.state.doc.toString());\n return true;\n },\n },\n ];\n\n const extensions: SqlEditorExtension[] = [\n langSql.PostgreSQL.extension,\n completionCompartment.of(\n buildCompletion(schemaRef.current, completionSourcesRef.current),\n ),\n oneDark,\n cmKeymap.of([...(customKeymapRef.current ?? []), ...runKeymap]),\n EditorView.theme({\n \"&\": { height: \"100%\" },\n \"&.cm-focused\": {\n outline: \"2px solid var(--opt-ring)\",\n outlineOffset: \"-2px\",\n },\n \".cm-scroller\": { height: \"100%\", overflow: \"auto\" },\n }),\n cmPlaceholder(placeholder ?? labels.placeholder),\n EditorView.lineWrapping,\n EditorView.updateListener.of((update) => {\n if (update.docChanged) {\n onChangeRef.current(update.state.doc.toString());\n }\n }),\n editableCompartment.of(EditorView.editable.of(!readOnly)),\n EditorView.contentAttributes.of({\n \"aria-label\": ariaLabel ?? labels.editor,\n }),\n ...(customExtensions ?? []),\n ];\n\n view = new EditorView({\n state: EditorState.create({\n doc: latestValueRef.current,\n extensions,\n }),\n parent,\n });\n\n viewRef.current = view;\n if (autoFocusRef.current) view.focus();\n }\n\n void init();\n\n return () => {\n cancelled = true;\n view?.destroy();\n if (viewRef.current === view) {\n viewRef.current = null;\n }\n completionCompartmentRef.current = null;\n editableCompartmentRef.current = null;\n buildCompletionRef.current = null;\n };\n // 에디터는 한 번만 만든다. 재초기화하면 커서와 실행 취소 이력이 날아가므로\n // 이후 prop 변경은 아래 compartment effect들이 반영한다.\n }, []);\n\n // Sync external value changes\n React.useEffect(() => {\n const view = viewRef.current;\n if (view && view.state.doc.toString() !== value) {\n view.dispatch({\n changes: {\n from: 0,\n to: view.state.doc.length,\n insert: value,\n },\n });\n }\n }, [value]);\n\n // 스키마/완성 소스 변경 — 에디터를 다시 만들지 않고 자동완성만 재구성한다.\n React.useEffect(() => {\n const view = viewRef.current;\n const compartment = completionCompartmentRef.current;\n const build = buildCompletionRef.current;\n if (!view || !compartment || !build) return;\n view.dispatch({\n effects: compartment.reconfigure(build(schema, completionSources)),\n });\n }, [schema, completionSources]);\n\n // readOnly 변경 반영.\n React.useEffect(() => {\n const view = viewRef.current;\n const compartment = editableCompartmentRef.current;\n if (!view || !compartment) return;\n let cancelled = false;\n void import(\"@codemirror/view\").then(({ EditorView }) => {\n if (cancelled || viewRef.current !== view) return;\n view.dispatch({\n effects: compartment.reconfigure(EditorView.editable.of(!readOnly)),\n });\n });\n return () => {\n cancelled = true;\n };\n }, [readOnly]);\n\n return (\n <div\n className={cn(\n \"gap-element flex flex-col\",\n fill && \"h-full min-h-0\",\n className,\n )}\n data-opt-id=\"RSGKV\"\n data-opt-slug=\"sql-editor.SqlEditor\"\n >\n <div\n ref={editorRef}\n className={cn(\n \"border-border overflow-hidden rounded-lg border\",\n fill && \"min-h-0 flex-1\",\n )}\n style={fill ? undefined : { height }}\n />\n {footerVisible && (\n <div className=\"flex flex-none items-center justify-between\">\n <span className=\"text-text-tertiary text-xs\">{labels.runHint}</span>\n {onRun && (\n <Button variant=\"primary\" size=\"sm\" onClick={() => onRun(value)}>\n {labels.runButton}\n </Button>\n )}\n </div>\n )}\n </div>\n );\n}\n\nSqlEditor.displayName = \"SqlEditor\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../lib/cn\";\nimport { Input } from \"../core/input\";\nimport { IconPicker, type IconDef } from \"../core/icon-picker\";\nimport { ColorPicker } from \"../core/color-picker\";\nimport { TagInput } from \"../core/tag-input\";\nimport { EventIcon } from \"./event-icon\";\n\n/** Defines the event meta shape. */\nexport interface EventMeta {\n name: string;\n displayName: string;\n icon: string;\n color: string;\n tags: string[];\n description: string;\n}\n\n/** Props for the event meta editor component. */\nexport interface EventMetaEditorProps {\n value: EventMeta;\n onChange: (meta: EventMeta) => void;\n icons?: IconDef[];\n className?: string;\n labels?: EventMetaEditorLabels;\n}\n\n/** Localized labels for the event meta editor component. */\nexport interface EventMetaEditorLabels {\n icon?: string;\n color?: string;\n name?: string;\n displayName?: string;\n description?: string;\n tags?: string;\n namePlaceholder?: string;\n displayNamePlaceholder?: string;\n descriptionPlaceholder?: string;\n tagsPlaceholder?: string;\n emptyTagsMessage?: string;\n}\n\nconst defaultLabels: Required<EventMetaEditorLabels> = {\n icon: \"Icon\",\n color: \"Color\",\n name: \"Event name\",\n displayName: \"Display name\",\n description: \"Description\",\n tags: \"Tags\",\n namePlaceholder: \"page_view\",\n displayNamePlaceholder: \"Page View\",\n descriptionPlaceholder: \"Triggered when a user views a page\",\n tagsPlaceholder: \"Add tag...\",\n emptyTagsMessage: \"No tags added yet.\",\n};\n\n/** Renders the event meta editor component. */\nexport function EventMetaEditor({\n value,\n onChange,\n icons,\n className,\n labels: customLabels,\n}: EventMetaEditorProps) {\n const labels = { ...defaultLabels, ...customLabels };\n const hasTags = value.tags.length > 0;\n const nameId = React.useId();\n const displayNameId = React.useId();\n const descriptionId = React.useId();\n const tagsId = React.useId();\n const update = (partial: Partial<EventMeta>) => {\n onChange({ ...value, ...partial });\n };\n\n return (\n <div\n className={cn(\"gap-group flex flex-col\", className)}\n data-opt-id=\"EZR35\"\n data-opt-slug=\"event-meta-editor.EventMetaEditor\"\n >\n {/* Icon + Color row */}\n <div className=\"gap-group flex items-start\">\n <div>\n <span className=\"text-text-tertiary mb-1 block text-xs font-medium\">\n {labels.icon}\n </span>\n <IconPicker\n value={value.icon}\n onChange={(icon) => update({ icon })}\n icons={icons}\n aria-label={labels.icon}\n />\n </div>\n <div>\n <span className=\"text-text-tertiary mb-1 block text-xs font-medium\">\n {labels.color}\n </span>\n <ColorPicker\n value={value.color}\n onChange={(color) => update({ color })}\n aria-label={labels.color}\n />\n </div>\n {/* Preview */}\n <div className=\"flex flex-1 items-center justify-center\">\n <EventIcon icon={value.icon} color={value.color} size=\"lg\" />\n </div>\n </div>\n\n {/* Name fields */}\n <div className=\"gap-group grid grid-cols-2\">\n <div>\n <label\n htmlFor={nameId}\n className=\"text-text-tertiary mb-1 block text-xs font-medium\"\n >\n {labels.name}\n </label>\n <Input\n id={nameId}\n value={value.name}\n onChange={(e) => update({ name: e.target.value })}\n placeholder={labels.namePlaceholder}\n className=\"font-mono\"\n />\n </div>\n <div>\n <label\n htmlFor={displayNameId}\n className=\"text-text-tertiary mb-1 block text-xs font-medium\"\n >\n {labels.displayName}\n </label>\n <Input\n id={displayNameId}\n value={value.displayName}\n onChange={(e) => update({ displayName: e.target.value })}\n placeholder={labels.displayNamePlaceholder}\n />\n </div>\n </div>\n\n {/* Description */}\n <div>\n <label\n htmlFor={descriptionId}\n className=\"text-text-tertiary mb-1 block text-xs font-medium\"\n >\n {labels.description}\n </label>\n <Input\n id={descriptionId}\n value={value.description}\n onChange={(e) => update({ description: e.target.value })}\n placeholder={labels.descriptionPlaceholder}\n />\n </div>\n\n {/* Tags */}\n <div>\n <span className=\"text-text-tertiary mb-1 block text-xs font-medium\">\n {labels.tags}\n </span>\n <TagInput\n id={tagsId}\n value={value.tags}\n onChange={(tags) => update({ tags })}\n placeholder={labels.tagsPlaceholder}\n aria-label={labels.tags}\n />\n {!hasTags && (\n <span className=\"text-text-tertiary mt-1 block text-xs\">\n {labels.emptyTagsMessage}\n </span>\n )}\n </div>\n </div>\n );\n}\n\nEventMetaEditor.displayName = \"EventMetaEditor\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../lib/cn\";\n\n/** Defines the widget shape. */\nexport interface WidgetDef {\n id: string;\n x: number;\n y: number;\n w: number;\n h: number;\n minW?: number;\n minH?: number;\n content: React.ReactNode;\n}\n\n/** Props for the widget grid component. */\nexport interface WidgetGridProps {\n widgets: WidgetDef[];\n cols?: number;\n rowHeight?: number;\n gap?: number;\n onLayoutChange?: (\n layout: Array<{ id: string; x: number; y: number; w: number; h: number }>,\n ) => void;\n /** Enable drag-to-reorder */\n editable?: boolean;\n /** Called when a widget is dragged to a new position */\n onReorder?: (widgetId: string, fromIndex: number, toIndex: number) => void;\n labels?: WidgetGridLabels;\n className?: string;\n}\n\n/** Localized labels for the widget grid component. */\nexport interface WidgetGridLabels {\n emptyMessage?: string;\n}\n\nconst defaultLabels: Required<WidgetGridLabels> = {\n emptyMessage: \"No widgets to display\",\n};\n\n/** Renders the widget grid component. */\nexport function WidgetGrid({\n widgets,\n cols = 12,\n rowHeight = 80,\n gap = 16,\n editable = false,\n onReorder,\n labels: customLabels,\n className,\n}: WidgetGridProps) {\n const labels = { ...defaultLabels, ...customLabels };\n const [dragIdx, setDragIdx] = React.useState<number | null>(null);\n const [overIdx, setOverIdx] = React.useState<number | null>(null);\n\n if (widgets.length === 0) {\n return (\n <div\n className={cn(\"text-text-secondary text-sm\", className)}\n data-opt-id=\"QJY9W\"\n data-opt-slug=\"widget-grid.WidgetGrid\"\n >\n {labels.emptyMessage}\n </div>\n );\n }\n\n return (\n <div\n className={cn(\"grid\", className)}\n style={{\n gridTemplateColumns: `repeat(${cols}, 1fr)`,\n gap,\n }}\n data-opt-id=\"QJY9W\"\n data-opt-slug=\"widget-grid.WidgetGrid\"\n >\n {widgets.map((w, i) => (\n <div\n key={w.id}\n draggable={editable}\n onDragStart={editable ? () => setDragIdx(i) : undefined}\n onDragOver={\n editable\n ? (e) => {\n e.preventDefault();\n setOverIdx(i);\n }\n : undefined\n }\n onDrop={\n editable\n ? () => {\n if (dragIdx !== null && dragIdx !== i && onReorder) {\n onReorder(widgets[dragIdx].id, dragIdx, i);\n }\n setDragIdx(null);\n setOverIdx(null);\n }\n : undefined\n }\n onDragEnd={\n editable\n ? () => {\n setDragIdx(null);\n setOverIdx(null);\n }\n : undefined\n }\n className={cn(\n \"overflow-hidden rounded-lg\",\n editable && \"cursor-grab\",\n editable && dragIdx === i && \"opacity-50\",\n editable && overIdx === i && dragIdx !== i && \"ring-accent ring-2\",\n )}\n style={{\n gridColumn: `span ${Math.min(w.w, cols)}`,\n minHeight: w.h * rowHeight,\n }}\n >\n {w.content}\n </div>\n ))}\n </div>\n );\n}\n\nWidgetGrid.displayName = \"WidgetGrid\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../lib/cn\";\nimport { Button } from \"../core/button\";\nimport { Input } from \"../core/input\";\nimport { OPT_FOCUS_VISIBLE } from \"../lib/styles\";\n\n// ── Types ──\n\n/** Type definition for report builder chart type. */\nexport type ReportBuilderChartType =\n | \"line\"\n | \"bar\"\n | \"pie\"\n | \"gauge\"\n | \"scatter\"\n | \"number\"\n | \"table\"\n | \"funnel\"\n | \"retention\";\n\n/** Defines the chart type shape. */\nexport interface ChartTypeDef {\n type: ReportBuilderChartType;\n label: string;\n icon: string;\n}\n\n/** Type definition for report builder step. */\nexport type ReportBuilderStep = \"type\" | \"config\" | \"style\" | \"preview\";\n\n/** Defines the data source shape. */\nexport interface DataSourceDef {\n id: string;\n label: string;\n description?: string;\n}\n\n/** Localized labels for the report builder component. */\nexport interface ReportBuilderLabels {\n /** Stepper label */\n stepsLabel?: string;\n /** Step labels */\n stepType?: string;\n stepConfig?: string;\n stepStyle?: string;\n stepPreview?: string;\n /** Button labels */\n nextButton?: string;\n backButton?: string;\n saveButton?: string;\n cancelButton?: string;\n /** Field labels */\n reportNameLabel?: string;\n reportNamePlaceholder?: string;\n reportDescriptionLabel?: string;\n reportDescriptionPlaceholder?: string;\n dataSourceLabel?: string;\n dataSourcePlaceholder?: string;\n chartTypeHeading?: string;\n /** Empty state */\n noPreview?: string;\n noConfigForm?: string;\n noStyleForm?: string;\n}\n\nconst defaultLabels: Required<ReportBuilderLabels> = {\n stepsLabel: \"Report steps\",\n stepType: \"Chart Type\",\n stepConfig: \"Data Config\",\n stepStyle: \"Style\",\n stepPreview: \"Preview\",\n nextButton: \"Next\",\n backButton: \"Back\",\n saveButton: \"Save Report\",\n cancelButton: \"Cancel\",\n reportNameLabel: \"Report Name\",\n reportNamePlaceholder: \"Untitled Report\",\n reportDescriptionLabel: \"Description\",\n reportDescriptionPlaceholder: \"Optional description\",\n dataSourceLabel: \"Data Source\",\n dataSourcePlaceholder: \"Select a data source…\",\n chartTypeHeading: \"Select Chart Type\",\n noPreview: \"No preview available\",\n noConfigForm: \"No configuration form provided\",\n noStyleForm: \"No style form provided\",\n};\n\nconst DEFAULT_CHART_TYPES: ChartTypeDef[] = [\n { type: \"line\", label: \"Line Chart\", icon: \"\\u2014\" },\n { type: \"bar\", label: \"Bar Chart\", icon: \"\\u2593\" },\n { type: \"pie\", label: \"Pie Chart\", icon: \"\\u25CB\" },\n { type: \"gauge\", label: \"Gauge\", icon: \"\\u25D4\" },\n { type: \"scatter\", label: \"Scatter\", icon: \"\\u2022\" },\n { type: \"number\", label: \"Number\", icon: \"#\" },\n { type: \"table\", label: \"Table\", icon: \"\\u2261\" },\n { type: \"funnel\", label: \"Funnel\", icon: \"\\u25BD\" },\n { type: \"retention\", label: \"Retention\", icon: \"\\u25A6\" },\n];\n\nconst STEPS: ReportBuilderStep[] = [\"type\", \"config\", \"style\", \"preview\"];\n\n// ── Props ──\n\n/**\n * 4-step wizard for building custom reports:\n * 1. **Type** — Select chart type from a grid of options\n * 2. **Config** — Configure data source and chart-specific fields (slot: `configForm`)\n * 3. **Style** — Adjust visual styling (slot: `styleForm`)\n * 4. **Preview** — Live preview of the report (slot: `preview`)\n *\n * Steps 2-4 accept ReactNode slots so the parent can inject domain-specific forms.\n */\nexport interface ReportBuilderProps {\n /** Available chart types. Defaults to the built-in 9 types. */\n chartTypes?: ChartTypeDef[];\n /** Available data sources. */\n dataSources?: DataSourceDef[];\n /** Called when the user saves the report. */\n onSave?: (report: {\n name: string;\n description: string;\n chartType: ReportBuilderChartType;\n dataSourceId: string;\n }) => void;\n /** Called when the user cancels. */\n onCancel?: () => void;\n /** ReactNode slot for chart-specific data configuration (step 2). */\n configForm?: React.ReactNode;\n /** ReactNode slot for chart-specific style configuration (step 3). */\n styleForm?: React.ReactNode;\n /** ReactNode slot for the live chart preview (step 4). */\n preview?: React.ReactNode;\n /** Called when the selected chart type changes. */\n onChartTypeChange?: (type: ReportBuilderChartType) => void;\n /** Called when the selected data source changes. */\n onDataSourceChange?: (dataSourceId: string) => void;\n /** Called when the current step changes. */\n onStepChange?: (step: ReportBuilderStep) => void;\n /** Externally controlled chart type selection. */\n selectedChartType?: ReportBuilderChartType;\n /** Externally controlled data source. */\n selectedDataSource?: string;\n /** Label overrides. */\n labels?: ReportBuilderLabels;\n /** Additional CSS classes. */\n className?: string;\n}\n\n// ── Component ──\n\n/** Renders the report builder component. */\nexport function ReportBuilder({\n chartTypes = DEFAULT_CHART_TYPES,\n dataSources = [],\n onSave,\n onCancel,\n configForm,\n styleForm,\n preview,\n onChartTypeChange,\n onDataSourceChange,\n onStepChange,\n selectedChartType: controlledChartType,\n selectedDataSource: controlledDataSource,\n labels: customLabels,\n className,\n}: ReportBuilderProps) {\n const labels = { ...defaultLabels, ...customLabels };\n\n // ── State ──\n const [stepIndex, setStepIndex] = React.useState(0);\n const [internalChartType, setInternalChartType] =\n React.useState<ReportBuilderChartType | null>(null);\n const [internalDataSource, setInternalDataSource] = React.useState(\"\");\n const [reportName, setReportName] = React.useState(\"\");\n const [reportDescription, setReportDescription] = React.useState(\"\");\n const reportNameId = React.useId();\n const reportDescriptionId = React.useId();\n const dataSourceSelectId = React.useId();\n\n const chartType = controlledChartType ?? internalChartType;\n const dataSourceId = controlledDataSource ?? internalDataSource;\n const currentStep = STEPS[stepIndex];\n\n const stepLabels: Record<ReportBuilderStep, string> = {\n type: labels.stepType,\n config: labels.stepConfig,\n style: labels.stepStyle,\n preview: labels.stepPreview,\n };\n\n // ── Navigation ──\n const canGoNext = (): boolean => {\n if (currentStep === \"type\") return chartType !== null;\n if (currentStep === \"config\") return true;\n if (currentStep === \"style\") return true;\n return false;\n };\n\n const goNext = () => {\n if (stepIndex < STEPS.length - 1) {\n const next = stepIndex + 1;\n setStepIndex(next);\n onStepChange?.(STEPS[next]);\n }\n };\n\n const goBack = () => {\n if (stepIndex > 0) {\n const prev = stepIndex - 1;\n setStepIndex(prev);\n onStepChange?.(STEPS[prev]);\n }\n };\n\n const handleChartTypeSelect = (type: ReportBuilderChartType) => {\n setInternalChartType(type);\n onChartTypeChange?.(type);\n };\n\n const handleDataSourceChange = (id: string) => {\n setInternalDataSource(id);\n onDataSourceChange?.(id);\n };\n\n const handleSave = () => {\n if (!chartType) return;\n onSave?.({\n name: reportName || labels.reportNamePlaceholder,\n description: reportDescription,\n chartType,\n dataSourceId,\n });\n };\n\n return (\n <div\n className={cn(\"gap-group flex flex-col\", className)}\n data-opt-id=\"K9STD\"\n data-opt-slug=\"report-builder.ReportBuilder\"\n >\n {/* ── Step Indicator ── */}\n <ol\n className=\"gap-element flex list-none items-center p-0\"\n aria-label={labels.stepsLabel}\n >\n {STEPS.map((step, i) => (\n <li\n key={step}\n className=\"gap-element flex flex-1 items-center\"\n aria-current={i === stepIndex ? \"step\" : undefined}\n >\n <div\n aria-hidden=\"true\"\n className={cn(\n \"flex h-8 w-8 shrink-0 items-center justify-center rounded-full text-xs font-medium\",\n i <= stepIndex\n ? \"bg-accent text-accent-fg\"\n : \"bg-bg-subtle text-text-secondary\",\n )}\n >\n {i + 1}\n </div>\n <span\n className={cn(\n \"hidden text-sm sm:inline\",\n i <= stepIndex\n ? \"text-text-primary font-medium\"\n : \"text-text-secondary\",\n )}\n >\n {stepLabels[step]}\n </span>\n {i < STEPS.length - 1 && (\n <div\n aria-hidden=\"true\"\n className={cn(\n \"h-px flex-1\",\n i < stepIndex ? \"bg-accent\" : \"bg-border-subtle\",\n )}\n />\n )}\n </li>\n ))}\n </ol>\n\n {/* ── Report name + description (always visible) ── */}\n <div className=\"gap-element flex flex-col sm:flex-row sm:items-end\">\n <div className=\"gap-element flex flex-1 flex-col\">\n <label\n htmlFor={reportNameId}\n className=\"text-text-tertiary text-xs font-medium\"\n >\n {labels.reportNameLabel}\n </label>\n <Input\n id={reportNameId}\n value={reportName}\n onChange={(e) => setReportName(e.target.value)}\n placeholder={labels.reportNamePlaceholder}\n />\n </div>\n <div className=\"gap-element flex flex-1 flex-col\">\n <label\n htmlFor={reportDescriptionId}\n className=\"text-text-tertiary text-xs font-medium\"\n >\n {labels.reportDescriptionLabel}\n </label>\n <Input\n id={reportDescriptionId}\n value={reportDescription}\n onChange={(e) => setReportDescription(e.target.value)}\n placeholder={labels.reportDescriptionPlaceholder}\n />\n </div>\n </div>\n\n {/* ── Step Content ── */}\n <div className=\"border-border bg-surface min-h-[320px] rounded-xl border p-4\">\n {/* Step 1: Chart Type Selection */}\n {currentStep === \"type\" && (\n <div className=\"gap-group flex flex-col\">\n <h3 className=\"text-text-tertiary text-xs font-semibold tracking-wider uppercase\">\n {labels.chartTypeHeading}\n </h3>\n <div className=\"gap-element grid grid-cols-3 sm:grid-cols-5\">\n {chartTypes.map((ct) => (\n <button\n key={ct.type}\n type=\"button\"\n onClick={() => handleChartTypeSelect(ct.type)}\n className={cn(\n \"flex cursor-pointer flex-col items-center justify-center gap-1 rounded-lg border p-3 text-center transition-colors\",\n \"focus-visible:ring-ring focus-visible:ring-2 focus-visible:outline-none\",\n chartType === ct.type\n ? \"border-accent bg-accent-subtle\"\n : \"border-border hover:bg-bg-subtle\",\n )}\n aria-pressed={chartType === ct.type}\n >\n <span className=\"text-xl leading-none\" aria-hidden=\"true\">\n {ct.icon}\n </span>\n <span\n className={cn(\n \"text-xs leading-tight\",\n chartType === ct.type\n ? \"text-accent font-medium\"\n : \"text-text-tertiary\",\n )}\n >\n {ct.label}\n </span>\n </button>\n ))}\n </div>\n\n {/* Data source selection */}\n {dataSources.length > 0 && (\n <div className=\"gap-element flex flex-col\">\n <label\n htmlFor={dataSourceSelectId}\n className=\"text-text-tertiary text-xs font-medium\"\n >\n {labels.dataSourceLabel}\n </label>\n <select\n id={dataSourceSelectId}\n value={dataSourceId}\n onChange={(e) => handleDataSourceChange(e.target.value)}\n className={cn(\n \"border-border text-text-primary bg-surface w-full rounded-lg border px-3 py-2 text-sm\",\n OPT_FOCUS_VISIBLE,\n )}\n >\n <option value=\"\">{labels.dataSourcePlaceholder}</option>\n {dataSources.map((ds) => (\n <option key={ds.id} value={ds.id}>\n {ds.label}\n </option>\n ))}\n </select>\n </div>\n )}\n </div>\n )}\n\n {/* Step 2: Data Configuration (delegated) */}\n {currentStep === \"config\" && (\n <div className=\"gap-group flex flex-col\">\n {configForm ?? (\n <div className=\"text-text-tertiary border-border flex h-48 items-center justify-center rounded-lg border border-dashed text-sm\">\n {labels.noConfigForm}\n </div>\n )}\n </div>\n )}\n\n {/* Step 3: Style Configuration (delegated) */}\n {currentStep === \"style\" && (\n <div className=\"gap-group flex flex-col\">\n {styleForm ?? (\n <div className=\"text-text-tertiary border-border flex h-48 items-center justify-center rounded-lg border border-dashed text-sm\">\n {labels.noStyleForm}\n </div>\n )}\n </div>\n )}\n\n {/* Step 4: Preview (delegated) */}\n {currentStep === \"preview\" && (\n <div className=\"gap-group flex flex-col\">\n {preview ?? (\n <div className=\"text-text-tertiary border-border flex h-48 items-center justify-center rounded-lg border border-dashed text-sm\">\n {labels.noPreview}\n </div>\n )}\n </div>\n )}\n </div>\n\n {/* ── Navigation Buttons ── */}\n <div className=\"flex items-center justify-between\">\n <div className=\"gap-element flex\">\n {stepIndex > 0 ? (\n <Button variant=\"secondary\" onClick={goBack}>\n {labels.backButton}\n </Button>\n ) : onCancel ? (\n <Button variant=\"secondary\" onClick={onCancel}>\n {labels.cancelButton}\n </Button>\n ) : (\n <div />\n )}\n </div>\n <div className=\"gap-element flex\">\n {onCancel && stepIndex > 0 && (\n <Button variant=\"ghost\" onClick={onCancel}>\n {labels.cancelButton}\n </Button>\n )}\n {currentStep === \"preview\" ? (\n <Button variant=\"primary\" onClick={handleSave}>\n {labels.saveButton}\n </Button>\n ) : (\n <Button variant=\"primary\" onClick={goNext} disabled={!canGoNext()}>\n {labels.nextButton}\n </Button>\n )}\n </div>\n </div>\n </div>\n );\n}\n\nReportBuilder.displayName = \"ReportBuilder\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../lib/cn\";\nimport {\n OPT_TEXT_PRIMARY,\n OPT_TEXT_SECONDARY,\n OPT_TEXT_TERTIARY,\n OPT_BORDER,\n OPT_FOCUS_VISIBLE,\n} from \"../lib/styles\";\nimport { Button } from \"../core/button\";\nimport { Badge } from \"../core/badge\";\nimport { EmptyState } from \"../core/empty-state\";\n\n// ── Types ──\n\n/** Defines the audit change shape. */\nexport interface AuditChange {\n field: string;\n before: string;\n after: string;\n}\n\n/** Defines the audit entry shape. */\nexport interface AuditEntry {\n id: string;\n timestamp: string;\n actor: string;\n action: \"created\" | \"updated\" | \"deleted\";\n summary: string;\n changes?: AuditChange[];\n}\n\n// ── Labels ──\n\n/** Localized labels for the audit timeline component. */\nexport interface AuditTimelineLabels {\n title?: string;\n empty?: string;\n expand?: string;\n collapse?: string;\n created?: string;\n updated?: string;\n deleted?: string;\n fieldHeader?: string;\n beforeHeader?: string;\n afterHeader?: string;\n diffArrow?: string;\n}\n\nconst defaultLabels: Required<AuditTimelineLabels> = {\n title: \"변경 이력\",\n empty: \"변경 이력이 없습니다\",\n expand: \"상세 보기\",\n collapse: \"접기\",\n created: \"생성\",\n updated: \"수정\",\n deleted: \"삭제\",\n fieldHeader: \"필드\",\n beforeHeader: \"이전\",\n afterHeader: \"이후\",\n diffArrow: \"→\",\n};\n\n// ── Action config ──\n\nconst actionBadgeVariant: Record<\n AuditEntry[\"action\"],\n \"success\" | \"info\" | \"error\"\n> = {\n created: \"success\",\n updated: \"info\",\n deleted: \"error\",\n};\n\nconst actionDotColor: Record<AuditEntry[\"action\"], string> = {\n created: \"bg-success\",\n updated: \"bg-info\",\n deleted: \"bg-danger\",\n};\n\n// ── Props ──\n\n/** Props for the audit timeline component. */\nexport interface AuditTimelineProps {\n entries: AuditEntry[];\n labels?: AuditTimelineLabels;\n className?: string;\n onEntryClick?: (entry: AuditEntry) => void;\n}\n\n// ── Diff Table ──\n\nfunction DiffTable({\n changes,\n labels,\n}: {\n changes: AuditChange[];\n labels: Required<AuditTimelineLabels>;\n}) {\n return (\n <div\n className={cn(\"mt-2 overflow-hidden rounded-md\", OPT_BORDER)}\n role=\"table\"\n aria-label=\"Field changes\"\n >\n {/* Header */}\n <div\n className=\"gap-element bg-bg-subtle grid grid-cols-[1fr_1fr_auto_1fr] px-3 py-1.5\"\n role=\"row\"\n >\n <span\n className={cn(\n \"text-xs font-semibold tracking-wider uppercase\",\n OPT_TEXT_TERTIARY,\n )}\n role=\"columnheader\"\n >\n {labels.fieldHeader}\n </span>\n <span\n className={cn(\n \"text-xs font-semibold tracking-wider uppercase\",\n OPT_TEXT_TERTIARY,\n )}\n role=\"columnheader\"\n >\n {labels.beforeHeader}\n </span>\n <span aria-hidden=\"true\" />\n <span\n className={cn(\n \"text-xs font-semibold tracking-wider uppercase\",\n OPT_TEXT_TERTIARY,\n )}\n role=\"columnheader\"\n >\n {labels.afterHeader}\n </span>\n </div>\n\n {/* Rows */}\n {changes.map((change) => (\n <div\n key={change.field}\n className=\"gap-element border-border-subtle grid grid-cols-[1fr_1fr_auto_1fr] border-t px-3 py-2\"\n role=\"row\"\n >\n <span\n className={cn(\"text-xs font-medium\", OPT_TEXT_PRIMARY)}\n role=\"cell\"\n >\n {change.field}\n </span>\n <span\n className=\"bg-danger-subtle/50 text-danger-fg rounded px-1.5 py-0.5 text-xs line-through\"\n role=\"cell\"\n >\n {change.before || \"\\u2014\"}\n </span>\n <span className={cn(\"text-xs\", OPT_TEXT_TERTIARY)} aria-hidden=\"true\">\n {labels.diffArrow}\n </span>\n <span\n className=\"bg-success-subtle/50 text-success-fg rounded px-1.5 py-0.5 text-xs\"\n role=\"cell\"\n >\n {change.after || \"\\u2014\"}\n </span>\n </div>\n ))}\n </div>\n );\n}\n\n// ── Component ──\n\n/** Renders the audit timeline component. */\nexport function AuditTimeline({\n entries,\n labels: customLabels,\n className,\n onEntryClick,\n}: AuditTimelineProps) {\n const labels: Required<AuditTimelineLabels> = {\n ...defaultLabels,\n ...customLabels,\n };\n\n const [expandedIds, setExpandedIds] = React.useState<Set<string>>(new Set());\n\n const toggleExpanded = React.useCallback((id: string) => {\n setExpandedIds((prev) => {\n const next = new Set(prev);\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n }\n return next;\n });\n }, []);\n\n const actionLabel = React.useCallback(\n (action: AuditEntry[\"action\"]) => {\n return labels[action];\n },\n [labels],\n );\n\n const handleEntryKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLDivElement>, entry: AuditEntry) => {\n if (!onEntryClick) return;\n if (event.key !== \"Enter\" && event.key !== \" \") return;\n event.preventDefault();\n onEntryClick(entry);\n },\n [onEntryClick],\n );\n\n if (entries.length === 0) {\n return (\n <EmptyState\n title={labels.empty}\n className={className}\n data-opt-id=\"XJQ8A\"\n data-opt-slug=\"audit-timeline.AuditTimeline\"\n />\n );\n }\n\n return (\n <div\n className={cn(\"gap-group flex flex-col\", className)}\n data-opt-id=\"XJQ8A\"\n data-opt-slug=\"audit-timeline.AuditTimeline\"\n >\n {/* Timeline container */}\n <div className=\"relative\" role=\"list\" aria-label={labels.title}>\n {/* Vertical timeline line */}\n <div\n className=\"bg-border absolute top-3 bottom-3 left-[9px] w-px\"\n aria-hidden=\"true\"\n />\n\n {entries.map((entry) => {\n const isExpanded = expandedIds.has(entry.id);\n const hasChanges = entry.changes && entry.changes.length > 0;\n const entryId = `audit-entry-${entry.id}`;\n const contentId = `audit-content-${entry.id}`;\n\n return (\n <div\n key={entry.id}\n className=\"relative pb-4 pl-8 last:pb-0\"\n role=\"listitem\"\n >\n {/* Timeline dot */}\n <div\n className={cn(\n \"border-surface absolute top-1.5 left-1 h-[14px] w-[14px] rounded-full border-2\",\n actionDotColor[entry.action],\n )}\n aria-hidden=\"true\"\n />\n\n {/* Entry content */}\n <div\n className={cn(\n \"rounded-lg p-3\",\n OPT_BORDER,\n \"bg-surface transition-colors\",\n onEntryClick && \"hover:bg-bg-subtle cursor-pointer\",\n )}\n aria-labelledby={entryId}\n >\n <div\n {...(onEntryClick\n ? {\n role: \"button\" as const,\n tabIndex: 0,\n onClick: () => onEntryClick(entry),\n onKeyDown: (\n event: React.KeyboardEvent<HTMLDivElement>,\n ) => handleEntryKeyDown(event, entry),\n }\n : {})}\n className={cn(\n onEntryClick && \"rounded-md\",\n onEntryClick && OPT_FOCUS_VISIBLE,\n )}\n >\n {/* Header row */}\n <div className=\"gap-element flex items-center\">\n <Badge\n variant={actionBadgeVariant[entry.action]}\n size=\"sm\"\n dot\n >\n {actionLabel(entry.action)}\n </Badge>\n <span className={cn(\"text-xs\", OPT_TEXT_TERTIARY)}>\n <time dateTime={entry.timestamp}>{entry.timestamp}</time>\n </span>\n <span\n className={cn(\n \"ml-auto text-xs font-medium\",\n OPT_TEXT_SECONDARY,\n )}\n >\n {entry.actor}\n </span>\n </div>\n\n {/* Summary */}\n <p\n id={entryId}\n className={cn(\"mt-1.5 text-sm\", OPT_TEXT_PRIMARY)}\n >\n {entry.summary}\n </p>\n </div>\n\n {/* Expand/Collapse button */}\n {hasChanges && (\n <div className=\"mt-2\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className={cn(OPT_FOCUS_VISIBLE)}\n onClick={(e) => {\n e.stopPropagation();\n toggleExpanded(entry.id);\n }}\n aria-expanded={isExpanded}\n aria-controls={contentId}\n >\n {isExpanded ? labels.collapse : labels.expand}\n <svg\n className={cn(\n \"ml-1 h-3.5 w-3.5 transition-transform\",\n isExpanded && \"rotate-180\",\n )}\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n aria-hidden=\"true\"\n >\n <path d=\"M4 6l4 4 4-4\" />\n </svg>\n </Button>\n\n {/* Diff view */}\n {isExpanded && (\n <div\n id={contentId}\n role=\"region\"\n aria-label=\"Field changes\"\n >\n <DiffTable changes={entry.changes!} labels={labels} />\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\nAuditTimeline.displayName = \"AuditTimeline\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../lib/cn\";\nimport { Button } from \"../core/button\";\nimport { Input } from \"../core/input\";\n\n/** Type definition for segment condition type. */\nexport type SegmentConditionType = \"event\" | \"property\" | \"cohort\" | \"custom\";\n\n/** Defines the segment condition shape. */\nexport interface SegmentCondition {\n id: string;\n type: SegmentConditionType;\n field: string;\n operator: string;\n value: string;\n}\n\n/** Defines the segment group shape. */\nexport interface SegmentGroup {\n id: string;\n combinator: \"and\" | \"or\";\n conditions: SegmentCondition[];\n}\n\n/** Props for the segment builder component. */\nexport interface SegmentBuilderProps {\n groups: SegmentGroup[];\n onChange: (groups: SegmentGroup[]) => void;\n eventOptions?: string[];\n propertyOptions?: string[];\n cohortOptions?: string[];\n className?: string;\n labels?: SegmentBuilderLabels;\n}\n\n/** Localized labels for the segment builder component. */\nexport interface SegmentBuilderLabels {\n match?: string;\n ofTheFollowing?: string;\n groupLabel?: string;\n conditionLabel?: string;\n useOrCombinatorAriaLabel?: string;\n conditionTypeLabel?: string;\n fieldLabel?: string;\n customFieldLabel?: string;\n operatorLabel?: string;\n valueLabel?: string;\n removeGroupAriaLabel?: string;\n removeConditionAriaLabel?: string;\n addCondition?: string;\n addGroup?: string;\n}\n\nconst defaultLabels: Required<SegmentBuilderLabels> = {\n match: \"Match\",\n ofTheFollowing: \"of the following\",\n groupLabel: \"Segment group\",\n conditionLabel: \"Condition\",\n useOrCombinatorAriaLabel: \"Use OR matching for segment group\",\n conditionTypeLabel: \"Condition type\",\n fieldLabel: \"Field\",\n customFieldLabel: \"Expression\",\n operatorLabel: \"Operator\",\n valueLabel: \"Value\",\n removeGroupAriaLabel: \"Remove group\",\n removeConditionAriaLabel: \"Remove condition\",\n addCondition: \"+ Add condition\",\n addGroup: \"+ Add group\",\n};\n\nconst CONDITION_TYPES: { value: SegmentConditionType; label: string }[] = [\n { value: \"event\", label: \"Event\" },\n { value: \"property\", label: \"Property\" },\n { value: \"cohort\", label: \"Cohort\" },\n { value: \"custom\", label: \"Custom\" },\n];\n\nconst OPERATORS: Record<\n SegmentConditionType,\n { value: string; label: string }[]\n> = {\n event: [\n { value: \"performed\", label: \"performed\" },\n { value: \"not_performed\", label: \"not performed\" },\n { value: \"performed_count\", label: \"performed count\" },\n { value: \"first_time\", label: \"first time\" },\n ],\n property: [\n { value: \"equals\", label: \"equals\" },\n { value: \"not_equals\", label: \"does not equal\" },\n { value: \"contains\", label: \"contains\" },\n { value: \"gt\", label: \">\" },\n { value: \"lt\", label: \"<\" },\n { value: \"is_set\", label: \"is set\" },\n { value: \"is_not_set\", label: \"is not set\" },\n ],\n cohort: [\n { value: \"in\", label: \"is in\" },\n { value: \"not_in\", label: \"is not in\" },\n ],\n custom: [{ value: \"sql\", label: \"SQL expression\" }],\n};\n\nfunction collectSegmentBuilderIds(groups: SegmentGroup[]) {\n const ids = new Set<string>();\n\n for (const group of groups) {\n ids.add(group.id);\n for (const condition of group.conditions) {\n ids.add(condition.id);\n }\n }\n\n return ids;\n}\n\n/** Renders the segment builder component. */\nexport function SegmentBuilder({\n groups,\n onChange,\n eventOptions = [\"page_view\", \"click\", \"purchase\", \"signup\", \"login\"],\n propertyOptions = [\"country\", \"device\", \"browser\", \"plan\", \"age\"],\n cohortOptions = [\"Active Users\", \"New Users\", \"Power Users\"],\n className,\n labels: customLabels,\n}: SegmentBuilderProps) {\n const labels = { ...defaultLabels, ...customLabels };\n const builderId = React.useId().replace(/:/g, \"\");\n const nextIdRef = React.useRef(1);\n\n const createId = React.useCallback(() => {\n const reservedIds = collectSegmentBuilderIds(groups);\n let id = \"\";\n\n do {\n id = `seg_${nextIdRef.current++}`;\n } while (reservedIds.has(id));\n\n return id;\n }, [groups]);\n\n const addGroup = () => {\n onChange([\n ...groups,\n {\n id: createId(),\n combinator: \"and\",\n conditions: [\n {\n id: createId(),\n type: \"event\",\n field: eventOptions[0],\n operator: \"performed\",\n value: \"\",\n },\n ],\n },\n ]);\n };\n\n const removeGroup = (groupId: string) => {\n onChange(groups.filter((g) => g.id !== groupId));\n };\n\n const updateGroup = (groupId: string, partial: Partial<SegmentGroup>) => {\n onChange(groups.map((g) => (g.id === groupId ? { ...g, ...partial } : g)));\n };\n\n const addCondition = (groupId: string) => {\n onChange(\n groups.map((g) =>\n g.id === groupId\n ? {\n ...g,\n conditions: [\n ...g.conditions,\n {\n id: createId(),\n type: \"event\" as const,\n field: eventOptions[0],\n operator: \"performed\",\n value: \"\",\n },\n ],\n }\n : g,\n ),\n );\n };\n\n const updateCondition = (\n groupId: string,\n condId: string,\n partial: Partial<SegmentCondition>,\n ) => {\n onChange(\n groups.map((g) =>\n g.id === groupId\n ? {\n ...g,\n conditions: g.conditions.map((c) =>\n c.id === condId ? { ...c, ...partial } : c,\n ),\n }\n : g,\n ),\n );\n };\n\n const removeCondition = (groupId: string, condId: string) => {\n onChange(\n groups.map((g) =>\n g.id === groupId\n ? {\n ...g,\n conditions: g.conditions.filter((c) => c.id !== condId),\n }\n : g,\n ),\n );\n };\n\n const getFieldOptions = (type: SegmentConditionType) => {\n switch (type) {\n case \"event\":\n return eventOptions;\n case \"property\":\n return propertyOptions;\n case \"cohort\":\n return cohortOptions;\n case \"custom\":\n return [];\n }\n };\n\n return (\n <div\n className={cn(\"gap-group flex flex-col\", className)}\n data-opt-id=\"ZSC94\"\n data-opt-slug=\"segment-builder.SegmentBuilder\"\n >\n {groups.map((group, gi) => {\n const groupPosition = gi + 1;\n const groupLabelId = `${builderId}-${group.id}-label`;\n\n return (\n <React.Fragment key={group.id}>\n {gi > 0 && (\n <div className=\"flex justify-center\">\n <span className=\"text-text-tertiary text-xs font-semibold uppercase\">\n AND\n </span>\n </div>\n )}\n <div\n className=\"border-border gap-element flex flex-col rounded-lg border p-3\"\n role=\"group\"\n aria-labelledby={groupLabelId}\n >\n <span id={groupLabelId} className=\"sr-only\">\n {labels.groupLabel} {groupPosition}\n </span>\n <div className=\"flex items-center justify-between\">\n <div className=\"gap-element flex items-center\">\n <span className=\"text-text-tertiary text-xs\">\n {labels.match}\n </span>\n <button\n type=\"button\"\n onClick={() =>\n updateGroup(group.id, {\n combinator: group.combinator === \"and\" ? \"or\" : \"and\",\n })\n }\n className=\"bg-accent-subtle text-accent rounded px-2 py-0.5 text-xs font-semibold focus-visible:ring-2 focus-visible:ring-blue-600 focus-visible:outline-none\"\n aria-label={`${labels.useOrCombinatorAriaLabel} ${groupPosition}`}\n aria-pressed={group.combinator === \"or\"}\n >\n {group.combinator.toUpperCase()}\n </button>\n <span className=\"text-text-tertiary text-xs\">\n {labels.ofTheFollowing}\n </span>\n </div>\n {groups.length > 1 && (\n <button\n type=\"button\"\n onClick={() => removeGroup(group.id)}\n className=\"text-text-tertiary hover:text-danger-fg text-xs focus-visible:ring-2 focus-visible:ring-blue-600 focus-visible:outline-none\"\n aria-label={`${labels.removeGroupAriaLabel} ${groupPosition}`}\n >\n ✕\n </button>\n )}\n </div>\n\n {group.conditions.map((cond, ci) => {\n const ops = OPERATORS[cond.type];\n const fields = getFieldOptions(cond.type);\n const needsValue =\n cond.operator !== \"is_set\" &&\n cond.operator !== \"is_not_set\" &&\n cond.operator !== \"performed\" &&\n cond.operator !== \"not_performed\" &&\n cond.operator !== \"first_time\";\n const conditionPosition = `${groupPosition}.${ci + 1}`;\n const conditionLabelId = `${builderId}-${cond.id}-label`;\n\n return (\n <div\n key={cond.id}\n className=\"gap-element flex flex-wrap items-center\"\n role=\"group\"\n aria-labelledby={conditionLabelId}\n >\n <span id={conditionLabelId} className=\"sr-only\">\n {labels.conditionLabel} {conditionPosition}\n </span>\n <select\n value={cond.type}\n onChange={(e) => {\n const newType = e.target.value as SegmentConditionType;\n const newFields = getFieldOptions(newType);\n const newOps = OPERATORS[newType];\n updateCondition(group.id, cond.id, {\n type: newType,\n field: newFields[0] ?? \"\",\n operator: newOps[0]?.value ?? \"\",\n value: \"\",\n });\n }}\n className=\"border-border text-text-primary rounded-md border bg-transparent px-2 py-1 text-sm focus-visible:ring-2 focus-visible:ring-blue-600 focus-visible:outline-none\"\n aria-label={`${labels.conditionTypeLabel} ${conditionPosition}`}\n >\n {CONDITION_TYPES.map((ct) => (\n <option key={ct.value} value={ct.value}>\n {ct.label}\n </option>\n ))}\n </select>\n\n {fields.length > 0 ? (\n <select\n value={cond.field}\n onChange={(e) =>\n updateCondition(group.id, cond.id, {\n field: e.target.value,\n })\n }\n className=\"border-border text-text-primary rounded-md border bg-transparent px-2 py-1 text-sm focus-visible:ring-2 focus-visible:ring-blue-600 focus-visible:outline-none\"\n aria-label={`${labels.fieldLabel} ${conditionPosition}`}\n >\n {fields.map((f) => (\n <option key={f} value={f}>\n {f}\n </option>\n ))}\n </select>\n ) : (\n <Input\n value={cond.field}\n onChange={(e) =>\n updateCondition(group.id, cond.id, {\n field: e.target.value,\n })\n }\n placeholder=\"Expression\"\n className=\"w-32\"\n aria-label={`${labels.customFieldLabel} ${conditionPosition}`}\n />\n )}\n\n <select\n value={cond.operator}\n onChange={(e) =>\n updateCondition(group.id, cond.id, {\n operator: e.target.value,\n })\n }\n className=\"border-border text-text-primary rounded-md border bg-transparent px-2 py-1 text-sm focus-visible:ring-2 focus-visible:ring-blue-600 focus-visible:outline-none\"\n aria-label={`${labels.operatorLabel} ${conditionPosition}`}\n >\n {ops.map((op) => (\n <option key={op.value} value={op.value}>\n {op.label}\n </option>\n ))}\n </select>\n\n {needsValue && (\n <Input\n value={cond.value}\n onChange={(e) =>\n updateCondition(group.id, cond.id, {\n value: e.target.value,\n })\n }\n placeholder=\"Value\"\n className=\"w-28\"\n aria-label={`${labels.valueLabel} ${conditionPosition}`}\n />\n )}\n\n <button\n type=\"button\"\n onClick={() => removeCondition(group.id, cond.id)}\n className=\"text-text-tertiary hover:text-danger-fg text-sm focus-visible:ring-2 focus-visible:ring-blue-600 focus-visible:outline-none\"\n aria-label={`${labels.removeConditionAriaLabel} ${conditionPosition}`}\n >\n ✕\n </button>\n </div>\n );\n })}\n\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => addCondition(group.id)}\n >\n {labels.addCondition}\n </Button>\n </div>\n </React.Fragment>\n );\n })}\n\n <Button variant=\"ghost\" size=\"sm\" onClick={addGroup}>\n {labels.addGroup}\n </Button>\n </div>\n );\n}\n\nSegmentBuilder.displayName = \"SegmentBuilder\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../lib/cn\";\nimport { Button } from \"../core/button\";\nimport { Badge } from \"../core/badge\";\nimport {\n OPT_SURFACE,\n OPT_BORDER,\n OPT_TEXT_PRIMARY,\n OPT_TEXT_SECONDARY,\n} from \"../lib/styles\";\n\n/** Type definition for insight severity. */\nexport type InsightSeverity = \"critical\" | \"warning\" | \"info\";\n\n/** Defines the insight item shape. */\nexport interface InsightItem {\n id: string;\n type: string;\n title: string;\n description: string;\n severity: InsightSeverity;\n eventName?: string;\n metrics?: Record<string, string | number>;\n dismissed?: boolean;\n}\n\n/** Defines the insights stat shape. */\nexport interface InsightsStat {\n id: string;\n label: string;\n count: number;\n severity?: InsightSeverity | \"total\";\n}\n\n/** Defines the detection type shape. */\nexport interface DetectionTypeDef {\n id: string;\n label: string;\n enabled: boolean;\n}\n\n/** Configuration for detection. */\nexport interface DetectionConfig {\n days?: number;\n zScoreThreshold?: number;\n}\n\n/** Localized labels for the insights panel component. */\nexport interface InsightsPanelLabels {\n title?: string;\n dismiss?: string;\n showDismissed?: string;\n hideDismissed?: string;\n emptyTitle?: string;\n emptyDescription?: string;\n detectionTitle?: string;\n daysLabel?: string;\n zScoreLabel?: string;\n}\n\nconst defaultLabels: Required<InsightsPanelLabels> = {\n title: \"Insights\",\n dismiss: \"Dismiss\",\n showDismissed: \"Show dismissed\",\n hideDismissed: \"Hide dismissed\",\n emptyTitle: \"No insights\",\n emptyDescription: \"No anomalies or notable events detected.\",\n detectionTitle: \"Detection Settings\",\n daysLabel: \"Days\",\n zScoreLabel: \"Z-Score\",\n};\n\n/** Props for the insights panel component. */\nexport interface InsightsPanelProps {\n insights: InsightItem[];\n stats?: InsightsStat[];\n /** Detection type toggles (e.g., volume_anomaly, new_event, etc.) */\n detectionTypes?: DetectionTypeDef[];\n onDetectionTypeToggle?: (typeId: string, enabled: boolean) => void;\n /** Detection parameters (lookback days, z-score threshold) */\n detectionConfig?: DetectionConfig;\n onDetectionConfigChange?: (config: DetectionConfig) => void;\n onDismiss?: (id: string) => void;\n onInsightClick?: (insight: InsightItem) => void;\n onStatClick?: (statId: string) => void;\n header?: React.ReactNode;\n actions?: React.ReactNode;\n labels?: InsightsPanelLabels;\n className?: string;\n}\n\nconst severityConfig: Record<\n InsightSeverity,\n { icon: string; color: string; bg: string }\n> = {\n critical: {\n icon: \"!!\",\n color: \"text-danger-fg\",\n bg: \"bg-danger-subtle border-danger\",\n },\n warning: {\n icon: \"!\",\n color: \"text-warning-fg\",\n bg: \"bg-warning-subtle border-warning\",\n },\n info: {\n icon: \"i\",\n color: \"text-info-fg\",\n bg: \"bg-info-subtle border-info\",\n },\n};\n\n/** Renders the insights panel component. */\nexport function InsightsPanel({\n insights,\n stats,\n detectionTypes,\n onDetectionTypeToggle,\n detectionConfig,\n onDetectionConfigChange,\n onDismiss,\n onInsightClick,\n onStatClick,\n header,\n actions,\n labels: customLabels,\n className,\n}: InsightsPanelProps) {\n const labels = { ...defaultLabels, ...customLabels };\n const [showDismissed, setShowDismissed] = React.useState(false);\n\n const visibleInsights = showDismissed\n ? insights\n : insights.filter((i) => !i.dismissed);\n const hasStats = stats && stats.length > 0;\n const hasDetection =\n (detectionTypes && detectionTypes.length > 0) || detectionConfig != null;\n const isEmpty = visibleInsights.length === 0;\n\n return (\n <div\n className={cn(\"gap-group flex flex-col\", className)}\n data-opt-id=\"HCYZV\"\n data-opt-slug=\"insights-panel.InsightsPanel\"\n >\n {header || actions ? (\n <div className=\"flex items-center justify-between\">\n {header && <div>{header}</div>}\n {actions && (\n <div className=\"gap-element flex items-center\">{actions}</div>\n )}\n </div>\n ) : (\n <div className=\"flex items-center justify-between\">\n <h2 className=\"text-text-primary text-lg font-semibold\">\n {labels.title}\n </h2>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setShowDismissed((v) => !v)}\n >\n {showDismissed ? labels.hideDismissed : labels.showDismissed}\n </Button>\n </div>\n )}\n\n {hasDetection && (\n <div className={cn(\"rounded-lg border p-3\", OPT_SURFACE, OPT_BORDER)}>\n <h3 className={cn(\"mb-2 text-xs font-medium\", OPT_TEXT_SECONDARY)}>\n {labels.detectionTitle}\n </h3>\n {detectionTypes && detectionTypes.length > 0 && (\n <div className=\"mb-2 flex flex-wrap gap-1.5\">\n {detectionTypes.map((dt) => (\n <button\n key={dt.id}\n type=\"button\"\n onClick={() => onDetectionTypeToggle?.(dt.id, !dt.enabled)}\n className={cn(\n \"focus-visible:ring-accent rounded-md px-2.5 py-1 text-xs font-medium transition-colors focus-visible:ring-2 focus-visible:outline-none\",\n dt.enabled\n ? \"bg-accent text-accent-fg\"\n : \"bg-bg-subtle text-text-secondary\",\n )}\n >\n {dt.label}\n </button>\n ))}\n </div>\n )}\n {detectionConfig != null && onDetectionConfigChange && (\n <div className=\"gap-group flex items-center\">\n <label className=\"flex items-center gap-1.5 text-xs\">\n <span className={OPT_TEXT_SECONDARY}>{labels.daysLabel}</span>\n <input\n type=\"number\"\n min={1}\n max={365}\n value={detectionConfig.days ?? 30}\n onChange={(e) =>\n onDetectionConfigChange({\n ...detectionConfig,\n days: Number(e.target.value) || 30,\n })\n }\n className={cn(\n \"w-16 rounded-md border px-2 py-1 text-xs\",\n OPT_BORDER,\n OPT_TEXT_PRIMARY,\n \"bg-transparent\",\n )}\n />\n </label>\n <label className=\"flex items-center gap-1.5 text-xs\">\n <span className={OPT_TEXT_SECONDARY}>{labels.zScoreLabel}</span>\n <input\n type=\"number\"\n min={0}\n max={10}\n step={0.1}\n value={detectionConfig.zScoreThreshold ?? 2.0}\n onChange={(e) =>\n onDetectionConfigChange({\n ...detectionConfig,\n zScoreThreshold: Number(e.target.value) || 2.0,\n })\n }\n className={cn(\n \"w-16 rounded-md border px-2 py-1 text-xs\",\n OPT_BORDER,\n OPT_TEXT_PRIMARY,\n \"bg-transparent\",\n )}\n />\n </label>\n </div>\n )}\n </div>\n )}\n\n {hasStats && (\n <div className=\"gap-group grid grid-cols-2 sm:grid-cols-4\">\n {stats.map((s) => (\n <button\n key={s.id}\n type=\"button\"\n onClick={() => onStatClick?.(s.id)}\n className={cn(\n OPT_SURFACE,\n OPT_BORDER,\n \"hover:bg-bg-subtle flex flex-col items-center gap-1 rounded-lg p-3 text-center transition-colors\",\n onStatClick && \"cursor-pointer\",\n )}\n >\n <span className={cn(\"text-2xl font-bold\", OPT_TEXT_PRIMARY)}>\n {s.count}\n </span>\n <span className={cn(\"text-xs\", OPT_TEXT_SECONDARY)}>\n {s.label}\n </span>\n </button>\n ))}\n </div>\n )}\n\n {isEmpty ? (\n <div\n role=\"status\"\n className=\"flex flex-col items-center justify-center py-12 text-center\"\n >\n <h3 className=\"text-text-primary text-lg font-medium\">\n {labels.emptyTitle}\n </h3>\n <p className=\"text-text-tertiary mt-1 text-sm\">\n {labels.emptyDescription}\n </p>\n </div>\n ) : (\n <div className=\"gap-element flex flex-col\">\n {visibleInsights.map((insight) => {\n const config = severityConfig[insight.severity];\n const Wrapper = onInsightClick ? \"button\" : \"div\";\n return (\n <Wrapper\n key={insight.id}\n className={cn(\n \"w-full rounded-lg border p-4 text-left\",\n config.bg,\n insight.dismissed && \"opacity-50\",\n onInsightClick && \"cursor-pointer\",\n )}\n {...(onInsightClick\n ? {\n type: \"button\" as const,\n onClick: () => onInsightClick(insight),\n }\n : {})}\n >\n <div className=\"gap-group flex items-start justify-between\">\n <div className=\"gap-group flex items-start\">\n <span\n className={cn(\n \"mt-0.5 inline-flex h-6 w-6 shrink-0 items-center justify-center rounded-full text-xs font-bold\",\n config.color,\n \"bg-surface/60\",\n )}\n aria-hidden=\"true\"\n >\n {config.icon}\n </span>\n <div className=\"min-w-0\">\n <div className=\"gap-element flex items-center\">\n <span\n className={cn(\n \"text-sm font-medium\",\n OPT_TEXT_PRIMARY,\n )}\n >\n {insight.title}\n </span>\n <Badge\n variant={\n insight.severity === \"critical\"\n ? \"error\"\n : insight.severity\n }\n size=\"sm\"\n >\n {insight.severity}\n </Badge>\n {insight.eventName && (\n <code className=\"text-text-tertiary text-xs\">\n {insight.eventName}\n </code>\n )}\n </div>\n <p className={cn(\"mt-0.5 text-sm\", OPT_TEXT_SECONDARY)}>\n {insight.description}\n </p>\n {insight.metrics &&\n Object.keys(insight.metrics).length > 0 && (\n <div className=\"gap-group mt-2 flex flex-wrap\">\n {Object.entries(insight.metrics).map(\n ([key, val]) => (\n <span\n key={key}\n className=\"text-text-tertiary text-xs\"\n >\n <span className=\"font-medium\">{key}:</span>{\" \"}\n {val}\n </span>\n ),\n )}\n </div>\n )}\n </div>\n </div>\n {onDismiss && !insight.dismissed && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={(e) => {\n e.stopPropagation();\n onDismiss(insight.id);\n }}\n className=\"shrink-0\"\n >\n {labels.dismiss}\n </Button>\n )}\n </div>\n </Wrapper>\n );\n })}\n </div>\n )}\n </div>\n );\n}\n\nInsightsPanel.displayName = \"InsightsPanel\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../lib/cn\";\nimport { Button } from \"../core/button\";\nimport { DateRangePicker } from \"../core/date-range-picker\";\nimport type { DateRange, DateRangePreset } from \"../core/date-range-picker\";\n\n/** Defines the time preset shape. */\nexport interface TimePresetDef {\n label: string;\n days: number;\n}\n\n/** Localized labels for the time range selector component. */\nexport interface TimeRangeSelectorLabels {\n title?: string;\n placeholder?: string;\n}\n\n/** Props for the time range selector component. */\nexport interface TimeRangeSelectorProps {\n value?: DateRange;\n onChange?: (range: DateRange) => void;\n presets?: TimePresetDef[];\n labels?: TimeRangeSelectorLabels;\n className?: string;\n}\n\nconst DEFAULT_PRESETS: TimePresetDef[] = [\n { label: \"Today\", days: 0 },\n { label: \"Last 7d\", days: 7 },\n { label: \"Last 30d\", days: 30 },\n { label: \"Last 90d\", days: 90 },\n];\n\nfunction presetToRange(days: number): DateRange {\n const end = new Date();\n end.setHours(0, 0, 0, 0);\n if (days === 0) return { start: new Date(end), end: new Date(end) };\n const start = new Date(end);\n start.setDate(start.getDate() - (days - 1));\n return { start, end };\n}\n\n/** Renders the time range selector component. */\nexport function TimeRangeSelector({\n value,\n onChange,\n presets = DEFAULT_PRESETS,\n labels,\n className,\n}: TimeRangeSelectorProps) {\n const [localRange, setLocalRange] = React.useState<DateRange>({\n start: null,\n end: null,\n });\n const range = value ?? localRange;\n const setRange = onChange ?? setLocalRange;\n\n const handlePreset = React.useCallback(\n (days: number) => {\n setRange(presetToRange(days));\n },\n [setRange],\n );\n\n // Convert TimePresetDef[] to DateRangePreset[] for DateRangePicker\n const datePickerPresets: DateRangePreset[] = React.useMemo(\n () =>\n presets.map((p) => ({\n label: p.label,\n range: () => presetToRange(p.days),\n })),\n [presets],\n );\n\n if (presets.length === 0) {\n return (\n <DateRangePicker\n value={range}\n onChange={setRange}\n placeholder={labels?.placeholder ?? \"Select time range\"}\n label={labels?.title}\n triggerClassName=\"flex h-10 items-center gap-2 rounded-lg px-3 text-sm text-text-secondary transition-colors hover:bg-bg-subtle hover:text-text-primary\"\n data-opt-id=\"K0D7C\"\n data-opt-slug=\"time-range-selector.TimeRangeSelector\"\n />\n );\n }\n\n return (\n <div\n className={cn(\n \"border-border bg-surface inline-flex items-center rounded-lg border\",\n className,\n )}\n data-opt-id=\"K0D7C\"\n data-opt-slug=\"time-range-selector.TimeRangeSelector\"\n >\n {/* Quick presets as buttons */}\n <div className=\"hidden items-center sm:flex\">\n {presets.map((p) => (\n <Button\n key={p.label}\n variant=\"ghost\"\n size=\"md\"\n onClick={() => handlePreset(p.days)}\n >\n {p.label}\n </Button>\n ))}\n </div>\n\n <DateRangePicker\n value={range}\n onChange={setRange}\n presets={datePickerPresets}\n placeholder={labels?.placeholder ?? \"Select time range\"}\n label={labels?.title}\n triggerClassName=\"flex h-10 items-center gap-2 rounded-lg px-3 text-sm text-text-secondary hover:bg-bg-subtle hover:text-text-primary transition-colors cursor-pointer\"\n />\n </div>\n );\n}\n\nTimeRangeSelector.displayName = \"TimeRangeSelector\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../lib/cn\";\nimport {\n DropdownMenu,\n DropdownTrigger,\n DropdownContent,\n DropdownItem,\n DropdownSeparator,\n} from \"../core/dropdown-menu\";\nimport {\n DialogRoot,\n DialogPanel,\n DialogHeading,\n DialogDescription,\n DialogHeader,\n DialogBody,\n DialogFooter,\n} from \"../core/dialog\";\nimport { Button } from \"../core/button\";\nimport type { ExportFormat, ExportColumn } from \"../lib/types\";\n\n/** Localized labels for the export button component. */\nexport interface ExportButtonLabels {\n export?: string;\n csv?: string;\n json?: string;\n pdf?: string;\n guidedTitle?: string;\n guidedDescription?: (rows: number, format: string) => string;\n format?: string;\n cancel?: string;\n}\n\n/** Props for the export button component. */\nexport interface ExportButtonProps {\n data: Record<string, unknown>[];\n columns?: ExportColumn[];\n fileName?: string;\n formats?: ExportFormat[];\n onExport?: (format: ExportFormat) => void;\n labels?: ExportButtonLabels;\n /** Show a step-by-step dialog instead of a dropdown */\n guided?: boolean;\n className?: string;\n}\n\nfunction toCsv(\n data: Record<string, unknown>[],\n columns?: ExportColumn[],\n): string {\n if (data.length === 0) return \"\";\n const cols =\n columns ?? Object.keys(data[0]).map((k) => ({ key: k, header: k }));\n const header = cols.map((c) => `\"${c.header}\"`).join(\",\");\n const rows = data.map((row) =>\n cols\n .map((c) => {\n const val = row[c.key];\n return `\"${String(val ?? \"\").replace(/\"/g, '\"\"')}\"`;\n })\n .join(\",\"),\n );\n return [header, ...rows].join(\"\\n\");\n}\n\nfunction toJson(data: Record<string, unknown>[]): string {\n return JSON.stringify(data, null, 2);\n}\n\nfunction download(content: string, fileName: string, mime: string) {\n const blob = new Blob([content], { type: mime });\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = fileName;\n a.click();\n URL.revokeObjectURL(url);\n}\n\n/** Renders the export button component. */\nexport function ExportButton({\n data,\n columns,\n fileName = \"export\",\n formats = [\"csv\", \"json\"],\n onExport,\n labels: customLabels,\n guided = false,\n className,\n}: ExportButtonProps) {\n const [guidedOpen, setGuidedOpen] = React.useState(false);\n const [guidedFormat, setGuidedFormat] = React.useState<ExportFormat>(\n formats[0],\n );\n const labels = {\n export: \"Export\",\n csv: \"CSV\",\n json: \"JSON\",\n pdf: \"PDF\",\n guidedTitle: \"Export Data\",\n guidedDescription: (rows: number, format: string) =>\n `${rows} rows will be exported as ${format}.`,\n format: \"Format\",\n cancel: \"Cancel\",\n confirm: \"Export\",\n ...customLabels,\n };\n\n const handleExport = React.useCallback(\n (format: ExportFormat) => {\n if (onExport) {\n onExport(format);\n return;\n }\n if (format === \"csv\") {\n download(toCsv(data, columns), `${fileName}.csv`, \"text/csv\");\n } else if (format === \"json\") {\n download(toJson(data), `${fileName}.json`, \"application/json\");\n }\n // PDF is delegated to onExport callback\n },\n [data, columns, fileName, onExport],\n );\n\n const formatLabels: Record<ExportFormat, string> = {\n csv: labels.csv,\n json: labels.json,\n pdf: labels.pdf,\n };\n\n if (guided) {\n return (\n <div\n className=\"inline-flex\"\n data-opt-id=\"MGP2B\"\n data-opt-slug=\"export-button.ExportButton\"\n >\n <Button\n variant=\"secondary\"\n size=\"sm\"\n className={cn(className)}\n onClick={() => setGuidedOpen(true)}\n aria-label={labels.export}\n >\n <span aria-hidden=\"true\">⬇</span>\n {labels.export}\n </Button>\n <DialogRoot open={guidedOpen} onOpenChange={setGuidedOpen}>\n <DialogPanel size=\"xs\">\n <DialogHeader>\n <DialogHeading className=\"text-sm\">\n {labels.guidedTitle}\n </DialogHeading>\n <DialogDescription>\n {labels.guidedDescription(\n data.length,\n formatLabels[guidedFormat],\n )}\n </DialogDescription>\n </DialogHeader>\n <DialogBody>\n <div className=\"gap-element flex flex-col\">\n <label className=\"text-text-secondary text-xs\">\n {labels.format}\n </label>\n <div className=\"gap-element flex\">\n {formats.map((fmt) => (\n <button\n key={fmt}\n type=\"button\"\n onClick={() => setGuidedFormat(fmt)}\n className={cn(\n \"focus-visible:ring-accent rounded-md border px-3 py-1.5 text-sm focus-visible:ring-2 focus-visible:outline-none\",\n guidedFormat === fmt\n ? \"border-accent bg-accent/10 text-accent\"\n : \"border-border text-text-secondary\",\n )}\n >\n {formatLabels[fmt]}\n </button>\n ))}\n </div>\n </div>\n </DialogBody>\n <DialogFooter>\n <Button variant=\"ghost\" onClick={() => setGuidedOpen(false)}>\n {labels.cancel}\n </Button>\n <Button\n onClick={() => {\n handleExport(guidedFormat);\n setGuidedOpen(false);\n }}\n >\n {labels.confirm}\n </Button>\n </DialogFooter>\n </DialogPanel>\n </DialogRoot>\n </div>\n );\n }\n\n return (\n <DropdownMenu\n data-opt-id=\"MGP2B\"\n data-opt-slug=\"export-button.ExportButton\"\n >\n <DropdownTrigger\n className={cn(\n \"inline-flex items-center justify-center rounded-lg font-medium transition-colors\",\n \"border-border bg-surface text-text-primary hover:bg-bg-subtle active:bg-bg-muted border\",\n \"h-8 gap-1.5 px-3 text-xs\",\n className,\n )}\n aria-label={labels.export}\n >\n <span aria-hidden=\"true\">⬇</span>\n {labels.export}\n </DropdownTrigger>\n <DropdownContent>\n {formats.map((fmt, i) => (\n <React.Fragment key={fmt}>\n {i > 0 && fmt === \"pdf\" && <DropdownSeparator />}\n <DropdownItem onClick={() => handleExport(fmt)}>\n {formatLabels[fmt]}\n </DropdownItem>\n </React.Fragment>\n ))}\n </DropdownContent>\n </DropdownMenu>\n );\n}\n\nExportButton.displayName = \"ExportButton\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../lib/cn\";\nimport { EmptyState } from \"../core/empty-state\";\nimport { StatCard } from \"../core/stat-card\";\nimport { SkeletonCard } from \"../core/skeleton\";\nimport type { StatCard as StatCardType } from \"../lib/types\";\n\n/** Localized labels for the summary row component. */\nexport interface SummaryRowLabels {\n emptyTitle?: string;\n emptyDescription?: string;\n}\n\n/** Props for the summary row component. */\nexport interface SummaryRowProps {\n stats: StatCardType[];\n columns?: 2 | 3 | 4;\n onStatClick?: (stat: StatCardType) => void;\n formatValue?: (stat: StatCardType) => string;\n durationFractionDigits?: number;\n percentageFractionDigits?: number;\n loading?: boolean;\n labels?: SummaryRowLabels;\n className?: string;\n}\n\nconst defaultLabels: Required<SummaryRowLabels> = {\n emptyTitle: \"No summary stats\",\n emptyDescription: \"Provide at least one stat to render the summary row.\",\n};\n\nfunction formatDuration(\n value: number,\n unit: StatCardType[\"durationUnit\"],\n fractionDigits: number,\n): string {\n if (unit === \"s\") {\n return `${value.toFixed(fractionDigits)}s`;\n }\n\n if (value >= 1000) {\n return `${(value / 1000).toFixed(fractionDigits)}s`;\n }\n\n return `${value.toFixed(0)}ms`;\n}\n\nfunction formatByStatType(\n stat: StatCardType,\n durationFractionDigits: number,\n percentageFractionDigits: number,\n): string {\n if (\n typeof stat.rawValue !== \"number\" ||\n !stat.format ||\n stat.format === \"text\"\n ) {\n return stat.value;\n }\n\n if (stat.format === \"duration\") {\n return formatDuration(\n stat.rawValue,\n stat.durationUnit,\n durationFractionDigits,\n );\n }\n\n if (stat.format === \"percentage\") {\n return `${stat.rawValue.toFixed(percentageFractionDigits)}%`;\n }\n\n return stat.value;\n}\n\nconst colsClass = {\n 2: \"grid-cols-1 sm:grid-cols-2\",\n 3: \"grid-cols-1 sm:grid-cols-3\",\n 4: \"grid-cols-2 sm:grid-cols-4\",\n} as const;\n\n/** Renders the summary row component. */\nexport function SummaryRow({\n stats,\n columns = 4,\n onStatClick,\n formatValue,\n durationFractionDigits = 1,\n percentageFractionDigits = 1,\n loading = false,\n labels: customLabels,\n className,\n}: SummaryRowProps) {\n const labels = { ...defaultLabels, ...customLabels };\n\n if (loading) {\n return (\n <div\n className={cn(\"gap-group grid\", colsClass[columns], className)}\n data-opt-id=\"DA0AX\"\n data-opt-slug=\"summary-row.SummaryRow\"\n >\n {Array.from({ length: columns }).map((_, i) => (\n <SkeletonCard key={i} />\n ))}\n </div>\n );\n }\n\n if (stats.length === 0) {\n return (\n <div\n className={cn(\"flex min-h-40 items-center justify-center\", className)}\n data-opt-id=\"DA0AX\"\n data-opt-slug=\"summary-row.SummaryRow\"\n >\n <EmptyState\n title={labels.emptyTitle}\n description={labels.emptyDescription}\n />\n </div>\n );\n }\n\n return (\n <div\n className={cn(\"gap-group grid\", colsClass[columns], className)}\n data-opt-id=\"DA0AX\"\n data-opt-slug=\"summary-row.SummaryRow\"\n >\n {stats.map((s) => {\n const displayValue = formatValue\n ? formatValue(s)\n : formatByStatType(\n s,\n durationFractionDigits,\n percentageFractionDigits,\n );\n const card = (\n <StatCard\n key={s.id}\n id={s.id}\n title={s.title}\n value={displayValue}\n change={s.change}\n trend={s.trend}\n />\n );\n\n if (onStatClick) {\n return (\n <button\n key={s.id}\n type=\"button\"\n onClick={() => onStatClick(s)}\n className=\"rounded-lg text-left transition-transform hover:scale-[1.02] focus-visible:ring-2 focus-visible:ring-blue-600 focus-visible:ring-offset-2\"\n >\n {card}\n </button>\n );\n }\n\n return card;\n })}\n </div>\n );\n}\n\nSummaryRow.displayName = \"SummaryRow\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../lib/cn\";\nimport {\n SelectRoot,\n SelectTrigger,\n SelectPopover,\n SelectItem,\n} from \"../core/select\";\nimport { Button } from \"../core/button\";\n\n/** Defines the comparison option shape. */\nexport interface ComparisonOption {\n value: string;\n label: string;\n}\n\n/** Localized labels for the comparison selector component. */\nexport interface ComparisonSelectorLabels {\n groupLabel?: string;\n selectorA?: string;\n selectorB?: string;\n swap?: string;\n maxReached?: string;\n}\n\n/** Props for the comparison selector component. */\nexport interface ComparisonSelectorProps {\n segments: ComparisonOption[];\n valueA?: string;\n valueB?: string;\n onChangeA?: (value: string) => void;\n onChangeB?: (value: string) => void;\n /** Multi-select mode: selected values (overrides A/B selectors) */\n values?: string[];\n /** Called when multi-select values change */\n onValuesChange?: (values: string[]) => void;\n /** Maximum selectable items in multi-select mode (default: 5) */\n maxItems?: number;\n labels?: ComparisonSelectorLabels;\n className?: string;\n}\n\n/** Renders the comparison selector component. */\nexport function ComparisonSelector({\n segments,\n valueA,\n valueB,\n onChangeA,\n onChangeB,\n values,\n onValuesChange,\n maxItems = 5,\n labels: customLabels,\n className,\n}: ComparisonSelectorProps) {\n const selectorId = React.useId().replace(/:/g, \"\");\n const labels = {\n groupLabel: \"Comparison selector\",\n selectorA: \"Base\",\n selectorB: \"Compare\",\n swap: \"Swap\",\n maxReached: \"Max items reached\",\n ...customLabels,\n };\n\n const handleSwap = React.useCallback(() => {\n const a = valueA;\n const b = valueB;\n onChangeA?.(b ?? \"\");\n onChangeB?.(a ?? \"\");\n }, [valueA, valueB, onChangeA, onChangeB]);\n\n // Multi-select mode\n if (onValuesChange) {\n const selected = values ?? [];\n const atMax = selected.length >= maxItems;\n return (\n <div\n className={cn(\"gap-group flex flex-wrap items-center\", className)}\n role=\"group\"\n aria-label={labels.groupLabel}\n data-opt-id=\"2EH9H\"\n data-opt-slug=\"comparison-selector.ComparisonSelector\"\n >\n {segments.map((s) => {\n const isSelected = selected.includes(s.value);\n return (\n <button\n key={s.value}\n type=\"button\"\n onClick={() => {\n if (isSelected) {\n onValuesChange(selected.filter((v) => v !== s.value));\n } else if (!atMax) {\n onValuesChange([...selected, s.value]);\n }\n }}\n disabled={!isSelected && atMax}\n aria-pressed={isSelected}\n className={cn(\n \"rounded-full px-3 py-1.5 text-sm font-medium transition-colors\",\n isSelected\n ? \"bg-accent-subtle text-text-primary\"\n : \"bg-bg-subtle text-text-tertiary hover:text-text-secondary\",\n !isSelected && atMax && \"cursor-not-allowed opacity-50\",\n )}\n >\n {s.label}\n </button>\n );\n })}\n </div>\n );\n }\n\n const selectorALabelId = `${selectorId}-selector-a-label`;\n const selectorBLabelId = `${selectorId}-selector-b-label`;\n const selectorAValueId = `${selectorId}-selector-a-value`;\n const selectorBValueId = `${selectorId}-selector-b-value`;\n const selectorAText =\n segments.find((s) => s.value === valueA)?.label ?? \"Select…\";\n const selectorBText =\n segments.find((s) => s.value === valueB)?.label ?? \"Select…\";\n\n return (\n <div\n className={cn(\"gap-group flex items-end\", className)}\n role=\"group\"\n aria-label={labels.groupLabel}\n data-opt-id=\"2EH9H\"\n data-opt-slug=\"comparison-selector.ComparisonSelector\"\n >\n {/* Selector A */}\n <div className=\"flex flex-col gap-1.5\">\n <span\n id={selectorALabelId}\n className=\"text-text-tertiary text-xs font-medium\"\n >\n {labels.selectorA}\n </span>\n <SelectRoot\n value={valueA}\n onValueChange={(v) => onChangeA?.(v as string)}\n >\n <SelectTrigger\n aria-labelledby={`${selectorALabelId} ${selectorAValueId}`}\n className=\"min-w-[140px]\"\n >\n <span id={selectorAValueId}>{selectorAText}</span>\n </SelectTrigger>\n <SelectPopover>\n {segments.map((s) => (\n <SelectItem key={s.value} value={s.value}>\n {s.label}\n </SelectItem>\n ))}\n </SelectPopover>\n </SelectRoot>\n </div>\n\n {/* Swap button */}\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={handleSwap}\n aria-label={labels.swap}\n className=\"mb-0.5\"\n >\n ⇄\n </Button>\n\n {/* Selector B */}\n <div className=\"flex flex-col gap-1.5\">\n <span\n id={selectorBLabelId}\n className=\"text-text-tertiary text-xs font-medium\"\n >\n {labels.selectorB}\n </span>\n <SelectRoot\n value={valueB}\n onValueChange={(v) => onChangeB?.(v as string)}\n >\n <SelectTrigger\n aria-labelledby={`${selectorBLabelId} ${selectorBValueId}`}\n className=\"min-w-[140px]\"\n >\n <span id={selectorBValueId}>{selectorBText}</span>\n </SelectTrigger>\n <SelectPopover>\n {segments.map((s) => (\n <SelectItem key={s.value} value={s.value}>\n {s.label}\n </SelectItem>\n ))}\n </SelectPopover>\n </SelectRoot>\n </div>\n </div>\n );\n}\n\nComparisonSelector.displayName = \"ComparisonSelector\";\n","/**\n * presets/index.ts\n *\n * Single registry of theme preset metadata. Each entry pairs a stable id\n * (used in `<html data-theme>` and localStorage) with display metadata and an\n * optional `PaletteConfig` that approximates the preset's seed for the\n * ThemeSwitcher swatch row and \"clone to custom\" workflow.\n *\n * Token values themselves currently live in the sibling `*.css` files. A\n * follow-up sub-phase will migrate the full token tables into this file and\n * have a codegen step emit the CSS, but the metadata layer is enough to\n * unblock dynamic ThemeSwitcher rendering and type-safe preset id unions.\n */\n\nimport type { PaletteConfig } from \"@reopt-ai/opt-palette\";\n\nexport interface ThemeDescriptor {\n /** Stable id used in `<html data-theme=\"...\">` and localStorage. */\n readonly id: string;\n /** Human-readable label shown in ThemeSwitcher. */\n readonly label: string;\n /** Short description shown under the label. */\n readonly description: string;\n /**\n * Optional engine input that approximates this preset. Used by\n * ThemeSwitcher to derive swatches when `switcherSwatches` is omitted, and\n * as the starting point when a user clones a preset into a custom palette.\n * Codegen does NOT consume this in the current phase — the static `*.css`\n * file remains the source of token values.\n */\n readonly palette?: PaletteConfig;\n /**\n * Three CSS color strings for the ThemeSwitcher swatch row. Falls back to\n * the live `--opt-accent` / `--opt-surface` / `--opt-text` tokens when\n * omitted.\n */\n readonly switcherSwatches?: readonly [string, string, string];\n /** Disable dark variant generation entirely. */\n readonly forceLightOnly?: boolean;\n}\n\nconst DEFAULT_DESCRIPTOR: ThemeDescriptor = {\n id: \"default\",\n label: \"Default\",\n description: \"Blue accent, balanced radius & shadow\",\n palette: {\n seed: \"#2563eb\",\n harmony: \"split-complementary\",\n radiusScale: \"medium\",\n shadowIntensity: \"subtle\",\n neutralTemperature: \"cool\",\n },\n switcherSwatches: [\"hsl(221 83% 53%)\", \"hsl(142 71% 45%)\", \"hsl(38 92% 50%)\"],\n};\n\nconst MINIMAL_DESCRIPTOR: ThemeDescriptor = {\n id: \"minimal\",\n label: \"Minimal\",\n description: \"Monochrome, no shadow, sharp edges\",\n palette: {\n seed: \"#333333\",\n harmony: \"analogous\",\n radiusScale: \"sharp\",\n shadowIntensity: \"none\",\n neutralTemperature: \"cool\",\n },\n switcherSwatches: [\"hsl(0 0% 20%)\", \"hsl(0 0% 45%)\", \"hsl(0 0% 70%)\"],\n};\n\nconst NATURAL_DESCRIPTOR: ThemeDescriptor = {\n id: \"natural\",\n label: \"Natural\",\n description: \"Always light — sage accent, warm cream\",\n forceLightOnly: true,\n palette: {\n seed: \"#5a9376\",\n harmony: \"complementary\",\n radiusScale: \"medium\",\n shadowIntensity: \"subtle\",\n neutralTemperature: \"warm\",\n },\n switcherSwatches: [\"hsl(155 38% 45%)\", \"hsl(25 65% 55%)\", \"hsl(45 75% 50%)\"],\n};\n\nconst PRO_DESCRIPTOR: ThemeDescriptor = {\n id: \"pro\",\n label: \"Pro\",\n description: \"Neon blue accent, mono headings, ultra-dense\",\n palette: {\n seed: \"#0080ff\",\n harmony: \"tetradic\",\n radiusScale: \"sharp\",\n shadowIntensity: \"subtle\",\n neutralTemperature: \"cool\",\n },\n switcherSwatches: [\n \"hsl(210 100% 55%)\",\n \"hsl(170 90% 48%)\",\n \"hsl(290 85% 60%)\",\n ],\n};\n\nconst MONO_DARK_DESCRIPTOR: ThemeDescriptor = {\n id: \"mono-dark\",\n label: \"Mono Dark\",\n description: \"OLED-friendly black, neon cyan accent, mono headings\",\n palette: {\n seed: \"#00d4ff\",\n harmony: \"tetradic\",\n radiusScale: \"sharp\",\n shadowIntensity: \"subtle\",\n neutralTemperature: \"cool\",\n },\n switcherSwatches: [\"hsl(190 100% 50%)\", \"hsl(0 0% 8%)\", \"hsl(280 90% 65%)\"],\n};\n\nexport const THEME_REGISTRY = {\n default: DEFAULT_DESCRIPTOR,\n minimal: MINIMAL_DESCRIPTOR,\n natural: NATURAL_DESCRIPTOR,\n pro: PRO_DESCRIPTOR,\n \"mono-dark\": MONO_DARK_DESCRIPTOR,\n} as const satisfies Record<string, ThemeDescriptor>;\n\n/** Compile-time-derived union of registered preset ids. */\nexport type ThemePresetId = keyof typeof THEME_REGISTRY;\n\n/** All registered preset ids in declaration order. */\nexport const THEME_PRESET_IDS = Object.keys(THEME_REGISTRY) as ThemePresetId[];\n\n/** Look up a descriptor by id. Returns `undefined` for unknown ids. */\nexport function getThemeDescriptor(id: string): ThemeDescriptor | undefined {\n return (THEME_REGISTRY as Record<string, ThemeDescriptor>)[id];\n}\n\n/** Type guard for a known preset id. */\nexport function isThemePresetId(id: string): id is ThemePresetId {\n return id in THEME_REGISTRY;\n}\n\n/** Preset ids that suppress dark mode generation. */\nexport const FORCE_LIGHT_PRESET_IDS: ReadonlySet<ThemePresetId> = new Set(\n THEME_PRESET_IDS.filter((id) => THEME_REGISTRY[id].forceLightOnly),\n);\n\n/**\n * Map from removed preset ids to the closest surviving preset. Boot script and\n * `readStoredTheme` consult this so users with persisted `corporate`/`playful`\n * values silently land on a working preset on next page load instead of\n * showing the global default fallback for an unknown id.\n *\n * Keep this around indefinitely — localStorage values are forever and the\n * cost of two extra entries is negligible.\n */\nexport const DEPRECATED_PRESET_MIGRATIONS: Readonly<\n Record<string, ThemePresetId>\n> = Object.freeze({\n corporate: \"default\",\n playful: \"default\",\n});\n\n/**\n * Resolve a possibly-deprecated preset id to a registered one. Returns the\n * input unchanged when it is already valid; returns the migration target when\n * it is a known deprecated id; returns `null` when the id is unknown\n * altogether (caller should fall back to its default).\n */\nexport function migrateDeprecatedPresetId(\n id: string | null | undefined,\n): ThemePresetId | null {\n if (!id) return null;\n if (isThemePresetId(id)) return id;\n if (id in DEPRECATED_PRESET_MIGRATIONS) {\n return DEPRECATED_PRESET_MIGRATIONS[id]!;\n }\n return null;\n}\n","/**\n * theme-types.ts\n *\n * Discriminated union covering every way a consumer can describe a theme:\n * a registered preset id, an inline `PaletteConfig` to feed the engine, or\n * a fully formed `ThemeDescriptor`. Shared by `OptThemeProvider` and\n * `ShellProvider` so generated themes built in the harness layer can be\n * promoted into the global tree without translation.\n */\n\nimport type { OptTokenName, PaletteConfig } from \"@reopt-ai/opt-palette\";\nimport type { ThemeDescriptor, ThemePresetId } from \"./presets\";\n\n/**\n * Sparse token overrides applied on top of the resolved theme. `light` and\n * `dark` apply only to that mode; `shared` applies to both (handy for\n * typography or radius tokens that should not invert).\n */\nexport interface ThemeOverrides {\n light?: Record<string, string>;\n dark?: Record<string, string>;\n shared?: Record<string, string>;\n}\n\n/** Canonical, typo-safe token map for authored product theme overrides. */\nexport type CanonicalThemeTokenMap = Partial<Record<OptTokenName, string>>;\n\n/** Mode-aware overrides restricted to the canonical token catalog. */\nexport interface CanonicalThemeOverrides {\n light?: CanonicalThemeTokenMap;\n dark?: CanonicalThemeTokenMap;\n shared?: CanonicalThemeTokenMap;\n}\n\n/**\n * Author canonical theme overrides with token-name autocomplete.\n * ThemeOverrides remains broad for backward compatibility with older custom\n * variables; new themes should use this helper as the governed entry point.\n */\nexport function defineThemeOverrides(\n overrides: CanonicalThemeOverrides,\n): CanonicalThemeOverrides {\n return overrides;\n}\n\n/** Reference an entry of `THEME_REGISTRY` by id. */\nexport interface PresetThemeSpec {\n kind: \"preset\";\n preset: ThemePresetId;\n overrides?: ThemeOverrides;\n}\n\n/**\n * Inline `PaletteConfig` consumed by the opt-palette engine to produce a\n * canonical token palette at runtime.\n */\nexport interface GeneratedThemeSpec {\n kind: \"generated\";\n /** Stable id used in `<html data-theme>` and the `<style>` selector. */\n id?: string;\n label?: string;\n palette: PaletteConfig;\n overrides?: ThemeOverrides;\n forceLightOnly?: boolean;\n}\n\n/** Pass an already-built `ThemeDescriptor`. */\nexport interface DescriptorThemeSpec {\n kind: \"descriptor\";\n descriptor: ThemeDescriptor;\n overrides?: ThemeOverrides;\n}\n\n/** Discriminated union covering every supported way to describe a theme. */\nexport type ThemeSpec =\n | PresetThemeSpec\n | GeneratedThemeSpec\n | DescriptorThemeSpec;\n\n/** Construct a `PresetThemeSpec` — convenience for the common case. */\nexport function presetTheme(\n preset: ThemePresetId,\n overrides?: ThemeOverrides,\n): PresetThemeSpec {\n return overrides\n ? { kind: \"preset\", preset, overrides }\n : { kind: \"preset\", preset };\n}\n\n/** Construct a `GeneratedThemeSpec` from an inline `PaletteConfig`. */\nexport function generatedTheme(\n palette: PaletteConfig,\n options?: Omit<GeneratedThemeSpec, \"kind\" | \"palette\">,\n): GeneratedThemeSpec {\n return { kind: \"generated\", palette, ...options };\n}\n\n/** True when `spec` references a registered preset id. */\nexport function isPresetSpec(spec: ThemeSpec): spec is PresetThemeSpec {\n return spec.kind === \"preset\";\n}\n/** True when `spec` carries an inline `PaletteConfig`. */\nexport function isGeneratedSpec(spec: ThemeSpec): spec is GeneratedThemeSpec {\n return spec.kind === \"generated\";\n}\n/** True when `spec` wraps a fully-formed `ThemeDescriptor`. */\nexport function isDescriptorSpec(spec: ThemeSpec): spec is DescriptorThemeSpec {\n return spec.kind === \"descriptor\";\n}\n\n/**\n * Resolve a `ThemeSpec` down to a single descriptor + overrides pair. The\n * returned descriptor is always sourced from the registry or the spec itself —\n * the caller is responsible for engine-driven token generation when the\n * descriptor only carries a `palette`.\n */\nexport interface ResolvedThemeSpec {\n descriptor: ThemeDescriptor;\n overrides?: ThemeOverrides;\n}\n","/**\n * theme-serialize.ts\n *\n * Pure helpers that turn a `ThemeSpec` into the artifacts the runtime needs:\n * resolved descriptor + mode, computed token maps for generated palettes, and\n * `<style>` CSS strings ready to be injected into `<head>`.\n *\n * Kept side-effect free so the boot script and the provider can share the\n * same logic without dragging React into the client bundle's critical path.\n */\n\nimport {\n generatePalette,\n type PaletteConfig,\n type GeneratedPalette,\n} from \"@reopt-ai/opt-palette\";\nimport {\n THEME_REGISTRY,\n isThemePresetId,\n type ThemeDescriptor,\n type ThemePresetId,\n} from \"./presets\";\nimport {\n isDescriptorSpec,\n isGeneratedSpec,\n isPresetSpec,\n type GeneratedThemeSpec,\n type ThemeOverrides,\n type ThemeSpec,\n} from \"./theme-types\";\n\n/** Element id used for the global generated theme style tag. */\nexport const GLOBAL_THEME_STYLE_ID = \"opt-global-theme\";\n\n/** localStorage key for the persisted ThemeSpec (generated mode). */\nexport const THEME_SPEC_STORAGE_KEY = \"opt-theme-spec\";\n\n/**\n * localStorage key for the cached, pre-serialized token maps that match the\n * spec under `THEME_SPEC_STORAGE_KEY`. The boot script reads this directly so\n * it can inline tokens without invoking opt-palette at startup.\n */\nexport const THEME_TOKENS_STORAGE_KEY = \"opt-theme-tokens\";\n\n/** Stable id used for unnamed generated themes. */\nexport const GENERATED_THEME_ID_DEFAULT = \"generated\";\n\n/** Cached token maps keyed by spec hash. Lazy-built per process. */\nconst generatedCache = new Map<string, GeneratedPalette>();\n\n/** Build a stable cache key for a `PaletteConfig`. */\nfunction paletteCacheKey(config: PaletteConfig): string {\n return JSON.stringify(config);\n}\n\n/** Run opt-palette with caching. */\nexport function generatePaletteCached(config: PaletteConfig): GeneratedPalette {\n const key = paletteCacheKey(config);\n let cached = generatedCache.get(key);\n if (!cached) {\n cached = generatePalette(config);\n generatedCache.set(key, cached);\n }\n return cached;\n}\n\n/** Apply sparse override maps onto a base token record. */\nfunction applyOverrides(\n base: Record<string, string>,\n overrides: ThemeOverrides | undefined,\n mode: \"light\" | \"dark\",\n): Record<string, string> {\n if (!overrides) return base;\n const merged: Record<string, string> = { ...base };\n if (overrides.shared) Object.assign(merged, overrides.shared);\n const modeOverrides = mode === \"light\" ? overrides.light : overrides.dark;\n if (modeOverrides) Object.assign(merged, modeOverrides);\n return merged;\n}\n\n/**\n * Stable id used in `<html data-theme>` and the `<style>` selector.\n * - preset → the preset id (force-light) or `${id}` / `${id}-dark`\n * - generated → `spec.id ?? \"generated\"` with `-dark` suffix when applicable\n * - descriptor → `descriptor.id` with same suffix logic\n */\nexport function getCompoundIdForSpec(\n spec: ThemeSpec,\n resolvedMode: \"light\" | \"dark\",\n forceLightOnly: boolean,\n): string {\n const baseId = baseIdFor(spec);\n if (forceLightOnly) return baseId;\n return resolvedMode === \"dark\" ? `${baseId}-dark` : baseId;\n}\n\nfunction baseIdFor(spec: ThemeSpec): string {\n if (isPresetSpec(spec)) return spec.preset;\n if (isDescriptorSpec(spec)) return spec.descriptor.id;\n return spec.id ?? GENERATED_THEME_ID_DEFAULT;\n}\n\n/** Whether the given spec emits dark variants at all. */\nexport function isForceLightSpec(spec: ThemeSpec): boolean {\n if (isPresetSpec(spec)) {\n const desc = THEME_REGISTRY[spec.preset];\n return desc?.forceLightOnly === true;\n }\n if (isDescriptorSpec(spec)) return spec.descriptor.forceLightOnly === true;\n return spec.forceLightOnly === true;\n}\n\n/** Computed token bundle for a generated theme. `dark` is `null` when force-light. */\nexport interface GeneratedTokens {\n id: string;\n light: Record<string, string>;\n dark: Record<string, string> | null;\n}\n\n/**\n * Compute the inline tokens for a `GeneratedThemeSpec` or\n * `DescriptorThemeSpec` whose descriptor carries a `palette`. Returns `null`\n * for preset specs (their tokens live in the static CSS files).\n */\nexport function computeGeneratedTokens(\n spec: ThemeSpec,\n): GeneratedTokens | null {\n if (isPresetSpec(spec)) return null;\n\n let palette: PaletteConfig | undefined;\n let overrides: ThemeOverrides | undefined;\n let id: string;\n let forceLight: boolean;\n\n if (isGeneratedSpec(spec)) {\n palette = spec.palette;\n overrides = spec.overrides;\n id = spec.id ?? GENERATED_THEME_ID_DEFAULT;\n forceLight = spec.forceLightOnly === true;\n } else {\n // descriptor spec\n palette = spec.descriptor.palette;\n overrides = spec.overrides;\n id = spec.descriptor.id;\n forceLight = spec.descriptor.forceLightOnly === true;\n }\n\n if (!palette) return null;\n\n const generated = generatePaletteCached(palette);\n return {\n id,\n light: applyOverrides(generated.light, overrides, \"light\"),\n dark: forceLight ? null : applyOverrides(generated.dark, overrides, \"dark\"),\n };\n}\n\n/**\n * Serialize a token record into a CSS rule body — `--name:value;...` — without\n * surrounding selector or braces. Values are not escaped; callers are\n * responsible for trusted input. Boot script and provider both rely on this\n * shape.\n */\nexport function serializeTokenBody(tokens: Record<string, string>): string {\n return Object.entries(tokens)\n .map(([k, v]) => `${k}:${v}`)\n .join(\";\");\n}\n\n/**\n * Build a CSS rule scoped to `[data-theme=\"<id>\"]`.\n */\nexport function serializeThemeRule(\n themeId: string,\n tokens: Record<string, string>,\n): string {\n return `[data-theme=\"${themeId}\"]{${serializeTokenBody(tokens)}}`;\n}\n\n/**\n * Build the full CSS for a generated theme style tag — covers light + dark\n * selectors based on the computed tokens. Caller chooses the id used in\n * the selector (typically the spec base id).\n */\nexport function serializeGeneratedTheme(tokens: GeneratedTokens): string {\n const { id, light, dark } = tokens;\n let css = serializeThemeRule(id, light);\n if (dark) {\n css += serializeThemeRule(`${id}-dark`, dark);\n }\n return css;\n}\n\n/**\n * Resolve a spec into its descriptor counterpart. Preset specs map to\n * `THEME_REGISTRY[preset]`. Generated specs are wrapped into a synthetic\n * descriptor so callers can treat them uniformly.\n */\nexport function resolveDescriptor(spec: ThemeSpec): ThemeDescriptor {\n if (isPresetSpec(spec)) {\n const desc = THEME_REGISTRY[spec.preset];\n if (!desc) {\n throw new Error(\n `[opt-ui] Unknown theme preset id: \"${spec.preset}\". ` +\n `Registered ids: ${Object.keys(THEME_REGISTRY).join(\", \")}`,\n );\n }\n return desc;\n }\n if (isDescriptorSpec(spec)) return spec.descriptor;\n return generatedSpecToDescriptor(spec);\n}\n\nfunction generatedSpecToDescriptor(spec: GeneratedThemeSpec): ThemeDescriptor {\n return {\n id: spec.id ?? GENERATED_THEME_ID_DEFAULT,\n label: spec.label ?? \"Custom\",\n description: \"Generated theme\",\n palette: spec.palette,\n forceLightOnly: spec.forceLightOnly,\n };\n}\n\n/**\n * Validate a `ThemeSpec` parsed from localStorage. Returns the spec on\n * success or `null` if any required field is missing or the preset id is\n * unknown. Defensive parsing — never throws.\n */\nexport function safeParseStoredSpec(json: string | null): ThemeSpec | null {\n if (!json) return null;\n try {\n const parsed = JSON.parse(json) as Partial<ThemeSpec> & {\n kind?: unknown;\n };\n if (!parsed || typeof parsed !== \"object\" || !(\"kind\" in parsed)) {\n return null;\n }\n if (parsed.kind === \"preset\") {\n const preset = (parsed as { preset?: unknown }).preset;\n if (typeof preset !== \"string\" || !isThemePresetId(preset)) return null;\n return { kind: \"preset\", preset } as ThemeSpec;\n }\n if (parsed.kind === \"generated\") {\n const palette = (parsed as { palette?: unknown }).palette;\n if (!isPaletteConfig(palette)) return null;\n const out: GeneratedThemeSpec = {\n kind: \"generated\",\n palette,\n id: typeof parsed.id === \"string\" ? parsed.id : undefined,\n label: typeof parsed.label === \"string\" ? parsed.label : undefined,\n forceLightOnly: parsed.forceLightOnly === true,\n overrides: isObjectMap(parsed.overrides)\n ? (parsed.overrides as ThemeOverrides)\n : undefined,\n };\n return out;\n }\n return null;\n } catch {\n return null;\n }\n}\n\nfunction isObjectMap(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction isPaletteConfig(value: unknown): value is PaletteConfig {\n if (!isObjectMap(value)) return false;\n const v = value as Partial<PaletteConfig>;\n return (\n typeof v.seed === \"string\" &&\n typeof v.harmony === \"string\" &&\n typeof v.radiusScale === \"string\" &&\n typeof v.shadowIntensity === \"string\" &&\n typeof v.neutralTemperature === \"string\"\n );\n}\n\n/** Cached token payload as written to `opt-theme-tokens`. */\nexport interface StoredTokenCache {\n id: string;\n light: Record<string, string>;\n dark?: Record<string, string>;\n}\n\n/**\n * Parse the cached token payload from localStorage. Returns `null` on any\n * shape mismatch — caller will recompute from the spec.\n */\nexport function safeParseStoredTokens(\n json: string | null,\n): StoredTokenCache | null {\n if (!json) return null;\n try {\n const parsed = JSON.parse(json) as Partial<StoredTokenCache>;\n if (\n !parsed ||\n typeof parsed.id !== \"string\" ||\n !isObjectMap(parsed.light)\n ) {\n return null;\n }\n return {\n id: parsed.id,\n light: parsed.light as Record<string, string>,\n dark: isObjectMap(parsed.dark)\n ? (parsed.dark as Record<string, string>)\n : undefined,\n };\n } catch {\n return null;\n }\n}\n\n/** Build the storage payload that pairs with `opt-theme-spec`. */\nexport function buildTokenCache(tokens: GeneratedTokens): StoredTokenCache {\n return {\n id: tokens.id,\n light: tokens.light,\n dark: tokens.dark ?? undefined,\n };\n}\n\n/** Strip caches — used by tests and when switching back to a preset spec. */\nexport function clearGeneratedCache(): void {\n generatedCache.clear();\n}\n\n/** Re-export descriptor lookups for consumers of the serializer. */\nexport { THEME_REGISTRY, isThemePresetId };\nexport type { ThemePresetId };\n","import {\n DEPRECATED_PRESET_MIGRATIONS,\n FORCE_LIGHT_PRESET_IDS,\n THEME_PRESET_IDS,\n migrateDeprecatedPresetId,\n type ThemePresetId,\n} from \"./presets\";\nimport {\n GLOBAL_THEME_STYLE_ID,\n THEME_SPEC_STORAGE_KEY,\n THEME_TOKENS_STORAGE_KEY,\n} from \"./theme-serialize\";\n\n/**\n * Registered preset id list. Preferred for runtime iteration.\n * @deprecated Prefer `THEME_PRESET_IDS` from `./presets`.\n */\nexport const THEME_PRESET_VALUES: readonly ThemePresetId[] = THEME_PRESET_IDS;\n\n/** Theme preset id — alias of `ThemePresetId` from the registry. */\nexport type ThemePreset = ThemePresetId;\n\nexport const THEME_MODE_VALUES = [\"light\", \"dark\", \"system\"] as const;\n/** Type definition for theme mode. */\nexport type ThemeMode = (typeof THEME_MODE_VALUES)[number];\n\n/** Runtime constraints for apps that expose only a subset of opt-ui theming. */\nexport interface ThemeRuntimeOptions {\n /**\n * Force the root theme to one preset regardless of stored preset/generated\n * theme state. Mode is still resolved normally unless constrained.\n */\n lockedPreset?: ThemePreset;\n /**\n * Restrict mode reads/writes to a smaller set, e.g. `[\"light\", \"dark\"]`.\n * The first value becomes the fallback when the stored/default mode is not\n * allowed.\n */\n allowedModes?: readonly ThemeMode[];\n}\n\n/**\n * Compound theme value applied to `<html data-theme>`. Derived from the\n * registered preset ids: `<id>` (light) or `<id>-dark` (dark). Force-light\n * presets only emit the bare id form.\n */\nexport type CompoundTheme = `${ThemePreset}` | `${ThemePreset}-dark`;\n\nexport const LEGACY_THEME_STORAGE_KEY = \"opt-theme\";\nexport const THEME_PRESET_STORAGE_KEY = \"opt-preset\";\nexport const THEME_MODE_STORAGE_KEY = \"opt-mode\";\nexport const DARK_MQ = \"(prefers-color-scheme: dark)\";\n\n/**\n * Presets that force light mode regardless of system dark/light preference.\n * Mirrors `FORCE_LIGHT_PRESET_IDS` from `./presets` — kept as alias for\n * existing imports.\n */\nexport const FORCE_LIGHT_PRESETS: ReadonlySet<ThemePreset> =\n FORCE_LIGHT_PRESET_IDS;\n\n/** All valid compound theme names. Useful for static enumeration. */\nexport const ALL_COMPOUND_THEMES: CompoundTheme[] = THEME_PRESET_IDS.flatMap(\n (id) =>\n FORCE_LIGHT_PRESET_IDS.has(id)\n ? [id satisfies CompoundTheme]\n : [id satisfies CompoundTheme, `${id}-dark` satisfies CompoundTheme],\n);\n\ninterface ThemeStorageReader {\n getItem(key: string): string | null;\n}\n\ninterface ThemeStorageMutator extends ThemeStorageReader {\n setItem(key: string, value: string): void;\n removeItem(key: string): void;\n}\n\nfunction hasStorageMutation(\n storage: ThemeStorageReader,\n): storage is ThemeStorageMutator {\n return (\n typeof (storage as ThemeStorageMutator).setItem === \"function\" &&\n typeof (storage as ThemeStorageMutator).removeItem === \"function\"\n );\n}\n\n/** Handles is theme preset. */\nexport function isThemePreset(value: string | null): value is ThemePreset {\n return (\n typeof value === \"string\" &&\n THEME_PRESET_VALUES.includes(value as ThemePreset)\n );\n}\n\n/** Handles is theme mode. */\nexport function isThemeMode(value: string | null): value is ThemeMode {\n return (\n typeof value === \"string\" && THEME_MODE_VALUES.includes(value as ThemeMode)\n );\n}\n\n/** Compute compound theme name from preset + resolved mode. */\nexport function getCompoundTheme(\n preset: ThemePreset,\n resolvedMode: \"light\" | \"dark\",\n): CompoundTheme {\n if (FORCE_LIGHT_PRESETS.has(preset)) return preset as CompoundTheme;\n return (resolvedMode === \"dark\" ? `${preset}-dark` : preset) as CompoundTheme;\n}\n\n/** Handles resolve theme mode. */\nexport function resolveThemeMode(\n preset: ThemePreset,\n mode: ThemeMode,\n systemDark: boolean,\n): \"light\" | \"dark\" {\n if (FORCE_LIGHT_PRESETS.has(preset)) return \"light\";\n if (mode === \"system\") return systemDark ? \"dark\" : \"light\";\n return mode;\n}\n\n/** Handles read stored theme. */\nexport function readStoredTheme(\n storage: ThemeStorageReader,\n defaultPreset: ThemePreset,\n defaultMode: ThemeMode,\n options: { migrateLegacy?: boolean } = {},\n): { preset: ThemePreset; mode: ThemeMode } {\n const legacy = storage.getItem(LEGACY_THEME_STORAGE_KEY);\n const storedPreset = storage.getItem(THEME_PRESET_STORAGE_KEY);\n const storedMode = storage.getItem(THEME_MODE_STORAGE_KEY);\n\n let preset = defaultPreset;\n // Legacy `opt-theme` key — migrate to `opt-preset` when valid (or deprecated).\n if (typeof legacy === \"string\") {\n const migratedLegacy = migrateDeprecatedPresetId(legacy);\n if (migratedLegacy) {\n if (options.migrateLegacy && hasStorageMutation(storage)) {\n storage.setItem(THEME_PRESET_STORAGE_KEY, migratedLegacy);\n storage.removeItem(LEGACY_THEME_STORAGE_KEY);\n }\n preset = migratedLegacy;\n }\n } else if (typeof storedPreset === \"string\") {\n const migrated = migrateDeprecatedPresetId(storedPreset);\n if (migrated) {\n preset = migrated;\n // If the stored value was a deprecated id, silently rewrite it to the\n // migration target so the next read is a hit on the registered id.\n if (\n hasStorageMutation(storage) &&\n migrated !== storedPreset &&\n storedPreset in DEPRECATED_PRESET_MIGRATIONS\n ) {\n storage.setItem(THEME_PRESET_STORAGE_KEY, migrated);\n }\n }\n }\n\n const mode = isThemeMode(storedMode) ? storedMode : defaultMode;\n return { preset, mode };\n}\n\n/** Normalize a mode against an optional allowed-mode list. */\nexport function coerceThemeMode(\n mode: ThemeMode,\n allowedModes: readonly ThemeMode[] | undefined,\n fallback: ThemeMode = \"system\",\n): ThemeMode {\n if (!allowedModes || allowedModes.length === 0) return mode;\n if (allowedModes.includes(mode)) return mode;\n if (allowedModes.includes(fallback)) return fallback;\n return allowedModes[0] ?? fallback;\n}\n\n/**\n * Build the inline `<head>` boot script that paints the correct theme before\n * React mounts. Two paths:\n *\n * 1. **Generated** — when both `opt-theme-spec` (kind: \"generated\") and\n * `opt-theme-tokens` are present and well-formed, a `<style id=\"…\">` tag\n * is inserted with the cached tokens and `<html data-theme>` is set to the\n * generated id (with optional `-dark` suffix). This bypasses opt-palette\n * at startup so first paint is instant.\n * 2. **Preset (legacy)** — falls through to the existing preset selector,\n * including legacy `opt-theme` → `opt-preset` migration.\n *\n * Returned as a single minified line; intended for `dangerouslySetInnerHTML`.\n */\nexport function createThemeBootScript(\n defaultPreset: ThemePreset = \"default\",\n defaultMode: ThemeMode = \"system\",\n options: ThemeRuntimeOptions = {},\n): string {\n const presetValues = JSON.stringify(THEME_PRESET_VALUES);\n const modeValues = JSON.stringify(THEME_MODE_VALUES);\n const allowedModes = options.allowedModes?.length\n ? options.allowedModes\n : THEME_MODE_VALUES;\n const allowedModeValues = JSON.stringify(allowedModes);\n const forceLightPresets = JSON.stringify(Array.from(FORCE_LIGHT_PRESETS));\n const deprecatedMap = JSON.stringify(DEPRECATED_PRESET_MIGRATIONS);\n const lockedPreset = options.lockedPreset;\n const resolvedDefaultPreset = lockedPreset ?? defaultPreset;\n const defaultPresetLiteral = JSON.stringify(resolvedDefaultPreset);\n const defaultModeLiteral = JSON.stringify(\n coerceThemeMode(defaultMode, allowedModes, allowedModes[0] ?? \"system\"),\n );\n const lockedPresetLiteral = JSON.stringify(lockedPreset ?? null);\n const styleId = JSON.stringify(GLOBAL_THEME_STYLE_ID);\n const specKey = JSON.stringify(THEME_SPEC_STORAGE_KEY);\n const tokensKey = JSON.stringify(THEME_TOKENS_STORAGE_KEY);\n const presetKey = JSON.stringify(THEME_PRESET_STORAGE_KEY);\n const modeKey = JSON.stringify(THEME_MODE_STORAGE_KEY);\n const legacyKey = JSON.stringify(LEGACY_THEME_STORAGE_KEY);\n const darkMq = JSON.stringify(DARK_MQ);\n\n // Multi-line for readability here; collapsed on emit.\n // `mp(v)` resolves a stored preset id: returns the value itself when\n // registered, the migration target when deprecated, or null otherwise.\n const source = `\ntry {\n var pv=${presetValues},mv=${modeValues},am=${allowedModeValues},fp=${forceLightPresets},dm=${deprecatedMap},lk=${lockedPresetLiteral};\n function mp(v){if(typeof v!==\"string\")return null;if(pv.indexOf(v)>=0)return v;return Object.prototype.hasOwnProperty.call(dm,v)?dm[v]:null;}\n var p=${defaultPresetLiteral};\n if(!lk){\n var lp=localStorage.getItem(${legacyKey}),sp=localStorage.getItem(${presetKey});\n var lpm=mp(lp),spm=mp(sp);\n p=lpm||spm||${defaultPresetLiteral};\n if(lpm){localStorage.setItem(${presetKey},lpm);localStorage.removeItem(${legacyKey});}\n else if(sp&&spm&&sp!==spm){localStorage.setItem(${presetKey},spm);}\n }\n var sm=localStorage.getItem(${modeKey});\n var m=(typeof sm===\"string\"&&mv.indexOf(sm)>=0&&am.indexOf(sm)>=0)?sm:${defaultModeLiteral};\n var spec=null,tk=null;\n if(!lk){try{var sj=localStorage.getItem(${specKey});if(sj)spec=JSON.parse(sj);}catch(e){}}\n if(!lk){try{var tj=localStorage.getItem(${tokensKey});if(tj)tk=JSON.parse(tj);}catch(e){}}\n if(!lk&&spec&&spec.kind===\"generated\"&&tk&&typeof tk.id===\"string\"&&tk.light&&typeof tk.light===\"object\"){\n var fld=spec.forceLightOnly===true;\n var dk=!fld&&(m===\"dark\"||(m===\"system\"&&matchMedia(${darkMq}).matches));\n var tt=(dk&&tk.dark)?tk.dark:tk.light;\n var cid=(dk&&tk.dark)?(tk.id+\"-dark\"):tk.id;\n var css=\"\";\n for(var k in tt){if(Object.prototype.hasOwnProperty.call(tt,k))css+=k+\":\"+tt[k]+\";\"}\n var st=document.getElementById(${styleId});\n if(!st){st=document.createElement(\"style\");st.id=${styleId};document.head.appendChild(st);}\n st.textContent='[data-theme=\"'+cid+'\"]{'+css+'}';\n document.documentElement.setAttribute(\"data-theme\",cid);\n } else {\n var d=fp.indexOf(p)<0&&(m===\"dark\"||(m===\"system\"&&matchMedia(${darkMq}).matches));\n document.documentElement.setAttribute(\"data-theme\",d?p+\"-dark\":p);\n }\n} catch(e){}`;\n\n // Collapse leading newlines + indentation. Safe because all string\n // literals in the source are double-quoted with no embedded newlines.\n return source.replace(/\\n\\s*/g, \"\");\n}\n","\"use client\";\n\nimport { createContext, useContext } from \"react\";\nimport type { ThemeSpec } from \"./theme-types\";\n\n/** A single entry on the theme promotion stack. */\nexport interface ThemeStackEntry {\n /** Stable owner id (e.g. harness id) — used to dedupe and pop. */\n id: string;\n /** Spec the owner wants applied while it is mounted. */\n spec: ThemeSpec;\n}\n\n/**\n * Imperative API exposed by `OptThemeProvider` to descendants that want to\n * temporarily override the global theme without owning persistence (e.g. the\n * harness builder previewing a generated palette).\n *\n * Contract:\n * - `pushTheme(id, spec)` re-pushes (replacing) any existing entry with the\n * same id, preserving stack order otherwise.\n * - `popTheme(id)` removes the entry with the given id, no-op if absent.\n * - The top of the stack wins. When the stack is empty the provider falls\n * back to its `controlledTheme` prop, then to its persisted state.\n */\nexport interface OptThemeController {\n pushTheme: (id: string, spec: ThemeSpec) => void;\n popTheme: (id: string) => void;\n}\n\nexport const OptThemeControllerContext =\n createContext<OptThemeController | null>(null);\n\n/**\n * Reads the controller exposed by the nearest `OptThemeProvider`. Returns\n * `null` when used outside a provider — callers should treat that as \"no\n * promotion available\" and behave as if scope === \"override\".\n */\nexport function useOptThemeController(): OptThemeController | null {\n return useContext(OptThemeControllerContext);\n}\n","\"use client\";\n\nimport {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n useSyncExternalStore,\n} from \"react\";\nimport {\n DARK_MQ,\n LEGACY_THEME_STORAGE_KEY,\n THEME_MODE_STORAGE_KEY,\n THEME_PRESET_STORAGE_KEY,\n coerceThemeMode,\n getCompoundTheme,\n readStoredTheme,\n resolveThemeMode,\n type ThemeMode,\n type ThemePreset,\n type ThemeRuntimeOptions,\n} from \"./theme-resolution\";\nimport {\n GLOBAL_THEME_STYLE_ID,\n THEME_SPEC_STORAGE_KEY,\n THEME_TOKENS_STORAGE_KEY,\n buildTokenCache,\n computeGeneratedTokens,\n getCompoundIdForSpec,\n isForceLightSpec,\n safeParseStoredSpec,\n serializeGeneratedTheme,\n} from \"./theme-serialize\";\nimport {\n isGeneratedSpec,\n isPresetSpec,\n presetTheme as makePresetSpec,\n type ThemeSpec,\n} from \"./theme-types\";\nimport { isThemePresetId, type ThemePresetId } from \"./presets\";\nimport {\n OptThemeControllerContext,\n type OptThemeController,\n type ThemeStackEntry,\n} from \"./theme-controller-context\";\n\nexport type { ThemePreset, ThemeMode, CompoundTheme } from \"./theme-resolution\";\nexport {\n FORCE_LIGHT_PRESETS,\n ALL_COMPOUND_THEMES,\n getCompoundTheme,\n} from \"./theme-resolution\";\n\nconst THEME_STORAGE_KEYS = new Set([\n LEGACY_THEME_STORAGE_KEY,\n THEME_PRESET_STORAGE_KEY,\n THEME_MODE_STORAGE_KEY,\n THEME_SPEC_STORAGE_KEY,\n THEME_TOKENS_STORAGE_KEY,\n]);\n\n// ── Media query helpers ──\n\nfunction getSystemDark(): boolean {\n if (typeof window === \"undefined\") return false;\n return window.matchMedia(DARK_MQ).matches;\n}\n\nfunction subscribeSystemDark(cb: () => void): () => void {\n if (typeof window === \"undefined\") return () => {};\n const mql = window.matchMedia(DARK_MQ);\n mql.addEventListener(\"change\", cb);\n return () => mql.removeEventListener(\"change\", cb);\n}\n\n// ── Storage helpers ──\n\n/**\n * Read the persisted ThemeSpec, preferring a generated spec when present.\n * Falls back to the legacy preset path otherwise. Does not touch localStorage\n * apart from the legacy migration handled by `readStoredTheme`.\n */\nfunction readStoredSpec(\n defaultPreset: ThemePresetId,\n defaultMode: ThemeMode,\n options: { migrateLegacy?: boolean } = {},\n): { spec: ThemeSpec; mode: ThemeMode; presetShadow: ThemePresetId } {\n const generated = safeParseStoredSpec(\n window.localStorage.getItem(THEME_SPEC_STORAGE_KEY),\n );\n const { preset, mode } = readStoredTheme(\n window.localStorage,\n defaultPreset,\n defaultMode,\n options,\n );\n if (generated && generated.kind === \"generated\") {\n return { spec: generated, mode, presetShadow: preset };\n }\n return {\n spec: makePresetSpec(preset),\n mode,\n presetShadow: preset,\n };\n}\n\nfunction persistSpec(spec: ThemeSpec): void {\n if (isPresetSpec(spec)) {\n window.localStorage.setItem(THEME_PRESET_STORAGE_KEY, spec.preset);\n window.localStorage.removeItem(THEME_SPEC_STORAGE_KEY);\n window.localStorage.removeItem(THEME_TOKENS_STORAGE_KEY);\n return;\n }\n if (isGeneratedSpec(spec)) {\n const tokens = computeGeneratedTokens(spec);\n window.localStorage.setItem(THEME_SPEC_STORAGE_KEY, JSON.stringify(spec));\n if (tokens) {\n window.localStorage.setItem(\n THEME_TOKENS_STORAGE_KEY,\n JSON.stringify(buildTokenCache(tokens)),\n );\n } else {\n window.localStorage.removeItem(THEME_TOKENS_STORAGE_KEY);\n }\n return;\n }\n // descriptor spec: persist as preset if id is registered, otherwise as\n // synthetic generated spec.\n const descriptor = spec.descriptor;\n if (isThemePresetId(descriptor.id) && !descriptor.palette) {\n window.localStorage.setItem(THEME_PRESET_STORAGE_KEY, descriptor.id);\n window.localStorage.removeItem(THEME_SPEC_STORAGE_KEY);\n window.localStorage.removeItem(THEME_TOKENS_STORAGE_KEY);\n return;\n }\n if (descriptor.palette) {\n const synthetic: ThemeSpec = {\n kind: \"generated\",\n id: descriptor.id,\n label: descriptor.label,\n palette: descriptor.palette,\n forceLightOnly: descriptor.forceLightOnly,\n };\n persistSpec(synthetic);\n }\n}\n\n// ── Style injection ──\n\nfunction upsertGlobalStyle(css: string): void {\n if (typeof document === \"undefined\") return;\n let node = document.getElementById(\n GLOBAL_THEME_STYLE_ID,\n ) as HTMLStyleElement | null;\n if (!node) {\n node = document.createElement(\"style\");\n node.id = GLOBAL_THEME_STYLE_ID;\n document.head.appendChild(node);\n }\n if (node.textContent !== css) {\n node.textContent = css;\n }\n}\n\nfunction removeGlobalStyle(): void {\n if (typeof document === \"undefined\") return;\n document.getElementById(GLOBAL_THEME_STYLE_ID)?.remove();\n}\n\n// ── Context ──\n\ninterface ThemeContextValue {\n /** Active theme spec — preset or generated. */\n theme: ThemeSpec;\n /** Replace the active theme spec. No-op when controlled. */\n setTheme: (spec: ThemeSpec) => void;\n /**\n * Last known preset id. Mirrors `theme.preset` when active spec is preset;\n * otherwise reflects the most recent preset (useful for \"back to preset\").\n */\n preset: ThemePresetId;\n /** Convenience: equivalent to `setTheme({ kind: \"preset\", preset })`. */\n setPreset: (preset: ThemePresetId) => void;\n mode: ThemeMode;\n setMode: (mode: ThemeMode) => void;\n resolvedMode: \"light\" | \"dark\";\n /** True when `controlledTheme` prop is provided. setTheme is a no-op. */\n isControlled: boolean;\n /** True when the active spec (effective, including stack) is generated. */\n isGenerated: boolean;\n /**\n * True when the effective theme comes from the promotion stack instead of\n * persistence. Useful for surfaces that want to show \"Preview\" affordances.\n */\n isPromoted: boolean;\n}\n\nconst ThemeContext = createContext<ThemeContextValue | undefined>(undefined);\n\n// ── Provider ──\n\n/** Props for `OptThemeProvider`. */\nexport interface OptThemeProviderProps {\n children: React.ReactNode;\n /**\n * Initial theme spec used when nothing is persisted. Takes precedence over\n * `defaultPreset`. Defaults to `{ kind: \"preset\", preset: defaultPreset }`.\n */\n defaultTheme?: ThemeSpec;\n /**\n * Fully controlled mode. When provided the provider mirrors this spec into\n * the DOM but ignores localStorage and `setTheme` mutations. Useful for\n * preview surfaces (e.g. the harness builder's \"Apply globally\").\n */\n controlledTheme?: ThemeSpec;\n /**\n * Legacy alias for `defaultTheme = { kind: \"preset\", preset: defaultPreset }`.\n * Kept for backward compatibility with existing call sites.\n */\n defaultPreset?: ThemePreset;\n defaultMode?: ThemeMode;\n /**\n * Force the root theme to a single preset while still allowing mode changes.\n * Stored preset/generated themes are ignored while this is set.\n */\n lockedPreset?: ThemeRuntimeOptions[\"lockedPreset\"];\n /** Restrict the provider to a subset of modes, e.g. light/black only. */\n allowedModes?: ThemeRuntimeOptions[\"allowedModes\"];\n /**\n * Whether descendants may push transient themes onto the global stack.\n * Defaults to true for backward compatibility.\n */\n allowThemePromotion?: boolean;\n}\n\n/** Renders the opt theme provider component. */\nexport function OptThemeProvider({\n children,\n defaultTheme,\n controlledTheme,\n defaultPreset = \"default\",\n defaultMode = \"system\",\n lockedPreset,\n allowedModes,\n allowThemePromotion = true,\n}: OptThemeProviderProps) {\n const normalizedDefaultMode = coerceThemeMode(\n defaultMode,\n allowedModes,\n allowedModes?.[0] ?? \"system\",\n );\n const initialSpec =\n controlledTheme ??\n (lockedPreset ? makePresetSpec(lockedPreset) : defaultTheme) ??\n makePresetSpec(defaultPreset);\n const initialPresetShadow = isPresetSpec(initialSpec)\n ? initialSpec.preset\n : (lockedPreset ?? defaultPreset);\n\n // Identical first render on server + client; localStorage hydration runs in effect.\n const [theme, setThemeState] = useState<ThemeSpec>(initialSpec);\n const [presetShadow, setPresetShadow] =\n useState<ThemePresetId>(initialPresetShadow);\n const [mode, setModeState] = useState<ThemeMode>(normalizedDefaultMode);\n /**\n * Transient theme override stack — descendants (typically harnesses in\n * promote-global mode) push specs that take priority over `controlledTheme`\n * and persisted state. The stack is intentionally kept out of localStorage.\n */\n const [stack, setStack] = useState<readonly ThemeStackEntry[]>([]);\n\n const isControlled = controlledTheme !== undefined;\n const isLocked = !isControlled && lockedPreset !== undefined;\n\n // Sync controlled prop into state.\n useEffect(() => {\n if (!isControlled) return;\n setThemeState(controlledTheme!);\n if (isPresetSpec(controlledTheme!)) {\n setPresetShadow(controlledTheme!.preset);\n }\n }, [controlledTheme, isControlled]);\n\n // Hydrate from localStorage on first mount (uncontrolled only).\n useEffect(() => {\n if (isControlled) return;\n if (isLocked) {\n const locked = lockedPreset ?? defaultPreset;\n const { mode: storedMode } = readStoredTheme(\n window.localStorage,\n locked,\n normalizedDefaultMode,\n );\n const nextMode = coerceThemeMode(\n storedMode,\n allowedModes,\n normalizedDefaultMode,\n );\n const nextSpec = makePresetSpec(locked);\n setThemeState((prev) => (themeEqual(prev, nextSpec) ? prev : nextSpec));\n setPresetShadow((prev) => (prev === locked ? prev : locked));\n setModeState((prev) => (prev === nextMode ? prev : nextMode));\n return;\n }\n const next = readStoredSpec(defaultPreset, defaultMode, {\n migrateLegacy: true,\n });\n const nextMode = coerceThemeMode(\n next.mode,\n allowedModes,\n normalizedDefaultMode,\n );\n setThemeState((prev) => (themeEqual(prev, next.spec) ? prev : next.spec));\n setPresetShadow((prev) =>\n prev === next.presetShadow ? prev : next.presetShadow,\n );\n setModeState((prev) => (prev === nextMode ? prev : nextMode));\n // Hydration runs once per controlled-mode toggle; defaultPreset/defaultMode\n // are read as initial fallbacks only and intentionally omitted from deps.\n }, [\n allowedModes,\n isControlled,\n isLocked,\n lockedPreset,\n normalizedDefaultMode,\n ]);\n\n // Cross-tab sync via storage events (uncontrolled only).\n useEffect(() => {\n if (isControlled) return;\n function handleStorage(event: StorageEvent) {\n if (event.storageArea && event.storageArea !== window.localStorage)\n return;\n if (event.key != null && !THEME_STORAGE_KEYS.has(event.key)) return;\n if (isLocked) {\n const locked = lockedPreset ?? defaultPreset;\n const { mode: storedMode } = readStoredTheme(\n window.localStorage,\n locked,\n normalizedDefaultMode,\n );\n const nextMode = coerceThemeMode(\n storedMode,\n allowedModes,\n normalizedDefaultMode,\n );\n const nextSpec = makePresetSpec(locked);\n setThemeState((prev) => (themeEqual(prev, nextSpec) ? prev : nextSpec));\n setPresetShadow((prev) => (prev === locked ? prev : locked));\n setModeState((prev) => (prev === nextMode ? prev : nextMode));\n return;\n }\n const next = readStoredSpec(defaultPreset, defaultMode, {\n migrateLegacy: event.key === LEGACY_THEME_STORAGE_KEY,\n });\n const nextMode = coerceThemeMode(\n next.mode,\n allowedModes,\n normalizedDefaultMode,\n );\n setThemeState((prev) => (themeEqual(prev, next.spec) ? prev : next.spec));\n setPresetShadow((prev) =>\n prev === next.presetShadow ? prev : next.presetShadow,\n );\n setModeState((prev) => (prev === nextMode ? prev : nextMode));\n }\n window.addEventListener(\"storage\", handleStorage);\n return () => window.removeEventListener(\"storage\", handleStorage);\n }, [\n allowedModes,\n isControlled,\n isLocked,\n defaultMode,\n defaultPreset,\n lockedPreset,\n normalizedDefaultMode,\n ]);\n\n // Track system dark preference reactively.\n const systemDark = useSyncExternalStore(\n subscribeSystemDark,\n getSystemDark,\n () => false,\n );\n\n // Stack top wins over controlled prop wins over persisted state.\n const stackTop = stack.length > 0 ? stack[stack.length - 1] : null;\n const effectiveStackTop = allowThemePromotion ? stackTop : null;\n const isPromoted = effectiveStackTop !== null;\n const effectiveSpec: ThemeSpec = effectiveStackTop?.spec ?? theme;\n\n const forceLight = isForceLightSpec(effectiveSpec);\n const resolvedMode: \"light\" | \"dark\" = computeResolvedMode(\n forceLight,\n mode,\n systemDark,\n );\n\n const compoundId = getCompoundIdForSpec(\n effectiveSpec,\n resolvedMode,\n forceLight,\n );\n\n // Apply data-theme to <html>, but only after the first post-hydration commit.\n // The boot script (createThemeBootScript) paints the stored theme on <html>\n // before hydration; the provider's first render still reflects the *default*\n // mode (localStorage is read in the hydration effect above, which then fires\n // a re-render). Writing compoundId to <html> before that re-render would\n // clobber the boot value for a frame — a stored dark theme flips to light\n // (white flash). Gate the write on a state flag rather than a one-shot ref:\n // React StrictMode double-invokes effects in dev, which consumes a ref guard\n // and lets the second pass clobber; a state flag is invoked identically on\n // both passes and skips until the hydration re-render lands.\n const [hydrated, setHydrated] = useState(false);\n useEffect(() => {\n setHydrated(true);\n }, []);\n useEffect(() => {\n if (!hydrated) return;\n if (document.documentElement.getAttribute(\"data-theme\") !== compoundId) {\n document.documentElement.setAttribute(\"data-theme\", compoundId);\n }\n }, [compoundId, hydrated]);\n\n // Inject (or remove) global generated style based on the *effective* spec.\n useEffect(() => {\n if (isPresetSpec(effectiveSpec)) {\n removeGlobalStyle();\n return;\n }\n const tokens = computeGeneratedTokens(effectiveSpec);\n if (!tokens) {\n removeGlobalStyle();\n return;\n }\n upsertGlobalStyle(serializeGeneratedTheme(tokens));\n // Persist token cache only for the persisted spec (not promoted/controlled).\n if (!isControlled && !isPromoted && effectiveSpec === theme) {\n try {\n window.localStorage.setItem(\n THEME_TOKENS_STORAGE_KEY,\n JSON.stringify(buildTokenCache(tokens)),\n );\n } catch {\n // localStorage may be disabled — ignore.\n }\n }\n }, [effectiveSpec, theme, isControlled, isPromoted]);\n\n // Cleanup on unmount: leave the boot-script-injected style intact for the\n // next mount (e.g. route transitions in the same SPA shell).\n\n const setTheme = useCallback(\n (next: ThemeSpec) => {\n if (isLocked) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(\n \"[OptThemeProvider] setTheme called while lockedPreset is set — ignoring.\",\n );\n }\n return;\n }\n if (isControlled) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(\n \"[OptThemeProvider] setTheme called while controlledTheme is set — ignoring.\",\n );\n }\n return;\n }\n setThemeState(next);\n if (isPresetSpec(next)) setPresetShadow(next.preset);\n try {\n persistSpec(next);\n } catch {\n // Ignore persistence failures (e.g. storage quota / disabled).\n }\n },\n [isControlled, isLocked],\n );\n\n const setPreset = useCallback(\n (p: ThemePresetId) => {\n setTheme(makePresetSpec(p));\n },\n [setTheme],\n );\n\n const setMode = useCallback(\n (m: ThemeMode) => {\n const nextMode = coerceThemeMode(m, allowedModes, normalizedDefaultMode);\n setModeState(nextMode);\n if (!isControlled) {\n try {\n window.localStorage.setItem(THEME_MODE_STORAGE_KEY, nextMode);\n } catch {\n // ignore\n }\n }\n },\n [allowedModes, isControlled, normalizedDefaultMode],\n );\n\n const controller = useMemo<OptThemeController>(\n () => ({\n pushTheme(id, spec) {\n if (!allowThemePromotion) return;\n setStack((prev) => {\n const filtered = prev.filter((entry) => entry.id !== id);\n return [...filtered, { id, spec }];\n });\n },\n popTheme(id) {\n if (!allowThemePromotion) return;\n setStack((prev) => prev.filter((entry) => entry.id !== id));\n },\n }),\n [allowThemePromotion],\n );\n\n const value = useMemo<ThemeContextValue>(\n () => ({\n theme: effectiveSpec,\n setTheme,\n preset: presetShadow,\n setPreset,\n mode,\n setMode,\n resolvedMode,\n isControlled,\n isGenerated: !isPresetSpec(effectiveSpec),\n isPromoted,\n }),\n [\n effectiveSpec,\n setTheme,\n presetShadow,\n setPreset,\n mode,\n setMode,\n resolvedMode,\n isControlled,\n isPromoted,\n ],\n );\n\n // Reference unused legacy helper to keep API parity for downstream tests.\n void getCompoundTheme;\n void resolveThemeMode;\n\n return (\n <ThemeContext.Provider value={value}>\n <OptThemeControllerContext.Provider value={controller}>\n {children}\n </OptThemeControllerContext.Provider>\n </ThemeContext.Provider>\n );\n}\n\n/** Provides opt theme. */\nexport function useOptTheme() {\n const ctx = useContext(ThemeContext);\n if (!ctx) throw new Error(\"useOptTheme must be used within OptThemeProvider\");\n return ctx;\n}\n\n/** Reads opt theme context when present without requiring a provider. */\nexport function useOptionalOptTheme() {\n return useContext(ThemeContext);\n}\n\nfunction computeResolvedMode(\n forceLight: boolean,\n mode: ThemeMode,\n systemDark: boolean,\n): \"light\" | \"dark\" {\n if (forceLight) return \"light\";\n if (mode === \"system\") return systemDark ? \"dark\" : \"light\";\n return mode;\n}\n\n// ── Spec equality (cheap path) ──\n\nfunction themeEqual(a: ThemeSpec, b: ThemeSpec): boolean {\n if (a === b) return true;\n if (a.kind !== b.kind) return false;\n if (a.kind === \"preset\" && b.kind === \"preset\") {\n return a.preset === b.preset && overridesEqual(a.overrides, b.overrides);\n }\n if (a.kind === \"generated\" && b.kind === \"generated\") {\n return (\n a.id === b.id &&\n a.label === b.label &&\n a.forceLightOnly === b.forceLightOnly &&\n JSON.stringify(a.palette) === JSON.stringify(b.palette) &&\n overridesEqual(a.overrides, b.overrides)\n );\n }\n if (a.kind === \"descriptor\" && b.kind === \"descriptor\") {\n return (\n a.descriptor === b.descriptor && overridesEqual(a.overrides, b.overrides)\n );\n }\n return false;\n}\n\nfunction overridesEqual(\n a: ThemeSpec[\"overrides\"],\n b: ThemeSpec[\"overrides\"],\n): boolean {\n if (a === b) return true;\n if (!a && !b) return true;\n if (!a || !b) return false;\n return JSON.stringify(a) === JSON.stringify(b);\n}\n\n// Re-export descriptor type for downstream consumers using the old import.\nexport type { ThemePresetId as DescriptorThemePresetId } from \"./presets\";\n","\"use client\";\n\nimport { cn } from \"../lib/cn\";\nimport {\n FORCE_LIGHT_PRESET_IDS,\n THEME_PRESET_IDS,\n THEME_REGISTRY,\n useOptionalOptTheme,\n type ThemeMode,\n type ThemePresetId,\n} from \"../lib/theme\";\n\n// ── Types ──\n/** Localized labels for the theme switcher component. */\nexport interface ThemeSwitcherLabels {\n /** Section heading shown above the preset grid. */\n heading?: string;\n /** Localized labels for the mode toggle (light/dark/system). */\n modeLabels?: Partial<Record<ThemeMode, string>>;\n /** Suffix added to the active preset's swatch button (a11y only). */\n activeSuffix?: string;\n}\n\n/** Props for the theme switcher component. */\nexport interface ThemeSwitcherProps {\n className?: string;\n labels?: ThemeSwitcherLabels;\n variant?: \"default\" | \"compact\";\n /** Slot for custom CSS variable editor (e.g. ColorPicker panel) */\n customPresetEditor?: React.ReactNode;\n /**\n * Controlled preset for local preview surfaces. When provided, preset\n * changes call `onPresetChange` instead of mutating the global provider.\n */\n preset?: ThemePresetId;\n onPresetChange?: (preset: ThemePresetId) => void;\n /** Controlled mode for local preview surfaces. */\n mode?: ThemeMode;\n onModeChange?: (mode: ThemeMode) => void;\n}\n\ninterface ThemeOption {\n value: ThemePresetId;\n label: string;\n description: string;\n swatches: readonly [string, string, string];\n}\n\n// ── Theme options derived from THEME_REGISTRY ──\n\nconst FALLBACK_SWATCHES: readonly [string, string, string] = [\n \"var(--opt-accent)\",\n \"var(--opt-bg-subtle)\",\n \"var(--opt-text)\",\n];\n\nfunction buildThemeOptions(): ThemeOption[] {\n return THEME_PRESET_IDS.map((id) => {\n const descriptor = THEME_REGISTRY[id];\n return {\n value: id,\n label: descriptor.label,\n description: descriptor.description,\n swatches: descriptor.switcherSwatches ?? FALLBACK_SWATCHES,\n };\n });\n}\n\nconst MODE_VALUES: readonly ThemeMode[] = [\"light\", \"dark\", \"system\"];\n\nconst DEFAULT_MODE_LABELS: Record<ThemeMode, string> = {\n light: \"Light\",\n dark: \"Dark\",\n system: \"System\",\n};\n\nconst ICON_SIZE = 14;\n\nconst MODE_ICONS: Record<ThemeMode, React.ReactNode> = {\n light: (\n <svg\n width={ICON_SIZE}\n height={ICON_SIZE}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"4\" />\n <path d=\"M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41\" />\n </svg>\n ),\n dark: (\n <svg\n width={ICON_SIZE}\n height={ICON_SIZE}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z\" />\n </svg>\n ),\n system: (\n <svg\n width={ICON_SIZE}\n height={ICON_SIZE}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <rect x=\"2\" y=\"3\" width=\"20\" height=\"14\" rx=\"2\" />\n <path d=\"M8 21h8M12 17v4\" />\n </svg>\n ),\n};\n\nconst DEFAULT_LABELS: Required<Omit<ThemeSwitcherLabels, \"modeLabels\">> & {\n modeLabels: Record<ThemeMode, string>;\n} = {\n heading: \"Theme\",\n activeSuffix: \"(active)\",\n modeLabels: DEFAULT_MODE_LABELS,\n};\n\nfunction resolveLabels(\n user: ThemeSwitcherLabels | undefined,\n): typeof DEFAULT_LABELS {\n return {\n heading: user?.heading ?? DEFAULT_LABELS.heading,\n activeSuffix: user?.activeSuffix ?? DEFAULT_LABELS.activeSuffix,\n modeLabels: { ...DEFAULT_MODE_LABELS, ...user?.modeLabels },\n };\n}\n\n// ── Component ──\n\n/** Renders the theme switcher component. */\nexport function ThemeSwitcher({\n className,\n labels: userLabels,\n variant = \"default\",\n customPresetEditor,\n preset: controlledPreset,\n onPresetChange,\n mode: controlledMode,\n onModeChange,\n}: ThemeSwitcherProps) {\n const themeContext = useOptionalOptTheme();\n const preset = controlledPreset ?? themeContext?.preset;\n const mode = controlledMode ?? themeContext?.mode ?? \"light\";\n const setPreset = onPresetChange ?? themeContext?.setPreset;\n const setMode = onModeChange ?? themeContext?.setMode;\n if (!preset || !setPreset || !setMode) {\n throw new Error(\n \"ThemeSwitcher must be used within OptThemeProvider or receive controlled preset/mode props\",\n );\n }\n const labels = resolveLabels(userLabels);\n const options = buildThemeOptions();\n // The active preset reflects the persisted state; when a generated theme is\n // promoted on top, we still highlight the preset that the user would land on\n // if they popped/cleared the override.\n const activePreset = preset;\n const forcedMode = FORCE_LIGHT_PRESET_IDS.has(activePreset);\n const showCustomBadge =\n controlledPreset === undefined &&\n (themeContext?.isGenerated === true || themeContext?.isPromoted === true);\n\n if (options.length === 0) {\n return null;\n }\n\n if (variant === \"compact\") {\n return (\n <div\n className={cn(\"flex items-center gap-1.5\", className)}\n data-opt-id=\"8JX0N\"\n data-opt-slug=\"theme-switcher.ThemeSwitcher\"\n >\n {options.map((theme) => {\n const isActive = activePreset === theme.value && !showCustomBadge;\n return (\n <button\n key={theme.value}\n title={theme.label}\n aria-label={\n isActive ? `${theme.label} ${labels.activeSuffix}` : theme.label\n }\n aria-pressed={isActive}\n onClick={() => setPreset(theme.value)}\n className={cn(\n \"flex h-7 w-7 items-center justify-center rounded-full transition-all\",\n isActive\n ? \"ring-accent ring-2 ring-offset-1\"\n : \"hover:ring-border-hover hover:ring-1\",\n )}\n >\n <span\n className=\"h-4 w-4 rounded-full\"\n style={{ backgroundColor: theme.swatches[0] }}\n />\n </button>\n );\n })}\n {/* Mode toggle */}\n <span className=\"bg-border mx-0.5 h-4 w-px\" aria-hidden=\"true\" />\n {MODE_VALUES.map((m) => (\n <button\n key={m}\n title={labels.modeLabels[m]}\n aria-label={labels.modeLabels[m]}\n aria-pressed={mode === m}\n onClick={() => setMode(m)}\n disabled={forcedMode}\n className={cn(\n \"flex h-7 w-7 items-center justify-center rounded-full transition-all\",\n forcedMode && \"pointer-events-none opacity-40\",\n mode === m\n ? \"bg-accent/15 text-accent\"\n : \"text-text-tertiary hover:text-text-primary hover:bg-bg-subtle\",\n )}\n >\n {MODE_ICONS[m]}\n </button>\n ))}\n </div>\n );\n }\n\n return (\n <div\n className={cn(\"gap-group flex flex-col\", className)}\n data-opt-id=\"8JX0N\"\n data-opt-slug=\"theme-switcher.ThemeSwitcher\"\n >\n <h3 className=\"text-text-tertiary text-xs font-semibold tracking-wider uppercase\">\n {labels.heading}\n </h3>\n <div className=\"gap-group grid grid-cols-2\">\n {options.map((theme) => {\n const isActive = activePreset === theme.value && !showCustomBadge;\n return (\n <button\n key={theme.value}\n onClick={() => setPreset(theme.value)}\n aria-pressed={isActive}\n className={cn(\n \"gap-element flex flex-col rounded-lg border p-3 text-left transition-all\",\n isActive\n ? \"border-accent bg-accent-subtle ring-accent ring-2\"\n : \"border-border bg-surface hover:border-border-hover hover:bg-bg-subtle\",\n )}\n >\n {/* Color swatches */}\n <div className=\"flex gap-1.5\">\n {theme.swatches.map((color, i) => (\n <span\n key={i}\n className=\"h-4 w-4 rounded-full\"\n style={{ backgroundColor: color }}\n />\n ))}\n </div>\n <div>\n <span className=\"text-text-primary text-sm font-medium\">\n {theme.label}\n </span>\n <p className=\"text-text-tertiary mt-0.5 text-xs\">\n {theme.description}\n </p>\n </div>\n </button>\n );\n })}\n </div>\n\n {/* Mode toggle */}\n <div\n className={cn(\n \"bg-bg-subtle flex gap-1 rounded-lg p-1\",\n forcedMode && \"pointer-events-none opacity-50\",\n )}\n >\n {MODE_VALUES.map((m) => (\n <button\n key={m}\n onClick={() => setMode(m)}\n disabled={forcedMode}\n aria-pressed={mode === m}\n className={cn(\n \"flex-1 rounded-md px-3 py-1.5 text-xs font-medium transition-all\",\n mode === m\n ? \"bg-surface text-text-primary shadow-sm\"\n : \"text-text-tertiary hover:text-text-secondary\",\n )}\n >\n {labels.modeLabels[m]}\n </button>\n ))}\n </div>\n {customPresetEditor && (\n <div className=\"border-border mt-4 border-t pt-4\">\n {customPresetEditor}\n </div>\n )}\n </div>\n );\n}\n\nThemeSwitcher.displayName = \"ThemeSwitcher\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../lib/cn\";\n\n/** Defines the prompt variable shape. */\nexport interface PromptVariable {\n name: string;\n label: string;\n placeholder?: string;\n defaultValue?: string;\n}\n\n/** Localized labels for the prompt template component. */\nexport interface PromptTemplateLabels {\n copy?: string;\n copied?: string;\n copyFailed?: string;\n}\n\nconst defaultLabels: Required<PromptTemplateLabels> = {\n copy: \"Copy\",\n copied: \"Copied!\",\n copyFailed: \"Copy failed\",\n};\n\n/** Props for the prompt template component. */\nexport interface PromptTemplateProps {\n title: string;\n description?: string;\n template: string;\n variables?: PromptVariable[];\n className?: string;\n labels?: PromptTemplateLabels;\n}\n\nfunction renderPrompt(template: string, values: Record<string, string>) {\n return template.replace(/\\{(\\w+)\\}/g, (match, key: string) =>\n values[key] !== undefined && values[key] !== \"\" ? values[key] : match,\n );\n}\n\n/** Renders the prompt template component. */\nexport function PromptTemplate({\n title,\n description,\n template,\n variables = [],\n className,\n labels: customLabels,\n}: PromptTemplateProps) {\n const labels = { ...defaultLabels, ...customLabels };\n\n const [values, setValues] = React.useState<Record<string, string>>(() => {\n const initial: Record<string, string> = {};\n for (const v of variables) {\n if (v.defaultValue) initial[v.name] = v.defaultValue;\n }\n return initial;\n });\n\n const [copied, setCopied] = React.useState(false);\n const copiedTimer = React.useRef<ReturnType<typeof setTimeout>>(null);\n\n const rendered = renderPrompt(template, values);\n\n const handleCopy = React.useCallback(async () => {\n try {\n await navigator.clipboard.writeText(rendered);\n setCopied(true);\n if (copiedTimer.current) clearTimeout(copiedTimer.current);\n copiedTimer.current = setTimeout(() => setCopied(false), 2000);\n } catch {\n // silently fail\n }\n }, [rendered]);\n\n const handleChange = React.useCallback((name: string, value: string) => {\n setValues((prev) => ({ ...prev, [name]: value }));\n }, []);\n\n // Render template with variable highlights\n const renderHighlighted = React.useMemo(() => {\n const parts: React.ReactNode[] = [];\n const regex = /\\{(\\w+)\\}/g;\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n\n while ((match = regex.exec(template)) !== null) {\n // Text before the variable\n if (match.index > lastIndex) {\n parts.push(template.slice(lastIndex, match.index));\n }\n const key = match[1];\n const val = values[key];\n const hasValue = val !== undefined && val !== \"\";\n parts.push(\n <mark\n key={`${key}-${match.index}`}\n className={cn(\n \"rounded px-0.5\",\n hasValue\n ? \"bg-accent/20 text-accent-fg\"\n : \"bg-warning/20 text-warning-fg\",\n )}\n >\n {hasValue ? val : match[0]}\n </mark>,\n );\n lastIndex = match.index + match[0].length;\n }\n if (lastIndex < template.length) {\n parts.push(template.slice(lastIndex));\n }\n return parts;\n }, [template, values]);\n\n return (\n <div\n className={cn(\n \"border-border overflow-hidden rounded-lg border\",\n className,\n )}\n data-opt-id=\"5E56D\"\n data-opt-slug=\"prompt-template.PromptTemplate\"\n >\n {/* Header */}\n <div className=\"border-border bg-surface-inset flex items-center justify-between border-b px-3 py-2\">\n <div className=\"min-w-0 flex-1\">\n <span className=\"text-text-primary text-sm font-medium\">{title}</span>\n {description && (\n <p className=\"text-text-tertiary mt-0.5 text-xs\">{description}</p>\n )}\n </div>\n <button\n type=\"button\"\n onClick={handleCopy}\n className=\"text-text-tertiary hover:text-text-primary ml-2 shrink-0 rounded px-2 py-0.5 text-xs transition-colors\"\n aria-label={labels.copy}\n >\n {copied ? labels.copied : labels.copy}\n </button>\n </div>\n\n {/* Variable inputs */}\n {variables.length > 0 && (\n <div className=\"border-border bg-surface-inset/50 gap-group flex flex-wrap items-center border-b px-3 py-2\">\n {variables.map((v) => (\n <label key={v.name} className=\"flex items-center gap-1.5 text-xs\">\n <span className=\"text-text-secondary font-medium\">{v.label}</span>\n <input\n type=\"text\"\n value={values[v.name] ?? \"\"}\n onChange={(e) => handleChange(v.name, e.target.value)}\n placeholder={v.placeholder ?? v.name}\n className=\"border-border bg-bg text-text-primary placeholder:text-text-tertiary w-32 rounded border px-2 py-1 text-xs\"\n aria-label={v.label}\n />\n </label>\n ))}\n </div>\n )}\n\n {/* Prompt body */}\n <pre className=\"text-text-primary overflow-auto p-3 text-sm whitespace-pre-wrap\">\n {renderHighlighted}\n </pre>\n </div>\n );\n}\n\nPromptTemplate.displayName = \"PromptTemplate\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport { Tooltip, TooltipAnchor, TooltipProvider } from \"../core/toolbar\";\nimport { cn } from \"../lib/cn\";\n\n// ── Context ──\n\ninterface SidebarContextValue {\n collapsed: boolean;\n collapsible: boolean;\n setCollapsed: (value: boolean) => void;\n toggle: () => void;\n width: number;\n collapsedWidth: number;\n}\n\nconst SidebarContext = React.createContext<SidebarContextValue | null>(null);\n\n/** Provides sidebar. */\nexport function useSidebar() {\n const ctx = React.useContext(SidebarContext);\n if (!ctx) {\n throw new Error(\"useSidebar must be used within a <Sidebar>\");\n }\n return ctx;\n}\n\n// ── Props ──\n\n/** Localized labels for the sidebar component. */\nexport type SidebarLabels = Record<never, never>;\n\n/** Props for the sidebar component. */\nexport interface SidebarProps {\n children: React.ReactNode;\n collapsible?: boolean;\n defaultCollapsed?: boolean;\n collapsed?: boolean;\n onCollapsedChange?: (collapsed: boolean) => void;\n width?: number;\n collapsedWidth?: number;\n className?: string;\n side?: \"left\" | \"right\";\n /** aside에 적용할 aria-label */\n label?: string;\n}\n\n// ── Sub-components ──\n\nfunction SidebarHeader({\n children,\n className,\n}: {\n children: React.ReactNode;\n className?: string;\n}) {\n return <div className={cn(\"shrink-0 p-4\", className)}>{children}</div>;\n}\nSidebarHeader.displayName = \"Sidebar.Header\";\n\nfunction SidebarContent({\n children,\n className,\n onKeyDown,\n}: {\n children: React.ReactNode;\n className?: string;\n onKeyDown?: React.KeyboardEventHandler<HTMLElement>;\n}) {\n const handleKeyDown = (event: React.KeyboardEvent<HTMLElement>) => {\n onKeyDown?.(event);\n if (\n event.defaultPrevented ||\n event.altKey ||\n event.ctrlKey ||\n event.metaKey ||\n event.shiftKey\n ) {\n return;\n }\n\n const items = Array.from(\n event.currentTarget.querySelectorAll<HTMLElement>(\n \"[data-sidebar-item]:not([disabled]):not([aria-disabled='true'])\",\n ),\n );\n const target =\n event.target instanceof HTMLElement\n ? event.target.closest<HTMLElement>(\"[data-sidebar-item]\")\n : null;\n const currentIndex = target ? items.indexOf(target) : -1;\n if (currentIndex < 0 || items.length === 0) return;\n\n let nextIndex: number | null = null;\n if (event.key === \"ArrowDown\") {\n nextIndex = (currentIndex + 1) % items.length;\n } else if (event.key === \"ArrowUp\") {\n nextIndex = (currentIndex - 1 + items.length) % items.length;\n } else if (event.key === \"Home\") {\n nextIndex = 0;\n } else if (event.key === \"End\") {\n nextIndex = items.length - 1;\n }\n if (nextIndex === null) return;\n\n event.preventDefault();\n const nextItem = items[nextIndex];\n nextItem?.focus({ preventScroll: true });\n nextItem?.scrollIntoView?.({ block: \"nearest\" });\n };\n\n return (\n <nav\n className={cn(\n \"flex-1 overflow-x-hidden overflow-y-auto px-2 py-1\",\n className,\n )}\n onKeyDown={handleKeyDown}\n >\n {children}\n </nav>\n );\n}\nSidebarContent.displayName = \"Sidebar.Content\";\n\nfunction SidebarFooter({\n children,\n className,\n}: {\n children: React.ReactNode;\n className?: string;\n}) {\n return <div className={cn(\"shrink-0 p-4\", className)}>{children}</div>;\n}\nSidebarFooter.displayName = \"Sidebar.Footer\";\n\nfunction SidebarTrigger({\n className,\n children,\n}: {\n className?: string;\n children?: React.ReactNode;\n}) {\n const { toggle, collapsed, collapsible } = useSidebar();\n\n if (!collapsible) return null;\n\n return (\n <button\n type=\"button\"\n onClick={toggle}\n aria-expanded={!collapsed}\n aria-label={collapsed ? \"사이드바 열기\" : \"사이드바 닫기\"}\n className={cn(\n \"text-text-secondary hover:bg-bg-subtle hover:text-text-primary inline-flex h-8 w-8 items-center justify-center rounded-md transition-colors\",\n className,\n )}\n >\n {children ?? (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n aria-hidden=\"true\"\n className=\"shrink-0\"\n >\n <rect\n x=\"1\"\n y=\"2\"\n width=\"14\"\n height=\"12\"\n rx=\"2\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n <line\n x1=\"5.5\"\n y1=\"2\"\n x2=\"5.5\"\n y2=\"14\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n />\n </svg>\n )}\n </button>\n );\n}\nSidebarTrigger.displayName = \"Sidebar.Trigger\";\n\n// ── Group ──\n\ninterface SidebarGroupProps {\n children: React.ReactNode;\n /** 그룹 레이블. 접힌 상태에서 숨겨짐 */\n label?: string;\n className?: string;\n}\n\nfunction SidebarGroup({ children, label, className }: SidebarGroupProps) {\n const { collapsed } = useSidebar();\n const labelId = React.useId();\n\n return (\n <div\n role=\"group\"\n aria-labelledby={label ? labelId : undefined}\n className={cn(\"flex flex-col gap-0.5\", className)}\n >\n {label && !collapsed && (\n <span\n id={labelId}\n className=\"text-text-tertiary mt-4 mb-1 px-2 text-[11px] font-semibold tracking-wider uppercase\"\n >\n {label}\n </span>\n )}\n {children}\n </div>\n );\n}\nSidebarGroup.displayName = \"Sidebar.Group\";\n\n// ── Item ──\n\ninterface SidebarItemProps {\n children: React.ReactNode;\n /** 아이콘 (접힌 상태에서도 표시) */\n icon?: React.ReactNode;\n /** 활성 상태 */\n active?: boolean;\n /** 클릭 핸들러 */\n onClick?: () => void;\n /** 링크 URL — 설정 시 <a> 태그로 렌더링 */\n href?: string;\n /** 접힌 상태에서 표시할 툴팁 텍스트 */\n tooltip?: string;\n /** 우측 배지 (숫자 또는 ReactNode). 접힌 상태에서 아이콘 위 dot으로 축소 */\n badge?: React.ReactNode;\n className?: string;\n}\n\nfunction SidebarItem({\n children,\n icon,\n active = false,\n onClick,\n href,\n tooltip,\n badge,\n className,\n}: SidebarItemProps) {\n const { collapsed, collapsible } = useSidebar();\n const isCollapsed = collapsible && collapsed;\n\n const tooltipText =\n tooltip ?? (typeof children === \"string\" ? children : undefined);\n\n const sharedClassName = cn(\n \"relative flex w-full items-center gap-2 rounded-md text-left text-sm transition-colors outline-none\",\n isCollapsed ? \"justify-center px-0 py-2\" : \"px-2 py-1.5\",\n active\n ? \"bg-bg-subtle text-text-primary font-medium\"\n : \"text-text-secondary hover:bg-bg-subtle hover:text-text-primary\",\n \"focus-visible:ring-ring focus-visible:ring-2 focus-visible:ring-offset-1\",\n className,\n );\n\n const inner = (\n <>\n {active && (\n <span className=\"bg-accent absolute top-1/2 left-0 h-4 w-0.5 -translate-y-1/2 rounded-full\" />\n )}\n {icon && (\n <span className=\"relative flex h-5 w-5 shrink-0 items-center justify-center\">\n {icon}\n {badge != null && isCollapsed && (\n <span className=\"bg-accent absolute -top-1 -right-1 h-2 w-2 rounded-full\" />\n )}\n </span>\n )}\n {!isCollapsed && (\n <>\n <span className=\"truncate\">{children}</span>\n {badge != null && (\n <span className=\"bg-bg-muted text-text-secondary ml-auto shrink-0 rounded-full px-1.5 py-0.5 text-[10px] leading-none font-medium\">\n {badge}\n </span>\n )}\n </>\n )}\n </>\n );\n\n const ariaLabel = isCollapsed ? tooltipText : undefined;\n\n const element = href ? (\n <a\n href={href}\n onClick={onClick}\n data-sidebar-item=\"\"\n aria-current={active ? \"page\" : undefined}\n aria-label={ariaLabel}\n className={sharedClassName}\n >\n {inner}\n </a>\n ) : (\n <button\n type=\"button\"\n onClick={onClick}\n data-sidebar-item=\"\"\n aria-current={active ? \"page\" : undefined}\n aria-label={ariaLabel}\n className={sharedClassName}\n >\n {inner}\n </button>\n );\n\n if (isCollapsed && tooltipText) {\n return (\n <TooltipProvider placement=\"right\" portal>\n <TooltipAnchor render={element} />\n <Tooltip className=\"bg-foreground text-background z-[120] rounded-md px-2 py-1 text-xs shadow-lg\">\n {tooltipText}\n </Tooltip>\n </TooltipProvider>\n );\n }\n\n return element;\n}\nSidebarItem.displayName = \"Sidebar.Item\";\n\n// ── Separator ──\n\nfunction SidebarSeparator({ className }: { className?: string }) {\n return <hr className={cn(\"my-2 border-0\", className)} />;\n}\nSidebarSeparator.displayName = \"Sidebar.Separator\";\n\n// ── Root ──\n\nfunction SidebarRoot({\n children,\n collapsible = false,\n defaultCollapsed = false,\n collapsed: controlledCollapsed,\n onCollapsedChange,\n width = 280,\n collapsedWidth = 56,\n className,\n side = \"left\",\n label,\n}: SidebarProps) {\n const [internalCollapsed, setInternalCollapsed] =\n React.useState(defaultCollapsed);\n\n const isControlled = controlledCollapsed !== undefined;\n const collapsed = isControlled ? controlledCollapsed : internalCollapsed;\n\n const setCollapsed = React.useCallback(\n (value: boolean) => {\n if (!isControlled) setInternalCollapsed(value);\n onCollapsedChange?.(value);\n },\n [isControlled, onCollapsedChange],\n );\n\n const toggle = React.useCallback(() => {\n setCollapsed(!collapsed);\n }, [collapsed, setCollapsed]);\n\n const ctx = React.useMemo<SidebarContextValue>(\n () => ({\n collapsed,\n collapsible,\n setCollapsed,\n toggle,\n width,\n collapsedWidth,\n }),\n [collapsed, collapsible, setCollapsed, toggle, width, collapsedWidth],\n );\n\n const currentWidth = collapsible && collapsed ? collapsedWidth : width;\n\n // Keyboard shortcut: Ctrl+[ to toggle\n React.useEffect(() => {\n if (!collapsible) return;\n function handleKeyDown(e: KeyboardEvent) {\n if (e.ctrlKey && e.key === \"[\") {\n e.preventDefault();\n toggle();\n }\n }\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => document.removeEventListener(\"keydown\", handleKeyDown);\n }, [collapsible, toggle]);\n\n return (\n <SidebarContext.Provider value={ctx}>\n <aside\n aria-label={label ?? \"사이드바\"}\n data-collapsed={collapsed || undefined}\n data-side={side}\n className={cn(\n \"bg-surface sticky top-0 flex h-screen shrink-0 flex-col transition-[width] duration-200\",\n className,\n )}\n style={{ width: currentWidth }}\n data-opt-id=\"FG8ZG\"\n data-opt-slug=\"sidebar.Sidebar\"\n >\n {children}\n </aside>\n </SidebarContext.Provider>\n );\n}\n\nSidebarRoot.displayName = \"Sidebar\";\n\nexport const Sidebar = Object.assign(SidebarRoot, {\n Header: SidebarHeader,\n Content: SidebarContent,\n Footer: SidebarFooter,\n Trigger: SidebarTrigger,\n Group: SidebarGroup,\n Item: SidebarItem,\n Separator: SidebarSeparator,\n});\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../lib/cn\";\n\n// ── Context ──\n\ninterface AppShellContextValue {\n hasSidebar: boolean;\n}\n\nconst AppShellContext = React.createContext<AppShellContextValue>({\n hasSidebar: false,\n});\n\n// ── Sub-components ──\n\nfunction AppShellHeader({\n children,\n className,\n}: {\n children: React.ReactNode;\n className?: string;\n}) {\n return (\n <header\n className={cn(\n \"border-border bg-surface/80 shrink-0 border-b px-4 py-3 backdrop-blur\",\n className,\n )}\n >\n {children}\n </header>\n );\n}\nAppShellHeader.displayName = \"AppShell.Header\";\n\nfunction AppShellSidebar({\n children,\n className,\n}: {\n children: React.ReactNode;\n className?: string;\n}) {\n return <div className={cn(\"shrink-0\", className)}>{children}</div>;\n}\nAppShellSidebar.displayName = \"AppShell.Sidebar\";\n\nfunction AppShellContent({\n children,\n className,\n}: {\n children: React.ReactNode;\n className?: string;\n}) {\n return (\n <main className={cn(\"min-w-0 flex-1 overflow-auto\", className)}>\n {children}\n </main>\n );\n}\nAppShellContent.displayName = \"AppShell.Content\";\n\nfunction AppShellFooter({\n children,\n className,\n}: {\n children: React.ReactNode;\n className?: string;\n}) {\n return (\n <footer className={cn(\"border-border border-t px-4 py-3\", className)}>\n {children}\n </footer>\n );\n}\nAppShellFooter.displayName = \"AppShell.Footer\";\n\n// ── Root ──\n\n/** Props for the app shell component. */\nexport interface AppShellProps {\n children: React.ReactNode;\n className?: string;\n labels?: AppShellLabels;\n}\n\n/** Localized labels for the app shell component. */\nexport type AppShellLabels = Record<never, never>;\n\nfunction AppShellRoot({ children, className }: AppShellProps) {\n // Detect if sidebar slot is present\n const hasSidebar = React.Children.toArray(children).some(\n (child) =>\n React.isValidElement(child) &&\n (child.type === AppShellSidebar ||\n (child.type as { displayName?: string })?.displayName ===\n \"AppShell.Sidebar\"),\n );\n\n const ctx = React.useMemo(() => ({ hasSidebar }), [hasSidebar]);\n\n // Separate header/footer from body content\n const header: React.ReactNode[] = [];\n const sidebar: React.ReactNode[] = [];\n const content: React.ReactNode[] = [];\n const footer: React.ReactNode[] = [];\n\n React.Children.forEach(children, (child) => {\n if (!React.isValidElement(child)) return;\n const displayName = (child.type as { displayName?: string })?.displayName;\n\n if (child.type === AppShellHeader || displayName === \"AppShell.Header\") {\n header.push(child);\n } else if (\n child.type === AppShellSidebar ||\n displayName === \"AppShell.Sidebar\"\n ) {\n sidebar.push(child);\n } else if (\n child.type === AppShellFooter ||\n displayName === \"AppShell.Footer\"\n ) {\n footer.push(child);\n } else {\n content.push(child);\n }\n });\n\n const slotCount =\n header.length + sidebar.length + content.length + footer.length;\n\n if (slotCount === 0) return null;\n\n return (\n <AppShellContext.Provider value={ctx}>\n <div\n className={cn(\"flex min-h-screen flex-col\", className)}\n data-opt-id=\"EQGGQ\"\n data-opt-slug=\"app-shell.AppShell\"\n >\n {header}\n <div className=\"flex min-h-0 flex-1\">\n {sidebar}\n {content}\n </div>\n {footer}\n </div>\n </AppShellContext.Provider>\n );\n}\n\nAppShellRoot.displayName = \"AppShell\";\n\nexport const AppShell = Object.assign(AppShellRoot, {\n Header: AppShellHeader,\n Sidebar: AppShellSidebar,\n Content: AppShellContent,\n Footer: AppShellFooter,\n});\n","\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport {\n DialogRoot,\n DialogPanel,\n DialogHeading,\n DialogDescription,\n DialogHeader,\n DialogBody,\n DialogFooter,\n} from \"../core/dialog\";\nimport { Button } from \"../core/button\";\n\n/** Localized labels for the confirm dialog component. */\nexport type ConfirmDialogLabels = Record<never, never>;\n\n/** Props for the confirm dialog component. */\nexport interface ConfirmDialogProps {\n open: boolean;\n onConfirm: () => void;\n onCancel: () => void;\n title: string;\n description?: string;\n confirmLabel?: string;\n cancelLabel?: string;\n variant?: \"default\" | \"danger\";\n children?: ReactNode;\n}\n\n/** Renders the confirm dialog component. */\nexport function ConfirmDialog({\n open,\n onConfirm,\n onCancel,\n title,\n description,\n confirmLabel = \"Confirm\",\n cancelLabel = \"Cancel\",\n variant = \"default\",\n children,\n}: ConfirmDialogProps) {\n return (\n <DialogRoot\n open={open}\n onOpenChange={(v) => !v && onCancel()}\n data-opt-id=\"0VNJQ\"\n data-opt-slug=\"confirm-dialog.ConfirmDialog\"\n >\n <DialogPanel size=\"sm\">\n <DialogHeader>\n <DialogHeading>{title}</DialogHeading>\n {description && <DialogDescription>{description}</DialogDescription>}\n </DialogHeader>\n {children && <DialogBody>{children}</DialogBody>}\n <DialogFooter>\n <Button variant=\"secondary\" onClick={onCancel}>\n {cancelLabel}\n </Button>\n <Button\n variant={variant === \"danger\" ? \"danger\" : \"primary\"}\n onClick={onConfirm}\n >\n {confirmLabel}\n </Button>\n </DialogFooter>\n </DialogPanel>\n </DialogRoot>\n );\n}\n\nConfirmDialog.displayName = \"ConfirmDialog\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport {\n ComboboxRoot,\n ComboboxInput,\n ComboboxPopover,\n ComboboxItem,\n ComboboxEmpty,\n} from \"../core/combobox\";\nimport { Spinner } from \"../core/spinner\";\nimport { cn } from \"../lib/cn\";\n\n/** Localized labels for the async combobox component. */\nexport interface AsyncComboboxLabels {\n input?: string;\n loading?: string;\n noResults?: string;\n placeholder?: string;\n}\n\n/** Props for the async combobox component. */\nexport interface AsyncComboboxProps {\n onSearch: (query: string) => Promise<string[]>;\n debounceMs?: number;\n /** @deprecated Use labels.loading instead */\n loadingText?: string;\n minChars?: number;\n /** @deprecated Use labels.placeholder instead */\n placeholder?: string;\n onSelect?: (value: string) => void;\n labels?: AsyncComboboxLabels;\n className?: string;\n}\n\n/** Renders the async combobox component. */\nexport function AsyncCombobox({\n onSearch,\n debounceMs = 300,\n loadingText,\n minChars = 1,\n placeholder,\n onSelect,\n labels: customLabels,\n className,\n}: AsyncComboboxProps) {\n const labels = {\n input: placeholder ?? \"Search\",\n loading: loadingText ?? \"Loading…\",\n noResults: \"No results\",\n placeholder: placeholder ?? \"Search…\",\n ...customLabels,\n };\n const [query, setQuery] = React.useState(\"\");\n const [results, setResults] = React.useState<string[]>([]);\n const [loading, setLoading] = React.useState(false);\n const timerRef = React.useRef<ReturnType<typeof setTimeout>>(undefined);\n const searchGenerationRef = React.useRef(0);\n\n const handleInput = React.useCallback(\n (event: React.FormEvent<HTMLInputElement>) => {\n searchGenerationRef.current += 1;\n setQuery(event.currentTarget.value);\n },\n [],\n );\n\n const handleValueChange = React.useCallback(\n (value: string) => {\n searchGenerationRef.current += 1;\n if (timerRef.current) clearTimeout(timerRef.current);\n setLoading(false);\n setResults([]);\n onSelect?.(value);\n },\n [onSelect],\n );\n\n React.useEffect(() => {\n const generation = ++searchGenerationRef.current;\n\n if (timerRef.current) clearTimeout(timerRef.current);\n\n if (query.length < minChars) {\n setResults([]);\n setLoading(false);\n return;\n }\n setLoading(true);\n timerRef.current = setTimeout(async () => {\n try {\n const items = await onSearch(query);\n if (searchGenerationRef.current !== generation) {\n return;\n }\n setResults(items);\n } finally {\n if (searchGenerationRef.current === generation) {\n setLoading(false);\n }\n }\n }, debounceMs);\n return () => {\n if (timerRef.current) clearTimeout(timerRef.current);\n };\n }, [query, minChars, debounceMs, onSearch]);\n\n return (\n <ComboboxRoot\n onValueChange={handleValueChange}\n data-opt-id=\"KAKTV\"\n data-opt-slug=\"async-combobox.AsyncCombobox\"\n >\n <ComboboxInput\n className={cn(className)}\n aria-label={labels.input}\n aria-busy={loading || undefined}\n placeholder={labels.placeholder}\n onInput={handleInput}\n />\n <ComboboxPopover>\n {loading ? (\n <div\n className=\"text-text-secondary gap-element flex items-center px-3 py-2 text-sm\"\n role=\"status\"\n aria-live=\"polite\"\n aria-busy=\"true\"\n >\n <Spinner size=\"sm\" aria-hidden=\"true\" />\n {labels.loading}\n </div>\n ) : results.length === 0 ? (\n <ComboboxEmpty>{labels.noResults}</ComboboxEmpty>\n ) : (\n results.map((item) => (\n <ComboboxItem key={item} value={item}>\n {item}\n </ComboboxItem>\n ))\n )}\n </ComboboxPopover>\n </ComboboxRoot>\n );\n}\n","import * as React from \"react\";\nimport { TabsRoot, TabList, Tab, TabPanel } from \"../core/tabs\";\nimport { cn } from \"../lib/cn\";\nimport type { TabDef } from \"../lib/types\";\n\n/** Props for the vertical tabs component. */\nexport interface VerticalTabsProps {\n tabs: TabDef[];\n defaultTabId?: string;\n labels?: VerticalTabsLabels;\n className?: string;\n}\n\n/** Localized labels for the vertical tabs component. */\nexport interface VerticalTabsLabels {\n ariaLabel?: string;\n emptyMessage?: string;\n}\n\nconst defaultLabels: Required<VerticalTabsLabels> = {\n ariaLabel: \"Vertical tabs\",\n emptyMessage: \"No tabs available\",\n};\n\n/** Renders the vertical tabs component. */\nexport function VerticalTabs({\n tabs,\n defaultTabId,\n labels: customLabels,\n className,\n}: VerticalTabsProps) {\n const labels = { ...defaultLabels, ...customLabels };\n\n if (tabs.length === 0) {\n return (\n <div\n className={cn(\"text-text-secondary text-sm\", className)}\n data-opt-id=\"J81G4\"\n data-opt-slug=\"vertical-tabs.VerticalTabs\"\n >\n {labels.emptyMessage}\n </div>\n );\n }\n\n return (\n <TabsRoot\n defaultSelectedId={defaultTabId ?? tabs[0]?.id}\n data-opt-id=\"J81G4\"\n data-opt-slug=\"vertical-tabs.VerticalTabs\"\n >\n <div className={cn(\"gap-group flex\", className)}>\n <TabList\n aria-label={labels.ariaLabel}\n className=\"gap-element border-border flex flex-col border-r pr-4\"\n >\n {tabs.map((tab) => (\n <Tab key={tab.id} id={tab.id} className=\"justify-start text-left\">\n {tab.label}\n </Tab>\n ))}\n </TabList>\n <div className=\"flex-1\">\n {tabs.map((tab) => (\n <TabPanel key={tab.id} tabId={tab.id}>\n {tab.content}\n </TabPanel>\n ))}\n </div>\n </div>\n </TabsRoot>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { PopoverRoot, PopoverTrigger, PopoverContent } from \"../core/popover\";\nimport { Checkbox } from \"../core/checkbox\";\nimport { cn } from \"../lib/cn\";\n\n/** Defines the column toggler column shape. */\nexport interface ColumnTogglerColumn {\n id: string;\n header: string;\n}\n\n/** Props for the column toggler component. */\nexport interface ColumnTogglerProps {\n columns: ColumnTogglerColumn[];\n visibleColumns: string[];\n onChange: (visibleColumns: string[]) => void;\n className?: string;\n labels?: ColumnTogglerLabels;\n}\n\n/** Localized labels for the column toggler component. */\nexport interface ColumnTogglerLabels {\n triggerLabel?: (count: number) => string;\n emptyMessage?: string;\n}\n\nconst defaultLabels: Required<ColumnTogglerLabels> = {\n triggerLabel: (count) => `Columns (${count})`,\n emptyMessage: \"No columns available\",\n};\n\n/** Renders the column toggler component. */\nexport function ColumnToggler({\n columns,\n visibleColumns,\n onChange,\n className,\n labels: customLabels,\n}: ColumnTogglerProps) {\n const labels = { ...defaultLabels, ...customLabels };\n const visibleCount = visibleColumns.length;\n const hasColumns = columns.length > 0;\n\n const toggle = (id: string) => {\n if (visibleColumns.includes(id)) {\n onChange(visibleColumns.filter((c) => c !== id));\n } else {\n onChange([...visibleColumns, id]);\n }\n };\n\n return (\n <PopoverRoot\n data-opt-id=\"PPN5M\"\n data-opt-slug=\"column-toggler.ColumnToggler\"\n >\n <PopoverTrigger\n className={cn(\n \"border-border bg-surface text-text-primary hover:bg-bg-subtle inline-flex h-9 items-center gap-1.5 rounded-lg border px-3 text-sm font-medium\",\n className,\n )}\n >\n {labels.triggerLabel(visibleCount)}\n </PopoverTrigger>\n <PopoverContent className=\"w-56\">\n <div className=\"gap-element flex flex-col p-1\">\n {hasColumns ? (\n columns.map((col) => (\n <label\n key={col.id}\n className=\"text-text-primary hover:bg-bg-subtle gap-element flex cursor-pointer items-center rounded-md px-2 py-1.5 text-sm\"\n >\n <Checkbox\n checked={visibleColumns.includes(col.id)}\n onChange={() => toggle(col.id)}\n />\n {col.header}\n </label>\n ))\n ) : (\n <p className=\"text-text-tertiary px-2 py-1 text-sm\">\n {labels.emptyMessage}\n </p>\n )}\n </div>\n </PopoverContent>\n </PopoverRoot>\n );\n}\n\nColumnToggler.displayName = \"ColumnToggler\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport {\n DropdownMenu,\n DropdownTrigger,\n DropdownContent,\n DropdownItem,\n} from \"../core/dropdown-menu\";\nimport { Badge } from \"../core/badge\";\nimport { cn } from \"../lib/cn\";\n\n/** Defines the bulk action shape. */\nexport interface BulkActionDef {\n id: string;\n label: string;\n variant?: \"default\" | \"danger\";\n}\n\n/** Localized labels for the bulk actions component. */\nexport interface BulkActionsLabels {\n selected?: string;\n actions?: string;\n clear?: string;\n noActions?: string;\n}\n\n/** Props for the bulk actions component. */\nexport interface BulkActionsProps {\n selectedCount: number;\n actions: BulkActionDef[];\n onAction: (actionId: string) => void;\n onClear: () => void;\n labels?: BulkActionsLabels;\n className?: string;\n}\n\n/** Renders the bulk actions component. */\nexport function BulkActions({\n selectedCount,\n actions,\n onAction,\n onClear,\n labels: customLabels,\n className,\n}: BulkActionsProps) {\n const labels = {\n selected: \"selected\",\n actions: \"Actions\",\n clear: \"Clear\",\n noActions: \"No actions\",\n ...customLabels,\n };\n if (selectedCount === 0) return null;\n const hasActions = actions.length > 0;\n\n return (\n <div\n className={cn(\n \"gap-group border-border bg-surface flex items-center rounded-lg border px-4 py-2\",\n className,\n )}\n data-opt-id=\"Q3J33\"\n data-opt-slug=\"bulk-actions.BulkActions\"\n >\n <Badge variant=\"info\">\n {selectedCount} {labels.selected}\n </Badge>\n {hasActions ? (\n <DropdownMenu>\n <DropdownTrigger className=\"border-border bg-surface text-text-primary hover:bg-bg-subtle inline-flex h-8 items-center rounded-md border px-3 text-sm font-medium\">\n {labels.actions}\n </DropdownTrigger>\n <DropdownContent>\n {actions.map((action) => (\n <DropdownItem\n key={action.id}\n onClick={() => onAction(action.id)}\n className={\n action.variant === \"danger\" ? \"text-danger\" : undefined\n }\n >\n {action.label}\n </DropdownItem>\n ))}\n </DropdownContent>\n </DropdownMenu>\n ) : (\n <span className=\"text-text-secondary text-sm\">{labels.noActions}</span>\n )}\n <button\n type=\"button\"\n onClick={onClear}\n className=\"text-text-secondary hover:text-text-primary text-sm\"\n >\n {labels.clear}\n </button>\n </div>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { Trash2 } from \"lucide-react\";\nimport { Button } from \"../core/button\";\nimport { PopoverRoot, PopoverTrigger, PopoverContent } from \"../core/popover\";\nimport { Input } from \"../core/input\";\nimport { cn } from \"../lib/cn\";\n\n/** Defines the filter preset shape. */\nexport interface FilterPreset {\n id: string;\n name: string;\n filters: Record<string, unknown>;\n}\n\n/** Props for the saved filters component. */\nexport interface SavedFiltersProps {\n currentFilters: Record<string, unknown>;\n presets: FilterPreset[];\n onSavePreset: (name: string, filters: Record<string, unknown>) => void;\n onLoadPreset: (preset: FilterPreset) => void;\n onDeletePreset: (presetId: string) => void;\n className?: string;\n labels?: SavedFiltersLabels;\n}\n\n/** Localized labels for the saved filters component. */\nexport interface SavedFiltersLabels {\n triggerLabel?: (count: number) => string;\n emptyMessage?: string;\n deleteLabel?: (name: string) => string;\n namePlaceholder?: string;\n saveLabel?: string;\n confirmDeleteLabel?: string;\n cancelDeleteLabel?: string;\n}\n\nconst defaultLabels: Required<SavedFiltersLabels> = {\n triggerLabel: (count) => `Saved Filters (${count})`,\n emptyMessage: \"No saved filters\",\n deleteLabel: (name) => `Delete ${name}`,\n namePlaceholder: \"Filter name…\",\n saveLabel: \"Save\",\n confirmDeleteLabel: \"Confirm\",\n cancelDeleteLabel: \"Cancel\",\n};\n\n/** Renders the saved filters component. */\nexport function SavedFilters({\n currentFilters,\n presets,\n onSavePreset,\n onLoadPreset,\n onDeletePreset,\n className,\n labels: customLabels,\n}: SavedFiltersProps) {\n const labels = { ...defaultLabels, ...customLabels };\n const [newName, setNewName] = React.useState(\"\");\n const [pendingDeleteId, setPendingDeleteId] = React.useState<string | null>(\n null,\n );\n const triggerId = React.useId();\n\n const restoreDeleteTrigger = React.useCallback((presetId: string) => {\n requestAnimationFrame(() => {\n Array.from(\n document.querySelectorAll<HTMLElement>(\"[data-saved-filter-delete]\"),\n )\n .find((element) => element.dataset.savedFilterDelete === presetId)\n ?.focus();\n });\n }, []);\n\n const cancelPendingDelete = React.useCallback(\n (presetId: string) => {\n setPendingDeleteId(null);\n restoreDeleteTrigger(presetId);\n },\n [restoreDeleteTrigger],\n );\n\n React.useEffect(() => {\n if (!pendingDeleteId) return;\n const cancelDelete = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n event.preventDefault();\n cancelPendingDelete(pendingDeleteId);\n }\n };\n window.addEventListener(\"keydown\", cancelDelete);\n return () => window.removeEventListener(\"keydown\", cancelDelete);\n }, [cancelPendingDelete, pendingDeleteId]);\n\n return (\n <PopoverRoot data-opt-id=\"SPRCB\" data-opt-slug=\"saved-filters.SavedFilters\">\n <PopoverTrigger\n id={triggerId}\n className={cn(\n \"border-border bg-surface text-text-primary hover:bg-bg-subtle inline-flex h-9 items-center gap-1.5 rounded-lg border px-3 text-sm font-medium\",\n className,\n )}\n >\n {labels.triggerLabel(presets.length)}\n </PopoverTrigger>\n <PopoverContent className=\"w-72\">\n <section className=\"gap-group flex flex-col p-2\">\n {presets.length > 0 && (\n <ul\n className=\"gap-element m-0 flex list-none flex-col p-0\"\n onKeyDown={(event) => {\n if (\n event.defaultPrevented ||\n event.altKey ||\n event.ctrlKey ||\n event.metaKey ||\n event.shiftKey ||\n !(event.target instanceof HTMLElement)\n ) {\n return;\n }\n const items = Array.from(\n event.currentTarget.querySelectorAll<HTMLElement>(\n \"[data-saved-filter-item]\",\n ),\n );\n const current = event.target.closest<HTMLElement>(\n \"[data-saved-filter-item]\",\n );\n const index = current ? items.indexOf(current) : -1;\n if (index < 0 || items.length === 0) return;\n let next: number | null = null;\n if (event.key === \"ArrowDown\") {\n next = (index + 1) % items.length;\n } else if (event.key === \"ArrowUp\") {\n next = (index - 1 + items.length) % items.length;\n } else if (event.key === \"Home\") {\n next = 0;\n } else if (event.key === \"End\") {\n next = items.length - 1;\n }\n if (next === null) return;\n event.preventDefault();\n items[next]?.focus({ preventScroll: true });\n }}\n >\n {presets.map((preset) => (\n <li\n key={preset.id}\n className=\"gap-element hover:bg-bg-subtle flex min-h-9 items-center justify-between rounded-md px-2 py-1.5\"\n >\n <button\n type=\"button\"\n data-saved-filter-item=\"\"\n className=\"text-text-primary min-w-0 flex-1 truncate text-left text-sm\"\n onClick={() => {\n setPendingDeleteId(null);\n onLoadPreset(preset);\n }}\n >\n {preset.name}\n </button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"text-text-tertiary hover:text-danger size-7 p-0\"\n data-saved-filter-delete={preset.id}\n aria-expanded={pendingDeleteId === preset.id}\n aria-controls={\n pendingDeleteId === preset.id\n ? `${triggerId}-${preset.id}`\n : undefined\n }\n onClick={() => setPendingDeleteId(preset.id)}\n aria-label={labels.deleteLabel(preset.name)}\n >\n <Trash2 size={14} aria-hidden=\"true\" />\n </Button>\n {pendingDeleteId === preset.id ? (\n <span\n className=\"flex flex-none items-center gap-1\"\n onKeyDownCapture={(event) => {\n if (event.key === \"Escape\") {\n event.preventDefault();\n event.stopPropagation();\n cancelPendingDelete(preset.id);\n }\n }}\n >\n <Button\n id={`${triggerId}-${preset.id}`}\n variant=\"danger\"\n size=\"sm\"\n className=\"h-7 px-2\"\n autoFocus\n onClick={() => {\n onDeletePreset(preset.id);\n setPendingDeleteId(null);\n requestAnimationFrame(() => {\n document.getElementById(triggerId)?.focus();\n });\n }}\n >\n {labels.confirmDeleteLabel}\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 px-2\"\n onClick={() => cancelPendingDelete(preset.id)}\n >\n {labels.cancelDeleteLabel}\n </Button>\n </span>\n ) : null}\n </li>\n ))}\n </ul>\n )}\n {presets.length === 0 && (\n <p className=\"text-text-tertiary px-2 py-1 text-sm\">\n {labels.emptyMessage}\n </p>\n )}\n <form\n className=\"gap-element border-border flex border-t pt-2\"\n onSubmit={(event) => {\n event.preventDefault();\n if (newName.trim()) {\n onSavePreset(newName.trim(), currentFilters);\n setNewName(\"\");\n setPendingDeleteId(null);\n }\n }}\n >\n <Input\n value={newName}\n onChange={(e) => setNewName(e.target.value)}\n placeholder={labels.namePlaceholder}\n aria-label={labels.namePlaceholder}\n className=\"h-8 text-sm\"\n />\n <Button\n type=\"submit\"\n size=\"sm\"\n disabled={!newName.trim()}\n className=\"h-8\"\n >\n {labels.saveLabel}\n </Button>\n </form>\n </section>\n </PopoverContent>\n </PopoverRoot>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { PopoverRoot, PopoverTrigger, PopoverContent } from \"../core/popover\";\nimport { ScrollArea } from \"../core/scroll-area\";\nimport { cn } from \"../lib/cn\";\n\n/** Defines the notification item shape. */\nexport interface NotificationItem {\n id: string;\n title: string;\n message: string;\n time: string;\n read: boolean;\n group?: string;\n actionLabel?: string;\n}\n\n/** Props for the notification center component. */\nexport interface NotificationCenterProps {\n notifications: NotificationItem[];\n onMarkRead: (id: string) => void;\n onMarkAllRead: () => void;\n onAction?: (id: string) => void;\n className?: string;\n labels?: NotificationCenterLabels;\n}\n\n/** Localized labels for the notification center component. */\nexport interface NotificationCenterLabels {\n triggerLabel?: string;\n unreadSuffix?: (count: number) => string;\n title?: string;\n markAllRead?: string;\n emptyMessage?: string;\n}\n\nconst defaultLabels: Required<NotificationCenterLabels> = {\n triggerLabel: \"Notifications\",\n unreadSuffix: (count) => `(${count} unread)`,\n title: \"Notifications\",\n markAllRead: \"Mark all read\",\n emptyMessage: \"No notifications\",\n};\n\n/** Renders the notification center component. */\nexport function NotificationCenter({\n notifications,\n onMarkRead,\n onMarkAllRead,\n onAction,\n className,\n labels: customLabels,\n}: NotificationCenterProps) {\n const labels = { ...defaultLabels, ...customLabels };\n const unreadCount = notifications.filter((n) => !n.read).length;\n\n return (\n <PopoverRoot\n data-opt-id=\"7A0XY\"\n data-opt-slug=\"notification-center.NotificationCenter\"\n >\n <PopoverTrigger\n className={cn(\n \"border-border bg-surface hover:bg-bg-subtle relative inline-flex h-9 w-9 items-center justify-center rounded-lg border\",\n className,\n )}\n aria-label={`${labels.triggerLabel}${unreadCount > 0 ? ` ${labels.unreadSuffix(unreadCount)}` : \"\"}`}\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M6 14a2 2 0 0 0 4 0M13 5a5 5 0 0 0-10 0c0 5-2 7-2 7h14s-2-2-2-7\" />\n </svg>\n {unreadCount > 0 && (\n <span className=\"bg-danger text-danger-fg absolute -top-1 -right-1 flex h-4 min-w-4 items-center justify-center rounded-full px-1 text-[10px] font-bold\">\n {unreadCount}\n </span>\n )}\n </PopoverTrigger>\n <PopoverContent className=\"w-80 p-0\">\n <div className=\"border-border flex items-center justify-between border-b px-4 py-3\">\n <h3 className=\"text-text-primary text-sm font-semibold\">\n {labels.title}\n </h3>\n {unreadCount > 0 && (\n <button\n type=\"button\"\n className=\"text-accent text-xs hover:underline\"\n onClick={onMarkAllRead}\n >\n {labels.markAllRead}\n </button>\n )}\n </div>\n <ScrollArea className=\"max-h-80\">\n {notifications.length === 0 ? (\n <p className=\"text-text-tertiary px-4 py-8 text-center text-sm\">\n {labels.emptyMessage}\n </p>\n ) : (\n notifications.map((n) => (\n <div\n key={n.id}\n className={cn(\n \"border-border flex flex-col gap-1 border-b px-4 py-3 last:border-b-0\",\n !n.read && \"bg-accent-subtle/30 cursor-pointer\",\n )}\n {...(!n.read\n ? {\n role: \"button\" as const,\n tabIndex: 0,\n onClick: () => onMarkRead(n.id),\n onKeyDown: (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onMarkRead(n.id);\n }\n },\n }\n : {})}\n >\n <div className=\"gap-element flex items-start justify-between\">\n <p className=\"text-text-primary text-sm font-medium\">\n {n.title}\n </p>\n {!n.read && (\n <span className=\"bg-accent mt-1 h-2 w-2 flex-shrink-0 rounded-full\" />\n )}\n </div>\n <p className=\"text-text-secondary text-xs\">{n.message}</p>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-text-tertiary text-xs\">{n.time}</span>\n {n.actionLabel && onAction && (\n <button\n type=\"button\"\n className=\"text-accent text-xs hover:underline\"\n onClick={(e) => {\n e.stopPropagation();\n onAction(n.id);\n }}\n >\n {n.actionLabel}\n </button>\n )}\n </div>\n </div>\n ))\n )}\n </ScrollArea>\n </PopoverContent>\n </PopoverRoot>\n );\n}\n\nNotificationCenter.displayName = \"NotificationCenter\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport { Avatar } from \"../core/avatar\";\nimport { Badge } from \"../core/badge\";\nimport { EmptyState } from \"../core/empty-state\";\nimport { cn } from \"../lib/cn\";\nimport {\n OPT_TEXT_PRIMARY,\n OPT_TEXT_SECONDARY,\n OPT_TEXT_TERTIARY,\n OPT_BORDER,\n OPT_FOCUS_VISIBLE,\n} from \"../lib/styles\";\n\n// ── Action config ──\n\nconst ACTION_BADGE_VARIANT: Record<string, \"success\" | \"info\" | \"error\"> = {\n created: \"success\",\n updated: \"info\",\n deleted: \"error\",\n};\n\nconst ACTION_DOT_COLOR: Record<string, string> = {\n created: \"bg-success\",\n updated: \"bg-info\",\n deleted: \"bg-danger\",\n};\n\n// ── Types ──\n\n/** Defines the audit entry shape. */\nexport interface AuditEntry {\n id: string;\n user: { name: string; avatar?: string };\n action: string;\n target: string;\n timestamp: string;\n metadata?: Record<string, string>;\n}\n\n/** Localized labels for the audit log component. */\nexport interface AuditLogLabels {\n title?: string;\n loading?: string;\n loadMore?: string;\n empty?: string;\n}\n\n/** Props for the audit log component. */\nexport interface AuditLogProps {\n entries: AuditEntry[];\n onLoadMore?: () => void;\n loading?: boolean;\n labels?: AuditLogLabels;\n className?: string;\n}\n\n// ── Component ──\n\n/** Renders the audit log component. */\nexport function AuditLog({\n entries,\n onLoadMore,\n loading,\n labels: customLabels,\n className,\n}: AuditLogProps) {\n const labels = {\n title: \"Activity log\",\n loading: \"Loading…\",\n loadMore: \"Load more\",\n empty: \"No activity yet\",\n ...customLabels,\n };\n\n if (entries.length === 0) {\n return (\n <EmptyState\n title={labels.empty}\n className={className}\n data-opt-id=\"VZ046\"\n data-opt-slug=\"audit-log.AuditLog\"\n />\n );\n }\n\n return (\n <div\n className={cn(\"gap-group flex flex-col\", className)}\n data-opt-id=\"VZ046\"\n data-opt-slug=\"audit-log.AuditLog\"\n >\n {/* Timeline container */}\n <div className=\"relative\" role=\"list\" aria-label={labels.title}>\n {/* Vertical timeline line — centered on avatar (left-2 + 16px = 24px) */}\n <div\n className=\"bg-border absolute top-6 bottom-6 left-[23px] w-px\"\n aria-hidden=\"true\"\n />\n\n {entries.map((entry) => {\n const badgeVariant = ACTION_BADGE_VARIANT[entry.action];\n const dotColor = ACTION_DOT_COLOR[entry.action];\n\n return (\n <div\n key={entry.id}\n className=\"relative pb-3 pl-14 last:pb-0\"\n role=\"listitem\"\n >\n {/* Timeline avatar + dot — vertically centered with card header */}\n <div className=\"absolute top-4 left-2\">\n <Avatar\n src={entry.user.avatar}\n fallback={entry.user.name[0]}\n size=\"sm\"\n />\n {dotColor && (\n <div\n className={cn(\n \"border-surface absolute -right-0.5 -bottom-0.5 h-3 w-3 rounded-full border-2\",\n dotColor,\n )}\n aria-hidden=\"true\"\n />\n )}\n </div>\n\n {/* Entry card */}\n <div\n className={cn(\n \"rounded-lg p-3\",\n OPT_BORDER,\n \"bg-surface transition-colors\",\n )}\n >\n {/* Header row */}\n <div className=\"gap-element flex items-center\">\n {badgeVariant ? (\n <Badge variant={badgeVariant} size=\"sm\" dot>\n {entry.action}\n </Badge>\n ) : (\n <span\n className={cn(\"text-xs font-medium\", OPT_TEXT_SECONDARY)}\n >\n {entry.action}\n </span>\n )}\n <span className={cn(\"text-xs\", OPT_TEXT_TERTIARY)}>\n <time>{entry.timestamp}</time>\n </span>\n <span\n className={cn(\n \"ml-auto text-xs font-medium\",\n OPT_TEXT_SECONDARY,\n )}\n >\n {entry.user.name}\n </span>\n </div>\n\n {/* Action summary */}\n <p className={cn(\"mt-1.5 text-sm\", OPT_TEXT_PRIMARY)}>\n <span className=\"font-medium\">{entry.user.name}</span>{\" \"}\n {entry.action}{\" \"}\n <span className=\"font-medium\">{entry.target}</span>\n </p>\n\n {/* Metadata tags */}\n {entry.metadata && (\n <div className=\"gap-element mt-2 flex flex-wrap\">\n {Object.entries(entry.metadata).map(([k, v]) => (\n <span\n key={k}\n className=\"bg-bg-subtle text-text-secondary inline-flex items-center rounded px-1.5 py-0.5 text-xs\"\n >\n {k}: {v}\n </span>\n ))}\n </div>\n )}\n </div>\n </div>\n );\n })}\n </div>\n\n {onLoadMore && (\n <button\n type=\"button\"\n onClick={onLoadMore}\n disabled={loading}\n className={cn(\n \"text-accent mt-1 self-center rounded-md px-3 py-1.5 text-sm hover:underline disabled:opacity-50\",\n OPT_FOCUS_VISIBLE,\n )}\n >\n {loading ? labels.loading : labels.loadMore}\n </button>\n )}\n </div>\n );\n}\n\nAuditLog.displayName = \"AuditLog\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../lib/cn\";\nimport { OPT_BORDER, OPT_TH, OPT_TD, OPT_FOCUS_VISIBLE } from \"../lib/styles\";\n\n/** Defines the tree column shape. */\nexport interface TreeColumnDef<T> {\n id: string;\n header: string;\n accessor: keyof T | ((row: T) => React.ReactNode);\n width?: string;\n}\n\n/** Defines the tree node shape. */\nexport interface TreeNode<T> {\n data: T;\n id: string;\n children?: TreeNode<T>[];\n}\n\n/** Localized labels for the tree table component. */\nexport type TreeTableLabels = Record<never, never>;\n\n/** Props for the tree table component. */\nexport interface TreeTableProps<T> {\n data: TreeNode<T>[];\n columns: TreeColumnDef<T>[];\n defaultExpanded?: string[];\n indentSize?: number;\n className?: string;\n}\n\n/** Renders the tree table component. */\nexport function TreeTable<T>({\n data,\n columns,\n defaultExpanded = [],\n indentSize = 24,\n className,\n}: TreeTableProps<T>) {\n const [expanded, setExpanded] = React.useState<Set<string>>(\n () => new Set(defaultExpanded),\n );\n\n const toggle = (id: string) => {\n setExpanded((prev) => {\n const next = new Set(prev);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n };\n\n const getCellValue = (row: T, col: TreeColumnDef<T>) => {\n if (typeof col.accessor === \"function\") return col.accessor(row);\n return String(row[col.accessor] ?? \"\");\n };\n\n const renderRows = (nodes: TreeNode<T>[], depth: number): React.ReactNode[] =>\n nodes.flatMap((node) => {\n const hasChildren = node.children && node.children.length > 0;\n const isExpanded = expanded.has(node.id);\n return [\n <tr key={node.id} className=\"border-border border-b\">\n {columns.map((col, ci) => (\n <td key={col.id} className={cn(OPT_TD)}>\n <div\n className=\"flex items-center\"\n style={\n ci === 0 ? { paddingLeft: depth * indentSize } : undefined\n }\n >\n {ci === 0 && hasChildren && (\n <button\n type=\"button\"\n onClick={() => toggle(node.id)}\n className={cn(\n \"mr-1 flex h-5 w-5 items-center justify-center rounded text-xs\",\n OPT_FOCUS_VISIBLE,\n )}\n aria-expanded={isExpanded}\n aria-label={isExpanded ? \"Collapse\" : \"Expand\"}\n >\n {isExpanded ? \"▼\" : \"▶\"}\n </button>\n )}\n {ci === 0 && !hasChildren && (\n <span className=\"mr-1 inline-block w-5\" />\n )}\n {getCellValue(node.data, col)}\n </div>\n </td>\n ))}\n </tr>,\n ...(isExpanded && hasChildren\n ? renderRows(node.children!, depth + 1)\n : []),\n ];\n });\n\n return (\n <div\n className={cn(\"overflow-auto\", className)}\n data-opt-id=\"EJRTW\"\n data-opt-slug=\"tree-table.TreeTable\"\n >\n <table className={cn(\"w-full border-collapse\", OPT_BORDER)}>\n <thead>\n <tr className=\"border-border border-b\">\n {columns.map((col) => (\n <th\n key={col.id}\n className={cn(OPT_TH)}\n style={{ width: col.width }}\n >\n {col.header}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>{renderRows(data, 0)}</tbody>\n </table>\n </div>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { EmptyState } from \"../core/empty-state\";\nimport { cn } from \"../lib/cn\";\nimport { OPT_BORDER, OPT_TH, OPT_TD, OPT_INPUT } from \"../lib/styles\";\n\n/** Defines the inline edit column shape. */\nexport interface InlineEditColumnDef<T> {\n id: string;\n header: string;\n accessor: keyof T | ((row: T) => React.ReactNode);\n editable?: boolean;\n width?: string;\n}\n\n/** Props for the inline edit table component. */\nexport interface InlineEditTableProps<T> {\n data: T[];\n columns: InlineEditColumnDef<T>[];\n keyExtractor: (row: T) => string;\n onCellEdit?: (rowId: string, columnId: string, value: string) => void;\n labels?: InlineEditTableLabels;\n className?: string;\n}\n\n/** Localized labels for the inline edit table component. */\nexport interface InlineEditTableLabels {\n emptyMessage?: string;\n}\n\nconst defaultLabels: Required<InlineEditTableLabels> = {\n emptyMessage: \"No rows to edit\",\n};\n\n/** Renders the inline edit table component. */\nexport function InlineEditTable<T>({\n data,\n columns,\n keyExtractor,\n onCellEdit,\n labels: customLabels,\n className,\n}: InlineEditTableProps<T>) {\n const labels = { ...defaultLabels, ...customLabels };\n const [editCell, setEditCell] = React.useState<{\n rowId: string;\n colId: string;\n } | null>(null);\n const [editValue, setEditValue] = React.useState(\"\");\n const inputRef = React.useRef<HTMLInputElement>(null);\n\n const getCellValue = (row: T, col: InlineEditColumnDef<T>): string => {\n if (typeof col.accessor === \"function\")\n return String(col.accessor(row) ?? \"\");\n return String(row[col.accessor] ?? \"\");\n };\n\n const startEdit = (rowId: string, colId: string, currentValue: string) => {\n setEditCell({ rowId, colId });\n setEditValue(currentValue);\n };\n\n const confirmEdit = () => {\n if (editCell && onCellEdit) {\n onCellEdit(editCell.rowId, editCell.colId, editValue);\n }\n setEditCell(null);\n };\n\n const cancelEdit = () => setEditCell(null);\n\n React.useEffect(() => {\n if (editCell) inputRef.current?.focus();\n }, [editCell]);\n\n if (data.length === 0) {\n return (\n <div\n className={cn(\"flex min-h-40 items-center justify-center\", className)}\n data-opt-id=\"5W3J1\"\n data-opt-slug=\"inline-edit-table.InlineEditTable\"\n >\n <EmptyState title={labels.emptyMessage} />\n </div>\n );\n }\n\n return (\n <div\n className={cn(\"overflow-auto\", className)}\n data-opt-id=\"5W3J1\"\n data-opt-slug=\"inline-edit-table.InlineEditTable\"\n >\n <table className={cn(\"w-full border-collapse\", OPT_BORDER)}>\n <thead>\n <tr className=\"border-border border-b\">\n {columns.map((col) => (\n <th\n key={col.id}\n className={cn(OPT_TH)}\n style={{ width: col.width }}\n >\n {col.header}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {data.map((row) => {\n const rowId = keyExtractor(row);\n return (\n <tr key={rowId} className=\"border-border border-b\">\n {columns.map((col) => {\n const isEditing =\n editCell?.rowId === rowId && editCell?.colId === col.id;\n const value = getCellValue(row, col);\n return (\n <td key={col.id} className={cn(OPT_TD)}>\n {isEditing ? (\n <input\n ref={inputRef}\n className={cn(\n \"w-full rounded px-2 py-1 text-sm\",\n OPT_INPUT,\n )}\n value={editValue}\n onChange={(e) => setEditValue(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \"Tab\") {\n e.preventDefault();\n confirmEdit();\n }\n if (e.key === \"Escape\") cancelEdit();\n }}\n onBlur={confirmEdit}\n />\n ) : (\n <span\n className={\n col.editable\n ? \"cursor-pointer hover:underline\"\n : undefined\n }\n onDoubleClick={() =>\n col.editable && startEdit(rowId, col.id, value)\n }\n onKeyDown={(e) => {\n if (col.editable && e.key === \"Enter\")\n startEdit(rowId, col.id, value);\n }}\n tabIndex={col.editable ? 0 : undefined}\n role={col.editable ? \"button\" : undefined}\n >\n {value}\n </span>\n )}\n </td>\n );\n })}\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { EmptyState } from \"../core/empty-state\";\nimport { cn } from \"../lib/cn\";\n\n/** Defines the kanban column shape. */\nexport interface KanbanColumn<T> {\n id: string;\n title: string;\n items: T[];\n}\n\n/** Localized labels for the kanban board component. */\nexport type KanbanBoardLabels = Record<never, never>;\n\n/** Props for the kanban board component. */\nexport interface KanbanBoardProps<T> {\n columns: KanbanColumn<T>[];\n onDragEnd: (\n itemId: string,\n fromColumnId: string,\n toColumnId: string,\n toIndex: number,\n ) => void;\n renderCard: (item: T) => React.ReactNode;\n keyExtractor: (item: T) => string;\n emptyMessage?: string;\n className?: string;\n}\n\n/** Renders the kanban board component. */\nexport function KanbanBoard<T>({\n columns,\n onDragEnd,\n renderCard,\n keyExtractor,\n emptyMessage = \"No items yet\",\n className,\n}: KanbanBoardProps<T>) {\n const [dragItem, setDragItem] = React.useState<{\n id: string;\n fromCol: string;\n } | null>(null);\n const [dropTarget, setDropTarget] = React.useState<{\n colId: string;\n index: number;\n } | null>(null);\n\n const handleDragStart =\n (itemId: string, colId: string) => (e: React.DragEvent) => {\n e.dataTransfer.effectAllowed = \"move\";\n setDragItem({ id: itemId, fromCol: colId });\n };\n\n const handleDragOver =\n (colId: string, index: number) => (e: React.DragEvent) => {\n e.preventDefault();\n e.dataTransfer.dropEffect = \"move\";\n setDropTarget({ colId, index });\n };\n\n const handleDrop = (colId: string, index: number) => (e: React.DragEvent) => {\n e.preventDefault();\n if (dragItem) {\n onDragEnd(dragItem.id, dragItem.fromCol, colId, index);\n }\n setDragItem(null);\n setDropTarget(null);\n };\n\n const handleDragEnd = () => {\n setDragItem(null);\n setDropTarget(null);\n };\n\n if (columns.length === 0) {\n return (\n <EmptyState\n title={emptyMessage}\n className={className}\n data-opt-id=\"T6JWY\"\n data-opt-slug=\"kanban-board.KanbanBoard\"\n />\n );\n }\n\n return (\n <div\n className={cn(\"gap-group flex overflow-x-auto\", className)}\n data-opt-id=\"T6JWY\"\n data-opt-slug=\"kanban-board.KanbanBoard\"\n >\n {columns.map((col) => (\n <div\n key={col.id}\n className=\"bg-bg-subtle flex min-w-[280px] flex-1 flex-col rounded-lg p-3\"\n onDragOver={(e) => {\n e.preventDefault();\n if (col.items.length === 0)\n setDropTarget({ colId: col.id, index: 0 });\n }}\n onDrop={(e) => {\n if (col.items.length === 0) handleDrop(col.id, 0)(e);\n }}\n >\n <div className=\"mb-3 flex items-center justify-between\">\n <h3 className=\"text-text-primary text-sm font-semibold\">\n {col.title}\n </h3>\n <span className=\"text-text-tertiary text-xs\">\n {col.items.length}\n </span>\n </div>\n <div className=\"gap-element flex flex-1 flex-col\">\n {col.items.map((item, i) => {\n const id = keyExtractor(item);\n const isDropHere =\n dropTarget?.colId === col.id && dropTarget?.index === i;\n return (\n <React.Fragment key={id}>\n {isDropHere && (\n <div className=\"bg-accent h-0.5 rounded-full\" />\n )}\n <div\n draggable\n onDragStart={handleDragStart(id, col.id)}\n onDragOver={handleDragOver(col.id, i)}\n onDrop={handleDrop(col.id, i)}\n onDragEnd={handleDragEnd}\n className={cn(\n \"bg-surface border-border cursor-grab rounded-lg border p-3 shadow-sm transition-opacity\",\n dragItem?.id === id && \"opacity-50\",\n )}\n >\n {renderCard(item)}\n </div>\n </React.Fragment>\n );\n })}\n {dropTarget?.colId === col.id &&\n dropTarget?.index === col.items.length && (\n <div className=\"bg-accent h-0.5 rounded-full\" />\n )}\n </div>\n </div>\n ))}\n </div>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../lib/cn\";\nimport { OPT_FOCUS_VISIBLE } from \"../lib/styles\";\n\ntype ToolbarAction =\n | \"bold\"\n | \"italic\"\n | \"link\"\n | \"code\"\n | \"heading\"\n | \"list\"\n | \"quote\";\n\n/** Localized labels for the rich text editor component. */\nexport type RichTextEditorLabels = Record<never, never>;\n\n/** Props for the rich text editor component. */\nexport interface RichTextEditorProps {\n value: string;\n onChange: (value: string) => void;\n placeholder?: string;\n toolbar?: ToolbarAction[];\n className?: string;\n}\n\nconst TOOLBAR_BUTTONS: Record<\n ToolbarAction,\n { label: string; prefix: string; suffix: string; block?: boolean }\n> = {\n bold: { label: \"B\", prefix: \"**\", suffix: \"**\" },\n italic: { label: \"I\", prefix: \"_\", suffix: \"_\" },\n code: { label: \"</>\", prefix: \"`\", suffix: \"`\" },\n link: { label: \"\\uD83D\\uDD17\", prefix: \"[\", suffix: \"](url)\" },\n heading: { label: \"H\", prefix: \"## \", suffix: \"\", block: true },\n list: { label: \"\\u2022\", prefix: \"- \", suffix: \"\", block: true },\n quote: { label: \">\", prefix: \"> \", suffix: \"\", block: true },\n};\n\n/** Renders the rich text editor component. */\nexport function RichTextEditor({\n value,\n onChange,\n placeholder = \"Write something\\u2026\",\n toolbar = [\"bold\", \"italic\", \"code\", \"link\", \"heading\", \"list\", \"quote\"],\n className,\n}: RichTextEditorProps) {\n const textareaRef = React.useRef<HTMLTextAreaElement>(null);\n\n const applyFormat = (action: ToolbarAction) => {\n const ta = textareaRef.current;\n if (!ta) return;\n\n const { selectionStart, selectionEnd } = ta;\n const selected = value.slice(selectionStart, selectionEnd);\n const btn = TOOLBAR_BUTTONS[action];\n\n let replacement: string;\n let cursorOffset: number;\n\n if (btn.block) {\n const lineStart = value.lastIndexOf(\"\\n\", selectionStart - 1) + 1;\n const before = value.slice(0, lineStart);\n const after = value.slice(selectionStart);\n const newValue = before + btn.prefix + after;\n onChange(newValue);\n cursorOffset = lineStart + btn.prefix.length;\n setTimeout(() => ta.setSelectionRange(cursorOffset, cursorOffset), 0);\n return;\n }\n\n if (selected) {\n replacement = btn.prefix + selected + btn.suffix;\n cursorOffset = selectionStart + replacement.length;\n } else {\n replacement = btn.prefix + \"text\" + btn.suffix;\n cursorOffset = selectionStart + btn.prefix.length + 4;\n }\n\n const newValue =\n value.slice(0, selectionStart) + replacement + value.slice(selectionEnd);\n onChange(newValue);\n setTimeout(() => {\n if (selected) {\n ta.setSelectionRange(cursorOffset, cursorOffset);\n } else {\n ta.setSelectionRange(\n selectionStart + btn.prefix.length,\n selectionStart + btn.prefix.length + 4,\n );\n }\n }, 0);\n };\n\n return (\n <div\n className={cn(\n \"border-border flex flex-col overflow-hidden rounded-lg border\",\n className,\n )}\n data-opt-id=\"441JQ\"\n data-opt-slug=\"rich-text-editor.RichTextEditor\"\n >\n <div className=\"border-border bg-bg-subtle flex gap-1 border-b px-2 py-1.5\">\n {toolbar.map((action) => (\n <button\n key={action}\n type=\"button\"\n onClick={() => applyFormat(action)}\n className={cn(\n \"text-text-secondary hover:bg-surface hover:text-text-primary inline-flex h-7 min-w-7 items-center justify-center rounded px-1.5 text-xs font-medium\",\n OPT_FOCUS_VISIBLE,\n )}\n title={action}\n aria-label={action}\n >\n {TOOLBAR_BUTTONS[action].label}\n </button>\n ))}\n </div>\n <textarea\n ref={textareaRef}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n placeholder={placeholder}\n aria-label=\"Rich text editor\"\n className=\"text-text-primary placeholder:text-text-tertiary focus-visible:ring-ring focus-visible:ring-offset-ring-offset min-h-[160px] resize-y bg-transparent px-3 py-2 font-mono text-sm outline-none focus-visible:ring-2 focus-visible:ring-offset-1\"\n />\n </div>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../lib/cn\";\nimport { OPT_FOCUS_VISIBLE } from \"../lib/styles\";\n\n/** Localized labels for the code diff viewer component. */\nexport type CodeDiffViewerLabels = Record<never, never>;\n\n/** Props for the code diff viewer component. */\nexport interface CodeDiffViewerProps {\n original: string;\n modified: string;\n mode?: \"split\" | \"unified\";\n showLineNumbers?: boolean;\n scrollLabel?: string;\n className?: string;\n}\n\ninterface DiffLine {\n type: \"equal\" | \"add\" | \"remove\";\n content: string;\n oldLineNo?: number;\n newLineNo?: number;\n}\n\nfunction computeDiff(original: string, modified: string): DiffLine[] {\n const oldLines = original.split(\"\\n\");\n const newLines = modified.split(\"\\n\");\n const m = oldLines.length;\n const n = newLines.length;\n\n // LCS DP\n const dp: number[][] = Array.from({ length: m + 1 }, () =>\n Array(n + 1).fill(0),\n );\n for (let i = 1; i <= m; i++) {\n for (let j = 1; j <= n; j++) {\n dp[i][j] =\n oldLines[i - 1] === newLines[j - 1]\n ? dp[i - 1][j - 1] + 1\n : Math.max(dp[i - 1][j], dp[i][j - 1]);\n }\n }\n\n // Backtrack\n const result: DiffLine[] = [];\n let i = m,\n j = n;\n while (i > 0 || j > 0) {\n if (i > 0 && j > 0 && oldLines[i - 1] === newLines[j - 1]) {\n result.unshift({\n type: \"equal\",\n content: oldLines[i - 1],\n oldLineNo: i,\n newLineNo: j,\n });\n i--;\n j--;\n } else if (j > 0 && (i === 0 || dp[i][j - 1] >= dp[i - 1][j])) {\n result.unshift({ type: \"add\", content: newLines[j - 1], newLineNo: j });\n j--;\n } else {\n result.unshift({\n type: \"remove\",\n content: oldLines[i - 1],\n oldLineNo: i,\n });\n i--;\n }\n }\n return result;\n}\n\nconst LINE_STYLES: Record<DiffLine[\"type\"], string> = {\n equal: \"\",\n add: \"bg-success-subtle text-success-fg\",\n remove: \"bg-danger-subtle text-danger-fg\",\n};\n\nconst LINE_PREFIXES: Record<DiffLine[\"type\"], string> = {\n equal: \" \",\n add: \"+\",\n remove: \"-\",\n};\n\n/** Renders the code diff viewer component. */\nexport function CodeDiffViewer({\n original,\n modified,\n mode = \"unified\",\n showLineNumbers = true,\n scrollLabel,\n className,\n}: CodeDiffViewerProps) {\n const diff = React.useMemo(\n () => computeDiff(original, modified),\n [original, modified],\n );\n\n if (mode === \"split\") {\n return (\n <div\n className={cn(\n \"border-border overflow-auto rounded-lg border\",\n OPT_FOCUS_VISIBLE,\n className,\n )}\n tabIndex={0}\n role=\"region\"\n aria-label={scrollLabel ?? \"Code diff\"}\n data-opt-id=\"GSDVD\"\n data-opt-slug=\"code-diff-viewer.CodeDiffViewer\"\n >\n <div className=\"flex\">\n <div className=\"flex-1 overflow-auto\">\n <pre className=\"font-mono text-xs leading-6\">\n {diff\n .filter((l) => l.type !== \"add\")\n .map((line, i) => (\n <div key={i} className={cn(\"px-3\", LINE_STYLES[line.type])}>\n {showLineNumbers && (\n <span className=\"text-text-tertiary mr-4 inline-block w-8 text-right select-none\">\n {line.oldLineNo ?? \"\"}\n </span>\n )}\n {LINE_PREFIXES[line.type]} {line.content}\n </div>\n ))}\n </pre>\n </div>\n <div className=\"bg-border w-px\" />\n <div className=\"flex-1 overflow-auto\">\n <pre className=\"font-mono text-xs leading-6\">\n {diff\n .filter((l) => l.type !== \"remove\")\n .map((line, i) => (\n <div key={i} className={cn(\"px-3\", LINE_STYLES[line.type])}>\n {showLineNumbers && (\n <span className=\"text-text-tertiary mr-4 inline-block w-8 text-right select-none\">\n {line.newLineNo ?? \"\"}\n </span>\n )}\n {LINE_PREFIXES[line.type]} {line.content}\n </div>\n ))}\n </pre>\n </div>\n </div>\n </div>\n );\n }\n\n return (\n <div\n className={cn(\n \"border-border overflow-auto rounded-lg border\",\n OPT_FOCUS_VISIBLE,\n className,\n )}\n tabIndex={0}\n role=\"region\"\n aria-label={scrollLabel ?? \"Code diff\"}\n data-opt-id=\"GSDVD\"\n data-opt-slug=\"code-diff-viewer.CodeDiffViewer\"\n >\n <pre className=\"font-mono text-xs leading-6\">\n {diff.map((line, i) => (\n <div key={i} className={cn(\"px-3\", LINE_STYLES[line.type])}>\n {showLineNumbers && (\n <>\n <span className=\"text-text-tertiary mr-2 inline-block w-8 text-right select-none\">\n {line.oldLineNo ?? \"\"}\n </span>\n <span className=\"text-text-tertiary mr-4 inline-block w-8 text-right select-none\">\n {line.newLineNo ?? \"\"}\n </span>\n </>\n )}\n {LINE_PREFIXES[line.type]} {line.content}\n </div>\n ))}\n </pre>\n </div>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { Input } from \"../core/input\";\nimport { Button } from \"../core/button\";\nimport { Checkbox } from \"../core/checkbox\";\nimport { NumberInput } from \"../core/number-input\";\nimport { cn } from \"../lib/cn\";\n\n/** Defines the webhook shape. */\nexport interface WebhookDef {\n url: string;\n events: string[];\n retries: number;\n active: boolean;\n}\n\n/** Props for the webhook component. */\nexport interface WebhookConfigProps {\n webhook: WebhookDef;\n onChange: (webhook: WebhookDef) => void;\n availableEvents: string[];\n onTest?: () => void;\n className?: string;\n labels?: WebhookConfigLabels;\n}\n\n/** Localized labels for the webhook component. */\nexport interface WebhookConfigLabels {\n webhookUrl?: string;\n events?: string;\n retries?: string;\n testWebhook?: string;\n emptyEventsMessage?: string;\n}\n\nconst defaultLabels: Required<WebhookConfigLabels> = {\n webhookUrl: \"Webhook URL\",\n events: \"Events\",\n retries: \"Retries\",\n testWebhook: \"Test Webhook\",\n emptyEventsMessage: \"No events available\",\n};\n\n/** Renders the webhook config component. */\nexport function WebhookConfig({\n webhook,\n onChange,\n availableEvents,\n onTest,\n className,\n labels: customLabels,\n}: WebhookConfigProps) {\n const labels = { ...defaultLabels, ...customLabels };\n const toggleEvent = (event: string) => {\n const events = webhook.events.includes(event)\n ? webhook.events.filter((e) => e !== event)\n : [...webhook.events, event];\n onChange({ ...webhook, events });\n };\n\n return (\n <div\n className={cn(\"gap-group flex flex-col\", className)}\n data-opt-id=\"B6B1Z\"\n data-opt-slug=\"webhook-config.WebhookConfig\"\n >\n <div className=\"gap-element flex flex-col\">\n <label className=\"text-text-primary text-sm font-medium\">\n {labels.webhookUrl}\n </label>\n <Input\n value={webhook.url}\n onChange={(e) => onChange({ ...webhook, url: e.target.value })}\n placeholder=\"https://example.com/webhook\"\n />\n </div>\n\n <div className=\"gap-element flex flex-col\">\n <label className=\"text-text-primary text-sm font-medium\">\n {labels.events}\n </label>\n <div className=\"gap-element flex flex-wrap\">\n {availableEvents.length > 0 ? (\n availableEvents.map((event) => (\n <label key={event} className=\"flex items-center gap-1.5 text-sm\">\n <Checkbox\n name={`event-${event}`}\n checked={webhook.events.includes(event)}\n onChange={() => toggleEvent(event)}\n />\n <span className=\"text-text-secondary\">{event}</span>\n </label>\n ))\n ) : (\n <span className=\"text-text-tertiary text-sm\">\n {labels.emptyEventsMessage}\n </span>\n )}\n </div>\n </div>\n\n <div className=\"gap-element flex flex-col\">\n <label className=\"text-text-primary text-sm font-medium\">\n {labels.retries}\n </label>\n <NumberInput\n value={webhook.retries}\n onChange={(v) => onChange({ ...webhook, retries: v })}\n min={0}\n max={10}\n />\n </div>\n\n {onTest && (\n <div className=\"flex justify-end\">\n <Button variant=\"secondary\" onClick={onTest}>\n {labels.testWebhook}\n </Button>\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { Switch } from \"../core/switch\";\nimport { Badge } from \"../core/badge\";\nimport { NumberInput } from \"../core/number-input\";\nimport { cn } from \"../lib/cn\";\n\n/** Defines the feature flag shape. */\nexport interface FeatureFlag {\n id: string;\n name: string;\n description?: string;\n enabled: boolean;\n environments: string[];\n rolloutPercentage?: number;\n}\n\n/** Props for the feature flag panel component. */\nexport interface FeatureFlagPanelProps {\n flags: FeatureFlag[];\n onToggle: (flagId: string, enabled: boolean) => void;\n onRolloutChange?: (flagId: string, percentage: number) => void;\n environments: string[];\n className?: string;\n labels?: FeatureFlagPanelLabels;\n}\n\n/** Localized labels for the feature flag panel component. */\nexport interface FeatureFlagPanelLabels {\n enabled?: string;\n disabled?: string;\n rolloutLabel?: string;\n emptyMessage?: string;\n}\n\nconst defaultLabels: Required<FeatureFlagPanelLabels> = {\n enabled: \"Enabled\",\n disabled: \"Disabled\",\n rolloutLabel: \"Rollout %\",\n emptyMessage: \"No feature flags configured.\",\n};\n\n/** Renders the feature flag panel component. */\nexport function FeatureFlagPanel({\n flags,\n onToggle,\n onRolloutChange,\n environments,\n className,\n labels: customLabels,\n}: FeatureFlagPanelProps) {\n const labels = { ...defaultLabels, ...customLabels };\n\n if (flags.length === 0) {\n return (\n <div\n className={cn(\"text-text-tertiary text-sm\", className)}\n data-opt-id=\"JW164\"\n data-opt-slug=\"feature-flag-panel.FeatureFlagPanel\"\n >\n {labels.emptyMessage}\n </div>\n );\n }\n\n return (\n <div\n className={cn(\"gap-group flex flex-col\", className)}\n data-opt-id=\"JW164\"\n data-opt-slug=\"feature-flag-panel.FeatureFlagPanel\"\n >\n {flags.map((flag) => (\n <div\n key={flag.id}\n className=\"border-border bg-surface gap-element flex flex-col rounded-lg border p-4\"\n >\n <div className=\"flex items-center justify-between\">\n <div className=\"flex flex-col gap-0.5\">\n <span className=\"text-text-primary text-sm font-medium\">\n {flag.name}\n </span>\n {flag.description && (\n <span className=\"text-text-tertiary text-xs\">\n {flag.description}\n </span>\n )}\n </div>\n <Switch\n checked={flag.enabled}\n onChange={(checked) => onToggle(flag.id, checked)}\n label={flag.enabled ? labels.enabled : labels.disabled}\n />\n </div>\n\n <div className=\"flex flex-wrap gap-1\">\n {environments.map((env) => (\n <Badge\n key={env}\n variant={\n flag.environments.includes(env) ? \"success\" : \"default\"\n }\n >\n {env}\n </Badge>\n ))}\n </div>\n\n {onRolloutChange && flag.rolloutPercentage !== undefined && (\n <div className=\"gap-element flex items-center\">\n <span className=\"text-text-secondary text-xs\">\n {labels.rolloutLabel}\n </span>\n <NumberInput\n value={flag.rolloutPercentage}\n onChange={(v) => onRolloutChange(flag.id, v)}\n min={0}\n max={100}\n step={5}\n />\n </div>\n )}\n </div>\n ))}\n </div>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { Button } from \"../core/button\";\nimport { cn } from \"../lib/cn\";\n\n/** Defines the import field shape. */\nexport interface ImportFieldDef {\n id: string;\n label: string;\n required?: boolean;\n}\n\n/** Localized labels for the data import wizard component. */\nexport interface DataImportWizardLabels {\n stepsLabel?: string;\n upload?: string;\n mapColumns?: string;\n preview?: string;\n confirm?: string;\n dropPrompt?: string;\n selectColumn?: string;\n back?: string;\n next?: string;\n import?: string;\n uploadFileAriaLabel?: string;\n previewSummary?: (shown: number, total: number) => string;\n confirmSummary?: (rows: number, mappedFields: number) => string;\n}\n\n/** Props for the data import wizard component. */\nexport interface DataImportWizardProps {\n fields: ImportFieldDef[];\n onImport: (mapping: Record<string, string>, data: string[][]) => void;\n acceptedFormats?: string;\n labels?: DataImportWizardLabels;\n className?: string;\n}\n\n/** Renders the data import wizard component. */\nexport function DataImportWizard({\n fields,\n onImport,\n acceptedFormats = \".csv\",\n labels: customLabels,\n className,\n}: DataImportWizardProps) {\n const labels = {\n stepsLabel: \"Import steps\",\n upload: \"Upload\",\n mapColumns: \"Map Columns\",\n preview: \"Preview\",\n confirm: \"Confirm\",\n dropPrompt: \"Drop a file or click to upload\",\n selectColumn: \"Select column…\",\n back: \"Back\",\n next: \"Next\",\n import: \"Import\",\n uploadFileAriaLabel: \"Upload file\",\n previewSummary: (shown: number, total: number) =>\n `Showing ${shown} of ${total} rows`,\n confirmSummary: (rows: number, mappedFields: number) =>\n `Ready to import ${rows} rows with ${mappedFields} mapped fields.`,\n ...customLabels,\n };\n const [step, setStep] = React.useState(0);\n const [headers, setHeaders] = React.useState<string[]>([]);\n const [rows, setRows] = React.useState<string[][]>([]);\n const [mapping, setMapping] = React.useState<Record<string, string>>({});\n\n const handleFileChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file) return;\n const reader = new FileReader();\n reader.onload = (ev) => {\n const text = ev.target?.result as string;\n const lines = text.split(\"\\n\").filter(Boolean);\n if (lines.length > 0) {\n setHeaders(lines[0].split(\",\").map((h) => h.trim()));\n setRows(lines.slice(1).map((l) => l.split(\",\").map((c) => c.trim())));\n setStep(1);\n }\n };\n reader.readAsText(file);\n };\n\n const steps = [\n labels.upload,\n labels.mapColumns,\n labels.preview,\n labels.confirm,\n ];\n\n return (\n <div\n className={cn(\"gap-group flex flex-col\", className)}\n data-opt-id=\"QD9XR\"\n data-opt-slug=\"data-import-wizard.DataImportWizard\"\n >\n {/* Step indicator */}\n <ol\n className=\"gap-element flex list-none p-0\"\n aria-label={labels.stepsLabel}\n >\n {steps.map((s, i) => (\n <li\n key={s}\n className=\"flex items-center gap-1\"\n aria-current={i === step ? \"step\" : undefined}\n >\n <div\n aria-hidden=\"true\"\n className={cn(\n \"flex h-6 w-6 items-center justify-center rounded-full text-xs font-medium\",\n i <= step\n ? \"bg-accent text-accent-fg\"\n : \"bg-bg-subtle text-text-tertiary\",\n )}\n >\n {i + 1}\n </div>\n <span\n className={cn(\n \"text-xs\",\n i <= step ? \"text-text-primary\" : \"text-text-tertiary\",\n )}\n >\n {s}\n </span>\n {i < steps.length - 1 && (\n <div className=\"bg-border mx-1 h-px w-4\" aria-hidden=\"true\" />\n )}\n </li>\n ))}\n </ol>\n\n {/* Step 0: Upload */}\n {step === 0 && (\n <div className=\"border-border gap-element flex flex-col items-center rounded-lg border border-dashed p-8\">\n <p className=\"text-text-secondary text-sm\">{labels.dropPrompt}</p>\n <input\n type=\"file\"\n accept={acceptedFormats}\n onChange={handleFileChange}\n className=\"text-sm\"\n aria-label={labels.uploadFileAriaLabel}\n />\n </div>\n )}\n\n {/* Step 1: Map columns */}\n {step === 1 && (\n <div className=\"gap-element flex flex-col\">\n {fields.map((field) => (\n <div key={field.id} className=\"gap-element flex items-center\">\n <span className=\"text-text-primary w-32 text-sm\">\n {field.label}\n {field.required && <span className=\"text-danger\">*</span>}\n </span>\n <select\n className=\"border-border bg-surface text-text-primary rounded-md border px-2 py-1 text-sm\"\n value={mapping[field.id] || \"\"}\n onChange={(e) =>\n setMapping({ ...mapping, [field.id]: e.target.value })\n }\n aria-label={`Map ${field.label}`}\n >\n <option value=\"\">{labels.selectColumn}</option>\n {headers.map((h) => (\n <option key={h} value={h}>\n {h}\n </option>\n ))}\n </select>\n </div>\n ))}\n <div className=\"gap-element flex justify-end\">\n <Button variant=\"secondary\" onClick={() => setStep(0)}>\n {labels.back}\n </Button>\n <Button onClick={() => setStep(2)}>{labels.next}</Button>\n </div>\n </div>\n )}\n\n {/* Step 2: Preview */}\n {step === 2 && (\n <div className=\"gap-element flex flex-col\">\n <div className=\"overflow-auto\">\n <table className=\"border-border w-full border-collapse text-sm\">\n <thead>\n <tr className=\"border-border border-b\">\n {headers.map((h) => (\n <th\n key={h}\n className=\"text-text-primary px-3 py-2 text-left font-medium\"\n >\n {h}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.slice(0, 5).map((row, i) => (\n <tr key={i} className=\"border-border border-b\">\n {row.map((cell, j) => (\n <td key={j} className=\"text-text-secondary px-3 py-2\">\n {cell}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n <p className=\"text-text-tertiary text-xs\">\n {labels.previewSummary(Math.min(5, rows.length), rows.length)}\n </p>\n <div className=\"gap-element flex justify-end\">\n <Button variant=\"secondary\" onClick={() => setStep(1)}>\n {labels.back}\n </Button>\n <Button onClick={() => setStep(3)}>{labels.next}</Button>\n </div>\n </div>\n )}\n\n {/* Step 3: Confirm */}\n {step === 3 && (\n <div className=\"gap-group flex flex-col items-center py-8\">\n <p className=\"text-text-primary text-sm\">\n {labels.confirmSummary(rows.length, Object.keys(mapping).length)}\n </p>\n <div className=\"gap-element flex\">\n <Button variant=\"secondary\" onClick={() => setStep(2)}>\n {labels.back}\n </Button>\n <Button onClick={() => onImport(mapping, rows)}>\n {labels.import}\n </Button>\n </div>\n </div>\n )}\n </div>\n );\n}\n","import * as React from \"react\";\nimport { PopoverRoot, PopoverTrigger, PopoverContent } from \"../core/popover\";\nimport { cn } from \"../lib/cn\";\n\n/** Defines the mega menu item shape. */\nexport interface MegaMenuItem {\n label: string;\n href?: string;\n description?: string;\n icon?: React.ReactNode;\n}\n\n/** Defines the mega menu section shape. */\nexport interface MegaMenuSection {\n title: string;\n items: MegaMenuItem[];\n}\n\n/** Props for the mega menu component. */\nexport interface MegaMenuProps {\n menus: MegaMenuSection[];\n columns?: number;\n footer?: React.ReactNode;\n triggerLabel?: string;\n labels?: MegaMenuLabels;\n className?: string;\n}\n\n/** Localized labels for the mega menu component. */\nexport interface MegaMenuLabels {\n trigger?: string;\n}\n\nconst defaultLabels: Required<MegaMenuLabels> = {\n trigger: \"Menu\",\n};\n\n/** Renders the mega menu component. */\nexport function MegaMenu({\n menus,\n columns = 3,\n footer,\n triggerLabel,\n labels: customLabels,\n className,\n}: MegaMenuProps) {\n const labels = { ...defaultLabels, ...customLabels };\n const resolvedTriggerLabel = triggerLabel ?? labels.trigger;\n\n if (menus.length === 0) {\n return null;\n }\n\n return (\n <PopoverRoot data-opt-id=\"42177\" data-opt-slug=\"mega-menu.MegaMenu\">\n <PopoverTrigger\n className={cn(\n \"border-border bg-surface text-text-primary hover:bg-bg-subtle inline-flex h-9 items-center gap-1.5 rounded-lg border px-3 text-sm font-medium\",\n className,\n )}\n >\n {resolvedTriggerLabel}\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n >\n <path d=\"M3 5l3 3 3-3\" />\n </svg>\n </PopoverTrigger>\n <PopoverContent className=\"w-auto max-w-2xl p-0\">\n <div\n className=\"gap-group grid p-4\"\n style={{ gridTemplateColumns: `repeat(${columns}, minmax(0, 1fr))` }}\n >\n {menus.map((section) => (\n <div key={section.title} className=\"gap-element flex flex-col\">\n <h4 className=\"text-text-tertiary text-xs font-semibold tracking-wider uppercase\">\n {section.title}\n </h4>\n {section.items.map((item) => (\n <a\n key={item.label}\n href={item.href || \"#\"}\n className=\"hover:bg-bg-subtle gap-element flex items-start rounded-md p-2 transition-colors\"\n >\n {item.icon && (\n <span className=\"text-text-secondary mt-0.5 flex-shrink-0\">\n {item.icon}\n </span>\n )}\n <div className=\"flex flex-col\">\n <span className=\"text-text-primary text-sm font-medium\">\n {item.label}\n </span>\n {item.description && (\n <span className=\"text-text-tertiary text-xs\">\n {item.description}\n </span>\n )}\n </div>\n </a>\n ))}\n </div>\n ))}\n </div>\n {footer && (\n <div className=\"border-border bg-bg-subtle border-t px-4 py-3\">\n {footer}\n </div>\n )}\n </PopoverContent>\n </PopoverRoot>\n );\n}\n\nMegaMenu.displayName = \"MegaMenu\";\n","\"use client\";\n\nimport { useState, useEffect, useCallback } from \"react\";\nimport { cn } from \"../lib/cn\";\nimport { Button } from \"../core/button\";\nimport { Input } from \"../core/input\";\nimport { ScrollArea } from \"../core/scroll-area\";\nimport { EmptyState } from \"../core/empty-state\";\nimport type { ChatConversationDef } from \"../lib/types\";\nimport { formatOptShortDate, formatOptTime } from \"../lib/formatters\";\nimport {\n OPT_FOCUS_VISIBLE,\n OPT_TEXT_PRIMARY,\n OPT_TEXT_SECONDARY,\n OPT_TEXT_TERTIARY,\n} from \"../lib/styles\";\n\n/** Localized labels for the chat sidebar component. */\nexport interface ChatSidebarLabels {\n newChat?: string;\n searchPlaceholder?: string;\n emptyTitle?: string;\n emptyDescription?: string;\n}\n\nconst defaultLabels: Required<ChatSidebarLabels> = {\n newChat: \"새 대화\",\n searchPlaceholder: \"대화 검색...\",\n emptyTitle: \"대화 없음\",\n emptyDescription: \"새 대화를 시작해보세요\",\n};\n\n/** Props for the chat sidebar component. */\nexport interface ChatSidebarProps {\n conversations: ChatConversationDef[];\n activeConversationId?: string;\n onConversationSelect?: (conversation: ChatConversationDef) => void;\n onNewChat?: () => void;\n onSearch?: (query: string) => void;\n labels?: ChatSidebarLabels;\n className?: string;\n}\n\n/** Renders the chat sidebar component. */\nexport function ChatSidebar({\n conversations,\n activeConversationId,\n onConversationSelect,\n onNewChat,\n onSearch,\n labels: customLabels,\n className,\n}: ChatSidebarProps) {\n const labels = { ...defaultLabels, ...customLabels };\n const [searchQuery, setSearchQuery] = useState(\"\");\n const [isHydrated, setIsHydrated] = useState(false);\n\n useEffect(() => {\n setIsHydrated(true);\n }, []);\n\n const handleSearch = useCallback(\n (value: string) => {\n setSearchQuery(value);\n onSearch?.(value);\n },\n [onSearch],\n );\n\n const filtered = searchQuery\n ? conversations.filter(\n (c) =>\n c.title.toLowerCase().includes(searchQuery.toLowerCase()) ||\n c.lastMessage?.toLowerCase().includes(searchQuery.toLowerCase()),\n )\n : conversations;\n\n return (\n <div\n className={cn(\"gap-group flex h-full flex-col\", className)}\n data-opt-id=\"TBVMY\"\n data-opt-slug=\"chat-sidebar.ChatSidebar\"\n >\n {/* New Chat Button */}\n <Button onClick={onNewChat} className=\"w-full\" size=\"sm\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n className=\"mr-2\"\n >\n <line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\" />\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\" />\n </svg>\n {labels.newChat}\n </Button>\n\n {/* Search */}\n <Input\n placeholder={labels.searchPlaceholder}\n value={searchQuery}\n onChange={(e) => handleSearch(e.target.value)}\n size=\"sm\"\n aria-label={labels.searchPlaceholder}\n />\n\n {/* Conversation List */}\n {filtered.length === 0 ? (\n <EmptyState\n title={labels.emptyTitle}\n description={labels.emptyDescription}\n />\n ) : (\n <ScrollArea className=\"flex-1\">\n <div\n className=\"gap-element flex flex-col\"\n role=\"listbox\"\n aria-label={labels.searchPlaceholder}\n >\n {filtered.map((conversation) => {\n const isActive = conversation.id === activeConversationId;\n return (\n <button\n key={conversation.id}\n type=\"button\"\n role=\"option\"\n aria-selected={isActive}\n onClick={() => onConversationSelect?.(conversation)}\n className={cn(\n \"relative rounded-lg px-3 py-2.5 text-left transition-colors\",\n OPT_FOCUS_VISIBLE,\n isActive ? \"bg-accent-subtle\" : \"hover:bg-bg-subtle\",\n )}\n >\n {/* Active indicator */}\n {isActive && (\n <span className=\"bg-accent absolute top-1/2 left-0 h-5 w-0.5 -translate-y-1/2 rounded-full\" />\n )}\n\n <div className=\"gap-element flex items-start justify-between\">\n <span\n className={cn(\n \"truncate text-sm font-medium\",\n isActive ? \"text-accent\" : OPT_TEXT_PRIMARY,\n )}\n >\n {conversation.title}\n </span>\n <div className=\"flex shrink-0 items-center gap-1.5\">\n {conversation.unread && (\n <span className=\"bg-accent h-2 w-2 rounded-full\" />\n )}\n <time\n className={cn(\"text-[11px]\", OPT_TEXT_TERTIARY)}\n dateTime={conversation.timestamp}\n >\n {formatTimestamp(\n conversation.timestamp,\n isHydrated ? new Date() : null,\n )}\n </time>\n </div>\n </div>\n {conversation.lastMessage && (\n <p\n className={cn(\n \"mt-0.5 truncate text-xs\",\n OPT_TEXT_SECONDARY,\n )}\n >\n {conversation.lastMessage}\n </p>\n )}\n </button>\n );\n })}\n </div>\n </ScrollArea>\n )}\n </div>\n );\n}\n\nfunction formatTimestamp(timestamp: string, now: Date | null): string {\n const date = new Date(timestamp);\n\n if (!now) {\n return formatOptShortDate(date);\n }\n\n const diffMs = now.getTime() - date.getTime();\n const diffDays = Math.floor(diffMs / 86400000);\n\n if (diffMs >= 0 && diffDays === 0) {\n return formatOptTime(date);\n }\n if (diffMs >= 0 && diffDays < 7) {\n return `${diffDays}d`;\n }\n return formatOptShortDate(date);\n}\n\nChatSidebar.displayName = \"ChatSidebar\";\n","\"use client\";\n\nimport {\n useRef,\n useCallback,\n useLayoutEffect,\n type KeyboardEvent,\n} from \"react\";\nimport { cn } from \"../lib/cn\";\nimport { Button } from \"../core/button\";\nimport { Kbd } from \"../core/kbd\";\nimport {\n SelectRoot,\n SelectTrigger,\n SelectPopover,\n SelectItem,\n} from \"../core/select\";\nimport { useControlledState } from \"../lib/use-controlled-state\";\nimport type { ChatModelDef, ChatStylePresetDef } from \"../lib/types\";\nimport { OPT_BORDER, OPT_TEXT_TERTIARY } from \"../lib/styles\";\n\n/** Localized labels for the chat input component. */\nexport interface ChatInputLabels {\n placeholder?: string;\n send?: string;\n attach?: string;\n hint?: string;\n modelLabel?: string;\n styleLabel?: string;\n shiftKey?: string;\n enterKey?: string;\n}\n\nconst defaultLabels: Required<ChatInputLabels> = {\n placeholder: \"메시지를 입력하세요...\",\n send: \"전송\",\n attach: \"파일 첨부\",\n hint: \"로 줄바꿈\",\n modelLabel: \"모델\",\n styleLabel: \"스타일\",\n shiftKey: \"Shift\",\n enterKey: \"Enter\",\n};\n\n/** Props for the chat input component. */\nexport interface ChatInputProps {\n value?: string;\n defaultValue?: string;\n onChange?: (value: string) => void;\n onSend?: (message: string) => void;\n onFileAttach?: () => void;\n models?: ChatModelDef[];\n selectedModel?: string;\n onModelChange?: (modelId: string) => void;\n stylePresets?: ChatStylePresetDef[];\n selectedStyle?: string;\n onStyleChange?: (styleId: string) => void;\n disabled?: boolean;\n maxRows?: number;\n showHint?: boolean;\n labels?: ChatInputLabels;\n className?: string;\n}\n\n/** Renders the chat input component. */\nexport function ChatInput({\n value: controlledValue,\n defaultValue = \"\",\n onChange,\n onSend,\n onFileAttach,\n models,\n selectedModel,\n onModelChange,\n stylePresets,\n selectedStyle,\n onStyleChange,\n disabled = false,\n maxRows = 6,\n showHint = true,\n labels: customLabels,\n className,\n}: ChatInputProps) {\n const labels = { ...defaultLabels, ...customLabels };\n const [value, setValue] = useControlledState(\n defaultValue,\n controlledValue,\n onChange,\n );\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n\n const hasToolbar =\n (models && models.length > 0) || (stylePresets && stylePresets.length > 0);\n\n // Auto-resize textarea\n useLayoutEffect(() => {\n const textarea = textareaRef.current;\n if (!textarea) return;\n\n textarea.style.height = \"auto\";\n const lineHeight = parseInt(getComputedStyle(textarea).lineHeight) || 20;\n const maxHeight = lineHeight * maxRows;\n textarea.style.height = `${Math.min(textarea.scrollHeight, maxHeight)}px`;\n }, [value, maxRows]);\n\n const handleSend = useCallback(() => {\n const trimmed = value.trim();\n if (!trimmed || disabled) return;\n onSend?.(trimmed);\n setValue(\"\");\n }, [value, disabled, onSend, setValue]);\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === \"Enter\" && !e.shiftKey) {\n e.preventDefault();\n handleSend();\n }\n },\n [handleSend],\n );\n\n return (\n <div\n className={cn(\"gap-element flex flex-col\", className)}\n data-opt-id=\"M8KX1\"\n data-opt-slug=\"chat-input.ChatInput\"\n >\n {/* Toolbar */}\n {hasToolbar && (\n <div className=\"gap-element flex items-center\">\n {models && models.length > 0 && (\n <SelectRoot\n value={selectedModel ?? models[0]?.id}\n onValueChange={(v) => onModelChange?.(v as string)}\n >\n <SelectTrigger minWidth={120} className=\"h-8 text-xs\">\n {models.find((m) => m.id === (selectedModel ?? models[0]?.id))\n ?.label ?? labels.modelLabel}\n </SelectTrigger>\n <SelectPopover>\n {models.map((model) => (\n <SelectItem key={model.id} value={model.id}>\n <div>\n <div className=\"text-sm\">{model.label}</div>\n {model.description && (\n <div className={cn(\"text-xs\", OPT_TEXT_TERTIARY)}>\n {model.description}\n </div>\n )}\n </div>\n </SelectItem>\n ))}\n </SelectPopover>\n </SelectRoot>\n )}\n\n {stylePresets && stylePresets.length > 0 && (\n <SelectRoot\n value={selectedStyle ?? stylePresets[0]?.id}\n onValueChange={(v) => onStyleChange?.(v as string)}\n >\n <SelectTrigger minWidth={100} className=\"h-8 text-xs\">\n {stylePresets.find(\n (s) => s.id === (selectedStyle ?? stylePresets[0]?.id),\n )?.label ?? labels.styleLabel}\n </SelectTrigger>\n <SelectPopover>\n {stylePresets.map((preset) => (\n <SelectItem key={preset.id} value={preset.id}>\n {preset.label}\n </SelectItem>\n ))}\n </SelectPopover>\n </SelectRoot>\n )}\n </div>\n )}\n\n {/* Input Container */}\n <div\n className={cn(\n \"bg-surface rounded-lg\",\n OPT_BORDER,\n \"focus-within:ring-ring focus-within:ring-offset-ring-offset focus-within:ring-2 focus-within:ring-offset-1\",\n )}\n >\n <textarea\n ref={textareaRef}\n value={value}\n onChange={(e) => setValue(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={labels.placeholder}\n disabled={disabled}\n rows={1}\n className={cn(\n \"text-text-primary placeholder:text-text-tertiary focus-visible:ring-ring focus-visible:ring-offset-ring-offset w-full resize-none border-none bg-transparent px-4 pt-3 pb-2 text-sm outline-none focus-visible:ring-2 focus-visible:ring-offset-1\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n )}\n aria-label={labels.placeholder}\n />\n\n {/* Bottom bar */}\n <div className=\"flex items-center justify-between px-3 pb-2\">\n {/* Left: attach */}\n <div className=\"flex items-center gap-1\">\n {onFileAttach && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={onFileAttach}\n disabled={disabled}\n aria-label={labels.attach}\n className=\"h-7 w-7 p-0\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M21.44 11.05l-9.19 9.19a6 6 0 01-8.49-8.49l9.19-9.19a4 4 0 015.66 5.66l-9.2 9.19a2 2 0 01-2.83-2.83l8.49-8.48\" />\n </svg>\n </Button>\n )}\n </div>\n\n {/* Center: hint */}\n {showHint && (\n <span\n className={cn(\n \"flex items-center gap-1 text-xs\",\n OPT_TEXT_TERTIARY,\n )}\n >\n <Kbd>{labels.shiftKey}</Kbd>\n <Kbd>{labels.enterKey}</Kbd>\n <span>{labels.hint}</span>\n </span>\n )}\n\n {/* Right: send */}\n <Button\n size=\"sm\"\n onClick={handleSend}\n disabled={disabled || !value.trim()}\n aria-label={labels.send}\n className=\"h-7 px-3\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n className=\"mr-1\"\n >\n <line x1=\"22\" y1=\"2\" x2=\"11\" y2=\"13\" />\n <polygon points=\"22 2 15 22 11 13 2 9 22 2\" />\n </svg>\n {labels.send}\n </Button>\n </div>\n </div>\n </div>\n );\n}\n\nChatInput.displayName = \"ChatInput\";\n","\"use client\";\n\nimport {\n useRef,\n useEffect,\n useCallback,\n useState,\n type ReactNode,\n} from \"react\";\nimport { cn } from \"../lib/cn\";\nimport { ScrollArea } from \"../core/scroll-area\";\nimport { Avatar } from \"../core/avatar\";\nimport { EmptyState } from \"../core/empty-state\";\nimport type { ChatMessageDef } from \"../lib/types\";\nimport { formatOptTime } from \"../lib/formatters\";\nimport { OPT_TEXT_TERTIARY } from \"../lib/styles\";\n\n/** Localized labels for the chat message list component. */\nexport interface ChatMessageListLabels {\n emptyTitle?: string;\n emptyDescription?: string;\n userLabel?: string;\n assistantLabel?: string;\n typingLabel?: string;\n}\n\nconst defaultLabels: Required<ChatMessageListLabels> = {\n emptyTitle: \"대화 시작\",\n emptyDescription: \"메시지를 보내 대화를 시작하세요\",\n userLabel: \"나\",\n assistantLabel: \"AI\",\n typingLabel: \"입력 중...\",\n};\n\n/** Props for the chat message list component. */\nexport interface ChatMessageListProps {\n messages: ChatMessageDef[];\n loading?: boolean;\n renderContent?: (message: ChatMessageDef) => ReactNode;\n assistantAvatar?: string;\n userName?: string;\n showTimestamps?: boolean;\n autoScroll?: boolean;\n labels?: ChatMessageListLabels;\n className?: string;\n}\n\n/** Renders the chat message list component. */\nexport function ChatMessageList({\n messages,\n loading = false,\n renderContent,\n assistantAvatar,\n userName,\n showTimestamps = true,\n autoScroll = true,\n labels: customLabels,\n className,\n}: ChatMessageListProps) {\n const labels = {\n ...defaultLabels,\n ...customLabels,\n ...(userName ? { userLabel: userName } : {}),\n };\n const scrollRef = useRef<HTMLDivElement>(null);\n const [isUserScrolledUp, setIsUserScrolledUp] = useState(false);\n\n // Auto-scroll to bottom\n const scrollToBottom = useCallback(() => {\n const el = scrollRef.current;\n if (!el) return;\n el.scrollTop = el.scrollHeight;\n }, []);\n\n // Detect user scroll\n const handleScroll = useCallback(() => {\n const el = scrollRef.current;\n if (!el) return;\n const threshold = 50;\n const isAtBottom =\n el.scrollHeight - el.scrollTop - el.clientHeight < threshold;\n setIsUserScrolledUp(!isAtBottom);\n }, []);\n\n useEffect(() => {\n if (autoScroll && !isUserScrolledUp) {\n scrollToBottom();\n }\n }, [messages, loading, autoScroll, isUserScrolledUp, scrollToBottom]);\n\n if (messages.length === 0 && !loading) {\n return (\n <div\n className={cn(\"flex flex-1 items-center justify-center\", className)}\n data-opt-id=\"YK725\"\n data-opt-slug=\"chat-message-list.ChatMessageList\"\n >\n <EmptyState\n title={labels.emptyTitle}\n description={labels.emptyDescription}\n />\n </div>\n );\n }\n\n return (\n <ScrollArea\n className={cn(\"flex-1\", className)}\n data-opt-id=\"YK725\"\n data-opt-slug=\"chat-message-list.ChatMessageList\"\n >\n <div\n ref={scrollRef}\n onScroll={handleScroll}\n className=\"gap-group flex flex-col p-4\"\n role=\"log\"\n aria-label=\"messages\"\n aria-live=\"polite\"\n >\n {messages.map((message) => {\n const isUser = message.role === \"user\";\n return (\n <div\n key={message.id}\n className={cn(\n \"gap-element flex\",\n isUser ? \"flex-row-reverse\" : \"flex-row\",\n )}\n >\n {/* Avatar */}\n {!isUser && (\n <Avatar\n name={labels.assistantLabel}\n src={assistantAvatar}\n size=\"sm\"\n className=\"mt-1 shrink-0\"\n />\n )}\n\n {/* Bubble */}\n <div\n className={cn(\n \"max-w-[80%] rounded-2xl px-4 py-2.5\",\n isUser\n ? \"bg-accent text-accent-fg rounded-tr-sm\"\n : \"bg-surface-input text-text-primary rounded-tl-sm\",\n )}\n >\n {renderContent ? (\n renderContent(message)\n ) : (\n <p className=\"text-sm whitespace-pre-wrap\">\n {message.content}\n </p>\n )}\n {showTimestamps && (\n <time\n dateTime={message.timestamp}\n className={cn(\n \"mt-1 block text-[11px]\",\n isUser ? \"text-accent-fg/70\" : OPT_TEXT_TERTIARY,\n )}\n >\n {formatMessageTime(message.timestamp)}\n </time>\n )}\n </div>\n </div>\n );\n })}\n\n {/* Typing Indicator */}\n {loading && (\n <div className=\"gap-element flex items-start\">\n <Avatar\n name={labels.assistantLabel}\n src={assistantAvatar}\n size=\"sm\"\n className=\"mt-1 shrink-0\"\n />\n <div className=\"bg-surface-input rounded-2xl rounded-tl-sm px-4 py-3\">\n <div\n className=\"flex items-center gap-1\"\n role=\"status\"\n aria-label={labels.typingLabel}\n >\n <span className=\"bg-text-tertiary h-2 w-2 animate-bounce rounded-full [animation-delay:0ms]\" />\n <span className=\"bg-text-tertiary h-2 w-2 animate-bounce rounded-full [animation-delay:150ms]\" />\n <span className=\"bg-text-tertiary h-2 w-2 animate-bounce rounded-full [animation-delay:300ms]\" />\n </div>\n </div>\n </div>\n )}\n </div>\n </ScrollArea>\n );\n}\n\nfunction formatMessageTime(timestamp: string): string {\n return formatOptTime(timestamp);\n}\n\nChatMessageList.displayName = \"ChatMessageList\";\n","\"use client\";\n\nimport { usePathname } from \"next/navigation\";\nimport { useEffect, useRef } from \"react\";\n\n/**\n * 페이지 전환 시 새 콘텐츠의 h1으로 포커스를 이동한다.\n * 포커스가 body로 빠지는 것을 방지하고,\n * 스크린 리더가 새 페이지 제목을 즉시 읽어줄 수 있게 한다.\n */\nexport function RouteFocusManager() {\n const pathname = usePathname();\n const prevPathname = useRef(pathname);\n\n useEffect(() => {\n // 최초 마운트 시에는 이동하지 않음\n if (prevPathname.current === pathname) return;\n prevPathname.current = pathname;\n\n // Next.js 렌더링이 완료된 뒤 포커스 이동\n const timer = setTimeout(() => {\n const heading = document.querySelector<HTMLElement>(\n \"main h1, [role='main'] h1, h1\",\n );\n if (!heading) return;\n\n // 프로그래밍 포커스를 받을 수 있도록 임시 tabindex 부여\n const hadTabIndex = heading.hasAttribute(\"tabindex\");\n if (!hadTabIndex) {\n heading.setAttribute(\"tabindex\", \"-1\");\n }\n\n heading.focus({ preventScroll: false });\n\n // 포커스를 잃으면 임시 tabindex 제거 (Tab 순서 오염 방지)\n if (!hadTabIndex) {\n heading.addEventListener(\n \"blur\",\n () => heading.removeAttribute(\"tabindex\"),\n { once: true },\n );\n }\n }, 60);\n\n return () => clearTimeout(timer);\n }, [pathname]);\n\n return null;\n}\n","\"use client\";\n\nimport {\n DisclosureRoot,\n DisclosureTrigger,\n DisclosureContent,\n} from \"../core/disclosure\";\nimport { cn } from \"../lib/cn\";\n\nfunction Section({\n title,\n children,\n}: {\n title: string;\n children: React.ReactNode;\n}) {\n return (\n <div>\n <h3 className=\"text-text-primary mb-2 text-sm font-semibold\">{title}</h3>\n {children}\n </div>\n );\n}\n\nfunction Code({ children }: { children: React.ReactNode }) {\n return (\n <code className=\"bg-bg-subtle text-text-secondary rounded px-1 py-0.5 font-mono text-xs\">\n {children}\n </code>\n );\n}\n\nfunction CodeBlock({ children }: { children: string }) {\n return (\n <pre className=\"bg-bg-subtle text-text-secondary overflow-x-auto rounded-lg p-3 font-mono text-xs leading-relaxed\">\n {children}\n </pre>\n );\n}\n\nfunction Table({ headers, rows }: { headers: string[]; rows: string[][] }) {\n return (\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-left text-xs\">\n <thead>\n <tr className=\"border-border border-b\">\n {headers.map((h) => (\n <th\n key={h}\n className=\"text-text-secondary pr-4 pb-2 font-semibold\"\n >\n {h}\n </th>\n ))}\n </tr>\n </thead>\n <tbody className=\"divide-border-subtle divide-y\">\n {rows.map((row, i) => (\n <tr key={i}>\n {row.map((cell, j) => (\n <td key={j} className=\"text-text-secondary py-1.5 pr-4\">\n {cell}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n\n// ─── 섹션 1: Primitives 컴포넌트 맵 ───\n\nfunction PrimitiveComponentMap() {\n return (\n <Section title=\"1. Primitives 컴포넌트 맵\">\n <p className=\"text-text-tertiary mb-3 text-xs\">\n 각 예제에서 사용된 프리미티브 컴포넌트와 대응하는 WAI-ARIA 역할.\n </p>\n <Table\n headers={[\"예제\", \"프리미티브 컴포넌트\", \"WAI-ARIA role\"]}\n rows={[\n [\n \"Command Palette\",\n \"Dialog, DialogDismiss, Combobox, ComboboxProvider, ComboboxGroup, ComboboxGroupLabel, ComboboxItem, ComboboxPopover\",\n \"dialog, combobox, listbox, option, group\",\n ],\n [\n \"Dashboard Grid\",\n \"Composite, CompositeItem, CompositeProvider, CompositeRow\",\n \"grid, gridcell\",\n ],\n [\n \"Menubar\",\n \"Menubar, MenubarProvider, Menu, MenuButton, MenuButtonArrow, MenuItem, MenuItemCheckbox, MenuItemRadio, MenuSeparator\",\n \"menubar, menu, menuitem, menuitemcheckbox, menuitemradio, separator\",\n ],\n [\n \"Toolbar\",\n \"Toolbar, ToolbarItem, ToolbarProvider, ToolbarSeparator, Tooltip, TooltipAnchor, TooltipProvider\",\n \"toolbar, separator, tooltip\",\n ],\n [\n \"Tabs\",\n \"Tab, TabList, TabPanel, TabProvider\",\n \"tablist, tab, tabpanel\",\n ],\n [\n \"Select & Combobox\",\n \"Select, SelectItem, SelectLabel, SelectPopover, SelectProvider, Combobox, ComboboxItem, ComboboxPopover, ComboboxProvider\",\n \"listbox, option, combobox\",\n ],\n [\n \"Form\",\n \"Form, FormError, FormInput, FormLabel, FormSubmit, useFormStore, Checkbox, Radio, RadioProvider\",\n \"form, radio, radiogroup, checkbox\",\n ],\n [\n \"Accordion\",\n \"Disclosure, DisclosureContent, DisclosureProvider, Composite, CompositeItem, CompositeProvider\",\n \"region, button (disclosure trigger)\",\n ],\n [\n \"사이드바\",\n \"Composite, CompositeItem, CompositeProvider\",\n \"navigation\",\n ],\n [\n \"예제 목록 (이 페이지)\",\n \"Composite, CompositeItem, CompositeProvider, CompositeRow\",\n \"grid, gridcell\",\n ],\n ]}\n />\n </Section>\n );\n}\n\n// ─── 섹션 2: 키보드 네비게이션 패턴 ───\n\nfunction KeyboardNavigationPatterns() {\n return (\n <Section title=\"2. 키보드 네비게이션 패턴\">\n <div className=\"gap-group flex flex-col\">\n <div>\n <h4 className=\"text-text-secondary mb-1 text-xs font-medium\">\n 전역 단축키\n </h4>\n <Table\n headers={[\"키\", \"동작\", \"구현\"]}\n rows={[\n [\n \"Cmd+K\",\n \"Command Palette 열기/닫기\",\n \"useEffect + keydown 리스너 (layout)\",\n ],\n [\n \"Ctrl+Shift+F\",\n \"UI Debugger 토글\",\n \"useEffect + keydown 리스너 (dev only)\",\n ],\n ]}\n />\n </div>\n\n <div>\n <h4 className=\"text-text-secondary mb-1 text-xs font-medium\">\n Composite / Roving Tabindex 패턴\n </h4>\n <p className=\"text-text-tertiary mb-2 text-xs\">\n <Code>CompositeProvider</Code>는 자동으로 roving tabindex를\n 관리한다. 컨테이너는 단일 Tab Stop이며, 내부 항목은 화살표 키로\n 이동한다.\n </p>\n <Table\n headers={[\"컨텍스트\", \"방향\", \"focusLoop\", \"focusWrap\"]}\n rows={[\n [\"예제 목록 Grid\", \"4방향 (↑↓←→)\", \"O\", \"O\"],\n [\"Dashboard Grid\", \"4방향 (↑↓←→)\", \"O\", \"O\"],\n [\"사이드바\", \"수직 (↑↓)\", \"O\", \"X\"],\n [\"Menubar\", \"수평 (←→)\", \"기본값\", \"기본값\"],\n [\"Toolbar\", \"수평 (←→)\", \"O\", \"X\"],\n [\"Tabs\", \"수평 (←→)\", \"기본값\", \"기본값\"],\n [\"Accordion (FAQ)\", \"수직 (↑↓)\", \"O\", \"X\"],\n ]}\n />\n </div>\n\n <div>\n <h4 className=\"text-text-secondary mb-1 text-xs font-medium\">\n 예제별 키보드 조작\n </h4>\n <Table\n headers={[\"예제\", \"키보드 조작\"]}\n rows={[\n [\n \"Command Palette\",\n \"Cmd+K 열기, ↑↓ 항목 이동, Enter 실행, Esc 닫기, 타이핑으로 필터\",\n ],\n [\"Dashboard Grid\", \"Tab 진입, ←→↑↓ 카드 이동, Enter 선택\"],\n [\"Menubar\", \"←→ 메뉴 전환, ↑↓ 항목 이동, Enter 실행, Esc 닫기\"],\n [\"Toolbar\", \"Tab 진입, ←→ 버튼 이동, Enter/Space 실행\"],\n [\"Tabs\", \"←→ 탭 전환, Tab으로 패널 진입\"],\n [\"Select\", \"Enter/Space 열기, ↑↓ 항목 이동, Enter 선택\"],\n [\"Combobox\", \"타이핑으로 필터, ↑↓ 항목 이동, Enter 선택\"],\n [\"Form\", \"Tab 필드 이동, Space 체크박스 토글, ←→ 라디오 전환\"],\n [\"Accordion\", \"↑↓ 항목 이동, Enter/Space 토글\"],\n ]}\n />\n </div>\n </div>\n </Section>\n );\n}\n\n// ─── 섹션 3: Tailwind Data Attribute 셀렉터 ───\n\nfunction TailwindDataAttributes() {\n return (\n <Section title=\"3. Tailwind Data Attribute 셀렉터\">\n <p className=\"text-text-tertiary mb-3 text-xs\">\n 프리미티브는 상태를 data attribute로 노출한다. Tailwind v4의{\" \"}\n <Code>data-[attr]:</Code> 셀렉터로 스타일링한다.\n </p>\n\n <div className=\"gap-group flex flex-col\">\n <div>\n <h4 className=\"text-text-secondary mb-1 text-xs font-medium\">\n data-[active-item] — 현재 활성 항목\n </h4>\n <CodeBlock>{`// ComboboxItem, SelectItem, MenuItem, CompositeItem\nclassName=\"data-[active-item]:bg-zinc-100\n dark:data-[active-item]:bg-zinc-800\"\n\n// 예제 목록 카드 (ring 스타일)\nclassName=\"data-[active-item]:ring-2\n data-[active-item]:ring-blue-500\n data-[active-item]:ring-offset-2\"`}</CodeBlock>\n </div>\n\n <div>\n <h4 className=\"text-text-secondary mb-1 text-xs font-medium\">\n data-[focus-visible] — 키보드 포커스 링\n </h4>\n <CodeBlock>{`// 모든 인터랙티브 요소에 공통 적용\nclassName=\"data-[focus-visible]:ring-2\n data-[focus-visible]:ring-blue-500\n dark:data-[focus-visible]:ring-offset-zinc-950\"\n\n// inset 변형 (Accordion, Tab)\nclassName=\"data-[focus-visible]:ring-inset\"`}</CodeBlock>\n </div>\n\n <div>\n <h4 className=\"text-text-secondary mb-1 text-xs font-medium\">\n data-[enter] / data-[leave] — 애니메이션\n </h4>\n <CodeBlock>{`// Dialog, Popover, DisclosureContent 공통\nclassName=\"data-[enter]:animate-in\n data-[enter]:fade-in\n data-[enter]:slide-in-from-top-1\n data-[leave]:animate-out\n data-[leave]:fade-out\"\n\n// Dialog 백드롭\nclassName=\"data-[enter]:animate-in\n data-[enter]:fade-in\n data-[leave]:animate-out\n data-[leave]:fade-out\"`}</CodeBlock>\n </div>\n\n <div>\n <h4 className=\"text-text-secondary mb-1 text-xs font-medium\">\n data-[open] — 열림/닫힘 상태\n </h4>\n <CodeBlock>{`// Accordion 화살표 회전\nclassName=\"[[data-open]>&]:rotate-180\"\n// 부모가 data-open일 때 자식 SVG를 180도 회전`}</CodeBlock>\n </div>\n\n <div>\n <h4 className=\"text-text-secondary mb-1 text-xs font-medium\">\n data-[active] — 메뉴 버튼 활성\n </h4>\n <CodeBlock>{`// MenuButton이 열려있을 때\nclassName=\"data-[active]:bg-zinc-100\n dark:data-[active]:bg-zinc-800\"`}</CodeBlock>\n </div>\n\n <div>\n <h4 className=\"text-text-secondary mb-1 text-xs font-medium\">\n aria-[invalid=true] — 폼 유효성 오류\n </h4>\n <CodeBlock>{`// FormInput 유효성 검증 실패 시\nclassName=\"aria-[invalid=true]:border-red-500\"`}</CodeBlock>\n </div>\n </div>\n </Section>\n );\n}\n\n// ─── 섹션 4: 접근성 속성 ───\n\nfunction AccessibilityAttributes() {\n return (\n <Section title=\"4. 접근성 속성\">\n <p className=\"text-text-tertiary mb-3 text-xs\">\n 프로젝트에서 사용된 WAI-ARIA 속성과 적용 사례.\n </p>\n <Table\n headers={[\"속성\", \"사용처\", \"설명\"]}\n rows={[\n [\n 'role=\"grid\"',\n \"예제 목록, Dashboard Grid\",\n \"2D 화살표 키 네비게이션 컨테이너. gridcell과 함께 사용\",\n ],\n [\n 'role=\"gridcell\"',\n \"예제 목록 카드, Dashboard 카드\",\n \"grid 내부 셀. CompositeRow로 행 구분\",\n ],\n [\n 'role=\"navigation\"',\n \"사이드바\",\n \"네비게이션 랜드마크. 수직 Composite로 구현\",\n ],\n ['role=\"region\"', \"Accordion\", \"FAQ 섹션의 랜드마크\"],\n ['role=\"toolbar\"', \"Toolbar\", \"단일 Tab Stop, 수평 화살표 키 이동\"],\n [\n 'role=\"menubar\"',\n \"Menubar\",\n \"수평 메뉴 컨테이너. MenuProvider로 자동 부여\",\n ],\n [\n \"aria-label\",\n \"Composite, Toolbar, TabList, Form, Menubar\",\n '스크린 리더에 영역 이름 전달. 예: \"예제 목록\", \"텍스트 편집기 툴바\"',\n ],\n [\n \"aria-invalid\",\n \"FormInput\",\n \"유효성 검증 실패 시 자동 부여. CSS로 border-red-500 스타일링\",\n ],\n [\n \"aria-expanded\",\n \"Disclosure, MenuButton, Select\",\n \"열림/닫힘 상태. 프리미티브가 자동 관리\",\n ],\n [\n \"aria-live\",\n \"FormError\",\n \"검증 오류 메시지를 스크린 리더에 즉시 전달\",\n ],\n ]}\n />\n </Section>\n );\n}\n\n// ─── 섹션 5: 포커스 관리 전략 ───\n\nfunction FocusManagementStrategies() {\n return (\n <Section title=\"5. 포커스 관리 전략\">\n <div className=\"gap-group flex flex-col\">\n <div>\n <h4 className=\"text-text-secondary mb-1 text-xs font-medium\">\n RouteFocusManager — 페이지 전환 포커스\n </h4>\n <p className=\"text-text-tertiary mb-2 text-xs\">\n 페이지 전환 시 새 콘텐츠의 <Code>h1</Code>으로 포커스를 이동한다.\n body로 포커스가 빠지는 것을 방지하고, 스크린 리더가 새 페이지 제목을\n 즉시 읽어준다.\n </p>\n <CodeBlock>{`// components/shared/route-focus-manager.tsx\n// 1. usePathname() 변경 감지\n// 2. setTimeout(60ms) 후 h1 탐색\n// 3. tabindex=\"-1\" 임시 부여 → focus()\n// 4. blur 시 tabindex 제거 (Tab 순서 오염 방지)`}</CodeBlock>\n </div>\n\n <div>\n <h4 className=\"text-text-secondary mb-1 text-xs font-medium\">\n 사이드바 activeId 동기화\n </h4>\n <p className=\"text-text-tertiary mb-2 text-xs\">\n <Code>usePathname()</Code>으로 현재 경로를 감지하여{\" \"}\n <Code>CompositeProvider</Code>의 <Code>activeId</Code>를 동기화한다.\n Shift+Tab으로 사이드바에 돌아올 때 현재 페이지 항목에 포커스가\n 위치한다.\n </p>\n <CodeBlock>{`// components/sidebar/sidebar-nav.tsx\nconst [activeId, setActiveId] = useState(...)\nuseEffect(() => {\n const match = navItems.find(item => item.href === pathname)\n if (match) setActiveId(domId(match.id))\n}, [pathname])\n\n<CompositeProvider\n activeId={activeId}\n onActiveIdChange={setActiveId}\n focusLoop orientation=\"vertical\"\n/>`}</CodeBlock>\n </div>\n\n <div>\n <h4 className=\"text-text-secondary mb-1 text-xs font-medium\">\n Composite focusLoop / focusWrap\n </h4>\n <p className=\"text-text-tertiary text-xs\">\n <Code>focusLoop</Code> — 마지막 항목에서 화살표 키를 누르면 첫\n 항목으로 순환.\n <br />\n <Code>focusWrap</Code> — Grid에서 행 끝에 도달하면 다음 행으로 자동\n 이동.\n <br />\n <Code>orientation</Code> — {`\"vertical\"`}이면 ↑↓만, {`\"horizontal\"`}\n 이면 ←→만 반응. 생략 시 4방향 모두 반응 (Grid 용도).\n </p>\n </div>\n\n <div>\n <h4 className=\"text-text-secondary mb-1 text-xs font-medium\">\n Dialog 포커스 트랩\n </h4>\n <p className=\"text-text-tertiary text-xs\">\n Command Palette의 <Code>Dialog</Code>는 열리면 자동으로 포커스를\n 트랩한다. Tab 키가 Dialog 내부에서만 순환하며, Esc로 닫으면 트리거\n 요소로 포커스가 복원된다.\n </p>\n </div>\n\n <div>\n <h4 className=\"text-text-secondary mb-1 text-xs font-medium\">\n UI Debugger (개발 전용)\n </h4>\n <p className=\"text-text-tertiary text-xs\">\n Ctrl+Shift+F로 토글. 현재 포커스된 요소의 정보(tag, role, aria-*,\n data-*), Tab 순서(이전/다음), 방향키 컨텍스트(Composite 타입/위치),\n 이동 기록을 실시간으로 표시한다. SVG 오버레이로 포커스 가이드 라인과\n Tab 순서 배지도 시각화한다. 컴포넌트 추적 기능으로 포커스된 요소가\n 속한 React 컴포넌트 체인도 확인할 수 있다.\n </p>\n </div>\n </div>\n </Section>\n );\n}\n\n// ─── 섹션 6: 프로젝트 구조 ───\n\nfunction ProjectStructure() {\n return (\n <Section title=\"6. 프로젝트 구조\">\n <CodeBlock>{`app/\n├── layout.tsx # 루트 레이아웃 (Cmd+K 바인딩, OptDevtool)\n├── page.tsx # 홈페이지\n├── globals.css # 전역 스타일 (Tailwind v4)\n└── examples/\n ├── layout.tsx # 사이드바 + 본문 레이아웃\n ├── page.tsx # 예제 목록 (Composite Grid)\n ├── command-palette/ # Dialog + Combobox 조합\n ├── dashboard/ # 2D Composite Grid\n ├── menubar/ # Menubar + 체크/라디오 메뉴\n ├── toolbar/ # Toolbar + Tooltip\n ├── tabs/ # Tab + TabPanel\n ├── select/ # Select + Combobox 검색\n ├── form/ # Form 유효성 검증\n └── accordion/ # Disclosure + Composite\n\ncomponents/\n├── command-palette/\n│ ├── command-palette.tsx # Dialog + Combobox + match-sorter\n│ └── commands.ts # 명령어 데이터\n├── dashboard/\n│ ├── dashboard-grid.tsx # CompositeProvider + Grid 레이아웃\n│ └── stat-card.tsx # 개별 통계 카드\n├── dev/\n│ └── opt-devtool.tsx # Dev overlay: 포커스 추적 + bridge panel (dev only)\n├── disclosure/\n│ └── faq-accordion.tsx # Disclosure + Composite 아코디언\n├── form/\n│ └── settings-form.tsx # Form + Radio + Checkbox 검증\n├── guide/\n│ └── design-guide-panel.tsx # 이 파일: 디자인 가이드 패널\n├── menubar/\n│ └── app-menubar.tsx # MenubarProvider + 4개 메뉴\n├── select/\n│ ├── status-select.tsx # Select 드롭다운\n│ └── search-combobox.tsx # Combobox 자동완성\n├── shared/\n│ ├── kbd.tsx # 키보드 단축키 배지\n│ └── route-focus-manager.tsx # 페이지 전환 포커스 관리\n├── sidebar/\n│ └── sidebar-nav.tsx # Composite 수직 네비게이션\n├── tabs/\n│ └── content-tabs.tsx # TabProvider + 4개 탭\n└── toolbar/\n └── editor-toolbar.tsx # ToolbarProvider + Tooltip`}</CodeBlock>\n\n <div className=\"mt-3\">\n <h4 className=\"text-text-secondary mb-1 text-xs font-medium\">\n 핵심 의존성\n </h4>\n <Table\n headers={[\"패키지\", \"용도\"]}\n rows={[\n [\n \"@reopt-ai/opt-ui-primitives\",\n \"접근성 UI 프리미티브 (WAI-ARIA 패턴)\",\n ],\n [\n \"match-sorter ^8.2.0\",\n \"퍼지 검색/정렬 (Command Palette, Combobox)\",\n ],\n [\"next 16.x\", \"App Router, 서버/클라이언트 컴포넌트\"],\n [\"react 19.x\", \"UI 렌더링\"],\n [\"tailwindcss ^4\", \"유틸리티 CSS (data attribute 셀렉터 지원)\"],\n ]}\n />\n </div>\n </Section>\n );\n}\n\n// ─── 메인 패널 ───\n\n/** Props for the design guide panel component. */\nexport interface DesignGuidePanelProps {\n className?: string;\n}\n\n/** Renders the design guide panel component. */\nexport function DesignGuidePanel({ className }: DesignGuidePanelProps) {\n return (\n <DisclosureRoot\n data-opt-id=\"65F6W\"\n data-opt-slug=\"design-guide-panel.DesignGuidePanel\"\n >\n <div\n className={cn(\"border-border bg-surface rounded-xl border\", className)}\n >\n <DisclosureTrigger className=\"hover:bg-bg-subtle data-[focus-visible]:ring-ring flex w-full items-center justify-between px-5 py-4 text-left transition-colors outline-none data-[focus-visible]:ring-2 data-[focus-visible]:ring-inset\">\n <div>\n <h2 className=\"text-text-primary text-sm font-semibold\">\n 디자인 가이드\n </h2>\n <p className=\"text-text-tertiary mt-0.5 text-xs\">\n 프리미티브 컴포넌트, 키보드 패턴, Tailwind 셀렉터, 접근성 속성,\n 포커스 관리, 프로젝트 구조\n </p>\n </div>\n <svg\n className=\"text-text-tertiary h-4 w-4 shrink-0 transition-transform [[data-open]>&]:rotate-180\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"m19.5 8.25-7.5 7.5-7.5-7.5\"\n />\n </svg>\n </DisclosureTrigger>\n <DisclosureContent>\n <div className=\"border-border gap-section flex flex-col border-t px-5 py-5\">\n <PrimitiveComponentMap />\n <KeyboardNavigationPatterns />\n <TailwindDataAttributes />\n <AccessibilityAttributes />\n <FocusManagementStrategies />\n <ProjectStructure />\n </div>\n </DisclosureContent>\n </div>\n </DisclosureRoot>\n );\n}\n","\"use client\";\n\nimport { useEffect } from \"react\";\n\n// ---------------------------------------------------------------------------\n// 상수\n// ---------------------------------------------------------------------------\n\nconst TABBABLE_SELECTOR = [\n \"a[href]:not([tabindex='-1'])\",\n \"button:not([disabled]):not([tabindex='-1'])\",\n \"input:not([disabled]):not([type='hidden']):not([tabindex='-1'])\",\n \"select:not([disabled]):not([tabindex='-1'])\",\n \"textarea:not([disabled]):not([tabindex='-1'])\",\n \"[tabindex]:not([tabindex='-1'])\",\n \"[contenteditable='true']:not([tabindex='-1'])\",\n].join(\",\");\n\nconst ARROW_KEYS = new Set([\"ArrowUp\", \"ArrowDown\", \"ArrowLeft\", \"ArrowRight\"]);\n\nconst TEXT_INPUT_TYPES = new Set([\n \"text\",\n \"search\",\n \"email\",\n \"url\",\n \"tel\",\n \"password\",\n]);\n\nconst SECONDARY_WEIGHT = 2.0;\n\n// ---------------------------------------------------------------------------\n// 순수 함수\n// ---------------------------------------------------------------------------\n\n/** Type definition for direction. */\nexport type Direction = \"up\" | \"down\" | \"left\" | \"right\";\n\nfunction getDirection(key: string): Direction | null {\n switch (key) {\n case \"ArrowUp\":\n return \"up\";\n case \"ArrowDown\":\n return \"down\";\n case \"ArrowLeft\":\n return \"left\";\n case \"ArrowRight\":\n return \"right\";\n default:\n return null;\n }\n}\n\nfunction isVisible(el: HTMLElement): boolean {\n if (el.offsetWidth === 0 && el.offsetHeight === 0) return false;\n const style = getComputedStyle(el);\n return style.visibility !== \"hidden\" && style.display !== \"none\";\n}\n\nfunction getTabbableElements(): HTMLElement[] {\n const nodes = document.querySelectorAll<HTMLElement>(TABBABLE_SELECTOR);\n const result: HTMLElement[] = [];\n for (let i = 0; i < nodes.length; i++) {\n if (isVisible(nodes[i])) {\n result.push(nodes[i]);\n }\n }\n return result;\n}\n\n/** Handles should skip arrow. */\nexport function shouldSkipArrow(el: HTMLElement, dir: Direction): boolean {\n const tag = el.tagName.toLowerCase();\n\n // textarea, contenteditable — 모든 방향키 건너뜀\n if (tag === \"textarea\" || el.isContentEditable) return true;\n\n // native select — 모든 방향키 건너뜀\n if (tag === \"select\") return true;\n\n if (tag === \"input\") {\n const type = (el as HTMLInputElement).type.toLowerCase();\n\n // text-like input: ←→ 건너뜀 (커서), ↑↓ 공간 네비게이션\n if (TEXT_INPUT_TYPES.has(type)) {\n return dir === \"left\" || dir === \"right\";\n }\n\n // number input: ↑↓ 건너뜀 (증감), ←→ 공간 네비게이션\n if (type === \"number\") {\n return dir === \"up\" || dir === \"down\";\n }\n\n // range input: ←→ 건너뜀 (값 조절), ↑↓ 공간 네비게이션\n if (type === \"range\") {\n return dir === \"left\" || dir === \"right\";\n }\n }\n\n // ARIA role 기반 보호\n const role = el.getAttribute(\"role\");\n const hasPopup = el.getAttribute(\"aria-haspopup\");\n\n // combobox (Select 등): ↑↓ 팝업 열기/탐색\n if (role === \"combobox\") {\n return dir === \"up\" || dir === \"down\";\n }\n\n // 팝업을 여는 트리거: ↓ 보호 (listbox, menu, dialog 등)\n if (hasPopup && hasPopup !== \"false\") {\n return dir === \"down\";\n }\n\n // spinbutton: ↑↓ 값 증감\n if (role === \"spinbutton\") {\n return dir === \"up\" || dir === \"down\";\n }\n\n // slider: 모든 방향키가 값 조절\n if (role === \"slider\") return true;\n\n return false;\n}\n\n/** Returns trapped context role. */\nexport function getTrappedContextRole(el: HTMLElement): string | null {\n let node: HTMLElement | null = el;\n while (node) {\n const role = node.getAttribute(\"role\");\n if (\n role === \"dialog\" ||\n role === \"alertdialog\" ||\n role === \"menu\" ||\n role === \"listbox\" ||\n role === \"tree\"\n ) {\n return role;\n }\n if (node.hasAttribute(\"data-dialog\")) return \"dialog\";\n if (node.hasAttribute(\"data-popover\")) return \"popover\";\n node = node.parentElement;\n }\n return null;\n}\n\nfunction isInsideTrappedContext(el: HTMLElement): boolean {\n return getTrappedContextRole(el) !== null;\n}\n\nfunction computeScore(\n current: DOMRect,\n candidate: DOMRect,\n dir: Direction,\n): number | null {\n let primaryDistance: number;\n let secondaryOffset: number;\n\n switch (dir) {\n case \"right\":\n if (candidate.left < current.right) return null;\n primaryDistance = candidate.left - current.right;\n secondaryOffset = Math.abs(\n (candidate.top + candidate.bottom) / 2 -\n (current.top + current.bottom) / 2,\n );\n break;\n case \"left\":\n if (candidate.right > current.left) return null;\n primaryDistance = current.left - candidate.right;\n secondaryOffset = Math.abs(\n (candidate.top + candidate.bottom) / 2 -\n (current.top + current.bottom) / 2,\n );\n break;\n case \"down\":\n if (candidate.top < current.bottom) return null;\n primaryDistance = candidate.top - current.bottom;\n secondaryOffset = Math.abs(\n (candidate.left + candidate.right) / 2 -\n (current.left + current.right) / 2,\n );\n break;\n case \"up\":\n if (candidate.bottom > current.top) return null;\n primaryDistance = current.top - candidate.bottom;\n secondaryOffset = Math.abs(\n (candidate.left + candidate.right) / 2 -\n (current.left + current.right) / 2,\n );\n break;\n }\n\n return primaryDistance + secondaryOffset * SECONDARY_WEIGHT;\n}\n\nfunction findBestCandidate(\n current: HTMLElement,\n candidates: HTMLElement[],\n dir: Direction,\n): HTMLElement | null {\n const currentRect = current.getBoundingClientRect();\n let bestScore = Infinity;\n let bestEl: HTMLElement | null = null;\n\n for (let i = 0; i < candidates.length; i++) {\n const cand = candidates[i];\n if (cand === current) continue;\n const candRect = cand.getBoundingClientRect();\n const score = computeScore(currentRect, candRect, dir);\n if (score !== null && score < bestScore) {\n bestScore = score;\n bestEl = cand;\n }\n }\n\n return bestEl;\n}\n\n// ---------------------------------------------------------------------------\n// 디버거용 API\n// ---------------------------------------------------------------------------\n\n/** Defines the spatial target shape. */\nexport interface SpatialTarget {\n direction: Direction;\n element: HTMLElement;\n score: number;\n}\n\n/** Handles compute spatial targets. */\nexport function computeSpatialTargets(current: HTMLElement): SpatialTarget[] {\n const candidates = getTabbableElements();\n const currentRect = current.getBoundingClientRect();\n const results: SpatialTarget[] = [];\n\n for (const dir of [\"up\", \"down\", \"left\", \"right\"] as Direction[]) {\n let bestScore = Infinity;\n let bestEl: HTMLElement | null = null;\n\n for (let i = 0; i < candidates.length; i++) {\n const cand = candidates[i];\n if (cand === current) continue;\n const candRect = cand.getBoundingClientRect();\n const score = computeScore(currentRect, candRect, dir);\n if (score !== null && score < bestScore) {\n bestScore = score;\n bestEl = cand;\n }\n }\n\n if (bestEl) {\n results.push({\n direction: dir,\n element: bestEl,\n score: Math.round(bestScore),\n });\n }\n }\n\n return results;\n}\n\n/** Defines the spatial nav decision detail shape. */\nexport interface SpatialNavDecisionDetail {\n direction: Direction;\n result: \"moved\" | \"skipped\";\n reason?:\n | \"defaultPrevented\"\n | \"input-protection\"\n | \"trapped-context\"\n | \"no-candidate\";\n context?: string;\n target?: HTMLElement;\n}\n\nfunction emitDecision(detail: SpatialNavDecisionDetail): void {\n if (process.env.NODE_ENV === \"development\") {\n document.dispatchEvent(\n new CustomEvent<SpatialNavDecisionDetail>(\"spatial-nav-decision\", {\n detail,\n }),\n );\n }\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\nfunction useSpatialNav(): void {\n useEffect(() => {\n function handleKeyDown(e: KeyboardEvent): void {\n // 1. 방향키 확인\n if (!ARROW_KEYS.has(e.key)) return;\n\n const dir = getDirection(e.key);\n if (!dir) return;\n\n // 2. 이미 처리됨 (Composite 등)\n if (e.defaultPrevented) {\n emitDecision({\n direction: dir,\n result: \"skipped\",\n reason: \"defaultPrevented\",\n });\n return;\n }\n\n // 3. 수식키 동반\n if (e.ctrlKey || e.metaKey || e.altKey || e.shiftKey) return;\n\n // 4. activeElement 확인\n const active = document.activeElement;\n if (!active || active === document.body) return;\n\n const el = active as HTMLElement;\n\n // 5. 입력 필드 보호\n if (shouldSkipArrow(el, dir)) {\n emitDecision({\n direction: dir,\n result: \"skipped\",\n reason: \"input-protection\",\n });\n return;\n }\n\n // 6. dialog/menu/listbox 내부\n if (isInsideTrappedContext(el)) {\n emitDecision({\n direction: dir,\n result: \"skipped\",\n reason: \"trapped-context\",\n context: getTrappedContextRole(el) ?? undefined,\n });\n return;\n }\n\n // 7. 후보 계산 및 포커스 이동\n const candidates = getTabbableElements();\n const target = findBestCandidate(el, candidates, dir);\n if (target) {\n e.preventDefault();\n target.focus({ preventScroll: false });\n emitDecision({ direction: dir, result: \"moved\", target });\n } else {\n emitDecision({\n direction: dir,\n result: \"skipped\",\n reason: \"no-candidate\",\n });\n }\n }\n\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => document.removeEventListener(\"keydown\", handleKeyDown);\n }, []);\n}\n\n// ---------------------------------------------------------------------------\n// Provider 컴포넌트\n// ---------------------------------------------------------------------------\n\n/** Renders the spatial nav provider component. */\nexport function SpatialNavProvider(): null {\n useSpatialNav();\n return null;\n}\n","/** opt-ui English label catalog (opt-in alternative to `koLabels`). */\nexport const enComboboxLabels = {\n empty: \"No results.\",\n} as const;\n\nexport const enStarRatingLabels = {\n readonlyAriaLabel: \"{value} out of {max} stars\",\n groupAriaLabel: \"Rating\",\n starAriaLabel: \"{star} stars\",\n} as const;\n\nexport const enBreadcrumbLabels = {\n navAriaLabel: \"Go to {label}\",\n} as const;\n","/**\n * Run a {@link Query} against rows already in the browser.\n *\n * The server does the real filtering; this exists for the cases where asking it\n * would be worse than answering locally — live rows arriving over a socket that\n * must be held to the same filter as the page they land on, and a preview of\n * what a clause will do before it is committed.\n *\n * Keeping both readings in one module is the point: a query that means one\n * thing in the list and another in the live tail is a bug nobody reports,\n * because each half looks right on its own.\n */\nimport type { Query, QueryClause } from \"./query-ast\";\n\n/** How a row exposes its values. Missing fields return `undefined`. */\nexport type FieldReader = (field: string) => unknown;\n\nfunction toText(value: unknown): string {\n if (value === null || value === undefined) return \"\";\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\" || typeof value === \"boolean\")\n return String(value);\n return JSON.stringify(value);\n}\n\nfunction compare(left: unknown, right: string): number {\n const leftNumber = typeof left === \"number\" ? left : Number(toText(left));\n const rightNumber = Number(right);\n if (Number.isFinite(leftNumber) && Number.isFinite(rightNumber)) {\n return leftNumber - rightNumber;\n }\n return toText(left).localeCompare(right);\n}\n\nfunction matchesClause(\n clause: QueryClause,\n read: FieldReader,\n searchable: () => string,\n): boolean {\n if (clause.type === \"term\") {\n return searchable().toLowerCase().includes(clause.value.toLowerCase());\n }\n\n const value = read(clause.field);\n\n switch (clause.operator) {\n case \"exists\":\n return value !== undefined && value !== null && value !== \"\";\n case \"eq\":\n // Case-insensitive: a log reader typing `path:/Checkout` means the path.\n return clause.values.some(\n (candidate) => toText(value).toLowerCase() === candidate.toLowerCase(),\n );\n case \"contains\":\n return clause.values.some((candidate) =>\n toText(value).toLowerCase().includes(candidate.toLowerCase()),\n );\n case \"gt\":\n return compare(value, clause.values[0] ?? \"\") > 0;\n case \"gte\":\n return compare(value, clause.values[0] ?? \"\") >= 0;\n case \"lt\":\n return compare(value, clause.values[0] ?? \"\") < 0;\n case \"lte\":\n return compare(value, clause.values[0] ?? \"\") <= 0;\n default:\n return true;\n }\n}\n\n/**\n * Whether one row satisfies every clause.\n *\n * `searchable` is lazy because most queries are field constraints, and\n * flattening a row to text for a term match nobody asked for is the expensive\n * part of filtering a live tail.\n */\nexport function matchesQuery(\n query: Query,\n read: FieldReader,\n searchable: () => string,\n): boolean {\n return query.clauses.every((clause) => {\n const matched = matchesClause(clause, read, searchable);\n return clause.negated ? !matched : matched;\n });\n}\n\n/** Convenience for plain objects, including one level of nested properties. */\nexport function matchesQueryObject(\n query: Query,\n row: Record<string, unknown>,\n options: { nested?: string } = {},\n): boolean {\n const nested = options.nested\n ? (row[options.nested] as Record<string, unknown> | undefined)\n : undefined;\n const read: FieldReader = (field) =>\n field in row ? row[field] : nested?.[field];\n let cached: string | null = null;\n const searchable = () => {\n cached ??= [\n ...Object.values(row).filter((value) => typeof value !== \"object\"),\n ...Object.values(nested ?? {}),\n ]\n .map(toText)\n .join(\" \");\n return cached;\n };\n return matchesQuery(query, read, searchable);\n}\n"],"mappings":"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"}
|