@mondrianai/runyourai-design-system 0.0.1
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/README.md +222 -0
- package/dist/chunk-JLKIFAQZ.mjs +54 -0
- package/dist/chunk-JLKIFAQZ.mjs.map +1 -0
- package/dist/index.d.mts +1036 -0
- package/dist/index.d.ts +1036 -0
- package/dist/index.js +5318 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +5115 -0
- package/dist/index.mjs.map +1 -0
- package/dist/styles/index.css +337 -0
- package/dist/styles/index.css.map +1 -0
- package/dist/styles/index.d.mts +2 -0
- package/dist/styles/index.d.ts +2 -0
- package/dist/styles/tailwind-theme.css +207 -0
- package/dist/utils.d.mts +5 -0
- package/dist/utils.d.ts +5 -0
- package/dist/utils.js +43 -0
- package/dist/utils.js.map +1 -0
- package/dist/utils.mjs +8 -0
- package/dist/utils.mjs.map +1 -0
- package/package.json +80 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/ui/accordion.tsx","../src/components/ui/icon.tsx","../src/components/ui/icon-registry.ts","../src/components/ui/alert-dialog.tsx","../src/components/ui/button.tsx","../src/components/ui/alert.tsx","../src/components/ui/avatar.tsx","../src/components/ui/badge.tsx","../src/components/ui/breadcrumb.tsx","../src/components/ui/card.tsx","../src/components/ui/checkbox.tsx","../src/components/ui/choice-card.tsx","../src/components/ui/collapsible.tsx","../src/components/ui/combobox.tsx","../src/components/icons/custom/chevrons-up-down.tsx","../src/components/ui/field.tsx","../src/components/ui/grouped-select.tsx","../src/components/ui/header.tsx","../src/components/ui/markdown-message.tsx","../src/components/ui/message-footer.tsx","../src/components/ui/tooltip.tsx","../src/components/ui/menubar.tsx","../src/components/ui/number-badge.tsx","../src/components/ui/segmented-control.tsx","../src/components/ui/select.tsx","../src/components/ui/sheet.tsx","../src/components/ui/sidebar.tsx","../src/components/icons/custom/panel-left.tsx","../src/components/icons/custom/star.tsx","../src/components/icons/custom/pen-line.tsx","../src/components/icons/custom/trash.tsx","../src/components/ui/slider.tsx","../src/components/ui/stepper.tsx","../src/components/ui/switch.tsx","../src/components/ui/user-message-bubble.tsx","../src/components/providers.tsx","../src/components/icons/custom/ryai-logo.tsx","../src/components/icons/brand/claude.tsx","../src/components/icons/brand/deepseek.tsx","../src/components/icons/brand/gemini.tsx","../src/components/icons/brand/google.tsx","../src/components/icons/brand/openai.tsx","../src/components/icons/brand/upstage.tsx","../src/components/icons/custom/ai-agent.tsx","../src/components/icons/custom/ai-builder.tsx","../src/components/icons/custom/ai-cloud.tsx","../src/components/icons/custom/ai-datacenter.tsx","../src/components/icons/custom/align-justify.tsx","../src/components/icons/custom/align-left.tsx","../src/components/icons/custom/arrow-down.tsx","../src/components/icons/custom/blockquote.tsx","../src/components/icons/custom/bold.tsx","../src/components/icons/custom/book-up.tsx","../src/components/icons/custom/circle-check-fill.tsx","../src/components/icons/custom/circle-outline.tsx","../src/components/icons/custom/code.tsx","../src/components/icons/custom/code-square.tsx","../src/components/icons/custom/download.tsx","../src/components/icons/custom/file-code.tsx","../src/components/icons/custom/file-search.tsx","../src/components/icons/custom/folder-amber.tsx","../src/components/icons/custom/heading.tsx","../src/components/icons/custom/image.tsx","../src/components/icons/custom/import.tsx","../src/components/icons/custom/indent.tsx","../src/components/icons/custom/italic.tsx","../src/components/icons/custom/layers.tsx","../src/components/icons/custom/layout-grid.tsx","../src/components/icons/custom/line-chart.tsx","../src/components/icons/custom/link.tsx","../src/components/icons/custom/list.tsx","../src/components/icons/custom/list-ordered.tsx","../src/components/icons/custom/my-page.tsx","../src/components/icons/custom/outdent.tsx","../src/components/icons/custom/pencil-line.tsx","../src/components/icons/custom/presentation.tsx","../src/components/icons/custom/smile.tsx","../src/components/icons/custom/sparkles.tsx","../src/components/icons/custom/square-check.tsx","../src/components/icons/custom/square-check-outline.tsx","../src/components/icons/custom/strikethrough.tsx","../src/components/icons/custom/table-properties.tsx","../src/components/icons/custom/wand-sparkles.tsx","../src/components/icons/custom/message-circle.tsx","../src/components/icons/custom/messages-square.tsx","../src/components/icons/custom/shopping-bag.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { Accordion as AccordionPrimitive } from \"radix-ui\";\n\nimport { cn } from \"@/lib/utils\";\nimport { Icon } from \"@/components/ui/icon\";\n\n// ─── Root ─────────────────────────────────────────────────────────────────────\n\nconst Accordion = AccordionPrimitive.Root;\n\n// ─── Item ─────────────────────────────────────────────────────────────────────\n\nconst AccordionItem = React.forwardRef<\n React.ElementRef<typeof AccordionPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Item>\n>(({ className, ...props }, ref) => (\n <AccordionPrimitive.Item\n ref={ref}\n className={cn(\"border-b border-border\", className)}\n {...props}\n />\n));\nAccordionItem.displayName = \"AccordionItem\";\n\n// ─── Trigger ──────────────────────────────────────────────────────────────────\n\nconst AccordionTrigger = React.forwardRef<\n React.ElementRef<typeof AccordionPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n <AccordionPrimitive.Header className=\"flex\">\n <AccordionPrimitive.Trigger\n ref={ref}\n className={cn(\n // 기본 레이아웃\n \"flex flex-1 cursor-pointer items-center justify-between py-4\",\n // 텍스트 스타일 (Figma: Text-sm/Medium)\n \"text-sm font-medium leading-5 tracking-tight text-foreground\",\n // hover: 텍스트에만 underline (SVG 체브론은 text-decoration 상속 안 됨)\n \"hover:underline underline-offset-2\",\n // 체브론 회전 애니메이션 (열릴 때 180도) — SVG는 자체 transition-transform 보유\n \"[&[data-state=open]>svg]:rotate-180\",\n className\n )}\n {...props}\n >\n {children}\n <Icon name=\"chevron-down\" className=\"size-4 text-foreground transition-transform duration-200\" />\n </AccordionPrimitive.Trigger>\n </AccordionPrimitive.Header>\n));\nAccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName;\n\n// ─── Content ──────────────────────────────────────────────────────────────────\n\nconst AccordionContent = React.forwardRef<\n React.ElementRef<typeof AccordionPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Content>\n>(({ className, children, ...props }, ref) => (\n <AccordionPrimitive.Content\n ref={ref}\n className=\"overflow-hidden data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down\"\n {...props}\n >\n {/* Figma: pb-4 gap-4, Text-sm/Regular */}\n <div\n className={cn(\n \"flex flex-col gap-4 pb-4\",\n \"text-sm font-normal leading-5 tracking-tight text-foreground\",\n className\n )}\n >\n {children}\n </div>\n </AccordionPrimitive.Content>\n));\nAccordionContent.displayName = AccordionPrimitive.Content.displayName;\n\nexport { Accordion, AccordionContent, AccordionItem, AccordionTrigger };\n","import * as React from \"react\";\nimport { cn } from \"@/lib/utils\";\nimport { ICON_NODES } from \"@/components/ui/icon-registry\";\n\ntype IconNode = [string, Record<string, string>, ...IconNode[]];\n\nfunction renderNode(node: IconNode, idx: number): React.ReactNode {\n const [tag, attrs, ...children] = node;\n return React.createElement(\n tag,\n { key: idx, ...attrs },\n ...children.map((child, i) => renderNode(child as IconNode, i)),\n );\n}\n\nexport interface IconProps extends React.SVGProps<SVGSVGElement> {\n /** Icon name in kebab-case (e.g. \"arrow-up\", \"chevron-down\") */\n name: string;\n className?: string;\n strokeWidth?: number;\n}\n\n/**\n * Inline SVG icon component.\n * Uses `stroke=\"currentColor\"` so color is controlled via CSS `text-*` classes.\n * Renders the same paths as lucide-react but without the library dependency.\n */\nexport function Icon({\n name,\n className,\n strokeWidth = 1.5,\n ...props\n}: IconProps) {\n const nodes = ICON_NODES[name];\n if (!nodes) return null;\n\n return (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n className={cn(\"shrink-0\", className)}\n {...props}\n >\n {nodes.map((node, i) => renderNode(node, i))}\n </svg>\n );\n}\n","// Auto-generated by scripts/gen-icon-registry.mjs — do not edit manually.\n// Source: lucide-react ESM icon nodes.\n\ntype IconNode = [string, Record<string, string>, ...IconNode[]];\n\nexport const ICON_NODES: Record<string, IconNode[]> = {\n \"arrow-up\": [\n [\"path\", {\"d\":\"m5 12 7-7 7 7\"}],\n [\"path\", {\"d\":\"M12 19V5\"}]\n ],\n \"bar-chart-3\": [\n [\"path\", {\"d\":\"M3 3v16a2 2 0 0 0 2 2h16\"}],\n [\"path\", {\"d\":\"M18 17V9\"}],\n [\"path\", {\"d\":\"M13 17V5\"}],\n [\"path\", {\"d\":\"M8 17v-3\"}]\n ],\n \"bell\": [\n [\"path\", {\"d\":\"M10.268 21a2 2 0 0 0 3.464 0\"}],\n [\"path\", {\"d\":\"M3.262 15.326A1 1 0 0 0 4 17h16a1 1 0 0 0 .74-1.673C19.41 13.956 18 12.499 18 8A6 6 0 0 0 6 8c0 4.499-1.411 5.956-2.738 7.326\"}]\n ],\n \"box\": [\n [\"path\", {\"d\":\"M21 8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16Z\"}],\n [\"path\", {\"d\":\"m3.3 7 8.7 5 8.7-5\"}],\n [\"path\", {\"d\":\"M12 22V12\"}]\n ],\n \"calendar\": [\n [\"path\", {\"d\":\"M8 2v4\"}],\n [\"path\", {\"d\":\"M16 2v4\"}],\n [\"rect\", {\"width\":\"18\",\"height\":\"18\",\"x\":\"3\",\"y\":\"4\",\"rx\":\"2\"}],\n [\"path\", {\"d\":\"M3 10h18\"}]\n ],\n \"check\": [\n [\"path\", {\"d\":\"M20 6 9 17l-5-5\"}]\n ],\n \"chevron-down\": [\n [\"path\", {\"d\":\"m6 9 6 6 6-6\"}]\n ],\n \"chevron-left\": [\n [\"path\", {\"d\":\"m15 18-6-6 6-6\"}]\n ],\n \"chevron-right\": [\n [\"path\", {\"d\":\"m9 18 6-6-6-6\"}]\n ],\n \"circle-alert\": [\n [\"circle\", {\"cx\":\"12\",\"cy\":\"12\",\"r\":\"10\"}],\n [\"line\", {\"x1\":\"12\",\"x2\":\"12\",\"y1\":\"8\",\"y2\":\"12\"}],\n [\"line\", {\"x1\":\"12\",\"x2\":\"12.01\",\"y1\":\"16\",\"y2\":\"16\"}]\n ],\n \"circle-arrow-up\": [\n [\"circle\", {\"cx\":\"12\",\"cy\":\"12\",\"r\":\"10\"}],\n [\"path\", {\"d\":\"m16 12-4-4-4 4\"}],\n [\"path\", {\"d\":\"M12 16V8\"}]\n ],\n \"circle-check\": [\n [\"circle\", {\"cx\":\"12\",\"cy\":\"12\",\"r\":\"10\"}],\n [\"path\", {\"d\":\"m9 12 2 2 4-4\"}]\n ],\n \"circle-stop\": [\n [\"circle\", {\"cx\":\"12\",\"cy\":\"12\",\"r\":\"10\"}],\n [\"rect\", {\"x\":\"9\",\"y\":\"9\",\"width\":\"6\",\"height\":\"6\",\"rx\":\"1\"}]\n ],\n \"circle-x\": [\n [\"circle\", {\"cx\":\"12\",\"cy\":\"12\",\"r\":\"10\"}],\n [\"path\", {\"d\":\"m15 9-6 6\"}],\n [\"path\", {\"d\":\"m9 9 6 6\"}]\n ],\n \"copy\": [\n [\"rect\", {\"width\":\"14\",\"height\":\"14\",\"x\":\"8\",\"y\":\"8\",\"rx\":\"2\",\"ry\":\"2\"}],\n [\"path\", {\"d\":\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"}]\n ],\n \"database\": [\n [\"ellipse\", {\"cx\":\"12\",\"cy\":\"5\",\"rx\":\"9\",\"ry\":\"3\"}],\n [\"path\", {\"d\":\"M3 5V19A9 3 0 0 0 21 19V5\"}],\n [\"path\", {\"d\":\"M3 12A9 3 0 0 0 21 12\"}]\n ],\n \"ellipsis\": [\n [\"circle\", {\"cx\":\"12\",\"cy\":\"12\",\"r\":\"1\"}],\n [\"circle\", {\"cx\":\"19\",\"cy\":\"12\",\"r\":\"1\"}],\n [\"circle\", {\"cx\":\"5\",\"cy\":\"12\",\"r\":\"1\"}]\n ],\n \"eye\": [\n [\"path\", {\"d\":\"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0\"}],\n [\"circle\", {\"cx\":\"12\",\"cy\":\"12\",\"r\":\"3\"}]\n ],\n \"file\": [\n [\"path\", {\"d\":\"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z\"}],\n [\"path\", {\"d\":\"M14 2v5a1 1 0 0 0 1 1h5\"}]\n ],\n \"file-plus-2\": [\n [\"path\", {\"d\":\"M11.35 22H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.706.706l3.588 3.588A2.4 2.4 0 0 1 20 8v5.35\"}],\n [\"path\", {\"d\":\"M14 2v5a1 1 0 0 0 1 1h5\"}],\n [\"path\", {\"d\":\"M14 19h6\"}],\n [\"path\", {\"d\":\"M17 16v6\"}]\n ],\n \"file-text\": [\n [\"path\", {\"d\":\"M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z\"}],\n [\"path\", {\"d\":\"M14 2v5a1 1 0 0 0 1 1h5\"}],\n [\"path\", {\"d\":\"M10 9H8\"}],\n [\"path\", {\"d\":\"M16 13H8\"}],\n [\"path\", {\"d\":\"M16 17H8\"}]\n ],\n \"folder\": [\n [\"path\", {\"d\":\"M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z\"}]\n ],\n \"folder-open-dot\": [\n [\"path\", {\"d\":\"m6 14 1.45-2.9A2 2 0 0 1 9.24 10H20a2 2 0 0 1 1.94 2.5l-1.55 6a2 2 0 0 1-1.94 1.5H4a2 2 0 0 1-2-2V5c0-1.1.9-2 2-2h3.93a2 2 0 0 1 1.66.9l.82 1.2a2 2 0 0 0 1.66.9H18a2 2 0 0 1 2 2v2\"}],\n [\"circle\", {\"cx\":\"14\",\"cy\":\"15\",\"r\":\"1\"}]\n ],\n \"globe\": [\n [\"circle\", {\"cx\":\"12\",\"cy\":\"12\",\"r\":\"10\"}],\n [\"path\", {\"d\":\"M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20\"}],\n [\"path\", {\"d\":\"M2 12h20\"}]\n ],\n \"grid-2x2\": [\n [\"path\", {\"d\":\"M12 3v18\"}],\n [\"path\", {\"d\":\"M3 12h18\"}],\n [\"rect\", {\"x\":\"3\",\"y\":\"3\",\"width\":\"18\",\"height\":\"18\",\"rx\":\"2\"}]\n ],\n \"history\": [\n [\"path\", {\"d\":\"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\"}],\n [\"path\", {\"d\":\"M3 3v5h5\"}],\n [\"path\", {\"d\":\"M12 7v5l4 2\"}]\n ],\n \"info\": [\n [\"circle\", {\"cx\":\"12\",\"cy\":\"12\",\"r\":\"10\"}],\n [\"path\", {\"d\":\"M12 16v-4\"}],\n [\"path\", {\"d\":\"M12 8h.01\"}]\n ],\n \"joystick\": [\n [\"path\", {\"d\":\"M21 17a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v2a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-2Z\"}],\n [\"path\", {\"d\":\"M6 15v-2\"}],\n [\"path\", {\"d\":\"M12 15V9\"}],\n [\"circle\", {\"cx\":\"12\",\"cy\":\"6\",\"r\":\"3\"}]\n ],\n \"key-round\": [\n [\"path\", {\"d\":\"M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z\"}],\n [\"circle\", {\"cx\":\"16.5\",\"cy\":\"7.5\",\"r\":\".5\",\"fill\":\"currentColor\"}]\n ],\n \"languages\": [\n [\"path\", {\"d\":\"m5 8 6 6\"}],\n [\"path\", {\"d\":\"m4 14 6-6 2-3\"}],\n [\"path\", {\"d\":\"M2 5h12\"}],\n [\"path\", {\"d\":\"M7 2h1\"}],\n [\"path\", {\"d\":\"m22 22-5-10-5 10\"}],\n [\"path\", {\"d\":\"M14 18h6\"}]\n ],\n \"loader-2\": [\n [\"path\", {\"d\":\"M21 12a9 9 0 1 1-6.219-8.56\"}]\n ],\n \"loader-circle\": [\n [\"path\", {\"d\":\"M21 12a9 9 0 1 1-6.219-8.56\"}]\n ],\n \"log-out\": [\n [\"path\", {\"d\":\"m16 17 5-5-5-5\"}],\n [\"path\", {\"d\":\"M21 12H9\"}],\n [\"path\", {\"d\":\"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4\"}]\n ],\n \"mic\": [\n [\"path\", {\"d\":\"M12 19v3\"}],\n [\"path\", {\"d\":\"M19 10v2a7 7 0 0 1-14 0v-2\"}],\n [\"rect\", {\"x\":\"9\",\"y\":\"2\",\"width\":\"6\",\"height\":\"13\",\"rx\":\"3\"}]\n ],\n \"monitor\": [\n [\"rect\", {\"width\":\"20\",\"height\":\"14\",\"x\":\"2\",\"y\":\"3\",\"rx\":\"2\"}],\n [\"line\", {\"x1\":\"8\",\"x2\":\"16\",\"y1\":\"21\",\"y2\":\"21\"}],\n [\"line\", {\"x1\":\"12\",\"x2\":\"12\",\"y1\":\"17\",\"y2\":\"21\"}]\n ],\n \"more-horizontal\": [\n [\"circle\", {\"cx\":\"12\",\"cy\":\"12\",\"r\":\"1\"}],\n [\"circle\", {\"cx\":\"19\",\"cy\":\"12\",\"r\":\"1\"}],\n [\"circle\", {\"cx\":\"5\",\"cy\":\"12\",\"r\":\"1\"}]\n ],\n \"paperclip\": [\n [\"path\", {\"d\":\"m16 6-8.414 8.586a2 2 0 0 0 2.829 2.829l8.414-8.586a4 4 0 1 0-5.657-5.657l-8.379 8.551a6 6 0 1 0 8.485 8.485l8.379-8.551\"}]\n ],\n \"pen-tool\": [\n [\"path\", {\"d\":\"M15.707 21.293a1 1 0 0 1-1.414 0l-1.586-1.586a1 1 0 0 1 0-1.414l5.586-5.586a1 1 0 0 1 1.414 0l1.586 1.586a1 1 0 0 1 0 1.414z\"}],\n [\"path\", {\"d\":\"m18 13-1.375-6.874a1 1 0 0 0-.746-.776L3.235 2.028a1 1 0 0 0-1.207 1.207L5.35 15.879a1 1 0 0 0 .776.746L13 18\"}],\n [\"path\", {\"d\":\"m2.3 2.3 7.286 7.286\"}],\n [\"circle\", {\"cx\":\"11\",\"cy\":\"11\",\"r\":\"2\"}]\n ],\n \"phone-off\": [\n [\"path\", {\"d\":\"M10.1 13.9a14 14 0 0 0 3.732 2.668 1 1 0 0 0 1.213-.303l.355-.465A2 2 0 0 1 17 15h3a2 2 0 0 1 2 2v3a2 2 0 0 1-2 2 18 18 0 0 1-12.728-5.272\"}],\n [\"path\", {\"d\":\"M22 2 2 22\"}],\n [\"path\", {\"d\":\"M4.76 13.582A18 18 0 0 1 2 4a2 2 0 0 1 2-2h3a2 2 0 0 1 2 2v3a2 2 0 0 1-.8 1.6l-.468.351a1 1 0 0 0-.292 1.233 14 14 0 0 0 .244.473\"}]\n ],\n \"minus\": [\n [\"path\", {\"d\":\"M5 12h14\"}]\n ],\n \"plus\": [\n [\"path\", {\"d\":\"M5 12h14\"}],\n [\"path\", {\"d\":\"M12 5v14\"}]\n ],\n \"receipt-text\": [\n [\"path\", {\"d\":\"M13 16H8\"}],\n [\"path\", {\"d\":\"M14 8H8\"}],\n [\"path\", {\"d\":\"M16 12H8\"}],\n [\"path\", {\"d\":\"M4 3a1 1 0 0 1 1-1 1.3 1.3 0 0 1 .7.2l.933.6a1.3 1.3 0 0 0 1.4 0l.934-.6a1.3 1.3 0 0 1 1.4 0l.933.6a1.3 1.3 0 0 0 1.4 0l.933-.6a1.3 1.3 0 0 1 1.4 0l.934.6a1.3 1.3 0 0 0 1.4 0l.933-.6A1.3 1.3 0 0 1 19 2a1 1 0 0 1 1 1v18a1 1 0 0 1-1 1 1.3 1.3 0 0 1-.7-.2l-.933-.6a1.3 1.3 0 0 0-1.4 0l-.934.6a1.3 1.3 0 0 1-1.4 0l-.933-.6a1.3 1.3 0 0 0-1.4 0l-.933.6a1.3 1.3 0 0 1-1.4 0l-.934-.6a1.3 1.3 0 0 0-1.4 0l-.933.6a1.3 1.3 0 0 1-.7.2 1 1 0 0 1-1-1z\"}]\n ],\n \"search\": [\n [\"path\", {\"d\":\"m21 21-4.34-4.34\"}],\n [\"circle\", {\"cx\":\"11\",\"cy\":\"11\",\"r\":\"8\"}]\n ],\n \"server\": [\n [\"rect\", {\"width\":\"20\",\"height\":\"8\",\"x\":\"2\",\"y\":\"2\",\"rx\":\"2\",\"ry\":\"2\"}],\n [\"rect\", {\"width\":\"20\",\"height\":\"8\",\"x\":\"2\",\"y\":\"14\",\"rx\":\"2\",\"ry\":\"2\"}],\n [\"line\", {\"x1\":\"6\",\"x2\":\"6.01\",\"y1\":\"6\",\"y2\":\"6\"}],\n [\"line\", {\"x1\":\"6\",\"x2\":\"6.01\",\"y1\":\"18\",\"y2\":\"18\"}]\n ],\n \"settings\": [\n [\"path\", {\"d\":\"M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915\"}],\n [\"circle\", {\"cx\":\"12\",\"cy\":\"12\",\"r\":\"3\"}]\n ],\n \"slash\": [\n [\"path\", {\"d\":\"M22 2 2 22\"}]\n ],\n \"sliders-horizontal\": [\n [\"path\", {\"d\":\"M10 5H3\"}],\n [\"path\", {\"d\":\"M12 19H3\"}],\n [\"path\", {\"d\":\"M14 3v4\"}],\n [\"path\", {\"d\":\"M16 17v4\"}],\n [\"path\", {\"d\":\"M21 12h-9\"}],\n [\"path\", {\"d\":\"M21 19h-5\"}],\n [\"path\", {\"d\":\"M21 5h-7\"}],\n [\"path\", {\"d\":\"M8 10v4\"}],\n [\"path\", {\"d\":\"M8 12H3\"}]\n ],\n \"sparkles\": [\n [\"path\", {\"d\":\"M11.017 2.814a1 1 0 0 1 1.966 0l1.051 5.558a2 2 0 0 0 1.594 1.594l5.558 1.051a1 1 0 0 1 0 1.966l-5.558 1.051a2 2 0 0 0-1.594 1.594l-1.051 5.558a1 1 0 0 1-1.966 0l-1.051-5.558a2 2 0 0 0-1.594-1.594l-5.558-1.051a1 1 0 0 1 0-1.966l5.558-1.051a2 2 0 0 0 1.594-1.594z\"}],\n [\"path\", {\"d\":\"M20 2v4\"}],\n [\"path\", {\"d\":\"M22 4h-4\"}],\n [\"circle\", {\"cx\":\"4\",\"cy\":\"20\",\"r\":\"2\"}]\n ],\n \"square\": [\n [\"rect\", {\"width\":\"18\",\"height\":\"18\",\"x\":\"3\",\"y\":\"3\",\"rx\":\"2\"}]\n ],\n \"square-pen\": [\n [\"path\", {\"d\":\"M12 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7\"}],\n [\"path\", {\"d\":\"M18.375 2.625a1 1 0 0 1 3 3l-9.013 9.014a2 2 0 0 1-.853.505l-2.873.84a.5.5 0 0 1-.62-.62l.84-2.873a2 2 0 0 1 .506-.852z\"}]\n ],\n \"terminal\": [\n [\"path\", {\"d\":\"M12 19h8\"}],\n [\"path\", {\"d\":\"m4 17 6-6-6-6\"}]\n ],\n \"trash-2\": [\n [\"path\", {\"d\":\"M10 11v6\"}],\n [\"path\", {\"d\":\"M14 11v6\"}],\n [\"path\", {\"d\":\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6\"}],\n [\"path\", {\"d\":\"M3 6h18\"}],\n [\"path\", {\"d\":\"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\"}]\n ],\n \"user\": [\n [\"path\", {\"d\":\"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2\"}],\n [\"circle\", {\"cx\":\"12\",\"cy\":\"7\",\"r\":\"4\"}]\n ],\n \"user-cog\": [\n [\"path\", {\"d\":\"M10 15H6a4 4 0 0 0-4 4v2\"}],\n [\"path\", {\"d\":\"m14.305 16.53.923-.382\"}],\n [\"path\", {\"d\":\"m15.228 13.852-.923-.383\"}],\n [\"path\", {\"d\":\"m16.852 12.228-.383-.923\"}],\n [\"path\", {\"d\":\"m16.852 17.772-.383.924\"}],\n [\"path\", {\"d\":\"m19.148 12.228.383-.923\"}],\n [\"path\", {\"d\":\"m19.53 18.696-.382-.924\"}],\n [\"path\", {\"d\":\"m20.772 13.852.924-.383\"}],\n [\"path\", {\"d\":\"m20.772 16.148.924.383\"}],\n [\"circle\", {\"cx\":\"18\",\"cy\":\"15\",\"r\":\"3\"}],\n [\"circle\", {\"cx\":\"9\",\"cy\":\"7\",\"r\":\"4\"}]\n ],\n \"x\": [\n [\"path\", {\"d\":\"M18 6 6 18\"}],\n [\"path\", {\"d\":\"m6 6 12 12\"}]\n ],\n \"zap\": [\n [\"path\", {\"d\":\"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z\"}]\n ]\n};\n","\"use client\";\n\nimport * as React from \"react\";\nimport { AlertDialog as AlertDialogPrimitive } from \"radix-ui\";\n\nimport { cn } from \"@/lib/utils\";\nimport { buttonVariants } from \"@/components/ui/button\";\n\n// ─── Root ─────────────────────────────────────────────────────────────────────\n\nconst AlertDialog = AlertDialogPrimitive.Root;\n\n// ─── Trigger ──────────────────────────────────────────────────────────────────\n\nconst AlertDialogTrigger = AlertDialogPrimitive.Trigger;\n\n// ─── Portal ───────────────────────────────────────────────────────────────────\n\nconst AlertDialogPortal = AlertDialogPrimitive.Portal;\n\n// ─── Overlay ──────────────────────────────────────────────────────────────────\n// 배경 딤(dim) 레이어: 다이얼로그 열릴 때 fade-in, 닫힐 때 fade-out\n\nconst AlertDialogOverlay = React.forwardRef<\n React.ComponentRef<typeof AlertDialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Overlay\n ref={ref}\n className={cn(\n // 배경 딤 레이어 — 스크롤 없이 화면 전체 덮기\n \"fixed inset-0 z-50 bg-black/30\",\n // 열림/닫힘 애니메이션 (tw-animate-css)\n \"data-[state=open]:animate-in data-[state=closed]:animate-out\",\n \"data-[state=open]:fade-in-0 data-[state=closed]:fade-out-0\",\n \"duration-200\",\n className\n )}\n {...props}\n />\n));\nAlertDialogOverlay.displayName = \"AlertDialogOverlay\";\n\n// ─── Content ──────────────────────────────────────────────────────────────────\n// 다이얼로그 패널: 360px 고정폭, rounded-lg(10px), shadow-lg\n\nconst AlertDialogContent = React.forwardRef<\n React.ComponentRef<typeof AlertDialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Content>\n>(({ className, ...props }, ref) => (\n <AlertDialogPortal>\n <AlertDialogOverlay />\n <AlertDialogPrimitive.Content\n ref={ref}\n className={cn(\n // 위치 — 화면 중앙 고정\n \"fixed left-1/2 top-1/2 z-50 -translate-x-1/2 -translate-y-1/2\",\n // 레이아웃\n \"flex w-90 flex-col gap-4 p-6\",\n // 외형\n \"bg-background border border-border rounded-lg\",\n \"shadow-modal\",\n // 열림/닫힘 애니메이션 (tw-animate-css)\n \"data-[state=open]:animate-in data-[state=closed]:animate-out\",\n \"data-[state=open]:fade-in-0 data-[state=closed]:fade-out-0\",\n \"data-[state=open]:zoom-in-95 data-[state=closed]:zoom-out-95\",\n \"duration-200\",\n className\n )}\n {...props}\n />\n </AlertDialogPortal>\n));\nAlertDialogContent.displayName = \"AlertDialogContent\";\n\n// ─── Header ───────────────────────────────────────────────────────────────────\n// 제목 + 설명 묶음 영역\n\nfunction AlertDialogHeader({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n className={cn(\"flex flex-col gap-2\", className)}\n {...props}\n />\n );\n}\nAlertDialogHeader.displayName = \"AlertDialogHeader\";\n\n// ─── Footer ───────────────────────────────────────────────────────────────────\n// 버튼 묶음 영역 — 오른쪽 정렬, gap-2\n\nfunction AlertDialogFooter({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n className={cn(\"flex items-center justify-end gap-2\", className)}\n {...props}\n />\n );\n}\nAlertDialogFooter.displayName = \"AlertDialogFooter\";\n\n// ─── Title ────────────────────────────────────────────────────────────────────\n// 18px / SemiBold / text-foreground\n\nconst AlertDialogTitle = React.forwardRef<\n React.ComponentRef<typeof AlertDialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Title\n ref={ref}\n className={cn(\n \"text-lg font-semibold leading-7 tracking-tight text-foreground\",\n className\n )}\n {...props}\n />\n));\nAlertDialogTitle.displayName = \"AlertDialogTitle\";\n\n// ─── Description ──────────────────────────────────────────────────────────────\n// 14px / Regular / text-muted-foreground\n\nconst AlertDialogDescription = React.forwardRef<\n React.ComponentRef<typeof AlertDialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Description\n ref={ref}\n className={cn(\n \"text-sm font-normal leading-5 tracking-tight text-muted-foreground\",\n className\n )}\n {...props}\n />\n));\nAlertDialogDescription.displayName = \"AlertDialogDescription\";\n\n// ─── Action ───────────────────────────────────────────────────────────────────\n// 확인/계속 버튼 — primary variant (Button 스타일 재사용)\n\nconst AlertDialogAction = React.forwardRef<\n React.ComponentRef<typeof AlertDialogPrimitive.Action>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Action>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Action\n ref={ref}\n className={cn(buttonVariants({ variant: \"default\" }), className)}\n {...props}\n />\n));\nAlertDialogAction.displayName = \"AlertDialogAction\";\n\n// ─── Cancel ───────────────────────────────────────────────────────────────────\n// 취소 버튼 — outline variant (Button 스타일 재사용)\n\nconst AlertDialogCancel = React.forwardRef<\n React.ComponentRef<typeof AlertDialogPrimitive.Cancel>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Cancel>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Cancel\n ref={ref}\n className={cn(buttonVariants({ variant: \"outline\" }), className)}\n {...props}\n />\n));\nAlertDialogCancel.displayName = \"AlertDialogCancel\";\n\n// ─── Exports ──────────────────────────────────────────────────────────────────\n\nexport {\n AlertDialog,\n AlertDialogTrigger,\n AlertDialogPortal,\n AlertDialogOverlay,\n AlertDialogContent,\n AlertDialogHeader,\n AlertDialogFooter,\n AlertDialogTitle,\n AlertDialogDescription,\n AlertDialogAction,\n AlertDialogCancel,\n};\n","\"use client\";\n\nimport * as React from \"react\";\nimport { Slot } from \"radix-ui\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"@/lib/utils\";\nimport { Icon } from \"@/components/ui/icon\";\n\n// ─── Variants ─────────────────────────────────────────────────────────────────\n// Derived from RYAI Design System — Button component (node 402:654)\n\nconst buttonVariants = cva(\n // Base — 모든 버튼 공통 스타일\n \"inline-flex shrink-0 items-center justify-center gap-1.5 rounded-lg text-sm font-medium leading-5 tracking-tight whitespace-nowrap cursor-pointer select-none transition-[transform,opacity,background-color,border-color,color,box-shadow] duration-150 active:scale-[0.97] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&>svg]:size-4 [&>svg]:shrink-0\",\n {\n variants: {\n /**\n * variant — 버튼 색상/스타일\n * default 검정 배경, 흰 글자(primary-foreground), 그림자 / hover: opacity-90\n * secondary 연회색 배경, 검정 글자 / hover: accent 배경 (텍스트·opacity 변화 없음)\n * outline 흰 배경 + 테두리, 검정 글자 / hover: accent 배경 (텍스트 색 변화 없음)\n * ghost 배경 없음, 검정 글자 / hover: accent 배경 (텍스트 색 변화 없음)\n * destructive 빨간 배경, 흰 글자(95% opacity) / hover: opacity-90\n * link 배경/테두리 없음, primary 색 글자 / hover: underline\n */\n variant: {\n default:\n \"bg-primary text-primary-foreground shadow-button hover:opacity-90\",\n secondary:\n \"bg-secondary text-secondary-foreground hover:bg-accent\",\n outline:\n \"border border-border bg-background text-foreground hover:bg-accent\",\n ghost:\n \"text-foreground hover:bg-accent\",\n destructive:\n \"bg-destructive text-white/95 shadow-button hover:opacity-90\",\n link: \"text-primary underline-offset-4 hover:underline\",\n },\n /**\n * size — 버튼 크기\n * default h-9 (36px) px-4 텍스트 버튼 표준\n * icon 36×36 정사각형 아이콘 전용, rounded-lg 유지 / hover: opacity-80\n * rounded 36×36 원형 아이콘 전용, rounded-full / hover: opacity-80\n * pill px-3 py-1.5 rounded-full Rounded-text 필셋 스타일\n */\n size: {\n default: \"h-9 px-4 py-2\",\n icon: \"size-9 p-0 hover:opacity-80\",\n rounded: \"size-9 p-0 rounded-full hover:opacity-80\",\n pill: \"px-3 py-1.5 rounded-full\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n);\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n /** Radix Slot 패턴 — true 이면 자식 요소에 props를 병합 */\n asChild?: boolean;\n /** 로딩 상태 — 스피너 표시, 클릭 불가, 반투명 처리 (h-8 / 32px) */\n loading?: boolean;\n /**\n * 텍스트 앞에 렌더링할 아이콘 (primary / secondary / outline 전용)\n * loading 상태에서는 자동으로 숨겨집니다.\n */\n iconStart?: React.ReactNode;\n /**\n * 텍스트 뒤에 렌더링할 아이콘 (primary / secondary / outline 전용)\n * loading 상태에서는 자동으로 숨겨집니다.\n */\n iconEnd?: React.ReactNode;\n}\n\n// ─── Component ────────────────────────────────────────────────────────────────\n\nfunction Button({\n className,\n variant = \"default\",\n size = \"default\",\n asChild = false,\n loading = false,\n iconStart,\n iconEnd,\n disabled,\n children,\n ...props\n}: ButtonProps) {\n const Comp = asChild ? Slot.Root : \"button\";\n\n return (\n <Comp\n data-slot=\"button\"\n data-variant={variant}\n data-size={size}\n disabled={disabled || loading}\n className={cn(\n buttonVariants({ variant, size }),\n // loading 상태: !h-8(32px)·!px-3 로 축소 + 배경·그림자 초기화 + 반투명\n // !important 필요: Tailwind v4는 CSS 생성 순서 기준(h-9 > h-8)이므로\n // variant/size 클래스의 h-9·px-4 를 덮어쓰려면 !important 가 요구됨\n loading &&\n \"!h-8 !px-3 border border-border bg-background text-foreground opacity-50 shadow-none\",\n className\n )}\n {...props}\n >\n {loading ? (\n <>\n <Icon name=\"loader-2\" className=\"size-3.5 animate-spin\" />\n {children}\n </>\n ) : (\n <>\n {iconStart}\n {children}\n {iconEnd}\n </>\n )}\n </Comp>\n );\n}\n\nexport { Button, buttonVariants };\n","import * as React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"@/lib/utils\";\n\n// ─── Variants ─────────────────────────────────────────────────────────────────\n\n/**\n * 2-column grid layout:\n * Col 1 (16px): icon\n * Col 2 (1fr): title (row 1) / description (row 2, col-start-2)\n *\n * variant 색상은 CSS 상속으로 모든 자식에 자동 적용됩니다.\n * description font-weight은 CSS custom property로 제어합니다.\n * default → Pretendard Light (300)\n * destructive → Pretendard Regular (400)\n */\nconst alertVariants = cva(\n [\n // 레이아웃\n \"grid grid-cols-[16px_1fr] items-start gap-x-3 gap-y-0.5\",\n // 컨테이너\n \"w-full rounded-lg border border-border bg-background px-4 py-3\",\n // 아이콘 (직계 SVG 자식) — mt-[2px]로 텍스트 기준선에 시각적 정렬\n \"[&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:mt-0.5\",\n ].join(\" \"),\n {\n variants: {\n variant: {\n // 색상은 CSS 상속 / font-weight은 CSS variable로 자식에 주입\n default: \"text-foreground [--alert-desc-weight:300]\",\n destructive: \"text-destructive [--alert-desc-weight:400]\",\n },\n },\n defaultVariants: { variant: \"default\" },\n }\n);\n\n// ─── Alert (Root) ─────────────────────────────────────────────────────────────\n\nconst Alert = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement> & VariantProps<typeof alertVariants>\n>(({ className, variant, ...props }, ref) => (\n <div\n ref={ref}\n role=\"alert\"\n className={cn(alertVariants({ variant }), className)}\n {...props}\n />\n));\nAlert.displayName = \"Alert\";\n\n// ─── AlertTitle ───────────────────────────────────────────────────────────────\n// Grid [col 2, row 1] — 아이콘 오른쪽, 첫 번째 행\n\nconst AlertTitle = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <p\n ref={ref}\n className={cn(\n // 색상은 Alert root에서 상속 (text-foreground / text-destructive)\n \"text-sm font-medium leading-5 tracking-tight\",\n className\n )}\n {...props}\n />\n));\nAlertTitle.displayName = \"AlertTitle\";\n\n// ─── AlertDescription ─────────────────────────────────────────────────────────\n// Grid [col 2, row 2+] — col-start-2로 아이콘 열 건너뜀\n\nconst AlertDescription = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n // col-start-2: 아이콘 열을 건너뛰어 제목과 세로 정렬\n \"col-start-2\",\n // 색상 상속 / font-weight는 부모 CSS variable로 주입 (300 light ↔ 400 normal)\n \"text-sm [font-weight:var(--alert-desc-weight,400)] leading-5 tracking-tight\",\n // 내부에 ul이 포함될 경우 bullet 스타일 자동 적용\n \"[&_ul]:list-disc [&_ul]:ml-5 [&_ul]:mt-1 [&_li]:mt-0.5\",\n className\n )}\n {...props}\n />\n));\nAlertDescription.displayName = \"AlertDescription\";\n\nexport { Alert, AlertDescription, AlertTitle };\n","import { Avatar as AvatarPrimitive } from 'radix-ui';\nimport { cn } from '@/lib/utils';\n\n// ─── Size map ─────────────────────────────────────────────────────────────────\n// Figma 기준 md = 32px (size-8)\n\nconst SIZE: Record<AvatarSize, { root: string; text: string }> = {\n sm: { root: 'size-6', text: 'text-xs' },\n md: { root: 'size-8', text: 'text-base' },\n lg: { root: 'size-10', text: 'text-lg' },\n};\n\ntype AvatarSize = 'sm' | 'md' | 'lg';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport interface AvatarProps {\n /** 이미지 URL */\n src?: string;\n /** 이미지 alt 텍스트 */\n alt?: string;\n /**\n * 이미지 없거나 로드 실패 시 표시할 이니셜 텍스트.\n * square 아바타에서는 항상 표시.\n */\n fallback?: string;\n /**\n * circle (기본) — 원형, 사진 아바타\n * square — 모서리 둥근 사각형, 이니셜 아바타 (bg-gray-500 + 흰 글자)\n */\n shape?: 'circle' | 'square';\n /** sm (24px) | md (32px, 기본) | lg (40px) */\n size?: AvatarSize;\n className?: string;\n}\n\nexport interface AvatarGroupItem {\n /** 고유 식별자 (key prop으로 사용) */\n id: string;\n src?: string;\n alt?: string;\n fallback?: string;\n}\n\nexport interface AvatarGroupProps {\n avatars: AvatarGroupItem[];\n size?: AvatarSize;\n className?: string;\n}\n\n// ─── Avatar ───────────────────────────────────────────────────────────────────\n\nfunction Avatar({\n src,\n alt = '',\n fallback = '?',\n shape = 'circle',\n size = 'md',\n className,\n}: AvatarProps) {\n const isCircle = shape === 'circle';\n const { root, text } = SIZE[size];\n\n return (\n <AvatarPrimitive.Root\n data-slot='avatar'\n data-shape={shape}\n className={cn(\n 'relative inline-flex shrink-0 select-none overflow-hidden',\n root,\n isCircle ? 'rounded-full' : 'rounded-md',\n className,\n )}\n >\n {src && (\n <AvatarPrimitive.Image\n src={src}\n alt={alt}\n className='aspect-square size-full object-cover'\n />\n )}\n <AvatarPrimitive.Fallback\n delayMs={0}\n className={cn(\n 'flex size-full items-center justify-center font-medium leading-none',\n text,\n isCircle\n ? 'bg-secondary text-secondary-foreground'\n : 'bg-gray-500 text-white',\n )}\n >\n {fallback}\n </AvatarPrimitive.Fallback>\n </AvatarPrimitive.Root>\n );\n}\n\n// ─── AvatarGroup ──────────────────────────────────────────────────────────────\n// 아바타를 -8px(= -mr-2) 간격으로 겹쳐서 표시.\n// 두 번째 아바타부터 border-border 테두리로 구분.\n\nfunction AvatarGroup({ avatars, size = 'md', className }: AvatarGroupProps) {\n return (\n <div className={cn('flex items-center pr-2', className)}>\n {avatars.map((avatar, i) => (\n <Avatar\n key={avatar.id}\n src={avatar.src}\n alt={avatar.alt}\n fallback={avatar.fallback}\n size={size}\n shape='circle'\n className={cn('-mr-2', i > 0 && 'border border-border')}\n />\n ))}\n </div>\n );\n}\n\nexport { Avatar, AvatarGroup };\n","import { cn } from '@/lib/utils';\nimport { Icon } from './icon';\n\n// ─── Style constants ──────────────────────────────────────────────────────────\n// Derived from RYAI Design System - Badge component (node 73:3479)\n// h-5.5(22px) · rounded-lg(10px) · px-2.5 py-0.5 · text-xs font-medium\nconst TEXT_BADGE_BASE =\n 'inline-flex w-fit shrink-0 items-center justify-center gap-1 h-5.5 rounded-lg px-2.5 py-0.5 text-xs font-medium leading-xs tracking-tight whitespace-nowrap';\nconst BADGE_ICON_BASE = 'size-3';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\n/**\n * 배지 시맨틱 변형:\n * - default: primary 배경 (검정/흰)\n * - secondary: secondary 배경 (회색)\n * - destructive: destructive 배경 (강한 빨강)\n * - outline: 테두리만, 투명 배경 (회색)\n * - info: blue-50 배경 + blue-800 텍스트 (정보/완료)\n * - error: red-50 배경 + red-800 텍스트 (오류/실패)\n * - warning: amber-50 배경 + amber-800 텍스트 (경고/on-demand)\n * - success: green-50 배경 + green-800 텍스트 (성공/reserved)\n */\nexport type BadgeVariant = 'default' | 'secondary' | 'destructive' | 'outline' | 'info' | 'error' | 'warning' | 'success';\n\nexport interface BadgeProps {\n /** 배지 표시 텍스트 */\n text: string;\n /** 배지 시맨틱 변형 (기본값: default) */\n variant?: BadgeVariant;\n /** 아이콘 이름 (@/components/ui/icon-registry에 정의된 이름) */\n iconName?: string;\n className?: string;\n /** 아이콘 회전 여부 */\n spin?: boolean;\n}\n\n// ─── Variant → className lookup ───────────────────────────────────────────────\n\nexport const BADGE_VARIANT_STYLES: Record<BadgeVariant, string> = {\n default: 'bg-primary text-primary-foreground',\n secondary: 'bg-secondary text-secondary-foreground',\n destructive: 'bg-destructive text-white',\n outline: 'border border-border bg-transparent text-foreground',\n info: 'bg-blue-50 text-blue-800',\n error: 'bg-red-50 text-red-800',\n warning: 'bg-amber-50 text-amber-800',\n success: 'bg-green-50 text-green-800',\n};\n\n// ─── Component ────────────────────────────────────────────────────────────────\n\nexport function Badge({\n text,\n variant = 'default',\n spin = false,\n iconName,\n className,\n}: BadgeProps) {\n return (\n <span\n data-slot='badge'\n className={cn(TEXT_BADGE_BASE, BADGE_VARIANT_STYLES[variant], className)}\n >\n {iconName && (\n <Icon\n name={iconName}\n className={cn(BADGE_ICON_BASE, spin && 'animate-spin')}\n />\n )}\n {text}\n </span>\n );\n}\n","import React from \"react\";\nimport { cn } from \"@/lib/utils\";\nimport { Icon } from \"@/components/ui/icon\";\n\n// ─── Breadcrumb ───────────────────────────────────────────────────────────────\n\nfunction Breadcrumb({\n className,\n ...props\n}: React.ComponentPropsWithoutRef<\"nav\">) {\n return <nav aria-label=\"breadcrumb\" className={cn(className)} {...props} />;\n}\n\n// ─── BreadcrumbList ───────────────────────────────────────────────────────────\n\nfunction BreadcrumbList({\n className,\n ...props\n}: React.ComponentPropsWithoutRef<\"ol\">) {\n return (\n <ol\n className={cn(\n \"flex flex-wrap items-center gap-1.5 text-sm tracking-tight text-muted-foreground\",\n className\n )}\n {...props}\n />\n );\n}\n\n// ─── BreadcrumbItem ───────────────────────────────────────────────────────────\n\nfunction BreadcrumbItem({\n className,\n ...props\n}: React.ComponentPropsWithoutRef<\"li\">) {\n return (\n <li className={cn(\"inline-flex items-center gap-1\", className)} {...props} />\n );\n}\n\n// ─── BreadcrumbLink ───────────────────────────────────────────────────────────\n// 클릭 가능한 이전 경로 항목\n\nfunction BreadcrumbLink({\n className,\n ...props\n}: React.ComponentPropsWithoutRef<\"a\">) {\n return (\n <a\n className={cn(\n \"transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring rounded-sm\",\n className\n )}\n {...props}\n />\n );\n}\n\n// ─── BreadcrumbPage ───────────────────────────────────────────────────────────\n// 현재 페이지 (마지막 항목) — 링크 없음, foreground 색상\n\nfunction BreadcrumbPage({\n className,\n ...props\n}: React.ComponentPropsWithoutRef<\"span\">) {\n return (\n <span\n aria-current=\"page\"\n className={cn(\"text-foreground\", className)}\n {...props}\n />\n );\n}\n\n// ─── BreadcrumbSeparator ──────────────────────────────────────────────────────\n// 구분자 — 기본값 ChevronRight, children으로 Slash 등 교체 가능\n\nfunction BreadcrumbSeparator({\n children,\n className,\n ...props\n}: React.ComponentPropsWithoutRef<\"li\">) {\n return (\n <li\n role=\"presentation\"\n aria-hidden\n className={cn(\"[&>svg]:size-3.5\", className)}\n {...props}\n >\n {children ?? <Icon name=\"chevron-right\" className=\"size-3.5\" />}\n </li>\n );\n}\n\n// ─── BreadcrumbEllipsis ───────────────────────────────────────────────────────\n// 축약된 중간 경로를 나타내는 ... 버튼\n\nfunction BreadcrumbEllipsis({\n className,\n ...props\n}: React.ComponentPropsWithoutRef<\"span\">) {\n return (\n <span\n role=\"presentation\"\n aria-hidden\n className={cn(\"flex items-center justify-center\", className)}\n {...props}\n >\n <Icon name=\"more-horizontal\" className=\"size-3.5\" />\n <span className=\"sr-only\">More</span>\n </span>\n );\n}\n\n// ─── BreadcrumbDropdownItem ───────────────────────────────────────────────────\n// 드롭다운 트리거가 있는 중간 항목 (ChevronDown 표시)\n\nfunction BreadcrumbDropdownItem({\n children,\n className,\n ...props\n}: React.ComponentPropsWithoutRef<\"button\">) {\n return (\n <button\n type=\"button\"\n className={cn(\n \"inline-flex items-center gap-1 transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring rounded-sm\",\n className\n )}\n {...props}\n >\n {children}\n <Icon name=\"chevron-down\" className=\"size-3.5\" />\n </button>\n );\n}\n\nexport {\n Breadcrumb,\n BreadcrumbList,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbPage,\n BreadcrumbSeparator,\n BreadcrumbEllipsis,\n BreadcrumbDropdownItem,\n};\n","'use client';\n\nimport { cn } from '@/lib/utils';\nimport { Badge } from '@/components/ui/badge';\nimport { Button } from '@/components/ui/button';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\n/** 예약 유형: Reserved(사전 예약) 또는 On-demand(즉시 사용) */\nexport type MachineType = 'reserved' | 'on-demand';\n\n/** 이용 상태: 대여가능 또는 대여중 */\nexport type AvailabilityStatus = 'available' | 'rented';\n\nexport interface CardSpec {\n label: string;\n value: string;\n}\n\nexport interface CardProps {\n /** 예약 유형 배지 — reserved 또는 on-demand (필수) */\n machineType: MachineType;\n /** 이용 상태 배지 — available(대여가능) 또는 rented(대여중) (필수) */\n availability: AvailabilityStatus;\n /** 머신 이름 (예: \"NVIDIA B300 x 8\") */\n machineName: string;\n /** 머신 이름 앞 이니셜 박스에 표시할 문자 (예: \"B\") */\n machineInitial: string;\n /** 스펙 태그 목록 (예: [\"4x8x\", \"000GB VRAM\", \"B-Series\"]) */\n tags?: string[];\n /** 스펙 상세 목록 (예: [{ label: \"CPU\", value: \"128 Core\" }]) */\n specs?: CardSpec[];\n /** 머신 선택 버튼 클릭 핸들러 */\n onSelect?: () => void;\n /** 버튼 텍스트 (기본값: \"머신 선택\") */\n selectLabel?: string;\n className?: string;\n}\n\n// ─── Badge color 매핑 ────────────────────────────────────────────────────────\n// 도메인 데이터 값 → Badge color + label + icon\n\nconst AVAILABILITY_BADGE = {\n available: { variant: 'info', label: '대여 가능', icon: null } as const,\n rented: { variant: 'secondary', label: '대여 중', icon: 'settings' } as const,\n};\n\nconst MACHINE_TYPE_BADGE = {\n reserved: {\n variant: 'success',\n label: 'Reserved',\n icon: 'calendar',\n } as const,\n 'on-demand': { variant: 'warning', label: 'On-demand', icon: 'zap' } as const,\n};\n\n// ─── Card ─────────────────────────────────────────────────────────────────────\n\nfunction Card({\n machineType,\n availability,\n machineName,\n machineInitial,\n tags = [],\n specs = [],\n onSelect,\n selectLabel = '머신 선택',\n className,\n}: CardProps) {\n const avail = AVAILABILITY_BADGE[availability];\n const mtype = MACHINE_TYPE_BADGE[machineType];\n\n return (\n <div\n className={cn(\n 'flex w-80 flex-col gap-6 rounded-2xl border border-border bg-card py-6 shadow-sm',\n className,\n )}\n >\n {/* 상태 배지 영역 — 이용 상태 + 예약 유형 순서 */}\n <div className='flex items-center gap-1 px-6'>\n <Badge\n text={avail.label}\n variant={avail.variant}\n iconName={avail.icon ?? undefined}\n />\n <Badge\n text={mtype.label}\n variant={mtype.variant}\n iconName={mtype.icon}\n />\n </div>\n\n {/* 머신 이름 + 스펙 태그 */}\n <div className='flex flex-col gap-2 px-6'>\n <div className='flex items-center gap-2 w-full'>\n <div className='flex size-10 shrink-0 items-center justify-center rounded-lg border border-border bg-background'>\n <span className='text-xl font-bold leading-7 tracking-tight text-foreground'>\n {machineInitial}\n </span>\n </div>\n <span className='text-xl font-semibold leading-7 tracking-tight text-card-foreground whitespace-nowrap'>\n {machineName}\n </span>\n </div>\n\n {tags.length > 0 && (\n <div className='flex min-h-12 flex-wrap content-center items-center gap-1.5'>\n {tags.map((tag) => (\n <Badge key={tag} text={tag} variant='secondary' />\n ))}\n </div>\n )}\n </div>\n\n {/* 스펙 상세 */}\n {specs.length > 0 && (\n <div className='flex flex-col gap-2 px-6'>\n {specs.map(({ label, value }) => (\n <div key={label} className='flex items-start w-full'>\n <span className='w-15 shrink-0 text-sm font-normal leading-5 tracking-tight text-muted-foreground'>\n {label}\n </span>\n <div className='flex min-w-0 flex-1 items-center justify-end'>\n <span className='text-sm font-medium leading-5 tracking-tight text-card-foreground whitespace-nowrap'>\n {value}\n </span>\n </div>\n </div>\n ))}\n </div>\n )}\n\n {/* 선택 버튼 */}\n <div className='px-6'>\n <Button variant='outline' className='w-full' onClick={onSelect}>\n {selectLabel}\n </Button>\n </div>\n </div>\n );\n}\n\nexport { Card };\n","'use client';\n\nimport * as React from 'react';\nimport { Checkbox as CheckboxPrimitive } from 'radix-ui';\nimport { cn } from '@/lib/utils';\nimport { Icon } from '@/components/ui/icon';\n\n// ─── FilledSquareCheck ────────────────────────────────────────────────────────\n// Figma lucide/square-check: filled square background + white stroke checkmark\n// Standard lucide SquareCheck is stroke-only; Figma uses the filled variant.\n// Shared by Checkbox and Label components.\n//\n// Coordinates derived from Figma node 73-4564 asset analysis:\n// - 20×20 viewBox, filled rect 15×15 at (2.5, 2.5), rx=1.66667\n// - White check path strokeWidth=1.25px (Figma imgVector2 reference)\n\nfunction FilledSquareCheck({ className }: { className?: string }) {\n return (\n <svg\n viewBox='0 0 20 20'\n fill='none'\n xmlns='http://www.w3.org/2000/svg'\n className={cn(className)}\n aria-hidden\n >\n <rect\n x='2.5'\n y='2.5'\n width='15'\n height='15'\n rx='1.66667'\n fill='currentColor'\n stroke='currentColor'\n strokeWidth='1.5'\n />\n <path\n d='M7.5 10L9.16667 11.66667L12.5 8.33333'\n stroke='white'\n strokeWidth='1.25'\n strokeLinecap='round'\n strokeLinejoin='round'\n strokeDasharray='8'\n style={{\n animation:\n 'check-draw 160ms cubic-bezier(0.23, 1, 0.32, 1) 40ms both',\n }}\n />\n </svg>\n );\n}\n\n// ─── Checkbox ─────────────────────────────────────────────────────────────────\n// Figma node 73-4564\n// Icon size: 20×20 (size-5)\n// Unchecked: lucide/square — stroke outline square (Square icon, text-foreground)\n// Checked: lucide/square-check filled — FilledSquareCheck (filled bg + white check)\n//\n// Optional label + description props:\n// - Without label: renders only the CheckboxPrimitive.Root (className → root)\n// - With label: renders a wrapper row with label/description (className → wrapper)\n\nexport interface CheckboxProps extends React.ComponentPropsWithoutRef<\n typeof CheckboxPrimitive.Root\n> {\n /** Optional label rendered to the right of the checkbox */\n label?: string;\n /** Optional description rendered below the label (requires label) */\n description?: string;\n}\n\nconst Checkbox = React.forwardRef<\n React.ElementRef<typeof CheckboxPrimitive.Root>,\n CheckboxProps\n>(({ className, id, label, description, disabled, ...props }, ref) => {\n const checkboxRoot = (\n <CheckboxPrimitive.Root\n ref={ref}\n id={id}\n disabled={disabled}\n className={cn(\n 'group peer relative size-5 shrink-0 cursor-pointer',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\n 'disabled:cursor-not-allowed',\n // When standalone (no label), disabled opacity lives here\n !label && 'disabled:opacity-50',\n // When description is present, nudge down to align with first line of text\n label && description && 'mt-0.5',\n !label && className,\n )}\n {...props}\n >\n {/* Unchecked icon — hidden when Root has data-state=checked */}\n <Icon\n name='square'\n className='size-5 text-border group-data-[state=checked]:hidden'\n />\n {/* Checked indicator — only mounted when checked */}\n <CheckboxPrimitive.Indicator className='absolute inset-0 flex items-center justify-center animate-checkbox-in'>\n <FilledSquareCheck className='size-5 text-foreground' />\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n );\n\n if (!label) return checkboxRoot;\n\n return (\n <label\n className={cn(\n 'flex gap-2',\n description ? 'items-start' : 'items-center',\n disabled ? 'cursor-not-allowed opacity-50' : 'cursor-pointer',\n className,\n )}\n >\n {checkboxRoot}\n <div className='flex flex-col gap-2'>\n <span className='text-sm font-medium leading-5 tracking-tight text-foreground select-none'>\n {label}\n </span>\n {description && (\n <p className='text-sm font-normal leading-5 tracking-tight text-muted-foreground'>\n {description}\n </p>\n )}\n </div>\n </label>\n );\n});\nCheckbox.displayName = CheckboxPrimitive.Root.displayName;\n\n// ─── CheckboxCard ──────────────────────────────────────────────────────────────\n// Figma variant: card with border-border (unchecked) → border-primary (checked)\n// CSS has() reacts to inner Checkbox's data-state without extra JS state\n\nexport interface CheckboxCardProps extends React.ComponentPropsWithoutRef<\n typeof CheckboxPrimitive.Root\n> {\n /** Main label text */\n label: string;\n /** Optional description below the label */\n description?: string;\n}\n\nconst CheckboxCard = React.forwardRef<\n React.ElementRef<typeof CheckboxPrimitive.Root>,\n CheckboxCardProps\n>(({ className, id, label, description, disabled, ...props }, ref) => (\n <label\n htmlFor={id}\n className={cn(\n 'flex cursor-pointer gap-2 items-start rounded-lg border border-border bg-background p-3',\n 'transition-colors',\n // has() — card border switches to primary when inner checkbox is checked\n 'has-[[data-state=checked]]:border-primary',\n disabled && 'cursor-not-allowed opacity-50',\n className,\n )}\n >\n <Checkbox\n ref={ref}\n id={id}\n disabled={disabled}\n className='mt-0.5'\n {...props}\n />\n <div className='flex flex-col gap-2 flex-1 min-w-0'>\n <span className='text-sm font-medium leading-5 tracking-tight text-foreground'>\n {label}\n </span>\n {description && (\n <span className='text-sm font-normal leading-5 tracking-tight text-muted-foreground'>\n {description}\n </span>\n )}\n </div>\n </label>\n));\nCheckboxCard.displayName = 'CheckboxCard';\n\nexport { Checkbox, CheckboxCard };\n","\"use client\";\n\nimport React, { createContext, useContext, useState } from \"react\";\nimport { cn } from \"@/lib/utils\";\n\n// ─── Context ──────────────────────────────────────────────────────────────────\n\ninterface ChoiceCardGroupCtx {\n value: string;\n onChange: (value: string) => void;\n}\n\nconst ChoiceCardGroupContext = createContext<ChoiceCardGroupCtx>({\n value: \"\",\n onChange: () => {},\n});\n\n// ─── ChoiceCardGroup ──────────────────────────────────────────────────────────\n// 카드형 라디오 그룹 컨테이너\n// 비제어(defaultValue) / 제어(value + onValueChange) 모드 모두 지원\n\nexport interface ChoiceCardGroupProps {\n /** 초기 선택값 (비제어 모드) */\n defaultValue?: string;\n /** 선택값 (제어 모드) */\n value?: string;\n /** 선택 변경 콜백 */\n onValueChange?: (value: string) => void;\n className?: string;\n children: React.ReactNode;\n}\n\nfunction ChoiceCardGroup({\n defaultValue = \"\",\n value: controlledValue,\n onValueChange,\n className,\n children,\n}: ChoiceCardGroupProps) {\n const [internalValue, setInternalValue] = useState(defaultValue);\n const isControlled = controlledValue !== undefined;\n const value = isControlled ? controlledValue : internalValue;\n\n const onChange = (v: string) => {\n if (!isControlled) setInternalValue(v);\n onValueChange?.(v);\n };\n\n return (\n <ChoiceCardGroupContext.Provider value={{ value, onChange }}>\n <div className={cn(\"flex flex-col gap-3\", className)} role=\"radiogroup\">\n {children}\n </div>\n </ChoiceCardGroupContext.Provider>\n );\n}\n\n// ─── ChoiceCardItem ───────────────────────────────────────────────────────────\n// 개별 선택 카드\n//\n// 선택됨 : bg-background border-primary — 라디오 인디케이터 활성 (Figma 1188-5356)\n// 미선택 : bg-background border-border — 라디오 인디케이터 비활성\n\nexport interface ChoiceCardItemProps {\n /** 그룹 내 고유 값 */\n value: string;\n /** 카드 제목 */\n title: string;\n /** 카드 설명 (선택) */\n description?: string;\n className?: string;\n}\n\nfunction ChoiceCardItem({\n value,\n title,\n description,\n className,\n}: ChoiceCardItemProps) {\n const { value: groupValue, onChange } = useContext(ChoiceCardGroupContext);\n const isSelected = groupValue === value;\n\n return (\n <button\n type=\"button\"\n role=\"radio\"\n aria-checked={isSelected}\n onClick={() => onChange(value)}\n className={cn(\n \"flex items-center gap-3 overflow-hidden rounded-lg border p-4 text-left transition-colors\",\n isSelected\n ? \"border-primary bg-background\"\n : \"border-border bg-background hover:bg-secondary\"\n )}\n >\n {/* 텍스트 영역 */}\n <div className=\"flex flex-1 flex-col gap-1.5 min-w-0\">\n <p className=\"text-sm font-medium tracking-tight text-foreground\">\n {title}\n </p>\n {description && (\n <p className=\"text-xs tracking-tight text-muted-foreground\">\n {description}\n </p>\n )}\n </div>\n\n {/* 라디오 인디케이터 */}\n <div\n className={cn(\n \"mt-px size-4 shrink-0 self-start rounded-full border shadow-button transition-colors\",\n isSelected ? \"border-ring\" : \"border-border bg-background\"\n )}\n >\n {isSelected && (\n <div className=\"mx-auto size-2 rounded-full bg-foreground\" style={{ marginTop: \"3px\" }} />\n )}\n </div>\n </button>\n );\n}\n\nexport { ChoiceCardGroup, ChoiceCardItem };\n","\"use client\";\n\n// ─── Collapsible ──────────────────────────────────────────────────────────────\n//\n// 피그마 노드: 73-4665\n//\n// 워크스페이스 전환용 콜랩서블 컴포넌트.\n// 트리거(아바타 + 이름 + 뱃지 + ChevronsUpDown)를 클릭하면\n// 워크스페이스 목록 드롭다운이 열린다.\n//\n// 사용 예시 (비제어):\n// <Collapsible\n// activeWorkspace={{ id: \"1\", name: \"박찬준\", badge: \"개인\", avatarText: \"박\" }}\n// workspaces={[...]}\n// onSelectWorkspace={(ws) => console.log(ws)}\n// onCreateTeam={() => {}}\n// />\n//\n// 사용 예시 (제어):\n// <Collapsible\n// activeWorkspace={...}\n// workspaces={[...]}\n// open={isOpen}\n// onOpenChange={setIsOpen}\n// />\n//\n// 기본 Radix 프리미티브가 필요한 경우:\n// import { CollapsibleRoot, CollapsibleTrigger, CollapsibleContent } from \"./collapsible\"\n\nimport * as React from \"react\";\nimport { Collapsible as CollapsiblePrimitive } from \"radix-ui\";\nimport { cn } from \"@/lib/utils\";\nimport { Icon } from \"@/components/ui/icon\";\n\n// ─── Types ───────────────────────────────────────────────────────────────────\n\nexport interface CollapsibleWorkspace {\n id: string;\n /** 워크스페이스 이름 */\n name: string;\n /** 뱃지 텍스트 (예: \"개인\", \"Enterprise\", \"Team\") */\n badge: string;\n /** 아바타에 표시할 텍스트 (미지정 시 name[0]) */\n avatarText?: string;\n /** 아바타 이미지 URL (지정 시 텍스트 대신 이미지 표시) */\n avatarSrc?: string;\n /**\n * 아바타 배경색\n * - \"sidebar-ring\" : 회색 (#6b7280) — 개인/기본\n * - \"chart-1\" : 파란색 (#3b82f6) — 팀/엔터프라이즈\n * @default \"sidebar-ring\"\n */\n avatarColor?: \"sidebar-ring\" | \"chart-1\";\n /** 현재 활성 워크스페이스 여부 (드롭다운에서 강조 + Check 표시) */\n isActive?: boolean;\n}\n\nexport interface CollapsibleProps {\n /** 트리거에 표시되는 현재 워크스페이스 */\n activeWorkspace: CollapsibleWorkspace;\n /**\n * 드롭다운에 표시할 워크스페이스 목록.\n * isActive=true인 항목이 강조(bg-accent + Check 아이콘)로 표시된다.\n */\n workspaces?: CollapsibleWorkspace[];\n /** 제어 모드: 열림 상태 */\n open?: boolean;\n /** 제어 모드: 열림 상태 변경 콜백 */\n onOpenChange?: (open: boolean) => void;\n /** 비제어 모드: 초기 열림 상태 @default false */\n defaultOpen?: boolean;\n /** \"+ 팀 생성하기\" 클릭 콜백 */\n onCreateTeam?: () => void;\n /** 워크스페이스 항목 클릭 콜백 */\n onSelectWorkspace?: (workspace: CollapsibleWorkspace) => void;\n className?: string;\n}\n\n// ─── Internal: Avatar ────────────────────────────────────────────────────────\n\n/**\n * size=\"lg\" → 36×36 rounded-lg (트리거용, Figma 기본)\n * size=\"md\" → 32×32 rounded-md (드롭다운 목록용)\n */\nfunction CollapsibleAvatar({\n workspace,\n size = \"lg\",\n}: {\n workspace: CollapsibleWorkspace;\n size?: \"lg\" | \"md\";\n}) {\n const sizeClass = size === \"lg\" ? \"size-9 rounded-lg\" : \"size-8 rounded-md\";\n const bgClass =\n workspace.avatarColor === \"chart-1\" ? \"bg-chart-1\" : \"bg-sidebar-ring\";\n\n return (\n <div\n className={cn(\n \"relative overflow-hidden shrink-0 select-none\",\n sizeClass,\n bgClass,\n )}\n >\n {workspace.avatarSrc ? (\n <img\n src={workspace.avatarSrc}\n alt={workspace.name}\n className=\"absolute inset-0 size-full object-cover\"\n />\n ) : (\n <span className=\"absolute inset-0 flex items-center justify-center text-base font-medium leading-6 text-center text-white tracking-tight whitespace-nowrap\">\n {workspace.avatarText ?? workspace.name[0]}\n </span>\n )}\n </div>\n );\n}\n\n// ─── Internal: Badge ─────────────────────────────────────────────────────────\n\nfunction CollapsibleBadge({ children }: { children: React.ReactNode }) {\n return (\n <div className=\"bg-background border border-border flex gap-1 h-5.5 items-center justify-center px-2.5 py-0.5 rounded-lg shrink-0\">\n <span className=\"text-xs font-medium leading-xs text-foreground text-center tracking-tight whitespace-nowrap\">\n {children}\n </span>\n </div>\n );\n}\n\n// ─── ChevronsUpDown Icon (Figma node 4724-41809, stroke-width: 1, size: 16×16) ─\n// inset: 16.67% 세로 / 29.17% 가로 — viewBox 0 0 9.58333 14.5833\n\nfunction ChevronsUpDownIcon({ className }: { className?: string }) {\n return (\n <div className={cn(\"overflow-hidden relative shrink-0 size-4\", className)}>\n <div className=\"absolute\" style={{ inset: \"16.67% 29.17%\" }}>\n <div className=\"absolute\" style={{ inset: \"-4.69% -7.5%\" }}>\n <img alt=\"\" aria-hidden src=\"/icons/chevrons-up-down.svg\" className=\"block max-w-none size-full\" />\n </div>\n </div>\n </div>\n );\n}\n\n// ─── Collapsible ─────────────────────────────────────────────────────────────\n\nexport function Collapsible({\n activeWorkspace,\n workspaces = [],\n open,\n onOpenChange,\n defaultOpen = false,\n onCreateTeam,\n onSelectWorkspace,\n className,\n}: CollapsibleProps) {\n const [internalOpen, setInternalOpen] = React.useState(defaultOpen);\n const isOpen = open !== undefined ? open : internalOpen;\n\n function handleOpenChange(next: boolean) {\n setInternalOpen(next);\n onOpenChange?.(next);\n }\n\n return (\n <CollapsiblePrimitive.Root\n open={isOpen}\n onOpenChange={handleOpenChange}\n className={cn(\"relative flex flex-col w-full\", className)}\n >\n {/* 외부 클릭 감지 backdrop */}\n {isOpen && (\n <div\n className=\"fixed inset-0 z-10\"\n onClick={() => handleOpenChange(false)}\n />\n )}\n {/* ── Trigger ─────────────────────────────────────────────── */}\n <CollapsiblePrimitive.Trigger asChild>\n <button\n className={cn(\n \"flex items-center justify-between pl-2 py-2 w-full rounded-md\",\n \"cursor-pointer transition-colors hover:bg-sidebar-accent\",\n \"data-[state=open]:bg-sidebar-accent\",\n )}\n >\n {/* 아바타 + 이름 + 뱃지 */}\n <div className=\"flex flex-1 gap-2 items-center min-w-0\">\n <CollapsibleAvatar workspace={activeWorkspace} size=\"lg\" />\n <div className=\"flex gap-1 items-center min-w-0 shrink-0\">\n <span className=\"text-base font-medium leading-6 text-foreground tracking-tight whitespace-nowrap\">\n {activeWorkspace.name}\n </span>\n <CollapsibleBadge>{activeWorkspace.badge}</CollapsibleBadge>\n </div>\n </div>\n {/* ChevronsUpDown — Figma: 32×32 button, 16×16 icon, stroke-width: 1 */}\n <div className=\"flex items-center justify-center rounded-lg shrink-0 size-8\">\n <ChevronsUpDownIcon />\n </div>\n </button>\n </CollapsiblePrimitive.Trigger>\n\n {/* ── Dropdown Panel ──────────────────────────────────────── */}\n {/* z-20으로 아래 콘텐츠를 오버레이, w-80 = 320px (Figma 스펙) */}\n <CollapsiblePrimitive.Content className={cn(\n \"absolute left-0 top-full z-20 pt-1 w-80\",\n \"data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 duration-200\",\n \"data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=closed]:duration-150\",\n )}>\n <div className=\"bg-background border border-border rounded-xl shadow-sm px-2 py-2 flex flex-col gap-1\">\n\n {workspaces.map((ws) =>\n ws.isActive ? (\n /* ── 활성 워크스페이스 (강조 + Check 아이콘) ── */\n <div\n key={ws.id}\n className=\"flex items-center justify-between h-12 px-2 py-2 rounded-md bg-accent\"\n >\n {/* 아바타 + 이름 + 뱃지 */}\n <div className=\"flex gap-2 items-center\">\n <CollapsibleAvatar workspace={ws} size=\"md\" />\n <div className=\"flex gap-1 items-center\">\n <span className=\"text-sm text-foreground leading-5 tracking-tight whitespace-nowrap\">\n {ws.name}\n </span>\n <CollapsibleBadge>{ws.badge}</CollapsibleBadge>\n </div>\n </div>\n {/* Check 아이콘 */}\n <div className=\"flex items-center justify-center size-9 shrink-0\">\n <Icon name=\"check\" className=\"size-4 text-foreground\" />\n </div>\n </div>\n ) : (\n /* ── 비활성 워크스페이스 (클릭 가능) ── */\n <button\n key={ws.id}\n className=\"flex items-center w-full h-12 px-2 py-2 rounded-md hover:bg-accent transition-colors cursor-pointer\"\n onClick={() => onSelectWorkspace?.(ws)}\n >\n <div className=\"flex gap-2 items-center\">\n <CollapsibleAvatar workspace={ws} size=\"md\" />\n <div className=\"flex gap-1 items-center\">\n <span className=\"text-sm text-foreground leading-5 tracking-tight whitespace-nowrap\">\n {ws.name}\n </span>\n <CollapsibleBadge>{ws.badge}</CollapsibleBadge>\n </div>\n </div>\n </button>\n ),\n )}\n\n {/* ── \"+ 팀 생성하기\" ── */}\n <button\n className=\"flex items-center justify-center gap-2 w-full h-12 px-2 py-2 rounded-md hover:bg-accent transition-colors cursor-pointer\"\n onClick={onCreateTeam}\n >\n <Icon name=\"plus\" className=\"size-4 text-muted-foreground\" />\n <span className=\"text-sm text-muted-foreground leading-5 tracking-tight whitespace-nowrap\">\n 팀 생성하기\n </span>\n </button>\n </div>\n </CollapsiblePrimitive.Content>\n </CollapsiblePrimitive.Root>\n );\n}\n\n// ─── Re-export Radix primitives ───────────────────────────────────────────────\n// 완전한 커스텀 콘텐츠가 필요한 경우 이 프리미티브를 직접 사용한다.\n\nexport const CollapsibleRoot = CollapsiblePrimitive.Root;\nexport const CollapsibleTrigger = CollapsiblePrimitive.CollapsibleTrigger;\nexport const CollapsibleContent = CollapsiblePrimitive.CollapsibleContent;\n","\"use client\";\n\nimport * as React from \"react\";\nimport { Popover as PopoverPrimitive } from \"radix-ui\";\n\nimport { cn } from \"@/lib/utils\";\nimport { Icon } from \"@/components/ui/icon\";\nimport { ChevronsUpDownIcon } from \"@/components/icons/custom/chevrons-up-down\";\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport interface ComboboxOption {\n /** Unique identifier for the option */\n value: string;\n /** Display text shown in the list and trigger */\n label: string;\n /** Optional icon rendered before the label (16×16) */\n icon?: React.ReactNode;\n}\n\nexport interface ComboboxProps {\n /** List of selectable options */\n options: ComboboxOption[];\n /** Controlled selected value */\n value?: string;\n /** Callback when selection changes */\n onValueChange?: (value: string) => void;\n /** Placeholder text shown when no value is selected */\n placeholder?: string;\n /** Placeholder inside the search input */\n searchPlaceholder?: string;\n /** Whether to show the search input (default: false) */\n showSearch?: boolean;\n /** Optional footer action at the bottom (e.g. \"+ 새 컬렉션 만들기\") */\n footer?: { label: string; onClick: () => void };\n /** Additional className for the trigger button */\n className?: string;\n /** Disable the combobox */\n disabled?: boolean;\n}\n\n// ─── Combobox ─────────────────────────────────────────────────────────────────\n// Figma nodes: 3580-11925 (combobox examples), 3824-7499 (usage in page)\n//\n// Trigger: h-9, w-full, border, rounded-[--radius-md], px-3 py-2, gap-2\n// selected → font-medium text-foreground\n// empty → font-normal text-muted-foreground\n// Dropdown: w-[var(--radix-popover-trigger-width)], border, rounded-[--radius-md],\n// shadow-md (0,4,6 + 0,2,4), bg-popover\n// Search: border-b, px-3, gap-2, Search 16px + input py-2\n// Items: p-1 wrapper; each item px-2 py-1.5 gap-2 rounded-sm\n// Active: bg-accent text-accent-foreground + Check icon right\n// Footer: Plus icon + label, text-muted-foreground\n\nexport function Combobox({\n options,\n value,\n onValueChange,\n placeholder = \"선택해 주세요\",\n searchPlaceholder = \"검색해 보세요\",\n showSearch = false,\n footer,\n className,\n disabled = false,\n}: ComboboxProps) {\n const [open, setOpen] = React.useState(false);\n const [search, setSearch] = React.useState(\"\");\n const inputRef = React.useRef<HTMLInputElement>(null);\n\n // Filter options by search query (only when showSearch is true)\n const filtered = React.useMemo(\n () =>\n showSearch && search.trim()\n ? options.filter((opt) =>\n opt.label.toLowerCase().includes(search.toLowerCase()),\n )\n : options,\n [options, search, showSearch],\n );\n\n const selectedOption = options.find((opt) => opt.value === value);\n\n function handleOpenChange(next: boolean) {\n setOpen(next);\n if (!next) setSearch(\"\");\n }\n\n React.useEffect(() => {\n if (open && showSearch) {\n requestAnimationFrame(() => inputRef.current?.focus());\n }\n }, [open, showSearch]);\n\n function handleSelect(optionValue: string) {\n onValueChange?.(optionValue === value ? \"\" : optionValue);\n setOpen(false);\n setSearch(\"\");\n }\n\n return (\n <PopoverPrimitive.Root open={open} onOpenChange={handleOpenChange}>\n {/* ── Trigger ─────────────────────────────────────────────────────── */}\n <PopoverPrimitive.Trigger asChild>\n <button\n type=\"button\"\n role=\"combobox\"\n aria-expanded={open}\n disabled={disabled}\n className={cn(\n \"flex h-9 w-full items-center justify-between rounded-md border border-border bg-background px-3 py-2\",\n \"cursor-pointer transition-colors hover:bg-accent\",\n \"focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n className,\n )}\n >\n {/* Icon + Label */}\n <span className=\"flex flex-1 min-w-0 items-center gap-1.5\">\n {selectedOption?.icon && (\n <span className=\"shrink-0 flex items-center\">\n {selectedOption.icon}\n </span>\n )}\n <span\n className={cn(\n \"flex-1 min-w-0 truncate text-left text-sm leading-5 tracking-tight\",\n selectedOption\n ? \"font-medium text-foreground\"\n : \"font-normal text-muted-foreground\",\n )}\n >\n {selectedOption ? selectedOption.label : placeholder}\n </span>\n </span>\n {/* Chevrons */}\n <ChevronsUpDownIcon className=\"size-4 text-muted-foreground\" />\n </button>\n </PopoverPrimitive.Trigger>\n\n {/* ── Dropdown ────────────────────────────────────────────────────── */}\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n align=\"start\"\n sideOffset={4}\n style={{ width: \"var(--radix-popover-trigger-width)\" }}\n className={cn(\n \"z-50 overflow-hidden rounded-md border border-border bg-popover\",\n \"shadow-dropdown\",\n \"data-[state=open]:animate-in data-[state=closed]:animate-out\",\n \"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n \"data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95\",\n \"duration-200 data-[state=closed]:duration-150\",\n )}\n >\n {/* Optional search row */}\n {showSearch && (\n <div className=\"flex items-center gap-2 border-b border-border px-3\">\n <Icon name=\"search\" className=\"size-4 text-muted-foreground\" />\n <input\n ref={inputRef}\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder={searchPlaceholder}\n className=\"flex-1 min-w-0 py-2 bg-transparent outline-none text-sm font-normal leading-5 tracking-tight text-foreground placeholder:text-muted-foreground\"\n />\n </div>\n )}\n\n {/* Options list */}\n <div className=\"p-1 flex flex-col overflow-y-auto\" style={{ maxHeight: 384 }}>\n {filtered.length === 0 ? (\n <p className=\"px-2 py-1.5 text-sm text-muted-foreground text-center\">\n 결과 없음\n </p>\n ) : (\n filtered.map((opt) => {\n const isSelected = opt.value === value;\n return (\n <button\n key={opt.value}\n type=\"button\"\n onClick={() => handleSelect(opt.value)}\n className={cn(\n \"flex w-full items-center gap-2 rounded-sm px-2 py-1.5\",\n \"text-sm font-normal leading-5 tracking-tight\",\n \"cursor-pointer transition-colors\",\n isSelected\n ? \"bg-accent text-accent-foreground\"\n : \"text-popover-foreground hover:bg-accent hover:text-accent-foreground\",\n )}\n >\n {opt.icon && (\n <span className=\"shrink-0 flex items-center\">\n {opt.icon}\n </span>\n )}\n <span className=\"flex-1 min-w-0 truncate text-left\">\n {opt.label}\n </span>\n {isSelected && <Icon name=\"check\" className=\"size-4 text-foreground\" />}\n </button>\n );\n })\n )}\n\n {/* Optional footer action */}\n {footer && (\n <button\n type=\"button\"\n onClick={() => {\n footer.onClick();\n setOpen(false);\n }}\n className=\"flex w-full items-center gap-2 rounded-sm px-2 py-1.5 text-sm font-normal leading-5 tracking-tight text-muted-foreground hover:bg-accent hover:text-accent-foreground cursor-pointer transition-colors\"\n >\n <Icon name=\"plus\" className=\"size-4 text-muted-foreground\" />\n <span className=\"flex-1 min-w-0 truncate text-left\">\n {footer.label}\n </span>\n </button>\n )}\n </div>\n </PopoverPrimitive.Content>\n </PopoverPrimitive.Portal>\n </PopoverPrimitive.Root>\n );\n}\n","import { cn } from \"@/lib/utils\";\n\ninterface ChevronsUpDownIconProps {\n className?: string;\n}\n\n/**\n * Chevrons-up-down icon — SVG downloaded directly from Figma design system.\n * Uses stroke=\"currentColor\" for CSS color control.\n * Source: figma.com/design/bNKDIZZAm8ByouCPBnlEye node 128:607 (lucide/chevrons-up-down)\n */\nexport function ChevronsUpDownIcon({ className }: ChevronsUpDownIconProps) {\n return (\n <svg\n viewBox=\"-6.25 -3.25 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n aria-hidden\n className={cn(\"shrink-0\", className)}\n >\n <path d=\"M0.75 11.75L5.75 16.75L10.75 11.75M0.75 5.75L5.75 0.75L10.75 5.75\" />\n </svg>\n );\n}\n","import React from \"react\";\nimport { cn } from \"@/lib/utils\";\n\n// ─── FieldLabel ───────────────────────────────────────────────────────────────\n// text-sm font-medium — 필드 레이블 (foreground)\n\nfunction FieldLabel({\n className,\n ...props\n}: React.ComponentPropsWithoutRef<\"label\">) {\n return (\n <label\n className={cn(\n \"text-sm font-medium tracking-tight text-foreground\",\n className\n )}\n {...props}\n />\n );\n}\n\n// ─── FieldDescription ─────────────────────────────────────────────────────────\n// text-sm regular — 보조 설명 (muted-foreground)\n\nfunction FieldDescription({\n className,\n ...props\n}: React.ComponentPropsWithoutRef<\"p\">) {\n return (\n <p\n className={cn(\n \"text-sm tracking-tight text-muted-foreground\",\n className\n )}\n {...props}\n />\n );\n}\n\n// ─── Field ────────────────────────────────────────────────────────────────────\n// 세로 스택: label → [hint] → children(control) → [description]\n//\n// hint : 컨트롤 위에 표시되는 보조 텍스트 (선택)\n// description : 컨트롤 아래에 표시되는 헬퍼 텍스트 (선택)\n\nexport interface FieldProps {\n /** 필드 레이블 */\n label?: string;\n /** 컨트롤 위 보조 텍스트 */\n hint?: string;\n /** 컨트롤 아래 헬퍼 텍스트 */\n description?: string;\n /** label 의 htmlFor — input id 와 연결 */\n htmlFor?: string;\n /** 필수 항목 표시 * */\n required?: boolean;\n className?: string;\n children: React.ReactNode;\n}\n\nfunction Field({\n label,\n hint,\n description,\n htmlFor,\n required,\n className,\n children,\n}: FieldProps) {\n return (\n <div className={cn(\"flex flex-col gap-3\", className)}>\n {label && (\n <FieldLabel htmlFor={htmlFor}>\n {label}\n {required && (\n <span className=\"ml-0.5 text-destructive\" aria-hidden>\n *\n </span>\n )}\n </FieldLabel>\n )}\n {hint && <FieldDescription>{hint}</FieldDescription>}\n {children}\n {description && <FieldDescription>{description}</FieldDescription>}\n </div>\n );\n}\n\n// ─── FieldSection ─────────────────────────────────────────────────────────────\n// 섹션 헤딩 + 설명 + (선택) 구분선 + 하위 필드\n//\n// titleSize : \"base\"(16px) | \"sm\"(14px) — Figma 에서 두 크기 모두 사용됨\n\nexport interface FieldSectionProps {\n title: string;\n description?: string;\n /** 섹션 헤더 하단 구분선 표시 여부 */\n showDivider?: boolean;\n /** 헤딩 텍스트 크기: \"base\"=16px (기본), \"sm\"=14px */\n titleSize?: \"base\" | \"sm\";\n className?: string;\n children?: React.ReactNode;\n}\n\nfunction FieldSection({\n title,\n description,\n showDivider = false,\n titleSize = \"base\",\n className,\n children,\n}: FieldSectionProps) {\n return (\n <div className={cn(\"flex flex-col gap-6\", className)}>\n {/* 헤딩 블록 */}\n <div className=\"flex flex-col\">\n <p\n className={cn(\n \"pb-3 font-medium tracking-tight text-foreground\",\n titleSize === \"base\" ? \"text-base\" : \"text-sm\"\n )}\n >\n {title}\n </p>\n {description && <FieldDescription>{description}</FieldDescription>}\n </div>\n\n {/* 구분선 + 하위 필드 */}\n {children && (\n <>\n {showDivider && <FieldDivider />}\n <div className=\"flex flex-col gap-7\">{children}</div>\n </>\n )}\n </div>\n );\n}\n\n// ─── FieldRow ─────────────────────────────────────────────────────────────────\n// 가로 레이아웃: [레이블 + 설명] (flex-1) | [컨트롤] (shrink-0)\n// Figma \"Responsive Layout\" 패턴 — 폼 섹션에서 레이블을 왼쪽에 고정\n\nexport interface FieldRowProps {\n label: string;\n description?: string;\n className?: string;\n children: React.ReactNode;\n}\n\nfunction FieldRow({ label, description, className, children }: FieldRowProps) {\n return (\n <div className={cn(\"flex items-start gap-3\", className)}>\n {/* 레이블 영역 */}\n <div className=\"flex flex-1 flex-col gap-1.5\">\n <p className=\"text-sm font-medium tracking-tight text-foreground\">\n {label}\n </p>\n {description && <FieldDescription>{description}</FieldDescription>}\n </div>\n\n {/* 컨트롤 영역 */}\n <div className=\"shrink-0\">{children}</div>\n </div>\n );\n}\n\n// ─── FieldDivider ─────────────────────────────────────────────────────────────\n// 섹션 간 구분선 — border-border 1px 가로선\n\nfunction FieldDivider({ className }: { className?: string }) {\n return (\n <div className={cn(\"flex h-5 items-center\", className)}>\n <div className=\"h-px w-full border-t border-border\" />\n </div>\n );\n}\n\nexport { Field, FieldSection, FieldRow, FieldDivider };\n","'use client';\n\nimport * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport { cn } from '@/lib/utils';\nimport { Icon } from '@/components/ui/icon';\n\n// ── Types ──────────────────────────────────────────────────────────────────────\n\nexport type ModelItem = { id: string; apiId: string; name: string };\nexport type ModelGroup = {\n id: string;\n provider: string;\n iconSrc: string;\n models: ModelItem[];\n};\n\n// Thumb height (h-24 = 96px), top/bottom padding (py-3 = 12px)\nconst THUMB_H = 96;\nconst TRACK_PADDING = 12;\nconst DROPDOWN_H = 384;\nconst MAX_THUMB_OFFSET = DROPDOWN_H - TRACK_PADDING * 2 - THUMB_H; // 264\n\n/** 그룹 헤더(아이콘+이름)와 커스텀 스크롤바를 가진 그룹형 셀렉트\n * @param groups 표시할 그룹 목록 — 소비 측에서 데이터를 주입합니다.\n * @param readOnly true이면 chevron 없이 선택값만 muted-foreground로 표시 (드롭다운 비활성)\n * @param onModelChange 항목 선택 시 호출 — 선택된 항목의 apiId 전달 */\nexport function GroupedSelect({\n groups,\n readOnly = false,\n defaultItemId,\n onChange,\n}: {\n groups: ModelGroup[];\n readOnly?: boolean;\n defaultItemId?: string;\n onChange?: (apiId: string) => void;\n}) {\n const resolveIdFromApiId = (apiId?: string) => {\n const fallback = groups[0]?.models[0]?.id ?? '';\n if (!apiId) return fallback;\n const found = groups\n .flatMap((g) => g.models)\n .find((m) => m.apiId === apiId);\n return found?.id ?? fallback;\n };\n\n const [isOpen, setIsOpen] = React.useState(false);\n const [selectedId, setSelectedId] = React.useState(() =>\n resolveIdFromApiId(defaultItemId),\n );\n const [thumbTopPct, setThumbTopPct] = React.useState(0);\n const [portalPos, setPortalPos] = React.useState<{\n top: number;\n left: number;\n } | null>(null);\n\n const containerRef = React.useRef<HTMLDivElement>(null);\n const triggerRef = React.useRef<HTMLButtonElement>(null);\n const scrollRef = React.useRef<HTMLDivElement>(null);\n const dropdownRef = React.useRef<HTMLDivElement>(null);\n\n // Close on outside click\n React.useEffect(() => {\n if (!isOpen) return;\n const handleClick = (e: MouseEvent) => {\n if (\n containerRef.current &&\n !containerRef.current.contains(e.target as Node) &&\n dropdownRef.current &&\n !dropdownRef.current.contains(e.target as Node)\n ) {\n setIsOpen(false);\n }\n };\n document.addEventListener('mousedown', handleClick);\n return () => document.removeEventListener('mousedown', handleClick);\n }, [isOpen]);\n\n // Sync scrollbar thumb to scroll position\n const updateThumb = React.useCallback(() => {\n const el = scrollRef.current;\n if (!el) return;\n const maxScroll = el.scrollHeight - el.clientHeight;\n setThumbTopPct(maxScroll > 0 ? el.scrollTop / maxScroll : 0);\n }, []);\n\n React.useEffect(() => {\n if (!isOpen) return;\n const el = scrollRef.current;\n if (!el) return;\n el.addEventListener('scroll', updateThumb, { passive: true });\n updateThumb();\n return () => el.removeEventListener('scroll', updateThumb);\n }, [isOpen, updateThumb]);\n\n // Resolve selected model info\n const selectedEntry = groups\n .flatMap((g) => g.models.map((m) => ({ ...m, group: g })))\n .find((m) => m.id === selectedId);\n const selectedIconSrc = selectedEntry?.group.iconSrc ?? '';\n const selectedName = selectedEntry?.name ?? '';\n\n const thumbTop = Math.round(TRACK_PADDING + thumbTopPct * MAX_THUMB_OFFSET);\n\n return (\n <div ref={containerRef} className='relative shrink-0'>\n {/* Trigger */}\n <button\n ref={triggerRef}\n type='button'\n onClick={() => {\n if (readOnly) return;\n if (!isOpen) {\n const btn = triggerRef.current;\n if (btn) {\n const rect = btn.getBoundingClientRect();\n const spaceBelow = window.innerHeight - rect.bottom;\n const up = spaceBelow < DROPDOWN_H;\n setPortalPos({\n top: up ? rect.top - DROPDOWN_H - 4 : rect.bottom + 4,\n left: rect.left,\n });\n }\n }\n setIsOpen((v) => !v);\n }}\n className={cn(\n 'flex items-center px-3 py-1.5 rounded-lg transition-colors',\n readOnly\n ? 'w-50 cursor-default'\n : cn(\n 'justify-between w-50 cursor-pointer',\n isOpen ? 'bg-accent' : 'bg-background hover:bg-accent',\n ),\n )}\n aria-expanded={readOnly ? undefined : isOpen}\n aria-haspopup={readOnly ? undefined : 'listbox'}\n tabIndex={readOnly ? -1 : 0}\n >\n <span className='flex flex-1 items-center min-w-0'>\n <span className='flex flex-1 items-center gap-1.5 min-w-0'>\n <span className='relative shrink-0 size-5'>\n {/* eslint-disable-next-line @next/next/no-img-element */}\n <img\n src={selectedIconSrc}\n alt=''\n aria-hidden\n className='absolute inset-0 size-full object-contain'\n />\n </span>\n <span\n className={cn(\n 'flex-1 min-w-0 text-sm leading-5 tracking-tight overflow-hidden text-ellipsis whitespace-nowrap text-left',\n readOnly ? 'text-muted-foreground' : 'text-foreground',\n )}\n >\n {selectedName}\n </span>\n </span>\n </span>\n {!readOnly && (\n <span className='flex items-center justify-end shrink-0'>\n <Icon\n name='chevron-down'\n className={cn(\n 'size-4 text-foreground transition-transform duration-200',\n isOpen && 'rotate-180',\n )}\n />\n </span>\n )}\n </button>\n\n {/* Dropdown panel — rendered via portal to escape overflow clipping */}\n {!readOnly &&\n isOpen &&\n portalPos &&\n createPortal(\n <div\n ref={dropdownRef}\n className='fixed w-50 bg-popover border border-border rounded-md shadow-md z-50 flex overflow-hidden'\n style={{\n height: `${DROPDOWN_H}px`,\n top: portalPos.top,\n left: portalPos.left,\n }}\n role='listbox'\n >\n {/* Scrollable list */}\n <div\n ref={scrollRef}\n className='flex-1 min-w-0 overflow-y-auto [&::-webkit-scrollbar]:hidden [scrollbar-width:none]'\n >\n {groups.map((group) => (\n <div key={group.id} className='flex flex-col p-1'>\n <div className='flex items-center gap-1.5 px-2 py-1.5 rounded-sm'>\n {/* eslint-disable-next-line @next/next/no-img-element */}\n <img\n src={group.iconSrc}\n alt=''\n aria-hidden\n className='size-5 shrink-0 object-contain'\n />\n <span className='text-xs leading-xs tracking-tight text-muted-foreground'>\n {group.provider}\n </span>\n </div>\n {group.models.map((model) => {\n const isSelected = model.id === selectedId;\n return (\n <button\n key={model.id}\n type='button'\n role='option'\n aria-selected={isSelected}\n onClick={() => {\n setSelectedId(model.id);\n onChange?.(model.apiId);\n setIsOpen(false);\n }}\n className={cn(\n 'flex items-center justify-between py-1.5 pl-2 rounded-sm w-full text-left cursor-pointer transition-colors hover:bg-accent',\n isSelected ? 'bg-accent pr-2' : 'pr-8',\n )}\n >\n <span className='flex-1 min-w-0 text-sm leading-5 tracking-tight text-foreground overflow-hidden text-ellipsis whitespace-nowrap'>\n {model.name}\n </span>\n {isSelected && (\n <Icon\n name='check'\n className='size-4 text-foreground'\n />\n )}\n </button>\n );\n })}\n </div>\n ))}\n </div>\n\n {/* Custom scrollbar track */}\n <div className='relative w-1.5 shrink-0'>\n <div\n className='absolute left-0 w-1.5 bg-gray-300 rounded-full'\n style={{ height: `${THUMB_H}px`, top: `${thumbTop}px` }}\n />\n </div>\n </div>,\n document.body,\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { DropdownMenu, Popover } from \"radix-ui\";\nimport { cn } from \"@/lib/utils\";\nimport { Icon } from \"@/components/ui/icon\";\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport interface NavDropdownItem {\n label: string;\n icon?: string;\n href?: string;\n onClick?: () => void;\n}\n\nexport interface HeaderNavItem {\n label: string;\n href?: string;\n active?: boolean;\n onClick?: () => void;\n /** 하위 드롭다운 아이템이 있으면 클릭 시 드롭다운 오픈 */\n dropdownItems?: NavDropdownItem[];\n}\n\nexport interface UserMenuSectionItem {\n label: string;\n icon?: string;\n href?: string;\n onClick?: () => void;\n variant?: \"default\" | \"destructive\";\n}\n\nexport interface UserMenuSection {\n /** 섹션 헤더 레이블 (생략 시 레이블 없음) */\n label?: string;\n items: UserMenuSectionItem[];\n}\n\nexport interface NotificationItem {\n id: string;\n badge?: string;\n date?: string;\n title: string;\n description: string;\n highlighted?: boolean; // bg-secondary 강조\n}\n\nexport interface LanguageItem {\n code: string;\n label: string;\n /** 국기 이모지 */\n flag: string;\n}\n\nexport interface HeaderProps {\n logo?: React.ReactNode;\n brandName?: string;\n navItems?: HeaderNavItem[];\n upgradeLabel?: string;\n onUpgrade?: () => void;\n userEmail?: string;\n userMenuSections?: UserMenuSection[];\n notifications?: NotificationItem[];\n onViewAllNotifications?: () => void;\n hasNotification?: boolean;\n languages?: LanguageItem[];\n currentLanguage?: string;\n onLanguageChange?: (code: string) => void;\n className?: string;\n}\n\n\n// ─── Shared dropdown panel styles ─────────────────────────────────────────────\n// Figma: bg-popover, border, rounded-md, shadow-dropdown, max-h-416px\n\nconst PANEL_CLS =\n \"z-50 overflow-hidden rounded-md border border-border bg-popover shadow-dropdown\" +\n \" animate-in fade-in-0 zoom-in-95 duration-200\" +\n \" data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=closed]:duration-150\";\n\n// ─── DropdownSectionLabel ─────────────────────────────────────────────────────\n// Figma: h-8, px-2, py-1.5, text-sm/Medium, popover-foreground\n\nfunction DropdownSectionLabel({ children }: { children: React.ReactNode }) {\n return (\n <div className=\"flex h-8 items-center px-2 py-1.5\">\n <span className=\"text-sm font-medium tracking-tight text-popover-foreground\">\n {children}\n </span>\n </div>\n );\n}\n\n// ─── DropdownMenuRow ──────────────────────────────────────────────────────────\n// Figma: px-2, py-1.5, rounded-sm, gap-2.5, text-sm/Regular\n\ninterface DropdownMenuRowProps {\n icon?: string;\n children: React.ReactNode;\n variant?: \"default\" | \"destructive\";\n href?: string;\n onSelect?: () => void;\n className?: string;\n}\n\nfunction DropdownMenuRow({\n icon,\n children,\n variant = \"default\",\n href,\n onSelect,\n className,\n}: DropdownMenuRowProps) {\n const itemClassName = cn(\n \"flex cursor-pointer select-none items-center gap-2.5 rounded-sm px-2 py-1.5 outline-none\",\n \"text-sm font-normal tracking-tight\",\n \"transition-colors focus:bg-accent data-[highlighted]:bg-accent\",\n variant === \"destructive\"\n ? \"text-destructive\"\n : \"text-popover-foreground\",\n className,\n );\n const content = (\n <>\n {icon && <Icon name={icon} className=\"size-4 text-foreground\" />}\n {children}\n </>\n );\n if (href) {\n return (\n <DropdownMenu.Item asChild onSelect={onSelect}>\n <a href={href} target=\"_blank\" rel=\"noopener noreferrer\" className={itemClassName}>\n {content}\n </a>\n </DropdownMenu.Item>\n );\n }\n return (\n <DropdownMenu.Item onSelect={onSelect} className={itemClassName}>\n {content}\n </DropdownMenu.Item>\n );\n}\n\n// ─── Header ───────────────────────────────────────────────────────────────────\n// Figma node 4679-24453 + dropdown cases 4679-25199\n\nexport function Header({\n logo,\n brandName = \"\",\n navItems = [],\n upgradeLabel = \"\",\n onUpgrade,\n userEmail = \"\",\n userMenuSections = [],\n notifications = [],\n onViewAllNotifications,\n hasNotification = false,\n languages = [],\n currentLanguage = \"\",\n onLanguageChange,\n className,\n}: HeaderProps) {\n return (\n <header\n className={cn(\n \"flex w-full items-center justify-between px-6 py-4 shrink-0\",\n \"bg-background border-b border-border z-10\",\n className,\n )}\n >\n {/* ── Left: 로고 + 브랜드명 + 네비게이션 ───────────────────────────── */}\n <div className=\"flex items-center gap-4\">\n {(logo || brandName) && (\n <div className=\"flex items-center gap-2.5 shrink-0\">\n {logo}\n {brandName && (\n <span className=\"text-xl font-bold tracking-tight text-foreground whitespace-nowrap\">\n {brandName}\n </span>\n )}\n </div>\n )}\n\n <nav className=\"flex items-center gap-2\" aria-label=\"주요 메뉴\">\n {navItems.map((item) =>\n item.dropdownItems?.length ? (\n // 드롭다운이 있는 nav 아이템 (예: 스토어)\n <DropdownMenu.Root key={item.label}>\n <DropdownMenu.Trigger\n className={cn(\n \"flex h-9 items-center justify-center rounded-lg px-3 py-2 outline-none\",\n \"text-sm font-medium tracking-tight whitespace-nowrap transition-colors\",\n item.active\n ? \"bg-blue-50 text-blue-800\"\n : \"text-muted-foreground hover:bg-muted/60 hover:text-foreground\",\n // 드롭다운 열린 상태 — bg-accent\n \"data-[state=open]:bg-accent data-[state=open]:text-foreground\",\n )}\n >\n {item.label}\n </DropdownMenu.Trigger>\n <DropdownMenu.Portal>\n <DropdownMenu.Content\n align=\"start\"\n sideOffset={4}\n className={cn(PANEL_CLS, \"w-50 py-1 px-1\")}\n style={{ maxHeight: \"416px\" }}\n >\n {/* 섹션 레이블 */}\n <DropdownMenu.Label asChild>\n <DropdownSectionLabel>{item.label}</DropdownSectionLabel>\n </DropdownMenu.Label>\n {item.dropdownItems.map((di) => (\n <DropdownMenuRow\n key={di.label}\n icon={di.icon}\n href={di.href}\n onSelect={di.onClick}\n >\n {di.label}\n </DropdownMenuRow>\n ))}\n </DropdownMenu.Content>\n </DropdownMenu.Portal>\n </DropdownMenu.Root>\n ) : (\n // 일반 nav 아이템\n <button\n key={item.label}\n type=\"button\"\n onClick={item.onClick}\n className={cn(\n \"flex h-9 items-center justify-center rounded-lg px-3 py-2\",\n \"text-sm font-medium tracking-tight whitespace-nowrap transition-colors\",\n item.active\n ? \"bg-blue-50 text-blue-800\"\n : \"text-muted-foreground hover:bg-muted/60 hover:text-foreground\",\n )}\n >\n {item.label}\n </button>\n ),\n )}\n </nav>\n </div>\n\n {/* ── Right: CTA + 유저 + Bell + Globe ───────────────────────────────── */}\n <div className=\"flex items-center gap-2\">\n\n {/* CTA 버튼 */}\n <button\n type=\"button\"\n onClick={onUpgrade}\n className={cn(\n \"flex h-9 items-center gap-1.5 rounded-lg px-4 py-2 shrink-0\",\n \"bg-primary text-primary-foreground shadow-button\",\n \"text-sm font-medium tracking-tight whitespace-nowrap\",\n \"transition-opacity hover:opacity-90 active:opacity-80\",\n )}\n >\n <Icon name=\"circle-arrow-up\" className=\"size-4 text-primary-foreground\" />\n {upgradeLabel}\n </button>\n\n {/* ── 유저 드롭다운 ─────────────────────────────────────────────── */}\n <DropdownMenu.Root>\n <DropdownMenu.Trigger\n className={cn(\n \"flex h-9 items-center gap-1.5 rounded-lg border border-border bg-background\",\n \"pl-4 pr-3 py-2 shrink-0 outline-none\",\n \"text-sm font-normal tracking-tight text-foreground whitespace-nowrap\",\n \"transition-colors hover:bg-muted/60\",\n \"data-[state=open]:bg-accent\",\n )}\n >\n <Icon name=\"user\" className=\"size-4 text-foreground\" />\n <span>{userEmail}</span>\n <Icon name=\"chevron-down\" className=\"size-4 text-foreground\" />\n </DropdownMenu.Trigger>\n <DropdownMenu.Portal>\n <DropdownMenu.Content\n align=\"end\"\n sideOffset={4}\n className={cn(\n PANEL_CLS,\n )}\n style={{ minWidth: \"var(--radix-dropdown-menu-trigger-width)\", maxHeight: \"416px\" }}\n >\n {userMenuSections.map((section, si) => (\n <React.Fragment key={si}>\n {/* 섹션 간 구분선 */}\n {si > 0 && (\n <DropdownMenu.Separator className=\"my-1 h-px bg-border mx-1\" />\n )}\n <DropdownMenu.Group className=\"py-1 px-1\">\n {section.label && (\n <DropdownMenu.Label asChild>\n <DropdownSectionLabel>{section.label}</DropdownSectionLabel>\n </DropdownMenu.Label>\n )}\n {section.items.map((item) => (\n <DropdownMenuRow\n key={item.label}\n icon={item.icon}\n variant={item.variant}\n onSelect={item.onClick}\n >\n {item.label}\n </DropdownMenuRow>\n ))}\n </DropdownMenu.Group>\n </React.Fragment>\n ))}\n </DropdownMenu.Content>\n </DropdownMenu.Portal>\n </DropdownMenu.Root>\n\n {/* ── Bell 알림 다이얼로그 (Popover) ───────────────────────────── */}\n <Popover.Root>\n <Popover.Trigger asChild>\n <button\n type=\"button\"\n aria-label=\"알림\"\n className={cn(\n \"relative flex size-9 items-center justify-center rounded-lg shrink-0 outline-none\",\n \"border border-border bg-background\",\n \"transition-colors hover:bg-muted/60\",\n // 열린 상태\n \"data-[state=open]:bg-accent\",\n )}\n >\n <Icon name=\"bell\" className=\"size-4 text-foreground\" />\n {hasNotification && (\n <span\n aria-hidden\n className=\"absolute size-1.5 rounded-full bg-destructive\"\n style={{ right: \"5px\", top: \"5px\" }}\n />\n )}\n </button>\n </Popover.Trigger>\n <Popover.Portal>\n <Popover.Content\n align=\"end\"\n sideOffset={4}\n className={cn(\n \"z-50 w-423 rounded-lg border border-border bg-background p-6\",\n \"shadow-dropdown\",\n \"animate-in fade-in-0 zoom-in-95 duration-200\",\n \"data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=closed]:duration-150\",\n )}\n >\n {/* 헤더 */}\n <div className=\"mb-4 flex items-center justify-between\">\n <h3 className=\"text-lg font-semibold tracking-tight text-foreground\">\n 서비스 업데이트\n </h3>\n <Popover.Close\n aria-label=\"닫기\"\n className=\"opacity-70 hover:opacity-100 transition-opacity\"\n >\n <Icon name=\"x\" className=\"size-4 text-foreground\" />\n </Popover.Close>\n </div>\n\n {/* 알림 목록 */}\n <div className=\"flex flex-col\">\n {notifications.map((n, i) => (\n <React.Fragment key={n.id}>\n {i > 0 && (\n <div className=\"flex h-6 items-center\">\n <hr className=\"w-full border-border\" />\n </div>\n )}\n <div\n className=\"flex flex-col gap-4 rounded-md p-3 cursor-pointer transition-colors hover:bg-secondary\"\n >\n {/* 배지 + 날짜 */}\n <div className=\"flex items-center justify-between\">\n {n.badge && (\n <span className=\"inline-flex h-5.5 items-center rounded-lg bg-amber-50 px-2.5 py-0.5 text-xs font-medium tracking-tight text-amber-700 whitespace-nowrap\">\n {n.badge}\n </span>\n )}\n {n.date && (\n <span className=\"text-sm font-normal tracking-tight text-muted-foreground\">\n {n.date}\n </span>\n )}\n </div>\n {/* 제목 + 설명 */}\n <div className=\"flex flex-col gap-1\">\n <p className=\"text-base font-medium tracking-tight text-foreground whitespace-nowrap\">\n {n.title}\n </p>\n <p className=\"line-clamp-2 text-sm font-normal tracking-tight text-muted-foreground\">\n {n.description}\n </p>\n </div>\n </div>\n </React.Fragment>\n ))}\n </div>\n\n {/* 전체 내역 보기 버튼 */}\n <button\n type=\"button\"\n onClick={onViewAllNotifications}\n className={cn(\n \"mt-4 flex h-9 w-full items-center justify-center gap-1.5 rounded-lg\",\n \"border border-border bg-background\",\n \"text-sm font-medium tracking-tight text-foreground\",\n \"transition-colors hover:bg-muted/60\",\n )}\n >\n 전체 내역 보기\n <Icon name=\"chevron-right\" className=\"size-4 text-foreground\" />\n </button>\n </Popover.Content>\n </Popover.Portal>\n </Popover.Root>\n\n {/* ── Globe 언어 드롭다운 ───────────────────────────────────────── */}\n <DropdownMenu.Root>\n <DropdownMenu.Trigger\n aria-label=\"언어 선택\"\n className={cn(\n \"flex size-9 items-center justify-center rounded-lg shrink-0 outline-none\",\n \"border border-border bg-background\",\n \"transition-colors hover:bg-muted/60\",\n \"data-[state=open]:bg-accent\",\n )}\n >\n <Icon name=\"globe\" className=\"size-4 text-foreground\" />\n </DropdownMenu.Trigger>\n <DropdownMenu.Portal>\n <DropdownMenu.Content\n align=\"end\"\n sideOffset={4}\n className={cn(PANEL_CLS, \"w-50 py-1 px-1\")}\n style={{ maxHeight: \"416px\" }}\n >\n <DropdownMenu.Label asChild>\n <DropdownSectionLabel>언어</DropdownSectionLabel>\n </DropdownMenu.Label>\n {languages.map((lang) => (\n <DropdownMenu.Item\n key={lang.code}\n onSelect={() => onLanguageChange?.(lang.code)}\n className={cn(\n \"flex cursor-pointer select-none items-center gap-2.5 rounded-sm px-2 py-1.5 outline-none\",\n \"text-sm font-normal tracking-tight text-popover-foreground\",\n \"transition-colors focus:bg-accent data-[highlighted]:bg-accent\",\n lang.code === currentLanguage && \"bg-accent/50\",\n )}\n >\n {/* 국기 이모지 — 16×12px 컨테이너에 맞춤 */}\n <span\n className=\"flex size-4 shrink-0 items-center justify-center overflow-hidden text-sm leading-none\"\n aria-hidden\n >\n {lang.flag}\n </span>\n {lang.label}\n </DropdownMenu.Item>\n ))}\n </DropdownMenu.Content>\n </DropdownMenu.Portal>\n </DropdownMenu.Root>\n </div>\n </header>\n );\n}\n","'use client';\n\nimport * as React from 'react';\nimport { PrismLight as SyntaxHighlighter } from 'react-syntax-highlighter';\nimport { cn } from '@/lib/utils';\nimport { Icon } from '@/components/ui/icon';\nimport { MessageFooter } from '@/components/ui/message-footer';\n\n// ── Register common languages (tree-shaking) ──────────────────────────────────\nimport javascript from 'react-syntax-highlighter/dist/esm/languages/prism/javascript';\nimport typescript from 'react-syntax-highlighter/dist/esm/languages/prism/typescript';\nimport jsx from 'react-syntax-highlighter/dist/esm/languages/prism/jsx';\nimport tsx from 'react-syntax-highlighter/dist/esm/languages/prism/tsx';\nimport python from 'react-syntax-highlighter/dist/esm/languages/prism/python';\nimport bash from 'react-syntax-highlighter/dist/esm/languages/prism/bash';\nimport json from 'react-syntax-highlighter/dist/esm/languages/prism/json';\nimport css from 'react-syntax-highlighter/dist/esm/languages/prism/css';\nimport markup from 'react-syntax-highlighter/dist/esm/languages/prism/markup';\nimport sql from 'react-syntax-highlighter/dist/esm/languages/prism/sql';\nimport go from 'react-syntax-highlighter/dist/esm/languages/prism/go';\nimport rust from 'react-syntax-highlighter/dist/esm/languages/prism/rust';\nimport java from 'react-syntax-highlighter/dist/esm/languages/prism/java';\nimport kotlin from 'react-syntax-highlighter/dist/esm/languages/prism/kotlin';\nimport swift from 'react-syntax-highlighter/dist/esm/languages/prism/swift';\nimport yaml from 'react-syntax-highlighter/dist/esm/languages/prism/yaml';\nimport markdown from 'react-syntax-highlighter/dist/esm/languages/prism/markdown';\nimport diff from 'react-syntax-highlighter/dist/esm/languages/prism/diff';\n\nSyntaxHighlighter.registerLanguage('javascript', javascript);\nSyntaxHighlighter.registerLanguage('js', javascript);\nSyntaxHighlighter.registerLanguage('typescript', typescript);\nSyntaxHighlighter.registerLanguage('ts', typescript);\nSyntaxHighlighter.registerLanguage('jsx', jsx);\nSyntaxHighlighter.registerLanguage('tsx', tsx);\nSyntaxHighlighter.registerLanguage('python', python);\nSyntaxHighlighter.registerLanguage('py', python);\nSyntaxHighlighter.registerLanguage('bash', bash);\nSyntaxHighlighter.registerLanguage('sh', bash);\nSyntaxHighlighter.registerLanguage('shell', bash);\nSyntaxHighlighter.registerLanguage('zsh', bash);\nSyntaxHighlighter.registerLanguage('json', json);\nSyntaxHighlighter.registerLanguage('css', css);\nSyntaxHighlighter.registerLanguage('html', markup);\nSyntaxHighlighter.registerLanguage('xml', markup);\nSyntaxHighlighter.registerLanguage('sql', sql);\nSyntaxHighlighter.registerLanguage('go', go);\nSyntaxHighlighter.registerLanguage('rust', rust);\nSyntaxHighlighter.registerLanguage('java', java);\nSyntaxHighlighter.registerLanguage('kotlin', kotlin);\nSyntaxHighlighter.registerLanguage('swift', swift);\nSyntaxHighlighter.registerLanguage('yaml', yaml);\nSyntaxHighlighter.registerLanguage('yml', yaml);\nSyntaxHighlighter.registerLanguage('markdown', markdown);\nSyntaxHighlighter.registerLanguage('md', markdown);\nSyntaxHighlighter.registerLanguage('diff', diff);\n\n// ── Syntax theme (GitHub Light inspired) ─────────────────────────────────────\nconst codeTheme: { [key: string]: React.CSSProperties } = {\n 'code[class*=\"language-\"]': { color: 'var(--syntax-default)', background: 'transparent' },\n 'pre[class*=\"language-\"]': { color: 'var(--syntax-default)', background: 'transparent', margin: 0, padding: 0 },\n comment: { color: 'var(--syntax-comment)', fontStyle: 'italic' },\n prolog: { color: 'var(--syntax-comment)' },\n doctype: { color: 'var(--syntax-comment)' },\n cdata: { color: 'var(--syntax-comment)' },\n punctuation: { color: 'var(--syntax-default)' },\n namespace: { color: 'var(--syntax-namespace)' },\n property: { color: 'var(--syntax-property)' },\n tag: { color: 'var(--syntax-tag)' },\n boolean: { color: 'var(--syntax-property)' },\n number: { color: 'var(--syntax-property)' },\n constant: { color: 'var(--syntax-property)' },\n symbol: { color: 'var(--syntax-property)' },\n deleted: { color: 'var(--syntax-deleted)' },\n selector: { color: 'var(--syntax-selector)' },\n 'attr-name': { color: 'var(--syntax-property)' },\n string: { color: 'var(--syntax-selector)' },\n char: { color: 'var(--syntax-selector)' },\n builtin: { color: 'var(--syntax-property)' },\n inserted: { color: 'var(--syntax-tag)' },\n operator: { color: 'var(--syntax-default)' },\n entity: { color: 'var(--syntax-namespace)' },\n url: { color: 'var(--syntax-selector)' },\n atrule: { color: 'var(--syntax-keyword)' },\n 'attr-value': { color: 'var(--syntax-selector)' },\n keyword: { color: 'var(--syntax-keyword)' },\n function: { color: 'var(--syntax-function)' },\n 'class-name': { color: 'var(--syntax-namespace)' },\n regex: { color: 'var(--syntax-selector)' },\n important: { color: 'var(--syntax-keyword)', fontWeight: 'bold' },\n variable: { color: 'var(--syntax-variable)' },\n bold: { fontWeight: 'bold' },\n italic: { fontStyle: 'italic' },\n};\n\n// ── Code block component ──────────────────────────────────────────────────────\n\nfunction CodeBlock({ lang, code }: { lang: string; code: string }) {\n const [copied, setCopied] = React.useState(false);\n\n const handleCopy = () => {\n navigator.clipboard.writeText(code).then(() => {\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n });\n };\n\n const displayLang = lang || 'text';\n\n return (\n <div className='relative group bg-secondary border border-border rounded-xl overflow-hidden'>\n {/* Lang label + copy button */}\n <div className='flex items-center justify-between px-3 py-2 border-b border-border'>\n <span\n className='text-xs leading-xs tracking-tight text-muted-foreground'\n style={{ fontFamily: 'var(--font-mono)' }}\n >\n {displayLang}\n </span>\n <button\n type='button'\n onClick={handleCopy}\n className='flex items-center gap-1 px-2 py-1 rounded-md text-xs leading-xs tracking-tight text-muted-foreground hover:bg-muted hover:text-foreground transition-colors cursor-pointer'\n aria-label='코드 복사'\n >\n {copied ? (\n <Icon name='check' className='size-3 text-foreground' />\n ) : (\n <Icon name='copy' className='size-3 text-muted-foreground' />\n )}\n {copied ? '복사됨' : '복사'}\n </button>\n </div>\n\n {/* Code content */}\n <div className='p-3 overflow-x-auto'>\n <SyntaxHighlighter\n language={displayLang}\n style={codeTheme}\n customStyle={{\n background: 'transparent',\n padding: 0,\n margin: 0,\n fontSize: '14px',\n lineHeight: '20px',\n fontFamily:\n \"var(--font-mono, ui-monospace, 'SFMono-Regular', Consolas, monospace)\",\n }}\n codeTagProps={{\n style: {\n fontSize: '14px',\n lineHeight: '20px',\n fontFamily:\n \"var(--font-mono, ui-monospace, 'SFMono-Regular', Consolas, monospace)\",\n },\n }}\n wrapLongLines={false}\n >\n {code}\n </SyntaxHighlighter>\n </div>\n </div>\n );\n}\n\n// ── Inline parser: **bold**, *italic*, `code`, <br> ──────────────────────────\n\nfunction renderInline(text: string): React.ReactNode {\n // Normalise <br> → newline\n const normalized = text.replace(/<br\\s*\\/?>/gi, '\\n');\n\n const result: React.ReactNode[] = [];\n const regex = /\\*\\*(.+?)\\*\\*|\\*(.+?)\\*|`(.+?)`/g;\n let last = 0;\n let m: RegExpExecArray | null;\n let k = 0;\n\n const pushText = (raw: string) => {\n if (!raw) return;\n raw.split('\\n').forEach((line, i, arr) => {\n result.push(<React.Fragment key={k++}>{line}</React.Fragment>);\n if (i < arr.length - 1) result.push(<br key={k++} />);\n });\n };\n\n while ((m = regex.exec(normalized)) !== null) {\n pushText(normalized.slice(last, m.index));\n if (m[1] !== undefined) {\n result.push(\n <strong key={k++} className='font-semibold'>\n {m[1]}\n </strong>,\n );\n } else if (m[2] !== undefined) {\n result.push(\n <em key={k++} className='italic'>\n {m[2]}\n </em>,\n );\n } else if (m[3] !== undefined) {\n result.push(\n <code\n key={k++}\n className='text-sm bg-muted px-1 py-0.5 rounded'\n style={{ fontFamily: 'var(--font-mono)' }}\n >\n {m[3]}\n </code>,\n );\n }\n last = regex.lastIndex;\n }\n pushText(normalized.slice(last));\n\n return result.length === 0 ? null : <>{result}</>;\n}\n\n// ── Block types ────────────────────────────────────────────────────────────────\n\ntype Block =\n | { type: 'heading'; level: 1 | 2 | 3; text: string }\n | { type: 'paragraph'; text: string }\n | { type: 'list'; ordered: boolean; items: string[] }\n | { type: 'table'; headers: string[]; rows: string[][] }\n | { type: 'codeblock'; lang: string; code: string }\n | { type: 'divider' };\n\n// ── Markdown → blocks parser ───────────────────────────────────────────────────\n\nfunction parseMarkdown(text: string): Block[] {\n const lines = text.split('\\n');\n const blocks: Block[] = [];\n let i = 0;\n\n while (i < lines.length) {\n const line = lines[i];\n const trimmed = line.trim();\n\n // Skip blank lines\n if (!trimmed) {\n i++;\n continue;\n }\n\n // Code fence (``` or ~~~)\n if (trimmed.startsWith('```') || trimmed.startsWith('~~~')) {\n const fence = trimmed.startsWith('```') ? '```' : '~~~';\n const langMatch = trimmed.match(/^[`~]{3}(\\w*)/);\n const lang = langMatch?.[1] ?? '';\n const codeLines: string[] = [];\n i++;\n while (i < lines.length && !lines[i].trim().startsWith(fence)) {\n codeLines.push(lines[i]);\n i++;\n }\n i++; // skip closing fence\n blocks.push({ type: 'codeblock', lang, code: codeLines.join('\\n') });\n continue;\n }\n\n // Heading (#, ##, ###)\n const hm = trimmed.match(/^(#{1,3})\\s+(.+)$/);\n if (hm) {\n blocks.push({\n type: 'heading',\n level: Math.min(hm[1].length, 3) as 1 | 2 | 3,\n text: hm[2],\n });\n i++;\n continue;\n }\n\n // Horizontal rule (---+)\n if (/^-{3,}$/.test(trimmed)) {\n blocks.push({ type: 'divider' });\n i++;\n continue;\n }\n\n // Table (lines starting with |)\n if (trimmed.startsWith('|')) {\n const tableLines: string[] = [];\n while (i < lines.length && lines[i].trim().startsWith('|')) {\n tableLines.push(lines[i]);\n i++;\n }\n const splitRow = (row: string) =>\n row\n .split('|')\n .slice(1, -1)\n .map((c) => c.trim());\n const isSep = (row: string) => /^[\\s|:=-]+$/.test(row);\n\n if (tableLines.length >= 1) {\n const headers = splitRow(tableLines[0]);\n const dataStart =\n tableLines.length >= 2 && isSep(tableLines[1]) ? 2 : 1;\n const rows = tableLines.slice(dataStart).map(splitRow);\n if (headers.some(Boolean)) {\n blocks.push({ type: 'table', headers, rows });\n }\n }\n continue;\n }\n\n // Unordered list (-, *, +)\n if (/^[-*+] /.test(trimmed)) {\n const items: string[] = [];\n while (i < lines.length && /^[-*+] /.test(lines[i].trim())) {\n items.push(lines[i].trim().replace(/^[-*+] /, ''));\n i++;\n }\n blocks.push({ type: 'list', ordered: false, items });\n continue;\n }\n\n // Ordered list (1., 2., …)\n if (/^\\d+\\. /.test(trimmed)) {\n const items: string[] = [];\n while (i < lines.length && /^\\d+\\. /.test(lines[i].trim())) {\n items.push(lines[i].trim().replace(/^\\d+\\. /, ''));\n i++;\n }\n blocks.push({ type: 'list', ordered: true, items });\n continue;\n }\n\n // Plain paragraph\n blocks.push({ type: 'paragraph', text: trimmed });\n i++;\n }\n\n return blocks;\n}\n\n// ── Component ──────────────────────────────────────────────────────────────────\n\nexport function MarkdownMessage({\n content,\n isStreaming = false,\n footerMeta,\n className,\n}: {\n content: string;\n isStreaming?: boolean;\n /**\n * MessageFooter의 meta 슬롯에 들어갈 ReactNode.\n * streaming 중에는 렌더링되지 않습니다.\n */\n footerMeta?: React.ReactNode;\n className?: string;\n}) {\n const blocks = parseMarkdown(content);\n\n // ── Cursor element (streaming only) ─────────────────────────────────────────\n const cursor = isStreaming ? (\n <span\n className='inline-block w-0.5 bg-foreground ml-0.5 animate-pulse align-middle'\n style={{ height: '1em' }}\n />\n ) : null;\n\n return (\n <div\n className={cn('flex flex-col gap-2 w-full text-foreground', className)}\n >\n {blocks.map((block, idx) => {\n const blockKey = `${block.type}-${idx}`;\n const headingTop = idx > 0 ? 'mt-4' : '';\n const isLast = idx === blocks.length - 1;\n\n switch (block.type) {\n // ── Heading ────────────────────────────────────────────────────────\n case 'heading':\n if (block.level === 1)\n return (\n <p\n key={blockKey}\n className={cn(\n 'text-xl font-bold leading-8 tracking-tight',\n headingTop,\n )}\n >\n {renderInline(block.text)}\n {isLast && cursor}\n </p>\n );\n if (block.level === 2)\n return (\n <p\n key={blockKey}\n className={cn(\n 'text-lg font-semibold leading-7 tracking-tight',\n headingTop,\n )}\n >\n {renderInline(block.text)}\n {isLast && cursor}\n </p>\n );\n return (\n <p\n key={blockKey}\n className={cn(\n 'text-base font-semibold leading-6 tracking-tight',\n headingTop,\n )}\n >\n {renderInline(block.text)}\n {isLast && cursor}\n </p>\n );\n\n // ── Paragraph ──────────────────────────────────────────────────────\n case 'paragraph':\n return (\n <p\n key={blockKey}\n className='text-base font-normal leading-6 tracking-tight text-foreground/90'\n >\n {renderInline(block.text)}\n {isLast && cursor}\n </p>\n );\n\n // ── Code block ─────────────────────────────────────────────────────\n // 스트리밍 중에는 SyntaxHighlighter 대신 plain <pre>로 렌더링하여\n // 매 청크마다 하이라이터가 재실행되는 성능 문제를 방지.\n case 'codeblock':\n if (isStreaming) {\n return (\n <div\n key={blockKey}\n className='relative bg-secondary border border-border rounded-xl overflow-hidden'\n >\n <div className='flex items-center px-3 py-2 border-b border-border'>\n <span\n className='text-xs leading-xs tracking-tight text-muted-foreground'\n style={{ fontFamily: 'var(--font-mono)' }}\n >\n {block.lang || 'text'}\n </span>\n </div>\n <div className='p-3 overflow-x-auto'>\n <pre\n className='text-sm leading-5 text-foreground whitespace-pre-wrap'\n style={{\n fontFamily:\n \"var(--font-mono, ui-monospace, 'SFMono-Regular', Consolas, monospace)\",\n }}\n >\n {block.code}\n {isLast && cursor}\n </pre>\n </div>\n </div>\n );\n }\n return (\n <CodeBlock key={blockKey} lang={block.lang} code={block.code} />\n );\n\n // ── List ───────────────────────────────────────────────────────────\n case 'list':\n return (\n <ul\n key={blockKey}\n className={cn(\n 'flex flex-col gap-1 pl-5 text-base font-normal leading-6 tracking-tight text-foreground/90',\n block.ordered ? 'list-decimal' : 'list-disc',\n )}\n >\n {block.items.map((item, j) => (\n <li key={`item-${j}`}>\n {renderInline(item)}\n {isLast && j === block.items.length - 1 && cursor}\n </li>\n ))}\n </ul>\n );\n\n // ── Table ──────────────────────────────────────────────────────────\n case 'table':\n return (\n <div\n key={blockKey}\n className='flex flex-col w-full text-sm leading-5 tracking-tight overflow-x-auto'\n >\n <div className='flex items-center py-2 border-b border-border gap-4 font-semibold text-foreground'>\n {block.headers.map((h, j) => (\n <span key={`th-${j}`} className='flex-1 min-w-0 shrink-0'>\n {renderInline(h)}\n </span>\n ))}\n </div>\n {block.rows.map((row, j) => (\n <div\n key={`tr-${j}`}\n className='flex items-center py-2 border-b border-border gap-4 font-normal text-foreground/90'\n >\n {row.map((cell, k) => (\n <span key={`td-${k}`} className='flex-1 min-w-0'>\n {renderInline(cell)}\n </span>\n ))}\n </div>\n ))}\n </div>\n );\n\n // ── Divider ────────────────────────────────────────────────────────\n case 'divider':\n return (\n <div\n key={blockKey}\n className='flex h-12 items-center'\n >\n <div className='h-px w-full bg-border' />\n </div>\n );\n\n default:\n return null;\n }\n })}\n\n {/* content가 비어있거나 마지막 블록이 없을 때도 커서 표시 */}\n {isStreaming && blocks.length === 0 && cursor}\n\n {/* Footer: streaming 완료 후에만 표시 */}\n {!isStreaming && footerMeta !== undefined && (\n <MessageFooter content={content} meta={footerMeta} />\n )}\n </div>\n );\n}\n","'use client';\n\nimport * as React from 'react';\nimport { Tooltip } from '@/components/ui/tooltip';\nimport { Icon } from '@/components/ui/icon';\n\n// ── Component ─────────────────────────────────────────────────────────────────\n// Figma node 4829:43262\n// Left: meta 슬롯 (임의 ReactNode — 예: ModelInfo)\n// Right: 32×32 copy button, hover → bg-accent, tooltip \"복사하기\"\n\nexport interface MessageFooterProps {\n /** 복사할 원본 텍스트 */\n content: string;\n /** 복사 버튼 왼쪽에 표시할 임의 콘텐츠 (예: src/app/components/model-info.tsx) */\n meta?: React.ReactNode;\n}\n\nexport function MessageFooter({ content, meta }: MessageFooterProps) {\n const [copied, setCopied] = React.useState(false);\n const timerRef = React.useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const handleCopy = async () => {\n try {\n await navigator.clipboard.writeText(content);\n setCopied(true);\n if (timerRef.current) clearTimeout(timerRef.current);\n timerRef.current = setTimeout(() => setCopied(false), 2000);\n } catch {\n // clipboard not available\n }\n };\n\n React.useEffect(() => {\n return () => {\n if (timerRef.current) clearTimeout(timerRef.current);\n };\n }, []);\n\n return (\n <div className='flex items-center gap-2 py-2 animate-in fade-in-0 slide-in-from-bottom-1 duration-300'>\n {/* ── Copy button ────────────────────────────────────────── */}\n <Tooltip content='복사하기'>\n <button\n type='button'\n onClick={handleCopy}\n className='group/copy flex items-center justify-center size-8 rounded-lg hover:bg-accent transition-colors cursor-pointer shrink-0'\n aria-label='복사하기'\n >\n <Icon\n name={copied ? 'check' : 'copy'}\n className='size-4 shrink-0 text-muted-foreground transition-colors group-hover/copy:text-foreground'\n />\n </button>\n </Tooltip>\n\n {/* ── Meta slot ──────────────────────────────────────────── */}\n {meta}\n </div>\n );\n}\n","'use client';\n\nimport * as React from 'react';\nimport { Tooltip as TooltipPrimitive } from 'radix-ui';\nimport { cn } from '@/lib/utils';\nimport { Icon } from '@/components/ui/icon';\n\nconst TooltipProvider = TooltipPrimitive.Provider;\n\n// ─── TooltipContent (internal) ────────────────────────────────────────────────\n// Figma node 5132-2568\n//\n// 구조 (Figma 기준):\n// [Bubble] bg-primary, px-2.5 py-1.5, rounded-md, max-w-50 (200px)\n// └ Text text-xs (12px), text-primary-foreground, tracking-tight\n\nconst TooltipContent = React.forwardRef<\n React.ComponentRef<typeof TooltipPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>\n>(\n (\n {\n className,\n side = 'top',\n sideOffset = 4,\n children,\n ...props\n },\n ref,\n ) => (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n ref={ref}\n side={side}\n sideOffset={sideOffset}\n className={cn(\n 'z-50 max-w-50',\n 'bg-primary rounded-md px-2.5 py-1.5',\n 'animate-in fade-in-0 zoom-in-95',\n 'data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95',\n 'data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2',\n 'data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\n className,\n )}\n {...props}\n >\n <span className='block text-xs font-normal leading-snug tracking-tight text-primary-foreground break-words'>\n {children}\n </span>\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n ),\n);\nTooltipContent.displayName = 'TooltipContent';\n\n// ─── Tooltip ──────────────────────────────────────────────────────────────────\n\nexport interface TooltipProps\n extends\n Pick<\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Root>,\n 'open' | 'defaultOpen' | 'onOpenChange' | 'delayDuration'\n >,\n Omit<React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>, 'children' | 'content'> {\n /** 툴팁 말풍선에 표시할 내용 */\n content: React.ReactNode;\n /** 호버 시 툴팁을 여는 트리거 요소 (asChild로 렌더링) */\n children: React.ReactNode;\n}\n\nfunction Tooltip({\n content,\n children,\n open,\n defaultOpen,\n onOpenChange,\n delayDuration,\n ...contentProps\n}: TooltipProps) {\n if (!content) return children;\n return (\n <TooltipPrimitive.Root\n open={open}\n defaultOpen={defaultOpen}\n onOpenChange={onOpenChange}\n delayDuration={delayDuration}\n >\n <TooltipPrimitive.Trigger asChild>{children}</TooltipPrimitive.Trigger>\n <TooltipContent {...contentProps}>{content}</TooltipContent>\n </TooltipPrimitive.Root>\n );\n}\n\n// ─── TooltipWithIcon ──────────────────────────────────────────────────────────────\n// \"size-5 아이콘 버튼 + 툴팁\" 패턴 캡슐화\n\nexport interface TooltipWithIconProps {\n content: string;\n /** 트리거 아이콘 이름 (Lucide). @default \"info\" */\n iconName?: string;\n className?: string;\n}\n\nfunction TooltipWithIcon({\n content,\n iconName = 'info',\n className,\n}: TooltipWithIconProps) {\n if (!content) return null;\n return (\n <Tooltip content={content}>\n <Icon\n name={iconName}\n className={cn('size-4 text-muted-foreground', className)}\n />\n </Tooltip>\n );\n}\n\nexport { Tooltip, TooltipProvider, TooltipWithIcon };\n","\"use client\";\n\nimport * as React from \"react\";\nimport { Menubar as MenubarPrimitive } from \"radix-ui\";\n\nimport { cn } from \"@/lib/utils\";\nimport { Icon } from \"@/components/ui/icon\";\n\n// ─── Root ──────────────────────────────────────────────────────────────────────\n// Figma: bg-background border border-border rounded-[radius-md] shadow-xs p-1 gap-1\n\nconst Menubar = React.forwardRef<\n React.ElementRef<typeof MenubarPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof MenubarPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <MenubarPrimitive.Root\n ref={ref}\n className={cn(\n \"flex items-center gap-1 p-1\",\n \"bg-background border border-border rounded-md\",\n className,\n )}\n {...props}\n />\n));\nMenubar.displayName = MenubarPrimitive.Root.displayName;\n\n// ─── Menu ──────────────────────────────────────────────────────────────────────\n\nconst MenubarMenu = MenubarPrimitive.Menu;\n\n// ─── Trigger ──────────────────────────────────────────────────────────────────\n// Figma: px-2 py-1 rounded-[radius-sm] Text-sm/Medium text-foreground\n// Active (data-state=open): bg-accent text-accent-foreground\n\nconst MenubarTrigger = React.forwardRef<\n React.ElementRef<typeof MenubarPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof MenubarPrimitive.Trigger>\n>(({ className, ...props }, ref) => (\n <MenubarPrimitive.Trigger\n ref={ref}\n className={cn(\n \"flex items-center justify-center cursor-pointer select-none outline-none\",\n \"px-2 py-1 rounded-sm\",\n \"text-sm font-medium leading-5 tracking-tight text-foreground\",\n \"transition-colors hover:bg-accent hover:text-accent-foreground\",\n \"data-[state=open]:bg-accent data-[state=open]:text-accent-foreground\",\n className,\n )}\n {...props}\n />\n));\nMenubarTrigger.displayName = MenubarPrimitive.Trigger.displayName;\n\n// ─── Content ──────────────────────────────────────────────────────────────────\n// Figma: bg-popover border border-border rounded-[radius-md] shadow-md w-[192px]\n\nconst MenubarContent = React.forwardRef<\n React.ElementRef<typeof MenubarPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof MenubarPrimitive.Content>\n>(({ className, align = \"start\", alignOffset = -4, sideOffset = 8, ...props }, ref) => (\n <MenubarPrimitive.Portal>\n <MenubarPrimitive.Content\n ref={ref}\n align={align}\n alignOffset={alignOffset}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 min-w-48 overflow-hidden\",\n \"bg-popover border border-border rounded-md\",\n \"shadow-dropdown\",\n // Entry / exit animations\n \"data-[state=open]:animate-in data-[state=closed]:animate-out\",\n \"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n \"data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95\",\n \"data-[side=bottom]:slide-in-from-top-2 data-[side=top]:slide-in-from-bottom-2\",\n \"duration-200 data-[state=closed]:duration-150\",\n className,\n )}\n {...props}\n />\n </MenubarPrimitive.Portal>\n));\nMenubarContent.displayName = MenubarPrimitive.Content.displayName;\n\n// ─── Group ────────────────────────────────────────────────────────────────────\n\nconst MenubarGroup = MenubarPrimitive.Group;\n\n// ─── Item ─────────────────────────────────────────────────────────────────────\n// Figma: h-8 px-2 py-1.5 gap-2 rounded-[radius-sm] flex items-center\n// text-sm/Regular text-popover-foreground\n// disabled: opacity-50 cursor-not-allowed\n\nconst MenubarItem = React.forwardRef<\n React.ElementRef<typeof MenubarPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof MenubarPrimitive.Item> & {\n inset?: boolean;\n }\n>(({ className, inset, ...props }, ref) => (\n <MenubarPrimitive.Item\n ref={ref}\n className={cn(\n \"relative flex h-8 cursor-pointer select-none items-center gap-2\",\n \"px-2 py-1.5 rounded-sm\",\n \"text-sm font-normal leading-5 tracking-tight text-popover-foreground\",\n \"outline-none transition-colors\",\n \"focus:bg-accent focus:text-accent-foreground\",\n \"data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n inset && \"pl-8\",\n className,\n )}\n {...props}\n />\n));\nMenubarItem.displayName = MenubarPrimitive.Item.displayName;\n\n// ─── Sub ──────────────────────────────────────────────────────────────────────\n\nconst MenubarSub = MenubarPrimitive.Sub;\n\n// ─── SubTrigger ───────────────────────────────────────────────────────────────\n// Figma: same as item but with ChevronRight icon on the right\n\nconst MenubarSubTrigger = React.forwardRef<\n React.ElementRef<typeof MenubarPrimitive.SubTrigger>,\n React.ComponentPropsWithoutRef<typeof MenubarPrimitive.SubTrigger> & {\n inset?: boolean;\n }\n>(({ className, inset, children, ...props }, ref) => (\n <MenubarPrimitive.SubTrigger\n ref={ref}\n className={cn(\n \"relative flex h-8 cursor-pointer select-none items-center gap-2\",\n \"px-2 py-1.5 rounded-sm\",\n \"text-sm font-normal leading-5 tracking-tight text-popover-foreground\",\n \"outline-none transition-colors\",\n \"focus:bg-accent focus:text-accent-foreground\",\n \"data-[state=open]:bg-accent data-[state=open]:text-accent-foreground\",\n inset && \"pl-8\",\n className,\n )}\n {...props}\n >\n <span className=\"flex-1 min-w-0 overflow-hidden text-ellipsis whitespace-nowrap\">\n {children}\n </span>\n <Icon name=\"chevron-right\" className=\"size-4 text-foreground\" />\n </MenubarPrimitive.SubTrigger>\n));\nMenubarSubTrigger.displayName = MenubarPrimitive.SubTrigger.displayName;\n\n// ─── SubContent ───────────────────────────────────────────────────────────────\n\nconst MenubarSubContent = React.forwardRef<\n React.ElementRef<typeof MenubarPrimitive.SubContent>,\n React.ComponentPropsWithoutRef<typeof MenubarPrimitive.SubContent>\n>(({ className, ...props }, ref) => (\n <MenubarPrimitive.SubContent\n ref={ref}\n className={cn(\n \"z-50 min-w-48 overflow-hidden\",\n \"bg-popover border border-border rounded-md\",\n \"shadow-dropdown\",\n \"data-[state=open]:animate-in data-[state=closed]:animate-out\",\n \"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n \"data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95\",\n \"data-[side=bottom]:slide-in-from-top-2 data-[side=top]:slide-in-from-bottom-2\",\n \"duration-200 data-[state=closed]:duration-150\",\n className,\n )}\n {...props}\n />\n));\nMenubarSubContent.displayName = MenubarPrimitive.SubContent.displayName;\n\n// ─── Shortcut ─────────────────────────────────────────────────────────────────\n// Figma: Text-xs/Regular text-muted-foreground ml-auto\n\nconst MenubarShortcut = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLSpanElement>) => (\n <span\n className={cn(\n \"ml-auto text-xs font-normal leading-4 tracking-tight\",\n \"text-muted-foreground shrink-0\",\n className,\n )}\n {...props}\n />\n);\nMenubarShortcut.displayName = \"MenubarShortcut\";\n\n// ─── Separator ────────────────────────────────────────────────────────────────\n// Figma: Divider — h-2 containing a horizontal rule\n\nconst MenubarSeparator = React.forwardRef<\n React.ElementRef<typeof MenubarPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof MenubarPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <MenubarPrimitive.Separator\n ref={ref}\n className={cn(\"my-1 h-px bg-border mx-1\", className)}\n {...props}\n />\n));\nMenubarSeparator.displayName = MenubarPrimitive.Separator.displayName;\n\n// ─── Exports ──────────────────────────────────────────────────────────────────\n\nexport {\n Menubar,\n MenubarMenu,\n MenubarTrigger,\n MenubarContent,\n MenubarGroup,\n MenubarItem,\n MenubarSub,\n MenubarSubTrigger,\n MenubarSubContent,\n MenubarShortcut,\n MenubarSeparator,\n};\n","import { cn } from '@/lib/utils';\nimport { BADGE_VARIANT_STYLES, type BadgeVariant } from '@/components/ui/badge';\n\n// ─── Style constants ──────────────────────────────────────────────────────────\n// Derived from RYAI Design System - Badge component (node 73:3479)\n// rounded-full · font-mono · text-xs\n// size-5 (20×20) ← count < 10 (한 자리: 원형)\n// h-5 min-w-5 px-2 ← count ≥ 10, filled variants (두 자리 이상: pill)\nconst NUMBER_BADGE_BASE =\n 'inline-flex shrink-0 items-center justify-center rounded-full font-mono text-xs font-medium leading-xs whitespace-nowrap';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport interface NumberBadgeProps {\n /** 표시할 숫자 */\n count: number;\n /** 배지 시맨틱 변형 (기본값: default) */\n variant?: BadgeVariant;\n className?: string;\n}\n\n// ─── Component ────────────────────────────────────────────────────────────────\n\nfunction NumberBadge({\n count,\n variant = 'default',\n className,\n}: NumberBadgeProps) {\n // 한 자리(0-9): 원형 size-5\n // 두 자리 이상: 가로 가변 pill\n const sizeClass = count < 10 ? 'size-5' : 'h-5 min-w-5 px-2';\n\n return (\n <span\n data-slot='number-badge'\n className={cn(\n NUMBER_BADGE_BASE,\n sizeClass,\n 'tracking-tight',\n BADGE_VARIANT_STYLES[variant],\n className,\n )}\n >\n {count}\n </span>\n );\n}\n\nexport { NumberBadge };\n","import { cn } from \"@/lib/utils\";\n\ninterface Item<T extends string> {\n key: T;\n label: string;\n}\n\ninterface SegmentedControlProps<T extends string> {\n value: T;\n onChange: (value: T) => void;\n items: readonly Item<T>[];\n}\n\nexport function SegmentedControl<T extends string>({\n value,\n onChange,\n items,\n}: SegmentedControlProps<T>) {\n return (\n <div className=\"flex items-start w-full rounded-md\">\n {items.map(({ key, label }, idx) => {\n const isActive = value === key;\n const isFirst = idx === 0;\n const isLast = idx === items.length - 1;\n return (\n <button\n key={key}\n type=\"button\"\n onClick={() => onChange(key)}\n className={cn(\n \"flex flex-1 h-9 items-center justify-center px-2 cursor-pointer transition-colors\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-inset\",\n \"text-sm leading-5 tracking-tight text-foreground\",\n isActive ? \"font-medium bg-accent\" : \"font-normal bg-background\",\n isFirst\n ? \"border-l border-t border-b border-border rounded-tl-md rounded-bl-md\"\n : isLast\n ? \"border-t border-b border-r border-border rounded-tr-md rounded-br-md\"\n : \"border border-border\",\n )}\n >\n {label}\n </button>\n );\n })}\n </div>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { Popover as PopoverPrimitive } from \"radix-ui\";\n\nimport { cn } from \"@/lib/utils\";\nimport { Icon } from \"@/components/ui/icon\";\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport interface SelectOption {\n /** Unique identifier for the option */\n value: string;\n /** Display text shown in the list and trigger */\n label: string;\n /** Optional icon rendered before the label */\n icon?: React.ReactNode;\n}\n\nexport interface SelectGroup {\n /** Optional category label shown above items */\n label?: string;\n /** Items in this group */\n options: SelectOption[];\n}\n\nexport interface SelectProps {\n /** List of selectable options (flat or grouped) */\n options?: SelectOption[];\n /** Grouped options with optional category labels */\n groups?: SelectGroup[];\n /** Controlled selected value */\n value?: string;\n /** Default value for uncontrolled mode */\n defaultValue?: string;\n /** Callback when selection changes */\n onValueChange?: (value: string) => void;\n /** Placeholder text shown when no value is selected */\n placeholder?: string;\n /** Additional className for the trigger button */\n className?: string;\n /** Disable the select */\n disabled?: boolean;\n}\n\n// ─── Select ──────────────────────────────────────────────────────────────────\n// Figma node: 614:1543\n//\n// Trigger: h-9, border, rounded-md, px-3 py-2, text + chevron-down 16px\n// Dropdown: w-[var(--radix-popover-trigger-width)], border, rounded-md,\n// shadow-md, bg-popover, p-1\n// Label: px-2 py-1.5 text-xs text-muted-foreground (category)\n// Items: px-2 py-1.5 gap-1.5 rounded-sm\n// Active: bg-accent text-accent-foreground + Check icon right\n\nexport function Select({\n options,\n groups,\n value: controlledValue,\n defaultValue = \"\",\n onValueChange,\n placeholder = \"선택해 주세요\",\n className,\n disabled = false,\n}: SelectProps) {\n const [open, setOpen] = React.useState(false);\n const [internalValue, setInternalValue] = React.useState(defaultValue);\n const isControlled = controlledValue !== undefined;\n const value = isControlled ? controlledValue : internalValue;\n\n // Flatten all options for lookup\n const allOptions = React.useMemo(() => {\n if (options) return options;\n if (groups) return groups.flatMap((g) => g.options);\n return [];\n }, [options, groups]);\n\n const selectedOption = allOptions.find((opt) => opt.value === value);\n\n // Build renderable groups\n const renderGroups: SelectGroup[] = React.useMemo(() => {\n if (groups) return groups;\n if (options) return [{ options }];\n return [];\n }, [options, groups]);\n\n function handleSelect(optionValue: string) {\n if (!isControlled) setInternalValue(optionValue);\n onValueChange?.(optionValue);\n setOpen(false);\n }\n\n return (\n <PopoverPrimitive.Root open={open} onOpenChange={setOpen}>\n {/* ── Trigger ─────────────────────────────────────────────────────── */}\n <PopoverPrimitive.Trigger asChild>\n <button\n type=\"button\"\n aria-expanded={open}\n disabled={disabled}\n className={cn(\n \"flex h-9 w-full items-center justify-between rounded-md border border-border bg-background px-3 py-2\",\n \"cursor-pointer transition-colors hover:bg-accent\",\n \"focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n className,\n )}\n >\n {/* Icon + Label */}\n <span className=\"flex flex-1 min-w-0 items-center gap-1.5\">\n {selectedOption?.icon && (\n <span className=\"shrink-0 flex items-center\">\n {selectedOption.icon}\n </span>\n )}\n <span\n className={cn(\n \"flex-1 min-w-0 truncate text-left text-sm leading-5 tracking-tight\",\n selectedOption\n ? \"font-normal text-foreground\"\n : \"font-normal text-muted-foreground\",\n )}\n >\n {selectedOption ? selectedOption.label : placeholder}\n </span>\n </span>\n {/* Chevron */}\n <Icon name=\"chevron-down\" className=\"size-4 shrink-0 text-muted-foreground\" />\n </button>\n </PopoverPrimitive.Trigger>\n\n {/* ── Dropdown ────────────────────────────────────────────────────── */}\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n align=\"start\"\n sideOffset={4}\n style={{ width: \"var(--radix-popover-trigger-width)\" }}\n className={cn(\n \"z-50 overflow-hidden rounded-md border border-border bg-popover\",\n \"shadow-dropdown\",\n \"data-[state=open]:animate-in data-[state=closed]:animate-out\",\n \"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n \"data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95\",\n \"duration-200 data-[state=closed]:duration-150\",\n )}\n >\n <div className=\"p-1 flex flex-col\">\n {renderGroups.map((group, gi) => (\n <div key={gi}>\n {/* Optional category label */}\n {group.label && (\n <div className=\"px-2 py-1.5\">\n <span className=\"text-xs leading-4.5 tracking-tight font-normal text-muted-foreground\">\n {group.label}\n </span>\n </div>\n )}\n {/* Items */}\n {group.options.map((opt) => {\n const isSelected = opt.value === value;\n return (\n <button\n key={opt.value}\n type=\"button\"\n onClick={() => handleSelect(opt.value)}\n className={cn(\n \"flex w-full items-center justify-between rounded-sm px-2 py-1.5\",\n \"text-sm font-normal leading-5 tracking-tight\",\n \"cursor-pointer transition-colors\",\n isSelected\n ? \"bg-accent text-accent-foreground\"\n : \"text-popover-foreground hover:bg-accent hover:text-accent-foreground\",\n )}\n >\n <span className=\"flex flex-1 min-w-0 items-center gap-1.5\">\n {opt.icon && (\n <span className=\"shrink-0 flex items-center\">\n {opt.icon}\n </span>\n )}\n <span className=\"flex-1 min-w-0 truncate text-left\">\n {opt.label}\n </span>\n </span>\n {isSelected && (\n <Icon name=\"check\" className=\"size-4 shrink-0 ml-2\" />\n )}\n </button>\n );\n })}\n </div>\n ))}\n </div>\n </PopoverPrimitive.Content>\n </PopoverPrimitive.Portal>\n </PopoverPrimitive.Root>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { Icon } from \"@/components/ui/icon\";\n\ninterface SheetProps {\n open: boolean;\n onClose: () => void;\n title: string;\n description?: string;\n children: React.ReactNode;\n footer?: React.ReactNode;\n}\n\nexport function Sheet({ open, onClose, title, description, children, footer }: SheetProps) {\n // Close on Escape key\n React.useEffect(() => {\n if (!open) return;\n const handler = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") onClose();\n };\n document.addEventListener(\"keydown\", handler);\n return () => document.removeEventListener(\"keydown\", handler);\n }, [open, onClose]);\n\n return (\n <div\n className={[\n \"fixed top-0 right-0 z-50 flex flex-col h-full w-96\",\n \"bg-background border-l border-border\",\n \"shadow-sheet\",\n \"transition-transform duration-300\",\n open ? \"translate-x-0\" : \"translate-x-full\",\n ].join(\" \")}\n style={{ transitionTimingFunction: \"cubic-bezier(0.32, 0.72, 0, 1)\" }}\n >\n {/* ── Header ───────────────────────────────────────────── */}\n <div className=\"flex flex-col gap-1.5 p-4 shrink-0\">\n <div className=\"flex items-center justify-between\">\n <p className=\"flex-1 min-w-0 text-base font-semibold leading-6 tracking-tight text-foreground\">\n {title}\n </p>\n <button\n type=\"button\"\n onClick={onClose}\n className=\"flex items-center justify-center shrink-0 size-4 cursor-pointer hover:opacity-70 transition-opacity\"\n >\n <Icon name=\"x\" className=\"size-4 text-foreground\" />\n </button>\n </div>\n {description && (\n <p className=\"text-sm font-normal leading-5 tracking-tight text-muted-foreground\">\n {description}\n </p>\n )}\n </div>\n\n {/* ── Content ──────────────────────────────────────────── */}\n <div className=\"flex flex-1 flex-col gap-4 min-h-0 overflow-y-auto px-4\">\n {children}\n </div>\n\n {/* ── Footer ───────────────────────────────────────────── */}\n {footer && (\n <div className=\"flex flex-col gap-2 items-end p-4 shrink-0\">\n {footer}\n </div>\n )}\n </div>\n );\n}\n","'use client';\n\nimport * as React from 'react';\nimport { DropdownMenu, Popover } from 'radix-ui';\n\nimport { cn } from '@/lib/utils';\nimport { Icon } from '@/components/ui/icon';\nimport { Tooltip } from '@/components/ui/tooltip';\nimport { PanelLeftIcon } from '@/components/icons/custom/panel-left';\nimport { StarIcon } from '@/components/icons/custom/star';\nimport { PenLineIcon } from '@/components/icons/custom/pen-line';\nimport { TrashIcon } from '@/components/icons/custom/trash';\nimport { Avatar } from './avatar';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\n/**\n * 링크 렌더링 함수. next/link, react-router <Link> 등 소비 측 라우터에 맞게 주입한다.\n * 미지정 시 기본 <a> 태그로 렌더링된다.\n */\nexport type RenderLinkFn = (props: {\n href: string;\n className?: string;\n style?: React.CSSProperties;\n onClick?: () => void;\n children: React.ReactNode;\n}) => React.ReactNode;\n\nexport type SidebarNavItem = {\n href: string;\n label: string;\n icon: React.ReactNode;\n isActive: boolean;\n onClick?: () => void;\n /** true이면 이 항목 앞에 구분선을 렌더링합니다. */\n dividerBefore?: boolean;\n};\n\nexport type SidebarTaskMenuItem = {\n label: string;\n icon?: React.ReactNode;\n onSelect?: () => void;\n variant?: 'default' | 'destructive';\n /** true이면 이 항목 앞에 구분선(간격)을 렌더링합니다. */\n separatorBefore?: boolean;\n};\n\nexport type SidebarTask = {\n id: string;\n title: string;\n /** 클릭 시 이동할 경로. renderLink 또는 기본 <a>로 렌더링됩니다. */\n href: string;\n icon?: React.ReactNode;\n favorited?: boolean;\n};\n\nexport type SidebarUtilityLink = {\n label: string;\n icon: React.ReactNode;\n /** 외부 링크 URL. 없으면 button으로 렌더링됩니다. */\n href?: string;\n onClick?: () => void;\n};\n\n/** 하드코딩된 한국어 문자열을 외부에서 교체할 수 있는 레이블 모음 */\nexport type SidebarLabels = {\n taskSectionTitle?: string;\n taskSectionHide?: string;\n taskSectionShow?: string;\n taskEmptyMessage?: string;\n};\n\ninterface NotificationItem {\n id: string;\n badge?: string;\n date?: string;\n title: string;\n description: string;\n}\n\n// ─── Internal helpers ─────────────────────────────────────────────────────────\n\n/** dividerBefore 기준으로 navItems를 그룹으로 분리합니다. */\nfunction groupNavItems(items: SidebarNavItem[]): SidebarNavItem[][] {\n const groups: SidebarNavItem[][] = [];\n let current: SidebarNavItem[] = [];\n for (const item of items) {\n if (item.dividerBefore && current.length > 0) {\n groups.push(current);\n current = [item];\n } else {\n current.push(item);\n }\n }\n if (current.length > 0) groups.push(current);\n return groups;\n}\n\nconst defaultRenderLink: RenderLinkFn = ({\n href,\n className,\n style,\n onClick,\n children,\n}) => (\n <a href={href} className={cn(className)} style={style} onClick={onClick}>\n {children}\n </a>\n);\n\n// ─── TaskRow ──────────────────────────────────────────────────────────────────\n\ninterface TaskRowProps {\n item: SidebarTask;\n isActive: boolean;\n renderLink: RenderLinkFn;\n onToggleFavorite?: () => void;\n onStartRename?: () => void;\n onDelete?: () => void;\n}\n\nfunction TaskRow({\n item,\n isActive,\n renderLink,\n onToggleFavorite,\n onStartRename,\n onDelete,\n}: TaskRowProps) {\n return (\n <div\n className={cn(\n 'group flex h-8 items-center justify-between pl-2 rounded-md transition-colors w-full shrink-0',\n isActive\n ? 'bg-sidebar-accent'\n : 'hover:bg-sidebar-accent [&:has(button:hover)]:bg-transparent',\n )}\n >\n {renderLink({\n href: item.href,\n className: 'flex-1 min-w-0 flex items-center h-full',\n children: (\n <span className='w-full text-sm font-normal leading-5 tracking-tight text-foreground overflow-hidden text-ellipsis whitespace-nowrap'>\n {item.title}\n </span>\n ),\n })}\n <DropdownMenu.Root>\n <DropdownMenu.Trigger asChild>\n <button\n type='button'\n onClick={(e) => e.stopPropagation()}\n className={cn(\n 'group/ellipsis flex items-center justify-center size-8 rounded-lg shrink-0 transition-[colors,opacity]',\n 'opacity-0 group-hover:opacity-100 hover:bg-accent data-[state=open]:opacity-100 data-[state=open]:bg-accent',\n isActive && 'opacity-100',\n )}\n aria-label='작업 옵션'\n >\n <Icon\n name='ellipsis'\n className='size-4 text-muted-foreground transition-colors group-hover/ellipsis:text-foreground'\n />\n </button>\n </DropdownMenu.Trigger>\n <DropdownMenu.Portal>\n <DropdownMenu.Content\n side='bottom'\n align='end'\n sideOffset={4}\n className='z-50 w-50 bg-popover border border-border rounded-md shadow-dropdown outline-none animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95'\n >\n <div className='pt-1 px-1'>\n <DropdownMenu.Item\n onSelect={onToggleFavorite}\n className='flex items-center gap-2 px-2 py-1.5 rounded-sm cursor-pointer outline-none select-none hover:bg-accent focus:bg-accent'\n >\n <div className='flex flex-1 items-center gap-1.5'>\n <StarIcon\n className='size-4 text-foreground'\n filled={item.favorited}\n />\n <span className='flex-1 text-sm leading-5 tracking-tight text-foreground'>\n {item.favorited ? '즐겨찾기 해제' : '즐겨찾기'}\n </span>\n </div>\n </DropdownMenu.Item>\n <DropdownMenu.Item\n onSelect={onStartRename}\n className='flex items-center gap-2 px-2 py-1.5 rounded-sm cursor-pointer outline-none select-none hover:bg-accent focus:bg-accent'\n >\n <div className='flex flex-1 items-center gap-1.5'>\n <PenLineIcon className='size-4 text-foreground' />\n <span className='flex-1 text-sm leading-5 tracking-tight text-foreground'>\n 이름 변경\n </span>\n </div>\n </DropdownMenu.Item>\n </div>\n <DropdownMenu.Separator className='h-2' />\n <div className='pb-1 px-1'>\n <DropdownMenu.Item\n onSelect={onDelete}\n className='flex items-center gap-2 px-2 py-1.5 rounded-sm cursor-pointer outline-none select-none hover:bg-accent focus:bg-accent'\n >\n <div className='flex flex-1 items-center gap-1.5'>\n <TrashIcon className='size-4 text-destructive' />\n <span className='flex-1 text-sm leading-5 tracking-tight text-destructive'>\n 삭제하기\n </span>\n </div>\n </DropdownMenu.Item>\n </div>\n </DropdownMenu.Content>\n </DropdownMenu.Portal>\n </DropdownMenu.Root>\n </div>\n );\n}\n\n// ─── Sidebar ──────────────────────────────────────────────────────────────────\n\nexport function Sidebar({\n className,\n // 좌측 아이콘 레일\n logo,\n navRailItems,\n // 우측 콘텐츠 패널\n sectionTitle,\n navItems,\n tasks,\n activeTaskId,\n showTaskSection = true,\n // 알림\n hasNotification = false,\n notifications = [],\n onViewAllNotifications,\n // 하단 유틸리티 링크\n utilityLinks,\n username,\n // 태스크 액션 콜백\n onRenameTask,\n onToggleFavorite,\n onDeleteTask,\n // 레이블\n labels,\n // 링크 렌더링\n renderLink,\n}: {\n className?: string;\n logo?: React.ReactNode;\n navRailItems?: SidebarNavItem[];\n sectionTitle?: string;\n navItems: SidebarNavItem[];\n tasks: SidebarTask[];\n activeTaskId: string | null;\n showTaskSection?: boolean;\n hasNotification?: boolean;\n notifications?: NotificationItem[];\n onViewAllNotifications?: () => void;\n utilityLinks?: SidebarUtilityLink[];\n username?: string;\n onRenameTask?: (id: string, newTitle: string) => void;\n onToggleFavorite?: (id: string) => void;\n onDeleteTask?: (id: string) => void;\n labels?: SidebarLabels;\n renderLink?: RenderLinkFn;\n}) {\n const [isPanelOpen, setIsPanelOpen] = React.useState(true);\n const [isHistoryOpen, setIsHistoryOpen] = React.useState(true);\n const [notifOpen, setNotifOpen] = React.useState(false);\n const [renamingId, setRenamingId] = React.useState<string | null>(null);\n const [renameValue, setRenameValue] = React.useState('');\n\n const link = renderLink ?? defaultRenderLink;\n const navGroups = groupNavItems(navItems);\n\n const favoriteTasks = React.useMemo(\n () => tasks.filter((t) => t.favorited),\n [tasks],\n );\n const regularTasks = React.useMemo(\n () => tasks.filter((t) => !t.favorited),\n [tasks],\n );\n\n const taskSectionTitle = labels?.taskSectionTitle ?? '작업 목록';\n const taskSectionHide = labels?.taskSectionHide ?? '작업 목록 숨기기';\n const taskSectionShow = labels?.taskSectionShow ?? '작업 목록 표시';\n const taskEmptyMessage = labels?.taskEmptyMessage ?? '작업 목록이 없습니다.';\n\n const startRename = (id: string, currentTitle: string) => {\n setRenamingId(id);\n setRenameValue(currentTitle);\n };\n\n const commitRename = () => {\n if (renamingId && renameValue.trim()) {\n onRenameTask?.(renamingId, renameValue.trim());\n }\n setRenamingId(null);\n };\n\n return (\n <aside\n className={cn(\n 'flex h-full border-r border-sidebar-border bg-background shrink-0 transition-[width]',\n isPanelOpen ? 'w-70' : 'w-17',\n className,\n )}\n >\n {/* ── 좌측 아이콘 레일 ─────────────────────────────────────────────────── */}\n <div\n className='flex flex-col h-full shrink-0 border-r border-border'\n style={{ width: '68px' }}\n >\n {/* 로고 */}\n {logo && (\n <div className='flex items-center justify-center py-4 shrink-0 w-full'>\n {logo}\n </div>\n )}\n\n {/* 서비스 네비게이션 */}\n <div className='flex flex-col flex-1 items-center min-h-0 min-w-0 pb-4 pt-3 px-2 w-full'>\n {navRailItems && navRailItems.length > 0 && (\n <nav\n className='flex flex-col gap-4 items-center w-10'\n aria-label='서비스 메뉴'\n >\n {navRailItems.map((item) => (\n <div key={item.href} className='flex flex-col items-center'>\n {link({\n href: item.href,\n onClick: () => {\n if (!isPanelOpen) setIsPanelOpen(true);\n item.onClick?.();\n },\n className: 'flex flex-col items-center cursor-pointer',\n style: { gap: '4px' },\n children: (\n <>\n <div\n className={cn(\n 'flex items-center justify-center rounded-md size-8 transition-colors',\n item.isActive\n ? 'bg-accent'\n : 'hover:bg-sidebar-accent',\n )}\n >\n {item.icon}\n </div>\n <span className='text-2xs leading-xs text-foreground text-center tracking-tight whitespace-nowrap'>\n {item.label}\n </span>\n </>\n ),\n })}\n </div>\n ))}\n </nav>\n )}\n </div>\n\n {/* 하단 유틸리티 아이콘 */}\n <div className='flex flex-col flex-1 items-center justify-end min-h-0 min-w-0 px-4 py-3 gap-3 w-full'>\n {/* 알림 팝오버 */}\n {(notifications.length > 0 || hasNotification) && (\n <Popover.Root open={notifOpen} onOpenChange={setNotifOpen}>\n <Popover.Trigger asChild>\n <button\n type='button'\n onMouseEnter={() => setNotifOpen(true)}\n className='relative flex items-center justify-center rounded-md size-8 text-sidebar-foreground hover:bg-sidebar-accent transition-colors cursor-pointer outline-none data-[state=open]:bg-sidebar-accent'\n aria-label='알림'\n >\n <Icon name='bell' className='size-5 text-foreground' />\n {hasNotification && (\n <span\n aria-hidden\n className='absolute size-1.5 rounded-full bg-destructive'\n style={{ right: '5px', top: '5px' }}\n />\n )}\n </button>\n </Popover.Trigger>\n <Popover.Portal>\n <Popover.Content\n side='right'\n align='end'\n sideOffset={8}\n onMouseLeave={() => setNotifOpen(false)}\n onOpenAutoFocus={(e) => e.preventDefault()}\n className={cn(\n 'z-50 w-423 rounded-lg border border-border bg-background p-6',\n 'shadow-dropdown',\n 'animate-in fade-in-0 zoom-in-95 duration-200',\n 'data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=closed]:duration-150',\n )}\n >\n <div className='mb-4'>\n <h3 className='text-lg font-semibold tracking-tight text-foreground'>\n 서비스 업데이트\n </h3>\n </div>\n <div className='flex flex-col'>\n {notifications.map((n, i) => (\n <React.Fragment key={n.id}>\n {i > 0 && (\n <div className='flex h-6 items-center'>\n <hr className='w-full border-border' />\n </div>\n )}\n <div className='flex flex-col gap-4 rounded-md p-3 cursor-pointer transition-colors hover:bg-secondary'>\n <div className='flex items-center justify-between'>\n {n.badge && (\n <span className='inline-flex h-5.5 items-center rounded-lg bg-amber-50 px-2.5 py-0.5 text-xs font-medium tracking-tight text-amber-700 whitespace-nowrap'>\n {n.badge}\n </span>\n )}\n {n.date && (\n <span className='text-sm font-normal tracking-tight text-muted-foreground'>\n {n.date}\n </span>\n )}\n </div>\n <div className='flex flex-col gap-1'>\n <p className='text-base font-medium tracking-tight text-foreground whitespace-nowrap'>\n {n.title}\n </p>\n <p className='line-clamp-2 text-sm font-normal tracking-tight text-muted-foreground'>\n {n.description}\n </p>\n </div>\n </div>\n </React.Fragment>\n ))}\n </div>\n <button\n type='button'\n onClick={onViewAllNotifications}\n className={cn(\n 'mt-4 flex h-9 w-full items-center justify-center gap-1.5 rounded-lg',\n 'border border-border bg-background',\n 'text-sm font-medium tracking-tight text-foreground',\n 'transition-colors hover:bg-muted/60',\n )}\n >\n 전체 내역 보기\n <Icon\n name='chevron-right'\n className='size-4 text-foreground'\n />\n </button>\n </Popover.Content>\n </Popover.Portal>\n </Popover.Root>\n )}\n\n {/* 유틸리티 링크 */}\n {utilityLinks?.map((utilLink) =>\n utilLink.href ? (\n <Tooltip\n key={utilLink.label}\n content={utilLink.label}\n side='right'\n >\n <a\n href={utilLink.href}\n target='_blank'\n rel='noopener noreferrer'\n className='flex items-center justify-center rounded-md size-8 text-sidebar-foreground hover:bg-sidebar-accent transition-colors cursor-pointer'\n aria-label={utilLink.label}\n >\n {utilLink.icon}\n </a>\n </Tooltip>\n ) : (\n <Tooltip\n key={utilLink.label}\n content={utilLink.label}\n side='right'\n >\n <button\n type='button'\n onClick={utilLink.onClick}\n className='flex items-center justify-center rounded-md size-8 text-sidebar-foreground hover:bg-sidebar-accent transition-colors cursor-pointer'\n aria-label={utilLink.label}\n >\n {utilLink.icon}\n </button>\n </Tooltip>\n ),\n )}\n </div>\n\n {/* 유저 아바타 */}\n {username && (\n <div className='flex items-center justify-center pt-3 pb-5 shrink-0 w-full'>\n <Avatar\n shape='square'\n size='lg'\n fallback={username}\n className='rounded-full'\n />\n </div>\n )}\n </div>\n\n {/* ── 우측 콘텐츠 패널 ─────────────────────────────────────────────────── */}\n <div\n className={cn(\n 'flex flex-col flex-1 h-full min-h-0 min-w-0',\n !isPanelOpen && 'hidden',\n )}\n >\n {/* 헤더 */}\n <div className='flex flex-col shrink-0 w-full'>\n <div className='flex flex-col items-start justify-center p-2'>\n <div\n className='flex items-center justify-between pl-2 pr-0.5 py-2 w-full'\n style={{ height: '36px' }}\n >\n <span className='text-sm font-semibold leading-5 text-foreground tracking-tight'>\n {sectionTitle}\n </span>\n <button\n type='button'\n aria-label='패널 닫기'\n onClick={() => setIsPanelOpen(false)}\n className='flex items-center justify-center p-2 rounded-lg text-sidebar-foreground hover:bg-sidebar-accent transition-colors cursor-pointer'\n >\n <PanelLeftIcon className='size-4' />\n </button>\n </div>\n </div>\n </div>\n\n {/* 메인 콘텐츠 */}\n <div className='flex flex-col flex-1 min-h-0'>\n {/* 메인 메뉴 */}\n <div className='flex flex-col p-2 shrink-0 w-full'>\n <div className='flex flex-col gap-0.5'>\n {navGroups.map((group, gi) => (\n <React.Fragment key={gi}>\n {gi > 0 && <div className='h-2' />}\n {group.map((item) => (\n <div\n key={item.href}\n className={cn('rounded-md', item.isActive && 'bg-accent')}\n >\n {link({\n href: item.href,\n onClick: item.onClick,\n className:\n 'flex gap-2 h-8 items-center p-2 rounded-md hover:bg-sidebar-accent transition-colors',\n children: (\n <>\n {item.icon}\n <span className='flex-1 min-w-0 text-sm font-normal leading-5 tracking-tight overflow-hidden text-ellipsis whitespace-nowrap text-foreground'>\n {item.label}\n </span>\n </>\n ),\n })}\n </div>\n ))}\n </React.Fragment>\n ))}\n </div>\n </div>\n\n {/* 즐겨찾기 + 태스크 목록 */}\n {showTaskSection && (\n <div className='flex flex-col flex-1 min-h-0 p-2'>\n {/* 즐겨찾기 섹션 */}\n {favoriteTasks.length > 0 && (\n <div className='flex flex-col shrink-0'>\n <div className='flex h-8 items-center px-2 opacity-70 shrink-0'>\n <span className='text-xs font-normal leading-xs tracking-tight text-sidebar-foreground overflow-hidden text-ellipsis whitespace-nowrap'>\n 즐겨찾기\n </span>\n </div>\n <div className='flex flex-col'>\n {favoriteTasks.map((item) => {\n const isActive = item.id === activeTaskId;\n return (\n <TaskRow\n key={item.id}\n item={item}\n isActive={isActive}\n renderLink={link}\n onToggleFavorite={() => onToggleFavorite?.(item.id)}\n onStartRename={() => startRename(item.id, item.title)}\n onDelete={() => onDeleteTask?.(item.id)}\n />\n );\n })}\n </div>\n </div>\n )}\n\n {/* 태스크 목록 섹션 */}\n <div className='flex flex-col flex-1 min-h-0'>\n <button\n className='group flex gap-2 h-8 items-center px-2 rounded-md transition-colors cursor-pointer w-full shrink-0'\n onClick={() => setIsHistoryOpen((prev) => !prev)}\n >\n <span className='flex-1 min-w-0 text-xs font-normal leading-xs tracking-tight overflow-hidden text-ellipsis whitespace-nowrap text-left opacity-70'>\n <span className='text-sidebar-foreground group-hover:hidden'>\n {taskSectionTitle}\n </span>\n <span className='hidden group-hover:inline text-sidebar-foreground'>\n {isHistoryOpen ? taskSectionHide : taskSectionShow}\n </span>\n </span>\n </button>\n\n {isHistoryOpen && (\n <div className='relative flex-1 min-h-0'>\n <div className='flex flex-col gap-0.5 h-full overflow-y-auto [&::-webkit-scrollbar]:hidden [scrollbar-width:none]'>\n {regularTasks.length === 0 && (\n <p className='px-2 py-1 text-sm leading-5 tracking-tight text-muted-foreground'>\n {taskEmptyMessage}\n </p>\n )}\n {regularTasks.map((item) => {\n const isActive = item.id === activeTaskId;\n return (\n <TaskRow\n key={item.id}\n item={item}\n isActive={isActive}\n renderLink={link}\n onToggleFavorite={() => onToggleFavorite?.(item.id)}\n onStartRename={() =>\n startRename(item.id, item.title)\n }\n onDelete={() => onDeleteTask?.(item.id)}\n />\n );\n })}\n </div>\n <div className='absolute bottom-0 left-0 right-0 h-8 bg-gradient-to-t from-background to-transparent pointer-events-none' />\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n </div>\n\n {/* ── 이름 변경 다이얼로그 ─────────────────────────────────────────────── */}\n {renamingId !== null && (\n <div\n className='fixed inset-0 z-50 flex items-center justify-center'\n style={{\n backgroundColor: 'rgba(214,214,218,0.3)',\n backdropFilter: 'blur(3px)',\n }}\n onClick={() => setRenamingId(null)}\n >\n <div\n className='bg-background rounded-2xl shadow-lg p-6 flex flex-col gap-4'\n style={{ width: '460px' }}\n onClick={(e) => e.stopPropagation()}\n >\n <h2 className='text-lg font-semibold tracking-tight text-foreground'>\n 대화 이름 변경\n </h2>\n <input\n autoFocus\n value={renameValue}\n onChange={(e) => setRenameValue(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') commitRename();\n if (e.key === 'Escape') setRenamingId(null);\n }}\n className='h-9 w-full rounded-md border border-border bg-background px-3 text-sm tracking-tight text-foreground outline-none transition-colors focus:border-ring'\n />\n <div className='flex items-center justify-end gap-2'>\n <button\n type='button'\n onClick={() => setRenamingId(null)}\n className='h-9 px-4 rounded-lg border border-border bg-background text-sm font-medium tracking-tight text-foreground transition-colors hover:bg-muted/60 active:scale-97 cursor-pointer'\n >\n 취소\n </button>\n <button\n type='button'\n onClick={commitRename}\n className='h-9 px-4 rounded-lg bg-primary text-sm font-medium tracking-tight text-primary-foreground shadow-button transition-colors hover:bg-primary/90 active:scale-97 cursor-pointer'\n >\n 저장\n </button>\n </div>\n </div>\n </div>\n )}\n </aside>\n );\n}\n","import { cn } from \"@/lib/utils\";\n\n/**\n * Panel-left icon — SVG downloaded directly from Figma design system.\n * Uses stroke=\"currentColor\" for CSS color control.\n * Source: Figma node 616-3399, stroke-width: 1.25\n */\nexport function PanelLeftIcon({ className }: { className?: string }) {\n return (\n <svg\n viewBox=\"-1.5 -1.5 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n className={cn(\"shrink-0\", className)}\n >\n <path d=\"M4.5 0.5V12.5M1.83333 0.5H11.1667C11.903 0.5 12.5 1.09695 12.5 1.83333V11.1667C12.5 11.903 11.903 12.5 11.1667 12.5H1.83333C1.09695 12.5 0.5 11.903 0.5 11.1667V1.83333C0.5 1.09695 1.09695 0.5 1.83333 0.5Z\" />\n </svg>\n );\n}\n","import { cn } from \"@/lib/utils\";\n\ninterface StarIconProps {\n className?: string;\n filled?: boolean;\n}\n\n/**\n * Star icon — SVG downloaded directly from Figma design system.\n * Uses stroke=\"currentColor\" for CSS color control.\n * Source: figma.com/design/bNKDIZZAm8ByouCPBnlEye node 128:2564 (lucide/star)\n */\nexport function StarIcon({ className, filled }: StarIconProps) {\n return (\n <svg\n viewBox=\"-1.25 -1.74 24 24\"\n fill={filled ? \"currentColor\" : \"none\"}\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n aria-hidden\n className={cn(\"shrink-0\", className)}\n >\n <path d=\"M10.75 0.75L13.84 7.01L20.75 8.02L15.75 12.89L16.93 19.77L10.75 16.52L4.57002 19.77L5.75002 12.89L0.750022 8.02L7.66002 7.01L10.75 0.75Z\" />\n </svg>\n );\n}\n","import { cn } from \"@/lib/utils\";\n\ninterface PenLineIconProps {\n className?: string;\n}\n\n/**\n * Pen-line icon — SVG downloaded directly from Figma design system.\n * Uses stroke=\"currentColor\" for CSS color control.\n * Source: figma.com/design/bNKDIZZAm8ByouCPBnlEye node 4798:68154 (lucide/pen-line)\n */\nexport function PenLineIcon({ className }: PenLineIconProps) {\n return (\n <svg\n viewBox=\"-2.25 -2.75 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n aria-hidden\n className={cn(\"shrink-0\", className)}\n >\n <path d=\"M9.74902 17.7498H18.749M14.125 1.37173C14.5231 0.973645 15.063 0.75 15.626 0.75C16.189 0.75 16.7289 0.973645 17.127 1.37173C17.5251 1.76982 17.7487 2.30975 17.7487 2.87273C17.7487 3.43572 17.5251 3.97564 17.127 4.37373L5.117 16.3847C4.8791 16.6226 4.58502 16.7967 4.262 16.8907L1.39 17.7287C1.30395 17.7538 1.21274 17.7553 1.12591 17.7331C1.03908 17.7108 0.959827 17.6657 0.896447 17.6023C0.833066 17.5389 0.787889 17.4597 0.765643 17.3728C0.743398 17.286 0.744903 17.1948 0.77 17.1087L1.608 14.2367C1.70222 13.9141 1.87625 13.6204 2.114 13.3827L14.125 1.37173Z\" />\n </svg>\n );\n}\n","import { cn } from \"@/lib/utils\";\n\ninterface TrashIconProps {\n className?: string;\n}\n\n/**\n * Trash icon — SVG downloaded directly from Figma design system.\n * Uses stroke=\"currentColor\" for CSS color control.\n * Source: figma.com/design/bNKDIZZAm8ByouCPBnlEye node 128:2740 (lucide/trash)\n */\nexport function TrashIcon({ className }: TrashIconProps) {\n return (\n <svg\n viewBox=\"-2.25 -1.25 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n aria-hidden\n className={cn(\"shrink-0\", className)}\n >\n <path d=\"M0.75 4.75H18.75M16.75 4.75V18.75C16.75 19.75 15.75 20.75 14.75 20.75H4.75C3.75 20.75 2.75 19.75 2.75 18.75V4.75M5.75 4.75V2.75C5.75 1.75 6.75 0.75 7.75 0.75H11.75C12.75 0.75 13.75 1.75 13.75 2.75V4.75\" />\n </svg>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { Slider as SliderPrimitive } from \"radix-ui\";\n\nimport { cn } from \"@/lib/utils\";\n\n// ─── Slider ───────────────────────────────────────────────────────────────────\n// · defaultValue={[50]} → Thumb 1개 (단일 슬라이더)\n// · defaultValue={[200, 800]} → Thumb 2개 (범위 슬라이더)\n//\n// 값 툴팁:\n// - hover → 해당 thumb 인덱스만 표시\n// - drag → 움직인 thumb 인덱스만 표시 (이전 값과 비교해 변경된 인덱스 특정)\n// - 드래그 종료(onValueCommit) 후 600ms → 해당 thumb 툴팁 숨김\n\nconst Slider = React.forwardRef<\n React.ElementRef<typeof SliderPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof SliderPrimitive.Root>\n>(\n (\n {\n className,\n defaultValue,\n value: valueProp,\n min = 0,\n max = 100,\n onValueChange,\n onValueCommit,\n ...props\n },\n ref,\n ) => {\n // 표시용 값 — 외부 제어든 내부 상태든 항상 동기화\n const [displayValues, setDisplayValues] = React.useState<number[]>(\n valueProp ?? defaultValue ?? [0],\n );\n\n // 툴팁을 표시할 thumb 인덱스 집합 (여러 thumb 독립 제어)\n const [visibleSet, setVisibleSet] = React.useState<Set<number>>(new Set());\n\n // thumb 별 hide 타이머 (인덱스 → 타이머 ID)\n const hideTimers = React.useRef<Map<number, ReturnType<typeof setTimeout>>>(new Map());\n\n // 외부 value prop 동기화\n React.useEffect(() => {\n if (valueProp !== undefined) setDisplayValues(valueProp);\n }, [valueProp]);\n\n // cleanup\n React.useEffect(\n () => () => hideTimers.current.forEach((t) => clearTimeout(t)),\n [],\n );\n\n const showThumb = (i: number) => {\n clearTimeout(hideTimers.current.get(i));\n hideTimers.current.delete(i);\n setVisibleSet((prev) => new Set(prev).add(i));\n };\n\n const hideThumb = (i: number, delay = 300) => {\n clearTimeout(hideTimers.current.get(i));\n const t = setTimeout(() => {\n setVisibleSet((prev) => {\n const next = new Set(prev);\n next.delete(i);\n return next;\n });\n }, delay);\n hideTimers.current.set(i, t);\n };\n\n const prevValuesRef = React.useRef<number[]>(displayValues);\n\n const handleValueChange = (newVals: number[]) => {\n // 변경된 thumb 인덱스만 툴팁 표시\n newVals.forEach((v, i) => {\n if (v !== prevValuesRef.current[i]) showThumb(i);\n });\n prevValuesRef.current = newVals;\n setDisplayValues(newVals);\n onValueChange?.(newVals);\n };\n\n const handleValueCommit = (newVals: number[]) => {\n // 드래그 종료 후 600ms 뒤 모든 thumb 툴팁 숨기기\n newVals.forEach((_, i) => hideThumb(i, 600));\n onValueCommit?.(newVals);\n };\n\n const thumbCount = displayValues.length;\n\n return (\n <SliderPrimitive.Root\n ref={ref}\n data-slot=\"slider\"\n defaultValue={valueProp === undefined ? defaultValue : undefined}\n value={valueProp !== undefined ? valueProp : undefined}\n min={min}\n max={max}\n onValueChange={handleValueChange}\n onValueCommit={handleValueCommit}\n className={cn(\n \"relative flex w-full touch-none select-none items-center\",\n \"data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n className,\n )}\n {...props}\n >\n {/* Track */}\n <SliderPrimitive.Track\n data-slot=\"slider-track\"\n className=\"relative h-1.5 w-full grow overflow-hidden rounded-full bg-muted\"\n >\n <SliderPrimitive.Range\n data-slot=\"slider-range\"\n className={cn(\n \"absolute h-full bg-primary\",\n thumbCount > 1 ? \"rounded-full\" : \"rounded-l-full\",\n )}\n />\n </SliderPrimitive.Track>\n\n {/* Thumbs — 각 thumb 안에 툴팁 자식으로 렌더 (thumb 중앙 기준 정렬) */}\n {displayValues.map((val, i) => (\n <SliderPrimitive.Thumb\n key={`thumb-${i}`}\n data-slot=\"slider-thumb\"\n onMouseEnter={() => showThumb(i)}\n onMouseLeave={() => hideThumb(i, 300)}\n className={cn(\n \"relative block size-5 shrink-0 rounded-full overflow-visible\",\n \"border border-primary bg-background\",\n \"ring-offset-background transition-colors\",\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\n )}\n >\n {/* 값 툴팁 — 해당 thumb 만 독립적으로 표시/숨김 */}\n <div\n aria-hidden\n className={cn(\n \"pointer-events-none absolute bottom-full left-1/2 -translate-x-1/2 mb-2\",\n \"flex flex-col items-center\",\n \"z-10 transition-opacity duration-150\",\n visibleSet.has(i) ? \"opacity-100\" : \"opacity-0\",\n )}\n >\n {/* 버블 — tooltip.tsx TooltipContent 버블과 동일한 스타일 */}\n <span className=\"block rounded-md bg-primary px-2.5 py-1.5 text-xs font-normal leading-snug tracking-tight text-primary-foreground whitespace-nowrap\">\n {val}\n </span>\n {/* 화살표 — tooltip.tsx 와 동일한 Figma SVG path (sm = 20px) */}\n <svg\n width=\"20\"\n height=\"5\"\n viewBox=\"0 0 20 5\"\n fill=\"none\"\n preserveAspectRatio=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"-mt-px shrink-0\"\n aria-hidden\n >\n <path\n d=\"M9.29289 4.29289L5 0H15L10.7071 4.29289C10.3166 4.68342 9.68342 4.68342 9.29289 4.29289Z\"\n className=\"fill-primary\"\n />\n </svg>\n </div>\n </SliderPrimitive.Thumb>\n ))}\n </SliderPrimitive.Root>\n );\n },\n);\nSlider.displayName = SliderPrimitive.Root.displayName;\n\nexport { Slider };\n","import React from \"react\";\nimport { cn } from \"@/lib/utils\";\nimport { Icon } from \"@/components/ui/icon\";\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport interface StepperStep {\n /** key prop으로 사용되는 고유 식별자 */\n id: string;\n label: string;\n}\n\nexport interface StepperProps {\n steps: StepperStep[];\n /**\n * 현재 진행 중인 step의 0-based 인덱스.\n * 이 인덱스 이전 step은 complete, 이 인덱스는 current, 이후는 next.\n */\n currentStep: number;\n className?: string;\n}\n\ntype StepStatus = \"complete\" | \"current\" | \"next\";\n\nfunction getStatus(index: number, currentStep: number): StepStatus {\n if (index < currentStep) return \"complete\";\n if (index === currentStep) return \"current\";\n return \"next\";\n}\n\n// ─── CircleCheckFilled ────────────────────────────────────────────────────────\n// success 상태 전용 — blue filled circle + white check stroke\n\nfunction CircleCheckFilled({ className }: { className?: string }) {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={cn(\"shrink-0\", className)}\n aria-hidden\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" className=\"fill-blue-500\" />\n <path\n d=\"m9 12 2 2 4-4\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"stroke-white\"\n />\n </svg>\n );\n}\n\n// ─── Stepper ──────────────────────────────────────────────────────────────────\n\nexport function Stepper({ steps, currentStep, className }: StepperProps) {\n return (\n <div className={cn(\"flex items-center\", className)}>\n {steps.map((step, index) => {\n const status = getStatus(index, currentStep);\n\n return (\n <React.Fragment key={step.id}>\n <div\n className={cn(\n \"flex flex-1 items-center justify-center gap-1.5 rounded-lg px-3 py-3\",\n status === \"current\" && \"bg-blue-50\"\n )}\n >\n {status === \"complete\" ? (\n <CircleCheckFilled />\n ) : (\n <Icon\n name=\"circle-check\"\n className={cn(\n \"size-4\",\n status === \"current\" ? \"text-blue-700\" : \"text-muted-foreground\"\n )}\n />\n )}\n <span\n className={cn(\n \"whitespace-nowrap text-sm tracking-tight\",\n status === \"current\"\n ? \"font-medium text-blue-700\"\n : status === \"next\"\n ? \"font-normal text-muted-foreground\"\n : \"font-medium text-foreground\"\n )}\n >\n {step.label}\n </span>\n </div>\n\n {index < steps.length - 1 && (\n <div className=\"flex h-6 w-16 shrink-0 items-center\">\n <div className=\"h-px w-full bg-border\" />\n </div>\n )}\n </React.Fragment>\n );\n })}\n </div>\n );\n}\n","\"use client\";\n\nimport React from \"react\";\nimport { Switch as SwitchPrimitive } from \"radix-ui\";\nimport { cn } from \"@/lib/utils\";\n\n// ─── Switch ───────────────────────────────────────────────────────────────────\n// Figma: w-44px h-24px pill — checked: bg-foreground, unchecked: bg-input\n// Thumb: size-20px, 흰색 원, left-2px(unchecked) / left-22px(checked)\n\nconst Switch = React.forwardRef<\n React.ElementRef<typeof SwitchPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof SwitchPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <SwitchPrimitive.Root\n ref={ref}\n className={cn(\n // 크기 — Figma: w-44px h-24px\n \"inline-flex h-6 w-11 shrink-0 cursor-pointer items-center rounded-full\",\n // 색상 — 미체크: bg-input, 체크: bg-foreground\n \"bg-input transition-colors data-[state=checked]:bg-foreground\",\n // 포커스\n \"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\n // 비활성\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n className\n )}\n {...props}\n >\n <SwitchPrimitive.Thumb\n className={cn(\n // 크기 — Figma: size-20px\n \"pointer-events-none block size-5 rounded-full bg-background\",\n // 위치 전환: 미체크 → 2px, 체크 → 22px\n \"transition-transform data-[state=checked]:translate-x-5.5 data-[state=unchecked]:translate-x-0.5\"\n )}\n />\n </SwitchPrimitive.Root>\n));\nSwitch.displayName = SwitchPrimitive.Root.displayName;\n\n// ─── SwitchField ──────────────────────────────────────────────────────────────\n// 가로 레이아웃: [레이블 + 설명] (flex-1) | [Switch]\n// Figma \"Switch\" 패턴 — 설정 항목 토글\n\nexport interface SwitchFieldProps\n extends React.ComponentPropsWithoutRef<typeof SwitchPrimitive.Root> {\n /** 레이블 텍스트 */\n label: string;\n /** 보조 설명 (선택) */\n description?: string;\n className?: string;\n}\n\nfunction SwitchField({ label, description, className, id, ...props }: SwitchFieldProps) {\n return (\n <div className={cn(\"flex items-start gap-3\", className)}>\n {/* 텍스트 영역 */}\n <div className=\"flex flex-1 flex-col gap-1.5\">\n <label\n htmlFor={id}\n className=\"cursor-pointer pb-0.5 text-sm font-medium tracking-tight text-foreground\"\n >\n {label}\n </label>\n {description && (\n <p className=\"text-sm tracking-tight text-muted-foreground\">\n {description}\n </p>\n )}\n </div>\n\n {/* Switch */}\n <Switch id={id} className=\"shrink-0\" {...props} />\n </div>\n );\n}\n\nexport { Switch, SwitchField };\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"@/lib/utils\";\n\n/**\n * 사용자 메시지 말풍선.\n * 텍스트가 한 줄이면 rounded-full, 두 줄 이상이면 rounded-2xl.\n * leading-6 = 24px 기준으로 28px 초과 여부로 판별.\n */\nexport function UserMessageBubble({ content }: { content: string }) {\n const textRef = React.useRef<HTMLParagraphElement>(null);\n const [multiLine, setMultiLine] = React.useState(false);\n\n React.useEffect(() => {\n const el = textRef.current;\n if (!el) return;\n const check = () => setMultiLine(el.offsetHeight > 28);\n check();\n const ro = new ResizeObserver(check);\n ro.observe(el);\n return () => ro.disconnect();\n }, [content]);\n\n return (\n <div className=\"flex items-end justify-end w-full\">\n <div\n className={cn(\n \"bg-secondary px-4 py-3 max-w-130\",\n multiLine ? \"rounded-2xl\" : \"rounded-full\",\n )}\n >\n <p\n ref={textRef}\n className=\"text-base leading-6 tracking-tight text-foreground\"\n >\n {content}\n </p>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { TooltipProvider } from \"@/components/ui/tooltip\";\n\n/**\n * 디자인 시스템 전역 Provider 묶음.\n * layout.tsx (Server Component) 안에서 children을 감싸는 용도.\n *\n * 현재 포함된 Provider:\n * - TooltipProvider: Radix Tooltip 전역 설정\n * · delayDuration — hover → open 지연 시간 (ms)\n * · skipDelayDuration — 빠르게 연속 이동 시 딜레이 스킵 임계치 (ms)\n */\nexport function Providers({ children }: { children: React.ReactNode }) {\n return (\n <TooltipProvider delayDuration={200} skipDelayDuration={300}>\n {children}\n </TooltipProvider>\n );\n}\n","export function RyaiLogoIcon() {\n return (\n <div className='flex size-10 shrink-0 items-center justify-center rounded-lg bg-sidebar-primary'>\n <div className='relative size-6 overflow-clip shrink-0'>\n <svg\n className='-translate-x-1/2 absolute left-[calc(50%+0.5px)] top-[12.5%] bottom-[12.5%] w-3.75'\n viewBox='0 0 15 18'\n fill='none'\n preserveAspectRatio='none'\n xmlns='http://www.w3.org/2000/svg'\n aria-hidden\n >\n <path\n d='M2.0625 17.9568C1.5 17.9568 1.01564 17.7837 0.609377 17.4375C0.203126 17.0625 0 16.6299 0 16.1394V2.8125C0 1.97597 0.28125 1.29807 0.84375 0.778845C1.43752 0.25962 2.21875 0 3.1875 0H7.875C9.7814 0 11.3125 0.519225 12.4688 1.55769C13.6563 2.59615 14.25 3.89422 14.25 5.45193C14.25 6.375 13.9844 7.24035 13.4531 8.0481C12.922 8.8557 12.1563 9.50475 11.1562 9.99525C11.5937 10.1972 11.9845 10.4712 12.3281 10.8172C12.7031 11.1634 13 11.5818 13.2187 12.072L14.7656 15.3606C14.9219 15.7068 15 15.9951 15 16.226C15 16.7453 14.7813 17.178 14.3438 17.524C13.9064 17.8414 13.4219 18 12.8906 18C12.547 18 12.2031 17.9135 11.8594 17.7405C11.5469 17.5672 11.2969 17.2933 11.1094 16.9182L9.32812 12.9807C9.01562 12.2885 8.59374 11.7981 8.06249 11.5095C7.56249 11.1923 6.96874 11.0337 6.28124 11.0337H5.06249C4.43749 11.0337 4.12501 11.3222 4.12501 11.899V16.1394C4.12501 16.6299 3.9219 17.0625 3.51563 17.4375C3.10938 17.7837 2.625 17.9568 2.0625 17.9568ZM4.82812 7.78845H7.68749C8.4689 7.78845 9.07828 7.58655 9.51562 7.18275C9.98437 6.7788 10.2187 6.25965 10.2187 5.625C10.2187 4.96153 9.98437 4.44231 9.51562 4.06731C9.07828 3.66347 8.4689 3.46155 7.68749 3.46155H4.82812C4.35938 3.46155 4.12501 3.67788 4.12501 4.11057V7.1394C4.12501 7.57215 4.35938 7.78845 4.82812 7.78845Z'\n fill='var(--sidebar-primary-foreground)'\n />\n </svg>\n </div>\n </div>\n );\n}\n","// Claude (Anthropic) icon — Figma node 3512:10198\n// /public/icons/claude.svg (피그마에서 다운로드)\n// Figma layout: -translate-x-1/2 absolute aspect-[12/12] bottom-[6.25%] left-1/2 top-[6.25%]\n\nimport React from \"react\";\nimport { cn } from \"@/lib/utils\";\n\nexport function ClaudeIcon({ className }: { className?: string }) {\n return (\n <div className={cn(\"relative shrink-0 size-4\", className)}>\n <div className=\"-translate-x-1/2 absolute aspect-square left-1/2\" style={{ top: \"6.25%\", bottom: \"6.25%\" }}>\n {/* eslint-disable-next-line @next/next/no-img-element */}\n <img\n alt=\"\"\n aria-hidden\n src=\"/icons/claude.svg\"\n className=\"absolute block max-w-none size-full\"\n />\n </div>\n </div>\n );\n}\n","// DeepSeek icon — Figma node 3512:10200\n// /public/icons/deepseek.svg (피그마에서 다운로드)\n// Figma layout: absolute inset-[18.75%_6.25%] (top/bottom 3px, left/right 1px in 16px container)\n\nimport React from \"react\";\nimport { cn } from \"@/lib/utils\";\n\nexport function DeepSeekIcon({ className }: { className?: string }) {\n return (\n <div className={cn(\"relative shrink-0 size-4\", className)}>\n <div className=\"absolute\" style={{ inset: \"18.75% 6.25%\" }}>\n {/* eslint-disable-next-line @next/next/no-img-element */}\n <img\n alt=\"\"\n aria-hidden\n src=\"/icons/deepseek.svg\"\n className=\"absolute block max-w-none size-full\"\n />\n </div>\n </div>\n );\n}\n","// Gemini icon — Figma node 3512:10201\n// /public/icons/gemini.svg (피그마에서 다운로드)\n\nimport React from \"react\";\nimport { cn } from \"@/lib/utils\";\n\nexport function GeminiIcon({ className }: { className?: string }) {\n return (\n // 16×16 wrapper, 피그마 기준 inset 없음 (viewBox=0 0 16 16)\n <div className={cn(\"relative shrink-0 size-4 overflow-hidden\", className)}>\n {/* eslint-disable-next-line @next/next/no-img-element */}\n <img\n alt=\"\"\n aria-hidden\n src=\"/icons/gemini.svg\"\n className=\"absolute block size-full\"\n />\n </div>\n );\n}\n","// Google icon — Figma node 3003:3042\n// /public/icons/google.svg + /public/icons/google-mask.svg (피그마에서 다운로드)\n// Figma layout: overflow-clip → clip path group → mask-alpha + mask-size 12.728×13\n\nimport React from \"react\";\nimport { cn } from \"@/lib/utils\";\n\nexport function GoogleIcon({ className }: { className?: string }) {\n return (\n // overflow-hidden으로 경계 밖 크롭\n <div className={cn(\"overflow-hidden relative shrink-0 size-4\", className)}>\n {/* Clip path group — inset 9.38% 10.23% from Figma */}\n <div className=\"absolute\" style={{ inset: \"9.38% 10.23%\" }}>\n {/* mask-alpha: google-mask.svg로 'G' 모양 클리핑 */}\n <div\n className=\"absolute\"\n style={{\n inset: \"9.03% 9.63% 8.78% 9.63%\",\n maskImage: \"url('/icons/google-mask.svg')\",\n WebkitMaskImage: \"url('/icons/google-mask.svg')\",\n maskSize: \"12.728px 13px\",\n WebkitMaskSize: \"12.728px 13px\",\n maskRepeat: \"no-repeat\",\n WebkitMaskRepeat: \"no-repeat\",\n maskPosition: \"0.095px 0.056px\",\n WebkitMaskPosition: \"0.095px 0.056px\",\n maskMode: \"alpha\",\n }}\n >\n <div className=\"absolute\" style={{ inset: \"-0.29%\" }}>\n {/* eslint-disable-next-line @next/next/no-img-element */}\n <img\n alt=\"\"\n aria-hidden\n src=\"/icons/google.svg\"\n className=\"block max-w-none size-full\"\n />\n </div>\n </div>\n </div>\n </div>\n );\n}\n","// OpenAI icon — Figma node 3512:10197\n// /public/icons/openai.svg (피그마에서 다운로드)\n// Figma layout: -translate-x-1/2 absolute aspect-[12/12] bottom-[6.25%] left-1/2 top-[6.25%]\n\nimport React from \"react\";\nimport { cn } from \"@/lib/utils\";\n\nexport function OpenAiIcon({ className }: { className?: string }) {\n return (\n <div className={cn(\"relative shrink-0 size-4\", className)}>\n <div className=\"-translate-x-1/2 absolute aspect-square left-1/2\" style={{ top: \"6.25%\", bottom: \"6.25%\" }}>\n {/* eslint-disable-next-line @next/next/no-img-element */}\n <img\n alt=\"\"\n aria-hidden\n src=\"/icons/openai.svg\"\n className=\"absolute block max-w-none size-full\"\n />\n </div>\n </div>\n );\n}\n","// Upstage (Solar) icon — Figma node 3512:10199\n// /public/icons/upstage.svg (피그마에서 다운로드)\n// Figma layout: -translate-x-1/2 absolute aspect-[10/12] bottom-[6.25%] left-1/2 top-[6.25%]\n\nimport React from \"react\";\nimport { cn } from \"@/lib/utils\";\n\nexport function UpstageIcon({ className }: { className?: string }) {\n return (\n <div className={cn(\"relative shrink-0 size-4\", className)}>\n <div className=\"-translate-x-1/2 absolute left-1/2\" style={{ top: \"6.25%\", bottom: \"6.25%\", aspectRatio: \"10/12\" }}>\n {/* eslint-disable-next-line @next/next/no-img-element */}\n <img\n alt=\"\"\n aria-hidden\n src=\"/icons/upstage.svg\"\n className=\"absolute block max-w-none size-full\"\n />\n </div>\n </div>\n );\n}\n","// AI 에이전트 icon — Figma lucide/aiagent (node 3101:6885)\n// Inline SVG — URL 만료 없음\n\nimport React from \"react\";\nimport { cn } from \"@/lib/utils\";\n\nexport function AiAgentIcon({ className }: { className?: string }) {\n return (\n <svg\n viewBox=\"0 0 19.5002 21.0003\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={cn(\"size-6 shrink-0\", className)}\n aria-hidden\n >\n <path\n d=\"M8.47946 18.7503C7.56995 18.6171 6.69834 18.3505 5.88357 17.9697C5.60883 17.8365 5.16355 17.7793 4.86985 17.846C4.24457 17.9983 3.19296 18.2553 2.3024 18.4647C1.44974 18.6742 0.919194 18.1411 1.12762 17.2843L1.74343 14.7141C1.81922 14.419 1.74343 13.962 1.62027 13.6859C0.86235 12.0867 0.559182 10.2304 0.871824 8.27887C1.47816 4.52813 4.49089 1.4914 8.22366 0.872636C14.3818 -0.126913 19.6304 5.1469 18.6261 11.3346C18.4745 12.2485 18.1998 13.1148 17.8114 13.9049M13.5987 14.7668C13.7576 14.0782 14.7417 14.0782 14.9006 14.7668L14.9014 14.7683L15.0945 15.6184C15.1833 16.0091 15.4905 16.3162 15.8813 16.4052L16.7321 16.599H16.7336C17.4222 16.7579 17.4221 17.742 16.7336 17.901L16.7321 17.9017L15.882 18.0948C15.4913 18.1837 15.1834 18.4909 15.0945 18.8816L14.9014 19.7325L14.9006 19.734C14.7417 20.4224 13.7576 20.4225 13.5987 19.734V19.7325L13.4048 18.8823C13.327 18.5405 13.0823 18.2622 12.7606 18.1386L12.6181 18.0948L11.768 17.9017L11.7664 17.901C11.0779 17.7421 11.0779 16.7579 11.7664 16.599H11.768L12.6181 16.4052L12.7606 16.3622C13.0825 16.2385 13.3271 15.9604 13.4048 15.6184L13.5987 14.7683V14.7668Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n","// AI 빌더 icon — Figma lucide/aibuilder (node 4043:15581)\n// Inline SVG — URL 만료 없음\n\nimport React from \"react\";\nimport { cn } from \"@/lib/utils\";\n\nexport function AiBuilderIcon({ className }: { className?: string }) {\n return (\n <svg\n viewBox=\"0 0 18.6801 21.5001\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={cn(\"size-6 shrink-0\", className)}\n aria-hidden\n >\n <path\n d=\"M9.34003 13.75C4.6 13.75 0.75 16.88 0.75 20.75M17.9301 20.7501C17.9301 19.8401 17.7201 18.9801 17.3301 18.1801M9.34009 10.75C12.1001 10.75 14.3401 8.51 14.3401 5.75C14.3401 2.99 12.1001 0.75 9.34009 0.75C6.58009 0.75 4.34009 2.99 4.34009 5.75C4.34009 8.51 6.58009 10.75 9.34009 10.75ZM17.0901 15.52L16.0101 15.77C15.2401 15.95 14.6301 16.55 14.4501 17.32L14.2001 18.4C14.1801 18.51 14.0101 18.51 13.9801 18.4L13.7301 17.32C13.5501 16.55 12.9501 15.94 12.1801 15.76L11.1001 15.51C10.9901 15.49 10.9901 15.32 11.1001 15.29L12.1801 15.04C12.9501 14.86 13.5601 14.26 13.7401 13.49L13.9901 12.41C14.0101 12.3 14.1801 12.3 14.2101 12.41L14.4601 13.49C14.6401 14.26 15.2401 14.87 16.0101 15.05L17.0901 15.3C17.2001 15.32 17.2001 15.49 17.0901 15.52Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n","// AI 클라우드 icon — Figma lucide/aicloud (node 3101:6899)\n// Inline SVG — URL 만료 없음\n\nimport React from \"react\";\nimport { cn } from \"@/lib/utils\";\n\nexport function AiCloudIcon({ className }: { className?: string }) {\n return (\n <svg\n viewBox=\"0 0 22.5 18.5\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={cn(\"size-6 shrink-0\", className)}\n aria-hidden\n >\n <path\n d=\"M11.775 15.1742H18.1117C20.1214 15.1742 21.75 13.4433 21.75 11.3052C21.75 9.16817 20.1214 7.43726 18.1128 7.43726H17.0733C17.4849 5.48223 16.7772 3.46616 15.2148 2.14579C13.6524 0.826524 11.4726 0.406001 9.4986 1.04067C7.52355 1.67644 6.0525 3.27199 5.63985 5.22703C2.93925 5.22703 0.75 7.45391 0.75 10.2001C0.75 10.7477 0.836994 11.2747 0.997692 11.7674M6.15888 12.1002C5.99203 11.3908 4.95868 11.3908 4.79183 12.1002L4.79104 12.1018L4.58828 12.9777C4.49503 13.3803 4.17243 13.6966 3.76219 13.7883L2.86877 13.988H2.86719C2.14424 14.1517 2.1443 15.1656 2.86719 15.3294L2.86877 15.3302L3.7614 15.5291C4.1716 15.6207 4.49496 15.9372 4.58828 16.3397L4.79104 17.2164L4.79183 17.2179C4.95877 17.9273 5.99202 17.9273 6.15888 17.2179V17.2164L6.36244 16.3405C6.44412 15.9884 6.70108 15.7016 7.03884 15.5742L7.18853 15.5291L8.08115 15.3302L8.08274 15.3294C8.80575 15.1657 8.80575 14.1517 8.08274 13.988H8.08115L7.18853 13.7883L7.03884 13.744C6.70091 13.6166 6.44405 13.33 6.36244 12.9777L6.15888 12.1018V12.1002Z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n","import { cn } from \"@/lib/utils\";\n\n/**\n * AI Datacenter icon — SVG from public/icons/aidatacenter.svg\n * Uses stroke=\"currentColor\" for CSS color control.\n */\nexport function AiDatacenterIcon({ className }: { className?: string }) {\n return (\n <svg\n viewBox=\"0 0 16.7018 17.917\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.25\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n className={cn(\"shrink-0\", className)}\n >\n <path d=\"M15.625 3.125C15.625 4.50571 12.2671 5.625 8.125 5.625C3.98286 5.625 0.625 4.50571 0.625 3.125M15.625 3.125C15.625 1.74429 12.2671 0.625 8.125 0.625C3.98286 0.625 0.625 1.74429 0.625 3.125M15.625 3.125V10.2083M0.625 3.125V14.7917M0.625 14.7917C0.625 15.4547 1.41518 16.0906 2.8217 16.5594C4.22822 17.0283 6.13588 17.2917 8.125 17.2917C8.69035 17.2917 9.24912 17.2704 9.79167 17.2292M0.625 14.7917C0.624849 15.1266 0.826543 15.458 1.21811 15.7664C1.60968 16.0748 2.18313 16.3539 2.90444 16.587C3.62575 16.8201 4.4802 17.0025 5.41708 17.1234C6.35396 17.2443 7.35417 17.3013 8.35833 17.2908M0.625 8.95833C0.625 9.62137 1.41518 10.2573 2.8217 10.7261C4.22822 11.1949 6.13588 11.4583 8.125 11.4583C8.54666 11.4583 8.96466 11.4465 9.375 11.4234M12.8819 12.3222C13.021 11.731 13.8821 11.731 14.0211 12.3222L14.0218 12.3235L14.1908 13.0534C14.2685 13.3889 14.5373 13.6526 14.8792 13.7289L15.6237 13.8953H15.625C16.2275 14.0318 16.2274 14.8767 15.625 15.0132L15.6237 15.0138L14.8798 15.1796C14.538 15.2559 14.2685 15.5197 14.1908 15.8551L14.0218 16.5857L14.0211 16.587C13.882 17.1781 13.021 17.1781 12.8819 16.587V16.5857L12.7123 15.8558C12.6442 15.5623 12.4301 15.3233 12.1486 15.2172L12.0239 15.1796L11.28 15.0138L11.2787 15.0132C10.6762 14.8768 10.6762 14.0318 11.2787 13.8953H11.28L12.0239 13.7289L12.1486 13.692C12.4302 13.5858 12.6443 13.347 12.7123 13.0534L12.8819 12.3235V12.3222Z\" />\n </svg>\n );\n}\n","import { cn } from \"@/lib/utils\";\n\ninterface AlignJustifyIconProps {\n className?: string;\n}\n\n/**\n * align-justify icon — SVG downloaded from Figma Lucide Icon library.\n * Source: figma.com/design/bNKDIZZAm8ByouCPBnlEye node 128:64\n */\nexport function AlignJustifyIcon({ className }: AlignJustifyIconProps) {\n return (\n <svg\n viewBox=\"-2.25 -5.25 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={1.5}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n className={cn(\"shrink-0\", className)}\n >\n <path d=\"M0.75 0.75H18.75M0.75 6.75H18.75M0.75 12.75H18.75\" />\n </svg>\n );\n}\n","import { cn } from \"@/lib/utils\";\n\n/**\n * Align-left icon — SVG downloaded from Figma design system.\n * Source: Figma node (lucide/align-left)\n */\nexport function AlignLeftIcon({ className }: { className?: string }) {\n return (\n <svg\n viewBox=\"0 0 13 9\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n className={cn(\"shrink-0\", className)}\n >\n <path d=\"M12.5 0.5H0.5M8.5 4.5H0.5M9.833 8.5H0.5\" />\n </svg>\n );\n}\n","import { cn } from \"@/lib/utils\";\n\nexport function ArrowDownIcon({ className }: { className?: string }) {\n return (\n <svg\n viewBox=\"-5.54 -5.54 24 24\"\n fill=\"none\"\n className={cn(\"size-4\", className)}\n stroke=\"currentColor\"\n strokeWidth=\"1.25\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M6.45833 0.625V12.2917M6.45833 12.2917L12.2917 6.45833M6.45833 12.2917L0.625 6.45833\" />\n </svg>\n );\n}\n","import { cn } from \"@/lib/utils\";\n\n/**\n * Blockquote icon — SVG downloaded from Figma design system.\n * Source: Figma node (lucide/quote)\n */\nexport function BlockquoteIcon({ className }: { className?: string }) {\n return (\n <svg\n viewBox=\"-1.8334 -2.5 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n aria-hidden\n className={cn(\"shrink-0\", className)}\n >\n <path d=\"M7.23921 8.10008C7.23921 9.42557 8.26764 10.5001 9.53627 10.5001C10.8049 10.5001 11.8333 9.42557 11.8333 8.10008C11.8333 6.7746 10.8049 5.70008 9.53627 5.70008C8.26764 5.70008 7.23921 6.7746 7.23921 8.10008ZM7.23921 8.10008C6.85637 3.70008 8.00488 0.900082 10.302 0.500082M0.572549 8.10008C0.572549 9.42557 1.60098 10.5001 2.86961 10.5001C4.13824 10.5001 5.16667 9.42557 5.16667 8.10008C5.16667 6.7746 4.13824 5.70008 2.86961 5.70008C1.60098 5.70008 0.572549 6.7746 0.572549 8.10008ZM0.572549 8.10008C0.189707 3.70008 1.33822 0.900082 3.63535 0.500082\" />\n </svg>\n );\n}\n","import { cn } from \"@/lib/utils\";\n\n/**\n * Bold icon — SVG downloaded from Figma design system.\n * Source: Figma node (lucide/bold)\n */\nexport function BoldIcon({ className }: { className?: string }) {\n return (\n <svg\n viewBox=\"-3.1667 -2.1667 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n className={cn(\"shrink-0\", className)}\n >\n <path d=\"M0.5 5.83333H6.5C7.20724 5.83333 7.88552 6.11428 8.38562 6.61438C8.88571 7.11448 9.16667 7.79276 9.16667 8.5C9.16667 9.20724 8.88571 9.88552 8.38562 10.3856C7.88552 10.8857 7.20724 11.1667 6.5 11.1667H1.16667C0.989856 11.1667 0.820287 11.0964 0.695262 10.9714C0.570238 10.8464 0.5 10.6768 0.5 10.5V1.16667C0.5 0.989856 0.570238 0.820287 0.695262 0.695262C0.820287 0.570238 0.989856 0.5 1.16667 0.5H5.83333C6.54058 0.5 7.21885 0.780951 7.71895 1.28105C8.21905 1.78115 8.5 2.45942 8.5 3.16667C8.5 3.87391 8.21905 4.55219 7.71895 5.05229C7.21885 5.55238 6.54058 5.83333 5.83333 5.83333\" />\n </svg>\n );\n}\n","import { cn } from \"@/lib/utils\";\n\ninterface BookUpIconProps {\n className?: string;\n}\n\n/**\n * Book-up icon — SVG downloaded directly from Figma design system.\n * Uses stroke=\"currentColor\" for CSS color control.\n * Source: figma.com/design/bNKDIZZAm8ByouCPBnlEye node 128:418 (lucide/book-up)\n */\nexport function BookUpIcon({ className }: BookUpIconProps) {\n return (\n <svg\n viewBox=\"-3.25 -1.25 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n aria-hidden\n className={cn(\"shrink-0\", className)}\n >\n <path d=\"M0.75 18.25V3.25C0.75 2.58696 1.01339 1.95107 1.48223 1.48223C1.95107 1.01339 2.58696 0.75 3.25 0.75H16.75V20.75H3.25C2.58696 20.75 1.95107 20.4866 1.48223 20.0178C1.01339 19.5489 0.75 18.913 0.75 18.25ZM0.75 18.25C0.75 17.587 1.01339 16.9511 1.48223 16.4822C1.95107 16.0134 2.58696 15.75 3.25 15.75H16.75M8.75 11.75V5.75M8.75 5.75L5.75 8.75M8.75 5.75L11.75 8.75\" />\n </svg>\n );\n}\n","import { cn } from \"@/lib/utils\";\n\n/**\n * Circle-check-fill icon — filled circle with white checkmark.\n * SVG downloaded from Figma design system.\n */\nexport function CircleCheckFillIcon({ className }: { className?: string }) {\n return (\n <svg\n viewBox=\"0 0 17.917 17.917\"\n fill=\"none\"\n aria-hidden\n className={cn(\"shrink-0\", className)}\n >\n <path\n d=\"M8.958 16.458C13.1 16.458 16.458 13.1 16.458 8.958C16.458 4.817 13.1 1.458 8.958 1.458C4.817 1.458 1.458 4.817 1.458 8.958C1.458 13.1 4.817 16.458 8.958 16.458Z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M6.458 8.958L8.125 10.625L11.458 7.292\"\n stroke=\"white\"\n strokeWidth={1.5}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n","import { cn } from \"@/lib/utils\";\n\n/**\n * Circle-outline icon — stroke-only circle.\n * SVG downloaded from Figma design system.\n */\nexport function CircleOutlineIcon({ className }: { className?: string }) {\n return (\n <svg\n viewBox=\"0 0 17.917 17.917\"\n fill=\"none\"\n aria-hidden\n className={cn(\"shrink-0\", className)}\n >\n <path\n d=\"M8.958 16.458C13.1 16.458 16.458 13.1 16.458 8.958C16.458 4.817 13.1 1.458 8.958 1.458C4.817 1.458 1.458 4.817 1.458 8.958C1.458 13.1 4.817 16.458 8.958 16.458Z\"\n stroke=\"currentColor\"\n strokeWidth={1.5}\n />\n </svg>\n );\n}\n","import { cn } from \"@/lib/utils\";\n\n/**\n * Code icon — SVG downloaded from Figma design system.\n * Source: Figma node (lucide/code)\n */\nexport function CodeIcon({ className }: { className?: string }) {\n return (\n <svg\n viewBox=\"-0.8334 -2.1666 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n className={cn(\"shrink-0\", className)}\n >\n <path d=\"M11.1667 8.50013L13.8333 5.83347L11.1667 3.1668M3.16667 3.1668L0.5 5.83347L3.16667 8.50013M8.83333 0.500134L5.5 11.1668\" />\n </svg>\n );\n}\n","import { cn } from \"@/lib/utils\";\n\n/**\n * Code-square icon — SVG downloaded from Figma design system.\n * Source: Figma node (lucide/square-code)\n */\nexport function CodeSquareIcon({ className }: { className?: string }) {\n return (\n <svg\n viewBox=\"-1.5 -1.5 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n className={cn(\"shrink-0\", className)}\n >\n <path d=\"M5.16667 4.83333L3.83333 6.5L5.16667 8.16667M7.83333 4.83333L9.16667 6.5L7.83333 8.16667M1.83333 0.5H11.1667C11.903 0.5 12.5 1.09695 12.5 1.83333V11.1667C12.5 11.903 11.903 12.5 11.1667 12.5H1.83333C1.09695 12.5 0.5 11.903 0.5 11.1667V1.83333C0.5 1.09695 1.09695 0.5 1.83333 0.5Z\" />\n </svg>\n );\n}\n","// download icon — Figma node 128:960 (lucide/download)\n// Source: Figma Lucide Icon Library, figma.com/design/bNKDIZZAm8ByouCPBnlEye\n\nimport { cn } from \"@/lib/utils\";\n\nexport function DownloadIcon({ className }: { className?: string }) {\n return (\n <svg\n viewBox=\"-2.25 -2.25 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n aria-hidden\n className={cn(\"shrink-0\", className)}\n >\n <path d=\"M18.75 12.75V16.75C18.75 17.2804 18.5393 17.7891 18.1642 18.1642C17.7891 18.5393 17.2804 18.75 16.75 18.75H2.75C2.21957 18.75 1.71086 18.5393 1.33579 18.1642C0.960714 17.7891 0.75 17.2804 0.75 16.75V12.75M4.75 7.75L9.75 12.75M9.75 12.75L14.75 7.75M9.75 12.75V0.75\" />\n </svg>\n );\n}\n","import { cn } from \"@/lib/utils\";\n\n/**\n * File-code icon — SVG downloaded from Figma design system.\n * Source: public/icons/file-code.svg\n */\nexport function FileCodeIcon({ className }: { className?: string }) {\n return (\n <svg\n viewBox=\"0 0 11.6667 14.3333\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n className={cn(\"shrink-0\", className)}\n >\n <path d=\"M4.5 7.5L3.16667 9.16667L4.5 10.8333M7.16667 7.5L8.5 9.16667L7.16667 10.8333M7.16667 0.5V3.16667C7.16667 3.52029 7.30714 3.85943 7.55719 4.10948C7.80724 4.35952 8.14638 4.5 8.5 4.5H11.1667M7.83333 0.5H1.83333C1.47971 0.5 1.14057 0.640476 0.890524 0.890524C0.640476 1.14057 0.5 1.47971 0.5 1.83333V12.5C0.5 12.8536 0.640476 13.1928 0.890524 13.4428C1.14057 13.6929 1.47971 13.8333 1.83333 13.8333H9.83333C10.187 13.8333 10.5261 13.6929 10.7761 13.4428C11.0262 13.1928 11.1667 12.8536 11.1667 12.5V3.83333L7.83333 0.5Z\" />\n </svg>\n );\n}\n","import { cn } from \"@/lib/utils\";\n\n/**\n * File-search icon — SVG downloaded from Figma design system.\n * Source: public/icons/file-search.svg\n */\nexport function FileSearchIcon({ className }: { className?: string }) {\n return (\n <svg\n viewBox=\"0 0 13 14.3333\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n className={cn(\"shrink-0\", className)}\n >\n <path d=\"M8.5 0.5V3.16667C8.5 3.52029 8.64048 3.85943 8.89052 4.10948C9.14057 4.35952 9.47971 4.5 9.83333 4.5H12.5M2.012 13.1667C2.12874 13.3689 2.29653 13.5369 2.49858 13.6539C2.70063 13.7709 2.92986 13.8327 3.16333 13.8333H11.1667C11.5203 13.8333 11.8594 13.6929 12.1095 13.4428C12.3595 13.1928 12.5 12.8536 12.5 12.5V3.83333L9.16667 0.5H3.16667C2.81304 0.5 2.47391 0.640476 2.22386 0.890524C1.97381 1.14057 1.83333 1.47971 1.83333 1.83333V3.83333M5.16667 11.1667L4.16667 10.1667M4.5 8.5C4.5 9.60457 3.60457 10.5 2.5 10.5C1.39543 10.5 0.5 9.60457 0.5 8.5C0.5 7.39543 1.39543 6.5 2.5 6.5C3.60457 6.5 4.5 7.39543 4.5 8.5Z\" />\n </svg>\n );\n}\n","import { cn } from \"@/lib/utils\";\n\n/**\n * Folder-amber icon — amber-colored folder from Figma design system.\n * Uses <img> to preserve complex gradient fills and filters.\n * Source: public/icons/folder-amber.svg\n */\nexport function FolderAmberIcon({ className }: { className?: string }) {\n // eslint-disable-next-line @next/next/no-img-element\n return <img src=\"/icons/folder-amber.svg\" alt=\"\" aria-hidden className={cn(\"shrink-0\", className)} />;\n}\n","import { cn } from \"@/lib/utils\";\n\n/**\n * Heading icon — SVG downloaded from Figma design system.\n * Source: Figma node (lucide/heading)\n */\nexport function HeadingIcon({ className }: { className?: string }) {\n return (\n <svg\n viewBox=\"-3.5 -2.1667 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n className={cn(\"shrink-0\", className)}\n >\n <path d=\"M0.5 5.83333H8.5M0.5 11.1667V0.5M8.5 11.1667V0.5\" />\n </svg>\n );\n}\n","import { cn } from \"@/lib/utils\";\n\n/**\n * Image icon — SVG downloaded from Figma design system.\n * Source: Figma node (lucide/image)\n */\nexport function ImageIcon({ className }: { className?: string }) {\n return (\n <svg\n viewBox=\"-1.5 -1.5 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n className={cn(\"shrink-0\", className)}\n >\n <path d=\"M12.5 8.49996L10.4427 6.44263C10.1926 6.19267 9.85355 6.05225 9.5 6.05225C9.14645 6.05225 8.80737 6.19267 8.55733 6.44263L2.5 12.5M1.83333 0.5H11.1667C11.903 0.5 12.5 1.09695 12.5 1.83333V11.1667C12.5 11.903 11.903 12.5 11.1667 12.5H1.83333C1.09695 12.5 0.5 11.903 0.5 11.1667V1.83333C0.5 1.09695 1.09695 0.5 1.83333 0.5ZM5.83333 4.5C5.83333 5.23638 5.23638 5.83333 4.5 5.83333C3.76362 5.83333 3.16667 5.23638 3.16667 4.5C3.16667 3.76362 3.76362 3.16667 4.5 3.16667C5.23638 3.16667 5.83333 3.76362 5.83333 4.5Z\" />\n </svg>\n );\n}\n","// import icon — Figma node 128:1476 (lucide/import)\n// Source: Figma Lucide Icon Library, figma.com/design/bNKDIZZAm8ByouCPBnlEye\n\nimport { cn } from \"@/lib/utils\";\n\nexport function ImportIcon({ className }: { className?: string }) {\n return (\n <svg\n viewBox=\"-1.25 -3.25 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n aria-hidden\n className={cn(\"shrink-0\", className)}\n >\n <path d=\"M10.75 0.75V12.75M10.75 12.75L6.75 8.75M10.75 12.75L14.75 8.75M6.75 2.75H2.75C2.21957 2.75 1.71086 2.96071 1.33579 3.33579C0.960714 3.71086 0.75 4.21957 0.75 4.75V14.75C0.75 15.2804 0.960714 15.7891 1.33579 16.1642C1.71086 16.5393 2.21957 16.75 2.75 16.75H18.75C19.2804 16.75 19.7891 16.5393 20.1642 16.1642C20.5393 15.7891 20.75 15.2804 20.75 14.75V4.75C20.75 4.21957 20.5393 3.71086 20.1642 3.33579C19.7891 2.96071 19.2804 2.75 18.75 2.75H14.75\" />\n </svg>\n );\n}\n","import { cn } from \"@/lib/utils\";\n\n/**\n * Indent icon — SVG downloaded from Figma design system.\n * Source: Figma node (lucide/indent)\n */\nexport function IndentIcon({ className }: { className?: string }) {\n return (\n <svg\n viewBox=\"-1.5 -3.5 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n className={cn(\"shrink-0\", className)}\n >\n <path d=\"M0.5 1.83333L3.16667 4.5L0.5 7.16667M12.5 4.5H5.83333M12.5 0.5H5.83333M12.5 8.5H5.83333\" />\n </svg>\n );\n}\n","import { cn } from \"@/lib/utils\";\n\n/**\n * Italic icon — SVG downloaded from Figma design system.\n * Source: Figma node (lucide/italic)\n */\nexport function ItalicIcon({ className }: { className?: string }) {\n return (\n <svg\n viewBox=\"-2.8334 -2.1666 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n className={cn(\"shrink-0\", className)}\n >\n <path d=\"M9.83333 0.500136H3.83333M6.5 11.1668H0.5M7.16667 0.500136L3.16667 11.1668\" />\n </svg>\n );\n}\n","import { cn } from \"@/lib/utils\";\n\nexport function LayersIcon({ className }: { className?: string }) {\n return (\n <svg\n viewBox=\"0 0 14.35 14.33\"\n fill=\"none\"\n className={cn(\"size-4\", className)}\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M13.8335 10.9334L7.72012 13.7068C7.54641 13.786 7.35772 13.827 7.16679 13.827C6.97586 13.827 6.78716 13.786 6.61346 13.7068L0.500123 10.9334M13.8335 7.6001L7.72012 10.3734C7.54641 10.4527 7.35772 10.4937 7.16679 10.4937C6.97586 10.4937 6.78716 10.4527 6.61346 10.3734L0.500123 7.6001M7.7201 0.620238C7.54639 0.541004 7.35769 0.5 7.16677 0.5C6.97584 0.5 6.78714 0.541004 6.61343 0.620238L0.900099 3.22024C0.781798 3.2724 0.681218 3.35784 0.610607 3.46614C0.539996 3.57445 0.502401 3.70095 0.502401 3.83024C0.502401 3.95953 0.539996 4.08603 0.610607 4.19433C0.681218 4.30264 0.781798 4.38808 0.900099 4.44024L6.6201 7.0469C6.79381 7.12614 6.98251 7.16714 7.17343 7.16714C7.36436 7.16714 7.55306 7.12614 7.72677 7.0469L13.4468 4.4469C13.5651 4.39474 13.6656 4.30931 13.7363 4.201C13.8069 4.0927 13.8445 3.9662 13.8445 3.8369C13.8445 3.70761 13.8069 3.58111 13.7363 3.47281C13.6656 3.3645 13.5651 3.27907 13.4468 3.2269L7.7201 0.620238Z\" />\n </svg>\n );\n}\n","import { cn } from \"@/lib/utils\";\n\ninterface LayoutGridIconProps {\n className?: string;\n}\n\n/**\n * layout-grid icon — SVG downloaded from Figma Lucide Icon library.\n * Source: figma.com/design/bNKDIZZAm8ByouCPBnlEye node 128:1554\n */\nexport function LayoutGridIcon({ className }: LayoutGridIconProps) {\n return (\n <svg\n viewBox=\"-2.25 -2.25 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={1.5}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n className={cn(\"shrink-0\", className)}\n >\n <path d=\"M6.75 0.75H1.75C1.19772 0.75 0.75 1.19772 0.75 1.75V6.75C0.75 7.30228 1.19772 7.75 1.75 7.75H6.75C7.30228 7.75 7.75 7.30228 7.75 6.75V1.75C7.75 1.19772 7.30228 0.75 6.75 0.75Z\" />\n <path d=\"M17.75 0.75H12.75C12.1977 0.75 11.75 1.19772 11.75 1.75V6.75C11.75 7.30228 12.1977 7.75 12.75 7.75H17.75C18.3023 7.75 18.75 7.30228 18.75 6.75V1.75C18.75 1.19772 18.3023 0.75 17.75 0.75Z\" />\n <path d=\"M17.75 11.75H12.75C12.1977 11.75 11.75 12.1977 11.75 12.75V17.75C11.75 18.3023 12.1977 18.75 12.75 18.75H17.75C18.3023 18.75 18.75 18.3023 18.75 17.75V12.75C18.75 12.1977 18.3023 11.75 17.75 11.75Z\" />\n <path d=\"M6.75 11.75H1.75C1.19772 11.75 0.75 12.1977 0.75 12.75V17.75C0.75 18.3023 1.19772 18.75 1.75 18.75H6.75C7.30228 18.75 7.75 18.3023 7.75 17.75V12.75C7.75 12.1977 7.30228 11.75 6.75 11.75Z\" />\n </svg>\n );\n}\n","import { cn } from \"@/lib/utils\";\n\n/**\n * Line-chart icon — SVG downloaded from Figma design system.\n * Source: public/icons/line-chart.svg\n */\nexport function LineChartIcon({ className }: { className?: string }) {\n return (\n <svg\n viewBox=\"0 0 13 13\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n className={cn(\"shrink-0\", className)}\n >\n <path d=\"M0.5 0.5V12.5H12.5M11.1667 4.5L7.83333 7.83333L5.16667 5.16667L3.16667 7.16667\" />\n </svg>\n );\n}\n","import { cn } from \"@/lib/utils\";\n\n/**\n * Link icon — SVG downloaded from Figma design system.\n * Source: Figma node (lucide/link)\n */\nexport function LinkIcon({ className }: { className?: string }) {\n return (\n <svg\n viewBox=\"-0.871 -0.8776 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n className={cn(\"shrink-0\", className)}\n >\n <path d=\"M5.79557 7.78904C6.08187 8.17179 6.44714 8.48849 6.86661 8.71767C7.28607 8.94684 7.74991 9.08312 8.22667 9.11726C8.70344 9.15141 9.18196 9.08262 9.6298 8.91556C10.0776 8.7485 10.4843 8.48709 10.8222 8.14904L12.8222 6.14904C13.4294 5.52037 13.7654 4.67836 13.7578 3.80437C13.7502 2.93038 13.3997 2.09434 12.7816 1.47631C12.1636 0.858284 11.3276 0.507721 10.4536 0.500126C9.57959 0.492531 8.73758 0.828513 8.10891 1.43571L6.96224 2.57571M8.46237 6.45572C8.17607 6.07296 7.8108 5.75626 7.39134 5.52709C6.97188 5.29792 6.50803 5.16164 6.03127 5.12749C5.55451 5.09335 5.07598 5.16214 4.62814 5.3292C4.1803 5.49625 3.77363 5.75767 3.43571 6.09572L1.43571 8.09572C0.828513 8.72439 0.492531 9.5664 0.500126 10.4404C0.507721 11.3144 0.858284 12.1504 1.47631 12.7684C2.09434 13.3865 2.93038 13.737 3.80437 13.7446C4.67836 13.7522 5.52037 13.4162 6.14904 12.809L7.28904 11.669\" />\n </svg>\n );\n}\n","import { cn } from \"@/lib/utils\";\n\n/**\n * List (unordered) icon — SVG downloaded from Figma design system.\n * Source: Figma node (lucide/list)\n */\nexport function ListIcon({ className }: { className?: string }) {\n return (\n <svg\n viewBox=\"-1.5 -3.5 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n className={cn(\"shrink-0\", className)}\n >\n <path d=\"M3.83333 0.5H12.5M3.83333 4.5H12.5M3.83333 8.5H12.5M0.5 0.5H0.506667M0.5 4.5H0.506667M0.5 8.5H0.506667\" />\n </svg>\n );\n}\n","import { cn } from \"@/lib/utils\";\n\n/**\n * List-ordered icon — SVG downloaded from Figma design system.\n * Source: Figma node (lucide/list-ordered)\n */\nexport function ListOrderedIcon({ className }: { className?: string }) {\n return (\n <svg\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n className={cn(\"shrink-0\", className)}\n >\n <path d=\"M7.20655 3.9678H14M7.20655 7.83902H14M7.20655 11.7102H14M3.24525 6.54798V3H2M2 6.54798H4.49049M4.32065 13H2.22053C2.22053 11.0054 4.32065 11.5041 4.32065 10.0081C4.32065 9.26018 3.27059 8.76153 2.22053 9.5095\" />\n </svg>\n );\n}\n","// MyPage icon — Figma lucide/mypage (node 3101:11166 / vector 3101:11161)\n// Inline SVG of stylized \"My\" lettermark — stroke=\"currentColor\", URL 만료 없음\n\nimport React from \"react\";\nimport { cn } from \"@/lib/utils\";\n\nexport function MyPageIcon({ className }: { className?: string }) {\n return (\n <svg\n viewBox=\"0 0 21.5002 15.5006\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={cn(\"size-6 shrink-0\", className)}\n aria-hidden\n >\n <path\n d=\"M0.75 11.6468V0.750065L5.5815 8.76602L10.413 0.750065V11.6468M14.0879 2.83125L17.4458 11.1374M20.75 2.83125C20.75 2.83125 17.6826 10.9954 17.3135 11.9753C16.9444 12.9551 16.5664 14.2253 15.4739 14.6504C14.3814 15.0755 13.3953 14.0035 13.3953 14.0035\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n","import { cn } from \"@/lib/utils\";\n\n/**\n * Outdent icon — SVG downloaded from Figma design system.\n * Source: Figma node (lucide/outdent)\n */\nexport function OutdentIcon({ className }: { className?: string }) {\n return (\n <svg\n viewBox=\"-1.5 -3.5 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n className={cn(\"shrink-0\", className)}\n >\n <path d=\"M3.16667 1.83333L0.5 4.5L3.16667 7.16667M12.5 4.5H5.83333M12.5 0.5H5.83333M12.5 8.5H5.83333\" />\n </svg>\n );\n}\n","// pencil-line icon — Figma node 128:1988 (lucide/pencil-line)\n// Source: Figma Lucide Icon Library, figma.com/design/bNKDIZZAm8ByouCPBnlEye\n\nimport { cn } from \"@/lib/utils\";\n\nexport function PencilLineIcon({ className }: { className?: string }) {\n return (\n <svg\n viewBox=\"-2.25 -2.75 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n aria-hidden\n className={cn(\"shrink-0\", className)}\n >\n <path d=\"M9.74902 17.7498H18.749M12.749 2.74976L15.749 5.74976M14.125 1.37173C14.5231 0.973645 15.063 0.75 15.626 0.75C16.189 0.75 16.7289 0.973645 17.127 1.37173C17.5251 1.76982 17.7487 2.30975 17.7487 2.87273C17.7487 3.43572 17.5251 3.97564 17.127 4.37373L5.117 16.3847C4.8791 16.6226 4.58502 16.7967 4.262 16.8907L1.39 17.7287C1.30395 17.7538 1.21274 17.7553 1.12591 17.7331C1.03908 17.7108 0.959827 17.6657 0.896447 17.6023C0.833066 17.5389 0.787889 17.4597 0.765643 17.3728C0.743398 17.286 0.744903 17.1948 0.77 17.1087L1.608 14.2367C1.70222 13.9141 1.87625 13.6204 2.114 13.3827L14.125 1.37173Z\" />\n </svg>\n );\n}\n","import { cn } from \"@/lib/utils\";\n\n/**\n * Presentation icon — SVG downloaded from Figma design system.\n * Source: Figma node (lucide/presentation)\n */\nexport function PresentationIcon({ className }: { className?: string }) {\n return (\n <svg\n viewBox=\"0 0 14.333 13\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n className={cn(\"shrink-0\", className)}\n >\n <path d=\"M0.5 0.5H13.833M13.167 0.5V7.833C13.167 8.187 13.026 8.526 12.776 8.776C12.526 9.026 12.187 9.167 11.833 9.167H2.5C2.146 9.167 1.807 9.026 1.557 8.776C1.307 8.526 1.167 8.187 1.167 7.833V0.5M3.833 12.5L7.167 9.167L10.5 12.5\" />\n </svg>\n );\n}\n","import { cn } from \"@/lib/utils\";\n\n/**\n * Smile icon — SVG downloaded from Figma design system.\n * Source: public/icons/smile.svg\n */\nexport function SmileIcon({ className }: { className?: string }) {\n return (\n <svg\n viewBox=\"0 0 14.3333 14.3333\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n className={cn(\"shrink-0\", className)}\n >\n <path d=\"M4.5 8.5C4.5 8.5 5.5 9.83333 7.16667 9.83333C8.83333 9.83333 9.83333 8.5 9.83333 8.5M5.16667 5.16667H5.17333M9.16667 5.16667H9.17333M13.8333 7.16667C13.8333 10.8486 10.8486 13.8333 7.16667 13.8333C3.48477 13.8333 0.5 10.8486 0.5 7.16667C0.5 3.48477 3.48477 0.5 7.16667 0.5C10.8486 0.5 13.8333 3.48477 13.8333 7.16667Z\" />\n </svg>\n );\n}\n","import { cn } from \"@/lib/utils\";\n\nexport function SparklesIcon({ className }: { className?: string }) {\n return (\n <svg\n viewBox=\"0 0 17.9171 17.9171\"\n fill=\"none\"\n className={cn(\"size-4\", className)}\n stroke=\"currentColor\"\n strokeWidth=\"1.25\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M15.6238 1.45854V4.79187M17.2904 3.1252H13.9571M2.29045 13.1252V14.7919M3.12378 13.9585H1.45711M7.2379 11.8752C7.1635 11.5868 7.01318 11.3236 6.80258 11.113C6.59198 10.9024 6.32879 10.7521 6.0404 10.6777L0.927896 9.35937C0.840672 9.33462 0.763903 9.28208 0.70924 9.20975C0.654576 9.13741 0.625 9.04921 0.625 8.95854C0.625 8.86787 0.654576 8.77968 0.70924 8.70734C0.763903 8.635 0.840672 8.58247 0.927896 8.55771L6.0404 7.23854C6.32869 7.16421 6.59181 7.01402 6.8024 6.80357C7.01299 6.59313 7.16337 6.33011 7.2379 6.04187L8.55623 0.929374C8.58074 0.841806 8.63322 0.764659 8.70566 0.709703C8.77811 0.654747 8.86655 0.625 8.95748 0.625C9.04841 0.625 9.13685 0.654747 9.20929 0.709703C9.28174 0.764659 9.33422 0.841806 9.35873 0.929374L10.6762 6.04187C10.7506 6.33027 10.9009 6.59346 11.1115 6.80406C11.3221 7.01466 11.5853 7.16498 11.8737 7.23938L16.9862 8.55687C17.0741 8.58112 17.1517 8.63355 17.2069 8.70611C17.2622 8.77866 17.2921 8.86734 17.2921 8.95854C17.2921 9.04974 17.2622 9.13842 17.2069 9.21098C17.1517 9.28353 17.0741 9.33596 16.9862 9.36021L11.8737 10.6777C11.5853 10.7521 11.3221 10.9024 11.1115 11.113C10.9009 11.3236 10.7506 11.5868 10.6762 11.8752L9.3579 16.9877C9.33339 17.0753 9.28091 17.1524 9.20846 17.2074C9.13601 17.2623 9.04758 17.2921 8.95665 17.2921C8.86571 17.2921 8.77728 17.2623 8.70483 17.2074C8.63238 17.1524 8.5799 17.0753 8.5554 16.9877L7.2379 11.8752Z\" />\n </svg>\n );\n}\n","import { cn } from \"@/lib/utils\";\n\n/**\n * Square-check icon (filled) — SVG downloaded from Figma design system.\n * Uses fill=\"currentColor\" for the background rect and white stroke for checkmark.\n */\nexport function SquareCheckIcon({ className }: { className?: string }) {\n return (\n <svg\n viewBox=\"0 0 16.5 16.5\"\n fill=\"none\"\n aria-hidden\n className={cn(\"shrink-0\", className)}\n >\n <rect x=\"0.75\" y=\"0.75\" width=\"15\" height=\"15\" rx=\"1.667\" fill=\"currentColor\" />\n <path\n d=\"M5.75 8.25L7.417 9.917L10.75 6.583\"\n stroke=\"white\"\n strokeWidth={1.5}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n","import { cn } from \"@/lib/utils\";\n\n/**\n * Square-check-outline icon — outlined square with checkmark (task list).\n * SVG downloaded from Figma design system.\n */\nexport function SquareCheckOutlineIcon({ className }: { className?: string }) {\n return (\n <svg\n viewBox=\"-1.5 -1.5 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n className={cn(\"shrink-0\", className)}\n >\n <path d=\"M4.5 6.5L5.83333 7.83333L8.5 5.16667M1.83333 0.5H11.1667C11.903 0.5 12.5 1.09695 12.5 1.83333V11.1667C12.5 11.903 11.903 12.5 11.1667 12.5H1.83333C1.09695 12.5 0.5 11.903 0.5 11.1667V1.83333C0.5 1.09695 1.09695 0.5 1.83333 0.5Z\" />\n </svg>\n );\n}\n","import { cn } from \"@/lib/utils\";\n\n/**\n * Strikethrough icon — SVG downloaded from Figma design system.\n * Source: Figma node (lucide/strikethrough)\n */\nexport function StrikethroughIcon({ className }: { className?: string }) {\n return (\n <svg\n viewBox=\"-2.1667 -2.1667 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n className={cn(\"shrink-0\", className)}\n >\n <path d=\"M8.50007 0.5H3.83341C3.51336 0.499832 3.19794 0.576476 2.91365 0.723491C2.62937 0.870506 2.38452 1.0836 2.19967 1.34487C2.01482 1.60614 1.89537 1.90796 1.85136 2.22497C1.80735 2.54198 1.84006 2.86492 1.94674 3.16667M7.16667 5.83333C7.87391 5.83333 8.55219 6.11428 9.05228 6.61438C9.55238 7.11448 9.83333 7.79276 9.83333 8.5C9.83333 9.20724 9.55238 9.88552 9.05228 10.3856C8.55219 10.8857 7.87391 11.1667 7.16667 11.1667H1.83333M0.5 5.83333H11.1667\" />\n </svg>\n );\n}\n","import { cn } from \"@/lib/utils\";\n\n/**\n * Table-properties icon — SVG downloaded from Figma design system.\n * Source: Figma node (lucide/table-properties)\n */\nexport function TablePropertiesIcon({ className }: { className?: string }) {\n return (\n <svg\n viewBox=\"0 0 13 13\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n className={cn(\"shrink-0\", className)}\n >\n <path d=\"M8.5 0.5V12.5M12.5 4.5H0.5M12.5 8.5H0.5M1.833 0.5H11.167C11.903 0.5 12.5 1.097 12.5 1.833V11.167C12.5 11.903 11.903 12.5 11.167 12.5H1.833C1.097 12.5 0.5 11.903 0.5 11.167V1.833C0.5 1.097 1.097 0.5 1.833 0.5Z\" />\n </svg>\n );\n}\n","import { cn } from \"@/lib/utils\";\n\n/**\n * Wand-sparkles icon — SVG downloaded from Figma design system.\n * Source: public/icons/wand-sparkles.svg\n */\nexport function WandSparklesIcon({ className }: { className?: string }) {\n return (\n <svg\n viewBox=\"0 0 14.3346 14.3354\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n className={cn(\"shrink-0\", className)}\n >\n <path d=\"M8.49935 3.83333L10.4993 5.83333M2.49935 3.16667V5.83333M11.8327 8.5V11.1667M5.83268 0.5V1.83333M3.83268 4.5H1.16602M13.166 9.83333H10.4993M6.49935 1.16667H5.16602M13.5926 1.59336L12.7392 0.74003C12.6642 0.664241 12.5749 0.604077 12.4765 0.563016C12.3781 0.521956 12.2725 0.500814 12.1659 0.500814C12.0593 0.500814 11.9537 0.521956 11.8553 0.563016C11.7569 0.604077 11.6676 0.664241 11.5925 0.74003L0.739216 11.5934C0.663427 11.6684 0.603263 11.7577 0.562202 11.8561C0.521142 11.9545 0.5 12.0601 0.5 12.1667C0.5 12.2733 0.521142 12.3789 0.562202 12.4773C0.603263 12.5757 0.663427 12.665 0.739216 12.74L1.59255 13.5934C1.6671 13.67 1.75624 13.7309 1.85471 13.7724C1.95319 13.814 2.05899 13.8354 2.16588 13.8354C2.27277 13.8354 2.37858 13.814 2.47705 13.7724C2.57553 13.7309 2.66467 13.67 2.73922 13.5934L13.5926 2.74003C13.6692 2.66548 13.73 2.57634 13.7716 2.47787C13.8132 2.37939 13.8346 2.27359 13.8346 2.1667C13.8346 2.05981 13.8132 1.954 13.7716 1.85553C13.73 1.75705 13.6692 1.66791 13.5926 1.59336Z\" />\n </svg>\n );\n}\n","import { cn } from \"@/lib/utils\";\n\n/**\n * Message-circle icon — SVG downloaded directly from Figma design system.\n * Uses stroke=\"currentColor\" for CSS color control.\n * Source: Figma node 616-3399, stroke-width: 1.25\n */\nexport function MessageCircleIcon({ className }: { className?: string }) {\n return (\n <svg\n viewBox=\"0 0 17.0899 17.0899\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.25\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n className={cn(\"shrink-0\", className)}\n >\n <path d=\"M5.54168 14.7982C7.13217 15.6141 8.96175 15.8351 10.7008 15.4214C12.4398 15.0076 13.9738 13.9864 15.0265 12.5417C16.0791 11.097 16.5812 9.32381 16.4422 7.54168C16.3031 5.75956 15.5322 4.08569 14.2682 2.82171C13.0042 1.55773 11.3303 0.78676 9.54822 0.647731C7.76609 0.508701 5.99291 1.01076 4.5482 2.06342C3.10349 3.11609 2.08226 4.65014 1.66854 6.38914C1.25481 8.12815 1.4758 9.95774 2.29168 11.5482L0.625017 16.4649L5.54168 14.7982Z\" />\n </svg>\n );\n}\n","import { cn } from \"@/lib/utils\";\n\n/**\n * Messages-square icon — SVG downloaded directly from Figma design system.\n * Uses stroke=\"currentColor\" for CSS color control.\n * Source: Figma node 616-3399, stroke-width: 1.25\n */\nexport function MessagesSquareIcon({ className }: { className?: string }) {\n return (\n <svg\n viewBox=\"0 0 17.9167 17.9167\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.25\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n className={cn(\"shrink-0\", className)}\n >\n <path d=\"M13.9583 6.45833H15.625C16.067 6.45833 16.4909 6.63393 16.8035 6.94649C17.1161 7.25905 17.2917 7.68297 17.2917 8.125V17.2917L13.9583 13.9583H8.95833C8.51631 13.9583 8.09238 13.7827 7.77982 13.4702C7.46726 13.1576 7.29167 12.7337 7.29167 12.2917V11.4583M10.625 6.45833C10.625 6.90036 10.4494 7.32428 10.1368 7.63684C9.82428 7.9494 9.40036 8.125 8.95833 8.125H3.95833L0.625 11.4583V2.29167C0.625 1.375 1.375 0.625 2.29167 0.625H8.95833C9.40036 0.625 9.82428 0.800595 10.1368 1.11316C10.4494 1.42572 10.625 1.84964 10.625 2.29167V6.45833Z\" />\n </svg>\n );\n}\n","import { cn } from \"@/lib/utils\";\n\n/**\n * Shopping Bag icon — SVG from public/icons/shopping-bag.svg\n * Uses stroke=\"currentColor\" for CSS color control.\n */\nexport function ShoppingBagIcon({ className }: { className?: string }) {\n return (\n <svg\n viewBox=\"0 0 16.25 17.9167\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.25\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n className={cn(\"shrink-0\", className)}\n >\n <path d=\"M0.625 3.95833L3.125 0.625H13.125L15.625 3.95833M0.625 3.95833V15.625C0.625 16.067 0.800595 16.4909 1.11316 16.8035C1.42572 17.1161 1.84964 17.2917 2.29167 17.2917H13.9583C14.4004 17.2917 14.8243 17.1161 15.1368 16.8035C15.4494 16.4909 15.625 16.067 15.625 15.625V3.95833M0.625 3.95833H15.625M11.4583 7.29167C11.4583 8.17572 11.1071 9.02357 10.482 9.64869C9.8569 10.2738 9.00905 10.625 8.125 10.625C7.24094 10.625 6.3931 10.2738 5.76798 9.64869C5.14286 9.02357 4.79167 8.17572 4.79167 7.29167\" />\n </svg>\n );\n}\n"],"mappings":"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","names":["React","jsx","React","jsx","jsxs","jsx","jsxs","React","cva","jsx","cva","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","React","jsx","jsxs","jsx","jsxs","React","jsx","jsxs","React","jsx","ChevronsUpDownIcon","jsx","jsxs","ChevronsUpDownIcon","Fragment","jsx","jsxs","React","jsx","jsxs","_a","_b","React","Fragment","jsx","jsxs","React","React","React","jsx","jsxs","jsx","jsxs","jsx","Fragment","jsxs","React","jsx","jsxs","jsx","jsx","React","PopoverPrimitive","jsx","jsxs","PopoverPrimitive","React","jsx","jsxs","React","DropdownMenu","Popover","jsx","jsx","jsx","jsx","Fragment","jsx","jsxs","DropdownMenu","_a","Popover","React","jsx","jsxs","_a","React","jsx","jsxs","React","React","jsx","jsxs","React","React","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsxs","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsxs","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsx","jsxs","jsx","jsx","jsx","jsx","jsx","jsx","jsx"]}
|