@reopt-ai/opt-ui 1.5.0 → 1.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/COMPONENT_CATALOG.md +178 -50
- package/README.md +28 -7
- package/dist/app.css +170 -0
- package/dist/core/index.cjs +164 -324
- package/dist/core/index.d.cts +3 -6
- package/dist/core/index.d.ts +3 -6
- package/dist/core/index.js +3 -323
- package/dist/docs/01-getting-started.md +25 -5
- package/dist/docs/02-components/01-core.md +36 -28
- package/dist/docs/02-components/02-visuals.md +1 -1
- package/dist/docs/02-components/03-shells.md +144 -23
- package/dist/docs/02-components/04-surfaces.md +1 -1
- package/dist/docs/02-components/index.md +4 -4
- package/dist/docs/03-recipes/03-layouts.md +16 -12
- package/dist/docs/05-migration/01-breaking-changes.md +46 -1
- package/dist/field-sidebar-BTZCBviA.d.cts +1031 -0
- package/dist/field-sidebar-BTZCBviA.d.cts.map +1 -0
- package/dist/field-sidebar-CB8vjvUM.d.ts +1031 -0
- package/dist/field-sidebar-CB8vjvUM.d.ts.map +1 -0
- package/dist/field-sidebar-Cs-J-5VE.js +4233 -0
- package/dist/field-sidebar-Cs-J-5VE.js.map +1 -0
- package/dist/field-sidebar-CzIQX70-.cjs +4561 -0
- package/dist/id-registry.cjs +1939 -1872
- package/dist/id-registry.d.cts +14 -11
- package/dist/id-registry.d.cts.map +1 -0
- package/dist/id-registry.d.ts +14 -11
- package/dist/id-registry.d.ts.map +1 -0
- package/dist/id-registry.js +1937 -1871
- package/dist/id-registry.js.map +1 -0
- package/dist/id-registry.json +113 -28
- package/dist/index.cjs +8380 -9790
- package/dist/index.d.cts +1555 -1442
- package/dist/index.d.cts.map +1 -0
- package/dist/index.d.ts +1555 -1442
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7996 -9778
- package/dist/index.js.map +1 -0
- package/dist/meta.cjs +7753 -6875
- package/dist/meta.d.cts.map +1 -0
- package/dist/meta.d.ts.map +1 -0
- package/dist/meta.js +7752 -6846
- package/dist/meta.js.map +1 -0
- package/dist/pagination-DWbvACuN.js +3850 -0
- package/dist/pagination-DWbvACuN.js.map +1 -0
- package/dist/pagination-DjfxBcjX.cjs +4739 -0
- package/dist/query.cjs +386 -0
- package/dist/query.d.cts +141 -0
- package/dist/query.d.cts.map +1 -0
- package/dist/query.d.ts +141 -0
- package/dist/query.d.ts.map +1 -0
- package/dist/query.js +371 -0
- package/dist/query.js.map +1 -0
- package/dist/shader-surface-BUPZ0P-n.js +3654 -0
- package/dist/shader-surface-BUPZ0P-n.js.map +1 -0
- package/dist/shader-surface-BfTP9c1Q.d.ts +1788 -0
- package/dist/shader-surface-BfTP9c1Q.d.ts.map +1 -0
- package/dist/shader-surface-DRrcLrWf.d.cts +1788 -0
- package/dist/shader-surface-DRrcLrWf.d.cts.map +1 -0
- package/dist/shader-surface-Fav5K9UC.cjs +4041 -0
- package/dist/shells/index.cjs +58 -65
- package/dist/shells/index.d.cts +4 -5
- package/dist/shells/index.d.ts +4 -5
- package/dist/shells/index.js +4 -64
- package/dist/tailwind.css +49 -0
- package/dist/theme/presets/default.css +2 -2
- package/dist/theme/presets/minimal.css +2 -2
- package/dist/theme/presets/mono-dark.css +2 -2
- package/dist/theme/presets/natural.css +1 -1
- package/dist/theme/presets/pro.css +2 -2
- package/dist/theme/server.cjs +257 -228
- package/dist/theme/server.d.cts +48 -60
- package/dist/theme/server.d.cts.map +1 -0
- package/dist/theme/server.d.ts +48 -60
- package/dist/theme/server.d.ts.map +1 -0
- package/dist/theme/server.js +234 -189
- package/dist/theme/server.js.map +1 -0
- package/dist/types-D0FlcYnM.d.cts +301 -0
- package/dist/types-D0FlcYnM.d.cts.map +1 -0
- package/dist/types-D0FlcYnM.d.ts +301 -0
- package/dist/types-D0FlcYnM.d.ts.map +1 -0
- package/dist/visuals/index.cjs +10 -4
- package/dist/visuals/index.d.cts +2 -1
- package/dist/visuals/index.d.ts +2 -1
- package/dist/visuals/index.js +1 -2
- package/package.json +27 -11
- package/dist/chunk-3GWWZKX7.js +0 -38
- package/dist/chunk-3QFYBBL6.cjs +0 -4759
- package/dist/chunk-3XD4HIFL.js +0 -3241
- package/dist/chunk-AFF2HPE5.cjs +0 -5008
- package/dist/chunk-NXZJIHEZ.cjs +0 -3241
- package/dist/chunk-ONE3C5RV.cjs +0 -38
- package/dist/chunk-RBM2RNC2.js +0 -5008
- package/dist/chunk-VBGPEW45.js +0 -4759
- package/dist/index-BZ_lBlO1.d.ts +0 -474
- package/dist/index-BuvxoWHf.d.cts +0 -474
- package/dist/index-DWyqDIkH.d.cts +0 -1689
- package/dist/index-Uyijm14M.d.ts +0 -1689
- package/dist/types-D4-0lwaE.d.cts +0 -298
- package/dist/types-D4-0lwaE.d.ts +0 -298
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shader-surface-BUPZ0P-n.js","names":["Separator","SeparatorPrimitive","sizeStyles","Toggle","TogglePrimitive","ToggleGroup","ToggleGroupPrimitive","AccordionRoot","PrimAccordionRoot","AccordionItem","PrimAccordionItem","AccordionTrigger","PrimAccordionTrigger","AccordionContent","PrimAccordionContent","sizeStyles","variantStyles","sizeStyles","sizeStyles","variantStyles","sizeStyles","Meter","MeterPrimitive","MenuRoot","BaseMenuTrigger","MenuPopover","BaseMenuItem","BaseMenuSeparator","PrimRadioGroupRoot","usePrimRadioGroupContext","Separator","PrimDialogRoot","PrimDialogPanel","PrimDialogDismiss"],"sources":["../src/core/text.tsx","../src/core/heading.tsx","../src/core/separator.tsx","../src/core/otp-field.tsx","../src/core/toggle.tsx","../src/core/accordion.tsx","../src/core/breadcrumb.tsx","../src/core/card.tsx","../src/core/switch.tsx","../src/core/skeleton.tsx","../src/core/textarea.tsx","../src/core/avatar.tsx","../src/core/progress.tsx","../src/core/meter.tsx","../src/core/step-builder.tsx","../src/lib/formatters.ts","../src/core/condition-builder.tsx","../src/core/dropdown-menu.tsx","../src/core/radio-group.tsx","../src/core/loading-overlay.tsx","../src/core/block-layout.tsx","../src/core/create-block.tsx","../src/core/page-header.tsx","../src/core/scroll-area.tsx","../src/core/container.tsx","../src/core/section.tsx","../src/core/resizable.tsx","../src/core/logo.tsx","../src/core/drawer.tsx","../src/core/virtual-list.tsx","../src/core/shader-presets.ts","../src/core/shader-surface.tsx"],"sourcesContent":["import {\n createElement,\n type ComponentPropsWithoutRef,\n type ReactNode,\n} from \"react\";\nimport { cn } from \"../lib/cn\";\n\n/** Semantic body-text roles backed by typography foundation tokens. */\nexport type TextRole = \"body\" | \"label\" | \"supporting\" | \"code\";\n/** Semantic text color roles backed by foreground tokens. */\nexport type TextTone = \"primary\" | \"secondary\" | \"tertiary\" | \"inherit\";\n/** Supported polymorphic HTML elements for Text. */\nexport type TextElement = \"span\" | \"p\" | \"div\" | \"label\" | \"code\";\n\n/** Props for the semantic Text component. */\nexport type TextProps<T extends TextElement = \"span\"> = {\n as?: T;\n variant?: TextRole;\n tone?: TextTone;\n truncate?: boolean;\n children?: ReactNode;\n} & Omit<ComponentPropsWithoutRef<T>, \"as\" | \"children\" | \"color\">;\n\nconst toneStyles: Record<TextTone, string> = {\n primary: \"text-text-primary\",\n secondary: \"text-text-secondary\",\n tertiary: \"text-text-tertiary\",\n inherit: \"text-inherit\",\n};\n\n/** Semantic body text whose visual role is controlled by foundation tokens. */\nexport function Text<T extends TextElement = \"span\">({\n as,\n variant = \"body\",\n tone = \"primary\",\n truncate = false,\n className,\n children,\n ...props\n}: TextProps<T>) {\n const Component = as ?? \"span\";\n const elementProps = {\n ...props,\n className: cn(\n `opt-type-${variant}`,\n toneStyles[tone],\n truncate && \"truncate\",\n className,\n ),\n \"data-opt-component\": \"text\",\n \"data-opt-part\": \"root\",\n \"data-opt-id\": \"NFKP2\",\n \"data-opt-slug\": \"text.Text\",\n \"data-role\": variant,\n \"data-tone\": tone,\n } as ComponentPropsWithoutRef<TextElement>;\n\n return createElement(\n Component as \"span\",\n elementProps as ComponentPropsWithoutRef<\"span\">,\n children,\n );\n}\n","import { createElement, type HTMLAttributes, type ReactNode } from \"react\";\nimport { cn } from \"../lib/cn\";\n\n/** Supported semantic heading levels. */\nexport type HeadingLevel = 1 | 2 | 3 | 4 | 5 | 6;\n/** Visual heading roles backed by typography foundation tokens. */\nexport type HeadingRole =\n | `heading-${HeadingLevel}`\n | \"display-1\"\n | \"display-2\"\n | \"display-3\";\n\n/** Props for the semantic Heading component. */\nexport interface HeadingProps extends Omit<\n HTMLAttributes<HTMLHeadingElement>,\n never\n> {\n level?: HeadingLevel;\n variant?: HeadingRole;\n children?: ReactNode;\n}\n\n/** Semantic heading with independently selectable visual hierarchy. */\nexport function Heading({\n level = 2,\n variant = `heading-${level}`,\n className,\n children,\n ...props\n}: HeadingProps) {\n const Component = {\n 1: \"h1\",\n 2: \"h2\",\n 3: \"h3\",\n 4: \"h4\",\n 5: \"h5\",\n 6: \"h6\",\n }[level];\n\n return createElement(\n Component,\n {\n className: cn(`opt-type-${variant}`, \"text-text-primary\", className),\n ...props,\n \"data-opt-component\": \"heading\",\n \"data-opt-part\": \"root\",\n \"data-opt-id\": \"NF0BT\",\n \"data-opt-slug\": \"heading.Heading\",\n \"data-level\": level,\n \"data-role\": variant,\n },\n children,\n );\n}\n","import type { ReactNode } from \"react\";\nimport { Separator as SeparatorPrimitive } from \"@reopt-ai/opt-ui-primitives\";\nimport { cn } from \"../lib/cn\";\n\n/** Props for the separator component. */\nexport interface SeparatorProps {\n /** Visual/semantic axis. Defaults to `\"horizontal\"`. */\n orientation?: \"horizontal\" | \"vertical\";\n /** Hide from the accessibility tree (purely visual). */\n decorative?: boolean;\n /** Optional centered label — horizontal orientation only. */\n children?: ReactNode;\n className?: string;\n}\n\n/**\n * Visual divider between content. Wraps the headless primitive with design\n * tokens. With `children`, renders a centered label flanked by rules.\n */\nexport function Separator({\n orientation = \"horizontal\",\n decorative = false,\n children,\n className,\n}: SeparatorProps) {\n if (orientation === \"horizontal\" && children != null) {\n return (\n <div\n className={cn(\"gap-element flex items-center\", className)}\n data-opt-id=\"7PWJS\"\n data-opt-slug=\"separator.Separator\"\n >\n <SeparatorPrimitive\n decorative\n orientation=\"horizontal\"\n className=\"bg-border h-px flex-1\"\n />\n <span className=\"text-text-tertiary shrink-0 text-xs\">{children}</span>\n <SeparatorPrimitive\n decorative\n orientation=\"horizontal\"\n className=\"bg-border h-px flex-1\"\n />\n </div>\n );\n }\n\n return (\n <SeparatorPrimitive\n orientation={orientation}\n decorative={decorative}\n className={cn(\n \"bg-border shrink-0\",\n orientation === \"horizontal\"\n ? \"h-px w-full\"\n : \"h-full w-px self-stretch\",\n className,\n )}\n data-opt-id=\"7PWJS\"\n data-opt-slug=\"separator.Separator\"\n />\n );\n}\n\nSeparator.displayName = \"Separator\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../lib/cn\";\nimport {\n RequiredMark,\n getDescribedBy,\n FieldMessages,\n} from \"../lib/field-messages\";\nimport { OPT_INPUT, OPT_INPUT_ERROR, OPT_TEXT_LABEL } from \"../lib/styles\";\nimport { useControlledState } from \"../lib/use-controlled-state\";\n\nconst PATTERNS = {\n numeric: /[0-9]/,\n alphanumeric: /[a-zA-Z0-9]/,\n} as const;\n\n/** Props for the OTP / PIN field component. */\nexport interface OtpFieldProps {\n /** Number of cells. Default 6. */\n length?: number;\n value?: string;\n defaultValue?: string;\n onChange?: (value: string) => void;\n /** Fired once every cell is filled. */\n onComplete?: (value: string) => void;\n /** Allowed characters. Default `\"numeric\"`. */\n type?: keyof typeof PATTERNS;\n /** Render filled cells as dots (for secret PINs). */\n mask?: boolean;\n disabled?: boolean;\n autoFocus?: boolean;\n /** Form field name — renders a hidden input carrying the full value. */\n name?: string;\n label?: string;\n required?: boolean;\n error?: string;\n hint?: string;\n className?: string;\n id?: string;\n \"aria-label\"?: string;\n}\n\n/**\n * One-time-code / PIN entry split into per-character cells, with paste\n * distribution, auto-advancing focus, and arrow/backspace navigation.\n */\nexport function OtpField({\n length = 6,\n value: controlledValue,\n defaultValue = \"\",\n onChange,\n onComplete,\n type = \"numeric\",\n mask = false,\n disabled = false,\n autoFocus = false,\n name,\n label,\n required,\n error,\n hint,\n className,\n id,\n \"aria-label\": ariaLabel,\n}: OtpFieldProps) {\n const reactId = React.useId();\n const fieldId = id ?? `otp-${reactId}`;\n const hasError = Boolean(error);\n const pattern = PATTERNS[type];\n const inputsRef = React.useRef<(HTMLInputElement | null)[]>([]);\n const labelId = label ? `${fieldId}-label` : undefined;\n const groupLabelledBy = ariaLabel ? undefined : labelId;\n const groupAriaLabel =\n ariaLabel ?? (groupLabelledBy ? undefined : \"One-time code\");\n\n const [value, setRawValue] = useControlledState(\n defaultValue,\n controlledValue,\n onChange,\n );\n\n const completedRef = React.useRef(false);\n const setValue = React.useCallback(\n (next: string) => {\n const clipped = next.slice(0, length);\n setRawValue(clipped);\n if (clipped.length === length) {\n if (!completedRef.current) {\n completedRef.current = true;\n onComplete?.(clipped);\n }\n } else {\n completedRef.current = false;\n }\n },\n [length, setRawValue, onComplete],\n );\n\n const focusCell = React.useCallback((index: number) => {\n const target = Math.max(0, Math.min(index, inputsRef.current.length - 1));\n inputsRef.current[target]?.focus();\n inputsRef.current[target]?.select();\n }, []);\n\n const cells = React.useMemo(\n () => Array.from({ length }, (_, i) => value[i] ?? \"\"),\n [length, value],\n );\n\n const setCell = React.useCallback(\n (index: number, char: string) => {\n const arr = Array.from({ length }, (_, i) => value[i] ?? \"\");\n arr[index] = char;\n // Trailing empties collapse; internal value stays positional left-to-right.\n setValue(arr.join(\"\"));\n },\n [length, value, setValue],\n );\n\n const handleChange = React.useCallback(\n (index: number) => (e: React.ChangeEvent<HTMLInputElement>) => {\n const raw = e.target.value;\n // Take the last entered character that matches the allowed pattern.\n const chars = raw.split(\"\").filter((c) => pattern.test(c));\n const char = chars[chars.length - 1] ?? \"\";\n if (char === \"\" && raw !== \"\") return; // rejected invalid char\n setCell(index, char);\n if (char) focusCell(index + 1);\n },\n [pattern, setCell, focusCell],\n );\n\n const handleKeyDown = React.useCallback(\n (index: number) => (e: React.KeyboardEvent<HTMLInputElement>) => {\n switch (e.key) {\n case \"Backspace\":\n e.preventDefault();\n if (cells[index]) {\n setCell(index, \"\");\n } else if (index > 0) {\n setCell(index - 1, \"\");\n focusCell(index - 1);\n }\n break;\n case \"ArrowLeft\":\n e.preventDefault();\n focusCell(index - 1);\n break;\n case \"ArrowRight\":\n e.preventDefault();\n focusCell(index + 1);\n break;\n default:\n break;\n }\n },\n [cells, setCell, focusCell],\n );\n\n const handlePaste = React.useCallback(\n (index: number) => (e: React.ClipboardEvent<HTMLInputElement>) => {\n e.preventDefault();\n const pasted = e.clipboardData\n .getData(\"text\")\n .split(\"\")\n .filter((c) => pattern.test(c))\n .join(\"\");\n if (!pasted) return;\n const arr = Array.from({ length }, (_, i) => value[i] ?? \"\");\n for (let i = 0; i < pasted.length && index + i < length; i++) {\n arr[index + i] = pasted[i];\n }\n setValue(arr.join(\"\"));\n focusCell(index + pasted.length);\n },\n [pattern, length, value, setValue, focusCell],\n );\n\n return (\n <div\n className={cn(\"flex flex-col gap-1.5\", className)}\n data-opt-id=\"0083Q\"\n data-opt-slug=\"otp-field.OtpField\"\n >\n {label && (\n <span className={OPT_TEXT_LABEL} id={labelId}>\n {label}\n {required && <RequiredMark />}\n </span>\n )}\n <div\n role=\"group\"\n aria-label={groupAriaLabel}\n aria-labelledby={groupLabelledBy}\n aria-describedby={getDescribedBy(fieldId, error, hint)}\n className=\"gap-element flex items-center\"\n >\n {cells.map((cell, i) => (\n <input\n key={i}\n ref={(node) => {\n inputsRef.current[i] = node;\n }}\n type={mask ? \"password\" : \"text\"}\n inputMode={type === \"numeric\" ? \"numeric\" : \"text\"}\n autoComplete={i === 0 ? \"one-time-code\" : \"off\"}\n autoFocus={autoFocus && i === 0}\n maxLength={1}\n disabled={disabled}\n aria-label={`${i + 1}번째 자리`}\n aria-invalid={hasError || undefined}\n value={cell}\n onChange={handleChange(i)}\n onKeyDown={handleKeyDown(i)}\n onPaste={handlePaste(i)}\n onFocus={(e) => e.target.select()}\n className={cn(\n OPT_INPUT,\n \"h-12 w-10 text-center text-lg font-medium\",\n hasError && OPT_INPUT_ERROR,\n )}\n />\n ))}\n </div>\n {name && (\n <input type=\"hidden\" name={name} value={value} disabled={disabled} />\n )}\n <FieldMessages id={fieldId} error={error} hint={hint} />\n </div>\n );\n}\n\nOtpField.displayName = \"OtpField\";\n","\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport {\n Toggle as TogglePrimitive,\n ToggleGroup as ToggleGroupPrimitive,\n type ToggleProps as TogglePrimitiveProps,\n type ToggleGroupProps as ToggleGroupPrimitiveProps,\n} from \"@reopt-ai/opt-ui-primitives\";\nimport { cn } from \"../lib/cn\";\nimport { OPT_FOCUS_VISIBLE } from \"../lib/styles\";\n\nconst sizeStyles = {\n sm: \"h-8 min-w-8 px-2 text-xs gap-1.5\",\n md: \"h-10 min-w-10 px-3 text-sm gap-2\",\n} as const;\n\nconst toggleBase = cn(\n \"inline-flex cursor-pointer items-center justify-center rounded-md border border-border bg-surface font-medium text-text-secondary\",\n \"hover:bg-bg-subtle hover:text-text-primary\",\n \"data-[pressed]:border-accent data-[pressed]:bg-accent-subtle data-[pressed]:text-accent\",\n \"disabled:pointer-events-none disabled:opacity-40\",\n OPT_FOCUS_VISIBLE,\n);\n\n/** Props for the toggle component. */\nexport interface ToggleProps extends TogglePrimitiveProps {\n size?: keyof typeof sizeStyles;\n children?: ReactNode;\n}\n\n/** A two-state (pressed) button. Use standalone or inside `ToggleGroup`. */\nexport function Toggle({\n size = \"md\",\n className,\n children,\n ...props\n}: ToggleProps) {\n return (\n <TogglePrimitive\n className={cn(toggleBase, sizeStyles[size], className)}\n {...props}\n data-opt-id=\"GFCMY\"\n data-opt-slug=\"toggle.Toggle\"\n >\n {children}\n </TogglePrimitive>\n );\n}\n\nToggle.displayName = \"Toggle\";\n\n/** Props for the toggle group component. */\nexport type ToggleGroupProps = ToggleGroupPrimitiveProps;\n\n/** A set of related toggles with shared selection and keyboard navigation. */\nexport function ToggleGroup({\n className,\n children,\n orientation = \"horizontal\",\n ...props\n}: ToggleGroupProps) {\n return (\n <ToggleGroupPrimitive\n orientation={orientation}\n aria-orientation={orientation}\n className={cn(\n \"inline-flex gap-1\",\n orientation === \"vertical\" ? \"flex-col\" : \"flex-row\",\n className,\n )}\n {...props}\n data-opt-id=\"47J37\"\n data-opt-slug=\"toggle.ToggleGroup\"\n >\n {children}\n </ToggleGroupPrimitive>\n );\n}\n\nToggleGroup.displayName = \"ToggleGroup\";\n","\"use client\";\n\nimport { ChevronDown } from \"lucide-react\";\nimport {\n AccordionRoot as PrimAccordionRoot,\n AccordionItem as PrimAccordionItem,\n AccordionTrigger as PrimAccordionTrigger,\n AccordionContent as PrimAccordionContent,\n} from \"@reopt-ai/opt-ui-primitives\";\nimport type {\n AccordionRootProps,\n AccordionItemProps as PrimAccordionItemProps,\n AccordionTriggerProps as PrimAccordionTriggerProps,\n AccordionContentProps as PrimAccordionContentProps,\n} from \"@reopt-ai/opt-ui-primitives\";\nimport { cn } from \"../lib/cn\";\nimport { OPT_FOCUS, OPT_ANIMATE_ENTER_EXIT } from \"../lib/styles\";\n\nexport type {\n AccordionRootProps,\n PrimAccordionItemProps as AccordionItemProps,\n PrimAccordionTriggerProps as AccordionTriggerProps,\n PrimAccordionContentProps as AccordionContentProps,\n};\n\nconst triggerClass = `group/acc-trigger flex w-full cursor-pointer items-center justify-between gap-2 py-4 text-left text-sm font-medium text-text-primary transition-colors hover:text-text-secondary ${OPT_FOCUS} disabled:cursor-not-allowed disabled:opacity-50`;\n\nconst contentClass = `overflow-hidden text-sm text-text-secondary ${OPT_ANIMATE_ENTER_EXIT}`;\n\n/** A vertically stacked set of expandable panels (single or multiple open). */\nexport function AccordionRoot({\n className,\n ...props\n}: AccordionRootProps & { className?: string }) {\n return (\n <div\n className={cn(\"border-border border-y\", className)}\n data-opt-id=\"CSBA9\"\n data-opt-slug=\"accordion.AccordionRoot\"\n >\n <PrimAccordionRoot {...props} />\n </div>\n );\n}\n\nAccordionRoot.displayName = \"AccordionRoot\";\n\n/** A single accordion entry, identified by its `value`. */\nexport function AccordionItem({ className, ...props }: PrimAccordionItemProps) {\n return (\n <PrimAccordionItem\n className={cn(\"border-border border-b last:border-b-0\", className)}\n {...props}\n data-opt-id=\"JTY9M\"\n data-opt-slug=\"accordion.AccordionItem\"\n />\n );\n}\n\nAccordionItem.displayName = \"AccordionItem\";\n\n/** The clickable header that expands/collapses its panel. */\nexport function AccordionTrigger({\n className,\n children,\n ...props\n}: PrimAccordionTriggerProps) {\n return (\n <PrimAccordionTrigger\n className={cn(triggerClass, className)}\n {...props}\n data-opt-id=\"CWJZZ\"\n data-opt-slug=\"accordion.AccordionTrigger\"\n >\n <span className=\"flex-1\">{children}</span>\n <ChevronDown\n aria-hidden=\"true\"\n className=\"text-text-tertiary h-4 w-4 shrink-0 transition-transform duration-200 group-data-[state=open]/acc-trigger:rotate-180\"\n />\n </PrimAccordionTrigger>\n );\n}\n\nAccordionTrigger.displayName = \"AccordionTrigger\";\n\n/** The collapsible panel body associated with a trigger. */\nexport function AccordionContent({\n className,\n children,\n ...props\n}: PrimAccordionContentProps) {\n return (\n <PrimAccordionContent\n className={cn(contentClass, className)}\n {...props}\n data-opt-id=\"J98AG\"\n data-opt-slug=\"accordion.AccordionContent\"\n >\n <div className=\"pb-4\">{children}</div>\n </PrimAccordionContent>\n );\n}\n\nAccordionContent.displayName = \"AccordionContent\";\n","\"use client\";\n\nimport { cn } from \"../lib/cn\";\nimport {\n OPT_TEXT_PRIMARY,\n OPT_TEXT_SECONDARY,\n OPT_TEXT_TERTIARY,\n OPT_FOCUS,\n} from \"../lib/styles\";\nimport { koBreadcrumbLabels } from \"../i18n/ko\";\n\nfunction interpolate(\n template: string,\n values: Record<string, string | number>,\n): string {\n return template.replace(/\\{(\\w+)\\}/g, (_, key) =>\n key in values ? String(values[key]) : `{${key}}`,\n );\n}\n\n/** Defines the breadcrumb item shape. */\nexport interface BreadcrumbItem {\n id: string;\n label: string;\n href?: string;\n icon?: React.ReactNode;\n disabled?: boolean;\n}\n\n/** Props for the breadcrumb component. */\nexport interface BreadcrumbProps {\n items: BreadcrumbItem[];\n separator?: React.ReactNode;\n className?: string;\n onNavigate?: (item: BreadcrumbItem) => void;\n /** aria-label for the navigation */\n \"aria-label\"?: string;\n}\n\n/** Renders the breadcrumb component. */\nexport function Breadcrumb({\n items,\n separator = \"/\",\n className,\n onNavigate,\n \"aria-label\": ariaLabel = \"Breadcrumb\",\n}: BreadcrumbProps) {\n return (\n <nav\n aria-label={ariaLabel}\n className={cn(\"flex items-center gap-1 px-1.5 text-sm\", className)}\n data-opt-id=\"3FR0Y\"\n data-opt-slug=\"breadcrumb.Breadcrumb\"\n >\n <ol className=\"flex items-center gap-1\">\n {items.map((item, index) => {\n const isLast = index === items.length - 1;\n\n const linkClassName = cn(\n `flex items-center gap-1.5 rounded-sm ${OPT_FOCUS} transition-colors`,\n item.disabled\n ? `${OPT_TEXT_TERTIARY} cursor-not-allowed`\n : `${OPT_TEXT_SECONDARY} hover:text-text-primary cursor-pointer`,\n );\n\n return (\n <li key={item.id} className=\"flex items-center gap-1\">\n {isLast ? (\n <span\n aria-current=\"page\"\n className={`flex items-center gap-1.5 font-medium ${OPT_TEXT_PRIMARY}`}\n >\n {item.icon}\n {item.label}\n </span>\n ) : (\n <>\n {item.href ? (\n <a\n href={item.disabled ? undefined : item.href}\n aria-disabled={item.disabled || undefined}\n className={linkClassName}\n onClick={() => !item.disabled && onNavigate?.(item)}\n >\n {item.icon}\n {item.label}\n </a>\n ) : (\n <button\n type=\"button\"\n disabled={item.disabled}\n aria-label={interpolate(koBreadcrumbLabels.navAriaLabel, {\n label: item.label,\n })}\n className={linkClassName}\n onClick={() => !item.disabled && onNavigate?.(item)}\n >\n {item.icon}\n {item.label}\n </button>\n )}\n <span aria-hidden=\"true\" className={OPT_TEXT_TERTIARY}>\n {separator}\n </span>\n </>\n )}\n </li>\n );\n })}\n </ol>\n </nav>\n );\n}\n","\"use client\";\n\nimport { cn } from \"../lib/cn\";\nimport {\n OPT_BORDER,\n OPT_TEXT_PRIMARY,\n OPT_TEXT_SECONDARY,\n} from \"../lib/styles\";\n\n/** Props for the card component. */\nexport interface CardProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: \"default\" | \"outline\" | \"ghost\";\n padding?: \"none\" | \"sm\" | \"md\" | \"lg\";\n /** Show shadow (default variant only) */\n shadow?: boolean;\n /** Enable click-to-select behavior with visual highlight */\n selectable?: boolean;\n /** Whether this card is currently selected (controlled) */\n selected?: boolean;\n /** Called when selected state changes */\n onSelectedChange?: (selected: boolean) => void;\n}\n\n/** Renders the card component. */\nexport function Card({\n variant = \"default\",\n padding = \"md\",\n shadow = true,\n selectable = false,\n selected = false,\n onSelectedChange,\n className,\n children,\n onClick,\n onKeyDown,\n role,\n tabIndex,\n ...props\n}: CardProps) {\n const isInteractive = selectable || !!onClick;\n\n const handleClick = selectable\n ? (e: React.MouseEvent<HTMLDivElement>) => {\n onSelectedChange?.(!selected);\n onClick?.(e);\n }\n : onClick;\n\n const handleKeyDown = selectable\n ? (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onSelectedChange?.(!selected);\n }\n onKeyDown?.(e);\n }\n : isInteractive\n ? (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n (e.currentTarget as HTMLDivElement).click();\n }\n onKeyDown?.(e);\n }\n : onKeyDown;\n\n return (\n <div\n {...props}\n className={cn(\n \"rounded-xl\",\n variant === \"default\" &&\n cn(`${OPT_BORDER} bg-surface`, shadow && \"shadow-sm\"),\n variant === \"outline\" && \"border-border border-2 bg-transparent\",\n variant === \"ghost\" && \"bg-bg-subtle\",\n padding === \"none\" && \"p-0\",\n padding === \"sm\" && \"p-3\",\n padding === \"md\" && \"p-5\",\n padding === \"lg\" && \"p-8\",\n selectable && \"cursor-pointer transition-colors\",\n selectable &&\n selected &&\n \"ring-accent border-accent ring-2 ring-offset-1\",\n selectable && !selected && \"hover:border-accent/50\",\n className,\n )}\n {...(isInteractive\n ? {\n role: selectable ? (\"option\" as const) : (\"button\" as const),\n tabIndex: 0,\n \"aria-selected\": selectable ? selected : undefined,\n onClick: handleClick,\n onKeyDown: handleKeyDown,\n }\n : {\n role,\n tabIndex,\n \"aria-selected\": selectable ? selected : undefined,\n onKeyDown,\n })}\n data-opt-id=\"0A18R\"\n data-opt-slug=\"card.Card\"\n >\n {children}\n </div>\n );\n}\n\n/** Props for the card header component. */\nexport interface CardHeaderProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Gap between title and description */\n gap?: \"sm\" | \"md\" | \"lg\";\n}\n\nconst headerGapClasses = {\n sm: \"gap-1\",\n md: \"gap-1.5\",\n lg: \"gap-2\",\n} as const;\n\n/** Renders the card header component. */\nexport function CardHeader({\n gap = \"sm\",\n className,\n children,\n ...props\n}: CardHeaderProps) {\n return (\n <div\n className={cn(\"flex flex-col\", headerGapClasses[gap], className)}\n {...props}\n data-opt-id=\"JST3J\"\n data-opt-slug=\"card.CardHeader\"\n >\n {children}\n </div>\n );\n}\n\n/** Props for the card title component. */\nexport interface CardTitleProps extends React.HTMLAttributes<HTMLHeadingElement> {\n /** Heading level */\n as?: \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\";\n}\n\n/** Renders the card title component. */\nexport function CardTitle({\n as: Tag = \"h3\",\n className,\n children,\n ...props\n}: CardTitleProps) {\n return (\n <Tag\n className={cn(`text-lg font-semibold ${OPT_TEXT_PRIMARY}`, className)}\n {...props}\n data-opt-id=\"V15TX\"\n data-opt-slug=\"card.CardTitle\"\n >\n {children}\n </Tag>\n );\n}\n\n/** Props for the card description component. */\nexport type CardDescriptionProps = React.HTMLAttributes<HTMLParagraphElement>;\n\n/** Renders the card description component. */\nexport function CardDescription({\n className,\n children,\n ...props\n}: CardDescriptionProps) {\n return (\n <p\n className={cn(`text-sm ${OPT_TEXT_SECONDARY}`, className)}\n {...props}\n data-opt-id=\"YB1RN\"\n data-opt-slug=\"card.CardDescription\"\n >\n {children}\n </p>\n );\n}\n\n/** Props for the card content component. */\nexport interface CardContentProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Spacing from header */\n spacing?: \"none\" | \"sm\" | \"md\" | \"lg\";\n}\n\nconst contentSpacingClasses = {\n none: \"\",\n sm: \"mt-2\",\n md: \"mt-4\",\n lg: \"mt-6\",\n} as const;\n\n/** Renders the card content component. */\nexport function CardContent({\n spacing = \"md\",\n className,\n children,\n ...props\n}: CardContentProps) {\n return (\n <div\n className={cn(contentSpacingClasses[spacing], className)}\n {...props}\n data-opt-id=\"9Y68R\"\n data-opt-slug=\"card.CardContent\"\n >\n {children}\n </div>\n );\n}\n\n/** Props for the card footer component. */\nexport interface CardFooterProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Show top divider */\n divider?: boolean;\n}\n\n/** Renders the card footer component. */\nexport function CardFooter({\n divider = true,\n className,\n children,\n ...props\n}: CardFooterProps) {\n return (\n <div\n className={cn(\n \"mt-4 flex items-center justify-end gap-2 pt-4\",\n divider && `border-t ${OPT_BORDER}`,\n className,\n )}\n {...props}\n data-opt-id=\"GRNTR\"\n data-opt-slug=\"card.CardFooter\"\n >\n {children}\n </div>\n );\n}\n","\"use client\";\n\nimport {\n forwardRef,\n useId,\n useState,\n useCallback,\n type ComponentPropsWithoutRef,\n} from \"react\";\nimport { cn } from \"../lib/cn\";\nimport {\n FieldMessages,\n RequiredMark,\n getDescribedBy,\n} from \"../lib/field-messages\";\nimport { OPT_FOCUS_VISIBLE } from \"../lib/styles\";\nimport { useInputId } from \"../lib/use-input-id\";\n\n/** Props for the switch component. */\nexport interface SwitchProps extends Omit<\n ComponentPropsWithoutRef<\"button\">,\n \"onChange\" | \"type\" | \"size\"\n> {\n label?: string;\n required?: boolean;\n error?: string;\n hint?: string;\n /** @deprecated Use `hint` instead */\n description?: string;\n checked?: boolean;\n defaultChecked?: boolean;\n onChange?: (checked: boolean) => void;\n size?: \"sm\" | \"md\" | \"lg\";\n}\n\nconst sizeStyles = {\n sm: {\n track: \"h-5 w-9\",\n thumb: \"h-4 w-4\",\n translate: \"translate-x-4\",\n },\n md: {\n track: \"h-6 w-11\",\n thumb: \"h-5 w-5\",\n translate: \"translate-x-5\",\n },\n lg: {\n track: \"h-7 w-14\",\n thumb: \"h-6 w-6\",\n translate: \"translate-x-7\",\n },\n};\n\nexport const Switch = forwardRef<HTMLButtonElement, SwitchProps>(\n (\n {\n label,\n required,\n error,\n hint,\n description,\n checked: controlledChecked,\n defaultChecked = false,\n onChange,\n size = \"md\",\n disabled,\n className,\n id,\n onClick,\n \"aria-label\": ariaLabel,\n \"aria-labelledby\": ariaLabelledBy,\n ...props\n },\n ref,\n ) => {\n const fallbackId = useId();\n const switchId = useInputId(id, label, \"switch\") ?? `switch-${fallbackId}`;\n const hintText = hint ?? description;\n const hasError = Boolean(error);\n const styles = sizeStyles[size];\n const labelId = label ? `${switchId}-label` : undefined;\n const switchLabelledBy =\n ariaLabelledBy ?? (ariaLabel ? undefined : labelId);\n const switchAriaLabel =\n ariaLabel ?? (switchLabelledBy ? undefined : \"Switch\");\n\n const isControlled = controlledChecked !== undefined;\n const [internalChecked, setInternalChecked] = useState(defaultChecked);\n const checked = isControlled ? controlledChecked : internalChecked;\n\n const handleClick = useCallback(\n (e: React.MouseEvent<HTMLButtonElement>) => {\n const next = !checked;\n if (!isControlled) setInternalChecked(next);\n onChange?.(next);\n onClick?.(e);\n },\n [checked, isControlled, onChange, onClick],\n );\n\n return (\n <div\n className={cn(\"flex flex-col gap-1.5\", className)}\n data-opt-id=\"51Z9R\"\n data-opt-slug=\"switch.Switch\"\n >\n <div className=\"flex items-start gap-3\">\n <button\n ref={ref}\n type=\"button\"\n role=\"switch\"\n id={switchId}\n aria-checked={checked}\n aria-label={switchAriaLabel}\n aria-labelledby={switchLabelledBy}\n disabled={disabled}\n className={cn(\n \"group relative inline-flex shrink-0 cursor-pointer rounded-full p-0.5 transition-colors\",\n styles.track,\n \"bg-bg-muted\",\n \"aria-[checked=true]:bg-accent\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n OPT_FOCUS_VISIBLE,\n )}\n aria-invalid={hasError}\n aria-required={required}\n aria-describedby={getDescribedBy(switchId, error, hintText)}\n onClick={handleClick}\n {...props}\n >\n <span\n className={cn(\n // eslint-disable-next-line opt-ui/no-raw-color -- switch thumb은 라이트/다크 공통 흰색 (디자인 시스템 표준)\n \"pointer-events-none inline-block transform rounded-full bg-white shadow-sm ring-0 transition-transform\",\n styles.thumb,\n \"translate-x-0\",\n size === \"sm\" && \"group-aria-[checked=true]:translate-x-4\",\n size === \"md\" && \"group-aria-[checked=true]:translate-x-5\",\n size === \"lg\" && \"group-aria-[checked=true]:translate-x-7\",\n )}\n />\n </button>\n {(label || hintText) && (\n <div className=\"flex flex-col\">\n {label && (\n <span\n id={labelId}\n className={cn(\n \"text-text-primary text-sm font-medium\",\n disabled && \"opacity-50\",\n )}\n >\n {label}\n {required && <RequiredMark />}\n </span>\n )}\n {hintText && (\n <p\n id={`${switchId}-hint`}\n className={cn(\n \"text-text-tertiary text-sm\",\n disabled && \"opacity-50\",\n )}\n >\n {hintText}\n </p>\n )}\n </div>\n )}\n </div>\n <FieldMessages id={switchId} error={error} />\n </div>\n );\n },\n);\n\nSwitch.displayName = \"Switch\";\n","\"use client\";\n\nimport type { ComponentPropsWithoutRef } from \"react\";\nimport { cn } from \"../lib/cn\";\n\n/** Props for the skeleton component. */\nexport interface SkeletonProps extends ComponentPropsWithoutRef<\"div\"> {\n variant?: \"text\" | \"circular\" | \"rectangular\";\n width?: string | number;\n height?: string | number;\n lines?: number;\n animated?: boolean;\n}\n\nconst variantStyles: Record<NonNullable<SkeletonProps[\"variant\"]>, string> = {\n text: \"rounded h-4\",\n circular: \"rounded-full\",\n rectangular: \"rounded-lg\",\n};\n\n/** Renders the skeleton component. */\nexport function Skeleton({\n variant = \"text\",\n width,\n height,\n lines = 1,\n animated = true,\n className,\n style,\n ...props\n}: SkeletonProps) {\n const baseClass = cn(\n \"bg-bg-subtle\",\n animated && \"animate-pulse\",\n variantStyles[variant],\n className,\n );\n\n const computedStyle = {\n width: typeof width === \"number\" ? `${width}px` : width,\n height: typeof height === \"number\" ? `${height}px` : height,\n ...style,\n };\n\n if (variant === \"text\" && lines > 1) {\n return (\n <div\n className=\"gap-element flex flex-col\"\n role=\"status\"\n aria-label=\"Loading\"\n data-opt-id=\"EJT87\"\n data-opt-slug=\"skeleton.Skeleton\"\n >\n {Array.from({ length: lines }).map((_, i) => (\n <div\n key={i}\n className={cn(baseClass, i === lines - 1 && \"w-4/5\")}\n style={i === lines - 1 ? undefined : computedStyle}\n {...props}\n />\n ))}\n <span className=\"sr-only\">Loading...</span>\n </div>\n );\n }\n\n return (\n <div\n className={baseClass}\n style={computedStyle}\n role=\"status\"\n aria-label=\"Loading\"\n {...props}\n data-opt-id=\"EJT87\"\n data-opt-slug=\"skeleton.Skeleton\"\n >\n <span className=\"sr-only\">Loading...</span>\n </div>\n );\n}\n\n// ── Preset Components ──\n\n/** Renders the skeleton text component. */\nexport function SkeletonText({\n lines = 3,\n className,\n ...props\n}: Omit<SkeletonProps, \"variant\"> & { lines?: number }) {\n return (\n <Skeleton\n variant=\"text\"\n lines={lines}\n className={className}\n {...props}\n data-opt-id=\"MX3D5\"\n data-opt-slug=\"skeleton.SkeletonText\"\n />\n );\n}\n\n/** Renders the skeleton avatar component. */\nexport function SkeletonAvatar({\n size = 40,\n className,\n ...props\n}: Omit<SkeletonProps, \"variant\" | \"width\" | \"height\"> & { size?: number }) {\n return (\n <Skeleton\n variant=\"circular\"\n width={size}\n height={size}\n className={className}\n {...props}\n data-opt-id=\"MP0HZ\"\n data-opt-slug=\"skeleton.SkeletonAvatar\"\n />\n );\n}\n\n/** Renders the skeleton card component. */\nexport function SkeletonCard({\n className,\n ...props\n}: Omit<SkeletonProps, \"variant\">) {\n return (\n <div\n className={cn(\"gap-group flex flex-col\", className)}\n {...props}\n data-opt-id=\"34V5D\"\n data-opt-slug=\"skeleton.SkeletonCard\"\n >\n <Skeleton variant=\"rectangular\" height={120} />\n <Skeleton variant=\"text\" width=\"60%\" />\n <Skeleton variant=\"text\" lines={2} />\n </div>\n );\n}\n\n/** Renders the skeleton table component. */\nexport function SkeletonTable({\n rows = 5,\n columns = 4,\n className,\n}: {\n rows?: number;\n columns?: number;\n className?: string;\n}) {\n return (\n <div\n className={cn(\"gap-element flex flex-col\", className)}\n role=\"status\"\n aria-label=\"Loading table\"\n data-opt-id=\"3KEDN\"\n data-opt-slug=\"skeleton.SkeletonTable\"\n >\n {/* Header */}\n <div className=\"border-border-subtle gap-group flex border-b pb-2\">\n {Array.from({ length: columns }).map((_, i) => (\n <Skeleton key={i} variant=\"text\" className=\"flex-1\" height={16} />\n ))}\n </div>\n {/* Rows */}\n {Array.from({ length: rows }).map((_, rowIndex) => (\n <div key={rowIndex} className=\"gap-group flex py-2\">\n {Array.from({ length: columns }).map((_, colIndex) => (\n <Skeleton\n key={colIndex}\n variant=\"text\"\n className=\"flex-1\"\n height={14}\n />\n ))}\n </div>\n ))}\n <span className=\"sr-only\">Loading...</span>\n </div>\n );\n}\n","\"use client\";\n\nimport { forwardRef, useId, type ComponentPropsWithoutRef } from \"react\";\nimport { cn } from \"../lib/cn\";\nimport {\n FieldMessages,\n RequiredMark,\n getDescribedBy,\n} from \"../lib/field-messages\";\nimport {\n OPT_FOCUS_VISIBLE,\n OPT_INPUT_ERROR,\n OPT_TEXTAREA_SIZE,\n} from \"../lib/styles\";\nimport { useInputId } from \"../lib/use-input-id\";\n\n/** Props for the textarea component. */\nexport interface TextareaProps extends ComponentPropsWithoutRef<\"textarea\"> {\n label?: string;\n error?: string;\n hint?: string;\n fullWidth?: boolean;\n resize?: \"none\" | \"vertical\" | \"horizontal\" | \"both\";\n size?: \"sm\" | \"md\" | \"lg\";\n}\n\nconst textareaSizeStyles = OPT_TEXTAREA_SIZE;\n\nconst resizeStyles: Record<NonNullable<TextareaProps[\"resize\"]>, string> = {\n none: \"resize-none\",\n vertical: \"resize-y\",\n horizontal: \"resize-x\",\n both: \"resize\",\n};\n\nexport const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(\n (\n {\n label,\n error,\n hint,\n fullWidth = false,\n required,\n resize = \"vertical\",\n size = \"md\",\n className,\n id,\n rows = 4,\n ...props\n },\n ref,\n ) => {\n const fallbackId = useId().replace(/:/g, \"\");\n const textareaId =\n useInputId(id, label, \"textarea\") ?? `textarea-${fallbackId}`;\n const hasError = Boolean(error);\n\n return (\n <div\n className={cn(\"flex flex-col gap-1.5\", fullWidth && \"w-full\")}\n data-opt-id=\"6T58H\"\n data-opt-slug=\"textarea.Textarea\"\n >\n {label && (\n <label\n htmlFor={textareaId}\n className=\"text-text-primary text-sm font-medium\"\n >\n {label}\n {required && <RequiredMark />}\n </label>\n )}\n <textarea\n ref={ref}\n id={textareaId}\n rows={rows}\n className={cn(\n \"border-border bg-surface text-text-primary placeholder:text-text-tertiary w-full rounded-lg border px-4 py-3 text-sm outline-transparent\",\n OPT_FOCUS_VISIBLE,\n textareaSizeStyles[size],\n resizeStyles[resize],\n hasError && OPT_INPUT_ERROR,\n !fullWidth && \"w-auto\",\n className,\n )}\n aria-invalid={hasError}\n aria-describedby={getDescribedBy(textareaId, error, hint)}\n {...props}\n />\n <FieldMessages id={textareaId} error={error} hint={hint} />\n </div>\n );\n },\n);\n\nTextarea.displayName = \"Textarea\";\n","\"use client\";\n\nimport {\n useEffect,\n useLayoutEffect,\n useState,\n type ComponentPropsWithoutRef,\n type ImgHTMLAttributes,\n type ReactNode,\n} from \"react\";\nimport { cn } from \"../lib/cn\";\n\n/** Loading status of the avatar image, modeled as a state machine. */\nexport type AvatarImageLoadingStatus = \"idle\" | \"loading\" | \"loaded\" | \"error\";\n\n// useLayoutEffect warns during SSR; fall back to useEffect on the server so the\n// cached-image fast path can run synchronously in the browser without warnings.\nconst useIsoLayoutEffect =\n typeof window !== \"undefined\" ? useLayoutEffect : useEffect;\n\n/**\n * Tracks an image's loading status by preloading it off-DOM, so the avatar can\n * show its fallback until the image is actually decoded (no broken-image flash)\n * and recover from late `error`/`load` events. Supports responsive `srcSet`/`sizes`.\n */\nfunction useImageLoadingStatus(\n src: string | undefined,\n {\n srcSet,\n sizes,\n crossOrigin,\n referrerPolicy,\n }: Pick<\n ImgHTMLAttributes<HTMLImageElement>,\n \"srcSet\" | \"sizes\" | \"crossOrigin\" | \"referrerPolicy\"\n >,\n): AvatarImageLoadingStatus {\n const [status, setStatus] = useState<AvatarImageLoadingStatus>(\"idle\");\n\n useIsoLayoutEffect(() => {\n if (!src && !srcSet) {\n setStatus(\"error\");\n return undefined;\n }\n\n let isMounted = true;\n const image = new window.Image();\n\n const update = (next: AvatarImageLoadingStatus) => () => {\n if (isMounted) {\n setStatus(next);\n }\n };\n\n setStatus(\"loading\");\n image.onload = update(\"loaded\");\n image.onerror = update(\"error\");\n if (referrerPolicy) {\n image.referrerPolicy = referrerPolicy;\n }\n image.crossOrigin = crossOrigin ?? null;\n if (sizes) {\n image.sizes = sizes;\n }\n if (srcSet) {\n image.srcset = srcSet;\n }\n if (src) {\n image.src = src;\n }\n\n // Fast path for cached/decoded images.\n if (image.complete) {\n setStatus(image.naturalWidth > 0 ? \"loaded\" : \"error\");\n }\n\n return () => {\n isMounted = false;\n };\n }, [src, srcSet, sizes, crossOrigin, referrerPolicy]);\n\n return status;\n}\n\n/** Props for the avatar component. */\nexport interface AvatarProps extends ComponentPropsWithoutRef<\"span\"> {\n src?: string;\n /** Responsive candidate set forwarded to the underlying `<img>`. */\n srcSet?: string;\n /** Sizes hint paired with `srcSet` for responsive image selection. */\n sizes?: string;\n crossOrigin?: ImgHTMLAttributes<HTMLImageElement>[\"crossOrigin\"];\n referrerPolicy?: ImgHTMLAttributes<HTMLImageElement>[\"referrerPolicy\"];\n alt?: string;\n name?: string;\n size?: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n fallback?: ReactNode;\n status?: \"online\" | \"offline\" | \"busy\" | \"away\";\n /** Fired whenever the image loading status changes. */\n onLoadingStatusChange?: (status: AvatarImageLoadingStatus) => void;\n}\n\nconst sizeStyles: Record<NonNullable<AvatarProps[\"size\"]>, string> = {\n xs: \"h-6 w-6 text-[10px]\",\n sm: \"h-8 w-8 text-xs\",\n md: \"h-10 w-10 text-sm\",\n lg: \"h-12 w-12 text-base\",\n xl: \"h-16 w-16 text-lg\",\n};\n\nconst statusStyles: Record<NonNullable<AvatarProps[\"status\"]>, string> = {\n online: \"bg-success\",\n offline: \"bg-bg-muted\",\n busy: \"bg-danger\",\n away: \"bg-warning\",\n};\n\nconst statusSizeStyles: Record<NonNullable<AvatarProps[\"size\"]>, string> = {\n xs: \"h-1.5 w-1.5 border\",\n sm: \"h-2 w-2 border\",\n md: \"h-2.5 w-2.5 border-2\",\n lg: \"h-3 w-3 border-2\",\n xl: \"h-4 w-4 border-2\",\n};\n\nfunction getInitials(name: string): string {\n const parts = name.trim().split(/\\s+/);\n if (parts.length === 1) {\n return parts[0].charAt(0).toUpperCase();\n }\n return (parts[0].charAt(0) + parts[parts.length - 1].charAt(0)).toUpperCase();\n}\n\nconst bgColors = [\n \"bg-blue-500\",\n \"bg-emerald-500\",\n \"bg-amber-500\",\n \"bg-rose-500\",\n \"bg-purple-500\",\n \"bg-cyan-500\",\n \"bg-orange-500\",\n \"bg-indigo-500\",\n];\n\nfunction getColorFromName(name: string): string {\n let hash = 0;\n for (let i = 0; i < name.length; i++) {\n hash = name.charCodeAt(i) + ((hash << 5) - hash);\n }\n return bgColors[Math.abs(hash) % bgColors.length];\n}\n\n/** Renders the avatar component. */\nexport function Avatar({\n src,\n srcSet,\n sizes,\n crossOrigin,\n referrerPolicy,\n alt,\n name,\n size = \"md\",\n fallback,\n status,\n className,\n onLoadingStatusChange,\n ...props\n}: AvatarProps) {\n const loadingStatus = useImageLoadingStatus(src, {\n srcSet,\n sizes,\n crossOrigin,\n referrerPolicy,\n });\n\n useEffect(() => {\n onLoadingStatusChange?.(loadingStatus);\n }, [loadingStatus, onLoadingStatusChange]);\n\n const showImage =\n (Boolean(src) || Boolean(srcSet)) && loadingStatus === \"loaded\";\n const initials = name ? getInitials(name) : null;\n const bgColor = name ? getColorFromName(name) : \"bg-bg-subtle\";\n const avatarLabel = status\n ? `${name ?? alt ?? \"Avatar\"} (${status})`\n : (name ?? alt ?? \"Avatar\");\n let avatarContent: ReactNode;\n\n if (showImage) {\n avatarContent = (\n <img\n src={src}\n srcSet={srcSet}\n sizes={sizes}\n crossOrigin={crossOrigin}\n referrerPolicy={referrerPolicy}\n alt={alt ?? name ?? \"Avatar\"}\n className=\"h-full w-full object-cover\"\n />\n );\n } else if (fallback) {\n avatarContent = fallback;\n } else if (initials) {\n avatarContent = (\n // eslint-disable-next-line opt-ui/no-raw-color -- saturated bg-{color}-500 위 흰 텍스트는 contrast 의도\n <span className=\"font-medium text-white\">{initials}</span>\n );\n } else {\n avatarContent = (\n <svg\n className=\"text-text-tertiary h-3/5 w-3/5\"\n fill=\"currentColor\"\n viewBox=\"0 0 24 24\"\n aria-hidden=\"true\"\n >\n <path d=\"M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z\" />\n </svg>\n );\n }\n\n return (\n <span\n role=\"img\"\n aria-label={avatarLabel}\n className={cn(\n \"relative inline-flex shrink-0 items-center justify-center overflow-hidden rounded-full\",\n sizeStyles[size],\n !showImage && bgColor,\n className,\n )}\n {...props}\n data-opt-id=\"SCMM0\"\n data-opt-slug=\"avatar.Avatar\"\n >\n {avatarContent}\n {status && (\n <span\n className={cn(\n \"border-surface absolute right-0 bottom-0 rounded-full\",\n statusStyles[status],\n statusSizeStyles[size],\n )}\n aria-hidden=\"true\"\n />\n )}\n </span>\n );\n}\n\n// ── Avatar Group ──\n\n/** Props for the avatar group component. */\nexport interface AvatarGroupProps extends ComponentPropsWithoutRef<\"div\"> {\n max?: number;\n size?: AvatarProps[\"size\"];\n children: ReactNode;\n}\n\n/** Renders the avatar group component. */\nexport function AvatarGroup({\n max = 4,\n size = \"md\",\n children,\n className,\n ...props\n}: AvatarGroupProps) {\n const avatars = Array.isArray(children) ? children : [children];\n const visibleAvatars = avatars.slice(0, max);\n const remainingCount = avatars.length - max;\n\n return (\n <div\n className={cn(\"flex\", className)}\n {...props}\n data-opt-id=\"MVB53\"\n data-opt-slug=\"avatar.AvatarGroup\"\n >\n {visibleAvatars.map((child, index) => (\n <span\n key={index}\n className=\"ring-surface relative -ml-2 inline-block rounded-full ring-2 first:ml-0\"\n >\n {child}\n </span>\n ))}\n {remainingCount > 0 && (\n <span\n className={cn(\n \"bg-bg-subtle text-text-secondary ring-surface relative inline-flex items-center justify-center rounded-full font-medium ring-2\",\n sizeStyles[size],\n )}\n >\n +{remainingCount}\n </span>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport { useId, type ComponentPropsWithoutRef } from \"react\";\nimport { cn } from \"../lib/cn\";\n\n/** Props for the progress component. */\nexport interface ProgressProps extends ComponentPropsWithoutRef<\"div\"> {\n value?: number;\n max?: number;\n size?: \"sm\" | \"md\" | \"lg\";\n variant?: \"default\" | \"success\" | \"warning\" | \"error\";\n showLabel?: boolean;\n label?: string;\n animated?: boolean;\n indeterminate?: boolean;\n}\n\nconst sizeStyles: Record<NonNullable<ProgressProps[\"size\"]>, string> = {\n sm: \"h-1\",\n md: \"h-2\",\n lg: \"h-3\",\n};\n\nconst variantStyles: Record<NonNullable<ProgressProps[\"variant\"]>, string> = {\n default: \"bg-accent\",\n success: \"bg-success\",\n warning: \"bg-warning\",\n error: \"bg-danger\",\n};\n\nfunction getProgressValue(value: number, max: number) {\n const safeMax = Number.isFinite(max) ? Math.max(0, max) : 100;\n const safeValue = Number.isFinite(value) ? value : 0;\n const clampedValue =\n safeMax > 0 ? Math.min(Math.max(safeValue, 0), safeMax) : 0;\n const percentage = safeMax > 0 ? (clampedValue / safeMax) * 100 : 0;\n const roundedPercentage = Math.round(percentage);\n\n return {\n clampedValue,\n max: safeMax,\n percentage,\n valueText: `${roundedPercentage}%`,\n };\n}\n\n/** Renders the progress component. */\nexport function Progress({\n value,\n max = 100,\n size = \"md\",\n variant = \"default\",\n showLabel = false,\n label,\n animated = true,\n indeterminate = false,\n className,\n ...props\n}: ProgressProps) {\n const isIndeterminate = indeterminate || value === undefined;\n const progress = isIndeterminate ? null : getProgressValue(value, max);\n const shouldRenderHeader = Boolean(label) || (showLabel && progress);\n\n return (\n <div\n className={cn(\"w-full\", className)}\n {...props}\n data-opt-id=\"Y5N8R\"\n data-opt-slug=\"progress.Progress\"\n >\n {shouldRenderHeader && (\n <div className=\"mb-1.5 flex items-center justify-between text-sm\">\n {label && (\n <span className=\"text-text-primary font-medium\">{label}</span>\n )}\n {showLabel && progress && (\n <span className=\"text-text-tertiary\">{progress.valueText}</span>\n )}\n </div>\n )}\n <div\n className={cn(\n \"bg-bg-subtle w-full overflow-hidden rounded-full\",\n sizeStyles[size],\n )}\n role=\"progressbar\"\n aria-valuenow={progress?.clampedValue}\n aria-valuemin={progress ? 0 : undefined}\n aria-valuemax={progress?.max}\n aria-valuetext={progress?.valueText}\n aria-label={\n label ?? (progress ? `${progress.valueText} complete` : \"Loading\")\n }\n >\n <div\n className={cn(\n \"h-full rounded-full\",\n variantStyles[variant],\n !progress && \"w-1/3 animate-pulse\",\n animated &&\n (progress\n ? \"transition-all duration-300 ease-out\"\n : \"transition-opacity duration-700 ease-in-out\"),\n )}\n style={progress ? { width: `${progress.percentage}%` } : undefined}\n />\n </div>\n </div>\n );\n}\n\n// ── Circular Progress ──\n\n/** Props for the circular progress component. */\nexport interface CircularProgressProps extends ComponentPropsWithoutRef<\"svg\"> {\n value?: number;\n max?: number;\n size?: number;\n strokeWidth?: number;\n variant?: \"default\" | \"success\" | \"warning\" | \"error\";\n showLabel?: boolean;\n label?: string;\n indeterminate?: boolean;\n}\n\nconst circularVariantStyles: Record<\n NonNullable<CircularProgressProps[\"variant\"]>,\n string\n> = {\n default: \"text-accent\",\n success: \"text-success\",\n warning: \"text-warning\",\n error: \"text-danger\",\n};\n\n/** Renders the circular progress component. */\nexport function CircularProgress({\n value,\n max = 100,\n size = 48,\n strokeWidth = 4,\n variant = \"default\",\n showLabel = false,\n label,\n indeterminate = false,\n className,\n ...props\n}: CircularProgressProps) {\n const labelId = useId();\n const isIndeterminate = indeterminate || value === undefined;\n const progress = isIndeterminate ? null : getProgressValue(value, max);\n const accessibleName =\n label ?? (progress ? `${progress.valueText} complete` : \"Loading\");\n const radius = (size - strokeWidth) / 2;\n const circumference = radius * 2 * Math.PI;\n const strokeDashoffset =\n circumference - ((progress?.percentage ?? 0) / 100) * circumference;\n\n return (\n <div\n className=\"relative inline-flex items-center justify-center\"\n data-opt-id=\"Q69KP\"\n data-opt-slug=\"progress.CircularProgress\"\n >\n {label && (\n <span id={labelId} className=\"sr-only\">\n {label}\n </span>\n )}\n <svg\n width={size}\n height={size}\n className={cn(\n isIndeterminate ? \"animate-spin\" : \"-rotate-90\",\n className,\n )}\n role={isIndeterminate ? \"progressbar\" : \"meter\"}\n aria-labelledby={label ? labelId : undefined}\n aria-valuenow={progress?.clampedValue}\n aria-valuemin={progress ? 0 : undefined}\n aria-valuemax={progress?.max}\n aria-valuetext={progress?.valueText}\n aria-label={label ? undefined : accessibleName}\n {...props}\n >\n {/* Background circle */}\n <circle\n cx={size / 2}\n cy={size / 2}\n r={radius}\n fill=\"none\"\n strokeWidth={strokeWidth}\n className=\"stroke-border-subtle\"\n />\n {/* Progress circle */}\n <circle\n cx={size / 2}\n cy={size / 2}\n r={radius}\n fill=\"none\"\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n className={cn(\n \"transition-all duration-300 ease-out\",\n circularVariantStyles[variant],\n )}\n style={{\n strokeDasharray: isIndeterminate\n ? `${circumference * 0.28} ${circumference}`\n : circumference,\n strokeDashoffset: isIndeterminate ? 0 : strokeDashoffset,\n stroke: \"currentColor\",\n }}\n />\n </svg>\n {showLabel && progress && (\n <span className=\"text-text-primary absolute text-xs font-medium\">\n {progress.valueText}\n </span>\n )}\n </div>\n );\n}\n","\"use client\";\n\nimport type { ComponentPropsWithoutRef } from \"react\";\nimport { Meter as MeterPrimitive } from \"@reopt-ai/opt-ui-primitives\";\nimport { cn } from \"../lib/cn\";\n\n/** Props for the meter component. */\nexport interface MeterProps extends Omit<\n ComponentPropsWithoutRef<\"div\">,\n \"children\"\n> {\n /** Current value within [min, max]. */\n value: number;\n min?: number;\n max?: number;\n size?: \"sm\" | \"md\" | \"lg\";\n variant?: \"default\" | \"success\" | \"warning\" | \"error\";\n /** Show the value as a percentage next to the label. */\n showValue?: boolean;\n label?: string;\n /** Override the localized `aria-valuetext`. */\n getValueLabel?: (value: number, min: number, max: number) => string;\n}\n\nconst sizeStyles: Record<NonNullable<MeterProps[\"size\"]>, string> = {\n sm: \"h-1\",\n md: \"h-2\",\n lg: \"h-3\",\n};\n\nconst variantStyles: Record<NonNullable<MeterProps[\"variant\"]>, string> = {\n default: \"bg-accent\",\n success: \"bg-success\",\n warning: \"bg-warning\",\n error: \"bg-danger\",\n};\n\n/**\n * A scalar measurement within a known range (disk usage, score, capacity) —\n * `role=\"meter\"`, distinct from Progress (task completion). Built on the\n * opt-ui-primitives Meter primitive, which owns the role/aria/valuetext.\n */\nexport function Meter({\n value,\n min = 0,\n max = 100,\n size = \"md\",\n variant = \"default\",\n showValue = false,\n label,\n getValueLabel,\n className,\n ...props\n}: MeterProps) {\n const clamped = Math.min(Math.max(value, min), max);\n const percentage = max === min ? 0 : ((clamped - min) / (max - min)) * 100;\n\n return (\n <div\n className={cn(\"w-full\", className)}\n {...props}\n data-opt-id=\"G01TE\"\n data-opt-slug=\"meter.Meter\"\n >\n {(showValue || label) && (\n <div className=\"mb-1.5 flex items-center justify-between text-sm\">\n {label && (\n <span className=\"text-text-primary font-medium\">{label}</span>\n )}\n {showValue && (\n <span className=\"text-text-tertiary\">\n {Math.round(percentage)}%\n </span>\n )}\n </div>\n )}\n <MeterPrimitive\n value={clamped}\n min={min}\n max={max}\n getValueLabel={getValueLabel}\n aria-label={label ?? `${Math.round(percentage)}%`}\n className={cn(\n \"bg-bg-subtle w-full overflow-hidden rounded-full\",\n sizeStyles[size],\n )}\n >\n <div\n className={cn(\n \"h-full rounded-full transition-all duration-300 ease-out\",\n variantStyles[variant],\n )}\n style={{ width: `${percentage}%` }}\n />\n </MeterPrimitive>\n </div>\n );\n}\n","\"use client\";\n\nimport { useState, useCallback, useRef } from \"react\";\nimport { cn } from \"../lib/cn\";\nimport {\n OPT_BORDER,\n OPT_SURFACE,\n OPT_TEXT_PRIMARY,\n OPT_TEXT_SECONDARY,\n OPT_TEXT_TERTIARY,\n OPT_TEXT_LABEL,\n OPT_FOCUS_VISIBLE,\n} from \"../lib/styles\";\nimport { Button } from \"./button\";\n\n/** Defines the step shape. */\nexport interface StepDef {\n id: string;\n label: string;\n description?: string;\n}\n\n/** Props for the step builder component. */\nexport interface StepBuilderProps {\n steps: StepDef[];\n onChange: (steps: StepDef[]) => void;\n label?: string;\n addLabel?: string;\n maxSteps?: number;\n className?: string;\n \"aria-label\"?: string;\n}\n\n/** Renders the step builder component. */\nexport function StepBuilder({\n steps,\n onChange,\n label,\n addLabel = \"Add step\",\n maxSteps,\n className,\n \"aria-label\": ariaLabel,\n}: StepBuilderProps) {\n const [editingId, setEditingId] = useState<string | null>(null);\n const nextStepIdRef = useRef(1);\n\n const createStepId = useCallback(() => {\n const existingIds = new Set(steps.map((step) => step.id));\n let id = \"\";\n\n do {\n id = `step-${nextStepIdRef.current++}`;\n } while (existingIds.has(id));\n\n return id;\n }, [steps]);\n\n const addStep = useCallback(() => {\n if (maxSteps && steps.length >= maxSteps) return;\n const newStep: StepDef = {\n id: createStepId(),\n label: `Step ${steps.length + 1}`,\n };\n onChange([...steps, newStep]);\n setEditingId(newStep.id);\n }, [steps, onChange, maxSteps, createStepId]);\n\n const removeStep = useCallback(\n (id: string) => {\n onChange(steps.filter((s) => s.id !== id));\n if (editingId === id) setEditingId(null);\n },\n [steps, onChange, editingId],\n );\n\n const updateStep = useCallback(\n (id: string, updates: Partial<StepDef>) => {\n onChange(steps.map((s) => (s.id === id ? { ...s, ...updates } : s)));\n },\n [steps, onChange],\n );\n\n const moveStep = useCallback(\n (index: number, direction: -1 | 1) => {\n const target = index + direction;\n if (target < 0 || target >= steps.length) return;\n const newSteps = [...steps];\n [newSteps[index], newSteps[target]] = [newSteps[target], newSteps[index]];\n onChange(newSteps);\n },\n [steps, onChange],\n );\n\n const atLimit = Boolean(maxSteps && steps.length >= maxSteps);\n\n return (\n <div\n className={cn(\"flex flex-col gap-3\", className)}\n role=\"list\"\n aria-label={ariaLabel ?? label ?? \"Step builder\"}\n data-opt-id=\"7BQDT\"\n data-opt-slug=\"step-builder.StepBuilder\"\n >\n {label && <span className={OPT_TEXT_LABEL}>{label}</span>}\n\n {steps.map((step, index) => (\n <div\n key={step.id}\n className={cn(OPT_SURFACE, OPT_BORDER, \"flex items-start gap-3 p-3\")}\n role=\"listitem\"\n >\n {/* Step number */}\n <span\n className=\"bg-accent text-accent-fg flex h-7 w-7 flex-shrink-0 items-center justify-center rounded-full text-xs font-bold\"\n aria-hidden=\"true\"\n >\n {index + 1}\n </span>\n\n {/* Content */}\n <div className=\"min-w-0 flex-1\">\n {editingId === step.id ? (\n <div className=\"flex flex-col gap-2\">\n <input\n type=\"text\"\n value={step.label}\n onChange={(e) =>\n updateStep(step.id, { label: e.target.value })\n }\n onKeyDown={(e) => {\n if (e.key === \"Enter\") setEditingId(null);\n }}\n className={cn(\n \"border-border bg-surface focus-visible:ring-ring focus-visible:ring-offset-ring-offset w-full rounded-md border px-2 py-1 text-sm outline-none focus-visible:ring-2 focus-visible:ring-offset-1\",\n OPT_TEXT_PRIMARY,\n OPT_FOCUS_VISIBLE,\n )}\n aria-label=\"Step label\"\n autoFocus\n />\n <input\n type=\"text\"\n value={step.description ?? \"\"}\n onChange={(e) =>\n updateStep(step.id, { description: e.target.value })\n }\n placeholder=\"Description (optional)\"\n className={cn(\n \"border-border bg-surface focus-visible:ring-ring focus-visible:ring-offset-ring-offset w-full rounded-md border px-2 py-1 text-sm outline-none focus-visible:ring-2 focus-visible:ring-offset-1\",\n OPT_TEXT_PRIMARY,\n \"placeholder:text-text-tertiary\",\n OPT_FOCUS_VISIBLE,\n )}\n aria-label=\"Step description\"\n />\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setEditingId(null)}\n >\n Done\n </Button>\n </div>\n ) : (\n <button\n type=\"button\"\n className=\"w-full text-left\"\n onClick={() => setEditingId(step.id)}\n aria-label={`Edit ${step.label}`}\n >\n <span className={cn(OPT_TEXT_PRIMARY, \"text-sm font-medium\")}>\n {step.label}\n </span>\n {step.description && (\n <span\n className={cn(OPT_TEXT_SECONDARY, \"mt-0.5 block text-xs\")}\n >\n {step.description}\n </span>\n )}\n </button>\n )}\n </div>\n\n {/* Actions */}\n <div className=\"flex flex-shrink-0 items-center gap-1\">\n <button\n type=\"button\"\n onClick={() => moveStep(index, -1)}\n disabled={index === 0}\n className={cn(\n \"rounded p-1 text-sm\",\n OPT_TEXT_TERTIARY,\n \"hover:bg-bg-subtle\",\n \"disabled:opacity-30\",\n OPT_FOCUS_VISIBLE,\n )}\n aria-label=\"Move up\"\n >\n ▲\n </button>\n <button\n type=\"button\"\n onClick={() => moveStep(index, 1)}\n disabled={index === steps.length - 1}\n className={cn(\n \"rounded p-1 text-sm\",\n OPT_TEXT_TERTIARY,\n \"hover:bg-bg-subtle\",\n \"disabled:opacity-30\",\n OPT_FOCUS_VISIBLE,\n )}\n aria-label=\"Move down\"\n >\n ▼\n </button>\n <button\n type=\"button\"\n onClick={() => removeStep(step.id)}\n className={cn(\n \"text-danger-fg hover:bg-danger-subtle rounded p-1 text-sm\",\n OPT_FOCUS_VISIBLE,\n )}\n aria-label={`Remove ${step.label}`}\n >\n ✕\n </button>\n </div>\n </div>\n ))}\n\n {/* Add button */}\n <Button\n variant=\"secondary\"\n size=\"sm\"\n onClick={addStep}\n disabled={atLimit}\n className=\"self-start\"\n >\n + {addLabel}\n </Button>\n </div>\n );\n}\n\nStepBuilder.displayName = \"StepBuilder\";\n","export const OPT_UI_DEFAULT_LOCALE = \"ko-KR\";\n\nconst KST_OFFSET_MS = 9 * 60 * 60 * 1000;\n\ntype OptDateInput = string | number | Date;\n\ninterface OptDateParts {\n year: number;\n month: number;\n day: number;\n hour: number;\n minute: number;\n second: number;\n}\n\n// Keep rendered date text deterministic across Node and browser ICU builds.\nfunction getKstDateParts(input: OptDateInput): OptDateParts | null {\n const date = input instanceof Date ? input : new Date(input);\n\n if (Number.isNaN(date.getTime())) {\n return null;\n }\n\n const kstDate = new Date(date.getTime() + KST_OFFSET_MS);\n\n return {\n year: kstDate.getUTCFullYear(),\n month: kstDate.getUTCMonth() + 1,\n day: kstDate.getUTCDate(),\n hour: kstDate.getUTCHours(),\n minute: kstDate.getUTCMinutes(),\n second: kstDate.getUTCSeconds(),\n };\n}\n\nfunction pad2(value: number): string {\n return String(value).padStart(2, \"0\");\n}\n\nfunction meridiem(hour: number): \"오전\" | \"오후\" {\n return hour < 12 ? \"오전\" : \"오후\";\n}\n\nfunction hour12(hour: number): number {\n const normalized = hour % 12;\n return normalized === 0 ? 12 : normalized;\n}\n\n/** Formats a date as Korean short date text in the opt-ui default timezone. */\nexport function formatOptShortDate(input: OptDateInput): string {\n const parts = getKstDateParts(input);\n\n if (!parts) {\n return \"-\";\n }\n\n return `${parts.month}월 ${parts.day}일`;\n}\n\n/** Formats a date as Korean clock time in the opt-ui default timezone. */\nexport function formatOptTime(input: OptDateInput): string {\n const parts = getKstDateParts(input);\n\n if (!parts) {\n return \"-\";\n }\n\n return `${meridiem(parts.hour)} ${pad2(hour12(parts.hour))}:${pad2(\n parts.minute,\n )}`;\n}\n\n/** Formats a date as Korean date-time text in the opt-ui default timezone. */\nexport function formatOptDateTime(input: OptDateInput): string {\n const parts = getKstDateParts(input);\n\n if (!parts) {\n return \"-\";\n }\n\n return `${parts.year}. ${parts.month}. ${parts.day}. ${meridiem(\n parts.hour,\n )} ${hour12(parts.hour)}:${pad2(parts.minute)}:${pad2(parts.second)}`;\n}\n\n/** Formats numbers without depending on the runtime default locale. */\nexport function formatOptNumber(value: number): string {\n return new Intl.NumberFormat(OPT_UI_DEFAULT_LOCALE).format(value);\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { useCallback, useEffect } from \"react\";\nimport { cn } from \"../lib/cn\";\nimport { formatOptNumber } from \"../lib/formatters\";\nimport {\n OPT_BORDER,\n OPT_SURFACE,\n OPT_TEXT_PRIMARY,\n OPT_TEXT_SECONDARY,\n OPT_TEXT_LABEL,\n OPT_FOCUS_VISIBLE,\n} from \"../lib/styles\";\nimport { Button } from \"./button\";\n\n/** Type definition for condition operator. */\nexport type ConditionOperator =\n | \"equals\"\n | \"not_equals\"\n | \"contains\"\n | \"not_contains\"\n | \"gt\"\n | \"lt\"\n | \"gte\"\n | \"lte\"\n | \"is_set\"\n | \"is_not_set\";\n\n/** Defines the condition shape. */\nexport interface ConditionDef {\n id: string;\n property: string;\n operator: ConditionOperator;\n value: string;\n /** Condition type for heterogeneous builders (e.g. \"property\", \"event\", \"cohort\") */\n type?: string;\n}\n\n/** Defines the condition group shape. */\nexport interface ConditionGroup {\n id: string;\n logic: \"and\" | \"or\";\n conditions: ConditionDef[];\n /** Nested sub-groups for unlimited depth AND/OR nesting */\n children?: ConditionGroup[];\n}\n\n/** Custom renderer for a condition type */\nexport interface ConditionTypeRenderer {\n label: string;\n render: (\n condition: ConditionDef,\n onChange: (updates: Partial<ConditionDef>) => void,\n ) => React.ReactNode;\n}\n\n/** Props for the condition builder component. */\nexport interface ConditionBuilderProps {\n groups: ConditionGroup[];\n onChange: (groups: ConditionGroup[]) => void;\n properties?: string[];\n label?: string;\n addConditionLabel?: string;\n addGroupLabel?: string;\n /** Label for \"Add nested group\" button */\n addNestedGroupLabel?: string;\n /** Enable nested sub-groups */\n nested?: boolean;\n /** Max nesting depth (default: 3) */\n maxDepth?: number;\n /** Registry of custom condition type renderers */\n conditionTypes?: Record<string, ConditionTypeRenderer>;\n /** Callback for live preview count */\n onPreview?: (groups: ConditionGroup[]) => void;\n /** Live preview count to display */\n previewCount?: number;\n className?: string;\n \"aria-label\"?: string;\n}\n\nconst OPERATOR_LABELS: Record<ConditionOperator, string> = {\n equals: \"equals\",\n not_equals: \"does not equal\",\n contains: \"contains\",\n not_contains: \"does not contain\",\n gt: \">\",\n lt: \"<\",\n gte: \">=\",\n lte: \"<=\",\n is_set: \"is set\",\n is_not_set: \"is not set\",\n};\n\nconst OPERATORS: Set<string> = new Set<string>([\n \"equals\",\n \"not_equals\",\n \"contains\",\n \"not_contains\",\n \"gt\",\n \"lt\",\n \"gte\",\n \"lte\",\n \"is_set\",\n \"is_not_set\",\n]);\n\nfunction isConditionOperator(v: string): v is ConditionOperator {\n return OPERATORS.has(v);\n}\n\nconst NO_VALUE_OPS: ConditionOperator[] = [\"is_set\", \"is_not_set\"];\n\nconst DEFAULT_PROPERTIES = [\n \"event_name\",\n \"user_id\",\n \"email\",\n \"country\",\n \"browser\",\n \"os\",\n \"device\",\n \"page_url\",\n \"referrer\",\n \"amount\",\n];\n\ninterface ConditionBuilderIdCollection {\n groupIds: Set<string>;\n conditionIds: Set<string>;\n}\n\ninterface ConditionBuilderIdScope {\n nextGroupIdRef: React.MutableRefObject<number>;\n nextConditionIdRef: React.MutableRefObject<number>;\n getReservedIds: () => ConditionBuilderIdCollection;\n}\n\nconst ConditionBuilderIdScopeContext =\n React.createContext<ConditionBuilderIdScope | null>(null);\n\nfunction collectConditionBuilderIds(\n groups: ConditionGroup[],\n): ConditionBuilderIdCollection {\n const groupIds = new Set<string>();\n const conditionIds = new Set<string>();\n\n const visit = (items: ConditionGroup[]) => {\n for (const group of items) {\n groupIds.add(group.id);\n for (const condition of group.conditions) {\n conditionIds.add(condition.id);\n }\n if (group.children) {\n visit(group.children);\n }\n }\n };\n\n visit(groups);\n return { groupIds, conditionIds };\n}\n\n/** Renders the condition builder component. */\nexport function ConditionBuilder({\n groups,\n onChange,\n properties = DEFAULT_PROPERTIES,\n label,\n addConditionLabel = \"Add condition\",\n addGroupLabel = \"Add group\",\n addNestedGroupLabel = \"Add nested group\",\n nested = false,\n maxDepth = 3,\n conditionTypes,\n onPreview,\n previewCount,\n className,\n \"aria-label\": ariaLabel,\n}: ConditionBuilderProps) {\n const inheritedIdScope = React.useContext(ConditionBuilderIdScopeContext);\n const nextGroupIdRef = React.useRef(1);\n const nextConditionIdRef = React.useRef(1);\n const getLocalReservedIds = useCallback(\n () => collectConditionBuilderIds(groups),\n [groups],\n );\n const localIdScope = React.useMemo<ConditionBuilderIdScope>(\n () => ({\n nextGroupIdRef,\n nextConditionIdRef,\n getReservedIds: getLocalReservedIds,\n }),\n [getLocalReservedIds],\n );\n const idScope = inheritedIdScope ?? localIdScope;\n\n const createGroupId = useCallback(\n (suffix = \"\") => {\n const { groupIds } = idScope.getReservedIds();\n let id = \"\";\n\n do {\n id = `group-${idScope.nextGroupIdRef.current++}${suffix}`;\n } while (groupIds.has(id));\n\n return id;\n },\n [idScope],\n );\n\n const createConditionId = useCallback(\n (suffix = \"\") => {\n const { conditionIds } = idScope.getReservedIds();\n let id = \"\";\n\n do {\n id = `cond-${idScope.nextConditionIdRef.current++}${suffix}`;\n } while (conditionIds.has(id));\n\n return id;\n },\n [idScope],\n );\n\n // Fire preview callback when groups change\n useEffect(() => {\n onPreview?.(groups);\n }, [groups, onPreview]);\n const addGroup = useCallback(() => {\n const newGroup: ConditionGroup = {\n id: createGroupId(),\n logic: \"and\",\n conditions: [\n {\n id: createConditionId(),\n property: properties[0] ?? \"\",\n operator: \"equals\",\n value: \"\",\n },\n ],\n };\n onChange([...groups, newGroup]);\n }, [groups, onChange, properties, createGroupId, createConditionId]);\n\n const removeGroup = useCallback(\n (groupId: string) => {\n onChange(groups.filter((g) => g.id !== groupId));\n },\n [groups, onChange],\n );\n\n const updateGroupLogic = useCallback(\n (groupId: string, logic: \"and\" | \"or\") => {\n onChange(groups.map((g) => (g.id === groupId ? { ...g, logic } : g)));\n },\n [groups, onChange],\n );\n\n const addCondition = useCallback(\n (groupId: string) => {\n onChange(\n groups.map((g) =>\n g.id === groupId\n ? {\n ...g,\n conditions: [\n ...g.conditions,\n {\n id: createConditionId(),\n property: properties[0] ?? \"\",\n operator: \"equals\" as ConditionOperator,\n value: \"\",\n },\n ],\n }\n : g,\n ),\n );\n },\n [groups, onChange, properties, createConditionId],\n );\n\n const removeCondition = useCallback(\n (groupId: string, condId: string) => {\n onChange(\n groups.map((g) =>\n g.id === groupId\n ? {\n ...g,\n conditions: g.conditions.filter((c) => c.id !== condId),\n }\n : g,\n ),\n );\n },\n [groups, onChange],\n );\n\n const updateCondition = useCallback(\n (groupId: string, condId: string, updates: Partial<ConditionDef>) => {\n onChange(\n groups.map((g) =>\n g.id === groupId\n ? {\n ...g,\n conditions: g.conditions.map((c) =>\n c.id === condId ? { ...c, ...updates } : c,\n ),\n }\n : g,\n ),\n );\n },\n [groups, onChange],\n );\n\n return (\n <ConditionBuilderIdScopeContext.Provider value={idScope}>\n <div\n className={cn(\"flex flex-col gap-3\", className)}\n aria-label={ariaLabel ?? label ?? \"Condition builder\"}\n data-opt-id=\"SXXKJ\"\n data-opt-slug=\"condition-builder.ConditionBuilder\"\n >\n {label && <span className={OPT_TEXT_LABEL}>{label}</span>}\n\n {groups.map((group, groupIndex) => (\n <div key={group.id}>\n {/* OR separator between groups */}\n {groupIndex > 0 && (\n <div className=\"my-2 flex items-center gap-2\">\n <div className=\"bg-border-subtle h-px flex-1\" />\n <span className=\"text-warning-fg text-xs font-semibold uppercase\">\n OR\n </span>\n <div className=\"bg-border-subtle h-px flex-1\" />\n </div>\n )}\n\n <div\n className={cn(OPT_SURFACE, OPT_BORDER, \"p-3\")}\n role=\"group\"\n aria-label={`Condition group ${groupIndex + 1}`}\n >\n {/* Group header */}\n <div className=\"mb-2 flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <span\n className={cn(OPT_TEXT_SECONDARY, \"text-xs font-medium\")}\n >\n Match\n </span>\n <select\n value={group.logic}\n onChange={(e) => {\n const v = e.target.value;\n if (v === \"and\" || v === \"or\")\n updateGroupLogic(group.id, v);\n }}\n className={cn(\n \"border-border bg-surface focus-visible:ring-ring focus-visible:ring-offset-ring-offset rounded border px-2 py-0.5 text-xs font-semibold outline-none focus-visible:ring-2 focus-visible:ring-offset-1\",\n OPT_TEXT_PRIMARY,\n OPT_FOCUS_VISIBLE,\n )}\n aria-label=\"Group logic\"\n >\n <option value=\"and\">ALL</option>\n <option value=\"or\">ANY</option>\n </select>\n <span className={cn(OPT_TEXT_SECONDARY, \"text-xs\")}>\n of the following\n </span>\n </div>\n {groups.length > 1 && (\n <button\n type=\"button\"\n onClick={() => removeGroup(group.id)}\n className={cn(\n \"text-danger-fg hover:bg-danger-subtle rounded p-1 text-xs\",\n OPT_FOCUS_VISIBLE,\n )}\n aria-label=\"Remove group\"\n >\n ✕\n </button>\n )}\n </div>\n\n {/* Conditions */}\n <div className=\"flex flex-col gap-2\">\n {group.conditions.map((cond, condIndex) => {\n const customRenderer =\n cond.type != null ? conditionTypes?.[cond.type] : undefined;\n\n return (\n <div key={cond.id} className=\"flex items-center gap-2\">\n {condIndex > 0 && (\n <span\n className={cn(\n \"w-8 text-center text-[10px] font-semibold uppercase\",\n group.logic === \"and\"\n ? \"text-info-fg\"\n : \"text-warning-fg\",\n )}\n >\n {group.logic}\n </span>\n )}\n {condIndex === 0 && <span className=\"w-8\" />}\n\n {customRenderer ? (\n <div\n className=\"min-w-[100px] flex-1\"\n role=\"group\"\n aria-label={customRenderer.label}\n >\n {customRenderer.render(cond, (updates) =>\n updateCondition(group.id, cond.id, updates),\n )}\n </div>\n ) : (\n <>\n {/* Property */}\n <select\n value={cond.property}\n onChange={(e) =>\n updateCondition(group.id, cond.id, {\n property: e.target.value,\n })\n }\n className={cn(\n \"border-border bg-surface focus-visible:ring-ring focus-visible:ring-offset-ring-offset min-w-[120px] rounded border px-2 py-1.5 text-sm outline-none focus-visible:ring-2 focus-visible:ring-offset-1\",\n OPT_TEXT_PRIMARY,\n OPT_FOCUS_VISIBLE,\n )}\n aria-label=\"Property\"\n >\n {properties.map((p) => (\n <option key={p} value={p}>\n {p}\n </option>\n ))}\n </select>\n\n {/* Operator */}\n <select\n value={cond.operator}\n onChange={(e) => {\n const v = e.target.value;\n if (isConditionOperator(v))\n updateCondition(group.id, cond.id, {\n operator: v,\n });\n }}\n className={cn(\n \"border-border bg-surface focus-visible:ring-ring focus-visible:ring-offset-ring-offset min-w-[130px] rounded border px-2 py-1.5 text-sm outline-none focus-visible:ring-2 focus-visible:ring-offset-1\",\n OPT_TEXT_PRIMARY,\n OPT_FOCUS_VISIBLE,\n )}\n aria-label=\"Operator\"\n >\n {Object.entries(OPERATOR_LABELS).map(\n ([key, lbl]) => (\n <option key={key} value={key}>\n {lbl}\n </option>\n ),\n )}\n </select>\n\n {/* Value */}\n {!NO_VALUE_OPS.includes(cond.operator) && (\n <input\n type=\"text\"\n value={cond.value}\n onChange={(e) =>\n updateCondition(group.id, cond.id, {\n value: e.target.value,\n })\n }\n placeholder=\"Value\"\n className={cn(\n \"border-border bg-surface focus-visible:ring-ring focus-visible:ring-offset-ring-offset min-w-[100px] flex-1 rounded border px-2 py-1.5 text-sm outline-none focus-visible:ring-2 focus-visible:ring-offset-1\",\n OPT_TEXT_PRIMARY,\n \"placeholder:text-text-tertiary\",\n OPT_FOCUS_VISIBLE,\n )}\n aria-label=\"Value\"\n />\n )}\n </>\n )}\n\n {/* Remove condition */}\n {group.conditions.length > 1 && (\n <button\n type=\"button\"\n onClick={() => removeCondition(group.id, cond.id)}\n className={cn(\n \"text-danger-fg hover:bg-danger-subtle rounded p-1 text-sm\",\n OPT_FOCUS_VISIBLE,\n )}\n aria-label=\"Remove condition\"\n >\n ✕\n </button>\n )}\n </div>\n );\n })}\n </div>\n\n {/* Nested children groups */}\n {nested && group.children && group.children.length > 0 && (\n <div className=\"border-accent/30 mt-2 ml-4 border-l-2 pl-3\">\n <ConditionBuilder\n groups={group.children}\n onChange={(newChildren) => {\n onChange(\n groups.map((g) =>\n g.id === group.id\n ? { ...g, children: newChildren }\n : g,\n ),\n );\n }}\n properties={properties}\n addConditionLabel={addConditionLabel}\n addGroupLabel={addGroupLabel}\n addNestedGroupLabel={addNestedGroupLabel}\n nested={nested}\n maxDepth={maxDepth - 1}\n conditionTypes={conditionTypes}\n />\n </div>\n )}\n\n {/* Add condition + nested group buttons */}\n <div className=\"mt-2 flex items-center gap-2\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => addCondition(group.id)}\n >\n + {addConditionLabel}\n </Button>\n {nested && maxDepth > 1 && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => {\n const nestedGroup: ConditionGroup = {\n id: createGroupId(\"-nested\"),\n logic: group.logic === \"and\" ? \"or\" : \"and\",\n conditions: [\n {\n id: createConditionId(\"-nested\"),\n property: properties[0] ?? \"\",\n operator: \"equals\",\n value: \"\",\n },\n ],\n };\n onChange(\n groups.map((g) =>\n g.id === group.id\n ? {\n ...g,\n children: [...(g.children ?? []), nestedGroup],\n }\n : g,\n ),\n );\n }}\n >\n + {addNestedGroupLabel}\n </Button>\n )}\n </div>\n </div>\n </div>\n ))}\n\n {/* Add group */}\n <div className=\"flex items-center gap-3\">\n <Button\n variant=\"secondary\"\n size=\"sm\"\n onClick={addGroup}\n className=\"self-start\"\n >\n + {addGroupLabel}\n </Button>\n {previewCount != null && (\n <span className={cn(OPT_TEXT_SECONDARY, \"text-sm\")}>\n {formatOptNumber(previewCount)} matches\n </span>\n )}\n </div>\n </div>\n </ConditionBuilderIdScopeContext.Provider>\n );\n}\n\nConditionBuilder.displayName = \"ConditionBuilder\";\n","\"use client\";\n\nimport type { ComponentPropsWithoutRef } from \"react\";\nimport { cn } from \"../lib/cn\";\nimport {\n MenuRoot,\n MenuTrigger as BaseMenuTrigger,\n MenuPopover,\n MenuItem as BaseMenuItem,\n MenuSeparator as BaseMenuSeparator,\n} from \"./menu\";\n\n// ── DropdownMenu ──\n// MenuRoot의 별칭 — 단일 트리거 드롭다운에 특화된 이름\nexport const DropdownMenu = MenuRoot;\n\n// ── DropdownTrigger ──\n\ntype DropdownTriggerProps = ComponentPropsWithoutRef<typeof BaseMenuTrigger>;\n\n/** Renders the dropdown trigger component. */\nexport function DropdownTrigger({ className, ...props }: DropdownTriggerProps) {\n return (\n <BaseMenuTrigger\n className={cn(\"cursor-pointer gap-2\", className)}\n {...props}\n data-opt-id=\"C4BSS\"\n data-opt-slug=\"dropdown-menu.DropdownTrigger\"\n />\n );\n}\n\n// ── DropdownContent ──\n\ntype DropdownContentProps = ComponentPropsWithoutRef<typeof MenuPopover>;\n\n/** Renders the dropdown content component. */\nexport function DropdownContent({ className, ...props }: DropdownContentProps) {\n return (\n <MenuPopover\n className={cn(className)}\n {...props}\n data-opt-id=\"J6NF7\"\n data-opt-slug=\"dropdown-menu.DropdownContent\"\n />\n );\n}\n\n// ── DropdownItem ──\n\ntype DropdownItemProps = ComponentPropsWithoutRef<typeof BaseMenuItem> & {\n variant?: \"default\" | \"destructive\";\n};\n\n/** Renders the dropdown item component. */\nexport function DropdownItem({\n className,\n variant = \"default\",\n ...props\n}: DropdownItemProps) {\n return (\n <BaseMenuItem\n className={cn(\n \"cursor-pointer data-[disabled]:cursor-not-allowed\",\n variant === \"destructive\" &&\n \"text-danger-fg data-[active-item]:bg-danger-subtle data-[active-item]:text-danger-fg\",\n className,\n )}\n {...props}\n data-opt-id=\"5M6GA\"\n data-opt-slug=\"dropdown-menu.DropdownItem\"\n />\n );\n}\n\n// ── DropdownSeparator ──\n\ntype DropdownSeparatorProps = ComponentPropsWithoutRef<\n typeof BaseMenuSeparator\n>;\n\n/** Renders the dropdown separator component. */\nexport function DropdownSeparator({\n className,\n ...props\n}: DropdownSeparatorProps) {\n return (\n <BaseMenuSeparator\n className={cn(className)}\n {...props}\n data-opt-id=\"K9Y54\"\n data-opt-slug=\"dropdown-menu.DropdownSeparator\"\n />\n );\n}\n","\"use client\";\n\nimport {\n createContext,\n forwardRef,\n useContext,\n useId,\n useMemo,\n useCallback,\n type ComponentPropsWithoutRef,\n type ReactNode,\n} from \"react\";\nimport {\n RadioGroupRoot as PrimRadioGroupRoot,\n useRadioGroupContext as usePrimRadioGroupContext,\n} from \"@reopt-ai/opt-ui-primitives\";\nimport { cn } from \"../lib/cn\";\nimport {\n FieldMessages,\n RequiredMark,\n getDescribedBy,\n} from \"../lib/field-messages\";\n\n// RadioGroup Props\n/** Props for the radio group component. */\nexport interface RadioGroupProps {\n children: ReactNode;\n value?: string;\n defaultValue?: string;\n onChange?: (value: string) => void;\n disabled?: boolean;\n size?: \"sm\" | \"md\" | \"lg\";\n error?: string;\n required?: boolean;\n className?: string;\n /** Layout direction */\n orientation?: \"horizontal\" | \"vertical\";\n label?: string;\n name?: string;\n}\n\n// Radio Props\n/** Props for the radio component. */\nexport interface RadioProps extends Omit<\n ComponentPropsWithoutRef<\"label\">,\n \"size\" | \"onChange\"\n> {\n value?: string;\n /** Managed by RadioGroup — kept for backward compatibility */\n name?: string;\n label?: string;\n hint?: string;\n /** @deprecated Use `hint` instead */\n description?: string;\n size?: \"sm\" | \"md\" | \"lg\";\n disabled?: boolean;\n}\n\nconst sizeStyles = {\n sm: {\n radio: \"h-4 w-4\",\n dot: \"h-2 w-2\",\n text: \"text-sm\",\n },\n md: {\n radio: \"h-5 w-5\",\n dot: \"h-2.5 w-2.5\",\n text: \"text-sm\",\n },\n lg: {\n radio: \"h-6 w-6\",\n dot: \"h-3 w-3\",\n text: \"text-base\",\n },\n};\n\ninterface RadioGroupContextValue {\n size: \"sm\" | \"md\" | \"lg\";\n disabled?: boolean;\n}\n\nconst RadioGroupContext = createContext<RadioGroupContextValue>({\n size: \"md\",\n});\n\n/** Renders the radio group component. */\nexport function RadioGroup({\n children,\n value,\n defaultValue = \"\",\n onChange,\n disabled,\n size = \"md\",\n error,\n required,\n className,\n orientation = \"vertical\",\n label,\n name,\n}: RadioGroupProps) {\n const ctxValue = useMemo(() => ({ size, disabled }), [size, disabled]);\n const hasError = Boolean(error);\n const fallbackGroupId = useId().replace(/:/g, \"\");\n const groupId = label\n ? `radio-group-${label.replace(/\\s+/g, \"-\").toLowerCase()}`\n : `radio-group-${fallbackGroupId}`;\n const labelId = label ? `${groupId}-label` : undefined;\n\n return (\n <RadioGroupContext.Provider value={ctxValue}>\n <div\n className={cn(\"flex flex-col gap-1.5\", className)}\n data-opt-id=\"2F20H\"\n data-opt-slug=\"radio-group.RadioGroup\"\n >\n <PrimRadioGroupRoot\n value={value}\n defaultValue={defaultValue}\n onChange={onChange}\n disabled={disabled}\n orientation={orientation}\n name={name}\n id={groupId}\n aria-label={label ? undefined : \"Radio group\"}\n aria-labelledby={labelId}\n aria-required={required}\n aria-invalid={hasError}\n aria-describedby={getDescribedBy(groupId, error, undefined)}\n className={cn(\n \"flex\",\n orientation === \"vertical\" ? \"flex-col gap-3\" : \"flex-row gap-6\",\n )}\n >\n {label && (\n <div\n id={labelId}\n className=\"text-text-secondary mb-1 text-sm font-medium\"\n >\n {label}\n {required && <RequiredMark />}\n </div>\n )}\n {children}\n </PrimRadioGroupRoot>\n <FieldMessages id={groupId} error={error} />\n </div>\n </RadioGroupContext.Provider>\n );\n}\n\nexport const Radio = forwardRef<HTMLLabelElement, RadioProps>(\n (\n {\n label,\n hint,\n description,\n value,\n name: _name,\n size: sizeProp,\n disabled: disabledProp,\n className,\n ...props\n },\n ref,\n ) => {\n const groupContext = useContext(RadioGroupContext);\n const primContext = usePrimRadioGroupContext();\n const size = sizeProp ?? groupContext.size;\n const disabled =\n disabledProp ?? groupContext.disabled ?? primContext?.disabled;\n const hintText = hint ?? description;\n const styles = sizeStyles[size];\n const isChecked = primContext?.value === value;\n const fallbackRadioId = useId().replace(/:/g, \"\");\n const radioId = `radio-${fallbackRadioId}`;\n const labelId = label ? `${radioId}-label` : undefined;\n const hintId = hintText ? `${radioId}-hint` : undefined;\n\n const handleChange = useCallback(() => {\n if (!disabled && value != null) {\n primContext?.setValue(value);\n }\n }, [disabled, value, primContext]);\n\n return (\n <label\n ref={ref}\n aria-checked={isChecked}\n className={cn(\n \"group flex items-start gap-3\",\n disabled && \"cursor-not-allowed opacity-50\",\n !disabled && \"cursor-pointer\",\n className,\n )}\n {...props}\n data-opt-id=\"HY7YG\"\n data-opt-slug=\"radio-group.Radio\"\n >\n {/* Hidden native radio input for keyboard/form support */}\n <input\n id={radioId}\n type=\"radio\"\n name={primContext?.name}\n value={value}\n checked={isChecked}\n disabled={disabled}\n onChange={handleChange}\n aria-label={label ? undefined : (value ?? \"Radio option\")}\n aria-labelledby={labelId}\n aria-describedby={hintId}\n className=\"sr-only\"\n />\n {/* Radio circle */}\n <span\n className={cn(\n \"relative mt-0.5 inline-flex shrink-0 items-center justify-center rounded-full\",\n styles.radio,\n \"border-border border-2\",\n \"bg-surface\",\n \"group-aria-checked:border-accent\",\n \"transition-colors\",\n \"group-has-[:focus-visible]:outline-ring outline-transparent group-has-[:focus-visible]:outline-2 group-has-[:focus-visible]:-outline-offset-1\",\n )}\n aria-hidden=\"true\"\n >\n {/* Inner dot */}\n <span\n className={cn(\n styles.dot,\n \"bg-accent rounded-full\",\n \"scale-0 opacity-0 transition-all\",\n \"group-aria-checked:scale-100 group-aria-checked:opacity-100\",\n )}\n />\n </span>\n\n {/* Label and hint */}\n {(label || hintText) && (\n <div className=\"flex flex-col\">\n {label && (\n <span\n id={labelId}\n className={cn(\"text-text-primary font-medium\", styles.text)}\n >\n {label}\n </span>\n )}\n {hintText && (\n <span id={hintId} className=\"text-text-tertiary text-sm\">\n {hintText}\n </span>\n )}\n </div>\n )}\n </label>\n );\n },\n);\n\nRadio.displayName = \"Radio\";\n","import * as React from \"react\";\nimport { cn } from \"../lib/cn\";\nimport { Spinner } from \"./spinner\";\n\n/** Props for the loading overlay component. */\nexport interface LoadingOverlayProps extends React.HTMLAttributes<HTMLDivElement> {\n loading: boolean;\n children: React.ReactNode;\n label?: string;\n}\n\n/** Renders the loading overlay component. */\nexport function LoadingOverlay({\n loading,\n children,\n label = \"Loading…\",\n className,\n ...props\n}: LoadingOverlayProps) {\n return (\n <div\n data-opt-id=\"380ZR\"\n data-opt-slug=\"loading-overlay.LoadingOverlay\"\n {...props}\n className={cn(\"relative\", className)}\n >\n {children}\n {loading && (\n <div\n className=\"bg-surface/60 absolute inset-0 z-10 flex items-center justify-center rounded-lg backdrop-blur-[1px]\"\n role=\"status\"\n aria-live=\"polite\"\n aria-label={label}\n >\n <div className=\"flex flex-col items-center gap-2\">\n <Spinner size=\"md\" aria-hidden=\"true\" />\n <span className=\"text-text-tertiary text-sm\">{label}</span>\n </div>\n </div>\n )}\n </div>\n );\n}\n\nLoadingOverlay.displayName = \"LoadingOverlay\";\n","import * as React from \"react\";\nimport { cn } from \"../lib/cn\";\nimport { LoadingOverlay } from \"./loading-overlay\";\n\n/** Props for the block layout component. */\nexport interface BlockLayoutProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n /** Top-level spacing between Block sections. Defaults to \"section\". */\n spacing?: \"section\" | \"group\" | \"element\" | \"none\";\n /** Optional inner padding for page or standalone Block boundaries. */\n inset?: \"section\" | \"group\" | \"element\" | \"none\";\n /** Block 전체 로딩 상태 */\n loading?: boolean;\n /** LoadingOverlay 레이블 */\n loadingLabel?: string;\n}\n\nconst spacingClass: Record<NonNullable<BlockLayoutProps[\"spacing\"]>, string> = {\n section: \"gap-section\",\n group: \"gap-group\",\n element: \"gap-element\",\n none: \"gap-0\",\n};\n\nconst insetClass: Record<NonNullable<BlockLayoutProps[\"inset\"]>, string> = {\n section: \"p-section\",\n group: \"p-group\",\n element: \"p-element\",\n none: \"p-0\",\n};\n\n/** Renders the block layout component. */\nexport function BlockLayout({\n children,\n className,\n spacing = \"section\",\n inset,\n loading,\n loadingLabel,\n ...props\n}: BlockLayoutProps) {\n const layoutClassName = cn(\n \"flex flex-col\",\n spacingClass[spacing],\n inset ? insetClass[inset] : undefined,\n className,\n );\n\n if (loading) {\n return (\n <LoadingOverlay\n data-opt-id=\"9D8QR\"\n data-opt-slug=\"block-layout.BlockLayout\"\n {...props}\n className={layoutClassName}\n loading={loading}\n label={loadingLabel}\n >\n {children}\n </LoadingOverlay>\n );\n }\n\n return (\n <div\n data-opt-id=\"9D8QR\"\n data-opt-slug=\"block-layout.BlockLayout\"\n {...props}\n className={layoutClassName}\n >\n {children}\n </div>\n );\n}\n\nBlockLayout.displayName = \"BlockLayout\";\n","\"use client\";\n\nimport * as React from \"react\";\nimport { BlockLayout } from \"./block-layout\";\n\n/** Props for the block base component. */\nexport interface BlockBaseProps {\n loading?: boolean;\n className?: string;\n}\n\n/**\n * Block 팩토리. BlockLayout 래핑을 구조적으로 강제합니다.\n *\n * @param name - displayName으로 사용할 컴포넌트 이름\n * @param render - 나머지 props를 받아 콘텐츠를 반환하는 렌더 함수\n * @param options - layoutClassName: BlockLayout에 전달할 추가 className\n */\nexport function createBlock<P extends BlockBaseProps>(\n name: string,\n render: (props: Omit<P, \"loading\" | \"className\">) => React.ReactNode,\n options?: { layoutClassName?: string },\n): React.FC<P> {\n const Component: React.FC<P> = (props) => {\n const { loading, className, ...rest } = props;\n const layoutCn = options?.layoutClassName\n ? `${options.layoutClassName}${className ? ` ${className}` : \"\"}`\n : className;\n\n return (\n <BlockLayout loading={loading} className={layoutCn}>\n {render(rest as Omit<P, \"loading\" | \"className\">)}\n </BlockLayout>\n );\n };\n\n Component.displayName = name;\n return Component;\n}\n","import * as React from \"react\";\nimport { cn } from \"../lib/cn\";\n\n/** Props for the page header component. */\nexport interface PageHeaderProps {\n title: string;\n description?: string;\n actions?: React.ReactNode;\n className?: string;\n}\n\n/** Renders the page header component. */\nexport function PageHeader({\n title,\n description,\n actions,\n className,\n}: PageHeaderProps) {\n return (\n <div\n className={cn(\n \"gap-group flex flex-col items-stretch sm:flex-row sm:items-center sm:justify-between\",\n className,\n )}\n data-opt-id=\"7AK8Z\"\n data-opt-slug=\"page-header.PageHeader\"\n >\n <div className=\"gap-element flex min-w-0 flex-col\">\n <h2 className=\"text-text-primary text-lg font-semibold\">{title}</h2>\n {description && (\n <p className=\"text-text-tertiary text-sm\">{description}</p>\n )}\n </div>\n {actions && (\n <div className=\"gap-element flex w-full shrink-0 items-center sm:w-auto\">\n {actions}\n </div>\n )}\n </div>\n );\n}\n\nPageHeader.displayName = \"PageHeader\";\n","import * as React from \"react\";\nimport { cn } from \"../lib/cn\";\n\n/** Props for the scroll area component. */\nexport interface ScrollAreaProps {\n children: React.ReactNode;\n className?: string;\n orientation?: \"vertical\" | \"horizontal\" | \"both\";\n}\n\nconst overflowMap = {\n vertical: \"overflow-y-auto overflow-x-hidden\",\n horizontal: \"overflow-x-auto overflow-y-hidden\",\n both: \"overflow-auto\",\n} as const;\n\n/** Renders the scroll area component. */\nexport function ScrollArea({\n children,\n className,\n orientation = \"vertical\",\n}: ScrollAreaProps) {\n return (\n <div\n className={cn(\n overflowMap[orientation],\n // Custom scrollbar styling\n \"scrollbar-thin scrollbar-track-transparent scrollbar-thumb-border hover:scrollbar-thumb-border-hover\",\n className,\n )}\n data-opt-id=\"A9X4K\"\n data-opt-slug=\"scroll-area.ScrollArea\"\n >\n {children}\n </div>\n );\n}\n\nScrollArea.displayName = \"ScrollArea\";\n","import * as React from \"react\";\nimport { cn } from \"../lib/cn\";\n\n/** Props for the container component. */\nexport interface ContainerProps {\n children: React.ReactNode;\n maxWidth?: \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\" | \"full\";\n center?: boolean;\n className?: string;\n}\n\nconst maxWidthMap = {\n sm: \"max-w-screen-sm\",\n md: \"max-w-screen-md\",\n lg: \"max-w-screen-lg\",\n xl: \"max-w-screen-xl\",\n \"2xl\": \"max-w-screen-2xl\",\n full: \"max-w-full\",\n} as const;\n\n/** Renders the container component. */\nexport function Container({\n children,\n maxWidth = \"xl\",\n center = true,\n className,\n}: ContainerProps) {\n return (\n <div\n className={cn(\n maxWidthMap[maxWidth],\n center && \"mx-auto\",\n \"px-4\",\n className,\n )}\n data-opt-id=\"H3G96\"\n data-opt-slug=\"container.Container\"\n >\n {children}\n </div>\n );\n}\n\nContainer.displayName = \"Container\";\n","\"use client\";\n\nimport { useId, type ReactNode } from \"react\";\nimport { cn } from \"../lib/cn\";\n\n/** Props for the section component. */\nexport interface SectionProps {\n children: ReactNode;\n title?: string;\n description?: string;\n className?: string;\n}\n\n/** Renders the section component. */\nexport function Section({\n children,\n title,\n description,\n className,\n}: SectionProps) {\n const id = useId();\n const titleId = `${id}-title`;\n\n return (\n <section\n className={cn(\"gap-group flex flex-col\", className)}\n aria-labelledby={title ? titleId : undefined}\n data-opt-id=\"M3QXW\"\n data-opt-slug=\"section.Section\"\n >\n {(title || description) && (\n <div className=\"gap-element flex flex-col\">\n {title && (\n <h3\n id={titleId}\n className=\"text-text-primary text-base font-semibold\"\n >\n {title}\n </h3>\n )}\n {description && (\n <p className=\"text-text-tertiary text-sm\">{description}</p>\n )}\n </div>\n )}\n {children}\n </section>\n );\n}\n\nSection.displayName = \"Section\";\n","import * as React from \"react\";\nimport { GripVertical } from \"lucide-react\";\nimport { Group, Panel, Separator } from \"react-resizable-panels\";\nimport type {\n GroupImperativeHandle,\n GroupProps,\n Layout,\n PanelImperativeHandle,\n PanelProps,\n PanelSize,\n SeparatorProps,\n} from \"react-resizable-panels\";\nimport { cn } from \"../lib/cn\";\n\nexport type {\n GroupImperativeHandle as ResizablePanelGroupHandle,\n Layout as ResizablePanelLayout,\n PanelImperativeHandle as ResizablePanelHandle,\n PanelSize as ResizablePanelSize,\n};\n\ntype PercentageSize = number | string;\n\nfunction toPanelSize(size: PercentageSize | undefined) {\n return typeof size === \"number\" ? `${size}%` : size;\n}\n\n// ── ResizablePanelGroup ──\n\n/** Props for the resizable panel group component. */\nexport interface ResizablePanelGroupProps extends Omit<\n GroupProps,\n \"children\" | \"className\" | \"id\" | \"orientation\"\n> {\n direction: \"horizontal\" | \"vertical\";\n children: React.ReactNode;\n className?: string;\n id?: string;\n /** @deprecated Use `id` with `defaultLayout` and `onLayoutChanged`. */\n autoSaveId?: string;\n}\n\n/** Renders the resizable panel group component. */\nexport function ResizablePanelGroup({\n direction,\n children,\n className,\n id,\n autoSaveId,\n ...props\n}: ResizablePanelGroupProps) {\n return (\n <Group\n orientation={direction}\n id={id ?? autoSaveId}\n className={cn(\"flex h-full w-full\", className)}\n {...props}\n data-opt-id=\"BM5RR\"\n data-opt-slug=\"resizable.ResizablePanelGroup\"\n >\n {children}\n </Group>\n );\n}\n\nResizablePanelGroup.displayName = \"ResizablePanelGroup\";\n\n// ── ResizablePanel ──\n\n/** Props for the resizable panel component. */\nexport interface ResizablePanelProps extends Omit<\n PanelProps,\n | \"children\"\n | \"className\"\n | \"collapsedSize\"\n | \"defaultSize\"\n | \"maxSize\"\n | \"minSize\"\n> {\n collapsedSize?: PercentageSize;\n defaultSize?: PercentageSize;\n minSize?: PercentageSize;\n maxSize?: PercentageSize;\n children: React.ReactNode;\n className?: string;\n}\n\n/** Renders the resizable panel component. */\nexport function ResizablePanel({\n collapsedSize,\n defaultSize,\n minSize,\n maxSize,\n children,\n className,\n ...props\n}: ResizablePanelProps) {\n return (\n <Panel\n collapsedSize={toPanelSize(collapsedSize)}\n defaultSize={toPanelSize(defaultSize)}\n minSize={toPanelSize(minSize)}\n maxSize={toPanelSize(maxSize)}\n className={cn(\"overflow-auto\", className)}\n {...props}\n data-opt-id=\"88X4V\"\n data-opt-slug=\"resizable.ResizablePanel\"\n >\n {children}\n </Panel>\n );\n}\n\nResizablePanel.displayName = \"ResizablePanel\";\n\n// ── ResizableHandle ──\n\n/** Props for the resizable handle component. */\nexport interface ResizableHandleProps extends Omit<\n SeparatorProps,\n \"children\" | \"className\"\n> {\n className?: string;\n withHandle?: boolean;\n}\n\n/** Renders the resizable handle component. */\nexport function ResizableHandle({\n className,\n withHandle = false,\n ...props\n}: ResizableHandleProps) {\n return (\n <Separator\n className={cn(\n \"bg-border relative flex items-center justify-center\",\n \"after:absolute after:inset-y-0 after:left-1/2 after:w-1 after:-translate-x-1/2\",\n \"data-[resize-handle-active]:bg-accent\",\n \"[&[data-orientation=vertical]]:h-px [&[data-orientation=vertical]]:w-full\",\n \"[&[data-orientation=horizontal]]:h-full [&[data-orientation=horizontal]]:w-px\",\n className,\n )}\n {...props}\n data-opt-id=\"6Z22W\"\n data-opt-slug=\"resizable.ResizableHandle\"\n >\n {withHandle && (\n <div className=\"border-border bg-surface z-10 flex h-4 w-3 items-center justify-center rounded-sm border\">\n <GripVertical\n aria-hidden=\"true\"\n className=\"text-text-tertiary h-3 w-3\"\n />\n </div>\n )}\n </Separator>\n );\n}\n\nResizableHandle.displayName = \"ResizableHandle\";\n","\"use client\";\n\nimport { useState, type ReactNode } from \"react\";\nimport { cn } from \"../lib/cn\";\n\n/** Props for the logo component. */\nexport interface LogoProps {\n /** 로고 이미지 URL */\n src?: string;\n /** 로고 아이콘 (ReactNode) — src 미설정 시 표시 */\n icon?: ReactNode;\n /** 텍스트 레이블 */\n text?: string;\n /** 이미지 alt 텍스트 */\n alt?: string;\n /** 크기 */\n size?: \"sm\" | \"md\" | \"lg\";\n /** 링크 URL — 설정 시 <a>로 래핑 */\n href?: string;\n /** 클릭 핸들러 */\n onClick?: () => void;\n className?: string;\n}\n\nconst markSizeStyles: Record<NonNullable<LogoProps[\"size\"]>, string> = {\n sm: \"h-6 w-6\",\n md: \"h-8 w-8\",\n lg: \"h-10 w-10\",\n};\n\nconst textSizeStyles: Record<NonNullable<LogoProps[\"size\"]>, string> = {\n sm: \"text-sm\",\n md: \"text-base\",\n lg: \"text-lg\",\n};\n\n/** Renders the logo component. */\nexport function Logo({\n src,\n icon,\n text,\n alt = \"Logo\",\n size = \"md\",\n href,\n onClick,\n className,\n}: LogoProps) {\n const [imageError, setImageError] = useState(false);\n const showImage = src && !imageError;\n\n const fallbackLetter = text ? text.charAt(0).toUpperCase() : null;\n let mark: ReactNode = null;\n\n if (showImage) {\n mark = (\n <img\n src={src}\n alt={alt}\n className={cn(\"object-contain\", markSizeStyles[size])}\n onError={() => setImageError(true)}\n />\n );\n } else if (icon) {\n mark = (\n <span\n className={cn(\n \"flex shrink-0 items-center justify-center\",\n markSizeStyles[size],\n )}\n aria-hidden=\"true\"\n >\n {icon}\n </span>\n );\n } else if (fallbackLetter) {\n mark = (\n <span\n className={cn(\n \"bg-accent text-on-accent flex shrink-0 items-center justify-center rounded-lg font-bold\",\n markSizeStyles[size],\n textSizeStyles[size],\n )}\n aria-hidden=\"true\"\n >\n {fallbackLetter}\n </span>\n );\n }\n\n const content = (\n <>\n {mark}\n {text && (\n <span\n className={cn(\n \"text-text-primary font-semibold\",\n textSizeStyles[size],\n )}\n >\n {text}\n </span>\n )}\n </>\n );\n\n const sharedClassName = cn(\"inline-flex items-center gap-element\", className);\n\n if (href) {\n return (\n <a\n href={href}\n onClick={onClick}\n className={cn(sharedClassName, \"no-underline\")}\n aria-label={text ?? alt}\n data-opt-id=\"R906A\"\n data-opt-slug=\"logo.Logo\"\n >\n {content}\n </a>\n );\n }\n\n if (onClick) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className={sharedClassName}\n aria-label={text ?? alt}\n data-opt-id=\"R906A\"\n data-opt-slug=\"logo.Logo\"\n >\n {content}\n </button>\n );\n }\n\n return (\n <div\n className={sharedClassName}\n data-opt-id=\"R906A\"\n data-opt-slug=\"logo.Logo\"\n >\n {content}\n </div>\n );\n}\n","\"use client\";\n\nimport {\n DialogRoot as PrimDialogRoot,\n DialogPanel as PrimDialogPanel,\n DialogDismiss as PrimDialogDismiss,\n useDialogClose,\n} from \"@reopt-ai/opt-ui-primitives\";\nimport type {\n DialogRootProps,\n DialogPanelProps as PrimDialogPanelProps,\n} from \"@reopt-ai/opt-ui-primitives\";\nimport {\n useCallback,\n useEffect,\n useRef,\n useState,\n type ComponentPropsWithoutRef,\n type PointerEvent as ReactPointerEvent,\n} from \"react\";\nimport { cn } from \"../lib/cn\";\nimport { OPT_ANIMATE_DRAWER, OPT_FOCUS } from \"../lib/styles\";\n\n// ── Types ──\n\n/** Type definition for drawer side. */\nexport type DrawerSide = \"left\" | \"right\" | \"bottom\";\n/** Type definition for drawer size. */\nexport type DrawerSize = \"sm\" | \"md\" | \"lg\" | \"full\";\n\n/** Props for the drawer panel component. */\nexport interface DrawerPanelProps extends PrimDialogPanelProps {\n side?: DrawerSide;\n size?: DrawerSize;\n /** Enable drag-to-dismiss toward the drawer's edge. Default `true`. */\n swipeToDismiss?: boolean;\n /** Pixels the panel must be dragged before release commits a dismiss. */\n swipeDismissThreshold?: number;\n}\n\n// ── Size mapping ──\n\nconst sizeMap: Record<DrawerSize, string> = {\n sm: \"max-w-xs\",\n md: \"max-w-md\",\n lg: \"max-w-xl\",\n full: \"max-w-full\",\n};\n\nconst heightMap: Record<DrawerSize, string> = {\n sm: \"max-h-[320px]\",\n md: \"max-h-[480px]\",\n lg: \"max-h-[640px]\",\n full: \"max-h-full\",\n};\n\n// ── Slide animations ──\n// Drawer는 lib/styles.ts의 OPT_ANIMATE_DRAWER 토큰을 side별로 참조한다.\n\nconst positionClass: Record<DrawerSide, string> = {\n right: \"fixed inset-y-0 right-0\",\n left: \"fixed inset-y-0 left-0\",\n bottom: \"fixed inset-x-0 bottom-0\",\n};\n\n// ── Root ──\n\n/** Renders the drawer root component. */\nexport function DrawerRoot(props: DialogRootProps) {\n return (\n <PrimDialogRoot\n animated\n {...props}\n data-opt-id=\"YGJ0M\"\n data-opt-slug=\"drawer.DrawerRoot\"\n />\n );\n}\n\n// ── Panel ──\n\n/** Maps a drag delta to the dismiss offset for a given side (0 = no progress). */\nfunction dismissOffset(side: DrawerSide, dx: number, dy: number): number {\n switch (side) {\n case \"right\":\n return Math.max(0, dx);\n case \"left\":\n return Math.min(0, dx);\n case \"bottom\":\n return Math.max(0, dy);\n default:\n return 0;\n }\n}\n\n/** Renders the drawer panel component. */\nexport function DrawerPanel({\n className,\n side = \"right\",\n size = \"md\",\n swipeToDismiss = true,\n swipeDismissThreshold = 80,\n style,\n onPointerDown,\n ...props\n}: DrawerPanelProps) {\n const isHorizontal = side === \"left\" || side === \"right\";\n const close = useDialogClose();\n\n // ── Swipe-to-dismiss ──\n const dragStart = useRef<{ x: number; y: number } | null>(null);\n const [offset, setOffset] = useState(0);\n const [dragging, setDragging] = useState(false);\n\n const axis = side === \"bottom\" ? \"Y\" : \"X\";\n\n // Pixels of travel in the dismiss direction before a press becomes a drag.\n // Below this, pointerdown is left alone so clicks on children still fire.\n const DRAG_ACTIVATE = 6;\n\n const handlePointerDown = useCallback(\n (e: ReactPointerEvent<HTMLDialogElement>) => {\n onPointerDown?.(e);\n if (!swipeToDismiss || e.button !== 0) return;\n dragStart.current = { x: e.clientX, y: e.clientY };\n },\n [swipeToDismiss, onPointerDown],\n );\n\n const handlePointerMove = useCallback(\n (e: ReactPointerEvent<HTMLDialogElement>) => {\n const start = dragStart.current;\n if (!start) return;\n const next = dismissOffset(\n side,\n e.clientX - start.x,\n e.clientY - start.y,\n );\n if (!dragging) {\n if (Math.abs(next) < DRAG_ACTIVATE) return;\n setDragging(true);\n try {\n e.currentTarget.setPointerCapture(e.pointerId);\n } catch {\n // setPointerCapture unavailable (e.g. jsdom) — drag still tracked.\n }\n }\n setOffset(next);\n },\n [side, dragging],\n );\n\n const endDrag = useCallback(\n (e: ReactPointerEvent<HTMLDialogElement>) => {\n const wasDragging = dragging;\n dragStart.current = null;\n setDragging(false);\n try {\n e.currentTarget.releasePointerCapture(e.pointerId);\n } catch {\n // ignore\n }\n // Only a real drag past the threshold dismisses — a tap never does.\n if (wasDragging && Math.abs(offset) >= swipeDismissThreshold) {\n close();\n }\n setOffset(0);\n },\n [dragging, offset, swipeDismissThreshold, close],\n );\n\n // ── Virtual keyboard: lift a bottom drawer above the on-screen keyboard ──\n const [keyboardInset, setKeyboardInset] = useState(0);\n useEffect(() => {\n if (side !== \"bottom\" || typeof window === \"undefined\") return;\n const vv = window.visualViewport;\n if (!vv) return;\n const onResize = () => {\n const inset = Math.max(0, window.innerHeight - vv.height - vv.offsetTop);\n setKeyboardInset(inset);\n };\n onResize();\n vv.addEventListener(\"resize\", onResize);\n vv.addEventListener(\"scroll\", onResize);\n return () => {\n vv.removeEventListener(\"resize\", onResize);\n vv.removeEventListener(\"scroll\", onResize);\n };\n }, [side]);\n\n const dragStyle =\n offset !== 0 ? { transform: `translate${axis}(${offset}px)` } : undefined;\n\n return (\n <PrimDialogPanel\n className={cn(\n \"border-border bg-surface z-50 m-0 flex flex-col border p-0 shadow-2xl\",\n \"data-[enter]:fade-in data-[leave]:fade-out\",\n // Suppress the slide animation while actively dragging.\n dragging ? \"touch-none\" : OPT_ANIMATE_DRAWER[side],\n positionClass[side],\n isHorizontal\n ? [\"h-full w-full\", sizeMap[size]]\n : [\"w-full\", heightMap[size]],\n className,\n )}\n style={{\n ...style,\n ...dragStyle,\n ...(keyboardInset > 0 ? { marginBottom: keyboardInset } : null),\n ...(dragging ? { transition: \"none\" } : null),\n }}\n onPointerDown={handlePointerDown}\n onPointerMove={swipeToDismiss ? handlePointerMove : undefined}\n onPointerUp={swipeToDismiss ? endDrag : undefined}\n onPointerCancel={swipeToDismiss ? endDrag : undefined}\n {...props}\n data-opt-id=\"RQERV\"\n data-opt-slug=\"drawer.DrawerPanel\"\n />\n );\n}\n\n// ── Close ──\n\ntype DrawerCloseProps = ComponentPropsWithoutRef<\"button\">;\n\n/** Renders the drawer close component. */\nexport function DrawerClose({ className, ...props }: DrawerCloseProps) {\n return (\n <PrimDialogDismiss\n className={cn(\n \"hover:bg-bg-subtle rounded-md p-1.5 transition-colors\",\n \"cursor-pointer data-[disabled]:cursor-not-allowed\",\n OPT_FOCUS,\n className,\n )}\n {...props}\n data-opt-id=\"M6D6D\"\n data-opt-slug=\"drawer.DrawerClose\"\n />\n );\n}\n","\"use client\";\n\nimport {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type ReactNode,\n} from \"react\";\nimport { cn } from \"../lib/cn\";\n\n/** Props for the virtual list component. */\nexport interface VirtualListProps<T> {\n items: T[];\n renderItem: (item: T, index: number) => ReactNode;\n itemHeight: number;\n overscan?: number;\n className?: string;\n style?: CSSProperties;\n}\n\n/** Renders the virtual list component. */\nexport function VirtualList<T>({\n items,\n renderItem,\n itemHeight,\n overscan = 3,\n className,\n style,\n}: VirtualListProps<T>) {\n const containerRef = useRef<HTMLDivElement>(null);\n const scrollTopRef = useRef(0);\n const containerHeightRef = useRef(0);\n const rafIdRef = useRef(0);\n\n // State only tracks the visible range, not raw scrollTop\n const [visibleRange, setVisibleRange] = useState({ start: 0, end: 0 });\n\n const totalHeight = items.length * itemHeight;\n\n const computeRange = useCallback(\n (scrollTop: number, height: number) => {\n const start = Math.max(0, Math.floor(scrollTop / itemHeight) - overscan);\n const visibleCount = Math.ceil(height / itemHeight);\n const end = Math.min(\n items.length - 1,\n start + visibleCount + overscan * 2,\n );\n return { start, end };\n },\n [itemHeight, overscan, items.length],\n );\n\n const scheduleUpdate = useCallback(() => {\n if (rafIdRef.current) return;\n rafIdRef.current = requestAnimationFrame(() => {\n rafIdRef.current = 0;\n const newRange = computeRange(\n scrollTopRef.current,\n containerHeightRef.current,\n );\n setVisibleRange((prev) =>\n prev.start === newRange.start && prev.end === newRange.end\n ? prev\n : newRange,\n );\n });\n }, [computeRange]);\n\n const handleScroll = useCallback(() => {\n const el = containerRef.current;\n if (el) {\n scrollTopRef.current = el.scrollTop;\n if (el.clientHeight !== containerHeightRef.current) {\n containerHeightRef.current = el.clientHeight;\n }\n scheduleUpdate();\n }\n }, [scheduleUpdate]);\n\n const handleRef = useCallback(\n (el: HTMLDivElement | null) => {\n (containerRef as React.MutableRefObject<HTMLDivElement | null>).current =\n el;\n if (el) {\n containerHeightRef.current = el.clientHeight;\n const range = computeRange(0, el.clientHeight);\n setVisibleRange(range);\n }\n },\n [computeRange],\n );\n\n useEffect(() => {\n const el = containerRef.current;\n if (!el || typeof ResizeObserver === \"undefined\") return;\n\n const observer = new ResizeObserver(() => {\n const nextHeight = el.clientHeight;\n if (nextHeight !== containerHeightRef.current) {\n containerHeightRef.current = nextHeight;\n scheduleUpdate();\n }\n });\n\n observer.observe(el);\n\n return () => {\n observer.disconnect();\n };\n }, [scheduleUpdate]);\n\n useEffect(() => {\n scheduleUpdate();\n\n return () => {\n if (rafIdRef.current) {\n cancelAnimationFrame(rafIdRef.current);\n rafIdRef.current = 0;\n }\n };\n }, [scheduleUpdate, items.length, itemHeight, overscan]);\n\n const visibleItems = useMemo(() => {\n const result: ReactNode[] = [];\n for (\n let i = visibleRange.start;\n i <= visibleRange.end && i < items.length;\n i++\n ) {\n result.push(\n <div\n key={i}\n role=\"listitem\"\n style={{\n position: \"absolute\",\n top: i * itemHeight,\n left: 0,\n right: 0,\n height: itemHeight,\n }}\n >\n {renderItem(items[i], i)}\n </div>,\n );\n }\n return result;\n }, [visibleRange.start, visibleRange.end, items, itemHeight, renderItem]);\n\n return (\n <div\n ref={handleRef}\n onScroll={handleScroll}\n className={cn(\"overflow-auto\", className)}\n style={{ position: \"relative\", ...style }}\n role=\"list\"\n data-opt-id=\"VT2NP\"\n data-opt-slug=\"virtual-list.VirtualList\"\n >\n <div style={{ height: totalHeight, position: \"relative\" }}>\n {visibleItems}\n </div>\n </div>\n );\n}\n","/**\n * Shader 프리셋 레지스트리 — `ShaderSurface`가 렌더하는 고급 애니메이션 셰이더.\n *\n * 각 프리셋은 공유 GLSL 프렐류드(noise/fbm/rotate/grain/lux)에 자신의 `body`(프래그먼트\n * `main`)를 더해 완성된 프래그먼트 셰이더가 된다. 파라미터(scale/speed/...)는 프리셋이\n * 노출하는 슬라이더만 선언하며, 미선언 파라미터는 전역 기본값으로 uniform에 주입된다.\n *\n * 표현 방향: 은은하고 고급스러운(understated, premium) 마감 — 저채도 팔레트, 느린 모션,\n * 완만한 하이라이트, 미세한 필름 그레인. 모든 본문은 출력 직전 `lux()`로 살짝 디새추레이트한다.\n *\n * opt-ui `ShaderSurface`와 apps/web `shader-lab` 도구가 함께 소비한다(메타데이터: id,\n * 카테고리, 파라미터 스키마, 기본 색/값 / GLSL 원본: 내부).\n */\n\nexport type ShaderPresetId =\n | \"felix-metallic\"\n | \"liquid-silk\"\n | \"iridescent-pearl\"\n | \"molten-gold\"\n | \"liquid-glass\"\n | \"aurora-veil\"\n | \"holographic\"\n | \"chrome-ripple\"\n | \"mesh-flow\"\n | \"plasma-wave\"\n | \"swirl-vortex\"\n | \"caustics\"\n | \"nebula\"\n | \"voronoi-crystal\"\n | \"kaleidoscope\"\n | \"dither-gradient\"\n | \"halftone\"\n | \"dia-gradient\";\n\n/** 프리셋 분류 (카탈로그 그룹). */\nexport type ShaderPresetCategory =\n | \"luxury\"\n | \"flow\"\n | \"geometric\"\n | \"retro\"\n | \"gradient\";\n\n/** 조절 가능한 셰이더 파라미터 키. */\nexport type ShaderParamKey =\n | \"scale\"\n | \"speed\"\n | \"distortion\"\n | \"grain\"\n | \"contrast\"\n | \"angle\"\n // 모든 프리셋 공통 마감(가독성) 컨트롤 — 패턴과 무관하게 항상 적용된다.\n | \"dim\"\n | \"vignette\"\n | \"scrim\"\n // 포인터 반응(패럴랙스) 강도 — 모든 프리셋 공통.\n | \"interactive\"\n // dia-gradient(봉우리형 소프트 그라디언트) 전용 파라미터.\n | \"bars\"\n | \"blur\"\n | \"peak\"\n | \"valley\";\n\n/** 단일 파라미터의 범위/기본값 명세 (슬라이더 구성에 사용). */\nexport interface ShaderParamSpec {\n key: ShaderParamKey;\n min: number;\n max: number;\n step: number;\n default: number;\n}\n\n/** 하나의 셰이더 프리셋 정의 (메타데이터 + GLSL 본문). */\nexport interface ShaderPreset {\n id: ShaderPresetId;\n category: ShaderPresetCategory;\n /** 노출하는 색 입력 개수 (셰이더는 항상 3색 uniform을 받음). */\n colorSlots: 2 | 3;\n /** hex 색상 기본값 (길이 3). */\n defaultColors: [string, string, string];\n /** 이 프리셋이 노출하는 파라미터 슬라이더. */\n params: ShaderParamSpec[];\n /** 프래그먼트 셰이더 main 본문 (공유 프렐류드 뒤에 붙음). */\n body: string;\n}\n\n/** 모든 프리셋이 공유하는 풀스크린 정점 셰이더. */\nexport const SHADER_VERTEX = /* glsl */ `\nattribute vec2 position;\nattribute vec2 uv;\nvarying vec2 vUv;\nvoid main() {\n vUv = uv;\n gl_Position = vec4(position, 0.0, 1.0);\n}\n`;\n\n/**\n * 모든 프래그먼트 본문 앞에 붙는 공유 프렐류드.\n * uniform 선언 + 공통 helper(rotate/value noise/fbm/grain/lux/coords).\n */\nexport const SHADER_PRELUDE = /* glsl */ `\nprecision highp float;\nvarying vec2 vUv;\nuniform float u_time;\nuniform vec2 u_resolution;\nuniform float u_scale;\nuniform float u_speed;\nuniform float u_distortion;\nuniform float u_grain;\nuniform float u_contrast;\nuniform float u_angle;\nuniform float u_dim;\nuniform float u_vignette;\nuniform float u_scrim;\nuniform vec2 u_mouse;\nuniform float u_interactive;\nuniform float u_bars;\nuniform float u_blur;\nuniform float u_peak;\nuniform float u_valley;\nuniform vec3 u_color1;\nuniform vec3 u_color2;\nuniform vec3 u_color3;\n\nconst float PI = 3.14159265359;\n\nmat2 rot(float a){ float c = cos(a), s = sin(a); return mat2(c, -s, s, c); }\n\nfloat hash21(vec2 p){\n p = fract(p * vec2(123.34, 345.45));\n p += dot(p, p + 34.345);\n return fract(p.x * p.y);\n}\n\nfloat vnoise(vec2 p){\n vec2 i = floor(p);\n vec2 f = fract(p);\n vec2 u = f * f * (3.0 - 2.0 * f);\n float a = hash21(i);\n float b = hash21(i + vec2(1.0, 0.0));\n float c = hash21(i + vec2(0.0, 1.0));\n float d = hash21(i + vec2(1.0, 1.0));\n return mix(mix(a, b, u.x), mix(c, d, u.x), u.y);\n}\n\nfloat fbm(vec2 p){\n float v = 0.0;\n float amp = 0.5;\n for (int i = 0; i < 5; i++){\n v += amp * vnoise(p);\n p = rot(0.5) * p * 2.0;\n amp *= 0.5;\n }\n return v;\n}\n\n// fine film grain — subtle, premium texture\nvec3 grain(vec3 col, vec2 uv){\n float g = hash21(uv * u_resolution.xy + fract(u_time));\n return col + (g - 0.5) * u_grain;\n}\n\n// premium finish: gentle desaturation for an understated, refined look.\nvec3 lux(vec3 col){\n float l = dot(col, vec3(0.299, 0.587, 0.114));\n return clamp(mix(vec3(l), col, 0.82), 0.0, 1.0);\n}\n\n// shared output finish: refine + legibility overlays (dim / vignette / bottom\n// scrim) + film grain. Every preset ends with finish(col, vUv).\nvec3 finish(vec3 col, vec2 uv){\n col = lux(col);\n col *= 1.0 - u_dim * 0.85;\n float edge = length(uv - 0.5);\n col *= 1.0 - u_vignette * smoothstep(0.35, 0.85, edge);\n col *= 1.0 - u_scrim * smoothstep(0.2, 1.0, uv.y);\n col = grain(col, uv);\n return col;\n}\n\n// aspect-correct, angle-rotated, centered coords + pointer parallax\nvec2 coords(){\n vec2 uv = vUv - 0.5;\n uv.x *= u_resolution.x / max(u_resolution.y, 1.0);\n uv += (u_mouse - 0.5) * u_interactive * 0.3;\n uv = rot(radians(u_angle)) * uv;\n return uv;\n}\n`;\n\nconst PARAM_RANGE = {\n scale: { min: 0.4, max: 3, step: 0.1, default: 1 },\n speed: { min: 0, max: 3, step: 0.1, default: 0.5 },\n distortion: { min: 0, max: 1, step: 0.01, default: 0.4 },\n grain: { min: 0, max: 0.5, step: 0.01, default: 0.04 },\n contrast: { min: 0, max: 1, step: 0.01, default: 0.4 },\n angle: { min: 0, max: 360, step: 1, default: 0 },\n dim: { min: 0, max: 1, step: 0.01, default: 0 },\n vignette: { min: 0, max: 1, step: 0.01, default: 0 },\n scrim: { min: 0, max: 1, step: 0.01, default: 0 },\n interactive: { min: 0, max: 1, step: 0.01, default: 0 },\n bars: { min: 2, max: 40, step: 1, default: 19 },\n blur: { min: 0, max: 1, step: 0.01, default: 0.29 },\n peak: { min: 0, max: 1, step: 0.01, default: 0.98 },\n valley: { min: 0, max: 1, step: 0.01, default: 0.55 },\n} satisfies Record<ShaderParamKey, Omit<ShaderParamSpec, \"key\">>;\n\n/** 프리셋이 선언하지 않은 파라미터의 전역 기본값 (uniform 폴백). */\nexport const SHADER_PARAM_FALLBACK: Record<ShaderParamKey, number> = {\n scale: PARAM_RANGE.scale.default,\n speed: PARAM_RANGE.speed.default,\n distortion: PARAM_RANGE.distortion.default,\n grain: PARAM_RANGE.grain.default,\n contrast: PARAM_RANGE.contrast.default,\n angle: PARAM_RANGE.angle.default,\n dim: PARAM_RANGE.dim.default,\n vignette: PARAM_RANGE.vignette.default,\n scrim: PARAM_RANGE.scrim.default,\n interactive: PARAM_RANGE.interactive.default,\n bars: PARAM_RANGE.bars.default,\n blur: PARAM_RANGE.blur.default,\n peak: PARAM_RANGE.peak.default,\n valley: PARAM_RANGE.valley.default,\n};\n\nfunction param(key: ShaderParamKey, defaultValue?: number): ShaderParamSpec {\n const range = PARAM_RANGE[key];\n return {\n key,\n min: range.min,\n max: range.max,\n step: range.step,\n default: defaultValue ?? range.default,\n };\n}\n\nexport const SHADER_PRESETS: readonly ShaderPreset[] = [\n {\n id: \"felix-metallic\",\n category: \"luxury\",\n colorSlots: 3,\n defaultColors: [\"#0a1424\", \"#3a5a8c\", \"#c4d4e8\"],\n params: [\n param(\"scale\"),\n param(\"speed\", 0.4),\n param(\"distortion\", 0.45),\n param(\"contrast\", 0.4),\n param(\"grain\", 0.04),\n ],\n body: /* glsl */ `\nvoid main(){\n vec2 uv = coords() * u_scale;\n float t = u_time * u_speed * 0.3;\n vec2 q = vec2(fbm(uv + t), fbm(uv - t + 5.2));\n vec2 r = vec2(\n fbm(uv + q * 2.0 + vec2(1.7, 9.2) + t),\n fbm(uv + q * 2.0 + vec2(8.3, 2.8) - t)\n );\n float f = fbm(uv + r * (1.0 + u_distortion * 2.0));\n float band = sin((f + r.x * 0.5) * 6.2831 * 2.0);\n float spec = pow(abs(band), mix(2.0, 5.0, u_contrast));\n vec3 col = mix(u_color1, u_color2, smoothstep(0.0, 1.0, f + r.y * 0.4));\n col = mix(col, u_color3, spec * 0.5);\n gl_FragColor = vec4(finish(col, vUv), 1.0);\n}\n`,\n },\n {\n id: \"liquid-silk\",\n category: \"luxury\",\n colorSlots: 3,\n defaultColors: [\"#1c1428\", \"#6a5a8c\", \"#d8cfe4\"],\n params: [\n param(\"scale\"),\n param(\"speed\", 0.4),\n param(\"distortion\", 0.4),\n param(\"grain\", 0.04),\n param(\"angle\", 30),\n ],\n body: /* glsl */ `\nvoid main(){\n vec2 uv = coords() * u_scale;\n float t = u_time * u_speed * 0.25;\n float warp = fbm(uv * 1.5 + t);\n float folds = sin((uv.x * 3.0 + uv.y * 1.5 + warp * (2.0 + u_distortion * 4.0)) * PI);\n float sheen = 0.5 + 0.5 * folds;\n vec3 col = mix(u_color1, u_color2, sheen);\n col = mix(col, u_color3, pow(sheen, 5.0) * 0.6);\n gl_FragColor = vec4(finish(col, vUv), 1.0);\n}\n`,\n },\n {\n id: \"iridescent-pearl\",\n category: \"luxury\",\n colorSlots: 3,\n defaultColors: [\"#c9b8d6\", \"#a8c4d4\", \"#e4d4dc\"],\n params: [\n param(\"scale\"),\n param(\"speed\", 0.35),\n param(\"distortion\", 0.4),\n param(\"grain\", 0.04),\n ],\n body: /* glsl */ `\nvec3 palette3(float t){\n t = fract(t);\n float s = t * 3.0;\n if (s < 1.0) return mix(u_color1, u_color2, smoothstep(0.0, 1.0, s));\n if (s < 2.0) return mix(u_color2, u_color3, smoothstep(0.0, 1.0, s - 1.0));\n return mix(u_color3, u_color1, smoothstep(0.0, 1.0, s - 2.0));\n}\nvoid main(){\n vec2 uv = coords() * u_scale;\n float t = u_time * u_speed * 0.2;\n float n = fbm(uv * 1.2 + vec2(t, -t));\n float thin = fbm(uv * 2.5 - n * (1.0 + u_distortion * 3.0) + t * 0.5);\n vec3 col = palette3(thin * 1.5 + n * 0.5 + t * 0.1);\n col += pow(thin, 3.0) * 0.12;\n gl_FragColor = vec4(finish(col, vUv), 1.0);\n}\n`,\n },\n {\n id: \"molten-gold\",\n category: \"luxury\",\n colorSlots: 3,\n defaultColors: [\"#1c1208\", \"#b08848\", \"#e8d4a8\"],\n params: [\n param(\"scale\"),\n param(\"speed\", 0.4),\n param(\"contrast\", 0.4),\n param(\"grain\", 0.05),\n ],\n body: /* glsl */ `\nvoid main(){\n vec2 uv = coords() * u_scale;\n float t = u_time * u_speed * 0.3;\n vec2 q = vec2(fbm(uv + t), fbm(uv * 1.3 - t));\n float f = fbm(uv * 1.5 + q * 2.5);\n float heat = smoothstep(0.25, 0.95, f);\n vec3 col = mix(u_color1, u_color2, heat);\n float hot = pow(smoothstep(0.6, 1.0, f + q.x * 0.3), mix(3.0, 6.0, u_contrast));\n col = mix(col, u_color3, hot * 0.7);\n gl_FragColor = vec4(finish(col, vUv), 1.0);\n}\n`,\n },\n {\n id: \"liquid-glass\",\n category: \"luxury\",\n colorSlots: 3,\n defaultColors: [\"#0c1c2c\", \"#3a6a88\", \"#bcdce4\"],\n params: [\n param(\"scale\"),\n param(\"speed\", 0.4),\n param(\"distortion\", 0.4),\n param(\"grain\", 0.03),\n ],\n body: /* glsl */ `\nvoid main(){\n vec2 uv = coords() * u_scale;\n float t = u_time * u_speed * 0.2;\n vec2 p = uv;\n for (int i = 1; i < 5; i++){\n float fi = float(i);\n p += (1.0 + u_distortion) * vec2(\n 0.3 / fi * sin(fi * p.y + t + 0.3 * fi),\n 0.3 / fi * cos(fi * p.x + t + 0.3 * fi)\n );\n }\n float caustic = 0.5 + 0.5 * sin(p.x * 3.0) * cos(p.y * 3.0);\n vec3 col = mix(u_color1, u_color2, caustic);\n col = mix(col, u_color3, pow(caustic, 6.0) * 0.6);\n gl_FragColor = vec4(finish(col, vUv), 1.0);\n}\n`,\n },\n {\n id: \"aurora-veil\",\n category: \"luxury\",\n colorSlots: 3,\n defaultColors: [\"#050d18\", \"#2a8a8c\", \"#6a5a9c\"],\n params: [\n param(\"scale\"),\n param(\"speed\", 0.4),\n param(\"distortion\", 0.45),\n param(\"grain\", 0.03),\n param(\"angle\", 0),\n ],\n body: /* glsl */ `\nvoid main(){\n vec2 uv = coords() * u_scale;\n float t = u_time * u_speed * 0.3;\n vec3 col = u_color1;\n for (int i = 0; i < 3; i++){\n float fi = float(i);\n float band = uv.y * 1.5\n + sin(uv.x * 2.0 + t + fi * 1.7) * (0.3 + u_distortion * 0.5)\n + fbm(uv * 1.5 + t * 0.5 + fi) * 0.6;\n float glow = exp(-abs(band) * 3.0);\n vec3 rib = mix(u_color2, u_color3, fi * 0.5);\n col += rib * glow * 0.5;\n }\n gl_FragColor = vec4(finish(col, vUv), 1.0);\n}\n`,\n },\n {\n id: \"holographic\",\n category: \"luxury\",\n colorSlots: 3,\n defaultColors: [\"#14101e\", \"#8a6a9c\", \"#7a9caa\"],\n params: [\n param(\"scale\"),\n param(\"speed\", 0.35),\n param(\"distortion\", 0.4),\n param(\"grain\", 0.03),\n ],\n body: /* glsl */ `\nvec3 hsv2rgb(vec3 c){\n vec3 p = abs(fract(c.xxx + vec3(0.0, 2.0 / 3.0, 1.0 / 3.0)) * 6.0 - 3.0);\n return c.z * mix(vec3(1.0), clamp(p - 1.0, 0.0, 1.0), c.y);\n}\nvoid main(){\n vec2 uv = coords() * u_scale;\n float t = u_time * u_speed * 0.2;\n float n = fbm(uv * 1.5 + t);\n float ripple = fbm(uv * 3.0 - n * (1.0 + u_distortion * 2.0) + t);\n float hue = fract(ripple * 1.2 + n * 0.5 + length(uv) * 0.3 + t * 0.1);\n vec3 holo = hsv2rgb(vec3(hue, 0.3, 0.92));\n vec3 base = mix(u_color1, u_color2, n);\n vec3 col = mix(base, holo, 0.35);\n col = mix(col, u_color3, pow(ripple, 4.0) * 0.5);\n gl_FragColor = vec4(finish(col, vUv), 1.0);\n}\n`,\n },\n {\n id: \"chrome-ripple\",\n category: \"luxury\",\n colorSlots: 3,\n defaultColors: [\"#0e1420\", \"#6a7a92\", \"#d4dce4\"],\n params: [\n param(\"scale\"),\n param(\"speed\", 0.4),\n param(\"contrast\", 0.4),\n param(\"grain\", 0.04),\n ],\n body: /* glsl */ `\nvoid main(){\n vec2 uv = coords() * u_scale;\n float t = u_time * u_speed * 0.3;\n vec2 p = uv;\n for (int i = 1; i < 6; i++){\n float fi = float(i);\n p.x += (0.4 / fi) * sin(fi * 1.5 * p.y + t + fi);\n p.y += (0.4 / fi) * cos(fi * 1.5 * p.x + t + fi);\n }\n float sheen = 0.5 + 0.5 * sin(p.x * 3.0 + p.y * 2.0);\n float spec = pow(sheen, mix(3.0, 6.0, u_contrast));\n vec3 col = mix(u_color1, u_color2, sheen);\n col = mix(col, u_color3, spec * 0.5);\n gl_FragColor = vec4(finish(col, vUv), 1.0);\n}\n`,\n },\n {\n id: \"mesh-flow\",\n category: \"flow\",\n colorSlots: 3,\n defaultColors: [\"#3a4a6a\", \"#6a5a7c\", \"#4a7a82\"],\n params: [param(\"scale\"), param(\"speed\", 0.5), param(\"grain\", 0.04)],\n body: /* glsl */ `\nvoid main(){\n vec2 uv = coords() * u_scale;\n float t = u_time * u_speed * 0.4;\n vec2 p1 = vec2(sin(t * 0.7), cos(t * 0.9)) * 0.5;\n vec2 p2 = vec2(cos(t * 0.8 + 1.0), sin(t * 0.6 + 2.0)) * 0.5;\n vec2 p3 = vec2(sin(t * 0.5 + 3.0), cos(t * 0.7 + 4.0)) * 0.5;\n float d1 = 1.0 / (0.15 + dot(uv - p1, uv - p1));\n float d2 = 1.0 / (0.15 + dot(uv - p2, uv - p2));\n float d3 = 1.0 / (0.15 + dot(uv - p3, uv - p3));\n float sum = d1 + d2 + d3;\n vec3 col = (u_color1 * d1 + u_color2 * d2 + u_color3 * d3) / sum;\n gl_FragColor = vec4(finish(col, vUv), 1.0);\n}\n`,\n },\n {\n id: \"plasma-wave\",\n category: \"flow\",\n colorSlots: 3,\n defaultColors: [\"#2a2440\", \"#4a5a7c\", \"#8a6a7c\"],\n params: [\n param(\"scale\"),\n param(\"speed\", 0.4),\n param(\"distortion\", 0.4),\n param(\"grain\", 0.03),\n ],\n body: /* glsl */ `\nvoid main(){\n vec2 uv = coords() * u_scale * 3.0;\n float t = u_time * u_speed * 0.5;\n float v = sin(uv.x + t)\n + sin(uv.y + t * 1.3)\n + sin((uv.x + uv.y) * 0.7 + t)\n + sin(length(uv) * (1.0 + u_distortion * 2.0) - t * 1.5);\n v *= 0.25;\n float m = 0.5 + 0.5 * sin(v * PI);\n vec3 col = mix(u_color1, u_color2, m);\n col = mix(col, u_color3, (0.5 + 0.5 * sin(v * 6.2831)) * 0.5);\n gl_FragColor = vec4(finish(col, vUv), 1.0);\n}\n`,\n },\n {\n id: \"swirl-vortex\",\n category: \"flow\",\n colorSlots: 3,\n defaultColors: [\"#0a0e16\", \"#7c4a5c\", \"#3a7a72\"],\n params: [\n param(\"scale\"),\n param(\"speed\", 0.4),\n param(\"distortion\", 0.45),\n param(\"grain\", 0.03),\n ],\n body: /* glsl */ `\nvoid main(){\n vec2 uv = coords() * u_scale;\n float t = u_time * u_speed * 0.3;\n float r = length(uv);\n float a = atan(uv.y, uv.x);\n a += (1.0 + u_distortion * 3.0) * (0.5 / (r + 0.2)) + t;\n vec2 p = vec2(cos(a), sin(a)) * r;\n float n = fbm(p * 2.0 + t);\n float bands = sin((a * 3.0 + r * 6.0 - t * 2.0) + n * 4.0);\n float m = 0.5 + 0.5 * bands;\n vec3 col = mix(u_color1, u_color2, m);\n col = mix(col, u_color3, pow(m, 3.0) * 0.6);\n gl_FragColor = vec4(finish(col, vUv), 1.0);\n}\n`,\n },\n {\n id: \"caustics\",\n category: \"flow\",\n colorSlots: 3,\n defaultColors: [\"#04161f\", \"#2a6a7c\", \"#a8d4d0\"],\n params: [\n param(\"scale\"),\n param(\"speed\", 0.4),\n param(\"distortion\", 0.4),\n param(\"grain\", 0.03),\n ],\n body: /* glsl */ `\nvoid main(){\n vec2 uv = coords() * u_scale * 3.0;\n float t = u_time * u_speed * 0.4;\n vec2 p = uv;\n float c = 0.0;\n for (int i = 0; i < 4; i++){\n float fi = float(i);\n p += vec2(sin(p.y * 1.5 + t + fi), cos(p.x * 1.5 + t * 1.1 + fi))\n * (0.4 + u_distortion * 0.5);\n c += 1.0 / (length(fract(p) - 0.5) + 0.1);\n }\n c = pow(c * 0.06, 2.0);\n vec3 col = mix(u_color1, u_color2, clamp(c, 0.0, 1.0));\n col += u_color3 * pow(clamp(c - 0.6, 0.0, 1.0), 2.0) * 0.6;\n gl_FragColor = vec4(finish(col, vUv), 1.0);\n}\n`,\n },\n {\n id: \"nebula\",\n category: \"flow\",\n colorSlots: 3,\n defaultColors: [\"#06040e\", \"#4a3a6c\", \"#8a5a7c\"],\n params: [\n param(\"scale\"),\n param(\"speed\", 0.35),\n param(\"distortion\", 0.5),\n param(\"grain\", 0.03),\n ],\n body: /* glsl */ `\nvoid main(){\n vec2 uv = coords() * u_scale;\n float t = u_time * u_speed * 0.15;\n vec2 q = vec2(fbm(uv + t), fbm(uv * 1.2 - t + 3.0));\n float density = fbm(uv * 1.5 + q * (2.0 + u_distortion * 2.0));\n density = pow(density, 2.0);\n vec3 col = mix(u_color1, u_color2, density);\n col = mix(col, u_color3, pow(density, 3.0) * 0.8);\n float stars = step(0.99, hash21(floor(vUv * u_resolution.xy / 2.5)));\n col += vec3(stars) * 0.35;\n gl_FragColor = vec4(finish(col, vUv), 1.0);\n}\n`,\n },\n {\n id: \"voronoi-crystal\",\n category: \"geometric\",\n colorSlots: 3,\n defaultColors: [\"#121a30\", \"#3a5a82\", \"#c4d0e0\"],\n params: [\n param(\"scale\"),\n param(\"speed\", 0.35),\n param(\"contrast\", 0.4),\n param(\"grain\", 0.03),\n ],\n body: /* glsl */ `\nvec2 hash22(vec2 p){\n p = vec2(dot(p, vec2(127.1, 311.7)), dot(p, vec2(269.5, 183.3)));\n return fract(sin(p) * 43758.5453);\n}\nvoid main(){\n vec2 uv = coords() * u_scale * 3.0;\n float t = u_time * u_speed * 0.3;\n vec2 ip = floor(uv);\n vec2 fp = fract(uv);\n float f1 = 8.0;\n float f2 = 8.0;\n vec2 cellId = vec2(0.0);\n for (int j = -1; j <= 1; j++){\n for (int i = -1; i <= 1; i++){\n vec2 n = vec2(float(i), float(j));\n vec2 pnt = n + 0.5 + 0.4 * sin(t + 6.2831 * hash22(ip + n));\n float d = length(pnt - fp);\n if (d < f1){ f2 = f1; f1 = d; cellId = ip + n; }\n else if (d < f2){ f2 = d; }\n }\n }\n float facet = f2 - f1;\n float cell = hash22(cellId).x;\n vec3 col = mix(u_color1, u_color2, cell);\n col = mix(col, u_color3, smoothstep(0.05, 0.0, facet) * mix(0.4, 0.7, u_contrast));\n col += pow(max(0.0, 1.0 - f1), 4.0) * 0.1;\n gl_FragColor = vec4(finish(col, vUv), 1.0);\n}\n`,\n },\n {\n id: \"kaleidoscope\",\n category: \"geometric\",\n colorSlots: 3,\n defaultColors: [\"#1a1428\", \"#7c5a6c\", \"#b09a6a\"],\n params: [\n param(\"scale\"),\n param(\"speed\", 0.35),\n param(\"distortion\", 0.4),\n param(\"grain\", 0.03),\n ],\n body: /* glsl */ `\nvoid main(){\n vec2 uv = coords() * u_scale;\n float t = u_time * u_speed * 0.3;\n float r = length(uv);\n float a = atan(uv.y, uv.x);\n float seg = 6.0 + floor(u_distortion * 6.0);\n a = mod(a, 6.2831 / seg);\n a = abs(a - 3.14159 / seg);\n vec2 p = vec2(cos(a), sin(a)) * r;\n float pattern = fbm(p * 3.0 + t);\n float m = 0.5 + 0.5 * sin(pattern * 6.2831 + r * 4.0 - t);\n vec3 col = mix(u_color1, u_color2, m);\n col = mix(col, u_color3, pow(m, 3.0) * 0.6);\n gl_FragColor = vec4(finish(col, vUv), 1.0);\n}\n`,\n },\n {\n id: \"dither-gradient\",\n category: \"retro\",\n colorSlots: 3,\n defaultColors: [\"#14202e\", \"#7c4a54\", \"#d4d0c8\"],\n params: [param(\"scale\"), param(\"speed\", 0.35), param(\"distortion\", 0.35)],\n body: /* glsl */ `\nfloat bayer2(vec2 a){ a = floor(a); return fract(dot(a, vec2(0.5, a.y * 0.75))); }\nfloat bayer4(vec2 a){ return bayer2(0.5 * a) * 0.25 + bayer2(a); }\nvoid main(){\n vec2 uv = coords() * u_scale;\n float t = u_time * u_speed * 0.2;\n float g = fbm(uv * 1.5 + vec2(t, -t) * (0.5 + u_distortion));\n float levels = 5.0;\n float d = bayer4(gl_FragCoord.xy);\n float q = floor(g * levels + d) / levels;\n vec3 col = mix(u_color1, u_color2, clamp(q, 0.0, 1.0));\n col = mix(col, u_color3, smoothstep(0.7, 1.0, q));\n gl_FragColor = vec4(finish(col, vUv), 1.0);\n}\n`,\n },\n {\n id: \"halftone\",\n category: \"retro\",\n colorSlots: 3,\n defaultColors: [\"#161616\", \"#8a5a3a\", \"#c4a06a\"],\n params: [param(\"scale\"), param(\"speed\", 0.35), param(\"distortion\", 0.45)],\n body: /* glsl */ `\nvoid main(){\n vec2 uv = coords() * u_scale;\n float t = u_time * u_speed * 0.2;\n float g = fbm(uv * 1.5 + t);\n vec2 gp = gl_FragCoord.xy / mix(22.0, 9.0, clamp(u_distortion, 0.0, 1.0));\n vec2 cell = fract(gp) - 0.5;\n float radius = g * 0.7;\n float dot = smoothstep(radius, radius - 0.12, length(cell));\n vec3 col = mix(u_color1, u_color2, g);\n col = mix(col, u_color3, dot * 0.85);\n gl_FragColor = vec4(finish(col, vUv), 1.0);\n}\n`,\n },\n {\n id: \"dia-gradient\",\n category: \"gradient\",\n colorSlots: 3,\n defaultColors: [\"#FF9ECF\", \"#A9C9FF\", \"#FFF3A8\"],\n params: [\n param(\"bars\"),\n param(\"blur\"),\n param(\"peak\"),\n param(\"valley\"),\n param(\"speed\", 0.3),\n ],\n body: /* glsl */ `\nvoid main(){\n vec2 uv = vUv;\n float t = u_time * u_speed * 0.15;\n float cx = 0.5 + sin(t) * 0.04;\n float peakShape = clamp(1.0 - abs(uv.x - cx) * 2.0, 0.0, 1.0);\n peakShape = pow(peakShape, 0.85);\n float profile = mix(u_valley, u_peak, peakShape);\n float heightFromBottom = 1.0 - uv.y;\n float h = heightFromBottom / max(profile, 0.02);\n float bars = max(1.0, floor(u_bars));\n float hb = h * bars;\n float band = floor(hb);\n float frac = hb - band;\n float soft = mix(0.04, 0.5, clamp(u_blur, 0.0, 1.0));\n float sm = smoothstep(0.5 - soft, 0.5 + soft, frac);\n float hv = clamp((band + sm) / bars, 0.0, 1.0);\n vec3 col;\n if (hv < 0.33) col = mix(u_color1, u_color2, smoothstep(0.0, 0.33, hv));\n else if (hv < 0.66) col = mix(u_color2, u_color3, smoothstep(0.33, 0.66, hv));\n else col = mix(u_color3, vec3(1.0), smoothstep(0.66, 1.0, hv));\n float above = smoothstep(1.0, 1.0 + soft * 0.5, h);\n col = mix(col, vec3(1.0), above);\n gl_FragColor = vec4(finish(col, vUv), 1.0);\n}\n`,\n },\n];\n\nexport const SHADER_PRESET_IDS: readonly ShaderPresetId[] = SHADER_PRESETS.map(\n (preset) => preset.id,\n);\n\nexport const SHADER_PARAM_KEYS: readonly ShaderParamKey[] = [\n \"scale\",\n \"speed\",\n \"distortion\",\n \"grain\",\n \"contrast\",\n \"angle\",\n \"dim\",\n \"vignette\",\n \"scrim\",\n \"interactive\",\n \"bars\",\n \"blur\",\n \"peak\",\n \"valley\",\n];\n\n/** 패턴과 무관하게 모든 프리셋에 공통 적용되는 마감(가독성) 파라미터 키. */\nexport const SHADER_OVERLAY_PARAM_KEYS: readonly ShaderParamKey[] = [\n \"dim\",\n \"vignette\",\n \"scrim\",\n];\n\nconst PRESET_BY_ID = new Map(\n SHADER_PRESETS.map((preset) => [preset.id, preset]),\n);\n\n/** id로 프리셋 조회 (없으면 첫 프리셋 폴백). */\nexport function getShaderPreset(id: ShaderPresetId): ShaderPreset {\n return PRESET_BY_ID.get(id) ?? SHADER_PRESETS[0];\n}\n\n/** 공유 프렐류드 + 프리셋 본문을 합친 완성 프래그먼트 셰이더 소스. */\nexport function getShaderFragment(preset: ShaderPreset): string {\n return `${SHADER_PRELUDE}\\n${preset.body}`;\n}\n","\"use client\";\n\nimport {\n forwardRef,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n type CSSProperties,\n} from \"react\";\nimport { Mesh, Program, Renderer, Triangle } from \"ogl\";\nimport { hexToSrgb } from \"@reopt-ai/opt-palette\";\nimport { cn } from \"../lib/cn\";\nimport {\n getShaderFragment,\n getShaderPreset,\n SHADER_PARAM_FALLBACK,\n SHADER_VERTEX,\n type ShaderParamKey,\n type ShaderPresetId,\n} from \"./shader-presets\";\n\n/** 정지(`paused`) 프레임에 사용하는 고정 시간 — t=0의 밋밋함 회피. */\nconst STATIC_TIME = 8;\n\n/** `ShaderSurface` ref로 노출되는 명령형 핸들. */\nexport interface ShaderSurfaceHandle {\n /** 현재 프레임을 PNG data URL로 캡처. WebGL 미지원 시 null. */\n capture: () => string | null;\n}\n\n/**\n * 애니메이션 WebGL 셰이더 배경. 배경·카드 배경 등 장식용 서피스에 사용한다.\n * 프리셋 + 색/파라미터로 제어하며, 정지 프레임(`paused`)·캡처(ref)·우아한 폴백\n * (WebGL 미지원 시 CSS 그라디언트)을 지원한다.\n */\nexport interface ShaderSurfaceProps {\n /** 렌더할 셰이더 프리셋 id. */\n preset: ShaderPresetId;\n /** hex 색상 배열. 미지정 시 프리셋 기본 색. */\n colors?: string[];\n /** 패턴 스케일. 미지정 시 프리셋/전역 기본값. */\n scale?: number;\n /** 애니메이션 속도. */\n speed?: number;\n /** 왜곡 강도. */\n distortion?: number;\n /** 필름 그레인 양. */\n grain?: number;\n /** 하이라이트 대비. */\n contrast?: number;\n /** 회전 각도(도). */\n angle?: number;\n /** 전체 어둡게(가독성). 0~1. */\n dim?: number;\n /** 가장자리 비네트(가독성). 0~1. */\n vignette?: number;\n /** 하단 스크림 그라디언트(텍스트 가독성). 0~1. */\n scrim?: number;\n /** 포인터 반응(패럴랙스) 강도. 0~1. */\n interactive?: number;\n /**\n * 파라미터 일괄 오버라이드 맵. 명시적 prop이 우선하며, 프리셋 전용 파라미터\n * (bars/blur/peak/valley 등)는 이 맵으로 전달한다.\n */\n params?: Partial<Record<ShaderParamKey, number>>;\n /** paused일 때 렌더할 고정 시간(초). 미지정 시 기본 정지 프레임. */\n time?: number;\n /** true면 애니메이션 없이 단일 프레임만 렌더(카드 배경 등). */\n paused?: boolean;\n /** device pixel ratio 상한. 기본 min(devicePixelRatio, 2). */\n dpr?: number;\n /** 루트 요소 클래스. */\n className?: string;\n /** 루트 요소 인라인 스타일. */\n style?: CSSProperties;\n /** 접근성 트리에서 숨김. 장식용이라 기본 true. */\n \"aria-hidden\"?: boolean;\n}\n\ninterface ShaderStateSnapshot {\n preset: ShaderPresetId;\n colors: string[] | undefined;\n scale: number | undefined;\n speed: number | undefined;\n distortion: number | undefined;\n grain: number | undefined;\n contrast: number | undefined;\n angle: number | undefined;\n dim: number | undefined;\n vignette: number | undefined;\n scrim: number | undefined;\n interactive: number | undefined;\n params: Partial<Record<ShaderParamKey, number>> | undefined;\n time: number | undefined;\n paused: boolean;\n}\n\n/** hex → 0..1 RGB. 잘못된 hex는 검정으로 폴백. */\nfunction toRgbFloat(hex: string): [number, number, number] {\n try {\n const [r, g, b] = hexToSrgb(hex);\n return [r / 255, g / 255, b / 255];\n } catch {\n return [0, 0, 0];\n }\n}\n\nfunction resolveColors(\n presetId: ShaderPresetId,\n colors: string[] | undefined,\n): [string, string, string] {\n const preset = getShaderPreset(presetId);\n const source = colors && colors.length > 0 ? colors : preset.defaultColors;\n return [\n source[0] ?? preset.defaultColors[0],\n source[1] ?? source[0] ?? preset.defaultColors[1],\n source[2] ?? source[1] ?? source[0] ?? preset.defaultColors[2],\n ];\n}\n\nfunction resolveParam(\n presetId: ShaderPresetId,\n key: ShaderParamKey,\n override: number | undefined,\n): number {\n if (typeof override === \"number\" && Number.isFinite(override))\n return override;\n const spec = getShaderPreset(presetId).params.find((p) => p.key === key);\n return spec?.default ?? SHADER_PARAM_FALLBACK[key];\n}\n\nfunction prefersReducedMotion(): boolean {\n return typeof window !== \"undefined\" && window.matchMedia\n ? window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches\n : false;\n}\n\nconst ShaderSurfaceComponent = forwardRef<\n ShaderSurfaceHandle,\n ShaderSurfaceProps\n>(function ShaderSurface(\n {\n preset,\n colors,\n scale,\n speed,\n distortion,\n grain,\n contrast,\n angle,\n dim,\n vignette,\n scrim,\n interactive,\n params,\n time,\n paused = false,\n dpr,\n className,\n style,\n \"aria-hidden\": ariaHidden = true,\n },\n ref,\n) {\n const containerRef = useRef<HTMLDivElement>(null);\n const canvasRef = useRef<HTMLCanvasElement>(null);\n\n // 최신 prop 값을 프레임 루프에서 읽기 위한 ref.\n const stateRef = useRef<ShaderStateSnapshot>({\n preset,\n colors,\n scale,\n speed,\n distortion,\n grain,\n contrast,\n angle,\n dim,\n vignette,\n scrim,\n interactive,\n params,\n time,\n paused,\n });\n stateRef.current = {\n preset,\n colors,\n scale,\n speed,\n distortion,\n grain,\n contrast,\n angle,\n dim,\n vignette,\n scrim,\n interactive,\n params,\n time,\n paused,\n };\n\n // 렌더러는 canvas 수명 동안 1개 유지, 프로그램(셰이더)만 preset 변경 시 교체.\n const rendererRef = useRef<{\n renderer: Renderer;\n gl: Renderer[\"gl\"];\n } | null>(null);\n const programRef = useRef<{\n program: Program;\n mesh: Mesh;\n geometry: Triangle;\n } | null>(null);\n const renderAtRef = useRef<((timeSeconds: number) => void) | null>(null);\n const loopRef = useRef<{\n start: () => void;\n stop: () => void;\n isAnimating: () => boolean;\n } | null>(null);\n // 포인터 위치(0~1). 프레임마다 u_mouse로 주입.\n const mouseRef = useRef<[number, number]>([0.5, 0.5]);\n\n // 폴백/초기 배경: 색상으로 만든 CSS 그라디언트.\n const fallbackBackground = useMemo(() => {\n const [c1, c2, c3] = resolveColors(preset, colors);\n const deg = resolveParam(preset, \"angle\", angle);\n return `linear-gradient(${deg + 120}deg, ${c1}, ${c2}, ${c3})`;\n }, [preset, colors, angle]);\n\n useImperativeHandle(\n ref,\n () => ({\n capture: () => {\n const canvas = canvasRef.current;\n if (!canvas || !renderAtRef.current || !programRef.current) return null;\n const now = stateRef.current.paused\n ? (stateRef.current.time ?? STATIC_TIME)\n : performance.now() / 1000;\n // 동기 렌더 직후 즉시 읽기 (preserveDrawingBuffer 불필요).\n renderAtRef.current(now);\n try {\n return canvas.toDataURL(\"image/png\");\n } catch {\n return null;\n }\n },\n }),\n [],\n );\n\n // 렌더러 + 루프 셋업 (dpr 변경 시에만 재생성). preset 변경엔 영향 없음.\n useEffect(() => {\n const container = containerRef.current;\n const canvas = canvasRef.current;\n if (!container || !canvas) return;\n\n let renderer: Renderer;\n try {\n renderer = new Renderer({\n canvas,\n dpr:\n dpr ??\n (typeof window !== \"undefined\"\n ? Math.min(window.devicePixelRatio || 1, 2)\n : 1),\n alpha: true,\n premultipliedAlpha: false,\n });\n } catch {\n // WebGL 미지원(SSR/jsdom/구형) → CSS 그라디언트 폴백 유지.\n return;\n }\n\n const gl = renderer.gl;\n rendererRef.current = { renderer, gl };\n\n const resize = () => {\n const rect = container.getBoundingClientRect();\n renderer.setSize(Math.max(1, rect.width), Math.max(1, rect.height));\n };\n resize();\n\n const renderAt = (timeSeconds: number) => {\n const current = programRef.current;\n if (!current) return;\n const s = stateRef.current;\n const [c1, c2, c3] = resolveColors(s.preset, s.colors);\n const u = current.program.uniforms;\n // 명시적 prop 우선, 없으면 params 맵, 없으면 프리셋/전역 기본값.\n const val = (key: ShaderParamKey, override: number | undefined) =>\n resolveParam(s.preset, key, override ?? s.params?.[key]);\n u.u_time.value = timeSeconds;\n u.u_resolution.value = [gl.canvas.width, gl.canvas.height];\n u.u_scale.value = val(\"scale\", s.scale);\n u.u_speed.value = val(\"speed\", s.speed);\n u.u_distortion.value = val(\"distortion\", s.distortion);\n u.u_grain.value = val(\"grain\", s.grain);\n u.u_contrast.value = val(\"contrast\", s.contrast);\n u.u_angle.value = val(\"angle\", s.angle);\n u.u_dim.value = val(\"dim\", s.dim);\n u.u_vignette.value = val(\"vignette\", s.vignette);\n u.u_scrim.value = val(\"scrim\", s.scrim);\n u.u_interactive.value = val(\"interactive\", s.interactive);\n u.u_bars.value = val(\"bars\", undefined);\n u.u_blur.value = val(\"blur\", undefined);\n u.u_peak.value = val(\"peak\", undefined);\n u.u_valley.value = val(\"valley\", undefined);\n u.u_mouse.value = mouseRef.current;\n u.u_color1.value = toRgbFloat(c1);\n u.u_color2.value = toRgbFloat(c2);\n u.u_color3.value = toRgbFloat(c3);\n renderer.render({ scene: current.mesh });\n };\n renderAtRef.current = renderAt;\n const staticTime = () => stateRef.current.time ?? STATIC_TIME;\n\n const reduced = prefersReducedMotion();\n let inView = true;\n const isAnimating = () => !stateRef.current.paused && !reduced && inView;\n\n let raf = 0;\n let startTime = performance.now();\n const loop = (nowMs: number) => {\n renderAt((nowMs - startTime) / 1000);\n raf = requestAnimationFrame(loop);\n };\n const start = () => {\n if (raf) return;\n startTime = performance.now();\n raf = requestAnimationFrame(loop);\n };\n const stop = () => {\n if (raf) cancelAnimationFrame(raf);\n raf = 0;\n };\n loopRef.current = { start, stop, isAnimating };\n\n const resizeObserver =\n typeof ResizeObserver !== \"undefined\"\n ? new ResizeObserver(() => {\n resize();\n if (!isAnimating()) renderAt(staticTime());\n })\n : null;\n resizeObserver?.observe(container);\n\n const intersectionObserver =\n typeof IntersectionObserver !== \"undefined\"\n ? new IntersectionObserver(\n (entries) => {\n inView = entries[0]?.isIntersecting ?? true;\n if (inView && isAnimating()) start();\n else stop();\n },\n { threshold: 0 },\n )\n : null;\n intersectionObserver?.observe(container);\n\n // 포인터 반응(패럴랙스). interactive > 0일 때만 정지 상태에서 재렌더.\n const handlePointer = (event: PointerEvent) => {\n const rect = container.getBoundingClientRect();\n mouseRef.current = [\n (event.clientX - rect.left) / Math.max(1, rect.width),\n (event.clientY - rect.top) / Math.max(1, rect.height),\n ];\n const s = stateRef.current;\n if (\n !isAnimating() &&\n resolveParam(s.preset, \"interactive\", s.interactive) > 0\n ) {\n renderAt(staticTime());\n }\n };\n container.addEventListener(\"pointermove\", handlePointer);\n\n // 프로그램은 별도 effect가 곧 생성한다. 애니메이션이면 루프 시작(프로그램\n // 준비 전엔 no-op), 아니면 프로그램 생성 effect가 정지 프레임을 그린다.\n if (isAnimating()) start();\n\n return () => {\n stop();\n resizeObserver?.disconnect();\n intersectionObserver?.disconnect();\n container.removeEventListener(\"pointermove\", handlePointer);\n loopRef.current = null;\n renderAtRef.current = null;\n rendererRef.current = null;\n };\n }, [dpr]);\n\n // 프로그램(셰이더) 생성/교체 — preset 변경 시 셰이더만 재컴파일.\n useEffect(() => {\n const engine = rendererRef.current;\n if (!engine) return;\n const { gl } = engine;\n\n const presetDef = getShaderPreset(preset);\n const geometry = new Triangle(gl);\n const program = new Program(gl, {\n vertex: SHADER_VERTEX,\n fragment: getShaderFragment(presetDef),\n uniforms: {\n u_time: { value: 0 },\n u_resolution: { value: [1, 1] },\n u_scale: { value: 1 },\n u_speed: { value: 1 },\n u_distortion: { value: 0.5 },\n u_grain: { value: 0 },\n u_contrast: { value: 0.5 },\n u_angle: { value: 0 },\n u_dim: { value: 0 },\n u_vignette: { value: 0 },\n u_scrim: { value: 0 },\n u_mouse: { value: [0.5, 0.5] },\n u_interactive: { value: 0 },\n u_bars: { value: 19 },\n u_blur: { value: 0.29 },\n u_peak: { value: 0.98 },\n u_valley: { value: 0.55 },\n u_color1: { value: [0, 0, 0] },\n u_color2: { value: [0, 0, 0] },\n u_color3: { value: [0, 0, 0] },\n },\n });\n const mesh = new Mesh(gl, { geometry, program });\n programRef.current = { program, mesh, geometry };\n\n const loop = loopRef.current;\n if (loop?.isAnimating()) loop.start();\n else renderAtRef.current?.(stateRef.current.time ?? STATIC_TIME);\n\n return () => {\n programRef.current = null;\n program.remove();\n geometry.remove();\n };\n }, [preset]);\n\n // paused 토글 / 값 변경: 애니메이션이면 루프 보장, 아니면 정지 프레임 갱신.\n useEffect(() => {\n const loop = loopRef.current;\n if (!loop) return;\n if (loop.isAnimating()) loop.start();\n else {\n loop.stop();\n renderAtRef.current?.(stateRef.current.time ?? STATIC_TIME);\n }\n }, [\n paused,\n colors,\n scale,\n speed,\n distortion,\n grain,\n contrast,\n angle,\n dim,\n vignette,\n scrim,\n interactive,\n params,\n time,\n ]);\n\n return (\n <div\n ref={containerRef}\n aria-hidden={ariaHidden}\n className={cn(\"relative overflow-hidden\", className)}\n style={{ background: fallbackBackground, ...style }}\n >\n <canvas\n ref={canvasRef}\n className=\"absolute inset-0 block h-full w-full\"\n />\n </div>\n );\n});\n\nShaderSurfaceComponent.displayName = \"ShaderSurface\";\n\nexport const ShaderSurface = ShaderSurfaceComponent;\n"],"mappings":"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"}
|