@lukeashford/aurelius 3.1.0 → 3.2.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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/components/Button.tsx","../src/utils/cx.ts","../src/components/Input.tsx","../src/components/Card.tsx","../src/components/Skeleton.tsx","../src/components/Container.tsx","../src/components/Row.tsx","../src/components/Col.tsx","../src/components/Stack.tsx","../src/components/Divider.tsx","../src/components/Avatar.tsx","../src/components/Badge.tsx","../src/components/Tooltip.tsx","../src/components/Table.tsx","../src/components/List.tsx","../src/components/FileChip.tsx","../src/components/AttachmentPreview.tsx","../src/components/Label.tsx","../src/components/HelperText.tsx","../src/components/Textarea.tsx","../src/components/Select.tsx","../src/components/Checkbox.tsx","../src/components/Radio.tsx","../src/components/Switch.tsx","../src/components/Slider.tsx","../src/components/InputGroup.tsx","../src/components/Alert.tsx","../src/components/Spinner.tsx","../src/components/Progress.tsx","../src/components/Toast.tsx","../src/components/Modal.tsx","../src/components/Drawer.tsx","../src/components/Popover.tsx","../src/components/Dialog.tsx","../src/components/Tabs.tsx","../src/components/Accordion.tsx","../src/components/Menu.tsx","../src/components/Navbar.tsx","../src/components/Breadcrumb.tsx","../src/components/Pagination.tsx","../src/components/Stepper.tsx","../src/components/icons/ChevronLeftIcon.tsx","../src/components/icons/ChevronRightIcon.tsx","../src/components/icons/CloseIcon.tsx","../src/components/icons/ExpandIcon.tsx","../src/components/icons/HistoryIcon.tsx","../src/components/icons/LayersIcon.tsx","../src/components/icons/MediaIcon.tsx","../src/components/icons/PlusIcon.tsx","../src/components/icons/CheckSquareIcon.tsx","../src/components/icons/EmptySquareIcon.tsx","../src/components/icons/CrossSquareIcon.tsx","../src/components/icons/SquareLoaderIcon.tsx","../src/components/Message.tsx","../src/components/MarkdownContent.tsx","../src/components/StreamingCursor.tsx","../src/components/chat/ChatInterface.tsx","../src/components/chat/ChatView.tsx","../src/components/chat/hooks/useScrollAnchor.ts","../src/components/chat/hooks/useAdaptiveSpacer.ts","../src/components/chat/ThinkingIndicator.tsx","../src/components/chat/ChatInput.tsx","../src/components/chat/types.ts","../src/components/chat/ConversationSidebar.tsx","../src/components/chat/ArtifactsPanel.tsx","../src/components/ArtifactCard.tsx","../src/components/ImageCard.tsx","../src/components/VideoCard.tsx","../src/components/AudioCard.tsx","../src/components/PdfCard.tsx","../src/components/ScriptCard.tsx","../src/components/TextCard.tsx","../src/utils/artifactLoading.ts","../src/components/ArtifactGroup.tsx","../src/components/ArtifactVariantStack.tsx","../src/components/chat/hooks/useArtifactTreeNavigation.ts","../src/components/chat/TodosList.tsx","../src/components/chat/ToolSidebar.tsx","../src/components/chat/ToolPanelContainer.tsx","../src/components/chat/hooks/useResizable.ts","../src/components/chat/MessageActions.tsx","../src/components/chat/BranchNavigator.tsx","../src/components/BrandIcon.tsx","../src/components/ColorSwatch.tsx","../src/components/SectionHeading.tsx","../src/components/ArtifactNode.ts"],"sourcesContent":["/**\n * Aurelius Design System\n *\n * A cohesive visual language for creative technologists.\n * Combines technical sophistication with artistic sensibility.\n *\n * CSS-first Tailwind v4 design system.\n * Import '@lukeashford/aurelius/styles/base.css' for complete styling.\n */\n\n// React components\nexport * from './components'\n\n// Version\nexport const version = '2.0.0'\n","import React from 'react'\nimport {cx} from '../utils/cx'\n\nexport type ButtonVariant =\n | 'primary'\n | 'important'\n | 'elevated'\n | 'outlined'\n | 'featured'\n | 'ghost'\n | 'danger'\n\nexport type ButtonSize = 'sm' | 'md' | 'lg' | 'xl'\n\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: ButtonVariant\n size?: ButtonSize\n loading?: boolean\n}\n\nexport const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({variant = 'primary', size = 'md', loading = false, className, disabled, children, ...rest},\n ref) => {\n const isDisabled = disabled || loading\n\n // Base button styles - common to all variants\n const base =\n 'inline-flex items-center justify-center font-semibold tracking-wide ' +\n 'transition-all duration-fast ' +\n 'rounded-none ' +\n 'disabled:opacity-50 disabled:cursor-not-allowed'\n\n // Variant styles\n const variantClasses = {\n primary:\n 'bg-charcoal text-white border border-gold/30 ' +\n 'hover:border-gold hover:shadow-glow hover:text-gold-light ' +\n 'active:bg-white/5 ' +\n 'focus-visible:ring-2 focus-visible:ring-gold focus-visible:ring-offset-2 ' +\n 'focus-visible:ring-offset-obsidian',\n\n important:\n 'bg-gold text-obsidian border border-gold ' +\n 'hover:bg-gold-light hover:text-obsidian ' +\n 'active:bg-gold-bright ' +\n 'focus-visible:ring-2 focus-visible:ring-gold focus-visible:ring-offset-2 ' +\n 'focus-visible:ring-offset-obsidian',\n\n elevated:\n 'bg-charcoal text-white border-0 shadow-lg ' +\n 'hover:shadow-xl hover:text-gold-light ' +\n 'active:bg-white/5 ' +\n 'focus-visible:ring-2 focus-visible:ring-gold focus-visible:ring-offset-2 ' +\n 'focus-visible:ring-offset-obsidian',\n\n outlined:\n 'bg-transparent text-white border border-ash ' +\n 'hover:border-white hover:text-white ' +\n 'active:bg-white/5 ' +\n 'focus-visible:ring-2 focus-visible:ring-gold focus-visible:ring-offset-2 ' +\n 'focus-visible:ring-offset-obsidian',\n\n featured:\n 'bg-charcoal text-white border border-gold ' +\n 'glow-sm ' +\n 'hover:glow-md hover:text-gold-light ' +\n 'active:bg-white/5 ' +\n 'focus-visible:ring-2 focus-visible:ring-gold focus-visible:ring-offset-2 ' +\n 'focus-visible:ring-offset-obsidian',\n\n ghost:\n 'bg-transparent text-gold border-0 ' +\n 'hover:text-gold-light ' +\n 'active:text-gold-bright ' +\n 'focus-visible:ring-2 focus-visible:ring-gold focus-visible:ring-offset-2 ' +\n 'focus-visible:ring-offset-obsidian',\n\n danger:\n 'bg-error text-white border-0 ' +\n 'hover:bg-error/90 ' +\n 'active:bg-error/80 ' +\n 'focus-visible:ring-2 focus-visible:ring-error focus-visible:ring-offset-2 ' +\n 'focus-visible:ring-offset-obsidian',\n }\n\n // Size styles\n const sizeClasses = {\n sm: 'h-8 px-3 text-sm',\n md: 'h-10 px-4 text-sm',\n lg: 'h-12 px-6 text-base',\n xl: 'h-14 px-8 text-lg',\n }\n\n const variantClass = variantClasses[variant]\n const sizeClass = sizeClasses[size]\n\n return (\n <button\n ref={ref}\n className={cx(base, variantClass, sizeClass, loading && 'opacity-80', className)}\n disabled={isDisabled}\n {...rest}\n >\n {loading && (\n <span\n className=\"mr-2 inline-block h-4 w-4 animate-pulse rounded-full bg-gold\"\n aria-hidden\n />\n )}\n {children}\n </button>\n )\n }\n)\n\nButton.displayName = 'Button'\n\nexport default Button\n","import {twMerge} from 'tailwind-merge';\nimport {type ClassValue, clsx} from 'clsx';\n\n/**\n * Concatenates class names and merges Tailwind utility classes correctly.\n * Uses clsx for conditional classes and tailwind-merge to handle overrides.\n */\nexport function cx(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import React from 'react'\nimport {cx} from '../utils/cx'\n\nexport interface InputProps extends React.InputHTMLAttributes<HTMLInputElement> {\n error?: boolean\n leadingIcon?: React.ReactNode\n trailingIcon?: React.ReactNode\n}\n\nexport const Input = React.forwardRef<HTMLInputElement, InputProps>(\n ({error = false, className, leadingIcon, trailingIcon, disabled, ...rest}, ref) => {\n const base =\n 'w-full h-10 px-3 bg-graphite border border-ash rounded-none ' +\n 'text-white placeholder:text-zinc ' +\n 'transition-all duration-fast ' +\n 'focus:border-gold focus:ring-1 focus:ring-gold focus:outline-none ' +\n 'disabled:bg-slate disabled:text-dim disabled:cursor-not-allowed'\n\n const errorCls = error ? 'border-error focus:border-error focus:ring-error' : ''\n\n return (\n <div className={cx('relative', disabled && 'opacity-90')}>\n {leadingIcon && (\n <span\n className=\"pointer-events-none absolute inset-y-0 left-3 flex items-center text-silver\">\n {leadingIcon}\n </span>\n )}\n <input\n ref={ref}\n className={cx(\n base,\n errorCls,\n leadingIcon ? 'pl-9' : false,\n trailingIcon ? 'pr-9' : false,\n className\n )}\n disabled={disabled}\n {...rest}\n />\n {trailingIcon && (\n <span\n className=\"pointer-events-none absolute inset-y-0 right-3 flex items-center text-silver\">\n {trailingIcon}\n </span>\n )}\n </div>\n )\n }\n)\n\nInput.displayName = 'Input'\n\nexport default Input\n","import React, {createContext, useContext} from 'react'\nimport {Check} from 'lucide-react'\nimport {cx} from '../utils'\nimport {Skeleton} from './Skeleton'\n\nexport type CardVariant = 'default' | 'elevated' | 'outlined' | 'ghost' | 'featured'\n\nexport type CardSlotLoading = {\n header?: {\n title?: boolean\n subtitle?: boolean\n action?: boolean\n }\n media?: boolean\n body?: boolean\n footer?: boolean\n}\n\ninterface CardContextValue {\n loading?: CardSlotLoading\n}\n\nconst CardContext = createContext<CardContextValue>({loading: undefined})\n\nconst useCardContext = () => useContext(CardContext)\n\nexport function slotLoading(\n loading: CardSlotLoading | undefined,\n path: 'media' | 'body' | 'footer' | ['header', 'title' | 'subtitle' | 'action']\n): boolean {\n if (!loading) {\n return false\n }\n if (Array.isArray(path)) {\n const [section, field] = path\n return !!(loading as any)[section]?.[field]\n }\n return !!(loading as any)[path]\n}\n\nexport interface CardProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: CardVariant\n interactive?: boolean\n selected?: boolean\n noPadding?: boolean\n loading?: CardSlotLoading\n}\n\nconst VARIANT_STYLES: Record<CardVariant, string> = {\n default: 'bg-charcoal shadow-sm border border-gold/30',\n elevated: 'bg-charcoal shadow-lg border-0',\n outlined: 'bg-charcoal shadow-none border border-ash',\n ghost: 'bg-transparent shadow-none border-0',\n featured: 'bg-charcoal border border-gold glow-sm',\n}\n\nconst CardBase = React.forwardRef<HTMLDivElement, CardProps>(\n (\n {\n variant = 'default',\n interactive = false,\n selected = false,\n noPadding = false,\n loading,\n className,\n children,\n ...props\n },\n ref\n ) => {\n return (\n <CardContext.Provider value={{loading}}>\n <div\n ref={ref}\n className={cx(\n 'rounded-none relative transition-opacity duration-500',\n !noPadding && 'p-6',\n VARIANT_STYLES[variant],\n interactive &&\n 'transition-all duration-200 hover:border-gold hover:shadow-glow cursor-pointer',\n selected && 'border-gold shadow-glow-md',\n className\n )}\n {...props}\n >\n {children}\n {selected && (\n <div\n className=\"absolute top-3 right-3 flex items-center justify-center h-6 w-6 rounded-full bg-gold text-obsidian\">\n <Check className=\"h-4 w-4\"/>\n </div>\n )}\n </div>\n </CardContext.Provider>\n )\n }\n)\n\nCardBase.displayName = 'Card'\n\n// Card.Header - header section with title and optional actions\nexport interface CardHeaderProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {\n title?: React.ReactNode\n subtitle?: React.ReactNode\n action?: React.ReactNode\n}\n\nconst CardHeader = React.forwardRef<HTMLDivElement, CardHeaderProps>(\n ({title, subtitle, action, className, children, ...props}, ref) => {\n const {loading} = useCardContext()\n const titleIsLoading = slotLoading(loading, ['header', 'title'])\n const subtitleIsLoading = slotLoading(loading, ['header', 'subtitle'])\n const actionIsLoading = slotLoading(loading, ['header', 'action'])\n\n const hasContent = title || subtitle || action || children\n\n if (!hasContent && !titleIsLoading && !subtitleIsLoading && !actionIsLoading) {\n return null\n }\n\n return (\n <div\n ref={ref}\n className={cx('px-6 py-4 border-b border-ash', className)}\n {...props}\n >\n {(title || subtitle || action || titleIsLoading || subtitleIsLoading || actionIsLoading)\n ? (\n <div className=\"flex items-start justify-between gap-4\">\n <div className=\"flex-1 min-w-0\">\n {title ? (\n <h3 className=\"text-lg font-semibold text-white m-0\">{title}</h3>\n ) : titleIsLoading ? (\n <Skeleton className=\"h-5 w-3/4 mb-1\"/>\n ) : null}\n {subtitle ? (\n <p className=\"text-sm text-silver mt-1 m-0\">{subtitle}</p>\n ) : subtitleIsLoading ? (\n <Skeleton className=\"h-4 w-1/2 mt-1\"/>\n ) : null}\n </div>\n {action ? (\n <div className=\"shrink-0\">{action}</div>\n ) : actionIsLoading ? (\n <Skeleton className=\"h-8 w-8 shrink-0\"/>\n ) : null}\n </div>\n ) : (\n children\n )}\n </div>\n )\n }\n)\n\nCardHeader.displayName = 'CardHeader'\n\n// Card.Body - main content area\nexport interface CardBodyProps extends React.HTMLAttributes<HTMLDivElement> {\n}\n\nconst CardBody = React.forwardRef<HTMLDivElement, CardBodyProps>(\n ({className, children, ...props}, ref) => {\n const {loading} = useCardContext()\n const isBodyLoading = slotLoading(loading, 'body')\n\n if (!children && !isBodyLoading) {\n return null\n }\n\n return (\n <div ref={ref} className={cx('px-6 py-4', className)} {...props}>\n {isBodyLoading ? (\n <div className=\"space-y-2\">\n <Skeleton className=\"h-4 w-full\"/>\n <Skeleton className=\"h-4 w-full\"/>\n <Skeleton className=\"h-4 w-3/4\"/>\n </div>\n ) : (\n children\n )}\n </div>\n )\n }\n)\n\nCardBody.displayName = 'CardBody'\n\n// Card.Footer - footer section, typically for actions\nexport interface CardFooterProps extends React.HTMLAttributes<HTMLDivElement> {\n align?: 'start' | 'center' | 'end' | 'between'\n}\n\nconst CardFooter = React.forwardRef<HTMLDivElement, CardFooterProps>(\n ({align = 'end', className, children, ...props}, ref) => {\n const alignClass = {\n start: 'justify-start',\n center: 'justify-center',\n end: 'justify-end',\n between: 'justify-between',\n }[align]\n\n return (\n <div\n ref={ref}\n className={cx(\n 'px-6 py-4 border-t border-ash flex items-center gap-3',\n alignClass,\n className\n )}\n {...props}\n >\n {children}\n </div>\n )\n }\n)\n\nCardFooter.displayName = 'CardFooter'\n\n// Card.Media - image or media section\nexport interface CardMediaProps extends React.HTMLAttributes<HTMLDivElement> {\n aspect?: 'video' | 'square' | 'wide' | 'none'\n position?: 'top' | 'bottom'\n}\n\nconst CardMedia = React.forwardRef<HTMLDivElement, CardMediaProps>(\n ({\n aspect,\n position = 'top',\n className,\n children,\n ...props\n }, ref) => {\n const {loading} = useCardContext()\n const isMediaLoading = slotLoading(loading, 'media')\n const aspectClass = aspect && aspect !== 'none' ? {\n video: 'aspect-video',\n square: 'aspect-square',\n wide: 'aspect-wide',\n }[aspect] : ''\n\n if (!children && !isMediaLoading) {\n return null\n }\n\n return (\n <div\n ref={ref}\n className={cx(\n 'overflow-hidden relative',\n aspectClass,\n position === 'top' && 'border-b border-ash',\n position === 'bottom' && 'border-t border-ash',\n className\n )}\n {...props}\n >\n {isMediaLoading ? (\n <Skeleton className=\"w-full h-full\"/>\n ) : (\n children\n )}\n </div>\n )\n }\n)\n\nCardMedia.displayName = 'CardMedia'\n\n// Compound component pattern\nexport const Card = Object.assign(CardBase, {\n Header: CardHeader,\n Body: CardBody,\n Footer: CardFooter,\n Media: CardMedia,\n})","import React from 'react'\nimport {cx} from '../utils/cx'\n\nexport interface SkeletonProps extends React.HTMLAttributes<HTMLDivElement> {\n}\n\nexport const Skeleton = React.forwardRef<HTMLDivElement, SkeletonProps>(\n ({className, ...rest}, ref) => {\n return (\n <div\n ref={ref}\n className={cx('animate-pulse bg-ash', className)}\n {...rest}\n />\n )\n }\n)\n\nSkeleton.displayName = 'Skeleton'\n\nexport default Skeleton\n","import React from 'react'\nimport {cx} from '../utils/cx'\n\nexport type ContainerSize = 'sm' | 'md' | 'lg' | 'xl' | 'fluid' | 'responsive'\n\nexport interface ContainerProps extends React.HTMLAttributes<HTMLDivElement> {\n size?: ContainerSize\n}\n\nconst SIZE_CLASSES: Record<ContainerSize, string> = {\n sm: 'container-sm',\n md: 'container-md',\n lg: 'container-lg',\n xl: 'container-xl',\n fluid: 'container-fluid',\n responsive: 'container',\n}\n\nexport const Container = React.forwardRef<HTMLDivElement, ContainerProps>(\n ({size = 'responsive', className, children, ...props}, ref) => {\n return (\n <div ref={ref} className={cx(SIZE_CLASSES[size], className)} {...props}>\n {children}\n </div>\n )\n }\n)\n\nContainer.displayName = 'Container'\n","import React from 'react'\nimport {cx} from '../utils'\n\nexport type RowGutter = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 8 | 10 | 12\nexport type RowJustify = 'start' | 'center' | 'end' | 'between' | 'around' | 'evenly'\nexport type RowAlign = 'start' | 'center' | 'end' | 'stretch' | 'baseline'\n\nexport interface RowProps extends React.HTMLAttributes<HTMLDivElement> {\n gutter?: RowGutter\n gutterX?: RowGutter\n gutterY?: RowGutter\n justify?: RowJustify\n align?: RowAlign\n}\n\nconst JUSTIFY_MAP: Record<RowJustify, string> = {\n start: 'justify-start',\n center: 'justify-center',\n end: 'justify-end',\n between: 'justify-between',\n around: 'justify-around',\n evenly: 'justify-evenly',\n}\n\nconst ALIGN_MAP: Record<RowAlign, string> = {\n start: 'items-start',\n center: 'items-center',\n end: 'items-end',\n stretch: 'items-stretch',\n baseline: 'items-baseline',\n}\n\nconst GAP_MAP: Record<RowGutter, string> = {\n 0: 'gap-0',\n 1: 'gap-1',\n 2: 'gap-2',\n 3: 'gap-3',\n 4: 'gap-4',\n 5: 'gap-5',\n 6: 'gap-6',\n 8: 'gap-8',\n 10: 'gap-10',\n 12: 'gap-12',\n}\n\nconst GAP_X_MAP: Record<RowGutter, string> = {\n 0: 'gap-x-0',\n 1: 'gap-x-1',\n 2: 'gap-x-2',\n 3: 'gap-x-3',\n 4: 'gap-x-4',\n 5: 'gap-x-5',\n 6: 'gap-x-6',\n 8: 'gap-x-8',\n 10: 'gap-x-10',\n 12: 'gap-x-12',\n}\n\nconst GAP_Y_MAP: Record<RowGutter, string> = {\n 0: 'gap-y-0',\n 1: 'gap-y-1',\n 2: 'gap-y-2',\n 3: 'gap-y-3',\n 4: 'gap-y-4',\n 5: 'gap-y-5',\n 6: 'gap-y-6',\n 8: 'gap-y-8',\n 10: 'gap-y-10',\n 12: 'gap-y-12',\n}\n\nexport const Row = React.forwardRef<HTMLDivElement, RowProps>(\n ({gutter = 4, gutterX, gutterY, justify, align, className, children, ...props}, ref) => {\n // Directional gutters take precedence over uniform gutter\n const gapClass = gutterX === undefined && gutterY === undefined ? GAP_MAP[gutter] : ''\n const gapXClass = gutterX !== undefined ? GAP_X_MAP[gutterX] : ''\n const gapYClass = gutterY !== undefined ? GAP_Y_MAP[gutterY] : ''\n\n return (\n <div\n ref={ref}\n className={cx(\n 'row',\n gapClass,\n gapXClass,\n gapYClass,\n justify && JUSTIFY_MAP[justify],\n align && ALIGN_MAP[align],\n className\n )}\n {...props}\n >\n {children}\n </div>\n )\n }\n)\n\nRow.displayName = 'Row'\n","import React from 'react'\nimport {cx} from '../utils'\n\nexport type ColSpan = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 'auto' | 'full'\nexport type ColOffset = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11\nexport type ColOrder = 'first' | 'last' | 'none' | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12\n\nexport interface ResponsiveValue<T> {\n base?: T\n sm?: T\n md?: T\n lg?: T\n xl?: T\n '2xl'?: T\n}\n\nexport interface ColProps extends React.HTMLAttributes<HTMLDivElement> {\n span?: ColSpan | ResponsiveValue<ColSpan>\n offset?: ColOffset | ResponsiveValue<ColOffset>\n order?: ColOrder | ResponsiveValue<ColOrder>\n}\n\ntype Breakpoint = 'base' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'\n\nconst SPAN_CLASS_MAP: Record<Breakpoint, Record<ColSpan, string>> = {\n base: {\n 1: 'col-span-1',\n 2: 'col-span-2',\n 3: 'col-span-3',\n 4: 'col-span-4',\n 5: 'col-span-5',\n 6: 'col-span-6',\n 7: 'col-span-7',\n 8: 'col-span-8',\n 9: 'col-span-9',\n 10: 'col-span-10',\n 11: 'col-span-11',\n 12: 'col-span-12',\n auto: 'col-auto',\n full: 'col-span-full',\n },\n sm: {\n 1: 'sm:col-span-1',\n 2: 'sm:col-span-2',\n 3: 'sm:col-span-3',\n 4: 'sm:col-span-4',\n 5: 'sm:col-span-5',\n 6: 'sm:col-span-6',\n 7: 'sm:col-span-7',\n 8: 'sm:col-span-8',\n 9: 'sm:col-span-9',\n 10: 'sm:col-span-10',\n 11: 'sm:col-span-11',\n 12: 'sm:col-span-12',\n auto: 'sm:col-auto',\n full: 'sm:col-span-full',\n },\n md: {\n 1: 'md:col-span-1',\n 2: 'md:col-span-2',\n 3: 'md:col-span-3',\n 4: 'md:col-span-4',\n 5: 'md:col-span-5',\n 6: 'md:col-span-6',\n 7: 'md:col-span-7',\n 8: 'md:col-span-8',\n 9: 'md:col-span-9',\n 10: 'md:col-span-10',\n 11: 'md:col-span-11',\n 12: 'md:col-span-12',\n auto: 'md:col-auto',\n full: 'md:col-span-full',\n },\n lg: {\n 1: 'lg:col-span-1',\n 2: 'lg:col-span-2',\n 3: 'lg:col-span-3',\n 4: 'lg:col-span-4',\n 5: 'lg:col-span-5',\n 6: 'lg:col-span-6',\n 7: 'lg:col-span-7',\n 8: 'lg:col-span-8',\n 9: 'lg:col-span-9',\n 10: 'lg:col-span-10',\n 11: 'lg:col-span-11',\n 12: 'lg:col-span-12',\n auto: 'lg:col-auto',\n full: 'lg:col-span-full',\n },\n xl: {\n 1: 'xl:col-span-1',\n 2: 'xl:col-span-2',\n 3: 'xl:col-span-3',\n 4: 'xl:col-span-4',\n 5: 'xl:col-span-5',\n 6: 'xl:col-span-6',\n 7: 'xl:col-span-7',\n 8: 'xl:col-span-8',\n 9: 'xl:col-span-9',\n 10: 'xl:col-span-10',\n 11: 'xl:col-span-11',\n 12: 'xl:col-span-12',\n auto: 'xl:col-auto',\n full: 'xl:col-span-full',\n },\n '2xl': {\n 1: '2xl:col-span-1',\n 2: '2xl:col-span-2',\n 3: '2xl:col-span-3',\n 4: '2xl:col-span-4',\n 5: '2xl:col-span-5',\n 6: '2xl:col-span-6',\n 7: '2xl:col-span-7',\n 8: '2xl:col-span-8',\n 9: '2xl:col-span-9',\n 10: '2xl:col-span-10',\n 11: '2xl:col-span-11',\n 12: '2xl:col-span-12',\n auto: '2xl:col-auto',\n full: '2xl:col-span-full',\n },\n}\n\nconst OFFSET_CLASS_MAP: Record<Breakpoint, Record<ColOffset, string>> = {\n base: {\n 0: '',\n 1: 'col-start-2',\n 2: 'col-start-3',\n 3: 'col-start-4',\n 4: 'col-start-5',\n 5: 'col-start-6',\n 6: 'col-start-7',\n 7: 'col-start-8',\n 8: 'col-start-9',\n 9: 'col-start-10',\n 10: 'col-start-11',\n 11: 'col-start-12',\n },\n sm: {\n 0: '',\n 1: 'sm:col-start-2',\n 2: 'sm:col-start-3',\n 3: 'sm:col-start-4',\n 4: 'sm:col-start-5',\n 5: 'sm:col-start-6',\n 6: 'sm:col-start-7',\n 7: 'sm:col-start-8',\n 8: 'sm:col-start-9',\n 9: 'sm:col-start-10',\n 10: 'sm:col-start-11',\n 11: 'sm:col-start-12',\n },\n md: {\n 0: '',\n 1: 'md:col-start-2',\n 2: 'md:col-start-3',\n 3: 'md:col-start-4',\n 4: 'md:col-start-5',\n 5: 'md:col-start-6',\n 6: 'md:col-start-7',\n 7: 'md:col-start-8',\n 8: 'md:col-start-9',\n 9: 'md:col-start-10',\n 10: 'md:col-start-11',\n 11: 'md:col-start-12',\n },\n lg: {\n 0: '',\n 1: 'lg:col-start-2',\n 2: 'lg:col-start-3',\n 3: 'lg:col-start-4',\n 4: 'lg:col-start-5',\n 5: 'lg:col-start-6',\n 6: 'lg:col-start-7',\n 7: 'lg:col-start-8',\n 8: 'lg:col-start-9',\n 9: 'lg:col-start-10',\n 10: 'lg:col-start-11',\n 11: 'lg:col-start-12',\n },\n xl: {\n 0: '',\n 1: 'xl:col-start-2',\n 2: 'xl:col-start-3',\n 3: 'xl:col-start-4',\n 4: 'xl:col-start-5',\n 5: 'xl:col-start-6',\n 6: 'xl:col-start-7',\n 7: 'xl:col-start-8',\n 8: 'xl:col-start-9',\n 9: 'xl:col-start-10',\n 10: 'xl:col-start-11',\n 11: 'xl:col-start-12',\n },\n '2xl': {\n 0: '',\n 1: '2xl:col-start-2',\n 2: '2xl:col-start-3',\n 3: '2xl:col-start-4',\n 4: '2xl:col-start-5',\n 5: '2xl:col-start-6',\n 6: '2xl:col-start-7',\n 7: '2xl:col-start-8',\n 8: '2xl:col-start-9',\n 9: '2xl:col-start-10',\n 10: '2xl:col-start-11',\n 11: '2xl:col-start-12',\n },\n}\n\nconst ORDER_CLASS_MAP: Record<Breakpoint, Record<ColOrder, string>> = {\n base: {\n first: 'order-first',\n last: 'order-last',\n none: 'order-none',\n 1: 'order-1',\n 2: 'order-2',\n 3: 'order-3',\n 4: 'order-4',\n 5: 'order-5',\n 6: 'order-6',\n 7: 'order-7',\n 8: 'order-8',\n 9: 'order-9',\n 10: 'order-10',\n 11: 'order-11',\n 12: 'order-12',\n },\n sm: {\n first: 'sm:order-first',\n last: 'sm:order-last',\n none: 'sm:order-none',\n 1: 'sm:order-1',\n 2: 'sm:order-2',\n 3: 'sm:order-3',\n 4: 'sm:order-4',\n 5: 'sm:order-5',\n 6: 'sm:order-6',\n 7: 'sm:order-7',\n 8: 'sm:order-8',\n 9: 'sm:order-9',\n 10: 'sm:order-10',\n 11: 'sm:order-11',\n 12: 'sm:order-12',\n },\n md: {\n first: 'md:order-first',\n last: 'md:order-last',\n none: 'md:order-none',\n 1: 'md:order-1',\n 2: 'md:order-2',\n 3: 'md:order-3',\n 4: 'md:order-4',\n 5: 'md:order-5',\n 6: 'md:order-6',\n 7: 'md:order-7',\n 8: 'md:order-8',\n 9: 'md:order-9',\n 10: 'md:order-10',\n 11: 'md:order-11',\n 12: 'md:order-12',\n },\n lg: {\n first: 'lg:order-first',\n last: 'lg:order-last',\n none: 'lg:order-none',\n 1: 'lg:order-1',\n 2: 'lg:order-2',\n 3: 'lg:order-3',\n 4: 'lg:order-4',\n 5: 'lg:order-5',\n 6: 'lg:order-6',\n 7: 'lg:order-7',\n 8: 'lg:order-8',\n 9: 'lg:order-9',\n 10: 'lg:order-10',\n 11: 'lg:order-11',\n 12: 'lg:order-12',\n },\n xl: {\n first: 'xl:order-first',\n last: 'xl:order-last',\n none: 'xl:order-none',\n 1: 'xl:order-1',\n 2: 'xl:order-2',\n 3: 'xl:order-3',\n 4: 'xl:order-4',\n 5: 'xl:order-5',\n 6: 'xl:order-6',\n 7: 'xl:order-7',\n 8: 'xl:order-8',\n 9: 'xl:order-9',\n 10: 'xl:order-10',\n 11: 'xl:order-11',\n 12: 'xl:order-12',\n },\n '2xl': {\n first: '2xl:order-first',\n last: '2xl:order-last',\n none: '2xl:order-none',\n 1: '2xl:order-1',\n 2: '2xl:order-2',\n 3: '2xl:order-3',\n 4: '2xl:order-4',\n 5: '2xl:order-5',\n 6: '2xl:order-6',\n 7: '2xl:order-7',\n 8: '2xl:order-8',\n 9: '2xl:order-9',\n 10: '2xl:order-10',\n 11: '2xl:order-11',\n 12: '2xl:order-12',\n },\n}\n\nfunction isResponsiveValue<T>(value: T | ResponsiveValue<T>): value is ResponsiveValue<T> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction buildResponsiveClasses<T extends string | number>(\n value: T | ResponsiveValue<T> | undefined,\n classMap: Record<Breakpoint, Record<T, string>>\n): string[] {\n if (value === undefined) {\n return []\n }\n\n if (!isResponsiveValue(value)) {\n const cls = classMap.base[value]\n return cls ? [cls] : []\n }\n\n const classes: string[] = []\n for (const [breakpoint, val] of Object.entries(value) as [Breakpoint, T][]) {\n if (val !== undefined) {\n const cls = classMap[breakpoint]?.[val]\n if (cls) {\n classes.push(cls)\n }\n }\n }\n return classes\n}\n\nexport const Col = React.forwardRef<HTMLDivElement, ColProps>(\n ({span, offset, order, className, children, ...props}, ref) => {\n const spanClasses = buildResponsiveClasses(span, SPAN_CLASS_MAP)\n const offsetClasses = buildResponsiveClasses(offset, OFFSET_CLASS_MAP)\n const orderClasses = buildResponsiveClasses(order, ORDER_CLASS_MAP)\n\n // Default to full width if no span specified\n const hasSpan = span !== undefined\n const defaultSpan = hasSpan ? '' : 'col-span-12'\n\n return (\n <div\n ref={ref}\n className={cx(\n defaultSpan,\n ...spanClasses,\n ...offsetClasses,\n ...orderClasses,\n className\n )}\n {...props}\n >\n {children}\n </div>\n )\n }\n)\n\nCol.displayName = 'Col'\n","import React from 'react'\nimport {cx} from '../utils/cx'\n\nexport type StackDirection = 'horizontal' | 'vertical'\nexport type StackAlign = 'start' | 'center' | 'end' | 'stretch' | 'baseline'\nexport type StackJustify = 'start' | 'center' | 'end' | 'between' | 'around' | 'evenly'\nexport type StackGap = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 8 | 10 | 12\n\nexport interface StackProps extends React.HTMLAttributes<HTMLDivElement> {\n direction?: StackDirection\n align?: StackAlign\n justify?: StackJustify\n gap?: StackGap\n wrap?: boolean\n as?: 'div' | 'section' | 'article' | 'nav' | 'aside' | 'header' | 'footer' | 'main'\n}\n\nconst ALIGN_MAP: Record<StackAlign, string> = {\n start: 'items-start',\n center: 'items-center',\n end: 'items-end',\n stretch: 'items-stretch',\n baseline: 'items-baseline',\n}\n\nconst JUSTIFY_MAP: Record<StackJustify, string> = {\n start: 'justify-start',\n center: 'justify-center',\n end: 'justify-end',\n between: 'justify-between',\n around: 'justify-around',\n evenly: 'justify-evenly',\n}\n\nconst GAP_MAP: Record<StackGap, string> = {\n 0: 'gap-0',\n 1: 'gap-1',\n 2: 'gap-2',\n 3: 'gap-3',\n 4: 'gap-4',\n 5: 'gap-5',\n 6: 'gap-6',\n 8: 'gap-8',\n 10: 'gap-10',\n 12: 'gap-12',\n}\n\nexport const Stack = React.forwardRef<HTMLDivElement, StackProps>(\n (\n {\n direction = 'vertical',\n align,\n justify,\n gap = 4,\n wrap = false,\n as: Component = 'div',\n className,\n children,\n ...props\n },\n ref\n ) => {\n return (\n <Component\n ref={ref}\n className={cx(\n 'flex',\n direction === 'horizontal' ? 'flex-row' : 'flex-col',\n align && ALIGN_MAP[align],\n justify && JUSTIFY_MAP[justify],\n GAP_MAP[gap],\n wrap && 'flex-wrap',\n className\n )}\n {...props}\n >\n {children}\n </Component>\n )\n }\n)\n\nStack.displayName = 'Stack'\n","import React from 'react'\nimport {cx} from '../utils/cx'\n\nexport type DividerOrientation = 'horizontal' | 'vertical'\nexport type DividerVariant = 'solid' | 'dashed' | 'dotted'\n\nexport interface DividerProps extends React.HTMLAttributes<HTMLHRElement> {\n orientation?: DividerOrientation\n variant?: DividerVariant\n label?: React.ReactNode\n color?: 'default' | 'gold' | 'muted'\n}\n\nconst COLOR_MAP: Record<string, string> = {\n default: 'border-ash',\n gold: 'border-gold/50',\n muted: 'border-slate',\n}\n\nconst VARIANT_MAP: Record<DividerVariant, string> = {\n solid: 'border-solid',\n dashed: 'border-dashed',\n dotted: 'border-dotted',\n}\n\nexport const Divider = React.forwardRef<HTMLHRElement, DividerProps>(\n (\n {\n orientation = 'horizontal',\n variant = 'solid',\n label,\n color = 'default',\n className,\n ...props\n },\n ref\n ) => {\n const isHorizontal = orientation === 'horizontal'\n\n if (label && isHorizontal) {\n return (\n <div\n className={cx('flex items-center gap-4', className)}\n role=\"separator\"\n aria-orientation={orientation}\n >\n <div\n className={cx(\n 'flex-1 border-t',\n VARIANT_MAP[variant],\n COLOR_MAP[color]\n )}\n />\n <span className=\"text-sm text-silver shrink-0\">{label}</span>\n <div\n className={cx(\n 'flex-1 border-t',\n VARIANT_MAP[variant],\n COLOR_MAP[color]\n )}\n />\n </div>\n )\n }\n\n return (\n <hr\n ref={ref}\n role=\"separator\"\n aria-orientation={orientation}\n className={cx(\n isHorizontal ? 'border-t w-full' : 'border-l h-full',\n VARIANT_MAP[variant],\n COLOR_MAP[color],\n 'border-0',\n isHorizontal ? 'border-t' : 'border-l',\n className\n )}\n {...props}\n />\n )\n }\n)\n\nDivider.displayName = 'Divider'\n","import React from 'react'\nimport {cx} from '../utils/cx'\n\nexport type AvatarSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'\nexport type AvatarStatus = 'online' | 'offline' | 'busy'\n\nexport interface AvatarProps extends React.HTMLAttributes<HTMLDivElement> {\n src?: string\n alt?: string\n name?: string\n size?: AvatarSize\n status?: AvatarStatus\n}\n\nconst sizeMap: Record<AvatarSize, string> = {\n xs: 'h-6 w-6 text-[10px]',\n sm: 'h-8 w-8 text-[11px]',\n md: 'h-10 w-10 text-xs',\n lg: 'h-12 w-12 text-sm',\n xl: 'h-16 w-16 text-base',\n '2xl': 'h-24 w-24 text-lg',\n}\n\nfunction initials(name?: string) {\n if (!name) {\n return ''\n }\n const parts = name.trim().split(/\\s+/)\n return parts.slice(0, 2).map(p => p[0]!.toUpperCase()).join('')\n}\n\nexport const Avatar = React.forwardRef<HTMLDivElement, AvatarProps>(\n ({src, alt = '', name, size = 'md', status, className, ...rest}, ref) => {\n const statusColor =\n status === 'online' ? 'bg-success' : status === 'busy' ? 'bg-warning' : 'bg-zinc'\n\n return (\n <div\n ref={ref}\n className={cx(\n 'relative inline-flex items-center justify-center rounded-full border-2 border-ash bg-slate text-silver font-semibold select-none overflow-hidden',\n sizeMap[size],\n className\n )}\n {...rest}\n >\n {src ? (\n <img src={src} alt={alt || name || 'Avatar'}\n className=\"h-full w-full object-cover\"/>\n ) : (\n <span aria-hidden>{initials(name) || '·'}</span>\n )}\n {status && (\n <span\n className={cx(\n 'absolute bottom-0 right-0 rounded-full ring-2 ring-charcoal',\n // 25% of avatar size\n size === 'xs' ? 'h-1.5 w-1.5' :\n size === 'sm' ? 'h-2 w-2' :\n size === 'md' ? 'h-2.5 w-2.5' :\n size === 'lg' ? 'h-3 w-3' :\n size === 'xl' ? 'h-4 w-4' : 'h-5 w-5',\n statusColor\n )}\n />\n )}\n </div>\n )\n }\n)\n\nAvatar.displayName = 'Avatar'\n\nexport default Avatar\n","import React from 'react'\nimport {cx} from '../utils/cx'\n\nexport type BadgeVariant = 'default' | 'gold' | 'success' | 'error' | 'warning' | 'info'\n\nexport interface BadgeProps extends React.HTMLAttributes<HTMLSpanElement> {\n variant?: BadgeVariant\n}\n\nexport const Badge = React.forwardRef<HTMLSpanElement, BadgeProps>(\n ({variant = 'default', className, ...rest}, ref) => {\n // Base badge styles\n const base = 'inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium border'\n\n // Variant styles\n const variantClasses = {\n default: 'bg-slate text-silver border-slate',\n gold: 'bg-gold/20 text-gold border-gold/30',\n success: 'bg-success/20 text-success border-success/30',\n error: 'bg-error/20 text-error border-error/30',\n warning: 'bg-warning/20 text-warning border-warning/30',\n info: 'bg-info/20 text-info border-info/30',\n }\n\n const variantClass = variantClasses[variant]\n\n return <span ref={ref} className={cx(base, variantClass, className)} {...rest} />\n }\n)\n\nBadge.displayName = 'Badge'\n\nexport default Badge\n","import React from 'react'\nimport {cx} from '../utils/cx'\n\nexport type TooltipSide = 'top' | 'right' | 'bottom' | 'left'\n\nexport interface TooltipProps {\n content: React.ReactNode\n children: React.ReactElement\n open?: boolean\n side?: TooltipSide\n}\n\n// Simple, controlled tooltip. Consumer handles open state.\nexport const Tooltip: React.FC<TooltipProps> = ({\n content,\n children,\n open = false,\n side = 'top'\n}) => {\n return (\n <span className=\"relative inline-block\">\n {children}\n <span\n role=\"tooltip\"\n className={cx(\n 'pointer-events-none absolute z-50 whitespace-nowrap border border-ash bg-graphite px-3 py-1.5 text-sm text-white shadow-lg transition-opacity duration-200 ease-out',\n open ? 'opacity-100' : 'opacity-0',\n side === 'top' && 'left-1/2 -translate-x-1/2 -top-2 -translate-y-full',\n side === 'bottom' && 'left-1/2 -translate-x-1/2 -bottom-2 translate-y-full',\n side === 'left' && 'top-1/2 -translate-y-1/2 -left-2 -translate-x-full',\n side === 'right' && 'top-1/2 -translate-y-1/2 -right-2 translate-x-full'\n )}\n >\n {content}\n </span>\n </span>\n )\n}\n\nexport default Tooltip\n","import React from 'react'\nimport {cx} from '../utils/cx'\n\n// Table container\nexport interface TableProps extends React.TableHTMLAttributes<HTMLTableElement> {\n responsive?: boolean\n}\n\nexport const Table = React.forwardRef<HTMLTableElement, TableProps>(\n ({responsive = true, className, children, ...props}, ref) => {\n const table = (\n <table\n ref={ref}\n className={cx('w-full text-sm', className)}\n {...props}\n >\n {children}\n </table>\n )\n\n if (responsive) {\n return <div className=\"w-full overflow-x-auto\">{table}</div>\n }\n\n return table\n }\n)\n\nTable.displayName = 'Table'\n\n// Table header\nexport interface TableHeaderProps extends React.HTMLAttributes<HTMLTableSectionElement> {\n}\n\nexport const TableHeader = React.forwardRef<HTMLTableSectionElement, TableHeaderProps>(\n ({className, children, ...props}, ref) => (\n <thead\n ref={ref}\n className={cx('bg-graphite', className)}\n {...props}\n >\n {children}\n </thead>\n )\n)\n\nTableHeader.displayName = 'TableHeader'\n\n// Table body\nexport interface TableBodyProps extends React.HTMLAttributes<HTMLTableSectionElement> {\n}\n\nexport const TableBody = React.forwardRef<HTMLTableSectionElement, TableBodyProps>(\n ({className, children, ...props}, ref) => (\n <tbody\n ref={ref}\n className={cx('divide-y divide-ash', className)}\n {...props}\n >\n {children}\n </tbody>\n )\n)\n\nTableBody.displayName = 'TableBody'\n\n// Table footer\nexport interface TableFooterProps extends React.HTMLAttributes<HTMLTableSectionElement> {\n}\n\nexport const TableFooter = React.forwardRef<HTMLTableSectionElement, TableFooterProps>(\n ({className, children, ...props}, ref) => (\n <tfoot\n ref={ref}\n className={cx('bg-graphite font-medium', className)}\n {...props}\n >\n {children}\n </tfoot>\n )\n)\n\nTableFooter.displayName = 'TableFooter'\n\n// Table row\nexport interface TableRowProps extends React.HTMLAttributes<HTMLTableRowElement> {\n hoverable?: boolean\n selected?: boolean\n}\n\nexport const TableRow = React.forwardRef<HTMLTableRowElement, TableRowProps>(\n ({hoverable = true, selected = false, className, children, ...props}, ref) => (\n <tr\n ref={ref}\n className={cx(\n 'transition-colors duration-fast',\n hoverable && 'hover:bg-graphite/50',\n selected && 'bg-gold/10',\n className\n )}\n {...props}\n >\n {children}\n </tr>\n )\n)\n\nTableRow.displayName = 'TableRow'\n\n// Table header cell\nexport interface TableHeadProps extends React.ThHTMLAttributes<HTMLTableCellElement> {\n sortable?: boolean\n sortDirection?: 'asc' | 'desc' | null\n}\n\nexport const TableHead = React.forwardRef<HTMLTableCellElement, TableHeadProps>(\n ({sortable, sortDirection, className, children, ...props}, ref) => (\n <th\n ref={ref}\n className={cx(\n 'px-4 py-3 text-left font-semibold text-silver',\n sortable && 'cursor-pointer hover:text-white select-none',\n className\n )}\n {...props}\n >\n <div className=\"flex items-center gap-2\">\n {children}\n {sortable && sortDirection && (\n <span className=\"text-gold\">\n {sortDirection === 'asc' ? '↑' : '↓'}\n </span>\n )}\n </div>\n </th>\n )\n)\n\nTableHead.displayName = 'TableHead'\n\n// Table data cell\nexport interface TableCellProps extends React.TdHTMLAttributes<HTMLTableCellElement> {\n}\n\nexport const TableCell = React.forwardRef<HTMLTableCellElement, TableCellProps>(\n ({className, children, ...props}, ref) => (\n <td\n ref={ref}\n className={cx('px-4 py-3 text-white', className)}\n {...props}\n >\n {children}\n </td>\n )\n)\n\nTableCell.displayName = 'TableCell'\n\n// Table caption\nexport interface TableCaptionProps extends React.HTMLAttributes<HTMLTableCaptionElement> {\n}\n\nexport const TableCaption = React.forwardRef<HTMLTableCaptionElement, TableCaptionProps>(\n ({className, children, ...props}, ref) => (\n <caption\n ref={ref}\n className={cx('mt-4 text-sm text-silver', className)}\n {...props}\n >\n {children}\n </caption>\n )\n)\n\nTableCaption.displayName = 'TableCaption'\n","import React from 'react'\nimport {cx} from '../utils/cx'\n\n// List container\nexport interface ListProps extends React.HTMLAttributes<HTMLUListElement> {\n variant?: 'default' | 'bordered' | 'divided'\n ordered?: boolean\n}\n\nexport const List = React.forwardRef<HTMLUListElement, ListProps>(\n ({variant = 'default', ordered = false, className, children, ...props}, ref) => {\n const Component = ordered ? 'ol' : 'ul'\n\n return (\n <Component\n ref={ref as any}\n className={cx(\n 'list-none m-0 p-0',\n variant === 'bordered' && 'border border-ash',\n variant === 'divided' && 'divide-y divide-ash',\n className\n )}\n {...props}\n >\n {children}\n </Component>\n )\n }\n)\n\nList.displayName = 'List'\n\n// ListItem\nexport interface ListItemProps extends React.LiHTMLAttributes<HTMLLIElement> {\n leading?: React.ReactNode\n trailing?: React.ReactNode\n interactive?: boolean\n selected?: boolean\n disabled?: boolean\n}\n\nexport const ListItem = React.forwardRef<HTMLLIElement, ListItemProps>(\n (\n {\n leading,\n trailing,\n interactive = false,\n selected = false,\n disabled = false,\n className,\n children,\n onClick,\n ...props\n },\n ref\n ) => {\n const handleClick = (e: React.MouseEvent<HTMLLIElement>) => {\n if (disabled) {\n return\n }\n onClick?.(e)\n }\n\n return (\n <li\n ref={ref}\n onClick={handleClick}\n className={cx(\n 'flex items-center gap-3 px-4 py-3',\n interactive && 'cursor-pointer transition-colors duration-fast',\n interactive && !disabled && 'hover:bg-graphite',\n selected && 'bg-gold/10',\n disabled && 'opacity-50 cursor-not-allowed',\n className\n )}\n {...props}\n >\n {leading && <div className=\"shrink-0\">{leading}</div>}\n <div className=\"flex-1 min-w-0\">{children}</div>\n {trailing && <div className=\"shrink-0\">{trailing}</div>}\n </li>\n )\n }\n)\n\nListItem.displayName = 'ListItem'\n\n// ListItemText - for structured text content\nexport interface ListItemTextProps extends React.HTMLAttributes<HTMLDivElement> {\n primary: React.ReactNode\n secondary?: React.ReactNode\n}\n\nexport const ListItemText = React.forwardRef<HTMLDivElement, ListItemTextProps>(\n ({primary, secondary, className, ...props}, ref) => {\n return (\n <div ref={ref} className={cx('flex flex-col', className)} {...props}>\n <span className=\"text-sm font-medium text-white\">{primary}</span>\n {secondary && (\n <span className=\"text-xs text-silver mt-0.5\">{secondary}</span>\n )}\n </div>\n )\n }\n)\n\nListItemText.displayName = 'ListItemText'\n\n// ListSubheader - section header within a list\nexport interface ListSubheaderProps extends React.HTMLAttributes<HTMLLIElement> {\n}\n\nexport const ListSubheader = React.forwardRef<HTMLLIElement, ListSubheaderProps>(\n ({className, children, ...props}, ref) => {\n return (\n <li\n ref={ref}\n className={cx(\n 'px-4 py-2 text-xs font-semibold text-gold uppercase tracking-wider bg-graphite',\n className\n )}\n {...props}\n >\n {children}\n </li>\n )\n }\n)\n\nListSubheader.displayName = 'ListSubheader'\n","import React from 'react'\nimport {cx} from '../utils/cx'\nimport {\n File,\n FileArchive,\n FileAudio,\n FileCode,\n FileImage,\n FileText,\n FileVideo,\n Loader2,\n X\n} from 'lucide-react'\n\nexport type FileChipStatus = 'pending' | 'uploading' | 'complete' | 'error'\n\nexport interface FileChipProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> {\n /**\n * File name to display\n */\n name: string\n /**\n * File size in bytes (optional, will be formatted)\n */\n size?: number\n /**\n * MIME type for icon selection\n */\n type?: string\n /**\n * Upload/processing status\n */\n status?: FileChipStatus\n /**\n * Preview image URL (for images)\n */\n previewUrl?: string\n /**\n * Called when the remove button is clicked\n */\n onRemove?: () => void\n /**\n * Whether the chip is removable\n */\n removable?: boolean\n /**\n * Error message to display (when status is 'error')\n */\n error?: string\n}\n\n/**\n * Format bytes to human-readable string\n */\nfunction formatBytes(bytes: number): string {\n if (bytes === 0) {\n return '0 B'\n }\n const k = 1024\n const sizes = ['B', 'KB', 'MB', 'GB']\n const i = Math.floor(Math.log(bytes) / Math.log(k))\n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(1))} ${sizes[i]}`\n}\n\n/**\n * Get icon component based on MIME type\n */\nfunction getFileIcon(type?: string) {\n if (!type) {\n return File\n }\n\n if (type.startsWith('image/')) {\n return FileImage\n }\n if (type.startsWith('video/')) {\n return FileVideo\n }\n if (type.startsWith('audio/')) {\n return FileAudio\n }\n if (type.startsWith('text/')) {\n return FileText\n }\n if (type.includes('javascript') || type.includes('typescript') || type.includes('json')\n || type.includes('xml')) {\n return FileCode\n }\n if (type.includes('zip') || type.includes('rar') || type.includes('tar') || type.includes('gz')) {\n return FileArchive\n }\n\n return File\n}\n\nconst statusStyles: Record<FileChipStatus, string> = {\n pending: 'border-silver/30',\n uploading: 'border-gold/50',\n complete: 'border-success/50',\n error: 'border-error/50',\n}\n\nexport const FileChip = React.forwardRef<HTMLDivElement, FileChipProps>(\n (\n {\n name,\n size,\n type,\n status = 'complete',\n previewUrl,\n onRemove,\n removable = true,\n error,\n className,\n ...rest\n },\n ref\n ) => {\n const Icon = getFileIcon(type)\n const isImage = type?.startsWith('image/')\n const showPreview = isImage && previewUrl\n\n return (\n <div\n ref={ref}\n className={cx(\n 'group relative inline-flex items-center gap-2 px-2 py-1.5',\n 'bg-charcoal border text-sm text-white',\n 'transition-colors duration-150',\n statusStyles[status],\n status === 'error' && 'bg-error/10',\n className\n )}\n role=\"listitem\"\n {...rest}\n >\n {/* Preview thumbnail or icon */}\n {showPreview ? (\n <div className=\"w-8 h-8 flex-shrink-0 overflow-hidden bg-slate\">\n <img\n src={previewUrl}\n alt=\"\"\n className=\"w-full h-full object-cover\"\n />\n </div>\n ) : (\n <Icon className={cx(\n 'w-4 h-4 flex-shrink-0',\n status === 'error' ? 'text-error' : 'text-silver'\n )}/>\n )}\n\n {/* File info */}\n <div className=\"flex flex-col min-w-0 flex-1\">\n <span className=\"truncate max-w-40\" title={name}>\n {name}\n </span>\n {size !== undefined && status !== 'error' && (\n <span className=\"text-xs text-silver/60\">\n {formatBytes(size)}\n </span>\n )}\n {status === 'error' && error && (\n <span className=\"text-xs text-error truncate\" title={error}>\n {error}\n </span>\n )}\n </div>\n\n {/* Status indicator */}\n {status === 'uploading' && (\n <Loader2 className=\"w-3.5 h-3.5 text-gold animate-spin flex-shrink-0\"/>\n )}\n {status === 'pending' && (\n <div className=\"w-2 h-2 rounded-full bg-silver/50 flex-shrink-0\"/>\n )}\n\n {/* Remove button */}\n {removable && onRemove && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation()\n onRemove()\n }}\n className={cx(\n 'p-0.5 text-silver/40 hover:text-white transition-colors',\n 'hover:bg-white/10',\n 'opacity-0 group-hover:opacity-100',\n 'focus:opacity-100'\n )}\n aria-label={`Remove ${name}`}\n >\n <X className=\"w-3.5 h-3.5\"/>\n </button>\n )}\n </div>\n )\n }\n)\n\nFileChip.displayName = 'FileChip'\n\nexport default FileChip\n","import React from 'react'\nimport {cx} from '../utils/cx'\nimport {FileChip, type FileChipStatus} from './FileChip'\n\nexport interface AttachmentItem {\n /**\n * Unique identifier\n */\n id: string\n /**\n * The File object\n */\n file: File\n /**\n * Blob URL for image previews\n */\n previewUrl?: string\n /**\n * Current status\n */\n status: FileChipStatus\n /**\n * Error message if status is 'error'\n */\n error?: string\n}\n\nexport interface AttachmentPreviewProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Array of attachments to display\n */\n attachments: AttachmentItem[]\n /**\n * Called when an attachment should be removed\n */\n onRemove?: (id: string) => void\n /**\n * Whether attachments are removable\n */\n removable?: boolean\n /**\n * Maximum number of attachments to show before collapsing\n * Set to 0 or undefined to show all\n */\n maxVisible?: number\n}\n\nexport const AttachmentPreview = React.forwardRef<HTMLDivElement, AttachmentPreviewProps>(\n (\n {\n attachments,\n onRemove,\n removable = true,\n maxVisible,\n className,\n ...rest\n },\n ref\n ) => {\n if (attachments.length === 0) {\n return null\n }\n\n const visibleAttachments = maxVisible && maxVisible > 0\n ? attachments.slice(0, maxVisible)\n : attachments\n\n const hiddenCount = maxVisible && maxVisible > 0\n ? Math.max(0, attachments.length - maxVisible)\n : 0\n\n return (\n <div\n ref={ref}\n className={cx('flex flex-wrap gap-2', className)}\n role=\"list\"\n aria-label=\"Attached files\"\n {...rest}\n >\n {visibleAttachments.map((attachment) => (\n <FileChip\n key={attachment.id}\n name={attachment.file.name}\n size={attachment.file.size}\n type={attachment.file.type}\n status={attachment.status}\n previewUrl={attachment.previewUrl}\n error={attachment.error}\n removable={removable}\n onRemove={onRemove ? () => onRemove(attachment.id) : undefined}\n />\n ))}\n {hiddenCount > 0 && (\n <div\n className=\"inline-flex items-center px-2 py-1.5 bg-charcoal border border-silver/30 text-sm text-silver\">\n +{hiddenCount} more\n </div>\n )}\n </div>\n )\n }\n)\n\nAttachmentPreview.displayName = 'AttachmentPreview'\n\nexport default AttachmentPreview\n","import React from 'react'\nimport {cx} from '../utils/cx'\n\nexport interface LabelProps extends React.LabelHTMLAttributes<HTMLLabelElement> {\n required?: boolean\n}\n\nexport const Label = React.forwardRef<HTMLLabelElement, LabelProps>(\n ({className, required, children, ...rest}, ref) => {\n return (\n <label\n ref={ref}\n className={cx('block text-sm font-medium text-silver mb-1.5', className)}\n {...rest}\n >\n {children}\n {required && <span className=\"text-error ml-1\">*</span>}\n </label>\n )\n }\n)\n\nLabel.displayName = 'Label'\n\nexport default Label\n","import React from 'react'\nimport {cx} from '../utils/cx'\n\nexport interface HelperTextProps extends React.HTMLAttributes<HTMLParagraphElement> {\n error?: boolean\n}\n\nexport const HelperText = React.forwardRef<HTMLParagraphElement, HelperTextProps>(\n ({className, error, children, ...rest}, ref) => {\n return (\n <p\n ref={ref}\n className={cx('mt-1.5 text-xs', error ? 'text-error' : 'text-silver', className)}\n {...rest}\n >\n {children}\n </p>\n )\n }\n)\n\nHelperText.displayName = 'HelperText'\n\nexport default HelperText\n","import React from 'react'\nimport {cx} from '../utils/cx'\n\nexport interface TextareaProps extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {\n error?: boolean\n}\n\nexport const Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(\n ({error = false, className, disabled, ...rest}, ref) => {\n // Base textarea styles\n const base =\n 'w-full px-3 py-2 bg-graphite border border-ash rounded-none ' +\n 'text-white placeholder:text-zinc min-h-[80px] ' +\n 'transition-all duration-fast ' +\n 'focus:border-gold focus:ring-1 focus:ring-gold focus:outline-none ' +\n 'disabled:bg-slate disabled:text-dim disabled:cursor-not-allowed'\n\n // Error styles\n const errorCls = error ? 'border-error focus:border-error focus:ring-error' : ''\n\n return (\n <textarea\n ref={ref}\n className={cx(base, errorCls, disabled && 'opacity-90', className)}\n disabled={disabled}\n {...rest}\n />\n )\n }\n)\n\nTextarea.displayName = 'Textarea'\n\nexport default Textarea\n","import React from 'react'\nimport {cx} from '../utils/cx'\n\nexport interface SelectOption {\n label: string\n value: string | number\n}\n\nexport interface SelectProps extends React.SelectHTMLAttributes<HTMLSelectElement> {\n error?: boolean\n options?: SelectOption[]\n}\n\nconst selectBgImage = \"url(\\\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%23C9A227' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3e%3c/svg%3e\\\")\"\n\nexport const Select = React.forwardRef<HTMLSelectElement, SelectProps>(\n ({error = false, className, disabled, options, children, ...rest}, ref) => {\n return (\n <select\n ref={ref}\n className={cx(\n 'appearance-none bg-graphite border border-ash rounded-none text-white px-3 py-2 pr-8',\n 'focus:border-gold focus:ring-1 focus:ring-gold focus:outline-none',\n 'disabled:opacity-50 disabled:cursor-not-allowed',\n error && 'border-error focus:border-error focus:ring-error',\n className\n )}\n style={{\n backgroundImage: selectBgImage,\n backgroundPosition: 'right 0.5rem center',\n backgroundRepeat: 'no-repeat',\n backgroundSize: '1.5em 1.5em',\n }}\n disabled={disabled}\n {...rest}\n >\n {options\n ? options.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))\n : children}\n </select>\n )\n }\n)\n\nSelect.displayName = 'Select'\n\nexport default Select\n","import React, {useCallback} from 'react'\nimport {cx} from '../utils/cx'\n\nexport interface CheckboxProps extends React.InputHTMLAttributes<HTMLInputElement> {\n label?: string\n}\n\nconst checkmarkSvg = \"url(\\\"data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='%231A1A1A' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3e%3c/svg%3e\\\")\"\n\nexport const Checkbox = React.forwardRef<HTMLInputElement, CheckboxProps>(\n ({className, label, id, ...rest}, ref) => {\n const inputId = id || rest.name || Math.random().toString(36).substr(2, 9)\n\n const setRef = useCallback((node: HTMLInputElement | null) => {\n if (node) {\n // Set initial background image based on checked state\n if (node.checked) {\n node.style.backgroundImage = checkmarkSvg\n }\n }\n // Forward ref\n if (typeof ref === 'function') {\n ref(node)\n } else if (ref) {\n ref.current = node\n }\n }, [ref])\n\n return (\n <div className=\"flex items-center\">\n <input\n type=\"checkbox\"\n id={inputId}\n ref={setRef}\n className={cx(\n 'appearance-none h-4 w-4 border border-ash bg-graphite',\n 'checked:bg-gold checked:border-gold',\n 'focus:ring-1 focus:ring-gold focus:ring-offset-1 focus:ring-offset-obsidian',\n 'transition duration-200 ease-in-out cursor-pointer',\n 'disabled:opacity-50 disabled:cursor-not-allowed',\n className\n )}\n style={{\n backgroundPosition: 'center',\n backgroundSize: 'contain',\n backgroundRepeat: 'no-repeat',\n }}\n onChange={(e) => {\n const input = e.currentTarget\n if (input.checked) {\n input.style.backgroundImage = checkmarkSvg\n } else {\n input.style.backgroundImage = 'none'\n }\n rest.onChange?.(e)\n }}\n {...rest}\n />\n {label && (\n <label htmlFor={inputId}\n className=\"ml-2 text-sm text-silver cursor-pointer select-none\">\n {label}\n </label>\n )}\n </div>\n )\n }\n)\n\nCheckbox.displayName = 'Checkbox'\n\nexport default Checkbox\n","import React, {useCallback} from 'react'\nimport {cx} from '../utils/cx'\n\nexport interface RadioProps extends React.InputHTMLAttributes<HTMLInputElement> {\n label?: string\n}\n\nconst radioDotSvg = \"url(\\\"data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='%231A1A1A' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle cx='8' cy='8' r='3'/%3e%3c/svg%3e\\\")\"\n\nexport const Radio = React.forwardRef<HTMLInputElement, RadioProps>(\n ({className, label, id, ...rest}, ref) => {\n const inputId = id || rest.name || Math.random().toString(36).substr(2, 9)\n\n const setRef = useCallback((node: HTMLInputElement | null) => {\n if (node) {\n // Set initial background image based on checked state\n if (node.checked) {\n node.style.backgroundImage = radioDotSvg\n }\n }\n // Forward ref\n if (typeof ref === 'function') {\n ref(node)\n } else if (ref) {\n ref.current = node\n }\n }, [ref])\n\n return (\n <div className=\"flex items-center\">\n <input\n type=\"radio\"\n id={inputId}\n ref={setRef}\n className={cx(\n 'appearance-none h-4 w-4 border border-ash rounded-full bg-graphite',\n 'checked:bg-gold checked:border-gold',\n 'focus:ring-1 focus:ring-gold focus:ring-offset-1 focus:ring-offset-obsidian',\n 'transition duration-200 ease-in-out cursor-pointer',\n 'disabled:opacity-50 disabled:cursor-not-allowed',\n className\n )}\n style={{\n backgroundPosition: 'center',\n backgroundSize: 'contain',\n backgroundRepeat: 'no-repeat',\n }}\n onChange={(e) => {\n const input = e.currentTarget\n if (input.checked) {\n input.style.backgroundImage = radioDotSvg\n // Clear other radios in the same group\n if (input.name) {\n const radios = document.querySelectorAll<HTMLInputElement>(\n `input[type=\"radio\"][name=\"${input.name}\"]`)\n radios.forEach((radio) => {\n if (radio !== input) {\n radio.style.backgroundImage = 'none'\n }\n })\n }\n } else {\n input.style.backgroundImage = 'none'\n }\n rest.onChange?.(e)\n }}\n {...rest}\n />\n {label && (\n <label htmlFor={inputId}\n className=\"ml-2 text-sm text-silver cursor-pointer select-none\">\n {label}\n </label>\n )}\n </div>\n )\n }\n)\n\nRadio.displayName = 'Radio'\n\nexport default Radio\n","import React, {useCallback, useRef, useState} from 'react'\nimport {cx} from '../utils/cx'\n\nexport interface SwitchProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'onChange'> {\n checked?: boolean\n defaultChecked?: boolean\n onCheckedChange?: (checked: boolean) => void\n label?: string\n}\n\nexport const Switch = React.forwardRef<HTMLButtonElement, SwitchProps>(\n ({\n checked: controlledChecked,\n defaultChecked = false,\n onCheckedChange,\n disabled,\n className,\n label,\n ...rest\n }, ref) => {\n const [internalChecked, setInternalChecked] = useState(defaultChecked)\n const isControlled = controlledChecked !== undefined\n const checked = isControlled ? controlledChecked : internalChecked\n const buttonRef = useRef<HTMLButtonElement | null>(null)\n const setRefs = useCallback(\n (node: HTMLButtonElement | null) => {\n buttonRef.current = node\n if (typeof ref === 'function') {\n ref(node)\n } else if (ref) {\n ref.current = node\n }\n },\n [ref]\n )\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n if (disabled) {\n return\n }\n const newChecked = !checked\n if (!isControlled) {\n setInternalChecked(newChecked)\n }\n onCheckedChange?.(newChecked)\n rest.onClick?.(e)\n }\n\n return (\n <div className=\"flex items-center gap-2\">\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={checked}\n data-state={checked ? 'checked' : 'unchecked'}\n disabled={disabled}\n ref={setRefs}\n onClick={handleClick}\n className={cx(\n 'relative inline-flex h-6 w-11 shrink-0 cursor-pointer rounded-full border-2 border-transparent',\n 'transition-colors duration-200 ease-in-out',\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-gold focus-visible:ring-offset-2 focus-visible:ring-offset-obsidian',\n 'disabled:opacity-50 disabled:cursor-not-allowed',\n checked ? 'bg-gold' : 'bg-charcoal',\n className\n )}\n {...rest}\n >\n <span\n className={cx(\n 'pointer-events-none inline-block h-5 w-5 transform rounded-full bg-white shadow ring-0',\n 'transition duration-200 ease-in-out',\n checked ? 'translate-x-5' : 'translate-x-0'\n )}\n />\n </button>\n {label && (\n <span\n className=\"text-sm text-silver cursor-pointer\"\n onClick={() => {\n if (disabled) {\n return\n }\n buttonRef.current?.click()\n }}\n >\n {label}\n </span>\n )}\n </div>\n )\n }\n)\n\nSwitch.displayName = 'Switch'\n\nexport default Switch\n","import React, {useCallback, useRef, useState} from 'react'\nimport {cx} from '../utils/cx'\n\nexport interface SliderProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {\n value?: number\n defaultValue?: number\n min?: number\n max?: number\n step?: number\n onChange?: (value: number) => void\n onChangeEnd?: (value: number) => void\n disabled?: boolean\n showTooltip?: boolean\n formatValue?: (value: number) => string\n size?: 'sm' | 'md' | 'lg'\n}\n\nconst SIZE_TRACK: Record<string, string> = {\n sm: 'h-1',\n md: 'h-2',\n lg: 'h-3',\n}\n\nconst SIZE_THUMB: Record<string, string> = {\n sm: 'h-3 w-3',\n md: 'h-4 w-4',\n lg: 'h-5 w-5',\n}\n\nexport const Slider = React.forwardRef<HTMLDivElement, SliderProps>(\n (\n {\n value: controlledValue,\n defaultValue = 0,\n min = 0,\n max = 100,\n step = 1,\n onChange,\n onChangeEnd,\n disabled = false,\n showTooltip = false,\n formatValue = (v) => String(v),\n size = 'md',\n className,\n ...props\n },\n ref\n ) => {\n const [internalValue, setInternalValue] = useState(defaultValue)\n const [isDragging, setIsDragging] = useState(false)\n const trackRef = useRef<HTMLDivElement>(null)\n\n const isControlled = controlledValue !== undefined\n const value = isControlled ? controlledValue : internalValue\n\n const percentage = ((value - min) / (max - min)) * 100\n\n const updateValue = useCallback(\n (clientX: number) => {\n if (!trackRef.current || disabled) {\n return\n }\n\n const rect = trackRef.current.getBoundingClientRect()\n const percent = Math.max(0, Math.min(1, (clientX - rect.left) / rect.width))\n const rawValue = min + percent * (max - min)\n const steppedValue = Math.round(rawValue / step) * step\n const clampedValue = Math.max(min, Math.min(max, steppedValue))\n\n if (!isControlled) {\n setInternalValue(clampedValue)\n }\n onChange?.(clampedValue)\n },\n [min, max, step, disabled, isControlled, onChange]\n )\n\n const handleMouseDown = (e: React.MouseEvent) => {\n if (disabled) {\n return\n }\n setIsDragging(true)\n updateValue(e.clientX)\n\n const handleMouseMove = (e: MouseEvent) => {\n updateValue(e.clientX)\n }\n\n const handleMouseUp = (e: MouseEvent) => {\n setIsDragging(false)\n document.removeEventListener('mousemove', handleMouseMove)\n document.removeEventListener('mouseup', handleMouseUp)\n\n if (trackRef.current) {\n const rect = trackRef.current.getBoundingClientRect()\n const percent = Math.max(0, Math.min(1, (e.clientX - rect.left) / rect.width))\n const rawValue = min + percent * (max - min)\n const steppedValue = Math.round(rawValue / step) * step\n const clampedValue = Math.max(min, Math.min(max, steppedValue))\n onChangeEnd?.(clampedValue)\n }\n }\n\n document.addEventListener('mousemove', handleMouseMove)\n document.addEventListener('mouseup', handleMouseUp)\n }\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (disabled) {\n return\n }\n\n let newValue = value\n switch (e.key) {\n case 'ArrowRight':\n case 'ArrowUp':\n newValue = Math.min(max, value + step)\n break\n case 'ArrowLeft':\n case 'ArrowDown':\n newValue = Math.max(min, value - step)\n break\n case 'Home':\n newValue = min\n break\n case 'End':\n newValue = max\n break\n default:\n return\n }\n\n e.preventDefault()\n if (!isControlled) {\n setInternalValue(newValue)\n }\n onChange?.(newValue)\n onChangeEnd?.(newValue)\n }\n\n return (\n <div\n ref={ref}\n className={cx('relative w-full py-2', disabled && 'opacity-50', className)}\n {...props}\n >\n <div\n ref={trackRef}\n className={cx(\n 'relative w-full bg-charcoal border border-ash cursor-pointer',\n SIZE_TRACK[size]\n )}\n onMouseDown={handleMouseDown}\n >\n {/* Filled track */}\n <div\n className={cx('absolute inset-y-0 left-0 bg-gold', SIZE_TRACK[size])}\n style={{width: `${percentage}%`}}\n />\n\n {/* Thumb */}\n <div\n role=\"slider\"\n tabIndex={disabled ? -1 : 0}\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuenow={value}\n aria-disabled={disabled}\n onKeyDown={handleKeyDown}\n className={cx(\n 'absolute top-1/2 -translate-y-1/2 -translate-x-1/2',\n 'bg-gold border-2 border-gold-light rounded-full',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-gold focus-visible:ring-offset-2 focus-visible:ring-offset-obsidian',\n 'transition-transform duration-fast',\n isDragging && 'scale-110',\n !disabled && 'cursor-grab active:cursor-grabbing',\n SIZE_THUMB[size]\n )}\n style={{left: `${percentage}%`}}\n >\n {/* Tooltip */}\n {showTooltip && isDragging && (\n <div\n className=\"absolute bottom-full left-1/2 -translate-x-1/2 mb-2 px-2 py-1 bg-graphite border border-ash text-xs text-white whitespace-nowrap\">\n {formatValue(value)}\n </div>\n )}\n </div>\n </div>\n </div>\n )\n }\n)\n\nSlider.displayName = 'Slider'\n","import React from 'react'\nimport {cx} from '../utils/cx'\n\n// InputGroup container\nexport interface InputGroupProps extends React.HTMLAttributes<HTMLDivElement> {\n}\n\nexport const InputGroup = React.forwardRef<HTMLDivElement, InputGroupProps>(\n ({className, children, ...props}, ref) => {\n return (\n <div\n ref={ref}\n className={cx('flex', className)}\n {...props}\n >\n {children}\n </div>\n )\n }\n)\n\nInputGroup.displayName = 'InputGroup'\n\n// InputLeftAddon - static text/icon on the left\nexport interface InputAddonProps extends React.HTMLAttributes<HTMLDivElement> {\n}\n\nexport const InputLeftAddon = React.forwardRef<HTMLDivElement, InputAddonProps>(\n ({className, children, ...props}, ref) => {\n return (\n <div\n ref={ref}\n className={cx(\n 'flex items-center px-3 bg-slate border border-r-0 border-ash',\n 'text-sm text-silver whitespace-nowrap',\n className\n )}\n {...props}\n >\n {children}\n </div>\n )\n }\n)\n\nInputLeftAddon.displayName = 'InputLeftAddon'\n\n// InputRightAddon - static text/icon on the right\nexport const InputRightAddon = React.forwardRef<HTMLDivElement, InputAddonProps>(\n ({className, children, ...props}, ref) => {\n return (\n <div\n ref={ref}\n className={cx(\n 'flex items-center px-3 bg-slate border border-l-0 border-ash',\n 'text-sm text-silver whitespace-nowrap',\n className\n )}\n {...props}\n >\n {children}\n </div>\n )\n }\n)\n\nInputRightAddon.displayName = 'InputRightAddon'\n\n// InputLeftElement - overlaid element on the left (like an icon inside the input)\nexport interface InputElementProps extends React.HTMLAttributes<HTMLDivElement> {\n}\n\nexport const InputLeftElement = React.forwardRef<HTMLDivElement, InputElementProps>(\n ({className, children, ...props}, ref) => {\n return (\n <div\n ref={ref}\n className={cx(\n 'absolute left-0 inset-y-0 flex items-center pl-3',\n 'pointer-events-none text-silver',\n className\n )}\n {...props}\n >\n {children}\n </div>\n )\n }\n)\n\nInputLeftElement.displayName = 'InputLeftElement'\n\n// InputRightElement - overlaid element on the right (like a button inside the input)\nexport const InputRightElement = React.forwardRef<HTMLDivElement, InputElementProps>(\n ({className, children, ...props}, ref) => {\n return (\n <div\n ref={ref}\n className={cx(\n 'absolute right-0 inset-y-0 flex items-center pr-3',\n className\n )}\n {...props}\n >\n {children}\n </div>\n )\n }\n)\n\nInputRightElement.displayName = 'InputRightElement'\n\n// InputWrapper - for relative positioning when using left/right elements\nexport interface InputWrapperProps extends React.HTMLAttributes<HTMLDivElement> {\n}\n\nexport const InputWrapper = React.forwardRef<HTMLDivElement, InputWrapperProps>(\n ({className, children, ...props}, ref) => {\n return (\n <div\n ref={ref}\n className={cx('relative flex-1', className)}\n {...props}\n >\n {children}\n </div>\n )\n }\n)\n\nInputWrapper.displayName = 'InputWrapper'\n","import React from 'react'\nimport {AlertTriangle, CheckCircle, Info, XCircle} from 'lucide-react'\nimport {cx} from '../utils/cx'\n\nexport type AlertVariant = 'info' | 'success' | 'warning' | 'error'\n\nexport interface AlertProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: AlertVariant\n title?: string\n}\n\nconst icons = {\n info: Info,\n success: CheckCircle,\n warning: AlertTriangle,\n error: XCircle,\n}\n\nconst variantStyles = {\n info: 'bg-info/10 border-info text-info',\n success: 'bg-success/10 border-success text-success',\n warning: 'bg-warning/10 border-warning text-warning',\n error: 'bg-error/10 border-error text-error',\n}\n\nexport const Alert = React.forwardRef<HTMLDivElement, AlertProps>(\n ({variant = 'info', title, children, className, ...rest}, ref) => {\n const Icon = icons[variant]\n\n return (\n <div\n ref={ref}\n role=\"alert\"\n className={cx(\n 'relative w-full p-4 rounded-none border border-l-4 flex gap-3',\n variantStyles[variant],\n className\n )}\n {...rest}\n >\n <Icon className=\"h-5 w-5 shrink-0\"/>\n <div className=\"flex-1\">\n {title && <h5\n className=\"mb-1 font-medium leading-none tracking-tight text-current\">{title}</h5>}\n <div className=\"text-sm opacity-90\">{children}</div>\n </div>\n </div>\n )\n }\n)\n\nAlert.displayName = 'Alert'\n\nexport default Alert\n","import React from 'react'\nimport {cx} from '../utils/cx'\n\nexport type SpinnerSize = 'sm' | 'md' | 'lg'\n\nexport interface SpinnerProps extends React.SVGAttributes<SVGElement> {\n size?: SpinnerSize\n}\n\nexport const Spinner = ({className, size = 'md', ...rest}: SpinnerProps) => {\n const sizeClass =\n size === 'sm' ? 'h-4 w-4' : size === 'lg' ? 'h-8 w-8' : 'h-6 w-6'\n\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={cx('animate-spin text-gold', sizeClass, className)}\n {...rest}\n >\n <path d=\"M21 12a9 9 0 1 1-6.219-8.56\"/>\n </svg>\n )\n}\n\nSpinner.displayName = 'Spinner'\n\nexport default Spinner\n","import React from 'react'\nimport {cx} from '../utils/cx'\n\nexport type ProgressSize = 'sm' | 'md' | 'lg'\nexport type ProgressVariant = 'default' | 'success' | 'warning' | 'error'\n\nexport interface ProgressProps extends React.HTMLAttributes<HTMLDivElement> {\n value?: number\n max?: number\n size?: ProgressSize\n variant?: ProgressVariant\n showValue?: boolean\n formatValue?: (value: number, max: number) => string\n indeterminate?: boolean\n}\n\nconst SIZE_MAP: Record<ProgressSize, string> = {\n sm: 'h-1',\n md: 'h-2',\n lg: 'h-3',\n}\n\nconst VARIANT_MAP: Record<ProgressVariant, string> = {\n default: 'bg-gold',\n success: 'bg-success',\n warning: 'bg-warning',\n error: 'bg-error',\n}\n\nexport const Progress = React.forwardRef<HTMLDivElement, ProgressProps>(\n (\n {\n value = 0,\n max = 100,\n size = 'md',\n variant = 'default',\n showValue = false,\n formatValue,\n indeterminate = false,\n className,\n ...props\n },\n ref\n ) => {\n const percentage = Math.min(100, Math.max(0, (value / max) * 100))\n const displayValue = formatValue\n ? formatValue(value, max)\n : `${Math.round(percentage)}%`\n\n return (\n <div ref={ref} className={cx('w-full', className)} {...props}>\n {showValue && (\n <div className=\"flex justify-between mb-1\">\n <span className=\"text-sm text-silver\">Progress</span>\n <span className=\"text-sm text-white font-medium\">{displayValue}</span>\n </div>\n )}\n <div\n className={cx(\n 'w-full bg-charcoal border border-ash overflow-hidden rounded-none',\n SIZE_MAP[size]\n )}\n role=\"progressbar\"\n aria-valuenow={indeterminate ? undefined : value}\n aria-valuemin={0}\n aria-valuemax={max}\n >\n <div\n className={cx(\n 'h-full transition-all duration-300 ease-out',\n VARIANT_MAP[variant],\n indeterminate && 'animate-pulse'\n )}\n style={{\n width: indeterminate ? '100%' : `${percentage}%`,\n }}\n />\n </div>\n </div>\n )\n }\n)\n\nProgress.displayName = 'Progress'\n","import React, {createContext, useCallback, useContext, useEffect, useState} from 'react'\nimport {createPortal} from 'react-dom'\nimport {AlertCircle, AlertTriangle, CheckCircle, Info, X} from 'lucide-react'\nimport {cx} from '../utils/cx'\n\nexport type ToastVariant = 'default' | 'success' | 'error' | 'warning' | 'info'\nexport type ToastPosition =\n 'top-right'\n | 'top-left'\n | 'bottom-right'\n | 'bottom-left'\n | 'top-center'\n | 'bottom-center'\n\nexport interface ToastData {\n id: string\n title?: string\n description?: string\n variant?: ToastVariant\n duration?: number\n action?: React.ReactNode\n}\n\ninterface ToastContextValue {\n toasts: ToastData[]\n addToast: (toast: Omit<ToastData, 'id'>) => string\n removeToast: (id: string) => void\n position: ToastPosition\n}\n\nconst ToastContext = createContext<ToastContextValue | null>(null)\n\nexport function useToast() {\n const context = useContext(ToastContext)\n if (!context) {\n throw new Error('useToast must be used within a ToastProvider')\n }\n\n const toast = useCallback(\n (options: Omit<ToastData, 'id'>) => {\n return context.addToast(options)\n },\n [context]\n )\n\n return {\n toast,\n dismiss: context.removeToast,\n }\n}\n\n// ToastProvider - wrap your app with this\nexport interface ToastProviderProps {\n children: React.ReactNode\n position?: ToastPosition\n defaultDuration?: number\n}\n\nexport const ToastProvider: React.FC<ToastProviderProps> = ({\n children,\n position = 'bottom-right',\n defaultDuration = 5000,\n}) => {\n const [toasts, setToasts] = useState<ToastData[]>([])\n const [mounted, setMounted] = useState(false)\n\n useEffect(() => {\n setMounted(true)\n }, [])\n\n const addToast = useCallback(\n (toast: Omit<ToastData, 'id'>) => {\n const id = Math.random().toString(36).substr(2, 9)\n const newToast: ToastData = {\n ...toast,\n id,\n duration: toast.duration ?? defaultDuration,\n }\n setToasts((prev) => [...prev, newToast])\n return id\n },\n [defaultDuration]\n )\n\n const removeToast = useCallback((id: string) => {\n setToasts((prev) => prev.filter((t) => t.id !== id))\n }, [])\n\n return (\n <ToastContext.Provider value={{toasts, addToast, removeToast, position}}>\n {children}\n {mounted && <ToastViewport/>}\n </ToastContext.Provider>\n )\n}\n\nToastProvider.displayName = 'ToastProvider'\n\n// ToastViewport - container for all toasts\nconst ToastViewport: React.FC = () => {\n const context = useContext(ToastContext)\n if (!context) {\n return null\n }\n\n const {toasts, position} = context\n\n const positionClasses: Record<ToastPosition, string> = {\n 'top-right': 'top-4 right-4',\n 'top-left': 'top-4 left-4',\n 'bottom-right': 'bottom-4 right-4',\n 'bottom-left': 'bottom-4 left-4',\n 'top-center': 'top-4 left-1/2 -translate-x-1/2',\n 'bottom-center': 'bottom-4 left-1/2 -translate-x-1/2',\n }\n\n return createPortal(\n <div\n className={cx(\n 'fixed z-50 flex flex-col gap-2 pointer-events-none',\n positionClasses[position]\n )}\n >\n {toasts.map((toast) => (\n <Toast key={toast.id} {...toast} />\n ))}\n </div>,\n document.body\n )\n}\n\n// Individual Toast\ninterface ToastProps extends ToastData {\n}\n\nconst VARIANT_STYLES: Record<ToastVariant, string> = {\n default: 'bg-charcoal border-ash',\n success: 'bg-charcoal border-success/50',\n error: 'bg-charcoal border-error/50',\n warning: 'bg-charcoal border-warning/50',\n info: 'bg-charcoal border-info/50',\n}\n\nconst VARIANT_ICONS: Record<ToastVariant, React.ReactNode> = {\n default: null,\n success: <CheckCircle className=\"h-5 w-5 text-success\"/>,\n error: <AlertCircle className=\"h-5 w-5 text-error\"/>,\n warning: <AlertTriangle className=\"h-5 w-5 text-warning\"/>,\n info: <Info className=\"h-5 w-5 text-info\"/>,\n}\n\nconst Toast: React.FC<ToastProps> = ({\n id,\n title,\n description,\n variant = 'default',\n duration,\n action,\n}) => {\n const context = useContext(ToastContext)\n\n useEffect(() => {\n if (duration && duration > 0) {\n const timer = setTimeout(() => {\n context?.removeToast(id)\n }, duration)\n return () => clearTimeout(timer)\n }\n }, [id, duration, context])\n\n const icon = VARIANT_ICONS[variant]\n\n return (\n <div\n role=\"alert\"\n className={cx(\n 'pointer-events-auto w-80 p-4 border shadow-lg animate-slide-in-right',\n VARIANT_STYLES[variant]\n )}\n >\n <div className=\"flex gap-3\">\n {icon && <div className=\"shrink-0 mt-0.5\">{icon}</div>}\n <div className=\"flex-1 min-w-0\">\n {title && (\n <p className=\"text-sm font-medium text-white\">{title}</p>\n )}\n {description && (\n <p className=\"text-sm text-silver mt-1\">{description}</p>\n )}\n {action && <div className=\"mt-3\">{action}</div>}\n </div>\n <button\n onClick={() => context?.removeToast(id)}\n className=\"shrink-0 text-silver hover:text-white transition-colors\"\n >\n <X className=\"h-4 w-4\"/>\n <span className=\"sr-only\">Dismiss</span>\n </button>\n </div>\n </div>\n )\n}\n\nToast.displayName = 'Toast'\n","import React, {useEffect, useState} from 'react'\nimport {createPortal} from 'react-dom'\nimport {X} from 'lucide-react'\nimport {cx} from '../utils/cx'\n\nexport interface ModalProps {\n isOpen: boolean\n onClose: () => void\n title?: string\n children: React.ReactNode\n className?: string\n}\n\nexport const Modal = ({isOpen, onClose, title, children, className}: ModalProps) => {\n const [mounted, setMounted] = useState(false)\n\n useEffect(() => {\n setMounted(true)\n }, [])\n\n useEffect(() => {\n if (isOpen) {\n const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth\n document.body.style.overflow = 'hidden'\n document.body.style.paddingRight = `${scrollbarWidth}px`\n } else {\n document.body.style.overflow = 'unset'\n document.body.style.paddingRight = '0px'\n }\n return () => {\n document.body.style.overflow = 'unset'\n document.body.style.paddingRight = '0px'\n }\n }, [isOpen])\n\n useEffect(() => {\n const handleEsc = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n onClose()\n }\n }\n window.addEventListener('keydown', handleEsc)\n return () => window.removeEventListener('keydown', handleEsc)\n }, [onClose])\n\n if (!mounted) {\n return null\n }\n\n // Don't render anything if closed, unless we want exit animations. \n // My CSS relies on data-state, but if I unmount immediately, exit animation won't play.\n // To support exit animations, I'd need a transition manager (like framer-motion or headlessui).\n // For this simple implementation, I'll render conditionally. \n // If I want animation, I need to keep it mounted until animation ends.\n // Given the prompt \"add all suggestions\" and \"premium\", a simple unmount is acceptable for v1\n // without heavy deps. However, the CSS I wrote has `data-state=closed`. Without a transition\n // library, handling exit animation is tricky. I'll just conditional render for now. The entry\n // animation `animate-fade-in` will play.\n\n if (!isOpen) {\n return null;\n }\n\n const content = (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center p-4 sm:p-6\"\n onClick={onClose}>\n <div className=\"fixed inset-0 z-40 bg-obsidian/80 backdrop-blur-sm\" aria-hidden=\"true\"/>\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n className={cx(\n 'bg-charcoal border border-gold/30 shadow-2xl z-50 w-full max-w-lg p-6 rounded-none relative flex flex-col',\n className\n )}\n data-state=\"open\"\n onClick={(e) => e.stopPropagation()}\n >\n <div className=\"flex items-center justify-between mb-2\">\n {title ? <h3 className=\"text-xl font-semibold text-white m-0\">{title}</h3> : <div/>}\n <button onClick={onClose}\n className=\"text-silver hover:text-white transition-colors ml-auto\">\n <X className=\"h-5 w-5\"/>\n <span className=\"sr-only\">Close</span>\n </button>\n </div>\n <div className=\"overflow-y-auto min-h-0\">{children}</div>\n </div>\n </div>\n )\n\n return createPortal(content, document.body)\n}\n\nModal.displayName = 'Modal'\n\nexport default Modal\n","import React, {useEffect, useState} from 'react'\nimport {createPortal} from 'react-dom'\nimport {X} from 'lucide-react'\nimport {cx} from '../utils/cx'\n\nexport type DrawerPosition = 'left' | 'right' | 'top' | 'bottom'\n\nexport interface DrawerProps {\n isOpen: boolean\n onClose: () => void\n position?: DrawerPosition\n title?: string\n size?: 'sm' | 'md' | 'lg' | 'xl' | 'full'\n children: React.ReactNode\n className?: string\n}\n\nconst SIZE_MAP: Record<string, Record<DrawerPosition, string>> = {\n sm: {\n left: 'w-64',\n right: 'w-64',\n top: 'h-48',\n bottom: 'h-48',\n },\n md: {\n left: 'w-80',\n right: 'w-80',\n top: 'h-64',\n bottom: 'h-64',\n },\n lg: {\n left: 'w-96',\n right: 'w-96',\n top: 'h-80',\n bottom: 'h-80',\n },\n xl: {\n left: 'w-[32rem]',\n right: 'w-[32rem]',\n top: 'h-96',\n bottom: 'h-96',\n },\n full: {\n left: 'w-full',\n right: 'w-full',\n top: 'h-full',\n bottom: 'h-full',\n },\n}\n\nconst POSITION_CLASSES: Record<DrawerPosition, string> = {\n left: 'left-0 top-0 h-full',\n right: 'right-0 top-0 h-full',\n top: 'top-0 left-0 w-full',\n bottom: 'bottom-0 left-0 w-full',\n}\n\nconst TRANSFORM_CLASSES: Record<DrawerPosition, { open: string; closed: string }> = {\n left: {open: 'translate-x-0', closed: '-translate-x-full'},\n right: {open: 'translate-x-0', closed: 'translate-x-full'},\n top: {open: 'translate-y-0', closed: '-translate-y-full'},\n bottom: {open: 'translate-y-0', closed: 'translate-y-full'},\n}\n\nexport const Drawer: React.FC<DrawerProps> = ({\n isOpen,\n onClose,\n position = 'right',\n title,\n size = 'md',\n children,\n className,\n}) => {\n const [mounted, setMounted] = useState(false)\n\n useEffect(() => {\n setMounted(true)\n }, [])\n\n useEffect(() => {\n if (isOpen) {\n const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth\n document.body.style.overflow = 'hidden'\n document.body.style.paddingRight = `${scrollbarWidth}px`\n } else {\n document.body.style.overflow = 'unset'\n document.body.style.paddingRight = '0px'\n }\n return () => {\n document.body.style.overflow = 'unset'\n document.body.style.paddingRight = '0px'\n }\n }, [isOpen])\n\n useEffect(() => {\n const handleEsc = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n onClose()\n }\n }\n window.addEventListener('keydown', handleEsc)\n return () => window.removeEventListener('keydown', handleEsc)\n }, [onClose])\n\n if (!mounted) {\n return null\n }\n\n const content = (\n <div\n className={cx(\n 'fixed inset-0 z-50',\n isOpen ? 'pointer-events-auto' : 'pointer-events-none'\n )}\n >\n {/* Backdrop */}\n <div\n className={cx(\n 'fixed inset-0 bg-obsidian/80 backdrop-blur-sm transition-opacity duration-300',\n isOpen ? 'opacity-100' : 'opacity-0'\n )}\n onClick={onClose}\n aria-hidden=\"true\"\n />\n\n {/* Drawer panel */}\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n className={cx(\n 'fixed bg-charcoal border-ash shadow-2xl flex flex-col',\n 'transition-transform duration-300 ease-out',\n POSITION_CLASSES[position],\n SIZE_MAP[size][position],\n position === 'left' && 'border-r',\n position === 'right' && 'border-l',\n position === 'top' && 'border-b',\n position === 'bottom' && 'border-t',\n isOpen ? TRANSFORM_CLASSES[position].open : TRANSFORM_CLASSES[position].closed,\n className\n )}\n >\n {/* Header */}\n <div className=\"flex items-center justify-between px-4 py-3 border-b border-ash\">\n {title ? (\n <h2 className=\"text-lg font-semibold text-white m-0\">{title}</h2>\n ) : (\n <div/>\n )}\n <button\n onClick={onClose}\n className=\"text-silver hover:text-white transition-colors\"\n >\n <X className=\"h-5 w-5\"/>\n <span className=\"sr-only\">Close</span>\n </button>\n </div>\n\n {/* Content */}\n <div className=\"flex-1 overflow-auto p-4\">{children}</div>\n </div>\n </div>\n )\n\n return createPortal(content, document.body)\n}\n\nDrawer.displayName = 'Drawer'\n","import React, {useCallback, useEffect, useId, useRef, useState} from 'react'\nimport {cx} from '../utils/cx'\n\nexport type PopoverPosition = 'top' | 'bottom' | 'left' | 'right'\nexport type PopoverAlign = 'start' | 'center' | 'end'\n\nexport interface PopoverProps {\n children: React.ReactNode\n /** The trigger element */\n trigger: React.ReactElement\n /** Position relative to trigger */\n position?: PopoverPosition\n /** Alignment along the position axis */\n align?: PopoverAlign\n /** Controlled open state */\n open?: boolean\n /** Callback when open state changes */\n onOpenChange?: (open: boolean) => void\n /** Close when clicking outside */\n closeOnClickOutside?: boolean\n}\n\nconst POSITION_CLASSES: Record<PopoverPosition, Record<PopoverAlign, string>> = {\n top: {\n start: 'bottom-full left-0 mb-2',\n center: 'bottom-full left-1/2 -translate-x-1/2 mb-2',\n end: 'bottom-full right-0 mb-2',\n },\n bottom: {\n start: 'top-full left-0 mt-2',\n center: 'top-full left-1/2 -translate-x-1/2 mt-2',\n end: 'top-full right-0 mt-2',\n },\n left: {\n start: 'right-full top-0 mr-2',\n center: 'right-full top-1/2 -translate-y-1/2 mr-2',\n end: 'right-full bottom-0 mr-2',\n },\n right: {\n start: 'left-full top-0 ml-2',\n center: 'left-full top-1/2 -translate-y-1/2 ml-2',\n end: 'left-full bottom-0 ml-2',\n },\n}\n\nexport const Popover: React.FC<PopoverProps> = ({\n children,\n trigger,\n position = 'bottom',\n align = 'center',\n open: controlledOpen,\n onOpenChange,\n closeOnClickOutside = true,\n}) => {\n const [internalOpen, setInternalOpen] = useState(false)\n const isControlled = controlledOpen !== undefined\n const isOpen = isControlled ? controlledOpen : internalOpen\n\n const containerRef = useRef<HTMLDivElement>(null)\n const baseId = useId()\n\n const setIsOpen = useCallback(\n (newOpen: boolean) => {\n if (!isControlled) {\n setInternalOpen(newOpen)\n }\n onOpenChange?.(newOpen)\n },\n [isControlled, onOpenChange]\n )\n\n // Close on outside click\n useEffect(() => {\n if (!isOpen || !closeOnClickOutside) {\n return\n }\n\n const handleClickOutside = (e: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\n setIsOpen(false)\n }\n }\n\n document.addEventListener('mousedown', handleClickOutside)\n return () => document.removeEventListener('mousedown', handleClickOutside)\n }, [isOpen, closeOnClickOutside, setIsOpen])\n\n // Close on escape\n useEffect(() => {\n if (!isOpen) {\n return\n }\n\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n setIsOpen(false)\n }\n }\n\n document.addEventListener('keydown', handleEscape)\n return () => document.removeEventListener('keydown', handleEscape)\n }, [isOpen, setIsOpen])\n\n const handleTriggerClick = () => {\n setIsOpen(!isOpen)\n }\n\n const triggerElement = React.cloneElement(trigger as React.ReactElement<any>, {\n onClick: handleTriggerClick,\n 'aria-haspopup': 'dialog',\n 'aria-expanded': isOpen,\n 'aria-controls': `${baseId}-popover`,\n id: `${baseId}-trigger`,\n })\n\n return (\n <div ref={containerRef} className=\"relative inline-block\">\n {triggerElement}\n {isOpen && (\n <div\n id={`${baseId}-popover`}\n role=\"dialog\"\n aria-labelledby={`${baseId}-trigger`}\n className={cx(\n 'absolute z-50 min-w-48 p-4',\n 'bg-charcoal border border-ash shadow-lg',\n 'animate-fade-in',\n POSITION_CLASSES[position][align]\n )}\n >\n {children}\n </div>\n )}\n </div>\n )\n}\n\nPopover.displayName = 'Popover'\n","import React, {useCallback} from 'react'\nimport {Modal, type ModalProps} from './Modal'\nimport {Button} from './Button'\nimport {cx} from '../utils/cx'\n\n// ConfirmDialog - for confirmation actions\nexport interface ConfirmDialogProps extends Omit<ModalProps, 'children'> {\n description?: React.ReactNode\n confirmText?: string\n cancelText?: string\n onConfirm: () => void | Promise<void>\n onCancel?: () => void\n confirmVariant?: 'primary' | 'important' | 'danger'\n isLoading?: boolean\n}\n\nexport const ConfirmDialog: React.FC<ConfirmDialogProps> = ({\n title = 'Confirm',\n description,\n confirmText = 'Confirm',\n cancelText = 'Cancel',\n onConfirm,\n onCancel,\n onClose,\n confirmVariant = 'important',\n isLoading = false,\n ...props\n}) => {\n const handleCancel = useCallback(() => {\n onCancel?.()\n onClose()\n }, [onCancel, onClose])\n\n const handleConfirm = useCallback(async () => {\n await onConfirm()\n onClose()\n }, [onConfirm, onClose])\n\n return (\n <Modal title={title} onClose={onClose} {...props}>\n {description && (\n <p className=\"text-sm text-silver mb-6\">{description}</p>\n )}\n <div className=\"flex justify-end gap-3\">\n <Button variant=\"outlined\" onClick={handleCancel} disabled={isLoading}>\n {cancelText}\n </Button>\n <Button\n variant={confirmVariant}\n onClick={handleConfirm}\n loading={isLoading}\n >\n {confirmText}\n </Button>\n </div>\n </Modal>\n )\n}\n\nConfirmDialog.displayName = 'ConfirmDialog'\n\n// AlertDialog - for important alerts\nexport interface AlertDialogProps extends Omit<ModalProps, 'children'> {\n description?: React.ReactNode\n acknowledgeText?: string\n variant?: 'default' | 'warning' | 'error'\n}\n\nexport const AlertDialog: React.FC<AlertDialogProps> = ({\n title = 'Alert',\n description,\n acknowledgeText = 'OK',\n variant = 'default',\n onClose,\n ...props\n}) => {\n const titleClass = cx(\n variant === 'warning' && 'text-warning',\n variant === 'error' && 'text-error'\n )\n\n return (\n <Modal onClose={onClose} {...props}>\n <h3 className={cx('text-xl font-semibold mb-2', titleClass)}>{title}</h3>\n {description && (\n <p className=\"text-sm text-silver mb-6\">{description}</p>\n )}\n <div className=\"flex justify-end\">\n <Button variant=\"primary\" onClick={onClose}>\n {acknowledgeText}\n </Button>\n </div>\n </Modal>\n )\n}\n\nAlertDialog.displayName = 'AlertDialog'\n\n// PromptDialog - for user input\nexport interface PromptDialogProps extends Omit<ModalProps, 'children'> {\n description?: React.ReactNode\n placeholder?: string\n defaultValue?: string\n submitText?: string\n cancelText?: string\n onSubmit: (value: string) => void | Promise<void>\n onCancel?: () => void\n isLoading?: boolean\n}\n\nexport const PromptDialog: React.FC<PromptDialogProps> = ({\n title = 'Enter Value',\n description,\n placeholder,\n defaultValue = '',\n submitText = 'Submit',\n cancelText = 'Cancel',\n onSubmit,\n onCancel,\n onClose,\n isLoading = false,\n ...props\n}) => {\n const [value, setValue] = React.useState(defaultValue)\n\n const handleCancel = useCallback(() => {\n onCancel?.()\n onClose()\n }, [onCancel, onClose])\n\n const handleSubmit = useCallback(\n async (e: React.FormEvent) => {\n e.preventDefault()\n await onSubmit(value)\n onClose()\n },\n [onSubmit, value, onClose]\n )\n\n return (\n <Modal title={title} onClose={onClose} {...props}>\n <form onSubmit={handleSubmit}>\n {description && (\n <p className=\"text-sm text-silver mb-4\">{description}</p>\n )}\n <input\n type=\"text\"\n value={value}\n onChange={(e) => setValue(e.target.value)}\n placeholder={placeholder}\n className={cx(\n 'w-full px-3 py-2 bg-graphite border border-ash',\n 'text-white placeholder:text-zinc',\n 'focus:border-gold focus:ring-1 focus:ring-gold focus:outline-none',\n 'mb-6'\n )}\n autoFocus\n />\n <div className=\"flex justify-end gap-3\">\n <Button\n type=\"button\"\n variant=\"outlined\"\n onClick={handleCancel}\n disabled={isLoading}\n >\n {cancelText}\n </Button>\n <Button type=\"submit\" variant=\"important\" loading={isLoading}>\n {submitText}\n </Button>\n </div>\n </form>\n </Modal>\n )\n}\n\nPromptDialog.displayName = 'PromptDialog'\n","import React, {createContext, useCallback, useContext, useId, useState} from 'react'\nimport {cx} from '../utils/cx'\n\n// Context for managing tab state\ninterface TabsContextValue {\n activeTab: string\n setActiveTab: (id: string) => void\n baseId: string\n}\n\nconst TabsContext = createContext<TabsContextValue | null>(null)\n\nfunction useTabsContext() {\n const context = useContext(TabsContext)\n if (!context) {\n throw new Error('Tabs components must be used within a Tabs provider')\n }\n return context\n}\n\n// Main Tabs container\nexport interface TabsProps extends React.HTMLAttributes<HTMLDivElement> {\n /** The id of the initially active tab */\n defaultValue?: string\n /** Controlled active tab value */\n value?: string\n /** Callback when active tab changes */\n onValueChange?: (value: string) => void\n}\n\nexport const Tabs = React.forwardRef<HTMLDivElement, TabsProps>(\n ({defaultValue, value, onValueChange, children, className, ...props}, ref) => {\n const [internalValue, setInternalValue] = useState(defaultValue ?? '')\n const isControlled = value !== undefined\n const activeTab = isControlled ? value : internalValue\n const baseId = useId()\n\n const setActiveTab = useCallback(\n (id: string) => {\n if (!isControlled) {\n setInternalValue(id)\n }\n onValueChange?.(id)\n },\n [isControlled, onValueChange]\n )\n\n return (\n <TabsContext.Provider value={{activeTab, setActiveTab, baseId}}>\n <div ref={ref} className={cx('w-full', className)} {...props}>\n {children}\n </div>\n </TabsContext.Provider>\n )\n }\n)\n\nTabs.displayName = 'Tabs'\n\n// TabList - container for Tab buttons\nexport interface TabListProps extends React.HTMLAttributes<HTMLDivElement> {\n}\n\nexport const TabList = React.forwardRef<HTMLDivElement, TabListProps>(\n ({children, className, ...props}, ref) => {\n return (\n <div\n ref={ref}\n role=\"tablist\"\n className={cx(\n 'flex border-b border-ash',\n className\n )}\n {...props}\n >\n {children}\n </div>\n )\n }\n)\n\nTabList.displayName = 'TabList'\n\n// Tab - individual tab button\nexport interface TabProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n /** Unique identifier for this tab */\n value: string\n}\n\nexport const Tab = React.forwardRef<HTMLButtonElement, TabProps>(\n ({value, children, className, disabled, ...props}, ref) => {\n const {activeTab, setActiveTab, baseId} = useTabsContext()\n const isActive = activeTab === value\n const panelId = `${baseId}-panel-${value}`\n const tabId = `${baseId}-tab-${value}`\n\n return (\n <button\n ref={ref}\n id={tabId}\n type=\"button\"\n role=\"tab\"\n aria-selected={isActive}\n aria-controls={panelId}\n tabIndex={isActive ? 0 : -1}\n disabled={disabled}\n onClick={() => setActiveTab(value)}\n className={cx(\n 'px-4 py-2 text-sm font-medium transition-all duration-fast',\n 'border-b-2 -mb-px',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-gold focus-visible:ring-inset',\n isActive\n ? 'border-gold text-gold'\n : 'border-transparent text-silver hover:text-white hover:border-ash',\n disabled && 'opacity-50 cursor-not-allowed',\n className\n )}\n {...props}\n >\n {children}\n </button>\n )\n }\n)\n\nTab.displayName = 'Tab'\n\n// TabPanel - content panel for a tab\nexport interface TabPanelProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Value matching the corresponding Tab */\n value: string\n /** Force the panel to stay mounted when inactive */\n forceMount?: boolean\n}\n\nexport const TabPanel = React.forwardRef<HTMLDivElement, TabPanelProps>(\n ({value, forceMount = false, children, className, ...props}, ref) => {\n const {activeTab, baseId} = useTabsContext()\n const isActive = activeTab === value\n const panelId = `${baseId}-panel-${value}`\n const tabId = `${baseId}-tab-${value}`\n\n if (!isActive && !forceMount) {\n return null\n }\n\n return (\n <div\n ref={ref}\n id={panelId}\n role=\"tabpanel\"\n aria-labelledby={tabId}\n tabIndex={0}\n hidden={!isActive}\n className={cx(\n 'pt-4 focus-visible:outline-none',\n !isActive && 'hidden',\n className\n )}\n {...props}\n >\n {children}\n </div>\n )\n }\n)\n\nTabPanel.displayName = 'TabPanel'\n","import React, {createContext, useCallback, useContext, useId, useState} from 'react'\nimport {ChevronDown} from 'lucide-react'\nimport {cx} from '../utils/cx'\n\n// Context for managing accordion state\ninterface AccordionContextValue {\n expandedItems: Set<string>\n toggleItem: (id: string) => void\n type: 'single' | 'multiple'\n}\n\nconst AccordionContext = createContext<AccordionContextValue | null>(null)\n\nfunction useAccordionContext() {\n const context = useContext(AccordionContext)\n if (!context) {\n throw new Error('Accordion components must be used within an Accordion provider')\n }\n return context\n}\n\n// Main Accordion container\nexport interface AccordionProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Allow multiple items to be open at once */\n type?: 'single' | 'multiple'\n /** Default expanded item(s) */\n defaultValue?: string | string[]\n /** Controlled expanded item(s) */\n value?: string | string[]\n /** Callback when expanded items change */\n onValueChange?: (value: string | string[]) => void\n}\n\nexport const Accordion = React.forwardRef<HTMLDivElement, AccordionProps>(\n (\n {type = 'single', defaultValue, value, onValueChange, children, className, ...props},\n ref\n ) => {\n const [internalValue, setInternalValue] = useState<Set<string>>(() => {\n if (defaultValue) {\n return new Set(Array.isArray(defaultValue) ? defaultValue : [defaultValue])\n }\n return new Set()\n })\n\n const isControlled = value !== undefined\n const expandedItems = isControlled\n ? new Set(Array.isArray(value) ? value : [value])\n : internalValue\n\n const toggleItem = useCallback(\n (id: string) => {\n const newSet = new Set(expandedItems)\n\n if (newSet.has(id)) {\n newSet.delete(id)\n } else {\n if (type === 'single') {\n newSet.clear()\n }\n newSet.add(id)\n }\n\n if (!isControlled) {\n setInternalValue(newSet)\n }\n\n const newValue = Array.from(newSet)\n onValueChange?.(type === 'single' ? newValue[0] ?? '' : newValue)\n },\n [expandedItems, type, isControlled, onValueChange]\n )\n\n return (\n <AccordionContext.Provider value={{expandedItems, toggleItem, type}}>\n <div\n ref={ref}\n className={cx('divide-y divide-ash border border-ash', className)}\n {...props}\n >\n {children}\n </div>\n </AccordionContext.Provider>\n )\n }\n)\n\nAccordion.displayName = 'Accordion'\n\n// AccordionItem - individual accordion section\nexport interface AccordionItemProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Unique identifier for this item */\n value: string\n /** Disable this item */\n disabled?: boolean\n}\n\nconst AccordionItemContext = createContext<{ value: string; disabled: boolean } | null>(null)\n\nexport const AccordionItem = React.forwardRef<HTMLDivElement, AccordionItemProps>(\n ({value, disabled = false, children, className, ...props}, ref) => {\n return (\n <AccordionItemContext.Provider value={{value, disabled}}>\n <div\n ref={ref}\n data-state={useAccordionContext().expandedItems.has(value) ? 'open' : 'closed'}\n className={cx('bg-charcoal', className)}\n {...props}\n >\n {children}\n </div>\n </AccordionItemContext.Provider>\n )\n }\n)\n\nAccordionItem.displayName = 'AccordionItem'\n\n// AccordionTrigger - clickable header\nexport interface AccordionTriggerProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n}\n\nexport const AccordionTrigger = React.forwardRef<HTMLButtonElement, AccordionTriggerProps>(\n ({children, className, ...props}, ref) => {\n const {expandedItems, toggleItem} = useAccordionContext()\n const itemContext = useContext(AccordionItemContext)\n const baseId = useId()\n\n if (!itemContext) {\n throw new Error('AccordionTrigger must be used within an AccordionItem')\n }\n\n const {value, disabled} = itemContext\n const isExpanded = expandedItems.has(value)\n\n return (\n <h3 className=\"m-0\">\n <button\n ref={ref}\n type=\"button\"\n id={`${baseId}-trigger-${value}`}\n aria-expanded={isExpanded}\n aria-controls={`${baseId}-content-${value}`}\n disabled={disabled}\n onClick={() => toggleItem(value)}\n className={cx(\n 'flex w-full items-center justify-between px-4 py-3',\n 'text-left text-sm font-medium text-white',\n 'transition-colors duration-fast',\n 'hover:bg-graphite',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-gold focus-visible:ring-inset',\n disabled && 'opacity-50 cursor-not-allowed',\n className\n )}\n {...props}\n >\n <span>{children}</span>\n <ChevronDown\n className={cx(\n 'h-4 w-4 text-silver transition-transform duration-200',\n isExpanded && 'rotate-180'\n )}\n />\n </button>\n </h3>\n )\n }\n)\n\nAccordionTrigger.displayName = 'AccordionTrigger'\n\n// AccordionContent - expandable content\nexport interface AccordionContentProps extends React.HTMLAttributes<HTMLDivElement> {\n}\n\nexport const AccordionContent = React.forwardRef<HTMLDivElement, AccordionContentProps>(\n ({children, className, ...props}, ref) => {\n const {expandedItems} = useAccordionContext()\n const itemContext = useContext(AccordionItemContext)\n const baseId = useId()\n\n if (!itemContext) {\n throw new Error('AccordionContent must be used within an AccordionItem')\n }\n\n const {value} = itemContext\n const isExpanded = expandedItems.has(value)\n\n return (\n <div\n ref={ref}\n id={`${baseId}-content-${value}`}\n role=\"region\"\n aria-labelledby={`${baseId}-trigger-${value}`}\n hidden={!isExpanded}\n className={cx(\n 'overflow-hidden transition-all duration-200',\n isExpanded ? 'animate-fade-in' : 'hidden',\n className\n )}\n {...props}\n >\n <div className=\"px-4 pb-4 text-sm text-silver\">{children}</div>\n </div>\n )\n }\n)\n\nAccordionContent.displayName = 'AccordionContent'\n","import React, {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useId,\n useRef,\n useState,\n} from 'react'\nimport {cx} from '../utils/cx'\n\n// Context for managing menu state\ninterface MenuContextValue {\n isOpen: boolean\n setIsOpen: (open: boolean) => void\n triggerId: string\n menuId: string\n}\n\nconst MenuContext = createContext<MenuContextValue | null>(null)\n\nfunction useMenuContext() {\n const context = useContext(MenuContext)\n if (!context) {\n throw new Error('Menu components must be used within a Menu provider')\n }\n return context\n}\n\n// Main Menu container\nexport interface MenuProps {\n children: React.ReactNode\n open?: boolean\n onOpenChange?: (open: boolean) => void\n}\n\nexport const Menu: React.FC<MenuProps> = ({children, open, onOpenChange}) => {\n const [internalOpen, setInternalOpen] = useState(false)\n const isControlled = open !== undefined\n const isOpen = isControlled ? open : internalOpen\n const baseId = useId()\n\n const setIsOpen = useCallback(\n (newOpen: boolean) => {\n if (!isControlled) {\n setInternalOpen(newOpen)\n }\n onOpenChange?.(newOpen)\n },\n [isControlled, onOpenChange]\n )\n\n return (\n <MenuContext.Provider\n value={{\n isOpen,\n setIsOpen,\n triggerId: `${baseId}-trigger`,\n menuId: `${baseId}-menu`,\n }}\n >\n <div className=\"relative inline-block\">{children}</div>\n </MenuContext.Provider>\n )\n}\n\nMenu.displayName = 'Menu'\n\n// MenuTrigger - button that opens the menu\nexport interface MenuTriggerProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n asChild?: boolean\n}\n\nexport const MenuTrigger = React.forwardRef<HTMLButtonElement, MenuTriggerProps>(\n ({children, className, asChild, ...props}, ref) => {\n const {isOpen, setIsOpen, triggerId, menuId} = useMenuContext()\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n e.preventDefault()\n setIsOpen(!isOpen)\n props.onClick?.(e)\n }\n\n return (\n <button\n ref={ref}\n id={triggerId}\n type=\"button\"\n aria-haspopup=\"menu\"\n aria-expanded={isOpen}\n aria-controls={menuId}\n onClick={handleClick}\n className={cx(\n 'inline-flex items-center justify-center',\n className\n )}\n {...props}\n >\n {children}\n </button>\n )\n }\n)\n\nMenuTrigger.displayName = 'MenuTrigger'\n\n// MenuContent - the dropdown menu\nexport interface MenuContentProps extends React.HTMLAttributes<HTMLDivElement> {\n align?: 'start' | 'center' | 'end'\n side?: 'top' | 'bottom'\n}\n\nexport const MenuContent = React.forwardRef<HTMLDivElement, MenuContentProps>(\n ({children, className, align = 'start', side = 'bottom', ...props}, ref) => {\n const {isOpen, setIsOpen, triggerId, menuId} = useMenuContext()\n const menuRef = useRef<HTMLDivElement>(null)\n\n // Close on outside click\n useEffect(() => {\n if (!isOpen) {\n return\n }\n\n const handleClickOutside = (e: MouseEvent) => {\n const trigger = document.getElementById(triggerId)\n if (\n menuRef.current &&\n !menuRef.current.contains(e.target as Node) &&\n trigger &&\n !trigger.contains(e.target as Node)\n ) {\n setIsOpen(false)\n }\n }\n\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n setIsOpen(false)\n }\n }\n\n document.addEventListener('mousedown', handleClickOutside)\n document.addEventListener('keydown', handleEscape)\n\n return () => {\n document.removeEventListener('mousedown', handleClickOutside)\n document.removeEventListener('keydown', handleEscape)\n }\n }, [isOpen, setIsOpen, triggerId])\n\n if (!isOpen) {\n return null\n }\n\n const alignmentClasses = {\n start: 'left-0',\n center: 'left-1/2 -translate-x-1/2',\n end: 'right-0',\n }\n\n const sideClasses = {\n top: 'bottom-full mb-1',\n bottom: 'top-full mt-1',\n }\n\n return (\n <div\n ref={(node) => {\n menuRef.current = node\n if (typeof ref === 'function') {\n ref(node)\n } else if (ref) {\n ref.current = node\n }\n }}\n id={menuId}\n role=\"menu\"\n aria-labelledby={triggerId}\n className={cx(\n 'absolute z-50 min-w-40 py-1',\n 'bg-charcoal border border-ash shadow-lg',\n 'animate-fade-in',\n alignmentClasses[align],\n sideClasses[side],\n className\n )}\n {...props}\n >\n {children}\n </div>\n )\n }\n)\n\nMenuContent.displayName = 'MenuContent'\n\n// MenuItem - individual menu option\nexport interface MenuItemProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n icon?: React.ReactNode\n destructive?: boolean\n}\n\nexport const MenuItem = React.forwardRef<HTMLButtonElement, MenuItemProps>(\n ({children, className, icon, destructive, disabled, onClick, ...props}, ref) => {\n const {setIsOpen} = useMenuContext()\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n if (disabled) {\n return\n }\n onClick?.(e)\n setIsOpen(false)\n }\n\n return (\n <button\n ref={ref}\n type=\"button\"\n role=\"menuitem\"\n disabled={disabled}\n onClick={handleClick}\n className={cx(\n 'flex w-full items-center gap-2 px-3 py-2 text-sm text-left',\n 'transition-colors duration-fast',\n destructive\n ? 'text-error hover:bg-error/10'\n : 'text-white hover:bg-graphite',\n 'focus-visible:outline-none focus-visible:bg-graphite',\n disabled && 'opacity-50 cursor-not-allowed',\n className\n )}\n {...props}\n >\n {icon && <span className=\"w-4 h-4 shrink-0\">{icon}</span>}\n {children}\n </button>\n )\n }\n)\n\nMenuItem.displayName = 'MenuItem'\n\n// MenuSeparator - divider between menu items\nexport const MenuSeparator = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({className, ...props}, ref) => (\n <div\n ref={ref}\n role=\"separator\"\n className={cx('my-1 h-px bg-ash', className)}\n {...props}\n />\n))\n\nMenuSeparator.displayName = 'MenuSeparator'\n\n// MenuLabel - non-interactive label\nexport const MenuLabel = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({className, children, ...props}, ref) => (\n <div\n ref={ref}\n className={cx('px-3 py-1.5 text-xs font-medium text-silver', className)}\n {...props}\n >\n {children}\n </div>\n))\n\nMenuLabel.displayName = 'MenuLabel'\n","import React from 'react'\nimport {cx} from '../utils/cx'\n\n// Main Navbar container\nexport interface NavbarProps extends React.HTMLAttributes<HTMLElement> {\n fixed?: boolean\n bordered?: boolean\n}\n\nexport const Navbar = React.forwardRef<HTMLElement, NavbarProps>(\n ({fixed = false, bordered = true, className, children, ...props}, ref) => {\n return (\n <nav\n ref={ref}\n className={cx(\n 'w-full bg-charcoal px-4 py-3',\n bordered && 'border-b border-ash',\n fixed && 'fixed top-0 left-0 right-0 z-40',\n className\n )}\n {...props}\n >\n <div className=\"flex items-center justify-between\">{children}</div>\n </nav>\n )\n }\n)\n\nNavbar.displayName = 'Navbar'\n\n// NavbarBrand - logo/brand section\nexport interface NavbarBrandProps extends React.HTMLAttributes<HTMLDivElement> {\n}\n\nexport const NavbarBrand = React.forwardRef<HTMLDivElement, NavbarBrandProps>(\n ({className, children, ...props}, ref) => {\n return (\n <div\n ref={ref}\n className={cx('flex items-center gap-2', className)}\n {...props}\n >\n {children}\n </div>\n )\n }\n)\n\nNavbarBrand.displayName = 'NavbarBrand'\n\n// NavbarContent - center or end content area\nexport interface NavbarContentProps extends React.HTMLAttributes<HTMLDivElement> {\n position?: 'start' | 'center' | 'end'\n}\n\nexport const NavbarContent = React.forwardRef<HTMLDivElement, NavbarContentProps>(\n ({position = 'center', className, children, ...props}, ref) => {\n const positionClasses = {\n start: 'mr-auto',\n center: 'mx-auto',\n end: 'ml-auto',\n }\n\n return (\n <div\n ref={ref}\n className={cx(\n 'flex items-center gap-4',\n positionClasses[position],\n className\n )}\n {...props}\n >\n {children}\n </div>\n )\n }\n)\n\nNavbarContent.displayName = 'NavbarContent'\n\n// NavbarItem - individual navigation item\nexport interface NavbarItemProps extends React.HTMLAttributes<HTMLDivElement> {\n active?: boolean\n}\n\nexport const NavbarItem = React.forwardRef<HTMLDivElement, NavbarItemProps>(\n ({active = false, className, children, ...props}, ref) => {\n return (\n <div\n ref={ref}\n className={cx(\n 'flex items-center',\n className\n )}\n {...props}\n >\n {children}\n </div>\n )\n }\n)\n\nNavbarItem.displayName = 'NavbarItem'\n\n// NavbarLink - navigation link\nexport interface NavbarLinkProps extends React.AnchorHTMLAttributes<HTMLAnchorElement> {\n active?: boolean\n}\n\nexport const NavbarLink = React.forwardRef<HTMLAnchorElement, NavbarLinkProps>(\n ({active = false, className, children, ...props}, ref) => {\n return (\n <a\n ref={ref}\n className={cx(\n 'text-sm font-medium transition-colors duration-fast',\n active ? 'text-gold' : 'text-silver hover:text-white',\n className\n )}\n {...props}\n >\n {children}\n </a>\n )\n }\n)\n\nNavbarLink.displayName = 'NavbarLink'\n\n// NavbarDivider - vertical separator\nexport const NavbarDivider = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({className, ...props}, ref) => (\n <div\n ref={ref}\n className={cx('h-6 w-px bg-ash mx-2', className)}\n {...props}\n />\n))\n\nNavbarDivider.displayName = 'NavbarDivider'\n","import React from 'react'\nimport {ChevronRight} from 'lucide-react'\nimport {cx} from '../utils'\n\n// Breadcrumb container\nexport interface BreadcrumbProps extends React.HTMLAttributes<HTMLElement> {\n separator?: React.ReactNode\n}\n\nexport const Breadcrumb = React.forwardRef<HTMLElement, BreadcrumbProps>(\n ({separator, className, children, ...props}, ref) => {\n const items = React.Children.toArray(children)\n const defaultSeparator = <ChevronRight className=\"h-4 w-4 text-ash\"/>\n\n return (\n <nav ref={ref} aria-label=\"Breadcrumb\" className={className} {...props}>\n <ol className=\"flex items-center gap-2\">\n {items.map((child, index) => (\n <li key={index} className=\"flex items-center gap-2\">\n {child}\n {index < items.length - 1 && (\n <span aria-hidden=\"true\">{separator ?? defaultSeparator}</span>\n )}\n </li>\n ))}\n </ol>\n </nav>\n )\n }\n)\n\nBreadcrumb.displayName = 'Breadcrumb'\n\n// BreadcrumbItem - individual breadcrumb item\nexport interface BreadcrumbItemProps extends React.HTMLAttributes<HTMLSpanElement> {\n current?: boolean\n}\n\nexport const BreadcrumbItem = React.forwardRef<HTMLSpanElement, BreadcrumbItemProps>(\n ({current = false, className, children, ...props}, ref) => {\n return (\n <span\n ref={ref}\n aria-current={current ? 'page' : undefined}\n className={cx(\n 'text-sm',\n current ? 'text-white font-medium' : 'text-silver',\n className\n )}\n {...props}\n >\n {children}\n </span>\n )\n }\n)\n\nBreadcrumbItem.displayName = 'BreadcrumbItem'\n\n// BreadcrumbLink - clickable breadcrumb link\nexport interface BreadcrumbLinkProps extends React.AnchorHTMLAttributes<HTMLAnchorElement> {\n}\n\nexport const BreadcrumbLink = React.forwardRef<HTMLAnchorElement, BreadcrumbLinkProps>(\n ({className, children, ...props}, ref) => {\n return (\n <a\n ref={ref}\n className={cx(\n 'text-sm text-silver hover:text-gold transition-colors duration-fast',\n className\n )}\n {...props}\n >\n {children}\n </a>\n )\n }\n)\n\nBreadcrumbLink.displayName = 'BreadcrumbLink'\n","import React from 'react'\nimport {ChevronLeft, ChevronRight, MoreHorizontal} from 'lucide-react'\nimport {cx} from '../utils/cx'\n\nexport interface PaginationProps extends React.HTMLAttributes<HTMLElement> {\n page: number\n totalPages: number\n onPageChange: (page: number) => void\n siblingCount?: number\n showEdges?: boolean\n}\n\nfunction generatePagination(\n currentPage: number,\n totalPages: number,\n siblingCount: number\n): (number | 'ellipsis')[] {\n const totalSlots = siblingCount * 2 + 5 // siblings + current + 2 edges + 2 ellipses max\n\n if (totalPages <= totalSlots) {\n return Array.from({length: totalPages}, (_, i) => i + 1)\n }\n\n const leftSiblingIndex = Math.max(currentPage - siblingCount, 1)\n const rightSiblingIndex = Math.min(currentPage + siblingCount, totalPages)\n\n const showLeftEllipsis = leftSiblingIndex > 2\n const showRightEllipsis = rightSiblingIndex < totalPages - 1\n\n if (!showLeftEllipsis && showRightEllipsis) {\n const leftItemCount = 3 + 2 * siblingCount\n const leftRange = Array.from({length: leftItemCount}, (_, i) => i + 1)\n return [...leftRange, 'ellipsis', totalPages]\n }\n\n if (showLeftEllipsis && !showRightEllipsis) {\n const rightItemCount = 3 + 2 * siblingCount\n const rightRange = Array.from(\n {length: rightItemCount},\n (_, i) => totalPages - rightItemCount + i + 1\n )\n return [1, 'ellipsis', ...rightRange]\n }\n\n const middleRange = Array.from(\n {length: rightSiblingIndex - leftSiblingIndex + 1},\n (_, i) => leftSiblingIndex + i\n )\n return [1, 'ellipsis', ...middleRange, 'ellipsis', totalPages]\n}\n\nexport const Pagination = React.forwardRef<HTMLElement, PaginationProps>(\n (\n {\n page,\n totalPages,\n onPageChange,\n siblingCount = 1,\n showEdges = true,\n className,\n ...props\n },\n ref\n ) => {\n const pages = generatePagination(page, totalPages, siblingCount)\n\n const buttonBaseClass =\n 'flex items-center justify-center h-8 min-w-8 px-2 text-sm ' +\n 'border border-ash transition-colors duration-fast ' +\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-gold'\n\n return (\n <nav\n ref={ref}\n role=\"navigation\"\n aria-label=\"Pagination\"\n className={cx('flex items-center gap-1', className)}\n {...props}\n >\n {/* Previous button */}\n <button\n type=\"button\"\n onClick={() => onPageChange(page - 1)}\n disabled={page <= 1}\n aria-label=\"Go to previous page\"\n className={cx(\n buttonBaseClass,\n 'text-silver hover:text-white hover:border-gold',\n page <= 1 && 'opacity-50 cursor-not-allowed hover:border-ash'\n )}\n >\n <ChevronLeft className=\"h-4 w-4\"/>\n </button>\n\n {/* Page numbers */}\n {pages.map((pageNum, index) =>\n pageNum === 'ellipsis' ? (\n <span\n key={`ellipsis-${index}`}\n className=\"flex items-center justify-center h-8 w-8 text-silver\"\n >\n <MoreHorizontal className=\"h-4 w-4\"/>\n </span>\n ) : (\n <button\n key={pageNum}\n type=\"button\"\n onClick={() => onPageChange(pageNum)}\n aria-label={`Go to page ${pageNum}`}\n aria-current={page === pageNum ? 'page' : undefined}\n className={cx(\n buttonBaseClass,\n page === pageNum\n ? 'bg-gold text-obsidian border-gold font-medium'\n : 'text-silver hover:text-white hover:border-gold'\n )}\n >\n {pageNum}\n </button>\n )\n )}\n\n {/* Next button */}\n <button\n type=\"button\"\n onClick={() => onPageChange(page + 1)}\n disabled={page >= totalPages}\n aria-label=\"Go to next page\"\n className={cx(\n buttonBaseClass,\n 'text-silver hover:text-white hover:border-gold',\n page >= totalPages && 'opacity-50 cursor-not-allowed hover:border-ash'\n )}\n >\n <ChevronRight className=\"h-4 w-4\"/>\n </button>\n </nav>\n )\n }\n)\n\nPagination.displayName = 'Pagination'\n","import React from 'react'\nimport {Check} from 'lucide-react'\nimport {cx} from '../utils/cx'\n\nexport type StepStatus = 'complete' | 'error'\n\nexport interface Step {\n id: string | number\n label: string\n}\n\nexport interface StepperProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Array of steps. Each requires: id (string | number), label (string). */\n steps: Step[]\n /** ID of the current step (must match a step.id from the steps array). */\n currentStep: string | number\n status?: StepStatus\n}\n\nexport const Stepper = React.forwardRef<HTMLDivElement, StepperProps>(\n ({steps, currentStep, status, className, ...rest}, ref) => {\n const currentIndex = steps.findIndex(step => step.id === currentStep)\n\n const getStepState = (index: number) => {\n if (index < currentIndex) {\n return 'complete'\n }\n if (index === currentIndex) {\n return status || 'current'\n }\n return 'future'\n }\n\n return (\n <div\n ref={ref}\n className={cx('flex items-center w-full', className)}\n {...rest}\n >\n {steps.map((step, index) => {\n const state = getStepState(index)\n const isLast = index === steps.length - 1\n\n return (\n <React.Fragment key={step.id}>\n <div className=\"flex flex-col items-center\">\n <div\n className={cx(\n 'flex items-center justify-center w-10 h-10 rounded-full border-2 font-semibold text-sm transition-all duration-200',\n state === 'complete' && 'bg-gold border-gold text-obsidian',\n state === 'current' && 'bg-charcoal border-gold text-gold',\n state === 'error' && 'bg-error border-error text-white',\n state === 'future' && 'bg-charcoal border-ash text-silver'\n )}\n >\n {state === 'complete' ? (\n <Check className=\"h-5 w-5\"/>\n ) : (\n <span>{index + 1}</span>\n )}\n </div>\n <span\n className={cx(\n 'mt-2 text-xs font-medium',\n state === 'complete' && 'text-gold',\n state === 'current' && 'text-white',\n state === 'error' && 'text-error',\n state === 'future' && 'text-silver'\n )}\n >\n {step.label}\n </span>\n </div>\n {!isLast && (\n <div\n className={cx(\n 'flex-1 h-0.5 mx-4 transition-all duration-200',\n index < currentIndex ? 'bg-gold' : 'bg-ash'\n )}\n />\n )}\n </React.Fragment>\n )\n })}\n </div>\n )\n }\n)\n\nStepper.displayName = 'Stepper'\n\nexport default Stepper\n","import React from 'react'\nimport type {IconProps} from './index'\n\nexport function ChevronLeftIcon({className, ...props}: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n className={className}\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n d=\"M12.79 5.23a.75.75 0 01-.02 1.06L8.832 10l3.938 3.71a.75.75 0 11-1.04 1.08l-4.5-4.25a.75.75 0 010-1.08l4.5-4.25a.75.75 0 011.06.02z\"\n clipRule=\"evenodd\"\n />\n </svg>\n )\n}\n","import React from 'react'\nimport type {IconProps} from './index'\n\nexport function ChevronRightIcon({className, ...props}: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n className={className}\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n d=\"M7.21 14.77a.75.75 0 01.02-1.06L11.168 10 7.23 6.29a.75.75 0 111.04-1.08l4.5 4.25a.75.75 0 010 1.08l-4.5 4.25a.75.75 0 01-1.06-.02z\"\n clipRule=\"evenodd\"\n />\n </svg>\n )\n}\n","import React from 'react'\nimport type {IconProps} from './index'\n\nexport function CloseIcon({className, ...props}: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n className={className}\n {...props}\n >\n <path\n d=\"M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 0 00-1.06-1.06L10 8.94 6.28 5.22z\"\n />\n </svg>\n )\n}\n","import React from 'react'\nimport type {IconProps} from './index'\n\nexport function ExpandIcon({className, ...props}: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n className={className}\n {...props}\n >\n <path\n d=\"M13.28 7.78l3.22-3.22v2.69a.75.75 0 001.5 0v-4.5a.75.75 0 00-.75-.75h-4.5a.75.75 0 000 1.5h2.69l-3.22 3.22a.75.75 0 001.06 1.06zM2 17.25v-4.5a.75.75 0 011.5 0v2.69l3.22-3.22a.75.75 0 011.06 1.06L4.56 16.5h2.69a.75.75 0 010 1.5h-4.5a.75.75 0 01-.75-.75z\"\n />\n </svg>\n )\n}\n","import React from 'react'\nimport type {IconProps} from './index'\n\nexport function HistoryIcon({className, ...props}: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n className={className}\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n d=\"M10 18a8 8 0 100-16 8 8 0 000 16zm.75-13a.75.75 0 00-1.5 0v5c0 .414.336.75.75.75h4a.75.75 0 000-1.5h-3.25V5z\"\n clipRule=\"evenodd\"\n />\n </svg>\n )\n}\n","import React from 'react'\nimport type {IconProps} from './index'\n\nexport function LayersIcon({className, ...props}: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n className={className}\n {...props}\n >\n <path\n d=\"M3.196 12.87l-.825.483a.75.75 0 000 1.294l7.25 4.25a.75.75 0 00.758 0l7.25-4.25a.75.75 0 000-1.294l-.825-.484-5.666 3.322a2.25 2.25 0 01-2.276 0L3.196 12.87z\"\n />\n <path\n d=\"M3.196 8.87l-.825.483a.75.75 0 000 1.294l7.25 4.25a.75.75 0 00.758 0l7.25-4.25a.75.75 0 000-1.294l-.825-.484-5.666 3.322a2.25 2.25 0 01-2.276 0L3.196 8.87z\"\n />\n <path\n d=\"M10.38 1.103a.75.75 0 00-.76 0l-7.25 4.25a.75.75 0 000 1.294l7.25 4.25a.75.75 0 00.76 0l7.25-4.25a.75.75 0 000-1.294l-7.25-4.25z\"\n />\n </svg>\n )\n}\n","import React from 'react'\nimport type {IconProps} from './index'\n\n/**\n * Media icon — a film frame with play triangle, representing video and media artifacts.\n */\nexport function MediaIcon({className, ...props}: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n className={className}\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n d=\"M2 4.5A1.5 1.5 0 013.5 3h13A1.5 1.5 0 0118 4.5v11a1.5 1.5 0 01-1.5 1.5h-13A1.5 1.5 0 012 15.5v-11zM4 5v1h1V5H4zm2 0v1h1V5H6zm7 0v1h1V5h-1zm2 0v1h1V5h-1zM4 14v1h1v-1H4zm2 0v1h1v-1H6zm7 0v1h1v-1h-1zm2 0v1h1v-1h-1zM8 8.118a.5.5 0 01.757-.429l4 2.382a.5.5 0 010 .858l-4 2.382A.5.5 0 018 12.882V8.118z\"\n clipRule=\"evenodd\"\n />\n </svg>\n )\n}\n","import React from 'react'\nimport type {IconProps} from './index'\n\nexport function PlusIcon({className, ...props}: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n className={className}\n {...props}\n >\n <path\n d=\"M10.75 4.75a.75.75 0 00-1.5 0v4.5h-4.5a.75.75 0 000 1.5h4.5v4.5a.75.75 0 001.5 0v-4.5h4.5a.75.75 0 000-1.5h-4.5v-4.5z\"\n />\n </svg>\n )\n}\n","import React from 'react'\nimport {cx} from '../../utils/cx'\nimport type {IconProps} from './index'\n\nexport function CheckSquareIcon({className, ...props}: IconProps) {\n return (\n <div\n className={cx(\n 'relative w-4 h-4 flex-shrink-0 border-2 border-gold bg-gold/10',\n className\n )}\n {...props}\n >\n <svg\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n className=\"absolute inset-0 w-full h-full p-0.5\"\n >\n <path\n d=\"M3 8l3 3 7-7\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"text-gold\"\n />\n </svg>\n </div>\n )\n}\n","import React from 'react'\nimport {cx} from '../../utils/cx'\nimport type {IconProps} from './index'\n\nexport function EmptySquareIcon({className, ...props}: IconProps) {\n return (\n <div\n className={cx(\n 'w-4 h-4 flex-shrink-0 border-2 border-ash/60',\n className\n )}\n {...props}\n />\n )\n}\n","import React from 'react'\nimport {cx} from '../../utils/cx'\nimport type {IconProps} from './index'\n\nexport interface CrossSquareIconProps extends IconProps {\n /**\n * Visual variant for different states\n * - 'cancelled': subtle ash coloring\n * - 'failed': error red coloring\n */\n variant?: 'cancelled' | 'failed'\n}\n\nexport function CrossSquareIcon({className, variant = 'cancelled', ...props}: CrossSquareIconProps) {\n return (\n <div\n className={cx(\n 'relative w-4 h-4 flex-shrink-0 border-2',\n variant === 'failed' ? 'border-error/60 bg-error/5' : 'border-ash/40 bg-ash/5',\n className\n )}\n {...props}\n >\n <svg\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n className=\"absolute inset-0 w-full h-full p-0.5\"\n >\n <path\n d=\"M4 4l8 8M12 4l-8 8\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n className={variant === 'failed' ? 'text-error/60' : 'text-ash/40'}\n />\n </svg>\n </div>\n )\n}\n","import React from 'react'\nimport {cx} from '../../utils/cx'\nimport type {IconProps} from './index'\n\n/**\n * Square loading spinner with \"snake\" animation.\n * A golden stroke travels around a square border.\n */\nexport function SquareLoaderIcon({className, ...props}: IconProps) {\n return (\n <div className={cx('relative w-4 h-4 flex-shrink-0', className)} {...props}>\n <svg\n viewBox=\"0 0 16 16\"\n className=\"w-full h-full animate-snake-spin\"\n >\n {/* Square border path that the snake travels around */}\n <rect\n x=\"1\"\n y=\"1\"\n width=\"14\"\n height=\"14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n className=\"text-ash/40\"\n />\n {/* The \"snake\" - an animated stroke */}\n <rect\n x=\"1\"\n y=\"1\"\n width=\"14\"\n height=\"14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeDasharray=\"14 42\"\n strokeLinecap=\"square\"\n className=\"text-gold animate-snake-travel\"\n />\n </svg>\n </div>\n )\n}\n","import React, {useEffect, useRef, useState} from 'react'\nimport {MarkdownContent} from './MarkdownContent'\nimport {cx} from '../utils/cx'\n\nexport type MessageVariant = 'user' | 'assistant'\n\nexport interface MessageBranchInfo {\n /**\n * Current branch index (1-based)\n */\n current: number\n /**\n * Total number of sibling branches\n */\n total: number\n /**\n * Navigate to previous branch\n */\n onPrevious?: () => void\n /**\n * Navigate to next branch\n */\n onNext?: () => void\n}\n\nexport interface MessageActionsConfig {\n /**\n * Called when user edits a user message (creates a branch)\n */\n onEdit?: (newContent: string) => void\n /**\n * Called when user retries an assistant message (creates a branch)\n */\n onRetry?: () => void\n /**\n * Whether to show the copy button\n * @default true\n */\n showCopy?: boolean\n}\n\nexport interface MessageProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Whether the message is from the user or the assistant\n */\n variant?: MessageVariant\n /**\n * The message content (supports Markdown)\n */\n content: string\n /**\n * Whether the message is currently being streamed (shows cursor)\n */\n isStreaming?: boolean\n /**\n * Branch navigation info (shows branch indicator if provided and total > 1)\n */\n branchInfo?: MessageBranchInfo\n /**\n * Actions configuration (shows action bar if provided)\n */\n actions?: MessageActionsConfig\n /**\n * Whether to hide actions (e.g., during streaming)\n */\n hideActions?: boolean\n}\n\nconst variantStyles: Record<MessageVariant, string> = {\n user: 'bg-gold text-obsidian ml-auto',\n assistant: 'bg-charcoal border border-ash text-white mr-auto',\n}\n\n// Inline action button component\nconst ActionButton: React.FC<{\n onClick: () => void\n label: string\n children: React.ReactNode\n className?: string\n disabled?: boolean\n}> = ({onClick, label, children, className, disabled}) => (\n <button\n type=\"button\"\n onClick={onClick}\n disabled={disabled}\n className={cx(\n 'p-1.5 text-silver/60 hover:text-silver transition-colors duration-150',\n 'hover:bg-white/5',\n 'disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:bg-transparent',\n className\n )}\n aria-label={label}\n >\n {children}\n </button>\n)\n\n// Simple inline icons to avoid importing full icon library\nconst CopyIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className=\"w-3.5 h-3.5\">\n <rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/>\n <path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/>\n </svg>\n)\n\nconst CheckIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"\n className=\"w-3.5 h-3.5 text-success\">\n <polyline points=\"20 6 9 17 4 12\"/>\n </svg>\n)\n\nconst PencilIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className=\"w-3.5 h-3.5\">\n <path d=\"M17 3a2.85 2.83 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5Z\"/>\n <path d=\"m15 5 4 4\"/>\n </svg>\n)\n\nconst RetryIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className=\"w-3.5 h-3.5\">\n <path d=\"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8\"/>\n <path d=\"M21 3v5h-5\"/>\n <path d=\"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16\"/>\n <path d=\"M8 16H3v5\"/>\n </svg>\n)\n\nconst ChevronLeftIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className=\"w-3 h-3\">\n <path d=\"m15 18-6-6 6-6\"/>\n </svg>\n)\n\nconst ChevronRightIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className=\"w-3 h-3\">\n <path d=\"m9 18 6-6-6-6\"/>\n </svg>\n)\n\nconst GitBranchIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"\n className=\"w-3 h-3 mr-0.5 text-silver/50\">\n <line x1=\"6\" x2=\"6\" y1=\"3\" y2=\"15\"/>\n <circle cx=\"18\" cy=\"6\" r=\"3\"/>\n <circle cx=\"6\" cy=\"18\" r=\"3\"/>\n <path d=\"M18 9a9 9 0 0 1-9 9\"/>\n </svg>\n)\n\nconst XIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className=\"w-4 h-4\">\n <path d=\"M18 6 6 18\"/>\n <path d=\"m6 6 12 12\"/>\n </svg>\n)\n\nconst SendIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className=\"w-4 h-4\">\n <path d=\"m22 2-7 20-4-9-9-4Z\"/>\n <path d=\"M22 2 11 13\"/>\n </svg>\n)\n\nexport const Message = React.forwardRef<HTMLDivElement, MessageProps>(\n ({\n variant = 'assistant',\n className,\n content,\n isStreaming,\n branchInfo,\n actions,\n hideActions,\n ...rest\n }, ref) => {\n const isUser = variant === 'user'\n const [copied, setCopied] = useState(false)\n const [isEditing, setIsEditing] = useState(false)\n const [editValue, setEditValue] = useState(content)\n const textareaRef = useRef<HTMLTextAreaElement>(null)\n\n const showBranchNav = branchInfo && branchInfo.total > 1\n const showActions = actions && !hideActions && !isStreaming\n\n // Auto-resize textarea when editing\n useEffect(() => {\n if (isEditing && textareaRef.current) {\n const textarea = textareaRef.current\n textarea.style.height = 'auto'\n textarea.style.height = `${textarea.scrollHeight}px`\n textarea.focus()\n // Move cursor to end\n textarea.setSelectionRange(textarea.value.length, textarea.value.length)\n }\n }, [isEditing])\n\n const handleCopy = async () => {\n try {\n await navigator.clipboard.writeText(content)\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n } catch {\n // Fallback\n const textArea = document.createElement('textarea')\n textArea.value = content\n document.body.appendChild(textArea)\n textArea.select()\n document.execCommand('copy')\n document.body.removeChild(textArea)\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n }\n }\n\n const handleStartEdit = () => {\n setEditValue(content)\n setIsEditing(true)\n }\n\n const handleCancelEdit = () => {\n setIsEditing(false)\n setEditValue(content)\n }\n\n const handleSubmitEdit = () => {\n const trimmed = editValue.trim()\n if (trimmed && trimmed !== content) {\n actions?.onEdit?.(trimmed)\n }\n setIsEditing(false)\n }\n\n const handleEditKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n handleSubmitEdit()\n } else if (e.key === 'Escape') {\n handleCancelEdit()\n }\n }\n\n const handleEditChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n setEditValue(e.target.value)\n // Auto-resize\n const textarea = e.target\n textarea.style.height = 'auto'\n textarea.style.height = `${textarea.scrollHeight}px`\n }\n\n return (\n <div\n ref={ref}\n className={cx(\n 'flex flex-col',\n isUser ? 'items-end' : 'items-start',\n className\n )}\n {...rest}\n >\n {/* Message bubble OR Edit input (replaces message when editing) */}\n {isUser && isEditing ? (\n <div className=\"w-full max-w-11/12\">\n <div className=\"relative bg-gold\">\n <textarea\n ref={textareaRef}\n value={editValue}\n onChange={handleEditChange}\n onKeyDown={handleEditKeyDown}\n className=\"w-full bg-transparent text-obsidian px-3 py-2 pr-20 resize-none outline-none min-h-10 text-sm\"\n rows={1}\n />\n <div className=\"absolute right-1 top-1/2 -translate-y-1/2 flex gap-0.5\">\n <button\n type=\"button\"\n onClick={handleCancelEdit}\n className=\"p-1.5 text-obsidian/60 hover:text-obsidian transition-colors\"\n aria-label=\"Cancel edit\"\n >\n <XIcon/>\n </button>\n <button\n type=\"button\"\n onClick={handleSubmitEdit}\n disabled={!editValue.trim() || editValue.trim() === content}\n className=\"p-1.5 text-obsidian/60 hover:text-obsidian transition-colors disabled:opacity-30\"\n aria-label=\"Submit edit\"\n >\n <SendIcon/>\n </button>\n </div>\n </div>\n </div>\n ) : (\n <div\n className={cx(\n 'px-3 py-2 w-fit max-w-11/12',\n variantStyles[variant]\n )}\n >\n <MarkdownContent\n content={content}\n className={cx('prose-sm', isUser ? 'prose-inherit' : 'prose-invert')}\n isStreaming={isStreaming}\n cursorClassName=\"ml-0.5\"\n />\n </div>\n )}\n\n {/* Action bar - below the message, includes branch nav on the right */}\n {showActions && !isEditing && (\n <div className={cx(\n 'flex items-center gap-0.5 mt-1',\n isUser ? 'mr-1' : 'ml-1'\n )}>\n {/* Copy - available for both */}\n {(actions.showCopy !== false) && (\n <ActionButton onClick={handleCopy}\n label={copied ? 'Copied!' : 'Copy message'}>\n {copied ? <CheckIcon/> : <CopyIcon/>}\n </ActionButton>\n )}\n\n {/* Edit - only for user messages */}\n {isUser && actions.onEdit && (\n <ActionButton onClick={handleStartEdit} label=\"Edit message\">\n <PencilIcon/>\n </ActionButton>\n )}\n\n {/* Retry - only for assistant messages */}\n {!isUser && actions.onRetry && (\n <ActionButton onClick={actions.onRetry} label=\"Regenerate response\">\n <RetryIcon/>\n </ActionButton>\n )}\n\n {/* Branch navigator - to the right of action buttons */}\n {showBranchNav && (\n <>\n <div className=\"w-px h-4 bg-ash/40 mx-1\"/>\n <div className=\"flex items-center gap-0.5 text-silver/70\">\n <GitBranchIcon/>\n <button\n type=\"button\"\n onClick={branchInfo.onPrevious}\n disabled={branchInfo.current <= 1}\n className={cx(\n 'p-0.5 hover:text-white hover:bg-white/10 transition-colors',\n 'disabled:opacity-30 disabled:cursor-not-allowed disabled:hover:bg-transparent disabled:hover:text-silver/70'\n )}\n aria-label=\"Previous branch\"\n >\n <ChevronLeftIcon/>\n </button>\n <span className=\"text-xs tabular-nums min-w-6 text-center\">\n {branchInfo.current}/{branchInfo.total}\n </span>\n <button\n type=\"button\"\n onClick={branchInfo.onNext}\n disabled={branchInfo.current >= branchInfo.total}\n className={cx(\n 'p-0.5 hover:text-white hover:bg-white/10 transition-colors',\n 'disabled:opacity-30 disabled:cursor-not-allowed disabled:hover:bg-transparent disabled:hover:text-silver/70'\n )}\n aria-label=\"Next branch\"\n >\n <ChevronRightIcon/>\n </button>\n </div>\n </>\n )}\n </div>\n )}\n </div>\n )\n }\n)\n\nMessage.displayName = 'Message'\n\nexport default Message\n","import React, {useMemo} from 'react'\nimport DOMPurify, {type Config} from 'dompurify'\nimport {marked} from 'marked'\nimport {cx} from '../utils'\n\nexport interface MarkdownContentProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Content to display (can be Markdown or HTML)\n */\n content: string\n /**\n * Whether the content should be treated as Markdown\n * @default true\n */\n isMarkdown?: boolean\n sanitizeConfig?: Config\n /**\n * When true, injects a streaming cursor at the end of the content\n */\n isStreaming?: boolean\n /**\n * Additional classes for the streaming cursor\n */\n cursorClassName?: string\n}\n\nconst DEFAULT_SANITIZE_CONFIG: Config = {\n ALLOWED_TAGS: [\n 'h1', 'h2', 'h3', 'h4', 'h5', 'h6',\n 'p', 'br', 'hr',\n 'strong', 'b', 'em', 'i', 'u', 's', 'strike', 'del', 'ins',\n 'sup', 'sub', 'mark', 'small',\n 'ul', 'ol', 'li',\n 'a',\n 'code', 'pre', 'kbd', 'samp', 'var',\n 'blockquote', 'q', 'cite', 'abbr',\n 'table', 'thead', 'tbody', 'tfoot', 'tr', 'th', 'td', 'caption', 'colgroup', 'col',\n 'div', 'span', 'details', 'summary',\n ],\n ALLOWED_ATTR: [\n 'href', 'title', 'target', 'rel',\n 'class', 'id',\n 'colspan', 'rowspan', 'scope',\n 'open',\n ],\n ADD_ATTR: ['target', 'rel'],\n ALLOWED_URI_REGEXP: /^(?:(?:https?|mailto|tel):|[^a-z]|[a-z+.-]+(?:[^a-z+.\\-:]|$))/i,\n}\n\nfunction useDOMPurifySetup() {\n useMemo(() => {\n DOMPurify.addHook('afterSanitizeAttributes', (node) => {\n if (node.tagName === 'A') {\n node.setAttribute('target', '_blank')\n node.setAttribute('rel', 'noopener noreferrer')\n }\n })\n }, [])\n}\n\nconst CURSOR_BASE_CLASSES = 'inline-block bg-current animate-cursor-blink w-0.5 h-cursor translate-y-cursor-offset'\n\n/**\n * Injects a streaming cursor at the end of the HTML content.\n * Finds the deepest last element and appends the cursor inside it.\n */\nfunction injectStreamingCursor(html: string, cursorClassName?: string): string {\n if (!html.trim()) {\n // Empty content - just return the cursor\n return `<span class=\"${cx(CURSOR_BASE_CLASSES, cursorClassName)}\" aria-hidden=\"true\"></span>`\n }\n\n const cursorHtml = `<span class=\"${cx(CURSOR_BASE_CLASSES,\n cursorClassName)}\" aria-hidden=\"true\"></span>`\n\n // Parse the HTML to find the right injection point\n const parser = new DOMParser()\n const doc = parser.parseFromString(`<div>${html}</div>`, 'text/html')\n const container = doc.body.firstChild as HTMLElement\n\n if (!container) {\n return html + cursorHtml\n }\n\n // Find the deepest last element to append the cursor to\n let target: Element = container\n while (target.lastElementChild) {\n const lastChild = target.lastElementChild\n // Stop at inline elements or elements that shouldn't have block children\n const tagName = lastChild.tagName.toLowerCase()\n if (['code', 'a', 'strong', 'em', 'b', 'i', 'span', 'mark', 'del', 's'].includes(tagName)) {\n break\n }\n target = lastChild\n }\n\n // Append cursor to the target element\n target.insertAdjacentHTML('beforeend', cursorHtml)\n\n // Return the inner HTML (excluding our wrapper div)\n return container.innerHTML\n}\n\nexport const MarkdownContent = React.forwardRef<HTMLDivElement, MarkdownContentProps>(\n ({className, content, isMarkdown = true, sanitizeConfig, isStreaming, cursorClassName, ...rest},\n ref) => {\n useDOMPurifySetup()\n\n const sanitizedHtml = useMemo(() => {\n if (!content && !isStreaming) {\n return ''\n }\n const config = sanitizeConfig ?? DEFAULT_SANITIZE_CONFIG\n\n // Convert markdown to HTML if requested\n let htmlContent: string\n if (isMarkdown) {\n try {\n // marked.parse can be sync or async, but for simple strings it's usually sync\n htmlContent = marked.parse(content) as string\n } catch (e) {\n console.error('Error parsing markdown:', e)\n htmlContent = content\n }\n } else {\n htmlContent = content\n }\n\n const sanitized = htmlContent ? DOMPurify.sanitize(htmlContent, config) : ''\n\n if (isStreaming) {\n return injectStreamingCursor(sanitized, cursorClassName)\n }\n\n return sanitized\n }, [content, sanitizeConfig, isStreaming, cursorClassName])\n\n return (\n <div\n ref={ref}\n className={cx('prose', className)}\n dangerouslySetInnerHTML={{__html: sanitizedHtml}}\n {...rest}\n />\n )\n }\n)\n\nMarkdownContent.displayName = 'MarkdownContent'\n\nexport default MarkdownContent","import React from 'react'\nimport {cx} from '../utils/cx'\n\nexport interface StreamingCursorProps extends React.HTMLAttributes<HTMLSpanElement> {\n variant?: 'block' | 'line' | 'underscore'\n}\n\nexport const StreamingCursor = React.forwardRef<HTMLSpanElement, StreamingCursorProps>(\n ({className, variant = 'line', ...rest}, ref) => {\n const variantStyles = {\n block: 'w-2.5 h-cursor translate-y-cursor-offset',\n line: 'w-0.5 h-cursor translate-y-cursor-offset',\n underscore: 'w-2.5 h-0.5 self-end mb-0.5'\n }\n\n return (\n <span\n ref={ref}\n className={cx(\n 'inline-block bg-current animate-cursor-blink',\n variantStyles[variant],\n className\n )}\n aria-hidden=\"true\"\n {...rest}\n />\n )\n }\n)\n\nStreamingCursor.displayName = 'StreamingCursor'\n\nexport default StreamingCursor\n","import React, {useCallback, useEffect, useMemo, useRef, useState} from 'react'\nimport {cx} from '../../utils'\nimport {ChatView, type ChatViewItem} from './ChatView'\nimport {type Attachment, ChatInput} from './ChatInput'\nimport {type Conversation, ConversationSidebar} from './ConversationSidebar'\nimport {ArtifactsPanel} from './ArtifactsPanel'\nimport {type Task, TodosList, areAllTasksSettled} from './TodosList'\nimport {ToolSidebar, type ToolDefinition, type ToolPanelState, type ExternalToolDefinition, type ToolGroup} from './ToolSidebar'\nimport {ToolPanelContainer} from './ToolPanelContainer'\nimport {useResizable} from './hooks'\nimport type {ArtifactNode} from '../ArtifactNode'\nimport {type ConversationTree, getActivePathMessages, getSiblingInfo, switchBranch} from './types'\nimport {MediaIcon, CheckSquareIcon, SquareLoaderIcon, HistoryIcon} from '../icons'\n\nexport interface ChatMessage {\n /**\n * Unique identifier for the message\n */\n id: string\n /**\n * Whether the message is from the user or the assistant\n */\n variant: 'user' | 'assistant'\n /**\n * Message content (Markdown supported)\n */\n content: string\n /**\n * Whether the message is currently streaming\n */\n isStreaming?: boolean\n}\n\nexport interface ChatInterfaceProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onSubmit'> {\n /**\n * Array of messages in the conversation (flat mode)\n * Use this OR conversationTree, not both\n */\n messages?: ChatMessage[]\n /**\n * Conversation tree for branching support\n * Use this OR messages, not both\n */\n conversationTree?: ConversationTree\n /**\n * Called when the conversation tree changes (for tree mode)\n */\n onTreeChange?: (tree: ConversationTree) => void\n /**\n * List of past conversations for the sidebar\n */\n conversations?: Conversation[]\n /**\n * Called when a message is submitted from the input.\n * Provides the text content and any files attached.\n */\n onMessageSubmit?: (message: string, attachments?: Attachment[]) => void\n /**\n * Called when a user message is edited.\n * In tree mode, this creates a new branch.\n */\n onEditMessage?: (messageId: string, newContent: string) => void\n /**\n * Called when an assistant message is retried.\n * In tree mode, this creates a new branch.\n */\n onRetryMessage?: (messageId: string) => void\n /**\n * Called when the Stop button is clicked during assistant streaming.\n */\n onStop?: () => void\n /**\n * Called when a conversation is selected from the sidebar.\n */\n onSelectConversation?: (id: string) => void\n /**\n * Called when the \"New Chat\" button is clicked in the sidebar.\n */\n onNewChat?: () => void\n /**\n * Whether the assistant is currently streaming a response.\n * Shows a stop button and disables certain actions.\n */\n isStreaming?: boolean\n /**\n * Whether to show the thinking indicator.\n * Typically shown after a user message but before the first streaming token.\n */\n isThinking?: boolean\n /**\n * Placeholder text for the main chat input.\n */\n placeholder?: string\n /**\n * Helper text shown in the empty state (when there are no messages).\n */\n emptyStateHelper?: React.ReactNode\n /**\n * Whether the sidebar should be initially collapsed.\n */\n initialSidebarCollapsed?: boolean\n /**\n * Custom content to show when the conversation is empty.\n * Overrides the default centered input and helper text.\n */\n emptyState?: React.ReactNode\n /**\n * Whether to show the attachment (paperclip) button in the input.\n */\n showAttachmentButton?: boolean\n /**\n * Whether to enable message-level actions (copy, edit, retry).\n */\n enableMessageActions?: boolean\n /**\n * Current attachments for the chat input (controlled).\n */\n attachments?: Attachment[]\n /**\n * Called when attachments are added or removed in the chat input.\n */\n onAttachmentsChange?: (attachments: Attachment[]) => void\n /**\n * Top-level artifact tree nodes for the artifacts panel.\n */\n artifactNodes?: ArtifactNode[]\n /**\n * Whether the artifacts panel is currently open (controlled).\n * When set, maps to the tool panel system — opens the artifacts tool.\n */\n isArtifactsPanelOpen?: boolean\n /**\n * Called when the artifacts panel is opened or closed (controlled).\n */\n onArtifactsPanelOpenChange?: (open: boolean) => void\n /**\n * Tasks to display in the todos list tool panel.\n * Shows a list of tasks with status indicators.\n */\n tasks?: Task[]\n /**\n * Title for the todos list\n * @default \"Tasks\"\n */\n tasksTitle?: string\n /**\n * Additional tools to add to the tool sidebars. Each ExternalToolDefinition provides\n * an id, icon, label, group ('top-left' | 'bottom-left' | 'top-right' | 'bottom-right'),\n * and content (ReactNode) to render when opened. Tools in the same group are mutually\n * exclusive. Built-in tools occupy: History (top-left), Artifacts (top-right), Tasks\n * (bottom-right). Consumer tools are added alongside these.\n */\n tools?: ExternalToolDefinition[]\n}\n\n/**\n * ChatInterface is the main orchestrator for a full-featured chat experience.\n *\n * Features:\n * - ConversationSidebar (far left) — collapsible list of past conversations\n * - ChatView (center) — main conversation area with smart scrolling\n * - Dual tool sidebar system — IntelliJ-style tool sidebars on left and right:\n * - Left sidebar: History (top-left) + consumer tools (bottom-left)\n * - Right sidebar: Artifacts (top-right) + Tasks (bottom-right) + consumer tools\n * - Tools in the same group are mutually exclusive\n * - Both panels can be open simultaneously — chat area shrinks to accommodate\n * - Each panel is independently width-resizable\n * - Vertical split with draggable divider when both slots in a panel are active\n * - Consumer tools via `tools` prop — provide icon, label, group, and content\n * - ChatInput — position-aware input that centers in empty state\n * - Branching — support for conversation tree with branch navigation\n * - Message Actions — copy, edit, retry\n * - Thinking Indicator — shown between user message and response\n *\n * Artifacts are supplied as a tree of ArtifactNode objects via the\n * artifactNodes prop.\n */\nexport const ChatInterface = React.forwardRef<HTMLDivElement, ChatInterfaceProps>(\n (\n {\n messages = [],\n conversationTree,\n onTreeChange,\n conversations = [],\n onMessageSubmit,\n onEditMessage,\n onRetryMessage,\n onStop,\n onSelectConversation,\n onNewChat,\n isStreaming = false,\n isThinking = false,\n placeholder = 'Send a message...',\n emptyStateHelper = \"Let's talk.\",\n initialSidebarCollapsed = false,\n emptyState,\n showAttachmentButton = true,\n enableMessageActions = true,\n attachments: propsAttachments,\n onAttachmentsChange,\n artifactNodes,\n isArtifactsPanelOpen,\n onArtifactsPanelOpenChange,\n tasks = [],\n tasksTitle,\n tools: externalTools = [],\n className,\n ...rest\n },\n ref\n ) => {\n const [sidebarCollapsed, setSidebarCollapsed] = useState(initialSidebarCollapsed)\n const prevArtifactNodesRef = useRef<ArtifactNode[]>([])\n const prevTasksRef = useRef<Task[]>([])\n\n // ── Tool panel state ──────────────────────────────────────────\n const [internalTools, setInternalTools] = useState<ToolPanelState>({\n 'top-left': null,\n 'bottom-left': null,\n 'top-right': null,\n 'bottom-right': null,\n })\n\n // Track tools the user has actively dismissed — auto-open won't reopen these\n const dismissedToolsRef = useRef<Set<string>>(new Set())\n\n // Controlled vs uncontrolled: isArtifactsPanelOpen maps to the tool system\n const isPanelControlled = isArtifactsPanelOpen !== undefined\n\n // Derive effective tool state\n const activeTools: ToolPanelState = useMemo(() => {\n if (isPanelControlled) {\n return {\n ...internalTools,\n 'top-right': isArtifactsPanelOpen ? 'artifacts' : internalTools['top-right'],\n }\n }\n return internalTools\n }, [isPanelControlled, isArtifactsPanelOpen, internalTools])\n\n const isLeftPanelOpen = activeTools['top-left'] !== null || activeTools['bottom-left'] !== null\n const isRightPanelOpen = activeTools['top-right'] !== null || activeTools['bottom-right'] !== null\n\n // ── Resizable panels ──────────────────────────────────────────\n const {\n width: sidebarWidth,\n startResizing: startResizingSidebar\n } = useResizable({\n initialWidthPercent: 15,\n minWidthPercent: 12,\n maxWidthPercent: 25,\n direction: 'right'\n })\n\n const {\n width: rightToolsWidth,\n startResizing: startResizingRightTools\n } = useResizable({\n initialWidthPercent: 50,\n minWidthPercent: 25,\n maxWidthPercent: 70,\n direction: 'left'\n })\n\n const {\n width: leftToolsWidth,\n startResizing: startResizingLeftTools\n } = useResizable({\n initialWidthPercent: 25,\n minWidthPercent: 15,\n maxWidthPercent: 40,\n direction: 'right'\n })\n\n // ── Tool definitions ──────────────────────────────────────────\n const allSettled = tasks.length === 0 || areAllTasksSettled(tasks)\n\n // ── Merged tool definitions (built-in + external) ──────────────\n const allToolDefinitions: ToolDefinition[] = useMemo(() => {\n const builtIn: ToolDefinition[] = [\n {id: 'history', icon: <HistoryIcon/>, label: 'History', group: 'top-left'},\n {id: 'artifacts', icon: <MediaIcon/>, label: 'Artifacts', group: 'top-right'},\n {\n id: 'todos',\n icon: allSettled ? <CheckSquareIcon/> : <SquareLoaderIcon/>,\n label: 'Tasks',\n group: 'bottom-right',\n },\n ]\n const external: ToolDefinition[] = externalTools.map(({content: _content, ...def}) => def)\n return [...builtIn, ...external]\n }, [allSettled, externalTools])\n\n // ── Toggle a tool ─────────────────────────────────────────────\n const toggleTool = useCallback((toolId: string) => {\n // Find the tool's group\n const toolDef = allToolDefinitions.find(t => t.id === toolId)\n if (!toolDef) return\n\n const group = toolDef.group\n\n // Special case: controlled artifacts panel\n if (toolId === 'artifacts' && isPanelControlled) {\n const isCurrentlyOpen = activeTools['top-right'] === 'artifacts'\n if (isCurrentlyOpen) {\n dismissedToolsRef.current.add('artifacts')\n } else {\n dismissedToolsRef.current.delete('artifacts')\n }\n onArtifactsPanelOpenChange?.(!isCurrentlyOpen)\n return\n }\n\n setInternalTools(prev => {\n const isCurrentlyOpen = prev[group] === toolId\n if (isCurrentlyOpen) {\n dismissedToolsRef.current.add(toolId)\n } else {\n dismissedToolsRef.current.delete(toolId)\n }\n return {\n ...prev,\n [group]: isCurrentlyOpen ? null : toolId,\n }\n })\n }, [allToolDefinitions, isPanelControlled, activeTools, onArtifactsPanelOpenChange])\n\n // ── Messages ──────────────────────────────────────────────────\n const isTreeMode = !!conversationTree\n\n const effectiveMessages: ChatMessage[] = useMemo(() => {\n if (isTreeMode && conversationTree) {\n const pathNodes = getActivePathMessages(conversationTree)\n return pathNodes.map((node) => ({\n id: node.id,\n variant: node.role,\n content: node.content,\n isStreaming: node.isStreaming,\n }))\n }\n return messages\n }, [isTreeMode, conversationTree, messages])\n\n const latestUserMessageIndex = useMemo(() => {\n for (let i = effectiveMessages.length - 1; i >= 0; i--) {\n if (effectiveMessages[i].variant === 'user') return i\n }\n return -1\n }, [effectiveMessages])\n\n // ── Auto-open tools when data arrives (uncontrolled mode) ─────\n // Only auto-opens a tool if the user hasn't actively dismissed it.\n useEffect(() => {\n const nodes = artifactNodes || []\n const prevNodes = prevArtifactNodesRef.current\n\n const hasNewOrChangedNode = nodes.length !== prevNodes.length\n || nodes.some((n, i) => n.id !== prevNodes[i]?.id)\n\n if (!isPanelControlled\n && hasNewOrChangedNode && nodes.length > 0\n && !dismissedToolsRef.current.has('artifacts')) {\n setInternalTools(prev => ({...prev, 'top-right': 'artifacts'}))\n }\n\n const hasNewOrUpdatedTask = (curr: Task[], prev: Task[]): boolean => {\n return curr.some(c => {\n const p = prev.find(x => x.id === c.id)\n if (!p) return true\n if (c.status !== p.status || c.label !== p.label) return true\n if (c.subtasks && hasNewOrUpdatedTask(c.subtasks, p?.subtasks || [])) return true\n return false\n })\n }\n\n if (hasNewOrUpdatedTask(tasks, prevTasksRef.current)\n && !dismissedToolsRef.current.has('todos')) {\n setInternalTools(prev => ({...prev, 'bottom-right': 'todos'}))\n }\n\n prevArtifactNodesRef.current = nodes\n prevTasksRef.current = tasks\n }, [artifactNodes, tasks, isPanelControlled])\n\n // ── Branch switching ──────────────────────────────────────────\n const handleBranchSwitch = useCallback(\n (nodeId: string, direction: 'prev' | 'next') => {\n if (!isTreeMode || !conversationTree || !onTreeChange) return\n const newTree = switchBranch(conversationTree, nodeId, direction)\n onTreeChange(newTree)\n },\n [isTreeMode, conversationTree, onTreeChange]\n )\n\n // ── Display messages ──────────────────────────────────────────\n const displayMessages: ChatViewItem[] = useMemo(() => {\n return effectiveMessages.map((msg) => {\n let branchInfo = undefined\n if (isTreeMode && conversationTree) {\n const siblingInfo = getSiblingInfo(conversationTree, msg.id)\n if (siblingInfo.total > 1) {\n branchInfo = {\n current: siblingInfo.current,\n total: siblingInfo.total,\n onPrevious: () => handleBranchSwitch(msg.id, 'prev'),\n onNext: () => handleBranchSwitch(msg.id, 'next'),\n }\n }\n }\n\n const actions = enableMessageActions\n ? {\n showCopy: true,\n onEdit: msg.variant === 'user' && onEditMessage\n ? (newContent: string) => onEditMessage(msg.id, newContent)\n : undefined,\n onRetry: msg.variant === 'assistant' && onRetryMessage\n ? () => onRetryMessage(msg.id)\n : undefined,\n }\n : undefined\n\n return {...msg, branchInfo, actions}\n })\n }, [effectiveMessages, isTreeMode, conversationTree, enableMessageActions,\n onEditMessage, onRetryMessage, handleBranchSwitch])\n\n const handleSubmit = useCallback(\n (message: string, attachments?: Attachment[]) => {\n onMessageSubmit?.(message, attachments)\n },\n [onMessageSubmit]\n )\n\n const toggleSidebar = useCallback(() => {\n setSidebarCollapsed(prev => !prev)\n }, [])\n\n const isEmpty = effectiveMessages.length === 0\n\n // ── Derived: which sides have tools ─────────────────────────\n const leftToolDefs = useMemo(\n () => allToolDefinitions.filter(t => t.group === 'top-left' || t.group === 'bottom-left'),\n [allToolDefinitions]\n )\n const rightToolDefs = useMemo(\n () => allToolDefinitions.filter(t => t.group === 'top-right' || t.group === 'bottom-right'),\n [allToolDefinitions]\n )\n const hasLeftTools = leftToolDefs.length > 0\n const hasRightTools = rightToolDefs.length > 0\n\n // ── Render tool content for a given slot ──────────────────────\n const renderToolContent = (toolId: string | null) => {\n if (!toolId) return null\n\n switch (toolId) {\n case 'history':\n return (\n <div className=\"h-full flex flex-col\">\n <div className=\"flex items-center p-4 border-b border-ash/40 shrink-0\">\n <h3 className=\"text-xs font-medium text-white\">History</h3>\n </div>\n <div className=\"flex-1 overflow-y-auto py-2\">\n {conversations.length === 0 ? (\n <p className=\"px-4 py-2 text-xs text-silver/60\">No conversations yet</p>\n ) : (\n <div className=\"space-y-1 px-2\">\n {conversations.map((conversation) => (\n <button\n key={conversation.id}\n onClick={() => onSelectConversation?.(conversation.id)}\n className={cx(\n 'w-full px-3 py-2 text-left',\n 'transition-colors duration-150',\n conversation.isActive\n ? 'bg-ash/40 text-white'\n : 'text-silver hover:bg-ash/20 hover:text-white'\n )}\n >\n <p className=\"text-sm font-medium truncate\">{conversation.title}</p>\n {conversation.preview && (\n <p className=\"text-xs text-silver/60 truncate mt-0.5\">\n {conversation.preview}\n </p>\n )}\n {conversation.timestamp && (\n <p className=\"text-xs text-silver/40 mt-1\">{conversation.timestamp}</p>\n )}\n </button>\n ))}\n </div>\n )}\n </div>\n </div>\n )\n\n case 'artifacts':\n return (\n <ArtifactsPanel\n nodes={artifactNodes}\n className=\"h-full\"\n />\n )\n\n case 'todos':\n return tasks.length > 0\n ? <TodosList tasks={tasks} title={tasksTitle} className=\"h-full\"/>\n : (\n <div className=\"h-full flex flex-col\">\n <div className=\"flex items-center p-4 border-b border-ash/40 shrink-0\">\n <h3 className=\"text-xs font-medium text-white\">Tasks</h3>\n </div>\n <div className=\"flex-1 flex items-center justify-center\">\n <p className=\"text-xs text-silver/60\">No tasks</p>\n </div>\n </div>\n )\n\n default: {\n // External tool — render its content\n const externalTool = externalTools.find(t => t.id === toolId)\n return externalTool?.content ?? null\n }\n }\n }\n\n return (\n <div\n ref={ref}\n className={cx('flex h-full w-full bg-obsidian overflow-hidden', className)}\n {...rest}\n >\n {/* Conversation sidebar */}\n <ConversationSidebar\n conversations={conversations}\n isCollapsed={sidebarCollapsed}\n onSelectConversation={onSelectConversation}\n onNewChat={onNewChat}\n onToggleCollapse={toggleSidebar}\n width={sidebarWidth}\n onResizeStart={startResizingSidebar}\n />\n\n {/* Left tool sidebar */}\n {hasLeftTools && (\n <ToolSidebar\n tools={leftToolDefs}\n activeTools={activeTools}\n onToggleTool={toggleTool}\n side=\"left\"\n />\n )}\n\n {/* Left tool panel */}\n {isLeftPanelOpen && (\n <ToolPanelContainer\n topContent={renderToolContent(activeTools['top-left'])}\n bottomContent={renderToolContent(activeTools['bottom-left'])}\n width={leftToolsWidth}\n onResizeStart={startResizingLeftTools}\n side=\"left\"\n />\n )}\n\n {/* Main content area */}\n <div className=\"flex-1 flex flex-col min-w-0 relative\">\n <div className={cx(\n \"flex-1 flex flex-col min-h-0 relative\",\n isEmpty ? \"justify-center\" : \"justify-start\"\n )}>\n {/* Top spacer for centering in empty state */}\n <div className={cx(\n \"transition-all duration-500 ease-in-out\",\n isEmpty ? \"flex-1\" : \"flex-zero\"\n )}/>\n\n {/* Messages Area */}\n <div className={cx(\n \"transition-all duration-500 ease-in-out overflow-hidden flex flex-col\",\n isEmpty ? \"flex-zero opacity-0\" : \"flex-1 opacity-100\"\n )}>\n <ChatView\n messages={displayMessages}\n latestUserMessageIndex={latestUserMessageIndex}\n isStreaming={isStreaming}\n isThinking={isThinking}\n className=\"flex-1\"\n />\n </div>\n\n {/* Input Area */}\n <div className={cx(\n \"transition-all duration-500 ease-in-out z-10 w-full flex flex-col items-center\",\n isEmpty ? \"p-4\" : \"shrink-0 p-4 border-t border-ash/40 bg-obsidian\"\n )}>\n {isEmpty && (\n <div className=\"mb-8 text-center animate-fade-in duration-500\">\n {emptyState ? (\n emptyState\n ) : (\n <h1 className=\"text-4xl md:text-5xl font-heading text-gold mb-2 tracking-tight\">\n Welcome!\n </h1>\n )}\n </div>\n )}\n\n <ChatInput\n position={isEmpty ? \"centered\" : \"bottom\"}\n placeholder={placeholder}\n helperText={isEmpty ? emptyStateHelper : undefined}\n onSubmit={handleSubmit}\n disabled={isEmpty ? isStreaming : (isStreaming && !onStop)}\n isStreaming={isStreaming}\n onStop={onStop}\n showAttachmentButton={showAttachmentButton}\n attachments={propsAttachments}\n onAttachmentsChange={onAttachmentsChange}\n />\n </div>\n\n {/* Bottom spacer for centering in empty state */}\n <div className={cx(\n \"transition-all duration-500 ease-in-out\",\n isEmpty ? \"flex-1\" : \"flex-zero\"\n )}/>\n </div>\n </div>\n\n {/* Right tool panel */}\n {isRightPanelOpen && (\n <ToolPanelContainer\n topContent={renderToolContent(activeTools['top-right'])}\n bottomContent={renderToolContent(activeTools['bottom-right'])}\n width={rightToolsWidth}\n onResizeStart={startResizingRightTools}\n side=\"right\"\n />\n )}\n\n {/* Right tool sidebar */}\n {hasRightTools && (\n <ToolSidebar\n tools={rightToolDefs}\n activeTools={activeTools}\n onToggleTool={toggleTool}\n side=\"right\"\n />\n )}\n </div>\n )\n }\n)\n\nChatInterface.displayName = 'ChatInterface'\n","import React, {useEffect} from 'react'\nimport {\n Message,\n type MessageActionsConfig,\n type MessageBranchInfo,\n type MessageProps,\n type MessageVariant\n} from '../Message'\nimport {cx} from '../../utils'\nimport {useScrollAnchor} from './hooks/useScrollAnchor'\nimport {useAdaptiveSpacer} from './hooks/useAdaptiveSpacer'\nimport {ThinkingIndicator} from './ThinkingIndicator'\n\nexport interface ChatViewItem extends Omit<MessageProps, 'variant' | 'children'> {\n id?: string\n variant?: MessageVariant\n /**\n * Branch navigation info for this message\n */\n branchInfo?: MessageBranchInfo\n /**\n * Actions configuration for this message\n */\n actions?: MessageActionsConfig\n}\n\nexport interface ChatViewProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Array of chat messages to display\n */\n messages: ChatViewItem[]\n /**\n * Index of the latest user message to anchor scroll to.\n * When this changes, the component scrolls that message to the top.\n */\n latestUserMessageIndex?: number\n /**\n * Whether the assistant is currently streaming a response\n */\n isStreaming?: boolean\n /**\n * Whether to show the thinking indicator (between user message and response)\n */\n isThinking?: boolean\n /**\n * Callback when the user scrolls manually\n */\n onScroll?: (e: React.UIEvent<HTMLDivElement>) => void\n}\n\n/**\n * ChatView displays a conversation thread with smart scrolling behavior.\n *\n * Key behaviors:\n * - When a user message is sent, it anchors to the top of the viewport\n * - Does NOT auto-scroll during streaming (respects user's reading position)\n * - Smooth transitions and animations\n */\nexport const ChatView = React.forwardRef<HTMLDivElement, ChatViewProps>(\n ({messages, latestUserMessageIndex, isStreaming, isThinking, onScroll, className, ...rest},\n ref) => {\n const {containerRef, anchorRef, scrollToAnchor} = useScrollAnchor({\n behavior: 'smooth',\n block: 'start',\n })\n\n const {contentRef, spacerRef, spacerHeight} = useAdaptiveSpacer({\n containerRef,\n anchorRef,\n })\n\n // Scroll to anchor when latest user message index changes\n useEffect(() => {\n if (latestUserMessageIndex !== undefined && latestUserMessageIndex >= 0) {\n scrollToAnchor()\n }\n }, [latestUserMessageIndex, scrollToAnchor])\n\n // Find the latest user message for anchoring\n const latestUserIdx =\n latestUserMessageIndex ??\n messages.reduceRight((found, msg, idx) => {\n if (found === -1 && msg.variant === 'user') {\n return idx\n }\n return found\n }, -1)\n\n // Determine if we should show thinking indicator\n // Show when isThinking is true AND there are messages AND the last message is from user\n const showThinking = isThinking && messages.length > 0 && messages[messages.length\n - 1]?.variant === 'user'\n\n return (\n <div\n ref={(node) => {\n // Handle both refs\n ;(containerRef as React.MutableRefObject<HTMLDivElement | null>).current = node\n if (typeof ref === 'function') {\n ref(node)\n } else if (ref) {\n ref.current = node\n }\n }}\n onScroll={onScroll}\n className={cx(\n 'flex flex-col w-full h-full overflow-y-auto scroll-smooth',\n 'px-4 py-6 overscroll-contain',\n className\n )}\n {...rest}\n >\n {/* Content wrapper for adaptive spacer measurement */}\n <div ref={contentRef} className=\"relative flex flex-col gap-3\">\n {messages.map(({\n id,\n variant,\n className: messageClassName,\n branchInfo,\n actions,\n isStreaming: nodeIsStreaming,\n ...messageProps\n }, index) => {\n const isAnchor = index === latestUserIdx\n const isLastMessage = index === messages.length - 1\n const showStreaming = isLastMessage && isStreaming && variant === 'assistant'\n const isMessageStreaming = showStreaming || !!nodeIsStreaming\n // Hide actions during streaming\n return (\n <div\n key={id ?? `msg-${index}`}\n ref={isAnchor ? anchorRef : undefined}\n className={isAnchor ? 'scroll-mt-4' : undefined}\n >\n <Message\n variant={variant}\n isStreaming={isMessageStreaming}\n className={messageClassName}\n branchInfo={branchInfo}\n actions={actions}\n hideActions={isMessageStreaming}\n {...messageProps}\n />\n </div>\n )\n })}\n\n {/* Thinking indicator */}\n {showThinking && (\n <ThinkingIndicator isVisible/>\n )}\n </div>\n\n {/* Adaptive bottom spacer - fills remaining space exactly */}\n <div\n ref={spacerRef}\n className=\"shrink-0 pointer-events-none\"\n style={{height: spacerHeight}}\n aria-hidden=\"true\"\n />\n </div>\n )\n }\n)\n\nChatView.displayName = 'ChatView'\n\nexport default ChatView\n","import {useCallback, useRef} from 'react'\n\nexport interface UseScrollAnchorOptions {\n /**\n * Behavior for scrolling. Defaults to 'smooth'.\n */\n behavior?: ScrollBehavior\n /**\n * Block alignment for scrollIntoView. Defaults to 'start'.\n */\n block?: ScrollLogicalPosition\n}\n\nexport interface UseScrollAnchorReturn {\n /**\n * Ref to attach to the scrollable container\n */\n containerRef: React.RefObject<HTMLDivElement | null>\n /**\n * Ref to attach to the anchor element (latest user message)\n */\n anchorRef: React.RefObject<HTMLDivElement | null>\n /**\n * Scroll the anchor element into view. Call this on user message submission.\n */\n scrollToAnchor: () => void\n /**\n * Scroll to the bottom of the container.\n */\n scrollToBottom: () => void\n /**\n * Check if user has scrolled away from the bottom.\n */\n isScrolledToBottom: () => boolean\n}\n\n/**\n * Hook for smart scroll behavior in chat interfaces.\n *\n * Key behaviors:\n * - Anchors user messages to the top of the viewport when they send a message\n * - Does NOT auto-scroll during streaming to respect user's reading position\n * - Allows manual scroll detection\n */\nexport function useScrollAnchor(\n options: UseScrollAnchorOptions = {}\n): UseScrollAnchorReturn {\n const {behavior = 'smooth', block = 'start'} = options\n\n const containerRef = useRef<HTMLDivElement>(null)\n const anchorRef = useRef<HTMLDivElement>(null)\n\n const scrollToAnchor = useCallback(() => {\n const el = anchorRef.current\n if (!el) {\n return\n }\n\n // Double rAF to ensure layout updates (e.g., adaptive spacer) have been applied.\n // First frame: other rAF callbacks (like spacer recalculation) run\n // Second frame: scroll happens with correct layout\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n el.scrollIntoView({behavior, block})\n })\n })\n }, [behavior, block])\n\n const scrollToBottom = useCallback(() => {\n const container = containerRef.current\n if (!container) {\n return\n }\n\n if (typeof container.scrollTo === 'function') {\n container.scrollTo({top: container.scrollHeight, behavior})\n } else {\n container.scrollTop = container.scrollHeight\n }\n }, [behavior])\n\n const isScrolledToBottom = useCallback(() => {\n const container = containerRef.current\n if (!container) {\n return true\n }\n\n const threshold = 50 // pixels from bottom to consider \"at bottom\"\n const {scrollTop, scrollHeight, clientHeight} = container\n return scrollHeight - scrollTop - clientHeight < threshold\n }, [])\n\n return {\n containerRef,\n anchorRef,\n scrollToAnchor,\n scrollToBottom,\n isScrolledToBottom,\n }\n}\n\nexport default useScrollAnchor\n","import {useCallback, useEffect, useRef, useState} from 'react'\n\nexport interface UseAdaptiveSpacerOptions {\n /**\n * Minimum spacer height. Defaults to 0.\n */\n minHeight?: number\n /**\n * External container ref to use instead of creating one internally.\n * Useful when sharing the container ref with other hooks (e.g., useScrollAnchor).\n */\n containerRef?: React.RefObject<HTMLDivElement | null>\n /**\n * Ref to the anchor element (e.g., latest user message).\n * When provided, spacer is calculated to allow anchor to scroll to top.\n */\n anchorRef?: React.RefObject<HTMLDivElement | null>\n}\n\nexport interface UseAdaptiveSpacerReturn {\n /**\n * Ref to attach to the scrollable container (only use if not providing external ref)\n */\n containerRef: React.RefObject<HTMLDivElement | null>\n /**\n * Ref to attach to the content wrapper (excludes spacer)\n */\n contentRef: React.RefObject<HTMLDivElement | null>\n /**\n * Ref to attach to the spacer element for imperative height updates\n */\n spacerRef: React.RefObject<HTMLDivElement | null>\n /**\n * Calculated spacer height in pixels\n */\n spacerHeight: number\n /**\n * Force recalculation of spacer height\n */\n recalculate: () => void\n}\n\n/**\n * Hook that calculates the exact spacer height needed to fill remaining viewport space\n * while allowing the anchor element to scroll to the top.\n *\n * The spacer height is calculated as:\n * spacerHeight = containerHeight - padding - heightFromAnchorToBottom\n *\n * This ensures:\n * - The anchor message can scroll to the top of the viewport\n * - Below the anchor, content + spacer fills exactly the remaining space\n * - As content below anchor grows, spacer shrinks\n * - When content exceeds available space, spacer becomes 0\n */\nexport function useAdaptiveSpacer(\n options: UseAdaptiveSpacerOptions = {}\n): UseAdaptiveSpacerReturn {\n const {minHeight = 0, containerRef: externalContainerRef, anchorRef} = options\n\n const internalContainerRef = useRef<HTMLDivElement>(null)\n const containerRef = externalContainerRef ?? internalContainerRef\n const contentRef = useRef<HTMLDivElement>(null)\n const spacerRef = useRef<HTMLDivElement>(null)\n const [spacerHeight, setSpacerHeight] = useState(0)\n\n const recalculate = useCallback(() => {\n const container = containerRef.current\n const content = contentRef.current\n if (!container || !content) {\n return\n }\n\n // Get container's computed padding\n const style = getComputedStyle(container)\n const paddingTop = parseFloat(style.paddingTop) || 0\n const paddingBottom = parseFloat(style.paddingBottom) || 0\n const availableHeight = container.clientHeight - paddingTop - paddingBottom\n\n // Calculate height from anchor to bottom of content\n // Using offsetTop for stable measurement from \"zero\" (content top)\n let heightFromAnchorToBottom: number\n const anchor = anchorRef?.current\n\n if (anchor && content.contains(anchor)) {\n // Anchor's position from the top of content (the \"zero\" point)\n // Content wrapper has position:relative, so offsetTop is relative to it\n const anchorTop = anchor.offsetTop\n heightFromAnchorToBottom = content.scrollHeight - anchorTop\n } else {\n // No anchor, use total content height\n heightFromAnchorToBottom = content.scrollHeight\n }\n\n const newSpacerHeight = Math.max(minHeight, availableHeight - heightFromAnchorToBottom)\n\n // Update DOM imperatively for immediate effect (before React commits state)\n // This ensures scrollToAnchor sees the correct spacer height\n if (spacerRef.current) {\n spacerRef.current.style.height = `${newSpacerHeight}px`\n }\n\n // Also update state for React reconciliation\n setSpacerHeight(newSpacerHeight)\n }, [minHeight, anchorRef])\n\n useEffect(() => {\n const container = containerRef.current\n const content = contentRef.current\n if (!container || !content) {\n return\n }\n\n // Initial calculation\n recalculate()\n\n // Observe both container and content for size changes\n const resizeObserver = new ResizeObserver(() => {\n recalculate()\n })\n\n resizeObserver.observe(container)\n resizeObserver.observe(content)\n\n // Also observe mutations in content (for DOM changes that don't trigger resize)\n const mutationObserver = new MutationObserver(() => {\n // Use requestAnimationFrame to batch with render\n requestAnimationFrame(recalculate)\n })\n\n mutationObserver.observe(content, {\n childList: true,\n subtree: true,\n characterData: true,\n })\n\n return () => {\n resizeObserver.disconnect()\n mutationObserver.disconnect()\n }\n }, [recalculate])\n\n return {\n containerRef,\n contentRef,\n spacerRef,\n spacerHeight,\n recalculate,\n }\n}\n\nexport default useAdaptiveSpacer\n","import React, {useEffect, useState} from 'react'\nimport {cx} from '../../utils/cx'\n\nconst THINKING_PHRASES = [\n 'Consulting the ancient tomes...',\n 'Parsing the ineffable...',\n 'Traversing the manifold of possibilities...',\n 'Genuflecting before the oracle...',\n 'Distilling quintessence...',\n 'Communing with the machine spirits...',\n 'Unfolding higher dimensions...',\n 'Perturbing the probability matrix...',\n 'Invoking the categorical imperative...',\n 'Reticulating splines...',\n 'Brewing a fresh batch of tokens...',\n 'Consulting my inner monologue...',\n 'Summoning the muse...',\n]\n\nexport interface ThinkingIndicatorProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Whether the indicator is visible/active\n */\n isVisible?: boolean\n /**\n * Interval between phrase changes in ms\n * @default 2500\n */\n phraseInterval?: number\n /**\n * Custom phrases to cycle through (defaults to built-in phrases)\n */\n phrases?: string[]\n}\n\n/**\n * ThinkingIndicator shows an animated state when the assistant is processing a request\n * but has not yet started streaming tokens. It cycles through flavorful \"thinking\" phrases.\n */\nexport const ThinkingIndicator = React.forwardRef<HTMLDivElement, ThinkingIndicatorProps>(\n (\n {\n isVisible = true,\n phraseInterval = 2500,\n phrases = THINKING_PHRASES,\n className,\n ...rest\n },\n ref\n ) => {\n // Start at a random phrase each time\n const [currentIndex, setCurrentIndex] = useState(\n () => Math.floor(Math.random() * phrases.length))\n const [isTransitioning, setIsTransitioning] = useState(false)\n\n useEffect(() => {\n if (!isVisible || phrases.length <= 1) {\n return\n }\n\n const interval = setInterval(() => {\n setIsTransitioning(true)\n\n // Wait for fade out, then change phrase\n setTimeout(() => {\n setCurrentIndex((prev) => (prev + 1) % phrases.length)\n setIsTransitioning(false)\n }, 200)\n }, phraseInterval)\n\n return () => clearInterval(interval)\n }, [isVisible, phrases.length, phraseInterval])\n\n if (!isVisible) {\n return null\n }\n\n return (\n <div\n ref={ref}\n className={cx(\n 'flex items-center gap-2 px-3 py-2 w-fit',\n 'bg-charcoal border border-ash text-silver',\n 'mr-auto',\n className\n )}\n role=\"status\"\n aria-live=\"polite\"\n {...rest}\n >\n {/* Animated dots */}\n <div className=\"flex gap-1\" aria-hidden=\"true\">\n <span className=\"w-1.5 h-1.5 bg-gold/60 rounded-full animate-pulse\"\n style={{animationDelay: '0ms'}}/>\n <span className=\"w-1.5 h-1.5 bg-gold/60 rounded-full animate-pulse\"\n style={{animationDelay: '150ms'}}/>\n <span className=\"w-1.5 h-1.5 bg-gold/60 rounded-full animate-pulse\"\n style={{animationDelay: '300ms'}}/>\n </div>\n\n {/* Phrase with fade transition */}\n <span\n className={cx(\n 'text-sm italic transition-opacity duration-200',\n isTransitioning ? 'opacity-0' : 'opacity-100'\n )}\n >\n {phrases[currentIndex]}\n </span>\n </div>\n )\n }\n)\n\nThinkingIndicator.displayName = 'ThinkingIndicator'\n\nexport default ThinkingIndicator\n","import React, {useCallback, useEffect, useRef, useState} from 'react'\nimport {cx} from '../../utils'\nimport {Paperclip, Send, Square} from 'lucide-react'\nimport {type AttachmentItem, AttachmentPreview} from '../AttachmentPreview'\nimport {createPreviewUrl, generateId, isImageFile} from './types'\n\nexport type ChatInputPosition = 'centered' | 'bottom'\n\nexport type AttachmentStatus = 'pending' | 'uploading' | 'complete' | 'error'\n\nexport interface Attachment {\n id: string\n file: File\n previewUrl?: string\n status: AttachmentStatus\n error?: string\n progress?: number\n}\n\nexport interface ChatInputProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onSubmit'> {\n /**\n * Position of the input: 'centered' for empty state, 'bottom' for conversation mode\n */\n position?: ChatInputPosition\n /**\n * Placeholder text for the input\n */\n placeholder?: string\n /**\n * Helper text shown above the input in centered mode\n */\n helperText?: React.ReactNode\n /**\n * Called when the user submits a message\n */\n onSubmit?: (message: string, attachments?: Attachment[]) => void\n /**\n * Whether the input is disabled (e.g., during streaming)\n */\n disabled?: boolean\n /**\n * Whether to animate the transition between positions\n */\n animate?: boolean\n /**\n * Whether the assistant is currently streaming (shows Stop button)\n */\n isStreaming?: boolean\n /**\n * Called when the Stop button is clicked during streaming\n */\n onStop?: () => void\n /**\n * Current attachments (controlled mode)\n */\n attachments?: Attachment[]\n /**\n * Called when attachments change (controlled mode)\n */\n onAttachmentsChange?: (attachments: Attachment[]) => void\n /**\n * Whether to show the attachment button\n */\n showAttachmentButton?: boolean\n /**\n * Accepted file types for attachments\n */\n acceptedFileTypes?: string\n}\n\n/**\n * ChatInput is a context-aware input component that can transition between\n * a centered position (for empty states) and a bottom position (for active conversations).\n *\n * Features:\n * - Auto-expanding textarea\n * - File attachments with preview\n * - Drag and drop support\n * - Streaming state with stop button\n * - Animated transition between positions\n */\nexport const ChatInput = React.forwardRef<HTMLDivElement, ChatInputProps>(\n (\n {\n position = 'bottom',\n placeholder = 'Send a message...',\n helperText,\n onSubmit,\n disabled = false,\n animate = true,\n isStreaming = false,\n onStop,\n attachments: controlledAttachments,\n onAttachmentsChange,\n showAttachmentButton = true,\n acceptedFileTypes,\n className,\n ...rest\n },\n ref\n ) => {\n const [value, setValue] = useState('')\n const [localAttachments, setLocalAttachments] = useState<Attachment[]>([])\n const [isDragOver, setIsDragOver] = useState(false)\n const textareaRef = useRef<HTMLTextAreaElement>(null)\n const fileInputRef = useRef<HTMLInputElement>(null)\n\n // Determine if using controlled or uncontrolled attachments\n const attachments = controlledAttachments ?? localAttachments\n const setAttachments = useCallback(\n (newAttachments: Attachment[] | ((prev: Attachment[]) => Attachment[])) => {\n if (onAttachmentsChange) {\n if (typeof newAttachments === 'function') {\n onAttachmentsChange(newAttachments(attachments))\n } else {\n onAttachmentsChange(newAttachments)\n }\n } else {\n setLocalAttachments(newAttachments)\n }\n },\n [attachments, onAttachmentsChange]\n )\n\n const handleSubmit = useCallback(() => {\n const trimmed = value.trim()\n if (!trimmed || disabled || isStreaming) {\n return\n }\n\n onSubmit?.(trimmed, attachments.length > 0 ? attachments : undefined)\n setValue('')\n setAttachments([])\n\n // Reset textarea height\n if (textareaRef.current) {\n textareaRef.current.style.height = 'auto'\n }\n }, [value, disabled, isStreaming, onSubmit, attachments, setAttachments])\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n handleSubmit()\n }\n },\n [handleSubmit]\n )\n\n const handleChange = useCallback((e: React.ChangeEvent<HTMLTextAreaElement>) => {\n setValue(e.target.value)\n\n // Auto-resize textarea\n const textarea = e.target\n textarea.style.height = 'auto'\n textarea.style.height = `${Math.min(textarea.scrollHeight, 200)}px`\n }, [])\n\n // Focus input when it becomes enabled\n useEffect(() => {\n if (!disabled && !isStreaming && textareaRef.current) {\n textareaRef.current.focus()\n }\n }, [disabled, isStreaming])\n\n // File handling\n const addFiles = useCallback(\n (files: FileList | File[]) => {\n const newAttachments: Attachment[] = Array.from(files).map((file) => ({\n id: generateId(),\n file,\n previewUrl: isImageFile(file) ? createPreviewUrl(file) : undefined,\n status: 'pending' as const,\n }))\n setAttachments((prev) => [...prev, ...newAttachments])\n },\n [setAttachments]\n )\n\n const handleFileSelect = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const files = e.target.files\n if (files && files.length > 0) {\n addFiles(files)\n }\n // Reset input so the same file can be selected again\n e.target.value = ''\n },\n [addFiles]\n )\n\n const handleRemoveAttachment = useCallback(\n (id: string) => {\n setAttachments((prev) => {\n const attachment = prev.find((a) => a.id === id)\n if (attachment?.previewUrl) {\n URL.revokeObjectURL(attachment.previewUrl)\n }\n return prev.filter((a) => a.id !== id)\n })\n },\n [setAttachments]\n )\n\n // Drag and drop handlers\n const handleDragEnter = useCallback((e: React.DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n setIsDragOver(true)\n }, [])\n\n const handleDragLeave = useCallback((e: React.DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n // Only set to false if we're leaving the container entirely\n if (!e.currentTarget.contains(e.relatedTarget as Node)) {\n setIsDragOver(false)\n }\n }, [])\n\n const handleDragOver = useCallback((e: React.DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n }, [])\n\n const handleDrop = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n setIsDragOver(false)\n\n const files = e.dataTransfer.files\n if (files && files.length > 0) {\n addFiles(files)\n }\n },\n [addFiles]\n )\n\n const isCentered = position === 'centered'\n const hasAttachments = attachments.length > 0\n const canSubmit = value.trim() && !disabled && !isStreaming\n\n return (\n <div\n ref={ref}\n className={cx(\n 'w-full',\n isCentered && 'flex flex-col items-center justify-center',\n animate && 'transition-all duration-300 ease-out',\n className\n )}\n {...rest}\n >\n {/* Helper text for centered mode */}\n {isCentered && helperText && (\n <p className=\"text-silver text-sm mb-4 text-center\">{helperText}</p>\n )}\n\n {/* Input container */}\n <div\n className={cx(\n 'relative w-full bg-charcoal border',\n isDragOver ? 'border-gold ring-1 ring-gold/30' : 'border-ash/60',\n 'focus-within:border-gold/60 focus-within:ring-1 focus-within:ring-gold/20',\n 'transition-colors duration-200',\n isCentered && 'max-w-lg'\n )}\n onDragEnter={showAttachmentButton ? handleDragEnter : undefined}\n onDragLeave={showAttachmentButton ? handleDragLeave : undefined}\n onDragOver={showAttachmentButton ? handleDragOver : undefined}\n onDrop={showAttachmentButton ? handleDrop : undefined}\n >\n {/* Attachments preview */}\n {hasAttachments && (\n <div className=\"px-3 pt-3 pb-1\">\n <AttachmentPreview\n attachments={attachments as AttachmentItem[]}\n onRemove={handleRemoveAttachment}\n removable={!isStreaming}\n />\n </div>\n )}\n\n {/* Drag overlay */}\n {isDragOver && (\n <div\n className=\"absolute inset-0 bg-gold/10 flex items-center justify-center z-10 pointer-events-none\">\n <span className=\"text-gold text-sm font-medium\">Drop files here</span>\n </div>\n )}\n\n {/* Textarea row */}\n <div className=\"flex items-end\">\n {/* Attachment button */}\n {showAttachmentButton && (\n <>\n <button\n type=\"button\"\n onClick={() => fileInputRef.current?.click()}\n disabled={disabled || isStreaming}\n className={cx(\n 'p-3 text-silver/60 hover:text-silver transition-colors',\n 'disabled:opacity-50 disabled:cursor-not-allowed'\n )}\n aria-label=\"Attach file\"\n >\n <Paperclip className=\"w-5 h-5\"/>\n </button>\n <input\n ref={fileInputRef}\n type=\"file\"\n multiple\n accept={acceptedFileTypes}\n onChange={handleFileSelect}\n className=\"hidden\"\n aria-hidden=\"true\"\n />\n </>\n )}\n\n <textarea\n ref={textareaRef}\n value={value}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n disabled={disabled || isStreaming}\n rows={1}\n className={cx(\n 'flex-1 bg-transparent text-white placeholder:text-silver/60',\n 'py-3 pr-12 resize-none outline-none min-h-12',\n !showAttachmentButton && 'pl-4',\n (disabled || isStreaming) && 'opacity-50 cursor-not-allowed'\n )}\n style={{maxHeight: 200}}\n />\n\n {/* Submit or Stop button */}\n {isStreaming ? (\n <button\n type=\"button\"\n onClick={onStop}\n className={cx(\n 'absolute right-2 bottom-2 p-2',\n 'text-error hover:bg-error/10 transition-colors duration-200'\n )}\n aria-label=\"Stop generation\"\n >\n <Square className=\"w-5 h-5 fill-current\"/>\n </button>\n ) : (\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={!canSubmit}\n className={cx(\n 'absolute right-2 bottom-2 p-2',\n 'transition-colors duration-200',\n canSubmit\n ? 'text-gold hover:bg-gold/10'\n : 'text-silver/40 cursor-not-allowed'\n )}\n aria-label=\"Send message\"\n >\n <Send className=\"w-5 h-5\"/>\n </button>\n )}\n </div>\n </div>\n </div>\n )\n }\n)\n\nChatInput.displayName = 'ChatInput'\n\nexport default ChatInput\n","/**\n * Conversation Tree Types\n *\n * These types support branching conversations where users can:\n * - Edit their messages (creating a new branch)\n * - Retry assistant responses (creating a new branch)\n * - Navigate between different conversation branches\n */\n\n/**\n * A node in the conversation tree\n */\nexport interface MessageNode {\n /**\n * Unique identifier for this message\n */\n id: string\n /**\n * The role of the message author\n */\n role: 'user' | 'assistant'\n /**\n * The message content (may include HTML/markdown)\n */\n content: string\n /**\n * ID of the parent message (null for root messages)\n */\n parentId: string | null\n /**\n * IDs of child messages (branches/continuations)\n */\n children: string[]\n /**\n * Which sibling branch this message is (0, 1, 2...)\n * Used for UI display like \"1/3\"\n */\n branchIndex?: number\n /**\n * Whether this message is currently being streamed\n */\n isStreaming?: boolean\n /**\n * Timestamp when the message was created\n */\n createdAt?: number\n}\n\n/**\n * The full conversation tree structure\n */\nexport interface ConversationTree {\n /**\n * All nodes indexed by their ID\n */\n nodes: Record<string, MessageNode>\n /**\n * IDs of root-level messages (messages with no parent)\n */\n rootIds: string[]\n /**\n * The current \"head\" of the viewed branch\n * This is the leaf node that determines which path we're viewing\n */\n activeLeafId: string | null\n}\n\n/**\n * Attachment types for file uploads\n */\nexport type AttachmentStatus = 'pending' | 'uploading' | 'complete' | 'error'\n\nexport interface Attachment {\n /**\n * Unique identifier for the attachment\n */\n id: string\n /**\n * The File object\n */\n file: File\n /**\n * Blob URL for image previews\n */\n previewUrl?: string\n /**\n * Current upload status\n */\n status: AttachmentStatus\n /**\n * Error message if status is 'error'\n */\n error?: string\n /**\n * Upload progress (0-100)\n */\n progress?: number\n}\n\n/**\n * Helper to check if a file is an image\n */\nexport function isImageFile(file: File): boolean {\n return file.type.startsWith('image/')\n}\n\n/**\n * Helper to create a preview URL for an image file\n */\nexport function createPreviewUrl(file: File): string | undefined {\n if (isImageFile(file)) {\n return URL.createObjectURL(file)\n }\n return undefined\n}\n\n/**\n * Helper to revoke a preview URL when no longer needed\n */\nexport function revokePreviewUrl(url: string | undefined): void {\n if (url) {\n URL.revokeObjectURL(url)\n }\n}\n\n/**\n * Generate a unique ID\n */\nexport function generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`\n}\n\n/**\n * Create an empty conversation tree\n */\nexport function createEmptyTree(): ConversationTree {\n return {\n nodes: {},\n rootIds: [],\n activeLeafId: null,\n }\n}\n\n/**\n * Add a message to the tree\n */\nexport function addMessageToTree(\n tree: ConversationTree,\n message: Omit<MessageNode, 'children' | 'branchIndex'>,\n parentId: string | null = null\n): ConversationTree {\n const newNodes = {...tree.nodes}\n const newRootIds = [...tree.rootIds]\n\n // Determine branch index among siblings\n let branchIndex = 0\n if (parentId && newNodes[parentId]) {\n branchIndex = newNodes[parentId].children.length\n } else if (!parentId) {\n branchIndex = newRootIds.length\n }\n\n // Create the new node\n const newNode: MessageNode = {\n ...message,\n parentId,\n children: [],\n branchIndex,\n createdAt: message.createdAt ?? Date.now(),\n }\n\n newNodes[message.id] = newNode\n\n // Update parent's children array\n if (parentId && newNodes[parentId]) {\n newNodes[parentId] = {\n ...newNodes[parentId],\n children: [...newNodes[parentId].children, message.id],\n }\n } else {\n newRootIds.push(message.id)\n }\n\n return {\n nodes: newNodes,\n rootIds: newRootIds,\n activeLeafId: message.id,\n }\n}\n\n/**\n * Get the linear path from root to the active leaf\n */\nexport function getActivePathMessages(tree: ConversationTree): MessageNode[] {\n if (!tree.activeLeafId) {\n return []\n }\n\n const path: MessageNode[] = []\n let currentId: string | null = tree.activeLeafId\n\n // Walk up to the root\n while (currentId) {\n const node: MessageNode | undefined = tree.nodes[currentId]\n if (!node) {\n break\n }\n path.unshift(node)\n currentId = node.parentId\n }\n\n return path\n}\n\n/**\n * Get sibling count and current index for a node\n */\nexport function getSiblingInfo(tree: ConversationTree, nodeId: string): {\n total: number;\n current: number\n} {\n const node = tree.nodes[nodeId]\n if (!node) {\n return {total: 1, current: 1}\n }\n\n if (node.parentId) {\n const parent = tree.nodes[node.parentId]\n if (parent) {\n const index = parent.children.indexOf(nodeId)\n return {\n total: parent.children.length,\n current: index + 1,\n }\n }\n } else {\n // Root level node\n const index = tree.rootIds.indexOf(nodeId)\n return {\n total: tree.rootIds.length,\n current: index + 1,\n }\n }\n\n return {total: 1, current: 1}\n}\n\n/**\n * Switch to a different branch at a given node\n */\nexport function switchBranch(\n tree: ConversationTree,\n nodeId: string,\n direction: 'prev' | 'next'\n): ConversationTree {\n const node = tree.nodes[nodeId]\n if (!node) {\n return tree\n }\n\n let siblings: string[]\n let currentIndex: number\n\n if (node.parentId) {\n const parent = tree.nodes[node.parentId]\n if (!parent) {\n return tree\n }\n siblings = parent.children\n currentIndex = siblings.indexOf(nodeId)\n } else {\n siblings = tree.rootIds\n currentIndex = siblings.indexOf(nodeId)\n }\n\n if (siblings.length <= 1) {\n return tree\n }\n\n // Calculate new index\n const newIndex = direction === 'next'\n ? (currentIndex + 1) % siblings.length\n : (currentIndex - 1 + siblings.length) % siblings.length\n\n const newNodeId = siblings[newIndex]\n\n // Find the leaf of the new branch (follow first children down)\n let leafId = newNodeId\n let currentNode: MessageNode | undefined = tree.nodes[leafId]\n while (currentNode && currentNode.children.length > 0) {\n leafId = currentNode.children[0]\n currentNode = tree.nodes[leafId]\n }\n\n return {\n ...tree,\n activeLeafId: leafId,\n }\n}\n\n/**\n * Update a node's content (e.g., during streaming)\n */\nexport function updateNodeContent(\n tree: ConversationTree,\n nodeId: string,\n content: string,\n isStreaming?: boolean\n): ConversationTree {\n const node = tree.nodes[nodeId]\n if (!node) {\n return tree\n }\n\n return {\n ...tree,\n nodes: {\n ...tree.nodes,\n [nodeId]: {\n ...node,\n content,\n isStreaming: isStreaming ?? node.isStreaming,\n },\n },\n }\n}\n\n/**\n * Convert a flat message array to a conversation tree\n */\nexport function messagesToTree(\n messages: Array<{\n id: string;\n role: 'user' | 'assistant';\n content: string;\n isStreaming?: boolean\n }>\n): ConversationTree {\n let tree = createEmptyTree()\n\n for (const msg of messages) {\n const parentId = tree.activeLeafId\n tree = addMessageToTree(tree, {\n id: msg.id,\n role: msg.role,\n content: msg.content,\n parentId,\n isStreaming: msg.isStreaming,\n }, parentId)\n }\n\n return tree\n}\n\n/**\n * Check if a node has multiple children (is a branch point)\n */\nexport function isBranchPoint(tree: ConversationTree, nodeId: string): boolean {\n const node = tree.nodes[nodeId]\n return node ? node.children.length > 1 : false\n}\n","import React from 'react'\nimport {cx} from '../../utils/cx'\n\nexport interface Conversation {\n id: string\n title: string\n preview?: string\n timestamp?: string\n isActive?: boolean\n}\n\nexport interface ConversationSidebarProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * List of conversations to display\n */\n conversations: Conversation[]\n /**\n * Whether the sidebar is collapsed\n */\n isCollapsed?: boolean\n /**\n * Callback when a conversation is selected\n */\n onSelectConversation?: (id: string) => void\n /**\n * Callback when \"New Chat\" is clicked\n */\n onNewChat?: () => void\n /**\n * Callback to toggle collapse state\n */\n onToggleCollapse?: () => void\n /**\n * Current width of the sidebar (when expanded).\n * Accepts CSS width value (e.g., \"15vw\", \"256px\").\n */\n width?: string\n /**\n * Callback to start resizing\n */\n onResizeStart?: (e: React.MouseEvent) => void\n}\n\n/**\n * History icon for expanding collapsed sidebar\n */\nfunction HistoryIcon({className}: { className?: string }) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n className={className}\n >\n <path\n fillRule=\"evenodd\"\n d=\"M10 18a8 8 0 100-16 8 8 0 000 16zm.75-13a.75.75 0 00-1.5 0v5c0 .414.336.75.75.75h4a.75.75 0 000-1.5h-3.25V5z\"\n clipRule=\"evenodd\"\n />\n </svg>\n )\n}\n\n/**\n * Chevron left icon for collapsing expanded sidebar\n */\nfunction ChevronLeftIcon({className}: { className?: string }) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n className={className}\n >\n <path\n fillRule=\"evenodd\"\n d=\"M12.79 5.23a.75.75 0 01-.02 1.06L8.832 10l3.938 3.71a.75.75 0 11-1.04 1.08l-4.5-4.25a.75.75 0 010-1.08l4.5-4.25a.75.75 0 011.06.02z\"\n clipRule=\"evenodd\"\n />\n </svg>\n )\n}\n\n/**\n * ConversationSidebar displays a collapsible list of past conversations.\n *\n * When collapsed, shows a thin strip with history icon at top.\n * When expanded, shows chevron at top-left to collapse.\n */\nexport const ConversationSidebar = React.forwardRef<HTMLDivElement, ConversationSidebarProps>(\n (\n {\n conversations,\n isCollapsed = false,\n onSelectConversation,\n onNewChat,\n onToggleCollapse,\n width,\n onResizeStart,\n className,\n ...rest\n },\n ref\n ) => {\n // Collapsed state: thin strip with history icon at top\n if (isCollapsed) {\n return (\n <div\n ref={ref}\n className={cx(\n 'h-full bg-charcoal/80 border-r border-ash/40 flex flex-col items-center py-3',\n 'w-12 flex-shrink-0',\n className\n )}\n {...rest}\n >\n <button\n onClick={onToggleCollapse}\n className={cx(\n 'p-2',\n 'text-silver hover:text-white hover:bg-ash/20',\n 'transition-colors duration-150'\n )}\n aria-label=\"Expand sidebar\"\n >\n <HistoryIcon className=\"w-5 h-5\"/>\n </button>\n </div>\n )\n }\n\n // Expanded state: full sidebar with chevron collapse button in header\n return (\n <div\n ref={ref}\n data-testid=\"conversation-sidebar\"\n className={cx(\n 'h-full bg-charcoal/80 border-r border-ash/40 flex flex-col relative group',\n !width && 'w-64',\n 'flex-shrink-0',\n className\n )}\n style={width ? {width} : undefined}\n {...rest}\n >\n {/* Resize handle */}\n <div\n onMouseDown={onResizeStart}\n data-testid=\"sidebar-resize-handle\"\n className={cx(\n \"absolute top-0 right-0 w-1 h-full cursor-col-resize z-50\",\n \"hover:bg-gold/50 transition-colors\",\n \"after:absolute after:inset-y-0 after:-right-1 after:w-2\" // Larger hit area\n )}\n />\n\n {/* Header with collapse chevron and New Chat button */}\n <div className=\"p-3 border-b border-ash/40 flex-shrink-0 flex items-center gap-2\">\n <button\n onClick={onToggleCollapse}\n className={cx(\n 'p-1.5',\n 'text-silver hover:text-white hover:bg-ash/20',\n 'transition-colors duration-150'\n )}\n aria-label=\"Collapse sidebar\"\n >\n <ChevronLeftIcon className=\"w-5 h-5\"/>\n </button>\n <button\n onClick={onNewChat}\n className={cx(\n 'flex-1 px-3 py-2',\n 'bg-gold/10 hover:bg-gold/20 text-gold',\n 'border border-gold/30',\n 'flex items-center justify-center gap-2',\n 'transition-colors duration-200'\n )}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n className=\"w-4 h-4\"\n >\n <path\n d=\"M10.75 4.75a.75.75 0 00-1.5 0v4.5h-4.5a.75.75 0 000 1.5h4.5v4.5a.75.75 0 001.5 0v-4.5h4.5a.75.75 0 000-1.5h-4.5v-4.5z\"/>\n </svg>\n <span className=\"text-sm font-medium\">New Chat</span>\n </button>\n </div>\n\n {/* Conversation list */}\n <div className=\"flex-1 overflow-y-auto py-2\">\n {conversations.length === 0 ? (\n <p className=\"px-4 py-2 text-sm text-silver/60\">No conversations yet</p>\n ) : (\n <div className=\"space-y-1 px-2\">\n {conversations.map((conversation) => (\n <button\n key={conversation.id}\n onClick={() => onSelectConversation?.(conversation.id)}\n className={cx(\n 'w-full px-3 py-2 text-left',\n 'transition-colors duration-150',\n conversation.isActive\n ? 'bg-ash/40 text-white'\n : 'text-silver hover:bg-ash/20 hover:text-white'\n )}\n >\n <p className=\"text-sm font-medium truncate\">{conversation.title}</p>\n {conversation.preview && (\n <p className=\"text-xs text-silver/60 truncate mt-0.5\">\n {conversation.preview}\n </p>\n )}\n {conversation.timestamp && (\n <p className=\"text-xs text-silver/40 mt-1\">{conversation.timestamp}</p>\n )}\n </button>\n ))}\n </div>\n )}\n </div>\n </div>\n )\n }\n)\n\nConversationSidebar.displayName = 'ConversationSidebar'\n\n/**\n * Collapsed sidebar toggle button (for external use if needed)\n */\nexport interface CollapsedSidebarToggleProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n onExpand?: () => void\n}\n\nexport const CollapsedSidebarToggle = React.forwardRef<\n HTMLButtonElement,\n CollapsedSidebarToggleProps\n>(({onExpand, className, ...rest}, ref) => {\n return (\n <button\n ref={ref}\n onClick={onExpand}\n className={cx(\n 'p-2',\n 'bg-charcoal/80 border border-ash/40',\n 'text-silver hover:text-white hover:bg-ash/20',\n 'transition-colors duration-150',\n className\n )}\n aria-label=\"Expand sidebar\"\n {...rest}\n >\n <HistoryIcon className=\"w-5 h-5\"/>\n </button>\n )\n})\n\nCollapsedSidebarToggle.displayName = 'CollapsedSidebarToggle'\n\nexport default ConversationSidebar\n","import React, {useCallback, useEffect, useRef, useState} from 'react'\nimport {cx} from '../../utils'\nimport {ArtifactCard} from '../ArtifactCard'\nimport {ArtifactGroup} from '../ArtifactGroup'\nimport {ArtifactVariantStack} from '../ArtifactVariantStack'\nimport {CardSlotLoading} from '../Card'\nimport {AudioCard} from '../AudioCard'\nimport {PdfCard} from '../PdfCard'\nimport {ScriptCard} from '../ScriptCard'\nimport {VideoCard} from '../VideoCard'\nimport {MarkdownContent} from '../MarkdownContent'\nimport {ChevronRightIcon, CloseIcon,} from '../icons'\nimport type {Artifact} from './hooks'\nimport type {ArtifactNode} from '../ArtifactNode'\nimport {useArtifactTreeNavigation} from './hooks/useArtifactTreeNavigation'\n\nconst ZOOM_LEVELS = [0.25, 0.5, 0.75, 1.0] as const\n\nexport interface ArtifactsPanelProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Top-level tree nodes to display in the navigable artifact tree.\n */\n nodes?: ArtifactNode[]\n /**\n * Whether artifacts are still loading (show skeletons)\n */\n loading?: CardSlotLoading\n}\n\n/**\n * Artifact modal for full-screen viewing\n */\nfunction ArtifactModal({\n artifact,\n onClose,\n}: {\n artifact: Artifact\n onClose: () => void\n}) {\n // Handle ESC key\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n onClose()\n }\n }\n document.addEventListener('keydown', handleKeyDown)\n return () => document.removeEventListener('keydown', handleKeyDown)\n }, [onClose])\n\n // Handle click outside\n const handleBackdropClick = useCallback((e: React.MouseEvent) => {\n if (e.target === e.currentTarget) {\n onClose()\n }\n }, [onClose])\n\n return (\n <div\n className=\"fixed inset-0 z-50 flex items-center justify-center bg-void/90 backdrop-blur-sm animate-fade-in\"\n onClick={handleBackdropClick}\n >\n <div\n className=\"relative w-11/12 h-5/6 max-w-6xl bg-charcoal border border-ash/40 flex flex-col overflow-hidden\">\n {/* Modal header */}\n <div\n className=\"flex items-center justify-between p-4 border-b border-ash/40 shrink-0\">\n <div>\n {artifact.title && (\n <h3 className=\"text-sm font-semibold text-white\">{artifact.title}</h3>\n )}\n {artifact.subtitle && (\n <p className=\"text-xs text-silver\">{artifact.subtitle}</p>\n )}\n </div>\n <button\n onClick={onClose}\n className=\"p-2 text-silver hover:text-white hover:bg-ash/20 transition-colors\"\n aria-label=\"Close modal\"\n >\n <CloseIcon className=\"w-5 h-5\"/>\n </button>\n </div>\n\n {/* Modal content */}\n <div className=\"flex-1 overflow-auto p-4\">\n {artifact.type === 'IMAGE' && (\n <img\n src={artifact.url}\n alt={artifact.alt || 'Artifact image'}\n className=\"max-w-full max-h-full object-contain mx-auto\"\n />\n )}\n {artifact.type === 'VIDEO' && (\n <VideoCard\n src={artifact.url || ''}\n aspectRatio=\"video\"\n controls\n className=\"max-w-full max-h-full mx-auto\"\n />\n )}\n {artifact.type === 'AUDIO' && (\n <AudioCard\n src={artifact.url || ''}\n controls\n className=\"max-w-xl mx-auto\"\n />\n )}\n {artifact.type === 'PDF' && (\n <PdfCard\n src={artifact.url || ''}\n className=\"h-full border-0\"\n />\n )}\n {artifact.type === 'TEXT' && (\n <MarkdownContent\n content={artifact.inlineContent || ''}\n isMarkdown={artifact.mimeType !== 'text/plain'}\n className={cx(\n \"prose prose-invert max-w-none\",\n artifact.mimeType === 'text/plain' && \"whitespace-pre-wrap\"\n )}\n />\n )}\n {artifact.type === 'SCRIPT' && artifact.scriptElements && (\n <ScriptCard\n elements={artifact.scriptElements}\n maxHeight=\"100%\"\n className=\"max-w-3xl mx-auto border-0\"\n />\n )}\n </div>\n </div>\n </div>\n )\n}\n\n/**\n * Renders a single node according to its type.\n */\nfunction NodeRenderer({\n node,\n loading,\n onExpandArtifact,\n onGroupClick,\n}: {\n node: ArtifactNode\n loading?: CardSlotLoading\n onExpandArtifact: (artifact: Artifact) => void\n onGroupClick: (node: ArtifactNode) => void\n}) {\n if (node.type === 'ARTIFACT' && node.artifact) {\n return (\n <ArtifactCard\n artifact={node.artifact}\n loading={loading}\n onExpand={onExpandArtifact}\n />\n )\n }\n\n if (node.type === 'GROUP') {\n return <ArtifactGroup node={node} onClick={onGroupClick}/>\n }\n\n if (node.type === 'VARIANT_SET') {\n return (\n <ArtifactVariantStack\n node={node}\n onExpandArtifact={onExpandArtifact}\n onGroupClick={onGroupClick}\n />\n )\n }\n\n return null\n}\n\n/**\n * ArtifactsPanel displays artifacts in a navigable tree panel.\n *\n * This is a content-only component — it fills whatever container it is\n * placed in. Opening/closing and resizing are handled by the parent\n * ToolPanelContainer and ToolSidebar.\n *\n * Groups can be entered (breadcrumb navigation) and artifact nodes\n * can be expanded to a full-screen modal.\n *\n * Supports zoom controls (0.25x–1x). Zoom uses CSS `transform: scale()`\n * on the content wrapper so the entire layout scales uniformly — cards,\n * images, gaps, and text all shrink as if the viewer is physically\n * moving back from the content.\n */\nexport const ArtifactsPanel = React.forwardRef<HTMLDivElement, ArtifactsPanelProps>(\n ({\n nodes,\n loading,\n className,\n ...rest\n }, ref) => {\n const [expandedArtifact, setExpandedArtifact] = useState<Artifact | null>(null)\n const [zoomIndex, setZoomIndex] = useState<number>(ZOOM_LEVELS.length - 1) // default 1.0\n\n const treeNav = useArtifactTreeNavigation(nodes || [])\n\n const hasNodes = !!nodes && nodes.length > 0\n\n const handleExpandArtifact = useCallback((artifact: Artifact) => {\n setExpandedArtifact(artifact)\n }, [])\n\n const handleGroupClick = useCallback((node: ArtifactNode) => {\n treeNav.navigateInto(node)\n }, [treeNav])\n\n const zoomIn = useCallback(() => {\n setZoomIndex(prev => Math.min(prev + 1, ZOOM_LEVELS.length - 1))\n }, [])\n\n const zoomOut = useCallback(() => {\n setZoomIndex(prev => Math.max(prev - 1, 0))\n }, [])\n\n const currentZoom = ZOOM_LEVELS[zoomIndex]\n\n // Measure content height so the scroll container can shrink to match the scaled visual height\n const contentRef = useRef<HTMLDivElement>(null)\n const [contentHeight, setContentHeight] = useState<number | undefined>(undefined)\n\n useEffect(() => {\n const el = contentRef.current\n if (!el) return\n const observer = new ResizeObserver(([entry]) => {\n setContentHeight(entry.contentRect.height)\n })\n observer.observe(el)\n return () => observer.disconnect()\n }, [])\n\n return (\n <>\n <div\n ref={ref}\n data-testid=\"artifacts-panel\"\n className={cx(\n 'h-full flex flex-col relative',\n className\n )}\n {...rest}\n >\n {/* Header with title and zoom controls */}\n <div\n className=\"flex items-center justify-between p-4 border-b border-ash/40 shrink-0\">\n <h3 className=\"text-sm font-semibold text-white\">Artifacts</h3>\n {hasNodes && (\n <div\n className=\"flex items-center gap-0.5\"\n data-testid=\"zoom-controls\"\n >\n <button\n onClick={zoomOut}\n disabled={zoomIndex === 0}\n className={cx(\n 'w-6 h-6 flex items-center justify-center text-xs font-bold',\n 'bg-charcoal border border-ash/40',\n zoomIndex === 0\n ? 'text-silver/30 cursor-not-allowed'\n : 'text-silver hover:text-gold hover:border-gold/40 transition-colors',\n )}\n aria-label=\"Zoom out\"\n >\n −\n </button>\n <span className=\"text-xs text-silver w-8 text-center tabular-nums\" data-testid=\"zoom-level\">\n {Math.round(currentZoom * 100)}%\n </span>\n <button\n onClick={zoomIn}\n disabled={zoomIndex === ZOOM_LEVELS.length - 1}\n className={cx(\n 'w-6 h-6 flex items-center justify-center text-xs font-bold',\n 'bg-charcoal border border-ash/40',\n zoomIndex === ZOOM_LEVELS.length - 1\n ? 'text-silver/30 cursor-not-allowed'\n : 'text-silver hover:text-gold hover:border-gold/40 transition-colors',\n )}\n aria-label=\"Zoom in\"\n >\n +\n </button>\n </div>\n )}\n </div>\n\n {/* Breadcrumb trail (tree mode only, when not at root) */}\n {hasNodes && !treeNav.isAtRoot && (\n <nav\n className=\"flex items-center gap-1 px-4 py-2 border-b border-ash/40 shrink-0 overflow-x-auto text-xs\"\n aria-label=\"Breadcrumb\"\n data-testid=\"breadcrumb-nav\"\n >\n {treeNav.breadcrumbs.map((crumb, i) => {\n const isLast = i === treeNav.breadcrumbs.length - 1\n return (\n <span key={i} className=\"flex items-center gap-1 shrink-0\">\n {i > 0 && (\n <ChevronRightIcon className=\"w-3 h-3 text-silver/50\" aria-hidden/>\n )}\n {isLast ? (\n <span className=\"text-gold font-medium\">{crumb.label}</span>\n ) : (\n <button\n onClick={() => treeNav.navigateTo(i)}\n className=\"text-silver hover:text-white transition-colors\"\n >\n {crumb.label}\n </button>\n )}\n </span>\n )\n })}\n </nav>\n )}\n\n {/* Content area — single column, natural widths, scrollable */}\n <div\n className=\"flex-1 overflow-auto relative\"\n data-testid=\"artifacts-scroll-area\"\n >\n {/* Sizer div: collapses to the scaled height so scrollbar tracks correctly */}\n <div\n style={currentZoom !== 1 && contentHeight !== undefined\n ? { height: contentHeight * currentZoom }\n : undefined\n }\n >\n <div\n ref={contentRef}\n data-testid=\"artifacts-grid\"\n className=\"p-4 space-y-4\"\n style={currentZoom !== 1\n ? {\n transform: `scale(${currentZoom})`,\n transformOrigin: 'top center',\n }\n : undefined\n }\n >\n {treeNav.currentNodes.length === 0 ? (\n <p className=\"text-xs text-silver/60 text-center py-8\">\n {hasNodes ? 'Empty group' : 'No artifacts to display'}\n </p>\n ) : (\n treeNav.currentNodes.map((node) => (\n <NodeRenderer\n key={node.id}\n node={node}\n loading={loading}\n onExpandArtifact={handleExpandArtifact}\n onGroupClick={handleGroupClick}\n />\n ))\n )}\n </div>\n </div>\n </div>\n\n </div>\n\n {/* Modal for expanded artifact */}\n {expandedArtifact && (\n <ArtifactModal\n artifact={expandedArtifact}\n onClose={() => setExpandedArtifact(null)}\n />\n )}\n </>\n )\n }\n)\n\nArtifactsPanel.displayName = 'ArtifactsPanel'\n\n/**\n * Toggle button to expand collapsed artifacts panel\n */\nexport interface ArtifactsPanelToggleProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n artifactCount?: number\n onExpand?: () => void\n}\n\nexport const ArtifactsPanelToggle = React.forwardRef<\n HTMLButtonElement,\n ArtifactsPanelToggleProps\n>(({artifactCount = 0, onExpand, className, ...rest}, ref) => {\n return (\n <button\n ref={ref}\n onClick={onExpand}\n className={cx(\n 'p-2',\n 'bg-charcoal/80 border border-ash/40',\n 'text-silver hover:text-white hover:bg-ash/20',\n 'transition-colors duration-150',\n 'flex items-center gap-2',\n 'relative',\n className\n )}\n aria-label=\"Expand artifacts panel\"\n {...rest}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n className=\"w-5 h-5\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M2 4.5A1.5 1.5 0 013.5 3h13A1.5 1.5 0 0118 4.5v11a1.5 1.5 0 01-1.5 1.5h-13A1.5 1.5 0 012 15.5v-11zM4 5v1h1V5H4zm2 0v1h1V5H6zm7 0v1h1V5h-1zm2 0v1h1V5h-1zM4 14v1h1v-1H4zm2 0v1h1v-1H6zm7 0v1h1v-1h-1zm2 0v1h1v-1h-1zM8 8.118a.5.5 0 01.757-.429l4 2.382a.5.5 0 010 .858l-4 2.382A.5.5 0 018 12.882V8.118z\"\n clipRule=\"evenodd\"\n />\n </svg>\n {artifactCount > 0 && (\n <span\n className=\"absolute -top-1 -right-1 w-4 h-4 bg-gold text-obsidian text-xs font-medium flex items-center justify-center\">\n {artifactCount}\n </span>\n )}\n </button>\n )\n})\n\nArtifactsPanelToggle.displayName = 'ArtifactsPanelToggle'\n","import React from 'react'\nimport {type CardSlotLoading} from './Card'\nimport {ImageCard} from './ImageCard'\nimport {VideoCard} from './VideoCard'\nimport {AudioCard} from './AudioCard'\nimport {PdfCard} from './PdfCard'\nimport {ScriptCard, type ScriptElement} from './ScriptCard'\nimport {TextCard} from './TextCard'\nimport {ExpandIcon} from './icons'\nimport {cx} from '../utils'\nimport {deriveCardSlotLoading} from '../utils/artifactLoading'\n\n/**\n * Artifact types supported by the system\n */\nexport const ARTIFACT_TYPES = {\n TEXT: 'TEXT',\n IMAGE: 'IMAGE',\n VIDEO: 'VIDEO',\n AUDIO: 'AUDIO',\n SCRIPT: 'SCRIPT',\n PDF: 'PDF',\n} as const\n\nexport type ArtifactType = typeof ARTIFACT_TYPES[keyof typeof ARTIFACT_TYPES]\n\nexport interface Artifact {\n id: string\n type: ArtifactType\n /**\n * For text artifacts - the content (markdown, HTML, or plain text)\n */\n inlineContent?: string\n /**\n * For artifacts that source from a URL (image, video, audio, pdf, file)\n */\n url?: string\n /**\n * The mime type of the content\n */\n mimeType?: string\n /**\n * For image artifacts - alt text\n */\n alt?: string\n /**\n * Display title shown below the artifact\n */\n title?: string\n /**\n * Display subtitle shown below the title\n */\n subtitle?: string\n /**\n * Whether this artifact is still loading (shows skeleton)\n */\n isPending?: boolean\n /**\n * Whether the artifact should span full width in the grid\n */\n fullWidth?: boolean\n /**\n * For html artifacts - structured script elements (used by ScriptCard)\n */\n scriptElements?: ScriptElement[]\n}\n\nexport interface ArtifactCardProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * The artifact object to display\n */\n artifact: Artifact\n /**\n * Callback when the artifact should be expanded/opened\n */\n onExpand?: (artifact: Artifact) => void\n /**\n * Whether the artifact is still loading\n */\n loading?: CardSlotLoading\n}\n\n/**\n * A dispatcher component that renders the appropriate specialist card\n * based on the artifact type.\n */\nexport const ArtifactCard = React.forwardRef<HTMLDivElement, ArtifactCardProps>(\n ({artifact, onExpand, loading, className, ...props}, ref) => {\n const derivedLoading = deriveCardSlotLoading(artifact)\n const commonProps = {\n title: artifact.title,\n subtitle: artifact.subtitle,\n loading: loading || derivedLoading,\n className: 'w-full',\n }\n\n const handleExpand = (e: React.MouseEvent) => {\n e.stopPropagation()\n if (onExpand) {\n onExpand(artifact)\n }\n }\n\n const renderContent = () => {\n switch (artifact.type) {\n case 'IMAGE':\n return (\n <ImageCard\n {...commonProps}\n src={artifact.url}\n alt={artifact.alt}\n aspectRatio=\"landscape\"\n />\n )\n case 'VIDEO':\n return (\n <VideoCard\n {...commonProps}\n src={artifact.url}\n aspectRatio=\"video\"\n controls\n />\n )\n case 'AUDIO':\n return (\n <AudioCard\n {...commonProps}\n src={artifact.url}\n controls\n />\n )\n case 'PDF':\n return (\n <PdfCard\n {...commonProps}\n src={artifact.url}\n />\n )\n case 'SCRIPT':\n return (\n <ScriptCard\n {...commonProps}\n elements={artifact.scriptElements || []}\n maxHeight=\"16rem\"\n />\n )\n case 'TEXT':\n return (\n <TextCard\n {...commonProps}\n content={artifact.inlineContent || ''}\n isMarkdown={artifact.mimeType !== 'text/plain'}\n contentClassName={cx(\n artifact.mimeType === 'text/plain' && \"whitespace-pre-wrap\"\n )}\n />\n )\n default:\n return null\n }\n }\n\n // Determine if the card itself should be clickable to expand\n // Video and Audio have their own controls, so we only expand via the button\n const isCardExpandable = !!onExpand && (\n artifact.type === 'IMAGE' ||\n artifact.type === 'PDF' ||\n artifact.type === 'SCRIPT' ||\n artifact.type === 'TEXT'\n )\n\n return (\n <div\n ref={ref}\n className={cx(\n 'relative group',\n isCardExpandable && 'cursor-pointer',\n artifact.fullWidth && 'col-span-full',\n className\n )}\n onClick={isCardExpandable ? handleExpand : undefined}\n {...props}\n >\n {onExpand && (\n <button\n onClick={handleExpand}\n className={cx(\n 'absolute top-2 right-2 z-10 p-1.5',\n 'bg-obsidian/80 text-silver hover:text-white hover:bg-obsidian',\n 'opacity-0 group-hover:opacity-100 transition-opacity'\n )}\n aria-label=\"Expand artifact\"\n >\n <ExpandIcon className=\"w-4 h-4\"/>\n </button>\n )}\n {renderContent()}\n </div>\n )\n }\n)\n\nArtifactCard.displayName = 'ArtifactCard'\n\nexport default ArtifactCard\n","import React from 'react'\nimport {Card, type CardProps, type CardSlotLoading} from './Card'\nimport {cx} from '../utils'\n\nexport type AspectRatioPreset = 'landscape' | 'portrait' | 'square'\nexport type AspectRatio = AspectRatioPreset | `${number}/${number}`\n\nexport interface ImageCardProps extends Omit<CardProps, 'title'> {\n src?: string\n alt?: string\n title?: React.ReactNode\n subtitle?: React.ReactNode\n aspectRatio?: AspectRatio\n objectFit?: 'cover' | 'contain'\n overlay?: React.ReactNode\n mediaClassName?: string\n contentClassName?: string\n loading?: CardSlotLoading\n}\n\nconst ASPECT_RATIO_PRESETS: Record<AspectRatioPreset, string> = {\n landscape: '3 / 2',\n portrait: '2 / 3',\n square: '1 / 1',\n}\n\nfunction resolveAspectRatio(ratio: AspectRatio): string {\n if (ratio in ASPECT_RATIO_PRESETS) {\n return ASPECT_RATIO_PRESETS[ratio as AspectRatioPreset]\n }\n return ratio.replace('/', ' / ')\n}\n\nexport const ImageCard = React.forwardRef<HTMLDivElement, ImageCardProps>(\n (\n {\n src,\n alt = '',\n title,\n subtitle,\n aspectRatio = 'landscape',\n objectFit = 'cover',\n overlay,\n mediaClassName,\n contentClassName,\n className,\n children,\n loading,\n ...props\n },\n ref\n ) => {\n return (\n <Card\n ref={ref}\n className={cx('p-0 overflow-hidden w-full', className)}\n loading={loading}\n {...props}\n >\n <Card.Media\n className={mediaClassName}\n style={{aspectRatio: resolveAspectRatio(aspectRatio)}}\n >\n <>\n {src && (\n <img\n src={src}\n alt={alt}\n className={cx(\n 'w-full h-full',\n objectFit === 'cover' ? 'object-cover' : 'object-contain'\n )}\n />\n )}\n {overlay && (\n <div\n className=\"absolute inset-0 bg-obsidian/80 opacity-0 group-hover:opacity-100 transition-opacity duration-200 flex items-center justify-center\">\n {overlay}\n </div>\n )}\n </>\n </Card.Media>\n <Card.Header\n title={title}\n subtitle={subtitle}\n className={contentClassName}\n />\n {children && <Card.Body className={contentClassName}>{children}</Card.Body>}\n </Card>\n )\n }\n)\n\nImageCard.displayName = 'ImageCard'","import React from 'react'\nimport ReactPlayer from 'react-player'\nimport {Card, type CardProps, type CardSlotLoading} from './Card'\nimport {cx} from '../utils'\n\nexport type VideoAspectRatioPreset = 'video' | 'cinema' | 'square'\nexport type VideoAspectRatio = VideoAspectRatioPreset | `${number}/${number}`\n\nexport interface VideoCardProps extends Omit<CardProps, 'title'> {\n src?: string\n title?: React.ReactNode\n subtitle?: React.ReactNode\n aspectRatio?: VideoAspectRatio\n playing?: boolean\n controls?: boolean\n light?: boolean | string\n volume?: number\n muted?: boolean\n loop?: boolean\n mediaClassName?: string\n contentClassName?: string\n playerProps?: any\n loading?: CardSlotLoading\n}\n\nconst ASPECT_RATIO_PRESETS: Record<VideoAspectRatioPreset, string> = {\n video: '16 / 9',\n cinema: '21 / 9',\n square: '1 / 1',\n}\n\nfunction resolveAspectRatio(ratio: VideoAspectRatio): string {\n if (ratio in ASPECT_RATIO_PRESETS) {\n return ASPECT_RATIO_PRESETS[ratio as VideoAspectRatioPreset]\n }\n return ratio.replace('/', ' / ')\n}\n\nexport const VideoCard = React.forwardRef<HTMLDivElement, VideoCardProps>(\n (\n {\n src,\n title,\n subtitle,\n aspectRatio = 'video',\n playing = false,\n controls = true,\n light = false,\n volume,\n muted = false,\n loop = false,\n mediaClassName,\n contentClassName,\n className,\n children,\n playerProps,\n loading,\n ...props\n },\n ref\n ) => {\n return (\n <Card\n ref={ref}\n className={cx('p-0 overflow-hidden w-full', className)}\n loading={loading}\n {...props}\n >\n <Card.Media\n className={mediaClassName}\n style={{aspectRatio: resolveAspectRatio(aspectRatio)}}\n >\n {src && (\n <ReactPlayer\n src={src}\n playing={playing}\n controls={controls}\n light={light}\n volume={volume}\n muted={muted}\n loop={loop}\n width=\"100%\"\n height=\"100%\"\n className=\"absolute top-0 left-0\"\n {...playerProps}\n />\n )}\n </Card.Media>\n <Card.Header\n title={title}\n subtitle={subtitle}\n className={contentClassName}\n />\n {children && <Card.Body className={contentClassName}>{children}</Card.Body>}\n </Card>\n )\n }\n)\n\nVideoCard.displayName = 'VideoCard'\n","import React from 'react'\nimport ReactPlayer from 'react-player'\nimport {Music} from 'lucide-react'\nimport {Card, type CardProps, type CardSlotLoading} from './Card'\nimport {cx} from '../utils'\n\nexport interface AudioCardProps extends Omit<CardProps, 'title'> {\n src?: string\n title?: React.ReactNode\n subtitle?: React.ReactNode\n playing?: boolean\n controls?: boolean\n volume?: number\n muted?: boolean\n loop?: boolean\n mediaClassName?: string\n contentClassName?: string\n playerProps?: any\n height?: string | number\n loading?: CardSlotLoading\n}\n\nexport const AudioCard = React.forwardRef<HTMLDivElement, AudioCardProps>(\n (\n {\n src,\n title,\n subtitle,\n playing = false,\n controls = true,\n volume,\n muted = false,\n loop = false,\n mediaClassName,\n contentClassName,\n className,\n children,\n playerProps,\n height = '40px',\n loading,\n ...props\n },\n ref\n ) => {\n return (\n <Card\n ref={ref}\n className={cx('p-0 overflow-hidden w-full', className)}\n loading={loading}\n {...props}\n >\n <Card.Media className={cx('bg-obsidian py-8 flex flex-col items-center justify-center',\n mediaClassName)}>\n <div className=\"mb-4 text-gold\">\n <Music size={48}/>\n </div>\n\n {src && (\n <div className=\"w-full px-4\">\n <ReactPlayer\n src={src}\n playing={playing}\n controls={controls}\n volume={volume}\n muted={muted}\n loop={loop}\n width=\"100%\"\n height={height}\n style={{backgroundColor: 'transparent'}}\n config={{\n file: {\n forceAudio: true,\n attributes: {\n style: {width: '100%', height: height}\n }\n }\n }}\n {...playerProps}\n />\n </div>\n )}\n </Card.Media>\n <Card.Header\n title={title}\n subtitle={subtitle}\n className={contentClassName}\n />\n {children && <Card.Body className={contentClassName}>{children}</Card.Body>}\n </Card>\n )\n }\n)\n\nAudioCard.displayName = 'AudioCard'\n","import React from 'react'\nimport {FileText} from 'lucide-react'\nimport {Card, type CardProps, type CardSlotLoading} from './Card'\nimport {cx} from '../utils'\n\nexport interface PdfCardProps extends Omit<CardProps, 'title'> {\n /**\n * URL of the PDF file\n */\n src?: string\n /**\n * Title of the document\n */\n title?: React.ReactNode\n /**\n * Subtitle or document metadata\n */\n subtitle?: React.ReactNode\n /**\n * Height of the PDF viewer\n */\n height?: string | number\n /**\n * Optional class name for the media container\n */\n mediaClassName?: string\n /**\n * Optional class name for the content container\n */\n contentClassName?: string\n loading?: CardSlotLoading\n}\n\n/**\n * A card for displaying PDF documents with an embedded viewer.\n */\nexport const PdfCard = React.forwardRef<HTMLDivElement, PdfCardProps>(\n (\n {\n src,\n title,\n subtitle,\n height = '400px',\n mediaClassName,\n contentClassName,\n className,\n children,\n loading,\n ...props\n },\n ref\n ) => {\n return (\n <Card\n ref={ref}\n className={cx('p-0 overflow-hidden w-full', className)}\n loading={loading}\n {...props}\n >\n <Card.Media\n className={cx('bg-obsidian', mediaClassName)}\n style={{height}}\n >\n {src && (\n <iframe\n src={`${src}#view=FitH`}\n title={typeof title === 'string' ? title : 'PDF Document'}\n className=\"w-full h-full border-0\"\n />\n )}\n </Card.Media>\n <Card.Header\n title={title}\n subtitle={subtitle}\n className={contentClassName}\n action={\n <div className=\"p-2 bg-ash/20 text-gold shrink-0\">\n <FileText size={20}/>\n </div>\n }\n />\n {children && <Card.Body className={contentClassName}>{children}</Card.Body>}\n </Card>\n )\n }\n)\n\nPdfCard.displayName = 'PdfCard'\n","import React from 'react'\nimport {cx} from '../utils'\n\nimport {Card, type CardProps, type CardSlotLoading} from './Card'\n\n/**\n * Script element types following standard screenplay format\n */\nexport const SCRIPT_ELEMENT_TYPES = {\n SCENE_HEADING: 'scene-heading',\n ACTION: 'action',\n CHARACTER: 'character',\n DIALOGUE: 'dialogue',\n PARENTHETICAL: 'parenthetical',\n TRANSITION: 'transition',\n TITLE: 'title',\n SUBTITLE: 'subtitle',\n} as const\n\nexport type ScriptElementType = typeof SCRIPT_ELEMENT_TYPES[keyof typeof SCRIPT_ELEMENT_TYPES]\n\n/**\n * A single element in the script\n */\nexport interface ScriptElement {\n /**\n * The type of script element (e.g., 'scene-heading', 'character', 'dialogue')\n */\n type: ScriptElementType\n /**\n * The text content of the element\n */\n content: string\n}\n\nexport interface ScriptCardProps extends Omit<CardProps, 'title'> {\n /**\n * Title of the script (shown at top)\n */\n title?: React.ReactNode\n /**\n * Subtitle/metadata (e.g., \"30-second spot • Directed by AI Creative\")\n */\n subtitle?: React.ReactNode\n /**\n * Array of script elements in order.\n * Available types: 'scene-heading', 'action', 'character', 'dialogue', 'parenthetical',\n * 'transition', 'title', 'subtitle'\n */\n elements: ScriptElement[]\n /**\n * Maximum height before scrolling (default: 16rem / 256px)\n */\n maxHeight?: string\n loading?: CardSlotLoading\n}\n\n/**\n * Render a script element with proper formatting\n */\nfunction ScriptElementRenderer({element}: { element: ScriptElement }) {\n switch (element.type) {\n case 'scene-heading':\n return (\n <p className=\"mt-4 mb-2 font-bold uppercase text-gold text-xs tracking-wide\">\n {element.content}\n </p>\n )\n\n case 'action':\n return (\n <p className=\"my-2 text-silver text-xs leading-relaxed\">\n {element.content}\n </p>\n )\n\n case 'character':\n return (\n <p className=\"mt-4 mb-0.5 ml-8 font-bold text-white text-xs uppercase tracking-wide\">\n {element.content}\n </p>\n )\n\n case 'parenthetical':\n return (\n <p className=\"ml-6 text-silver/70 text-xs italic\">\n ({element.content})\n </p>\n )\n\n case 'dialogue':\n return (\n <p className=\"ml-4 mr-8 text-silver text-xs leading-relaxed\">\n {element.content}\n </p>\n )\n\n case 'transition':\n return (\n <p className=\"mt-4 mb-2 text-right font-bold uppercase text-gold/80 text-xs tracking-wide\">\n {element.content}\n </p>\n )\n\n case 'title':\n return (\n <p className=\"mt-6 mb-2 text-center font-bold text-gold text-sm\">\n {element.content}\n </p>\n )\n\n case 'subtitle':\n return (\n <p className=\"text-center italic text-gold/70 text-xs\">\n {element.content}\n </p>\n )\n\n default:\n return null\n }\n}\n\n/**\n * ScriptCard displays a formatted movie/video script.\n *\n * Follows standard screenplay formatting conventions:\n * - Scene headings: uppercase, gold, left-aligned\n * - Action: silver, full width\n * - Character names: uppercase, centered-left\n * - Dialogue: indented from both sides\n * - Transitions: uppercase, right-aligned\n *\n * @example\n * ```tsx\n * <ScriptCard\n * title=\"The Arrival\"\n * elements={[\n * { type: 'scene-heading', content: 'EXT. SPACE STATION - NIGHT' },\n * { type: 'action', content: 'A lone ship approaches the docking bay.' },\n * { type: 'character', content: 'PILOT' },\n * { type: 'dialogue', content: 'Requesting permission to land.' }\n * ]}\n * />\n * ```\n */\nexport const ScriptCard = React.forwardRef<HTMLDivElement, ScriptCardProps>(\n ({title, subtitle, elements, maxHeight = '16rem', className, style, loading, ...rest},\n ref) => {\n return (\n <Card\n ref={ref}\n className={cx('p-0 overflow-hidden w-full', className)}\n loading={loading}\n {...rest}\n >\n <Card.Header\n title={title}\n subtitle={subtitle}\n />\n <Card.Body\n className=\"font-mono overflow-y-auto\"\n style={{maxHeight, ...style}}\n >\n {elements.map((element, index) => (\n <ScriptElementRenderer key={index} element={element}/>\n ))}\n </Card.Body>\n </Card>\n )\n }\n)\n\nScriptCard.displayName = 'ScriptCard'\n\nexport default ScriptCard\n","import React from 'react'\nimport {Card, type CardProps, type CardSlotLoading} from './Card'\nimport {MarkdownContent} from './MarkdownContent'\nimport {cx} from '../utils'\n\nexport interface TextCardProps extends Omit<CardProps, 'title'> {\n /**\n * Text content to display (Markdown, HTML, or plain text)\n */\n content: string\n /**\n * Optional title for the card\n */\n title?: React.ReactNode\n /**\n * Optional subtitle or metadata\n */\n subtitle?: React.ReactNode\n /**\n * Whether the content should be treated as Markdown\n * @default true\n */\n isMarkdown?: boolean\n /**\n * Maximum height of the content area before scrolling\n * @default '16rem'\n */\n maxHeight?: string | number\n /**\n * Optional class name for the content container\n */\n contentClassName?: string\n loading?: CardSlotLoading\n}\n\n/**\n * A card for displaying text content, supporting Markdown and HTML formatting.\n */\nexport const TextCard = React.forwardRef<HTMLDivElement, TextCardProps>(\n (\n {\n content,\n title,\n subtitle,\n isMarkdown = true,\n maxHeight = '16rem',\n contentClassName,\n className,\n loading,\n ...props\n },\n ref\n ) => {\n return (\n <Card\n ref={ref}\n className={cx('p-0 overflow-hidden w-full', className)}\n loading={loading}\n {...props}\n >\n <Card.Header\n title={title}\n subtitle={subtitle}\n />\n <Card.Body\n className={cx('overflow-y-auto', contentClassName)}\n style={{maxHeight}}\n >\n <MarkdownContent\n content={content}\n isMarkdown={isMarkdown}\n className=\"prose-sm prose-invert max-w-none\"\n />\n </Card.Body>\n </Card>\n )\n }\n)\n\nTextCard.displayName = 'TextCard'\n\nexport default TextCard\n","import {Artifact} from '../components'\nimport {CardSlotLoading} from '../components/Card'\n\n/**\n * Centralized policy to derive which card slots should show skeletons\n * based on the artifact's current state and pending status.\n */\nexport function deriveCardSlotLoading(a: Artifact): CardSlotLoading | undefined {\n if (!a.isPending) {\n return undefined\n }\n\n const header = {\n title: !a.title,\n subtitle: !a.subtitle,\n }\n\n const mediaNeeded = (type: string) => ['IMAGE', 'VIDEO', 'AUDIO', 'PDF'].includes(type)\n const media = mediaNeeded(a.type) && !a.url\n\n const body = (\n (a.type === 'TEXT' && !(a.inlineContent && a.inlineContent.trim().length)) ||\n (a.type === 'SCRIPT' && !(a.scriptElements && a.scriptElements.length > 0))\n )\n\n return {header, media, body}\n}\n","import React, {useEffect, useRef, useState} from 'react'\nimport {cx} from '../utils'\nimport {type ArtifactNode} from './ArtifactNode'\nimport {ArtifactCard} from './ArtifactCard'\nimport {Card} from './Card'\n\nexport interface ArtifactGroupProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onClick'> {\n /**\n * The GROUP node to display\n */\n node: ArtifactNode\n /**\n * Called when the group is clicked (e.g. to navigate into it)\n */\n onClick?: (node: ArtifactNode) => void\n}\n\n// Fixed offset for each layer behind the front card\nconst LAYER_OFFSET = '8px'\nconst LAYER_OFFSET_2X = '16px'\n\n/**\n * Renders a GROUP node as a Card with the group label as title. Inside,\n * the first child is shown on top with two offset layers behind it\n * (always shown as a visual symbol for \"group\"). A square count badge\n * shows the total items.\n */\nexport const ArtifactGroup = React.forwardRef<HTMLDivElement, ArtifactGroupProps>(\n ({node, onClick, className, ...props}, ref) => {\n const children = node.children\n const count = children.length\n const frontChild = children[0]\n\n // Detect count changes and trigger badge animation\n const prevCountRef = useRef(count)\n const [badgePing, setBadgePing] = useState(false)\n\n useEffect(() => {\n if (count !== prevCountRef.current) {\n prevCountRef.current = count\n setBadgePing(true)\n const timer = setTimeout(() => setBadgePing(false), 500)\n return () => clearTimeout(timer)\n }\n }, [count])\n\n const handleClick = () => {\n if (onClick) {\n onClick(node)\n }\n }\n\n const renderFrontContent = () => {\n if (!frontChild) {\n return (\n <div className=\"w-full aspect-video bg-graphite border border-ash/40 flex items-center justify-center\">\n <span className=\"text-silver text-sm\">Empty group</span>\n </div>\n )\n }\n\n if (frontChild.type === 'ARTIFACT' && frontChild.artifact) {\n return <ArtifactCard artifact={frontChild.artifact} className=\"w-full\"/>\n }\n\n // For nested groups or variant sets, show a label card\n return (\n <div\n className=\"w-full aspect-video bg-graphite border border-gold/30 flex flex-col items-center justify-center gap-2 p-4\">\n <span className=\"text-sm text-silver uppercase tracking-wider\">\n {frontChild.type === 'GROUP' ? 'Group' : 'Variants'}\n </span>\n <span className=\"text-white font-semibold\">{frontChild.label}</span>\n </div>\n )\n }\n\n return (\n <div\n ref={ref}\n className={cx(\n 'cursor-pointer group',\n className\n )}\n onClick={handleClick}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n handleClick()\n }\n }}\n aria-label={`${node.label} — ${count} items`}\n {...props}\n >\n <Card noPadding className=\"p-5\">\n <h3 className=\"text-lg font-semibold text-white m-0 mb-4\">{node.label}</h3>\n {/* Outer wrapper reserves space for the offset layers */}\n <div style={{paddingRight: LAYER_OFFSET_2X, paddingBottom: LAYER_OFFSET_2X}}>\n <div className=\"relative\">\n {/* Back layer */}\n <div\n className=\"absolute inset-0 bg-charcoal border border-ash/30 pointer-events-none\"\n style={{transform: `translate(${LAYER_OFFSET_2X}, ${LAYER_OFFSET_2X})`}}\n aria-hidden=\"true\"\n />\n\n {/* Middle layer */}\n <div\n className=\"absolute inset-0 bg-charcoal border border-ash/40 pointer-events-none\"\n style={{transform: `translate(${LAYER_OFFSET}, ${LAYER_OFFSET})`}}\n aria-hidden=\"true\"\n />\n\n {/* Front card */}\n <div className=\"relative transition-transform duration-200 group-hover:-translate-y-0.5\">\n {renderFrontContent()}\n </div>\n\n {/* Count badge — square */}\n <div\n className=\"absolute -top-2 -right-2 z-10 min-w-6 h-6 px-1.5 flex items-center justify-center bg-gold text-obsidian text-xs font-bold\"\n style={badgePing ? {animation: 'badge-invert 0.6s ease-in-out'} : undefined}\n >\n {count}\n </div>\n </div>\n </div>\n </Card>\n </div>\n )\n }\n)\n\nArtifactGroup.displayName = 'ArtifactGroup'\n\nexport default ArtifactGroup\n","import React from 'react'\nimport {cx} from '../utils'\nimport {type Artifact} from './ArtifactCard'\nimport {type ArtifactNode} from './ArtifactNode'\nimport {ArtifactCard} from './ArtifactCard'\nimport {ArtifactGroup} from './ArtifactGroup'\nimport {Card} from './Card'\n\nexport interface ArtifactVariantStackProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * The VARIANT_SET node to display\n */\n node: ArtifactNode\n /**\n * Passed through to ArtifactCard children for expand/open behavior\n */\n onExpandArtifact?: (artifact: Artifact) => void\n /**\n * Passed through to ArtifactGroup children for navigation\n */\n onGroupClick?: (node: ArtifactNode) => void\n}\n\n/**\n * Renders a VARIANT_SET node as a Card with the set label as title.\n * Children are displayed in a horizontal row inside the card body.\n * Children handle their own click behavior (expand for artifacts,\n * navigate for groups).\n */\nexport const ArtifactVariantStack = React.forwardRef<HTMLDivElement, ArtifactVariantStackProps>(\n ({node, onExpandArtifact, onGroupClick, className, ...props}, ref) => {\n const children = node.children\n\n const renderChild = (child: ArtifactNode) => {\n if (child.type === 'ARTIFACT' && child.artifact) {\n return (\n <div key={child.id} className=\"flex-1 min-w-0\">\n <ArtifactCard\n artifact={child.artifact}\n onExpand={onExpandArtifact}\n className=\"w-full\"\n />\n </div>\n )\n }\n\n if (child.type === 'GROUP') {\n return (\n <div key={child.id} className=\"flex-1 min-w-0\">\n <ArtifactGroup node={child} onClick={onGroupClick}/>\n </div>\n )\n }\n\n // Nested variant set placeholder\n return (\n <div key={child.id} className=\"flex-1 min-w-0\">\n <div\n className=\"aspect-video bg-graphite border border-gold/30 flex flex-col items-center justify-center gap-2 p-4\">\n <span className=\"text-xs text-silver uppercase tracking-wider\">Variants</span>\n <span className=\"text-sm text-white font-semibold truncate max-w-full\">\n {child.label}\n </span>\n </div>\n </div>\n )\n }\n\n return (\n <Card\n ref={ref}\n noPadding\n className={cx('w-full p-5', className)}\n {...props}\n >\n <h3 className=\"text-lg font-semibold text-white m-0 mb-4\">{node.label}</h3>\n <div className=\"flex gap-3\">\n {children.map(renderChild)}\n </div>\n </Card>\n )\n }\n)\n\nArtifactVariantStack.displayName = 'ArtifactVariantStack'\n\nexport default ArtifactVariantStack\n","import {useCallback, useMemo, useState} from 'react'\nimport type {ArtifactNode} from '../../ArtifactNode'\n\n/**\n * A breadcrumb entry representing one level of navigation depth.\n */\nexport interface BreadcrumbEntry {\n /** Display label for this level */\n label: string\n /** The group node at this level (null for root) */\n node: ArtifactNode | null\n}\n\n/**\n * Return type for the useArtifactTreeNavigation hook.\n */\nexport interface UseArtifactTreeNavigationReturn {\n /** Nodes to display at the current navigation level */\n currentNodes: ArtifactNode[]\n /** Breadcrumb trail from root to current level */\n breadcrumbs: BreadcrumbEntry[]\n /** Whether the user is at the root level */\n isAtRoot: boolean\n /** Navigate into a group node, pushing it onto the stack */\n navigateInto: (node: ArtifactNode) => void\n /** Navigate to a specific breadcrumb level by index */\n navigateTo: (index: number) => void\n /** Navigate back one level */\n navigateBack: () => void\n}\n\n/**\n * Manages navigation state for an artifact tree panel.\n * Maintains a stack of group nodes the user has navigated into,\n * deriving children from the node references themselves.\n */\nexport function useArtifactTreeNavigation(rootNodes: ArtifactNode[]): UseArtifactTreeNavigationReturn {\n // Stack of group nodes the user has drilled into (empty = at root)\n const [stack, setStack] = useState<ArtifactNode[]>([])\n\n const currentNodes = useMemo(() => {\n if (stack.length === 0) return rootNodes\n return stack[stack.length - 1].children\n }, [rootNodes, stack])\n\n const breadcrumbs = useMemo<BreadcrumbEntry[]>(() => {\n const entries: BreadcrumbEntry[] = [{label: 'Project', node: null}]\n for (const node of stack) {\n entries.push({label: node.label, node})\n }\n return entries\n }, [stack])\n\n const isAtRoot = stack.length === 0\n\n const navigateInto = useCallback((node: ArtifactNode) => {\n setStack(prev => [...prev, node])\n }, [])\n\n const navigateTo = useCallback((index: number) => {\n // index 0 = root, so slice to 0 clears the stack\n setStack(prev => prev.slice(0, index))\n }, [])\n\n const navigateBack = useCallback(() => {\n setStack(prev => prev.slice(0, -1))\n }, [])\n\n return {\n currentNodes,\n breadcrumbs,\n isAtRoot,\n navigateInto,\n navigateTo,\n navigateBack,\n }\n}\n","import React, {useMemo} from 'react'\nimport {cx} from '../../utils'\nimport {CheckSquareIcon, CrossSquareIcon, EmptySquareIcon, SquareLoaderIcon,} from '../icons'\n\nexport const TASK_STATUSES = {\n PENDING: 'pending',\n IN_PROGRESS: 'in_progress',\n DONE: 'done',\n CANCELLED: 'cancelled',\n FAILED: 'failed',\n} as const\n\nexport type TaskStatus = typeof TASK_STATUSES[keyof typeof TASK_STATUSES]\n\nexport interface Task {\n /**\n * Unique identifier for the task\n */\n id: string\n /**\n * Task description text\n */\n label: string\n /**\n * Current status of the task\n */\n status: TaskStatus\n /**\n * Optional subtasks (shown when parent is in_progress or done)\n */\n subtasks?: Task[]\n}\n\nexport interface TodosListProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Array of tasks to display\n */\n tasks: Task[]\n /**\n * Title for the todos list\n * @default \"Tasks\"\n */\n title?: string\n}\n\n/**\n * Get the status icon for a task\n */\nfunction TaskIcon({status}: { status: TaskStatus }) {\n switch (status) {\n case 'done':\n return <CheckSquareIcon/>\n case 'in_progress':\n return <SquareLoaderIcon/>\n case 'cancelled':\n return <CrossSquareIcon variant=\"cancelled\"/>\n case 'failed':\n return <CrossSquareIcon variant=\"failed\"/>\n case 'pending':\n default:\n return <EmptySquareIcon/>\n }\n}\n\n/**\n * Sort tasks so cancelled and failed items appear at the bottom of their group.\n * This sorts in place within the local group, not globally.\n */\nfunction sortTasks(tasks: Task[]): Task[] {\n const normal: Task[] = []\n const bottomItems: Task[] = []\n\n for (const task of tasks) {\n if (task.status === 'cancelled' || task.status === 'failed') {\n bottomItems.push(task)\n } else {\n normal.push(task)\n }\n }\n\n return [...normal, ...bottomItems]\n}\n\n/**\n * Single task item component\n */\nfunction TaskItem({task, depth = 0}: { task: Task; depth?: number }) {\n const isTerminal = task.status === 'done' || task.status === 'cancelled' || task.status\n === 'failed'\n const isSubtle = task.status === 'cancelled' || task.status === 'failed'\n\n // Show subtasks when parent is in_progress or done (to keep showing after completion)\n const showSubtasks = (task.status === 'in_progress' || task.status === 'done') &&\n task.subtasks && task.subtasks.length > 0\n const sortedSubtasks = showSubtasks ? sortTasks(task.subtasks!) : []\n\n return (\n <div className=\"flex flex-col\">\n <div\n className={cx(\n 'flex items-center gap-2 py-1',\n depth > 0 && 'pl-6'\n )}\n >\n <TaskIcon status={task.status}/>\n <span\n className={cx(\n 'text-xs leading-tight transition-colors',\n isTerminal && 'line-through',\n isSubtle ? 'text-silver/50' : 'text-silver',\n task.status === 'in_progress' && 'text-white',\n task.status === 'done' && 'text-silver/70'\n )}\n >\n {task.label}\n {task.status === 'cancelled' && (\n <span className=\"text-silver/40 ml-1\">(cancelled)</span>\n )}\n {task.status === 'failed' && (\n <span className=\"text-error/60 ml-1\">(failed)</span>\n )}\n </span>\n </div>\n\n {/* Render subtasks when parent is in_progress or done */}\n {showSubtasks && (\n <div className=\"flex flex-col\">\n {sortedSubtasks.map((subtask) => (\n <TaskItem key={subtask.id} task={subtask} depth={depth + 1}/>\n ))}\n </div>\n )}\n </div>\n )\n}\n\n/**\n * TodosList displays a structured list of tasks with status indicators.\n *\n * Features:\n * - Nested tasks with indentation\n * - Status indicators: done (checkmark), in_progress (snake animation), pending (empty),\n * cancelled, failed\n * - Done tasks are crossed out with golden checkmark\n * - Cancelled/failed tasks are crossed out with subtle styling and sorted to bottom of their local\n * group\n * - Max 1/4 screen height with scroll\n * - Subtasks appear when parent task is in_progress or done\n *\n * The component automatically sorts cancelled/failed tasks to the bottom of their local group\n * (not globally), so just changing a task's status will reorder it appropriately.\n */\nexport const TodosList = React.forwardRef<HTMLDivElement, TodosListProps>(\n ({tasks, title = 'Tasks', className, ...rest}, ref) => {\n const sortedTasks = useMemo(() => sortTasks(tasks), [tasks])\n\n // Count completed tasks (recursively)\n const countCompleted = (taskList: Task[]): number => {\n let count = 0\n for (const task of taskList) {\n if (task.status === 'done') {\n count++\n }\n if (task.subtasks) {\n count += countCompleted(task.subtasks)\n }\n }\n return count\n }\n\n const countTotal = (taskList: Task[]): number => {\n let count = taskList.length\n for (const task of taskList) {\n if (task.subtasks) {\n count += countTotal(task.subtasks)\n }\n }\n return count\n }\n\n if (tasks.length === 0) {\n return null\n }\n\n return (\n <div\n ref={ref}\n className={cx(\n 'flex flex-col h-full',\n 'overflow-hidden',\n className\n )}\n {...rest}\n >\n {/* Header */}\n <div\n className=\"flex items-center justify-between px-4 py-2 border-b border-ash/40 flex-shrink-0\">\n <h4 className=\"text-xs font-medium text-white\">{title}</h4>\n <span className=\"text-xs text-silver/60\">\n {countCompleted(tasks)}/{countTotal(tasks)}\n </span>\n </div>\n\n {/* Tasks list */}\n <div className=\"flex-1 overflow-y-auto px-4 py-2\">\n {sortedTasks.map((task) => (\n <TaskItem key={task.id} task={task}/>\n ))}\n </div>\n </div>\n )\n }\n)\n\nTodosList.displayName = 'TodosList'\n\n/**\n * Returns true when every task (and subtask, recursively) is in a\n * terminal state: done, cancelled, or failed. Returns true for empty arrays.\n */\nexport function areAllTasksSettled(tasks: Task[]): boolean {\n return tasks.every(t => {\n const settled = t.status === 'done' || t.status === 'cancelled' || t.status === 'failed'\n if (!settled) return false\n if (t.subtasks && t.subtasks.length > 0) return areAllTasksSettled(t.subtasks)\n return true\n })\n}\n\nexport default TodosList\n","import React from 'react'\nimport {cx} from '../../utils'\n\n/**\n * Position group for a tool — combines vertical position (top/bottom)\n * with sidebar side (left/right).\n */\nexport type ToolGroup = 'top-left' | 'bottom-left' | 'top-right' | 'bottom-right'\n\n/**\n * Describes a tool that can be toggled from the sidebar.\n */\nexport interface ToolDefinition {\n /**\n * Unique identifier for this tool\n */\n id: string\n /**\n * Icon element shown in the sidebar button\n */\n icon: React.ReactNode\n /**\n * Accessible label for the button\n */\n label: string\n /**\n * Which group the tool belongs to — tools in the same group\n * are mutually exclusive (opening one closes the other).\n */\n group: ToolGroup\n}\n\n/**\n * Consumer-provided tool definition passed via ChatInterface's `tools` prop.\n * Defines a custom tool with its sidebar icon and the panel content to\n * render when the tool is opened.\n */\nexport interface ExternalToolDefinition {\n /**\n * Unique identifier for this tool\n */\n id: string\n /**\n * Icon element shown in the sidebar button\n */\n icon: React.ReactNode\n /**\n * Accessible label for the button\n */\n label: string\n /**\n * Which group the tool belongs to\n */\n group: ToolGroup\n /**\n * Content to render when the tool is open\n */\n content: React.ReactNode\n}\n\n/**\n * Tracks which tool is open in each group (null = none).\n */\nexport interface ToolPanelState {\n 'top-left': string | null\n 'bottom-left': string | null\n 'top-right': string | null\n 'bottom-right': string | null\n}\n\nexport interface ToolSidebarProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Available tool definitions\n */\n tools: ToolDefinition[]\n /**\n * Current state — which tool is open per group\n */\n activeTools: ToolPanelState\n /**\n * Called when a tool button is clicked (toggle)\n */\n onToggleTool: (toolId: string) => void\n /**\n * Which side this sidebar is on — controls border direction\n */\n side: 'left' | 'right'\n}\n\n/**\n * ToolSidebar renders a vertical strip of tool icon buttons on either\n * side of the chat interface. It follows the IntelliJ pattern:\n *\n * - Top-aligned group and bottom-aligned group separated by a divider\n * - Tools in the same group are mutually exclusive\n * - Clicking an active tool closes it; clicking an inactive tool opens it\n * - Constant slim width regardless of tool panel state\n * - Can be placed on left or right side via the `side` prop\n */\nexport const ToolSidebar = React.forwardRef<HTMLDivElement, ToolSidebarProps>(\n ({tools, activeTools, onToggleTool, side, className, ...rest}, ref) => {\n const topTools = tools.filter(t => t.group === `top-${side}`)\n const bottomTools = tools.filter(t => t.group === `bottom-${side}`)\n\n const isActive = (toolId: string) => {\n const tool = tools.find(t => t.id === toolId)\n if (!tool) return false\n return activeTools[tool.group] === toolId\n }\n\n const renderButton = (tool: ToolDefinition) => {\n const active = isActive(tool.id)\n return (\n <button\n key={tool.id}\n onClick={() => onToggleTool(tool.id)}\n className={cx(\n 'w-8 h-8 flex items-center justify-center transition-colors duration-150',\n active\n ? 'bg-gold/15 text-gold border border-gold/30'\n : 'text-silver hover:text-white hover:bg-ash/20'\n )}\n aria-label={tool.label}\n aria-pressed={active}\n >\n <span className=\"w-4 h-4 block\">\n {tool.icon}\n </span>\n </button>\n )\n }\n\n return (\n <div\n ref={ref}\n className={cx(\n 'h-full w-9 bg-charcoal/80 flex flex-col items-center shrink-0 py-2',\n side === 'left' ? 'border-r border-ash/40' : 'border-l border-ash/40',\n className\n )}\n {...rest}\n >\n {/* Top-aligned tools */}\n <div className=\"flex flex-col items-center gap-1\">\n {topTools.map(renderButton)}\n </div>\n\n {/* Spacer + separator */}\n <div className=\"flex-1 flex items-center justify-center\">\n <div className=\"w-5 border-t border-ash/30\"/>\n </div>\n\n {/* Bottom-aligned tools */}\n <div className=\"flex flex-col items-center gap-1\">\n {bottomTools.map(renderButton)}\n </div>\n </div>\n )\n }\n)\n\nToolSidebar.displayName = 'ToolSidebar'\n","import React, {useCallback, useEffect, useRef, useState} from 'react'\nimport {cx} from '../../utils'\n\nexport interface ToolPanelContainerProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Content for the top tool slot (from the top group).\n * When null, the bottom slot takes full height.\n */\n topContent: React.ReactNode | null\n /**\n * Content for the bottom tool slot (from the bottom group).\n * When null, the top slot takes full height.\n */\n bottomContent: React.ReactNode | null\n /**\n * Panel width as CSS value (e.g., \"50vw\")\n */\n width?: string\n /**\n * Callback to start horizontal resizing (width dragger)\n */\n onResizeStart?: (e: React.MouseEvent) => void\n /**\n * Which side this panel is on — controls border and resize handle position\n */\n side?: 'left' | 'right'\n}\n\n/**\n * ToolPanelContainer manages the layout of one or two tool panels\n * stacked vertically. When both top and bottom slots are filled, a\n * height-adjustable divider appears between them.\n *\n * It also renders the width-resize handle on its left edge, identical\n * to the previous ArtifactsPanel resize behavior.\n */\nexport const ToolPanelContainer = React.forwardRef<HTMLDivElement, ToolPanelContainerProps>(\n ({topContent, bottomContent, width, onResizeStart, side = 'right', className, ...rest}, ref) => {\n const [topPercent, setTopPercent] = useState(60)\n const [isResizingHeight, setIsResizingHeight] = useState(false)\n const containerRef = useRef<HTMLDivElement>(null)\n const lastY = useRef<number | null>(null)\n\n const hasBoth = topContent !== null && bottomContent !== null\n\n // Height dragger handlers\n const startHeightResize = useCallback((e: React.MouseEvent) => {\n e.preventDefault()\n setIsResizingHeight(true)\n lastY.current = e.clientY\n }, [])\n\n const stopHeightResize = useCallback(() => {\n setIsResizingHeight(false)\n lastY.current = null\n }, [])\n\n const resizeHeight = useCallback(\n (e: MouseEvent) => {\n if (!isResizingHeight || lastY.current === null || !containerRef.current) return\n\n const containerHeight = containerRef.current.getBoundingClientRect().height\n if (containerHeight === 0) return\n\n const deltaY = e.clientY - lastY.current\n const deltaPercent = (deltaY / containerHeight) * 100\n\n setTopPercent(prev => {\n const next = prev + deltaPercent\n return Math.min(Math.max(next, 20), 80)\n })\n\n lastY.current = e.clientY\n },\n [isResizingHeight]\n )\n\n useEffect(() => {\n if (isResizingHeight) {\n window.addEventListener('mousemove', resizeHeight)\n window.addEventListener('mouseup', stopHeightResize)\n document.body.style.cursor = 'row-resize'\n document.body.style.userSelect = 'none'\n } else {\n window.removeEventListener('mousemove', resizeHeight)\n window.removeEventListener('mouseup', stopHeightResize)\n document.body.style.cursor = ''\n document.body.style.userSelect = ''\n }\n\n return () => {\n window.removeEventListener('mousemove', resizeHeight)\n window.removeEventListener('mouseup', stopHeightResize)\n document.body.style.cursor = ''\n document.body.style.userSelect = ''\n }\n }, [isResizingHeight, resizeHeight, stopHeightResize])\n\n return (\n <div\n ref={(node) => {\n // Merge forwarded ref and internal ref\n (containerRef as React.MutableRefObject<HTMLDivElement | null>).current = node\n if (typeof ref === 'function') ref(node)\n else if (ref) (ref as React.MutableRefObject<HTMLDivElement | null>).current = node\n }}\n className={cx(\n 'h-full bg-charcoal/50 flex flex-col relative shrink-0',\n side === 'left' ? 'border-r border-ash/40' : 'border-l border-ash/40',\n className\n )}\n style={width ? {width} : undefined}\n {...rest}\n >\n {/* Width resize handle */}\n <div\n onMouseDown={onResizeStart}\n className={cx(\n 'absolute top-0 w-1 h-full cursor-col-resize z-50',\n 'hover:bg-gold/50 transition-colors',\n side === 'left'\n ? 'right-0 after:absolute after:inset-y-0 after:-right-1 after:w-2'\n : 'left-0 after:absolute after:inset-y-0 after:-left-1 after:w-2'\n )}\n />\n\n {/* Top slot */}\n {topContent !== null && (\n <div\n className=\"min-h-0 overflow-hidden flex flex-col\"\n style={hasBoth ? {height: `${topPercent}%`} : {flex: '1 1 0%'}}\n >\n {topContent}\n </div>\n )}\n\n {/* Height dragger — only when both slots are filled */}\n {hasBoth && (\n <div\n onMouseDown={startHeightResize}\n className={cx(\n 'h-1 cursor-row-resize z-50 shrink-0',\n 'bg-ash/40 hover:bg-gold/50 transition-colors',\n 'relative',\n 'after:absolute after:-top-1 after:left-0 after:right-0 after:h-3'\n )}\n />\n )}\n\n {/* Bottom slot */}\n {bottomContent !== null && (\n <div\n className=\"min-h-0 overflow-hidden flex flex-col\"\n style={hasBoth ? {height: `${100 - topPercent}%`} : {flex: '1 1 0%'}}\n >\n {bottomContent}\n </div>\n )}\n </div>\n )\n }\n)\n\nToolPanelContainer.displayName = 'ToolPanelContainer'\n","import {useCallback, useEffect, useRef, useState} from 'react'\n\ninterface UseResizableProps {\n /**\n * Initial width as percentage of viewport (0-100)\n */\n initialWidthPercent: number\n /**\n * Minimum width as percentage of viewport (0-100)\n */\n minWidthPercent: number\n /**\n * Maximum width as percentage of viewport (0-100)\n */\n maxWidthPercent: number\n /**\n * Direction to resize from\n */\n direction: 'left' | 'right'\n}\n\n/**\n * Hook for resizable panels with percentage-based widths.\n * Returns width as a CSS percentage string (e.g., \"50%\").\n */\nexport function useResizable({\n initialWidthPercent,\n minWidthPercent,\n maxWidthPercent,\n direction,\n}: UseResizableProps) {\n const [widthPercent, setWidthPercent] = useState(initialWidthPercent)\n const [isResizing, setIsResizing] = useState(false)\n const lastX = useRef<number | null>(null)\n\n const startResizing = useCallback((e: React.MouseEvent) => {\n e.preventDefault()\n setIsResizing(true)\n lastX.current = e.clientX\n }, [])\n\n const stopResizing = useCallback(() => {\n setIsResizing(false)\n lastX.current = null\n }, [])\n\n const resize = useCallback(\n (e: MouseEvent) => {\n if (!isResizing || lastX.current === null) {\n return\n }\n\n const deltaX = e.clientX - lastX.current\n const factor = direction === 'right' ? 1 : -1\n // Convert pixel delta to percentage of viewport\n const deltaPercent = (deltaX / window.innerWidth) * 100\n\n setWidthPercent((prevPercent) => {\n const newPercent = prevPercent + deltaPercent * factor\n return Math.min(Math.max(newPercent, minWidthPercent), maxWidthPercent)\n })\n\n lastX.current = e.clientX\n },\n [isResizing, direction, minWidthPercent, maxWidthPercent]\n )\n\n useEffect(() => {\n if (isResizing) {\n window.addEventListener('mousemove', resize)\n window.addEventListener('mouseup', stopResizing)\n document.body.style.cursor = 'col-resize'\n document.body.style.userSelect = 'none'\n } else {\n window.removeEventListener('mousemove', resize)\n window.removeEventListener('mouseup', stopResizing)\n document.body.style.cursor = ''\n document.body.style.userSelect = ''\n }\n\n return () => {\n window.removeEventListener('mousemove', resize)\n window.removeEventListener('mouseup', stopResizing)\n document.body.style.cursor = ''\n document.body.style.userSelect = ''\n }\n }, [isResizing, resize, stopResizing])\n\n // Return width as CSS percentage string\n const width = `${widthPercent}vw`\n\n return {width, widthPercent, isResizing, startResizing}\n}\n","import React, {useCallback, useState} from 'react'\nimport {cx} from '../../utils/cx'\nimport {Check, Copy, Pencil, RotateCcw, Send, X,} from 'lucide-react'\n\nexport type MessageActionsVariant = 'user' | 'assistant'\n\nexport interface MessageActionsProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Whether this is for a user or assistant message\n */\n variant: MessageActionsVariant\n /**\n * The message content for copy functionality\n */\n content: string\n /**\n * Called when user wants to edit their message\n * Consumer should handle creating a branch with the edited content\n */\n onEdit?: (newContent: string) => void\n /**\n * Called when user wants to retry/regenerate the assistant response\n * Consumer should handle creating a branch with a new response\n */\n onRetry?: () => void\n /**\n * Whether the message is currently being edited\n */\n isEditing?: boolean\n /**\n * Callback to set editing state (controlled from parent)\n */\n onEditingChange?: (isEditing: boolean) => void\n /**\n * Initial content for the edit input (defaults to content prop)\n */\n editValue?: string\n}\n\nconst ActionButton: React.FC<{\n onClick: () => void\n label: string\n children: React.ReactNode\n className?: string\n disabled?: boolean\n}> = ({onClick, label, children, className, disabled}) => (\n <button\n type=\"button\"\n onClick={onClick}\n disabled={disabled}\n className={cx(\n 'p-1.5 text-silver/60 hover:text-silver transition-colors duration-150',\n 'hover:bg-white/5 ',\n 'disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:bg-transparent',\n className\n )}\n aria-label={label}\n >\n {children}\n </button>\n)\n\nexport const MessageActions = React.forwardRef<HTMLDivElement, MessageActionsProps>(\n (\n {\n variant,\n content,\n onEdit,\n onRetry,\n isEditing: controlledIsEditing,\n onEditingChange,\n editValue: controlledEditValue,\n className,\n ...rest\n },\n ref\n ) => {\n // Local state for uncontrolled mode\n const [localIsEditing, setLocalIsEditing] = useState(false)\n const [localEditValue, setLocalEditValue] = useState(content)\n const [copied, setCopied] = useState(false)\n\n // Determine if controlled or uncontrolled\n const isEditing = controlledIsEditing ?? localIsEditing\n const editValue = controlledEditValue ?? localEditValue\n\n const setIsEditing = useCallback(\n (value: boolean) => {\n if (onEditingChange) {\n onEditingChange(value)\n } else {\n setLocalIsEditing(value)\n }\n },\n [onEditingChange]\n )\n\n const setEditValue = useCallback((value: string) => {\n setLocalEditValue(value)\n }, [])\n\n const handleCopy = useCallback(async () => {\n try {\n await navigator.clipboard.writeText(content)\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n } catch {\n // Fallback for older browsers\n const textArea = document.createElement('textarea')\n textArea.value = content\n document.body.appendChild(textArea)\n textArea.select()\n document.execCommand('copy')\n document.body.removeChild(textArea)\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n }\n }, [content])\n\n const handleStartEdit = useCallback(() => {\n setLocalEditValue(content)\n setIsEditing(true)\n }, [content, setIsEditing])\n\n const handleCancelEdit = useCallback(() => {\n setIsEditing(false)\n setLocalEditValue(content)\n }, [content, setIsEditing])\n\n const handleSubmitEdit = useCallback(() => {\n const trimmed = editValue.trim()\n if (trimmed && trimmed !== content) {\n onEdit?.(trimmed)\n }\n setIsEditing(false)\n }, [editValue, content, onEdit, setIsEditing])\n\n const handleEditKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n handleSubmitEdit()\n } else if (e.key === 'Escape') {\n handleCancelEdit()\n }\n },\n [handleSubmitEdit, handleCancelEdit]\n )\n\n const isUser = variant === 'user'\n\n // Render edit mode inline\n if (isUser && isEditing) {\n return (\n <div\n ref={ref}\n className={cx('mt-2', className)}\n {...rest}\n >\n <div\n className=\"relative bg-charcoal border border-ash/60 focus-within:border-gold/60 focus-within:ring-1 focus-within:ring-gold/20\">\n <textarea\n value={editValue}\n onChange={(e) => setEditValue(e.target.value)}\n onKeyDown={handleEditKeyDown}\n className=\"w-full bg-transparent text-white px-3 py-2 pr-20 resize-none outline-none min-h-16 text-sm\"\n autoFocus\n rows={2}\n />\n <div className=\"absolute right-2 bottom-2 flex gap-1\">\n <ActionButton\n onClick={handleCancelEdit}\n label=\"Cancel edit\"\n className=\"text-silver/60 hover:text-error\"\n >\n <X className=\"w-4 h-4\"/>\n </ActionButton>\n <ActionButton\n onClick={handleSubmitEdit}\n label=\"Submit edit\"\n className=\"text-silver/60 hover:text-gold\"\n disabled={!editValue.trim() || editValue.trim() === content}\n >\n <Send className=\"w-4 h-4\"/>\n </ActionButton>\n </div>\n </div>\n <p className=\"text-xs text-silver/50 mt-1\">\n Press Enter to submit, Esc to cancel. This will create a new branch.\n </p>\n </div>\n )\n }\n\n return (\n <div\n ref={ref}\n className={cx(\n 'flex items-center gap-0.5 mt-1',\n isUser ? 'justify-end' : 'justify-start',\n className\n )}\n {...rest}\n >\n {/* Copy - available for both user and assistant */}\n <ActionButton onClick={handleCopy} label={copied ? 'Copied!' : 'Copy message'}>\n {copied ? (\n <Check className=\"w-3.5 h-3.5 text-success\"/>\n ) : (\n <Copy className=\"w-3.5 h-3.5\"/>\n )}\n </ActionButton>\n\n {/* Edit - only for user messages */}\n {isUser && onEdit && (\n <ActionButton onClick={handleStartEdit} label=\"Edit message\">\n <Pencil className=\"w-3.5 h-3.5\"/>\n </ActionButton>\n )}\n\n {/* Retry - only for assistant messages */}\n {!isUser && onRetry && (\n <ActionButton onClick={onRetry} label=\"Regenerate response\">\n <RotateCcw className=\"w-3.5 h-3.5\"/>\n </ActionButton>\n )}\n </div>\n )\n }\n)\n\nMessageActions.displayName = 'MessageActions'\n\nexport default MessageActions\n","import React from 'react'\nimport {cx} from '../../utils/cx'\nimport {ChevronLeft, ChevronRight, GitBranch} from 'lucide-react'\n\nexport interface BranchNavigatorProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Current branch index (1-based for display)\n */\n current: number\n /**\n * Total number of sibling branches\n */\n total: number\n /**\n * Called when navigating to previous branch\n */\n onPrevious?: () => void\n /**\n * Called when navigating to next branch\n */\n onNext?: () => void\n /**\n * Size variant\n */\n size?: 'sm' | 'md'\n /**\n * Whether to show the branch icon\n */\n showIcon?: boolean\n}\n\n/**\n * BranchNavigator provides a UI for switching between conversation branches.\n * Used in the Message component to navigate sibling branches (e.g., \"1/3\").\n */\nexport const BranchNavigator = React.forwardRef<HTMLDivElement, BranchNavigatorProps>(\n (\n {\n current,\n total,\n onPrevious,\n onNext,\n size = 'sm',\n showIcon = true,\n className,\n ...rest\n },\n ref\n ) => {\n // Don't render if there's only one branch\n if (total <= 1) {\n return null\n }\n\n const isFirst = current <= 1\n const isLast = current >= total\n\n const buttonSize = size === 'sm' ? 'p-0.5' : 'p-1'\n const iconSize = size === 'sm' ? 'w-3 h-3' : 'w-4 h-4'\n const textSize = size === 'sm' ? 'text-xs' : 'text-sm'\n\n return (\n <div\n ref={ref}\n className={cx(\n 'inline-flex items-center gap-0.5 text-silver/70',\n className\n )}\n role=\"navigation\"\n aria-label=\"Branch navigation\"\n {...rest}\n >\n {/* Branch icon */}\n {showIcon && (\n <GitBranch className={cx(iconSize, 'mr-0.5 text-silver/50')} aria-hidden=\"true\"/>\n )}\n\n {/* Previous button */}\n <button\n type=\"button\"\n onClick={onPrevious}\n disabled={isFirst}\n className={cx(\n buttonSize,\n 'hover:text-white hover:bg-white/10 transition-colors',\n 'disabled:opacity-30 disabled:cursor-not-allowed disabled:hover:bg-transparent disabled:hover:text-silver/70'\n )}\n aria-label=\"Previous branch\"\n >\n <ChevronLeft className={iconSize}/>\n </button>\n\n {/* Counter */}\n <span className={cx(textSize, 'tabular-nums min-w-6 text-center')}>\n {current}/{total}\n </span>\n\n {/* Next button */}\n <button\n type=\"button\"\n onClick={onNext}\n disabled={isLast}\n className={cx(\n buttonSize,\n 'hover:text-white hover:bg-white/10 transition-colors',\n 'disabled:opacity-30 disabled:cursor-not-allowed disabled:hover:bg-transparent disabled:hover:text-silver/70'\n )}\n aria-label=\"Next branch\"\n >\n <ChevronRight className={iconSize}/>\n </button>\n </div>\n )\n }\n)\n\nBranchNavigator.displayName = 'BranchNavigator'\n\nexport default BranchNavigator\n","import React from 'react'\nimport {cx} from '../utils/cx'\n\nexport type BrandIconSize = 'sm' | 'md' | 'lg'\nexport type BrandIconVariant = 'solid' | 'outline'\n\nexport interface BrandIconProps extends React.HTMLAttributes<HTMLDivElement> {\n size?: BrandIconSize\n variant?: BrandIconVariant\n}\n\nconst sizeMap: Record<BrandIconSize, string> = {\n sm: 'h-8 w-8 text-sm',\n md: 'h-12 w-12 text-base',\n lg: 'h-16 w-16 text-lg',\n}\n\nexport const BrandIcon = React.forwardRef<HTMLDivElement, BrandIconProps>(\n ({size = 'md', variant = 'solid', children, className, ...rest}, ref) => {\n const variantClasses =\n variant === 'solid'\n ? 'bg-gold text-obsidian border-2 border-gold'\n : 'bg-transparent text-gold border-2 border-gold'\n\n return (\n <div\n ref={ref}\n className={cx(\n 'inline-flex items-center justify-center rounded-none font-bold select-none overflow-hidden',\n sizeMap[size],\n variantClasses,\n className\n )}\n {...rest}\n >\n {children}\n </div>\n )\n }\n)\n\nBrandIcon.displayName = 'BrandIcon'\n\nexport default BrandIcon\n","import React from 'react'\nimport {cx} from '../utils/cx'\n\nexport interface ColorSwatchProps extends React.HTMLAttributes<HTMLDivElement> {\n color: string\n label?: string\n}\n\nexport const ColorSwatch = React.forwardRef<HTMLDivElement, ColorSwatchProps>(\n ({color, label, className, ...rest}, ref) => {\n return (\n <div\n ref={ref}\n className={cx('flex flex-col items-center gap-2', className)}\n {...rest}\n >\n <div\n className=\"h-16 w-16 border-2 border-ash rounded-none shadow-sm\"\n style={{backgroundColor: color}}\n aria-label={label || color}\n />\n {label && (\n <span className=\"text-xs text-silver font-medium\">{label}</span>\n )}\n </div>\n )\n }\n)\n\nColorSwatch.displayName = 'ColorSwatch'\n\nexport default ColorSwatch\n","import React from 'react'\nimport {cx} from '../utils/cx'\n\nexport type SectionHeadingLevel = 'h2' | 'h3'\n\nexport interface SectionHeadingProps extends React.HTMLAttributes<HTMLHeadingElement> {\n level?: SectionHeadingLevel\n}\n\nconst levelStyles = {\n h2: 'text-2xl mb-4',\n h3: 'text-xl mb-3',\n}\n\nexport const SectionHeading = React.forwardRef<HTMLHeadingElement, SectionHeadingProps>(\n ({level = 'h2', children, className, ...rest}, ref) => {\n const Component = level\n\n return (\n <Component\n ref={ref as any}\n className={cx(\n 'text-gold font-semibold tracking-tight',\n levelStyles[level],\n className\n )}\n {...rest}\n >\n {children}\n </Component>\n )\n }\n)\n\nSectionHeading.displayName = 'SectionHeading'\n\nexport default SectionHeading\n","import {type Artifact} from './ArtifactCard'\n\n/**\n * Node types in the artifact tree\n */\nexport const NODE_TYPES = {\n ARTIFACT: 'ARTIFACT',\n GROUP: 'GROUP',\n VARIANT_SET: 'VARIANT_SET',\n} as const\n\nexport type NodeType = typeof NODE_TYPES[keyof typeof NODE_TYPES]\n\n/**\n * A node in the artifact tree. Mirrors the backend ArtifactNode shape.\n * Groups and variant sets contain children; artifact nodes link to content.\n */\nexport interface ArtifactNode {\n /**\n * Unique identifier\n */\n id: string\n /**\n * The node type — ARTIFACT, GROUP, or VARIANT_SET\n */\n type: NodeType\n /**\n * Semantic name (e.g. \"storyboard\", \"protagonist_warm\")\n */\n name: string\n /**\n * Display label (e.g. \"Storyboard\", \"Warm Analog\")\n */\n label: string\n /**\n * For ARTIFACT nodes — the actual content. Null for GROUP and VARIANT_SET.\n */\n artifact?: Artifact\n /**\n * Child nodes (populated for GROUP and VARIANT_SET)\n */\n children: ArtifactNode[]\n}\n"],"mappings":"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","names":["React","import_react","React","import_react","import_react","React","React","import_react","React","import_react","React","import_react","React","import_react","ALIGN_MAP","JUSTIFY_MAP","GAP_MAP","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","import_lucide_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React","e","import_react","React","import_react","import_lucide_react","React","import_react","React","import_react","VARIANT_MAP","React","import_react","import_lucide_react","React","VARIANT_STYLES","import_react","import_react_dom","import_lucide_react","React","import_react","import_react_dom","import_lucide_react","SIZE_MAP","React","import_react","POSITION_CLASSES","React","import_react","React","import_react","React","import_react","import_lucide_react","React","import_react","React","import_react","React","import_react","import_lucide_react","React","import_react","import_lucide_react","React","import_react","import_lucide_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","import_react","DOMPurify","React","variantStyles","React","ChevronLeftIcon","ChevronRightIcon","import_react","React","variantStyles","import_react","import_react","import_react","import_react","import_react","React","React","import_react","import_lucide_react","React","import_react","HistoryIcon","React","ChevronLeftIcon","import_react","import_react","import_react","React","import_react","ASPECT_RATIO_PRESETS","resolveAspectRatio","React","ReactPlayer","import_react","import_react_player","import_lucide_react","React","ReactPlayer","import_react","import_lucide_react","React","import_react","React","import_react","React","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","import_lucide_react","ActionButton","React","import_react","import_lucide_react","React","import_react","sizeMap","React","import_react","React","import_react","React"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/components/Button.tsx","../src/utils/cx.ts","../src/components/Input.tsx","../src/components/Card.tsx","../src/components/Skeleton.tsx","../src/components/Container.tsx","../src/components/Row.tsx","../src/components/Col.tsx","../src/components/Stack.tsx","../src/components/Divider.tsx","../src/components/Avatar.tsx","../src/components/Badge.tsx","../src/components/Tooltip.tsx","../src/components/Table.tsx","../src/components/List.tsx","../src/components/FileChip.tsx","../src/components/AttachmentPreview.tsx","../src/components/Label.tsx","../src/components/HelperText.tsx","../src/components/Textarea.tsx","../src/components/Select.tsx","../src/components/Checkbox.tsx","../src/components/Radio.tsx","../src/components/Switch.tsx","../src/components/Slider.tsx","../src/components/InputGroup.tsx","../src/components/Alert.tsx","../src/components/Spinner.tsx","../src/components/Progress.tsx","../src/components/Toast.tsx","../src/components/Modal.tsx","../src/components/Drawer.tsx","../src/components/Popover.tsx","../src/components/Dialog.tsx","../src/components/Tabs.tsx","../src/components/Accordion.tsx","../src/components/Menu.tsx","../src/components/Navbar.tsx","../src/components/Breadcrumb.tsx","../src/components/Pagination.tsx","../src/components/Stepper.tsx","../src/components/icons/ChatBubbleIcon.tsx","../src/components/icons/ChevronLeftIcon.tsx","../src/components/icons/ChevronRightIcon.tsx","../src/components/icons/CloseIcon.tsx","../src/components/icons/ExpandIcon.tsx","../src/components/icons/HistoryIcon.tsx","../src/components/icons/LayersIcon.tsx","../src/components/icons/MediaIcon.tsx","../src/components/icons/PlusIcon.tsx","../src/components/icons/CheckSquareIcon.tsx","../src/components/icons/EmptySquareIcon.tsx","../src/components/icons/CrossSquareIcon.tsx","../src/components/icons/SquareLoaderIcon.tsx","../src/components/Message.tsx","../src/components/MarkdownContent.tsx","../src/components/StreamingCursor.tsx","../src/components/chat/ChatInterface.tsx","../src/components/chat/ChatView.tsx","../src/components/chat/hooks/useScrollAnchor.ts","../src/components/chat/hooks/useAdaptiveSpacer.ts","../src/components/chat/ThinkingIndicator.tsx","../src/components/chat/ChatInput.tsx","../src/components/chat/types.ts","../src/components/chat/ArtifactsPanel.tsx","../src/components/ArtifactCard.tsx","../src/components/ImageCard.tsx","../src/components/VideoCard.tsx","../src/components/AudioCard.tsx","../src/components/PdfCard.tsx","../src/components/ScriptCard.tsx","../src/components/TextCard.tsx","../src/utils/artifactLoading.ts","../src/components/ArtifactGroup.tsx","../src/components/ArtifactVariantStack.tsx","../src/components/chat/hooks/useArtifactTreeNavigation.ts","../src/components/chat/TodosList.tsx","../src/components/chat/ToolSidebar.tsx","../src/components/chat/ToolPanelContainer.tsx","../src/components/chat/hooks/useResizable.ts","../src/components/chat/MessageActions.tsx","../src/components/chat/BranchNavigator.tsx","../src/components/BrandIcon.tsx","../src/components/ColorSwatch.tsx","../src/components/SectionHeading.tsx","../src/components/ArtifactNode.ts"],"sourcesContent":["/**\n * Aurelius Design System\n *\n * A cohesive visual language for creative technologists.\n * Combines technical sophistication with artistic sensibility.\n *\n * CSS-first Tailwind v4 design system.\n * Import '@lukeashford/aurelius/styles/base.css' for complete styling.\n */\n\n// React components\nexport * from './components'\n\n// Version\nexport const version = '2.0.0'\n","import React from 'react'\nimport {cx} from '../utils/cx'\n\nexport type ButtonVariant =\n | 'primary'\n | 'important'\n | 'elevated'\n | 'outlined'\n | 'featured'\n | 'ghost'\n | 'danger'\n\nexport type ButtonSize = 'sm' | 'md' | 'lg' | 'xl'\n\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: ButtonVariant\n size?: ButtonSize\n loading?: boolean\n}\n\nexport const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({variant = 'primary', size = 'md', loading = false, className, disabled, children, ...rest},\n ref) => {\n const isDisabled = disabled || loading\n\n // Base button styles - common to all variants\n const base =\n 'inline-flex items-center justify-center font-semibold tracking-wide ' +\n 'transition-all duration-fast ' +\n 'rounded-none ' +\n 'disabled:opacity-50 disabled:cursor-not-allowed'\n\n // Variant styles\n const variantClasses = {\n primary:\n 'bg-charcoal text-white border border-gold/30 ' +\n 'hover:border-gold hover:shadow-glow hover:text-gold-light ' +\n 'active:bg-white/5 ' +\n 'focus-visible:ring-2 focus-visible:ring-gold focus-visible:ring-offset-2 ' +\n 'focus-visible:ring-offset-obsidian',\n\n important:\n 'bg-gold text-obsidian border border-gold ' +\n 'hover:bg-gold-light hover:text-obsidian ' +\n 'active:bg-gold-bright ' +\n 'focus-visible:ring-2 focus-visible:ring-gold focus-visible:ring-offset-2 ' +\n 'focus-visible:ring-offset-obsidian',\n\n elevated:\n 'bg-charcoal text-white border-0 shadow-lg ' +\n 'hover:shadow-xl hover:text-gold-light ' +\n 'active:bg-white/5 ' +\n 'focus-visible:ring-2 focus-visible:ring-gold focus-visible:ring-offset-2 ' +\n 'focus-visible:ring-offset-obsidian',\n\n outlined:\n 'bg-transparent text-white border border-ash ' +\n 'hover:border-white hover:text-white ' +\n 'active:bg-white/5 ' +\n 'focus-visible:ring-2 focus-visible:ring-gold focus-visible:ring-offset-2 ' +\n 'focus-visible:ring-offset-obsidian',\n\n featured:\n 'bg-charcoal text-white border border-gold ' +\n 'glow-sm ' +\n 'hover:glow-md hover:text-gold-light ' +\n 'active:bg-white/5 ' +\n 'focus-visible:ring-2 focus-visible:ring-gold focus-visible:ring-offset-2 ' +\n 'focus-visible:ring-offset-obsidian',\n\n ghost:\n 'bg-transparent text-gold border-0 ' +\n 'hover:text-gold-light ' +\n 'active:text-gold-bright ' +\n 'focus-visible:ring-2 focus-visible:ring-gold focus-visible:ring-offset-2 ' +\n 'focus-visible:ring-offset-obsidian',\n\n danger:\n 'bg-error text-white border-0 ' +\n 'hover:bg-error/90 ' +\n 'active:bg-error/80 ' +\n 'focus-visible:ring-2 focus-visible:ring-error focus-visible:ring-offset-2 ' +\n 'focus-visible:ring-offset-obsidian',\n }\n\n // Size styles\n const sizeClasses = {\n sm: 'h-8 px-3 text-sm',\n md: 'h-10 px-4 text-sm',\n lg: 'h-12 px-6 text-base',\n xl: 'h-14 px-8 text-lg',\n }\n\n const variantClass = variantClasses[variant]\n const sizeClass = sizeClasses[size]\n\n return (\n <button\n ref={ref}\n className={cx(base, variantClass, sizeClass, loading && 'opacity-80', className)}\n disabled={isDisabled}\n {...rest}\n >\n {loading && (\n <span\n className=\"mr-2 inline-block h-4 w-4 animate-pulse rounded-full bg-gold\"\n aria-hidden\n />\n )}\n {children}\n </button>\n )\n }\n)\n\nButton.displayName = 'Button'\n\nexport default Button\n","import {twMerge} from 'tailwind-merge';\nimport {type ClassValue, clsx} from 'clsx';\n\n/**\n * Concatenates class names and merges Tailwind utility classes correctly.\n * Uses clsx for conditional classes and tailwind-merge to handle overrides.\n */\nexport function cx(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import React from 'react'\nimport {cx} from '../utils/cx'\n\nexport interface InputProps extends React.InputHTMLAttributes<HTMLInputElement> {\n error?: boolean\n leadingIcon?: React.ReactNode\n trailingIcon?: React.ReactNode\n}\n\nexport const Input = React.forwardRef<HTMLInputElement, InputProps>(\n ({error = false, className, leadingIcon, trailingIcon, disabled, ...rest}, ref) => {\n const base =\n 'w-full h-10 px-3 bg-graphite border border-ash rounded-none ' +\n 'text-white placeholder:text-zinc ' +\n 'transition-all duration-fast ' +\n 'focus:border-gold focus:ring-1 focus:ring-gold focus:outline-none ' +\n 'disabled:bg-slate disabled:text-dim disabled:cursor-not-allowed'\n\n const errorCls = error ? 'border-error focus:border-error focus:ring-error' : ''\n\n return (\n <div className={cx('relative', disabled && 'opacity-90')}>\n {leadingIcon && (\n <span\n className=\"pointer-events-none absolute inset-y-0 left-3 flex items-center text-silver\">\n {leadingIcon}\n </span>\n )}\n <input\n ref={ref}\n className={cx(\n base,\n errorCls,\n leadingIcon ? 'pl-9' : false,\n trailingIcon ? 'pr-9' : false,\n className\n )}\n disabled={disabled}\n {...rest}\n />\n {trailingIcon && (\n <span\n className=\"pointer-events-none absolute inset-y-0 right-3 flex items-center text-silver\">\n {trailingIcon}\n </span>\n )}\n </div>\n )\n }\n)\n\nInput.displayName = 'Input'\n\nexport default Input\n","import React, {createContext, useContext} from 'react'\nimport {Check} from 'lucide-react'\nimport {cx} from '../utils'\nimport {Skeleton} from './Skeleton'\n\nexport type CardVariant = 'default' | 'elevated' | 'outlined' | 'ghost' | 'featured'\n\nexport type CardSlotLoading = {\n header?: {\n title?: boolean\n subtitle?: boolean\n action?: boolean\n }\n media?: boolean\n body?: boolean\n footer?: boolean\n}\n\ninterface CardContextValue {\n loading?: CardSlotLoading\n}\n\nconst CardContext = createContext<CardContextValue>({loading: undefined})\n\nconst useCardContext = () => useContext(CardContext)\n\nexport function slotLoading(\n loading: CardSlotLoading | undefined,\n path: 'media' | 'body' | 'footer' | ['header', 'title' | 'subtitle' | 'action']\n): boolean {\n if (!loading) {\n return false\n }\n if (Array.isArray(path)) {\n const [section, field] = path\n return !!(loading as any)[section]?.[field]\n }\n return !!(loading as any)[path]\n}\n\nexport interface CardProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: CardVariant\n interactive?: boolean\n selected?: boolean\n noPadding?: boolean\n loading?: CardSlotLoading\n}\n\nconst VARIANT_STYLES: Record<CardVariant, string> = {\n default: 'bg-charcoal shadow-sm border border-gold/30',\n elevated: 'bg-charcoal shadow-lg border-0',\n outlined: 'bg-charcoal shadow-none border border-ash',\n ghost: 'bg-transparent shadow-none border-0',\n featured: 'bg-charcoal border border-gold glow-sm',\n}\n\nconst CardBase = React.forwardRef<HTMLDivElement, CardProps>(\n (\n {\n variant = 'default',\n interactive = false,\n selected = false,\n noPadding = false,\n loading,\n className,\n children,\n ...props\n },\n ref\n ) => {\n return (\n <CardContext.Provider value={{loading}}>\n <div\n ref={ref}\n className={cx(\n 'rounded-none relative transition-opacity duration-500',\n !noPadding && 'p-6',\n VARIANT_STYLES[variant],\n interactive &&\n 'transition-all duration-200 hover:border-gold hover:shadow-glow cursor-pointer',\n selected && 'border-gold shadow-glow-md',\n className\n )}\n {...props}\n >\n {children}\n {selected && (\n <div\n className=\"absolute top-3 right-3 flex items-center justify-center h-6 w-6 rounded-full bg-gold text-obsidian\">\n <Check className=\"h-4 w-4\"/>\n </div>\n )}\n </div>\n </CardContext.Provider>\n )\n }\n)\n\nCardBase.displayName = 'Card'\n\n// Card.Header - header section with title and optional actions\nexport interface CardHeaderProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'title'> {\n title?: React.ReactNode\n subtitle?: React.ReactNode\n action?: React.ReactNode\n}\n\nconst CardHeader = React.forwardRef<HTMLDivElement, CardHeaderProps>(\n ({title, subtitle, action, className, children, ...props}, ref) => {\n const {loading} = useCardContext()\n const titleIsLoading = slotLoading(loading, ['header', 'title'])\n const subtitleIsLoading = slotLoading(loading, ['header', 'subtitle'])\n const actionIsLoading = slotLoading(loading, ['header', 'action'])\n\n const hasContent = title || subtitle || action || children\n\n if (!hasContent && !titleIsLoading && !subtitleIsLoading && !actionIsLoading) {\n return null\n }\n\n return (\n <div\n ref={ref}\n className={cx('px-6 py-4 border-b border-ash', className)}\n {...props}\n >\n {(title || subtitle || action || titleIsLoading || subtitleIsLoading || actionIsLoading)\n ? (\n <div className=\"flex items-start justify-between gap-4\">\n <div className=\"flex-1 min-w-0\">\n {title ? (\n <h3 className=\"text-lg font-semibold text-white m-0\">{title}</h3>\n ) : titleIsLoading ? (\n <Skeleton className=\"h-5 w-3/4 mb-1\"/>\n ) : null}\n {subtitle ? (\n <p className=\"text-sm text-silver mt-1 m-0\">{subtitle}</p>\n ) : subtitleIsLoading ? (\n <Skeleton className=\"h-4 w-1/2 mt-1\"/>\n ) : null}\n </div>\n {action ? (\n <div className=\"shrink-0\">{action}</div>\n ) : actionIsLoading ? (\n <Skeleton className=\"h-8 w-8 shrink-0\"/>\n ) : null}\n </div>\n ) : (\n children\n )}\n </div>\n )\n }\n)\n\nCardHeader.displayName = 'CardHeader'\n\n// Card.Body - main content area\nexport interface CardBodyProps extends React.HTMLAttributes<HTMLDivElement> {\n}\n\nconst CardBody = React.forwardRef<HTMLDivElement, CardBodyProps>(\n ({className, children, ...props}, ref) => {\n const {loading} = useCardContext()\n const isBodyLoading = slotLoading(loading, 'body')\n\n if (!children && !isBodyLoading) {\n return null\n }\n\n return (\n <div ref={ref} className={cx('px-6 py-4', className)} {...props}>\n {isBodyLoading ? (\n <div className=\"space-y-2\">\n <Skeleton className=\"h-4 w-full\"/>\n <Skeleton className=\"h-4 w-full\"/>\n <Skeleton className=\"h-4 w-3/4\"/>\n </div>\n ) : (\n children\n )}\n </div>\n )\n }\n)\n\nCardBody.displayName = 'CardBody'\n\n// Card.Footer - footer section, typically for actions\nexport interface CardFooterProps extends React.HTMLAttributes<HTMLDivElement> {\n align?: 'start' | 'center' | 'end' | 'between'\n}\n\nconst CardFooter = React.forwardRef<HTMLDivElement, CardFooterProps>(\n ({align = 'end', className, children, ...props}, ref) => {\n const alignClass = {\n start: 'justify-start',\n center: 'justify-center',\n end: 'justify-end',\n between: 'justify-between',\n }[align]\n\n return (\n <div\n ref={ref}\n className={cx(\n 'px-6 py-4 border-t border-ash flex items-center gap-3',\n alignClass,\n className\n )}\n {...props}\n >\n {children}\n </div>\n )\n }\n)\n\nCardFooter.displayName = 'CardFooter'\n\n// Card.Media - image or media section\nexport interface CardMediaProps extends React.HTMLAttributes<HTMLDivElement> {\n aspect?: 'video' | 'square' | 'wide' | 'none'\n position?: 'top' | 'bottom'\n}\n\nconst CardMedia = React.forwardRef<HTMLDivElement, CardMediaProps>(\n ({\n aspect,\n position = 'top',\n className,\n children,\n ...props\n }, ref) => {\n const {loading} = useCardContext()\n const isMediaLoading = slotLoading(loading, 'media')\n const aspectClass = aspect && aspect !== 'none' ? {\n video: 'aspect-video',\n square: 'aspect-square',\n wide: 'aspect-wide',\n }[aspect] : ''\n\n if (!children && !isMediaLoading) {\n return null\n }\n\n return (\n <div\n ref={ref}\n className={cx(\n 'overflow-hidden relative',\n aspectClass,\n position === 'top' && 'border-b border-ash',\n position === 'bottom' && 'border-t border-ash',\n className\n )}\n {...props}\n >\n {isMediaLoading ? (\n <Skeleton className=\"w-full h-full\"/>\n ) : (\n children\n )}\n </div>\n )\n }\n)\n\nCardMedia.displayName = 'CardMedia'\n\n// Compound component pattern\nexport const Card = Object.assign(CardBase, {\n Header: CardHeader,\n Body: CardBody,\n Footer: CardFooter,\n Media: CardMedia,\n})","import React from 'react'\nimport {cx} from '../utils/cx'\n\nexport interface SkeletonProps extends React.HTMLAttributes<HTMLDivElement> {\n}\n\nexport const Skeleton = React.forwardRef<HTMLDivElement, SkeletonProps>(\n ({className, ...rest}, ref) => {\n return (\n <div\n ref={ref}\n className={cx('animate-pulse bg-ash', className)}\n {...rest}\n />\n )\n }\n)\n\nSkeleton.displayName = 'Skeleton'\n\nexport default Skeleton\n","import React from 'react'\nimport {cx} from '../utils/cx'\n\nexport type ContainerSize = 'sm' | 'md' | 'lg' | 'xl' | 'fluid' | 'responsive'\n\nexport interface ContainerProps extends React.HTMLAttributes<HTMLDivElement> {\n size?: ContainerSize\n}\n\nconst SIZE_CLASSES: Record<ContainerSize, string> = {\n sm: 'container-sm',\n md: 'container-md',\n lg: 'container-lg',\n xl: 'container-xl',\n fluid: 'container-fluid',\n responsive: 'container',\n}\n\nexport const Container = React.forwardRef<HTMLDivElement, ContainerProps>(\n ({size = 'responsive', className, children, ...props}, ref) => {\n return (\n <div ref={ref} className={cx(SIZE_CLASSES[size], className)} {...props}>\n {children}\n </div>\n )\n }\n)\n\nContainer.displayName = 'Container'\n","import React from 'react'\nimport {cx} from '../utils'\n\nexport type RowGutter = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 8 | 10 | 12\nexport type RowJustify = 'start' | 'center' | 'end' | 'between' | 'around' | 'evenly'\nexport type RowAlign = 'start' | 'center' | 'end' | 'stretch' | 'baseline'\n\nexport interface RowProps extends React.HTMLAttributes<HTMLDivElement> {\n gutter?: RowGutter\n gutterX?: RowGutter\n gutterY?: RowGutter\n justify?: RowJustify\n align?: RowAlign\n}\n\nconst JUSTIFY_MAP: Record<RowJustify, string> = {\n start: 'justify-start',\n center: 'justify-center',\n end: 'justify-end',\n between: 'justify-between',\n around: 'justify-around',\n evenly: 'justify-evenly',\n}\n\nconst ALIGN_MAP: Record<RowAlign, string> = {\n start: 'items-start',\n center: 'items-center',\n end: 'items-end',\n stretch: 'items-stretch',\n baseline: 'items-baseline',\n}\n\nconst GAP_MAP: Record<RowGutter, string> = {\n 0: 'gap-0',\n 1: 'gap-1',\n 2: 'gap-2',\n 3: 'gap-3',\n 4: 'gap-4',\n 5: 'gap-5',\n 6: 'gap-6',\n 8: 'gap-8',\n 10: 'gap-10',\n 12: 'gap-12',\n}\n\nconst GAP_X_MAP: Record<RowGutter, string> = {\n 0: 'gap-x-0',\n 1: 'gap-x-1',\n 2: 'gap-x-2',\n 3: 'gap-x-3',\n 4: 'gap-x-4',\n 5: 'gap-x-5',\n 6: 'gap-x-6',\n 8: 'gap-x-8',\n 10: 'gap-x-10',\n 12: 'gap-x-12',\n}\n\nconst GAP_Y_MAP: Record<RowGutter, string> = {\n 0: 'gap-y-0',\n 1: 'gap-y-1',\n 2: 'gap-y-2',\n 3: 'gap-y-3',\n 4: 'gap-y-4',\n 5: 'gap-y-5',\n 6: 'gap-y-6',\n 8: 'gap-y-8',\n 10: 'gap-y-10',\n 12: 'gap-y-12',\n}\n\nexport const Row = React.forwardRef<HTMLDivElement, RowProps>(\n ({gutter = 4, gutterX, gutterY, justify, align, className, children, ...props}, ref) => {\n // Directional gutters take precedence over uniform gutter\n const gapClass = gutterX === undefined && gutterY === undefined ? GAP_MAP[gutter] : ''\n const gapXClass = gutterX !== undefined ? GAP_X_MAP[gutterX] : ''\n const gapYClass = gutterY !== undefined ? GAP_Y_MAP[gutterY] : ''\n\n return (\n <div\n ref={ref}\n className={cx(\n 'row',\n gapClass,\n gapXClass,\n gapYClass,\n justify && JUSTIFY_MAP[justify],\n align && ALIGN_MAP[align],\n className\n )}\n {...props}\n >\n {children}\n </div>\n )\n }\n)\n\nRow.displayName = 'Row'\n","import React from 'react'\nimport {cx} from '../utils'\n\nexport type ColSpan = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 'auto' | 'full'\nexport type ColOffset = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11\nexport type ColOrder = 'first' | 'last' | 'none' | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12\n\nexport interface ResponsiveValue<T> {\n base?: T\n sm?: T\n md?: T\n lg?: T\n xl?: T\n '2xl'?: T\n}\n\nexport interface ColProps extends React.HTMLAttributes<HTMLDivElement> {\n span?: ColSpan | ResponsiveValue<ColSpan>\n offset?: ColOffset | ResponsiveValue<ColOffset>\n order?: ColOrder | ResponsiveValue<ColOrder>\n}\n\ntype Breakpoint = 'base' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'\n\nconst SPAN_CLASS_MAP: Record<Breakpoint, Record<ColSpan, string>> = {\n base: {\n 1: 'col-span-1',\n 2: 'col-span-2',\n 3: 'col-span-3',\n 4: 'col-span-4',\n 5: 'col-span-5',\n 6: 'col-span-6',\n 7: 'col-span-7',\n 8: 'col-span-8',\n 9: 'col-span-9',\n 10: 'col-span-10',\n 11: 'col-span-11',\n 12: 'col-span-12',\n auto: 'col-auto',\n full: 'col-span-full',\n },\n sm: {\n 1: 'sm:col-span-1',\n 2: 'sm:col-span-2',\n 3: 'sm:col-span-3',\n 4: 'sm:col-span-4',\n 5: 'sm:col-span-5',\n 6: 'sm:col-span-6',\n 7: 'sm:col-span-7',\n 8: 'sm:col-span-8',\n 9: 'sm:col-span-9',\n 10: 'sm:col-span-10',\n 11: 'sm:col-span-11',\n 12: 'sm:col-span-12',\n auto: 'sm:col-auto',\n full: 'sm:col-span-full',\n },\n md: {\n 1: 'md:col-span-1',\n 2: 'md:col-span-2',\n 3: 'md:col-span-3',\n 4: 'md:col-span-4',\n 5: 'md:col-span-5',\n 6: 'md:col-span-6',\n 7: 'md:col-span-7',\n 8: 'md:col-span-8',\n 9: 'md:col-span-9',\n 10: 'md:col-span-10',\n 11: 'md:col-span-11',\n 12: 'md:col-span-12',\n auto: 'md:col-auto',\n full: 'md:col-span-full',\n },\n lg: {\n 1: 'lg:col-span-1',\n 2: 'lg:col-span-2',\n 3: 'lg:col-span-3',\n 4: 'lg:col-span-4',\n 5: 'lg:col-span-5',\n 6: 'lg:col-span-6',\n 7: 'lg:col-span-7',\n 8: 'lg:col-span-8',\n 9: 'lg:col-span-9',\n 10: 'lg:col-span-10',\n 11: 'lg:col-span-11',\n 12: 'lg:col-span-12',\n auto: 'lg:col-auto',\n full: 'lg:col-span-full',\n },\n xl: {\n 1: 'xl:col-span-1',\n 2: 'xl:col-span-2',\n 3: 'xl:col-span-3',\n 4: 'xl:col-span-4',\n 5: 'xl:col-span-5',\n 6: 'xl:col-span-6',\n 7: 'xl:col-span-7',\n 8: 'xl:col-span-8',\n 9: 'xl:col-span-9',\n 10: 'xl:col-span-10',\n 11: 'xl:col-span-11',\n 12: 'xl:col-span-12',\n auto: 'xl:col-auto',\n full: 'xl:col-span-full',\n },\n '2xl': {\n 1: '2xl:col-span-1',\n 2: '2xl:col-span-2',\n 3: '2xl:col-span-3',\n 4: '2xl:col-span-4',\n 5: '2xl:col-span-5',\n 6: '2xl:col-span-6',\n 7: '2xl:col-span-7',\n 8: '2xl:col-span-8',\n 9: '2xl:col-span-9',\n 10: '2xl:col-span-10',\n 11: '2xl:col-span-11',\n 12: '2xl:col-span-12',\n auto: '2xl:col-auto',\n full: '2xl:col-span-full',\n },\n}\n\nconst OFFSET_CLASS_MAP: Record<Breakpoint, Record<ColOffset, string>> = {\n base: {\n 0: '',\n 1: 'col-start-2',\n 2: 'col-start-3',\n 3: 'col-start-4',\n 4: 'col-start-5',\n 5: 'col-start-6',\n 6: 'col-start-7',\n 7: 'col-start-8',\n 8: 'col-start-9',\n 9: 'col-start-10',\n 10: 'col-start-11',\n 11: 'col-start-12',\n },\n sm: {\n 0: '',\n 1: 'sm:col-start-2',\n 2: 'sm:col-start-3',\n 3: 'sm:col-start-4',\n 4: 'sm:col-start-5',\n 5: 'sm:col-start-6',\n 6: 'sm:col-start-7',\n 7: 'sm:col-start-8',\n 8: 'sm:col-start-9',\n 9: 'sm:col-start-10',\n 10: 'sm:col-start-11',\n 11: 'sm:col-start-12',\n },\n md: {\n 0: '',\n 1: 'md:col-start-2',\n 2: 'md:col-start-3',\n 3: 'md:col-start-4',\n 4: 'md:col-start-5',\n 5: 'md:col-start-6',\n 6: 'md:col-start-7',\n 7: 'md:col-start-8',\n 8: 'md:col-start-9',\n 9: 'md:col-start-10',\n 10: 'md:col-start-11',\n 11: 'md:col-start-12',\n },\n lg: {\n 0: '',\n 1: 'lg:col-start-2',\n 2: 'lg:col-start-3',\n 3: 'lg:col-start-4',\n 4: 'lg:col-start-5',\n 5: 'lg:col-start-6',\n 6: 'lg:col-start-7',\n 7: 'lg:col-start-8',\n 8: 'lg:col-start-9',\n 9: 'lg:col-start-10',\n 10: 'lg:col-start-11',\n 11: 'lg:col-start-12',\n },\n xl: {\n 0: '',\n 1: 'xl:col-start-2',\n 2: 'xl:col-start-3',\n 3: 'xl:col-start-4',\n 4: 'xl:col-start-5',\n 5: 'xl:col-start-6',\n 6: 'xl:col-start-7',\n 7: 'xl:col-start-8',\n 8: 'xl:col-start-9',\n 9: 'xl:col-start-10',\n 10: 'xl:col-start-11',\n 11: 'xl:col-start-12',\n },\n '2xl': {\n 0: '',\n 1: '2xl:col-start-2',\n 2: '2xl:col-start-3',\n 3: '2xl:col-start-4',\n 4: '2xl:col-start-5',\n 5: '2xl:col-start-6',\n 6: '2xl:col-start-7',\n 7: '2xl:col-start-8',\n 8: '2xl:col-start-9',\n 9: '2xl:col-start-10',\n 10: '2xl:col-start-11',\n 11: '2xl:col-start-12',\n },\n}\n\nconst ORDER_CLASS_MAP: Record<Breakpoint, Record<ColOrder, string>> = {\n base: {\n first: 'order-first',\n last: 'order-last',\n none: 'order-none',\n 1: 'order-1',\n 2: 'order-2',\n 3: 'order-3',\n 4: 'order-4',\n 5: 'order-5',\n 6: 'order-6',\n 7: 'order-7',\n 8: 'order-8',\n 9: 'order-9',\n 10: 'order-10',\n 11: 'order-11',\n 12: 'order-12',\n },\n sm: {\n first: 'sm:order-first',\n last: 'sm:order-last',\n none: 'sm:order-none',\n 1: 'sm:order-1',\n 2: 'sm:order-2',\n 3: 'sm:order-3',\n 4: 'sm:order-4',\n 5: 'sm:order-5',\n 6: 'sm:order-6',\n 7: 'sm:order-7',\n 8: 'sm:order-8',\n 9: 'sm:order-9',\n 10: 'sm:order-10',\n 11: 'sm:order-11',\n 12: 'sm:order-12',\n },\n md: {\n first: 'md:order-first',\n last: 'md:order-last',\n none: 'md:order-none',\n 1: 'md:order-1',\n 2: 'md:order-2',\n 3: 'md:order-3',\n 4: 'md:order-4',\n 5: 'md:order-5',\n 6: 'md:order-6',\n 7: 'md:order-7',\n 8: 'md:order-8',\n 9: 'md:order-9',\n 10: 'md:order-10',\n 11: 'md:order-11',\n 12: 'md:order-12',\n },\n lg: {\n first: 'lg:order-first',\n last: 'lg:order-last',\n none: 'lg:order-none',\n 1: 'lg:order-1',\n 2: 'lg:order-2',\n 3: 'lg:order-3',\n 4: 'lg:order-4',\n 5: 'lg:order-5',\n 6: 'lg:order-6',\n 7: 'lg:order-7',\n 8: 'lg:order-8',\n 9: 'lg:order-9',\n 10: 'lg:order-10',\n 11: 'lg:order-11',\n 12: 'lg:order-12',\n },\n xl: {\n first: 'xl:order-first',\n last: 'xl:order-last',\n none: 'xl:order-none',\n 1: 'xl:order-1',\n 2: 'xl:order-2',\n 3: 'xl:order-3',\n 4: 'xl:order-4',\n 5: 'xl:order-5',\n 6: 'xl:order-6',\n 7: 'xl:order-7',\n 8: 'xl:order-8',\n 9: 'xl:order-9',\n 10: 'xl:order-10',\n 11: 'xl:order-11',\n 12: 'xl:order-12',\n },\n '2xl': {\n first: '2xl:order-first',\n last: '2xl:order-last',\n none: '2xl:order-none',\n 1: '2xl:order-1',\n 2: '2xl:order-2',\n 3: '2xl:order-3',\n 4: '2xl:order-4',\n 5: '2xl:order-5',\n 6: '2xl:order-6',\n 7: '2xl:order-7',\n 8: '2xl:order-8',\n 9: '2xl:order-9',\n 10: '2xl:order-10',\n 11: '2xl:order-11',\n 12: '2xl:order-12',\n },\n}\n\nfunction isResponsiveValue<T>(value: T | ResponsiveValue<T>): value is ResponsiveValue<T> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction buildResponsiveClasses<T extends string | number>(\n value: T | ResponsiveValue<T> | undefined,\n classMap: Record<Breakpoint, Record<T, string>>\n): string[] {\n if (value === undefined) {\n return []\n }\n\n if (!isResponsiveValue(value)) {\n const cls = classMap.base[value]\n return cls ? [cls] : []\n }\n\n const classes: string[] = []\n for (const [breakpoint, val] of Object.entries(value) as [Breakpoint, T][]) {\n if (val !== undefined) {\n const cls = classMap[breakpoint]?.[val]\n if (cls) {\n classes.push(cls)\n }\n }\n }\n return classes\n}\n\nexport const Col = React.forwardRef<HTMLDivElement, ColProps>(\n ({span, offset, order, className, children, ...props}, ref) => {\n const spanClasses = buildResponsiveClasses(span, SPAN_CLASS_MAP)\n const offsetClasses = buildResponsiveClasses(offset, OFFSET_CLASS_MAP)\n const orderClasses = buildResponsiveClasses(order, ORDER_CLASS_MAP)\n\n // Default to full width if no span specified\n const hasSpan = span !== undefined\n const defaultSpan = hasSpan ? '' : 'col-span-12'\n\n return (\n <div\n ref={ref}\n className={cx(\n defaultSpan,\n ...spanClasses,\n ...offsetClasses,\n ...orderClasses,\n className\n )}\n {...props}\n >\n {children}\n </div>\n )\n }\n)\n\nCol.displayName = 'Col'\n","import React from 'react'\nimport {cx} from '../utils/cx'\n\nexport type StackDirection = 'horizontal' | 'vertical'\nexport type StackAlign = 'start' | 'center' | 'end' | 'stretch' | 'baseline'\nexport type StackJustify = 'start' | 'center' | 'end' | 'between' | 'around' | 'evenly'\nexport type StackGap = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 8 | 10 | 12\n\nexport interface StackProps extends React.HTMLAttributes<HTMLDivElement> {\n direction?: StackDirection\n align?: StackAlign\n justify?: StackJustify\n gap?: StackGap\n wrap?: boolean\n as?: 'div' | 'section' | 'article' | 'nav' | 'aside' | 'header' | 'footer' | 'main'\n}\n\nconst ALIGN_MAP: Record<StackAlign, string> = {\n start: 'items-start',\n center: 'items-center',\n end: 'items-end',\n stretch: 'items-stretch',\n baseline: 'items-baseline',\n}\n\nconst JUSTIFY_MAP: Record<StackJustify, string> = {\n start: 'justify-start',\n center: 'justify-center',\n end: 'justify-end',\n between: 'justify-between',\n around: 'justify-around',\n evenly: 'justify-evenly',\n}\n\nconst GAP_MAP: Record<StackGap, string> = {\n 0: 'gap-0',\n 1: 'gap-1',\n 2: 'gap-2',\n 3: 'gap-3',\n 4: 'gap-4',\n 5: 'gap-5',\n 6: 'gap-6',\n 8: 'gap-8',\n 10: 'gap-10',\n 12: 'gap-12',\n}\n\nexport const Stack = React.forwardRef<HTMLDivElement, StackProps>(\n (\n {\n direction = 'vertical',\n align,\n justify,\n gap = 4,\n wrap = false,\n as: Component = 'div',\n className,\n children,\n ...props\n },\n ref\n ) => {\n return (\n <Component\n ref={ref}\n className={cx(\n 'flex',\n direction === 'horizontal' ? 'flex-row' : 'flex-col',\n align && ALIGN_MAP[align],\n justify && JUSTIFY_MAP[justify],\n GAP_MAP[gap],\n wrap && 'flex-wrap',\n className\n )}\n {...props}\n >\n {children}\n </Component>\n )\n }\n)\n\nStack.displayName = 'Stack'\n","import React from 'react'\nimport {cx} from '../utils/cx'\n\nexport type DividerOrientation = 'horizontal' | 'vertical'\nexport type DividerVariant = 'solid' | 'dashed' | 'dotted'\n\nexport interface DividerProps extends React.HTMLAttributes<HTMLHRElement> {\n orientation?: DividerOrientation\n variant?: DividerVariant\n label?: React.ReactNode\n color?: 'default' | 'gold' | 'muted'\n}\n\nconst COLOR_MAP: Record<string, string> = {\n default: 'border-ash',\n gold: 'border-gold/50',\n muted: 'border-slate',\n}\n\nconst VARIANT_MAP: Record<DividerVariant, string> = {\n solid: 'border-solid',\n dashed: 'border-dashed',\n dotted: 'border-dotted',\n}\n\nexport const Divider = React.forwardRef<HTMLHRElement, DividerProps>(\n (\n {\n orientation = 'horizontal',\n variant = 'solid',\n label,\n color = 'default',\n className,\n ...props\n },\n ref\n ) => {\n const isHorizontal = orientation === 'horizontal'\n\n if (label && isHorizontal) {\n return (\n <div\n className={cx('flex items-center gap-4', className)}\n role=\"separator\"\n aria-orientation={orientation}\n >\n <div\n className={cx(\n 'flex-1 border-t',\n VARIANT_MAP[variant],\n COLOR_MAP[color]\n )}\n />\n <span className=\"text-sm text-silver shrink-0\">{label}</span>\n <div\n className={cx(\n 'flex-1 border-t',\n VARIANT_MAP[variant],\n COLOR_MAP[color]\n )}\n />\n </div>\n )\n }\n\n return (\n <hr\n ref={ref}\n role=\"separator\"\n aria-orientation={orientation}\n className={cx(\n isHorizontal ? 'border-t w-full' : 'border-l h-full',\n VARIANT_MAP[variant],\n COLOR_MAP[color],\n 'border-0',\n isHorizontal ? 'border-t' : 'border-l',\n className\n )}\n {...props}\n />\n )\n }\n)\n\nDivider.displayName = 'Divider'\n","import React from 'react'\nimport {cx} from '../utils/cx'\n\nexport type AvatarSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'\nexport type AvatarStatus = 'online' | 'offline' | 'busy'\n\nexport interface AvatarProps extends React.HTMLAttributes<HTMLDivElement> {\n src?: string\n alt?: string\n name?: string\n size?: AvatarSize\n status?: AvatarStatus\n}\n\nconst sizeMap: Record<AvatarSize, string> = {\n xs: 'h-6 w-6 text-[10px]',\n sm: 'h-8 w-8 text-[11px]',\n md: 'h-10 w-10 text-xs',\n lg: 'h-12 w-12 text-sm',\n xl: 'h-16 w-16 text-base',\n '2xl': 'h-24 w-24 text-lg',\n}\n\nfunction initials(name?: string) {\n if (!name) {\n return ''\n }\n const parts = name.trim().split(/\\s+/)\n return parts.slice(0, 2).map(p => p[0]!.toUpperCase()).join('')\n}\n\nexport const Avatar = React.forwardRef<HTMLDivElement, AvatarProps>(\n ({src, alt = '', name, size = 'md', status, className, ...rest}, ref) => {\n const statusColor =\n status === 'online' ? 'bg-success' : status === 'busy' ? 'bg-warning' : 'bg-zinc'\n\n return (\n <div\n ref={ref}\n className={cx(\n 'relative inline-flex items-center justify-center rounded-full border-2 border-ash bg-slate text-silver font-semibold select-none overflow-hidden',\n sizeMap[size],\n className\n )}\n {...rest}\n >\n {src ? (\n <img src={src} alt={alt || name || 'Avatar'}\n className=\"h-full w-full object-cover\"/>\n ) : (\n <span aria-hidden>{initials(name) || '·'}</span>\n )}\n {status && (\n <span\n className={cx(\n 'absolute bottom-0 right-0 rounded-full ring-2 ring-charcoal',\n // 25% of avatar size\n size === 'xs' ? 'h-1.5 w-1.5' :\n size === 'sm' ? 'h-2 w-2' :\n size === 'md' ? 'h-2.5 w-2.5' :\n size === 'lg' ? 'h-3 w-3' :\n size === 'xl' ? 'h-4 w-4' : 'h-5 w-5',\n statusColor\n )}\n />\n )}\n </div>\n )\n }\n)\n\nAvatar.displayName = 'Avatar'\n\nexport default Avatar\n","import React from 'react'\nimport {cx} from '../utils/cx'\n\nexport type BadgeVariant = 'default' | 'gold' | 'success' | 'error' | 'warning' | 'info'\n\nexport interface BadgeProps extends React.HTMLAttributes<HTMLSpanElement> {\n variant?: BadgeVariant\n}\n\nexport const Badge = React.forwardRef<HTMLSpanElement, BadgeProps>(\n ({variant = 'default', className, ...rest}, ref) => {\n // Base badge styles\n const base = 'inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium border'\n\n // Variant styles\n const variantClasses = {\n default: 'bg-slate text-silver border-slate',\n gold: 'bg-gold/20 text-gold border-gold/30',\n success: 'bg-success/20 text-success border-success/30',\n error: 'bg-error/20 text-error border-error/30',\n warning: 'bg-warning/20 text-warning border-warning/30',\n info: 'bg-info/20 text-info border-info/30',\n }\n\n const variantClass = variantClasses[variant]\n\n return <span ref={ref} className={cx(base, variantClass, className)} {...rest} />\n }\n)\n\nBadge.displayName = 'Badge'\n\nexport default Badge\n","import React from 'react'\nimport {cx} from '../utils/cx'\n\nexport type TooltipSide = 'top' | 'right' | 'bottom' | 'left'\n\nexport interface TooltipProps {\n content: React.ReactNode\n children: React.ReactElement\n open?: boolean\n side?: TooltipSide\n}\n\n// Simple, controlled tooltip. Consumer handles open state.\nexport const Tooltip: React.FC<TooltipProps> = ({\n content,\n children,\n open = false,\n side = 'top'\n}) => {\n return (\n <span className=\"relative inline-block\">\n {children}\n <span\n role=\"tooltip\"\n className={cx(\n 'pointer-events-none absolute z-50 whitespace-nowrap border border-ash bg-graphite px-3 py-1.5 text-sm text-white shadow-lg transition-opacity duration-200 ease-out',\n open ? 'opacity-100' : 'opacity-0',\n side === 'top' && 'left-1/2 -translate-x-1/2 -top-2 -translate-y-full',\n side === 'bottom' && 'left-1/2 -translate-x-1/2 -bottom-2 translate-y-full',\n side === 'left' && 'top-1/2 -translate-y-1/2 -left-2 -translate-x-full',\n side === 'right' && 'top-1/2 -translate-y-1/2 -right-2 translate-x-full'\n )}\n >\n {content}\n </span>\n </span>\n )\n}\n\nexport default Tooltip\n","import React from 'react'\nimport {cx} from '../utils/cx'\n\n// Table container\nexport interface TableProps extends React.TableHTMLAttributes<HTMLTableElement> {\n responsive?: boolean\n}\n\nexport const Table = React.forwardRef<HTMLTableElement, TableProps>(\n ({responsive = true, className, children, ...props}, ref) => {\n const table = (\n <table\n ref={ref}\n className={cx('w-full text-sm', className)}\n {...props}\n >\n {children}\n </table>\n )\n\n if (responsive) {\n return <div className=\"w-full overflow-x-auto\">{table}</div>\n }\n\n return table\n }\n)\n\nTable.displayName = 'Table'\n\n// Table header\nexport interface TableHeaderProps extends React.HTMLAttributes<HTMLTableSectionElement> {\n}\n\nexport const TableHeader = React.forwardRef<HTMLTableSectionElement, TableHeaderProps>(\n ({className, children, ...props}, ref) => (\n <thead\n ref={ref}\n className={cx('bg-graphite', className)}\n {...props}\n >\n {children}\n </thead>\n )\n)\n\nTableHeader.displayName = 'TableHeader'\n\n// Table body\nexport interface TableBodyProps extends React.HTMLAttributes<HTMLTableSectionElement> {\n}\n\nexport const TableBody = React.forwardRef<HTMLTableSectionElement, TableBodyProps>(\n ({className, children, ...props}, ref) => (\n <tbody\n ref={ref}\n className={cx('divide-y divide-ash', className)}\n {...props}\n >\n {children}\n </tbody>\n )\n)\n\nTableBody.displayName = 'TableBody'\n\n// Table footer\nexport interface TableFooterProps extends React.HTMLAttributes<HTMLTableSectionElement> {\n}\n\nexport const TableFooter = React.forwardRef<HTMLTableSectionElement, TableFooterProps>(\n ({className, children, ...props}, ref) => (\n <tfoot\n ref={ref}\n className={cx('bg-graphite font-medium', className)}\n {...props}\n >\n {children}\n </tfoot>\n )\n)\n\nTableFooter.displayName = 'TableFooter'\n\n// Table row\nexport interface TableRowProps extends React.HTMLAttributes<HTMLTableRowElement> {\n hoverable?: boolean\n selected?: boolean\n}\n\nexport const TableRow = React.forwardRef<HTMLTableRowElement, TableRowProps>(\n ({hoverable = true, selected = false, className, children, ...props}, ref) => (\n <tr\n ref={ref}\n className={cx(\n 'transition-colors duration-fast',\n hoverable && 'hover:bg-graphite/50',\n selected && 'bg-gold/10',\n className\n )}\n {...props}\n >\n {children}\n </tr>\n )\n)\n\nTableRow.displayName = 'TableRow'\n\n// Table header cell\nexport interface TableHeadProps extends React.ThHTMLAttributes<HTMLTableCellElement> {\n sortable?: boolean\n sortDirection?: 'asc' | 'desc' | null\n}\n\nexport const TableHead = React.forwardRef<HTMLTableCellElement, TableHeadProps>(\n ({sortable, sortDirection, className, children, ...props}, ref) => (\n <th\n ref={ref}\n className={cx(\n 'px-4 py-3 text-left font-semibold text-silver',\n sortable && 'cursor-pointer hover:text-white select-none',\n className\n )}\n {...props}\n >\n <div className=\"flex items-center gap-2\">\n {children}\n {sortable && sortDirection && (\n <span className=\"text-gold\">\n {sortDirection === 'asc' ? '↑' : '↓'}\n </span>\n )}\n </div>\n </th>\n )\n)\n\nTableHead.displayName = 'TableHead'\n\n// Table data cell\nexport interface TableCellProps extends React.TdHTMLAttributes<HTMLTableCellElement> {\n}\n\nexport const TableCell = React.forwardRef<HTMLTableCellElement, TableCellProps>(\n ({className, children, ...props}, ref) => (\n <td\n ref={ref}\n className={cx('px-4 py-3 text-white', className)}\n {...props}\n >\n {children}\n </td>\n )\n)\n\nTableCell.displayName = 'TableCell'\n\n// Table caption\nexport interface TableCaptionProps extends React.HTMLAttributes<HTMLTableCaptionElement> {\n}\n\nexport const TableCaption = React.forwardRef<HTMLTableCaptionElement, TableCaptionProps>(\n ({className, children, ...props}, ref) => (\n <caption\n ref={ref}\n className={cx('mt-4 text-sm text-silver', className)}\n {...props}\n >\n {children}\n </caption>\n )\n)\n\nTableCaption.displayName = 'TableCaption'\n","import React from 'react'\nimport {cx} from '../utils/cx'\n\n// List container\nexport interface ListProps extends React.HTMLAttributes<HTMLUListElement> {\n variant?: 'default' | 'bordered' | 'divided'\n ordered?: boolean\n}\n\nexport const List = React.forwardRef<HTMLUListElement, ListProps>(\n ({variant = 'default', ordered = false, className, children, ...props}, ref) => {\n const Component = ordered ? 'ol' : 'ul'\n\n return (\n <Component\n ref={ref as any}\n className={cx(\n 'list-none m-0 p-0',\n variant === 'bordered' && 'border border-ash',\n variant === 'divided' && 'divide-y divide-ash',\n className\n )}\n {...props}\n >\n {children}\n </Component>\n )\n }\n)\n\nList.displayName = 'List'\n\n// ListItem\nexport interface ListItemProps extends React.LiHTMLAttributes<HTMLLIElement> {\n leading?: React.ReactNode\n trailing?: React.ReactNode\n interactive?: boolean\n selected?: boolean\n disabled?: boolean\n}\n\nexport const ListItem = React.forwardRef<HTMLLIElement, ListItemProps>(\n (\n {\n leading,\n trailing,\n interactive = false,\n selected = false,\n disabled = false,\n className,\n children,\n onClick,\n ...props\n },\n ref\n ) => {\n const handleClick = (e: React.MouseEvent<HTMLLIElement>) => {\n if (disabled) {\n return\n }\n onClick?.(e)\n }\n\n return (\n <li\n ref={ref}\n onClick={handleClick}\n className={cx(\n 'flex items-center gap-3 px-4 py-3',\n interactive && 'cursor-pointer transition-colors duration-fast',\n interactive && !disabled && 'hover:bg-graphite',\n selected && 'bg-gold/10',\n disabled && 'opacity-50 cursor-not-allowed',\n className\n )}\n {...props}\n >\n {leading && <div className=\"shrink-0\">{leading}</div>}\n <div className=\"flex-1 min-w-0\">{children}</div>\n {trailing && <div className=\"shrink-0\">{trailing}</div>}\n </li>\n )\n }\n)\n\nListItem.displayName = 'ListItem'\n\n// ListItemText - for structured text content\nexport interface ListItemTextProps extends React.HTMLAttributes<HTMLDivElement> {\n primary: React.ReactNode\n secondary?: React.ReactNode\n}\n\nexport const ListItemText = React.forwardRef<HTMLDivElement, ListItemTextProps>(\n ({primary, secondary, className, ...props}, ref) => {\n return (\n <div ref={ref} className={cx('flex flex-col', className)} {...props}>\n <span className=\"text-sm font-medium text-white\">{primary}</span>\n {secondary && (\n <span className=\"text-xs text-silver mt-0.5\">{secondary}</span>\n )}\n </div>\n )\n }\n)\n\nListItemText.displayName = 'ListItemText'\n\n// ListSubheader - section header within a list\nexport interface ListSubheaderProps extends React.HTMLAttributes<HTMLLIElement> {\n}\n\nexport const ListSubheader = React.forwardRef<HTMLLIElement, ListSubheaderProps>(\n ({className, children, ...props}, ref) => {\n return (\n <li\n ref={ref}\n className={cx(\n 'px-4 py-2 text-xs font-semibold text-gold uppercase tracking-wider bg-graphite',\n className\n )}\n {...props}\n >\n {children}\n </li>\n )\n }\n)\n\nListSubheader.displayName = 'ListSubheader'\n","import React from 'react'\nimport {cx} from '../utils/cx'\nimport {\n File,\n FileArchive,\n FileAudio,\n FileCode,\n FileImage,\n FileText,\n FileVideo,\n Loader2,\n X\n} from 'lucide-react'\n\nexport type FileChipStatus = 'pending' | 'uploading' | 'complete' | 'error'\n\nexport interface FileChipProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> {\n /**\n * File name to display\n */\n name: string\n /**\n * File size in bytes (optional, will be formatted)\n */\n size?: number\n /**\n * MIME type for icon selection\n */\n type?: string\n /**\n * Upload/processing status\n */\n status?: FileChipStatus\n /**\n * Preview image URL (for images)\n */\n previewUrl?: string\n /**\n * Called when the remove button is clicked\n */\n onRemove?: () => void\n /**\n * Whether the chip is removable\n */\n removable?: boolean\n /**\n * Error message to display (when status is 'error')\n */\n error?: string\n}\n\n/**\n * Format bytes to human-readable string\n */\nfunction formatBytes(bytes: number): string {\n if (bytes === 0) {\n return '0 B'\n }\n const k = 1024\n const sizes = ['B', 'KB', 'MB', 'GB']\n const i = Math.floor(Math.log(bytes) / Math.log(k))\n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(1))} ${sizes[i]}`\n}\n\n/**\n * Get icon component based on MIME type\n */\nfunction getFileIcon(type?: string) {\n if (!type) {\n return File\n }\n\n if (type.startsWith('image/')) {\n return FileImage\n }\n if (type.startsWith('video/')) {\n return FileVideo\n }\n if (type.startsWith('audio/')) {\n return FileAudio\n }\n if (type.startsWith('text/')) {\n return FileText\n }\n if (type.includes('javascript') || type.includes('typescript') || type.includes('json')\n || type.includes('xml')) {\n return FileCode\n }\n if (type.includes('zip') || type.includes('rar') || type.includes('tar') || type.includes('gz')) {\n return FileArchive\n }\n\n return File\n}\n\nconst statusStyles: Record<FileChipStatus, string> = {\n pending: 'border-silver/30',\n uploading: 'border-gold/50',\n complete: 'border-success/50',\n error: 'border-error/50',\n}\n\nexport const FileChip = React.forwardRef<HTMLDivElement, FileChipProps>(\n (\n {\n name,\n size,\n type,\n status = 'complete',\n previewUrl,\n onRemove,\n removable = true,\n error,\n className,\n ...rest\n },\n ref\n ) => {\n const Icon = getFileIcon(type)\n const isImage = type?.startsWith('image/')\n const showPreview = isImage && previewUrl\n\n return (\n <div\n ref={ref}\n className={cx(\n 'group relative inline-flex items-center gap-2 px-2 py-1.5',\n 'bg-charcoal border text-sm text-white',\n 'transition-colors duration-150',\n statusStyles[status],\n status === 'error' && 'bg-error/10',\n className\n )}\n role=\"listitem\"\n {...rest}\n >\n {/* Preview thumbnail or icon */}\n {showPreview ? (\n <div className=\"w-8 h-8 flex-shrink-0 overflow-hidden bg-slate\">\n <img\n src={previewUrl}\n alt=\"\"\n className=\"w-full h-full object-cover\"\n />\n </div>\n ) : (\n <Icon className={cx(\n 'w-4 h-4 flex-shrink-0',\n status === 'error' ? 'text-error' : 'text-silver'\n )}/>\n )}\n\n {/* File info */}\n <div className=\"flex flex-col min-w-0 flex-1\">\n <span className=\"truncate max-w-40\" title={name}>\n {name}\n </span>\n {size !== undefined && status !== 'error' && (\n <span className=\"text-xs text-silver/60\">\n {formatBytes(size)}\n </span>\n )}\n {status === 'error' && error && (\n <span className=\"text-xs text-error truncate\" title={error}>\n {error}\n </span>\n )}\n </div>\n\n {/* Status indicator */}\n {status === 'uploading' && (\n <Loader2 className=\"w-3.5 h-3.5 text-gold animate-spin flex-shrink-0\"/>\n )}\n {status === 'pending' && (\n <div className=\"w-2 h-2 rounded-full bg-silver/50 flex-shrink-0\"/>\n )}\n\n {/* Remove button */}\n {removable && onRemove && (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation()\n onRemove()\n }}\n className={cx(\n 'p-0.5 text-silver/40 hover:text-white transition-colors',\n 'hover:bg-white/10',\n 'opacity-0 group-hover:opacity-100',\n 'focus:opacity-100'\n )}\n aria-label={`Remove ${name}`}\n >\n <X className=\"w-3.5 h-3.5\"/>\n </button>\n )}\n </div>\n )\n }\n)\n\nFileChip.displayName = 'FileChip'\n\nexport default FileChip\n","import React from 'react'\nimport {cx} from '../utils/cx'\nimport {FileChip, type FileChipStatus} from './FileChip'\n\nexport interface AttachmentItem {\n /**\n * Unique identifier\n */\n id: string\n /**\n * The File object\n */\n file: File\n /**\n * Blob URL for image previews\n */\n previewUrl?: string\n /**\n * Current status\n */\n status: FileChipStatus\n /**\n * Error message if status is 'error'\n */\n error?: string\n}\n\nexport interface AttachmentPreviewProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Array of attachments to display\n */\n attachments: AttachmentItem[]\n /**\n * Called when an attachment should be removed\n */\n onRemove?: (id: string) => void\n /**\n * Whether attachments are removable\n */\n removable?: boolean\n /**\n * Maximum number of attachments to show before collapsing\n * Set to 0 or undefined to show all\n */\n maxVisible?: number\n}\n\nexport const AttachmentPreview = React.forwardRef<HTMLDivElement, AttachmentPreviewProps>(\n (\n {\n attachments,\n onRemove,\n removable = true,\n maxVisible,\n className,\n ...rest\n },\n ref\n ) => {\n if (attachments.length === 0) {\n return null\n }\n\n const visibleAttachments = maxVisible && maxVisible > 0\n ? attachments.slice(0, maxVisible)\n : attachments\n\n const hiddenCount = maxVisible && maxVisible > 0\n ? Math.max(0, attachments.length - maxVisible)\n : 0\n\n return (\n <div\n ref={ref}\n className={cx('flex flex-wrap gap-2', className)}\n role=\"list\"\n aria-label=\"Attached files\"\n {...rest}\n >\n {visibleAttachments.map((attachment) => (\n <FileChip\n key={attachment.id}\n name={attachment.file.name}\n size={attachment.file.size}\n type={attachment.file.type}\n status={attachment.status}\n previewUrl={attachment.previewUrl}\n error={attachment.error}\n removable={removable}\n onRemove={onRemove ? () => onRemove(attachment.id) : undefined}\n />\n ))}\n {hiddenCount > 0 && (\n <div\n className=\"inline-flex items-center px-2 py-1.5 bg-charcoal border border-silver/30 text-sm text-silver\">\n +{hiddenCount} more\n </div>\n )}\n </div>\n )\n }\n)\n\nAttachmentPreview.displayName = 'AttachmentPreview'\n\nexport default AttachmentPreview\n","import React from 'react'\nimport {cx} from '../utils/cx'\n\nexport interface LabelProps extends React.LabelHTMLAttributes<HTMLLabelElement> {\n required?: boolean\n}\n\nexport const Label = React.forwardRef<HTMLLabelElement, LabelProps>(\n ({className, required, children, ...rest}, ref) => {\n return (\n <label\n ref={ref}\n className={cx('block text-sm font-medium text-silver mb-1.5', className)}\n {...rest}\n >\n {children}\n {required && <span className=\"text-error ml-1\">*</span>}\n </label>\n )\n }\n)\n\nLabel.displayName = 'Label'\n\nexport default Label\n","import React from 'react'\nimport {cx} from '../utils/cx'\n\nexport interface HelperTextProps extends React.HTMLAttributes<HTMLParagraphElement> {\n error?: boolean\n}\n\nexport const HelperText = React.forwardRef<HTMLParagraphElement, HelperTextProps>(\n ({className, error, children, ...rest}, ref) => {\n return (\n <p\n ref={ref}\n className={cx('mt-1.5 text-xs', error ? 'text-error' : 'text-silver', className)}\n {...rest}\n >\n {children}\n </p>\n )\n }\n)\n\nHelperText.displayName = 'HelperText'\n\nexport default HelperText\n","import React from 'react'\nimport {cx} from '../utils/cx'\n\nexport interface TextareaProps extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {\n error?: boolean\n}\n\nexport const Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(\n ({error = false, className, disabled, ...rest}, ref) => {\n // Base textarea styles\n const base =\n 'w-full px-3 py-2 bg-graphite border border-ash rounded-none ' +\n 'text-white placeholder:text-zinc min-h-[80px] ' +\n 'transition-all duration-fast ' +\n 'focus:border-gold focus:ring-1 focus:ring-gold focus:outline-none ' +\n 'disabled:bg-slate disabled:text-dim disabled:cursor-not-allowed'\n\n // Error styles\n const errorCls = error ? 'border-error focus:border-error focus:ring-error' : ''\n\n return (\n <textarea\n ref={ref}\n className={cx(base, errorCls, disabled && 'opacity-90', className)}\n disabled={disabled}\n {...rest}\n />\n )\n }\n)\n\nTextarea.displayName = 'Textarea'\n\nexport default Textarea\n","import React from 'react'\nimport {cx} from '../utils/cx'\n\nexport interface SelectOption {\n label: string\n value: string | number\n}\n\nexport interface SelectProps extends React.SelectHTMLAttributes<HTMLSelectElement> {\n error?: boolean\n options?: SelectOption[]\n}\n\nconst selectBgImage = \"url(\\\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%23C9A227' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3e%3c/svg%3e\\\")\"\n\nexport const Select = React.forwardRef<HTMLSelectElement, SelectProps>(\n ({error = false, className, disabled, options, children, ...rest}, ref) => {\n return (\n <select\n ref={ref}\n className={cx(\n 'appearance-none bg-graphite border border-ash rounded-none text-white px-3 py-2 pr-8',\n 'focus:border-gold focus:ring-1 focus:ring-gold focus:outline-none',\n 'disabled:opacity-50 disabled:cursor-not-allowed',\n error && 'border-error focus:border-error focus:ring-error',\n className\n )}\n style={{\n backgroundImage: selectBgImage,\n backgroundPosition: 'right 0.5rem center',\n backgroundRepeat: 'no-repeat',\n backgroundSize: '1.5em 1.5em',\n }}\n disabled={disabled}\n {...rest}\n >\n {options\n ? options.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))\n : children}\n </select>\n )\n }\n)\n\nSelect.displayName = 'Select'\n\nexport default Select\n","import React, {useCallback} from 'react'\nimport {cx} from '../utils/cx'\n\nexport interface CheckboxProps extends React.InputHTMLAttributes<HTMLInputElement> {\n label?: string\n}\n\nconst checkmarkSvg = \"url(\\\"data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='%231A1A1A' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3e%3c/svg%3e\\\")\"\n\nexport const Checkbox = React.forwardRef<HTMLInputElement, CheckboxProps>(\n ({className, label, id, ...rest}, ref) => {\n const inputId = id || rest.name || Math.random().toString(36).substr(2, 9)\n\n const setRef = useCallback((node: HTMLInputElement | null) => {\n if (node) {\n // Set initial background image based on checked state\n if (node.checked) {\n node.style.backgroundImage = checkmarkSvg\n }\n }\n // Forward ref\n if (typeof ref === 'function') {\n ref(node)\n } else if (ref) {\n ref.current = node\n }\n }, [ref])\n\n return (\n <div className=\"flex items-center\">\n <input\n type=\"checkbox\"\n id={inputId}\n ref={setRef}\n className={cx(\n 'appearance-none h-4 w-4 border border-ash bg-graphite',\n 'checked:bg-gold checked:border-gold',\n 'focus:ring-1 focus:ring-gold focus:ring-offset-1 focus:ring-offset-obsidian',\n 'transition duration-200 ease-in-out cursor-pointer',\n 'disabled:opacity-50 disabled:cursor-not-allowed',\n className\n )}\n style={{\n backgroundPosition: 'center',\n backgroundSize: 'contain',\n backgroundRepeat: 'no-repeat',\n }}\n onChange={(e) => {\n const input = e.currentTarget\n if (input.checked) {\n input.style.backgroundImage = checkmarkSvg\n } else {\n input.style.backgroundImage = 'none'\n }\n rest.onChange?.(e)\n }}\n {...rest}\n />\n {label && (\n <label htmlFor={inputId}\n className=\"ml-2 text-sm text-silver cursor-pointer select-none\">\n {label}\n </label>\n )}\n </div>\n )\n }\n)\n\nCheckbox.displayName = 'Checkbox'\n\nexport default Checkbox\n","import React, {useCallback} from 'react'\nimport {cx} from '../utils/cx'\n\nexport interface RadioProps extends React.InputHTMLAttributes<HTMLInputElement> {\n label?: string\n}\n\nconst radioDotSvg = \"url(\\\"data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='%231A1A1A' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle cx='8' cy='8' r='3'/%3e%3c/svg%3e\\\")\"\n\nexport const Radio = React.forwardRef<HTMLInputElement, RadioProps>(\n ({className, label, id, ...rest}, ref) => {\n const inputId = id || rest.name || Math.random().toString(36).substr(2, 9)\n\n const setRef = useCallback((node: HTMLInputElement | null) => {\n if (node) {\n // Set initial background image based on checked state\n if (node.checked) {\n node.style.backgroundImage = radioDotSvg\n }\n }\n // Forward ref\n if (typeof ref === 'function') {\n ref(node)\n } else if (ref) {\n ref.current = node\n }\n }, [ref])\n\n return (\n <div className=\"flex items-center\">\n <input\n type=\"radio\"\n id={inputId}\n ref={setRef}\n className={cx(\n 'appearance-none h-4 w-4 border border-ash rounded-full bg-graphite',\n 'checked:bg-gold checked:border-gold',\n 'focus:ring-1 focus:ring-gold focus:ring-offset-1 focus:ring-offset-obsidian',\n 'transition duration-200 ease-in-out cursor-pointer',\n 'disabled:opacity-50 disabled:cursor-not-allowed',\n className\n )}\n style={{\n backgroundPosition: 'center',\n backgroundSize: 'contain',\n backgroundRepeat: 'no-repeat',\n }}\n onChange={(e) => {\n const input = e.currentTarget\n if (input.checked) {\n input.style.backgroundImage = radioDotSvg\n // Clear other radios in the same group\n if (input.name) {\n const radios = document.querySelectorAll<HTMLInputElement>(\n `input[type=\"radio\"][name=\"${input.name}\"]`)\n radios.forEach((radio) => {\n if (radio !== input) {\n radio.style.backgroundImage = 'none'\n }\n })\n }\n } else {\n input.style.backgroundImage = 'none'\n }\n rest.onChange?.(e)\n }}\n {...rest}\n />\n {label && (\n <label htmlFor={inputId}\n className=\"ml-2 text-sm text-silver cursor-pointer select-none\">\n {label}\n </label>\n )}\n </div>\n )\n }\n)\n\nRadio.displayName = 'Radio'\n\nexport default Radio\n","import React, {useCallback, useRef, useState} from 'react'\nimport {cx} from '../utils/cx'\n\nexport interface SwitchProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'onChange'> {\n checked?: boolean\n defaultChecked?: boolean\n onCheckedChange?: (checked: boolean) => void\n label?: string\n}\n\nexport const Switch = React.forwardRef<HTMLButtonElement, SwitchProps>(\n ({\n checked: controlledChecked,\n defaultChecked = false,\n onCheckedChange,\n disabled,\n className,\n label,\n ...rest\n }, ref) => {\n const [internalChecked, setInternalChecked] = useState(defaultChecked)\n const isControlled = controlledChecked !== undefined\n const checked = isControlled ? controlledChecked : internalChecked\n const buttonRef = useRef<HTMLButtonElement | null>(null)\n const setRefs = useCallback(\n (node: HTMLButtonElement | null) => {\n buttonRef.current = node\n if (typeof ref === 'function') {\n ref(node)\n } else if (ref) {\n ref.current = node\n }\n },\n [ref]\n )\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n if (disabled) {\n return\n }\n const newChecked = !checked\n if (!isControlled) {\n setInternalChecked(newChecked)\n }\n onCheckedChange?.(newChecked)\n rest.onClick?.(e)\n }\n\n return (\n <div className=\"flex items-center gap-2\">\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={checked}\n data-state={checked ? 'checked' : 'unchecked'}\n disabled={disabled}\n ref={setRefs}\n onClick={handleClick}\n className={cx(\n 'relative inline-flex h-6 w-11 shrink-0 cursor-pointer rounded-full border-2 border-transparent',\n 'transition-colors duration-200 ease-in-out',\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-gold focus-visible:ring-offset-2 focus-visible:ring-offset-obsidian',\n 'disabled:opacity-50 disabled:cursor-not-allowed',\n checked ? 'bg-gold' : 'bg-charcoal',\n className\n )}\n {...rest}\n >\n <span\n className={cx(\n 'pointer-events-none inline-block h-5 w-5 transform rounded-full bg-white shadow ring-0',\n 'transition duration-200 ease-in-out',\n checked ? 'translate-x-5' : 'translate-x-0'\n )}\n />\n </button>\n {label && (\n <span\n className=\"text-sm text-silver cursor-pointer\"\n onClick={() => {\n if (disabled) {\n return\n }\n buttonRef.current?.click()\n }}\n >\n {label}\n </span>\n )}\n </div>\n )\n }\n)\n\nSwitch.displayName = 'Switch'\n\nexport default Switch\n","import React, {useCallback, useRef, useState} from 'react'\nimport {cx} from '../utils/cx'\n\nexport interface SliderProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {\n value?: number\n defaultValue?: number\n min?: number\n max?: number\n step?: number\n onChange?: (value: number) => void\n onChangeEnd?: (value: number) => void\n disabled?: boolean\n showTooltip?: boolean\n formatValue?: (value: number) => string\n size?: 'sm' | 'md' | 'lg'\n}\n\nconst SIZE_TRACK: Record<string, string> = {\n sm: 'h-1',\n md: 'h-2',\n lg: 'h-3',\n}\n\nconst SIZE_THUMB: Record<string, string> = {\n sm: 'h-3 w-3',\n md: 'h-4 w-4',\n lg: 'h-5 w-5',\n}\n\nexport const Slider = React.forwardRef<HTMLDivElement, SliderProps>(\n (\n {\n value: controlledValue,\n defaultValue = 0,\n min = 0,\n max = 100,\n step = 1,\n onChange,\n onChangeEnd,\n disabled = false,\n showTooltip = false,\n formatValue = (v) => String(v),\n size = 'md',\n className,\n ...props\n },\n ref\n ) => {\n const [internalValue, setInternalValue] = useState(defaultValue)\n const [isDragging, setIsDragging] = useState(false)\n const trackRef = useRef<HTMLDivElement>(null)\n\n const isControlled = controlledValue !== undefined\n const value = isControlled ? controlledValue : internalValue\n\n const percentage = ((value - min) / (max - min)) * 100\n\n const updateValue = useCallback(\n (clientX: number) => {\n if (!trackRef.current || disabled) {\n return\n }\n\n const rect = trackRef.current.getBoundingClientRect()\n const percent = Math.max(0, Math.min(1, (clientX - rect.left) / rect.width))\n const rawValue = min + percent * (max - min)\n const steppedValue = Math.round(rawValue / step) * step\n const clampedValue = Math.max(min, Math.min(max, steppedValue))\n\n if (!isControlled) {\n setInternalValue(clampedValue)\n }\n onChange?.(clampedValue)\n },\n [min, max, step, disabled, isControlled, onChange]\n )\n\n const handleMouseDown = (e: React.MouseEvent) => {\n if (disabled) {\n return\n }\n setIsDragging(true)\n updateValue(e.clientX)\n\n const handleMouseMove = (e: MouseEvent) => {\n updateValue(e.clientX)\n }\n\n const handleMouseUp = (e: MouseEvent) => {\n setIsDragging(false)\n document.removeEventListener('mousemove', handleMouseMove)\n document.removeEventListener('mouseup', handleMouseUp)\n\n if (trackRef.current) {\n const rect = trackRef.current.getBoundingClientRect()\n const percent = Math.max(0, Math.min(1, (e.clientX - rect.left) / rect.width))\n const rawValue = min + percent * (max - min)\n const steppedValue = Math.round(rawValue / step) * step\n const clampedValue = Math.max(min, Math.min(max, steppedValue))\n onChangeEnd?.(clampedValue)\n }\n }\n\n document.addEventListener('mousemove', handleMouseMove)\n document.addEventListener('mouseup', handleMouseUp)\n }\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (disabled) {\n return\n }\n\n let newValue = value\n switch (e.key) {\n case 'ArrowRight':\n case 'ArrowUp':\n newValue = Math.min(max, value + step)\n break\n case 'ArrowLeft':\n case 'ArrowDown':\n newValue = Math.max(min, value - step)\n break\n case 'Home':\n newValue = min\n break\n case 'End':\n newValue = max\n break\n default:\n return\n }\n\n e.preventDefault()\n if (!isControlled) {\n setInternalValue(newValue)\n }\n onChange?.(newValue)\n onChangeEnd?.(newValue)\n }\n\n return (\n <div\n ref={ref}\n className={cx('relative w-full py-2', disabled && 'opacity-50', className)}\n {...props}\n >\n <div\n ref={trackRef}\n className={cx(\n 'relative w-full bg-charcoal border border-ash cursor-pointer',\n SIZE_TRACK[size]\n )}\n onMouseDown={handleMouseDown}\n >\n {/* Filled track */}\n <div\n className={cx('absolute inset-y-0 left-0 bg-gold', SIZE_TRACK[size])}\n style={{width: `${percentage}%`}}\n />\n\n {/* Thumb */}\n <div\n role=\"slider\"\n tabIndex={disabled ? -1 : 0}\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuenow={value}\n aria-disabled={disabled}\n onKeyDown={handleKeyDown}\n className={cx(\n 'absolute top-1/2 -translate-y-1/2 -translate-x-1/2',\n 'bg-gold border-2 border-gold-light rounded-full',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-gold focus-visible:ring-offset-2 focus-visible:ring-offset-obsidian',\n 'transition-transform duration-fast',\n isDragging && 'scale-110',\n !disabled && 'cursor-grab active:cursor-grabbing',\n SIZE_THUMB[size]\n )}\n style={{left: `${percentage}%`}}\n >\n {/* Tooltip */}\n {showTooltip && isDragging && (\n <div\n className=\"absolute bottom-full left-1/2 -translate-x-1/2 mb-2 px-2 py-1 bg-graphite border border-ash text-xs text-white whitespace-nowrap\">\n {formatValue(value)}\n </div>\n )}\n </div>\n </div>\n </div>\n )\n }\n)\n\nSlider.displayName = 'Slider'\n","import React from 'react'\nimport {cx} from '../utils/cx'\n\n// InputGroup container\nexport interface InputGroupProps extends React.HTMLAttributes<HTMLDivElement> {\n}\n\nexport const InputGroup = React.forwardRef<HTMLDivElement, InputGroupProps>(\n ({className, children, ...props}, ref) => {\n return (\n <div\n ref={ref}\n className={cx('flex', className)}\n {...props}\n >\n {children}\n </div>\n )\n }\n)\n\nInputGroup.displayName = 'InputGroup'\n\n// InputLeftAddon - static text/icon on the left\nexport interface InputAddonProps extends React.HTMLAttributes<HTMLDivElement> {\n}\n\nexport const InputLeftAddon = React.forwardRef<HTMLDivElement, InputAddonProps>(\n ({className, children, ...props}, ref) => {\n return (\n <div\n ref={ref}\n className={cx(\n 'flex items-center px-3 bg-slate border border-r-0 border-ash',\n 'text-sm text-silver whitespace-nowrap',\n className\n )}\n {...props}\n >\n {children}\n </div>\n )\n }\n)\n\nInputLeftAddon.displayName = 'InputLeftAddon'\n\n// InputRightAddon - static text/icon on the right\nexport const InputRightAddon = React.forwardRef<HTMLDivElement, InputAddonProps>(\n ({className, children, ...props}, ref) => {\n return (\n <div\n ref={ref}\n className={cx(\n 'flex items-center px-3 bg-slate border border-l-0 border-ash',\n 'text-sm text-silver whitespace-nowrap',\n className\n )}\n {...props}\n >\n {children}\n </div>\n )\n }\n)\n\nInputRightAddon.displayName = 'InputRightAddon'\n\n// InputLeftElement - overlaid element on the left (like an icon inside the input)\nexport interface InputElementProps extends React.HTMLAttributes<HTMLDivElement> {\n}\n\nexport const InputLeftElement = React.forwardRef<HTMLDivElement, InputElementProps>(\n ({className, children, ...props}, ref) => {\n return (\n <div\n ref={ref}\n className={cx(\n 'absolute left-0 inset-y-0 flex items-center pl-3',\n 'pointer-events-none text-silver',\n className\n )}\n {...props}\n >\n {children}\n </div>\n )\n }\n)\n\nInputLeftElement.displayName = 'InputLeftElement'\n\n// InputRightElement - overlaid element on the right (like a button inside the input)\nexport const InputRightElement = React.forwardRef<HTMLDivElement, InputElementProps>(\n ({className, children, ...props}, ref) => {\n return (\n <div\n ref={ref}\n className={cx(\n 'absolute right-0 inset-y-0 flex items-center pr-3',\n className\n )}\n {...props}\n >\n {children}\n </div>\n )\n }\n)\n\nInputRightElement.displayName = 'InputRightElement'\n\n// InputWrapper - for relative positioning when using left/right elements\nexport interface InputWrapperProps extends React.HTMLAttributes<HTMLDivElement> {\n}\n\nexport const InputWrapper = React.forwardRef<HTMLDivElement, InputWrapperProps>(\n ({className, children, ...props}, ref) => {\n return (\n <div\n ref={ref}\n className={cx('relative flex-1', className)}\n {...props}\n >\n {children}\n </div>\n )\n }\n)\n\nInputWrapper.displayName = 'InputWrapper'\n","import React from 'react'\nimport {AlertTriangle, CheckCircle, Info, XCircle} from 'lucide-react'\nimport {cx} from '../utils/cx'\n\nexport type AlertVariant = 'info' | 'success' | 'warning' | 'error'\n\nexport interface AlertProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: AlertVariant\n title?: string\n}\n\nconst icons = {\n info: Info,\n success: CheckCircle,\n warning: AlertTriangle,\n error: XCircle,\n}\n\nconst variantStyles = {\n info: 'bg-info/10 border-info text-info',\n success: 'bg-success/10 border-success text-success',\n warning: 'bg-warning/10 border-warning text-warning',\n error: 'bg-error/10 border-error text-error',\n}\n\nexport const Alert = React.forwardRef<HTMLDivElement, AlertProps>(\n ({variant = 'info', title, children, className, ...rest}, ref) => {\n const Icon = icons[variant]\n\n return (\n <div\n ref={ref}\n role=\"alert\"\n className={cx(\n 'relative w-full p-4 rounded-none border border-l-4 flex gap-3',\n variantStyles[variant],\n className\n )}\n {...rest}\n >\n <Icon className=\"h-5 w-5 shrink-0\"/>\n <div className=\"flex-1\">\n {title && <h5\n className=\"mb-1 font-medium leading-none tracking-tight text-current\">{title}</h5>}\n <div className=\"text-sm opacity-90\">{children}</div>\n </div>\n </div>\n )\n }\n)\n\nAlert.displayName = 'Alert'\n\nexport default Alert\n","import React from 'react'\nimport {cx} from '../utils/cx'\n\nexport type SpinnerSize = 'sm' | 'md' | 'lg'\n\nexport interface SpinnerProps extends React.SVGAttributes<SVGElement> {\n size?: SpinnerSize\n}\n\nexport const Spinner = ({className, size = 'md', ...rest}: SpinnerProps) => {\n const sizeClass =\n size === 'sm' ? 'h-4 w-4' : size === 'lg' ? 'h-8 w-8' : 'h-6 w-6'\n\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={cx('animate-spin text-gold', sizeClass, className)}\n {...rest}\n >\n <path d=\"M21 12a9 9 0 1 1-6.219-8.56\"/>\n </svg>\n )\n}\n\nSpinner.displayName = 'Spinner'\n\nexport default Spinner\n","import React from 'react'\nimport {cx} from '../utils/cx'\n\nexport type ProgressSize = 'sm' | 'md' | 'lg'\nexport type ProgressVariant = 'default' | 'success' | 'warning' | 'error'\n\nexport interface ProgressProps extends React.HTMLAttributes<HTMLDivElement> {\n value?: number\n max?: number\n size?: ProgressSize\n variant?: ProgressVariant\n showValue?: boolean\n formatValue?: (value: number, max: number) => string\n indeterminate?: boolean\n}\n\nconst SIZE_MAP: Record<ProgressSize, string> = {\n sm: 'h-1',\n md: 'h-2',\n lg: 'h-3',\n}\n\nconst VARIANT_MAP: Record<ProgressVariant, string> = {\n default: 'bg-gold',\n success: 'bg-success',\n warning: 'bg-warning',\n error: 'bg-error',\n}\n\nexport const Progress = React.forwardRef<HTMLDivElement, ProgressProps>(\n (\n {\n value = 0,\n max = 100,\n size = 'md',\n variant = 'default',\n showValue = false,\n formatValue,\n indeterminate = false,\n className,\n ...props\n },\n ref\n ) => {\n const percentage = Math.min(100, Math.max(0, (value / max) * 100))\n const displayValue = formatValue\n ? formatValue(value, max)\n : `${Math.round(percentage)}%`\n\n return (\n <div ref={ref} className={cx('w-full', className)} {...props}>\n {showValue && (\n <div className=\"flex justify-between mb-1\">\n <span className=\"text-sm text-silver\">Progress</span>\n <span className=\"text-sm text-white font-medium\">{displayValue}</span>\n </div>\n )}\n <div\n className={cx(\n 'w-full bg-charcoal border border-ash overflow-hidden rounded-none',\n SIZE_MAP[size]\n )}\n role=\"progressbar\"\n aria-valuenow={indeterminate ? undefined : value}\n aria-valuemin={0}\n aria-valuemax={max}\n >\n <div\n className={cx(\n 'h-full transition-all duration-300 ease-out',\n VARIANT_MAP[variant],\n indeterminate && 'animate-pulse'\n )}\n style={{\n width: indeterminate ? '100%' : `${percentage}%`,\n }}\n />\n </div>\n </div>\n )\n }\n)\n\nProgress.displayName = 'Progress'\n","import React, {createContext, useCallback, useContext, useEffect, useState} from 'react'\nimport {createPortal} from 'react-dom'\nimport {AlertCircle, AlertTriangle, CheckCircle, Info, X} from 'lucide-react'\nimport {cx} from '../utils/cx'\n\nexport type ToastVariant = 'default' | 'success' | 'error' | 'warning' | 'info'\nexport type ToastPosition =\n 'top-right'\n | 'top-left'\n | 'bottom-right'\n | 'bottom-left'\n | 'top-center'\n | 'bottom-center'\n\nexport interface ToastData {\n id: string\n title?: string\n description?: string\n variant?: ToastVariant\n duration?: number\n action?: React.ReactNode\n}\n\ninterface ToastContextValue {\n toasts: ToastData[]\n addToast: (toast: Omit<ToastData, 'id'>) => string\n removeToast: (id: string) => void\n position: ToastPosition\n}\n\nconst ToastContext = createContext<ToastContextValue | null>(null)\n\nexport function useToast() {\n const context = useContext(ToastContext)\n if (!context) {\n throw new Error('useToast must be used within a ToastProvider')\n }\n\n const toast = useCallback(\n (options: Omit<ToastData, 'id'>) => {\n return context.addToast(options)\n },\n [context]\n )\n\n return {\n toast,\n dismiss: context.removeToast,\n }\n}\n\n// ToastProvider - wrap your app with this\nexport interface ToastProviderProps {\n children: React.ReactNode\n position?: ToastPosition\n defaultDuration?: number\n}\n\nexport const ToastProvider: React.FC<ToastProviderProps> = ({\n children,\n position = 'bottom-right',\n defaultDuration = 5000,\n}) => {\n const [toasts, setToasts] = useState<ToastData[]>([])\n const [mounted, setMounted] = useState(false)\n\n useEffect(() => {\n setMounted(true)\n }, [])\n\n const addToast = useCallback(\n (toast: Omit<ToastData, 'id'>) => {\n const id = Math.random().toString(36).substr(2, 9)\n const newToast: ToastData = {\n ...toast,\n id,\n duration: toast.duration ?? defaultDuration,\n }\n setToasts((prev) => [...prev, newToast])\n return id\n },\n [defaultDuration]\n )\n\n const removeToast = useCallback((id: string) => {\n setToasts((prev) => prev.filter((t) => t.id !== id))\n }, [])\n\n return (\n <ToastContext.Provider value={{toasts, addToast, removeToast, position}}>\n {children}\n {mounted && <ToastViewport/>}\n </ToastContext.Provider>\n )\n}\n\nToastProvider.displayName = 'ToastProvider'\n\n// ToastViewport - container for all toasts\nconst ToastViewport: React.FC = () => {\n const context = useContext(ToastContext)\n if (!context) {\n return null\n }\n\n const {toasts, position} = context\n\n const positionClasses: Record<ToastPosition, string> = {\n 'top-right': 'top-4 right-4',\n 'top-left': 'top-4 left-4',\n 'bottom-right': 'bottom-4 right-4',\n 'bottom-left': 'bottom-4 left-4',\n 'top-center': 'top-4 left-1/2 -translate-x-1/2',\n 'bottom-center': 'bottom-4 left-1/2 -translate-x-1/2',\n }\n\n return createPortal(\n <div\n className={cx(\n 'fixed z-50 flex flex-col gap-2 pointer-events-none',\n positionClasses[position]\n )}\n >\n {toasts.map((toast) => (\n <Toast key={toast.id} {...toast} />\n ))}\n </div>,\n document.body\n )\n}\n\n// Individual Toast\ninterface ToastProps extends ToastData {\n}\n\nconst VARIANT_STYLES: Record<ToastVariant, string> = {\n default: 'bg-charcoal border-ash',\n success: 'bg-charcoal border-success/50',\n error: 'bg-charcoal border-error/50',\n warning: 'bg-charcoal border-warning/50',\n info: 'bg-charcoal border-info/50',\n}\n\nconst VARIANT_ICONS: Record<ToastVariant, React.ReactNode> = {\n default: null,\n success: <CheckCircle className=\"h-5 w-5 text-success\"/>,\n error: <AlertCircle className=\"h-5 w-5 text-error\"/>,\n warning: <AlertTriangle className=\"h-5 w-5 text-warning\"/>,\n info: <Info className=\"h-5 w-5 text-info\"/>,\n}\n\nconst Toast: React.FC<ToastProps> = ({\n id,\n title,\n description,\n variant = 'default',\n duration,\n action,\n}) => {\n const context = useContext(ToastContext)\n\n useEffect(() => {\n if (duration && duration > 0) {\n const timer = setTimeout(() => {\n context?.removeToast(id)\n }, duration)\n return () => clearTimeout(timer)\n }\n }, [id, duration, context])\n\n const icon = VARIANT_ICONS[variant]\n\n return (\n <div\n role=\"alert\"\n className={cx(\n 'pointer-events-auto w-80 p-4 border shadow-lg animate-slide-in-right',\n VARIANT_STYLES[variant]\n )}\n >\n <div className=\"flex gap-3\">\n {icon && <div className=\"shrink-0 mt-0.5\">{icon}</div>}\n <div className=\"flex-1 min-w-0\">\n {title && (\n <p className=\"text-sm font-medium text-white\">{title}</p>\n )}\n {description && (\n <p className=\"text-sm text-silver mt-1\">{description}</p>\n )}\n {action && <div className=\"mt-3\">{action}</div>}\n </div>\n <button\n onClick={() => context?.removeToast(id)}\n className=\"shrink-0 text-silver hover:text-white transition-colors\"\n >\n <X className=\"h-4 w-4\"/>\n <span className=\"sr-only\">Dismiss</span>\n </button>\n </div>\n </div>\n )\n}\n\nToast.displayName = 'Toast'\n","import React, {useEffect, useState} from 'react'\nimport {createPortal} from 'react-dom'\nimport {X} from 'lucide-react'\nimport {cx} from '../utils/cx'\n\nexport interface ModalProps {\n isOpen: boolean\n onClose: () => void\n title?: string\n children: React.ReactNode\n className?: string\n}\n\nexport const Modal = ({isOpen, onClose, title, children, className}: ModalProps) => {\n const [mounted, setMounted] = useState(false)\n\n useEffect(() => {\n setMounted(true)\n }, [])\n\n useEffect(() => {\n if (isOpen) {\n const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth\n document.body.style.overflow = 'hidden'\n document.body.style.paddingRight = `${scrollbarWidth}px`\n } else {\n document.body.style.overflow = 'unset'\n document.body.style.paddingRight = '0px'\n }\n return () => {\n document.body.style.overflow = 'unset'\n document.body.style.paddingRight = '0px'\n }\n }, [isOpen])\n\n useEffect(() => {\n const handleEsc = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n onClose()\n }\n }\n window.addEventListener('keydown', handleEsc)\n return () => window.removeEventListener('keydown', handleEsc)\n }, [onClose])\n\n if (!mounted) {\n return null\n }\n\n // Don't render anything if closed, unless we want exit animations. \n // My CSS relies on data-state, but if I unmount immediately, exit animation won't play.\n // To support exit animations, I'd need a transition manager (like framer-motion or headlessui).\n // For this simple implementation, I'll render conditionally. \n // If I want animation, I need to keep it mounted until animation ends.\n // Given the prompt \"add all suggestions\" and \"premium\", a simple unmount is acceptable for v1\n // without heavy deps. However, the CSS I wrote has `data-state=closed`. Without a transition\n // library, handling exit animation is tricky. I'll just conditional render for now. The entry\n // animation `animate-fade-in` will play.\n\n if (!isOpen) {\n return null;\n }\n\n const content = (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center p-4 sm:p-6\"\n onClick={onClose}>\n <div className=\"fixed inset-0 z-40 bg-obsidian/80 backdrop-blur-sm\" aria-hidden=\"true\"/>\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n className={cx(\n 'bg-charcoal border border-gold/30 shadow-2xl z-50 w-full max-w-lg p-6 rounded-none relative flex flex-col',\n className\n )}\n data-state=\"open\"\n onClick={(e) => e.stopPropagation()}\n >\n <div className=\"flex items-center justify-between mb-2\">\n {title ? <h3 className=\"text-xl font-semibold text-white m-0\">{title}</h3> : <div/>}\n <button onClick={onClose}\n className=\"text-silver hover:text-white transition-colors ml-auto\">\n <X className=\"h-5 w-5\"/>\n <span className=\"sr-only\">Close</span>\n </button>\n </div>\n <div className=\"overflow-y-auto min-h-0\">{children}</div>\n </div>\n </div>\n )\n\n return createPortal(content, document.body)\n}\n\nModal.displayName = 'Modal'\n\nexport default Modal\n","import React, {useEffect, useState} from 'react'\nimport {createPortal} from 'react-dom'\nimport {X} from 'lucide-react'\nimport {cx} from '../utils/cx'\n\nexport type DrawerPosition = 'left' | 'right' | 'top' | 'bottom'\n\nexport interface DrawerProps {\n isOpen: boolean\n onClose: () => void\n position?: DrawerPosition\n title?: string\n size?: 'sm' | 'md' | 'lg' | 'xl' | 'full'\n children: React.ReactNode\n className?: string\n}\n\nconst SIZE_MAP: Record<string, Record<DrawerPosition, string>> = {\n sm: {\n left: 'w-64',\n right: 'w-64',\n top: 'h-48',\n bottom: 'h-48',\n },\n md: {\n left: 'w-80',\n right: 'w-80',\n top: 'h-64',\n bottom: 'h-64',\n },\n lg: {\n left: 'w-96',\n right: 'w-96',\n top: 'h-80',\n bottom: 'h-80',\n },\n xl: {\n left: 'w-[32rem]',\n right: 'w-[32rem]',\n top: 'h-96',\n bottom: 'h-96',\n },\n full: {\n left: 'w-full',\n right: 'w-full',\n top: 'h-full',\n bottom: 'h-full',\n },\n}\n\nconst POSITION_CLASSES: Record<DrawerPosition, string> = {\n left: 'left-0 top-0 h-full',\n right: 'right-0 top-0 h-full',\n top: 'top-0 left-0 w-full',\n bottom: 'bottom-0 left-0 w-full',\n}\n\nconst TRANSFORM_CLASSES: Record<DrawerPosition, { open: string; closed: string }> = {\n left: {open: 'translate-x-0', closed: '-translate-x-full'},\n right: {open: 'translate-x-0', closed: 'translate-x-full'},\n top: {open: 'translate-y-0', closed: '-translate-y-full'},\n bottom: {open: 'translate-y-0', closed: 'translate-y-full'},\n}\n\nexport const Drawer: React.FC<DrawerProps> = ({\n isOpen,\n onClose,\n position = 'right',\n title,\n size = 'md',\n children,\n className,\n}) => {\n const [mounted, setMounted] = useState(false)\n\n useEffect(() => {\n setMounted(true)\n }, [])\n\n useEffect(() => {\n if (isOpen) {\n const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth\n document.body.style.overflow = 'hidden'\n document.body.style.paddingRight = `${scrollbarWidth}px`\n } else {\n document.body.style.overflow = 'unset'\n document.body.style.paddingRight = '0px'\n }\n return () => {\n document.body.style.overflow = 'unset'\n document.body.style.paddingRight = '0px'\n }\n }, [isOpen])\n\n useEffect(() => {\n const handleEsc = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n onClose()\n }\n }\n window.addEventListener('keydown', handleEsc)\n return () => window.removeEventListener('keydown', handleEsc)\n }, [onClose])\n\n if (!mounted) {\n return null\n }\n\n const content = (\n <div\n className={cx(\n 'fixed inset-0 z-50',\n isOpen ? 'pointer-events-auto' : 'pointer-events-none'\n )}\n >\n {/* Backdrop */}\n <div\n className={cx(\n 'fixed inset-0 bg-obsidian/80 backdrop-blur-sm transition-opacity duration-300',\n isOpen ? 'opacity-100' : 'opacity-0'\n )}\n onClick={onClose}\n aria-hidden=\"true\"\n />\n\n {/* Drawer panel */}\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n className={cx(\n 'fixed bg-charcoal border-ash shadow-2xl flex flex-col',\n 'transition-transform duration-300 ease-out',\n POSITION_CLASSES[position],\n SIZE_MAP[size][position],\n position === 'left' && 'border-r',\n position === 'right' && 'border-l',\n position === 'top' && 'border-b',\n position === 'bottom' && 'border-t',\n isOpen ? TRANSFORM_CLASSES[position].open : TRANSFORM_CLASSES[position].closed,\n className\n )}\n >\n {/* Header */}\n <div className=\"flex items-center justify-between px-4 py-3 border-b border-ash\">\n {title ? (\n <h2 className=\"text-lg font-semibold text-white m-0\">{title}</h2>\n ) : (\n <div/>\n )}\n <button\n onClick={onClose}\n className=\"text-silver hover:text-white transition-colors\"\n >\n <X className=\"h-5 w-5\"/>\n <span className=\"sr-only\">Close</span>\n </button>\n </div>\n\n {/* Content */}\n <div className=\"flex-1 overflow-auto p-4\">{children}</div>\n </div>\n </div>\n )\n\n return createPortal(content, document.body)\n}\n\nDrawer.displayName = 'Drawer'\n","import React, {useCallback, useEffect, useId, useRef, useState} from 'react'\nimport {cx} from '../utils/cx'\n\nexport type PopoverPosition = 'top' | 'bottom' | 'left' | 'right'\nexport type PopoverAlign = 'start' | 'center' | 'end'\n\nexport interface PopoverProps {\n children: React.ReactNode\n /** The trigger element */\n trigger: React.ReactElement\n /** Position relative to trigger */\n position?: PopoverPosition\n /** Alignment along the position axis */\n align?: PopoverAlign\n /** Controlled open state */\n open?: boolean\n /** Callback when open state changes */\n onOpenChange?: (open: boolean) => void\n /** Close when clicking outside */\n closeOnClickOutside?: boolean\n}\n\nconst POSITION_CLASSES: Record<PopoverPosition, Record<PopoverAlign, string>> = {\n top: {\n start: 'bottom-full left-0 mb-2',\n center: 'bottom-full left-1/2 -translate-x-1/2 mb-2',\n end: 'bottom-full right-0 mb-2',\n },\n bottom: {\n start: 'top-full left-0 mt-2',\n center: 'top-full left-1/2 -translate-x-1/2 mt-2',\n end: 'top-full right-0 mt-2',\n },\n left: {\n start: 'right-full top-0 mr-2',\n center: 'right-full top-1/2 -translate-y-1/2 mr-2',\n end: 'right-full bottom-0 mr-2',\n },\n right: {\n start: 'left-full top-0 ml-2',\n center: 'left-full top-1/2 -translate-y-1/2 ml-2',\n end: 'left-full bottom-0 ml-2',\n },\n}\n\nexport const Popover: React.FC<PopoverProps> = ({\n children,\n trigger,\n position = 'bottom',\n align = 'center',\n open: controlledOpen,\n onOpenChange,\n closeOnClickOutside = true,\n}) => {\n const [internalOpen, setInternalOpen] = useState(false)\n const isControlled = controlledOpen !== undefined\n const isOpen = isControlled ? controlledOpen : internalOpen\n\n const containerRef = useRef<HTMLDivElement>(null)\n const baseId = useId()\n\n const setIsOpen = useCallback(\n (newOpen: boolean) => {\n if (!isControlled) {\n setInternalOpen(newOpen)\n }\n onOpenChange?.(newOpen)\n },\n [isControlled, onOpenChange]\n )\n\n // Close on outside click\n useEffect(() => {\n if (!isOpen || !closeOnClickOutside) {\n return\n }\n\n const handleClickOutside = (e: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\n setIsOpen(false)\n }\n }\n\n document.addEventListener('mousedown', handleClickOutside)\n return () => document.removeEventListener('mousedown', handleClickOutside)\n }, [isOpen, closeOnClickOutside, setIsOpen])\n\n // Close on escape\n useEffect(() => {\n if (!isOpen) {\n return\n }\n\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n setIsOpen(false)\n }\n }\n\n document.addEventListener('keydown', handleEscape)\n return () => document.removeEventListener('keydown', handleEscape)\n }, [isOpen, setIsOpen])\n\n const handleTriggerClick = () => {\n setIsOpen(!isOpen)\n }\n\n const triggerElement = React.cloneElement(trigger as React.ReactElement<any>, {\n onClick: handleTriggerClick,\n 'aria-haspopup': 'dialog',\n 'aria-expanded': isOpen,\n 'aria-controls': `${baseId}-popover`,\n id: `${baseId}-trigger`,\n })\n\n return (\n <div ref={containerRef} className=\"relative inline-block\">\n {triggerElement}\n {isOpen && (\n <div\n id={`${baseId}-popover`}\n role=\"dialog\"\n aria-labelledby={`${baseId}-trigger`}\n className={cx(\n 'absolute z-50 min-w-48 p-4',\n 'bg-charcoal border border-ash shadow-lg',\n 'animate-fade-in',\n POSITION_CLASSES[position][align]\n )}\n >\n {children}\n </div>\n )}\n </div>\n )\n}\n\nPopover.displayName = 'Popover'\n","import React, {useCallback} from 'react'\nimport {Modal, type ModalProps} from './Modal'\nimport {Button} from './Button'\nimport {cx} from '../utils/cx'\n\n// ConfirmDialog - for confirmation actions\nexport interface ConfirmDialogProps extends Omit<ModalProps, 'children'> {\n description?: React.ReactNode\n confirmText?: string\n cancelText?: string\n onConfirm: () => void | Promise<void>\n onCancel?: () => void\n confirmVariant?: 'primary' | 'important' | 'danger'\n isLoading?: boolean\n}\n\nexport const ConfirmDialog: React.FC<ConfirmDialogProps> = ({\n title = 'Confirm',\n description,\n confirmText = 'Confirm',\n cancelText = 'Cancel',\n onConfirm,\n onCancel,\n onClose,\n confirmVariant = 'important',\n isLoading = false,\n ...props\n}) => {\n const handleCancel = useCallback(() => {\n onCancel?.()\n onClose()\n }, [onCancel, onClose])\n\n const handleConfirm = useCallback(async () => {\n await onConfirm()\n onClose()\n }, [onConfirm, onClose])\n\n return (\n <Modal title={title} onClose={onClose} {...props}>\n {description && (\n <p className=\"text-sm text-silver mb-6\">{description}</p>\n )}\n <div className=\"flex justify-end gap-3\">\n <Button variant=\"outlined\" onClick={handleCancel} disabled={isLoading}>\n {cancelText}\n </Button>\n <Button\n variant={confirmVariant}\n onClick={handleConfirm}\n loading={isLoading}\n >\n {confirmText}\n </Button>\n </div>\n </Modal>\n )\n}\n\nConfirmDialog.displayName = 'ConfirmDialog'\n\n// AlertDialog - for important alerts\nexport interface AlertDialogProps extends Omit<ModalProps, 'children'> {\n description?: React.ReactNode\n acknowledgeText?: string\n variant?: 'default' | 'warning' | 'error'\n}\n\nexport const AlertDialog: React.FC<AlertDialogProps> = ({\n title = 'Alert',\n description,\n acknowledgeText = 'OK',\n variant = 'default',\n onClose,\n ...props\n}) => {\n const titleClass = cx(\n variant === 'warning' && 'text-warning',\n variant === 'error' && 'text-error'\n )\n\n return (\n <Modal onClose={onClose} {...props}>\n <h3 className={cx('text-xl font-semibold mb-2', titleClass)}>{title}</h3>\n {description && (\n <p className=\"text-sm text-silver mb-6\">{description}</p>\n )}\n <div className=\"flex justify-end\">\n <Button variant=\"primary\" onClick={onClose}>\n {acknowledgeText}\n </Button>\n </div>\n </Modal>\n )\n}\n\nAlertDialog.displayName = 'AlertDialog'\n\n// PromptDialog - for user input\nexport interface PromptDialogProps extends Omit<ModalProps, 'children'> {\n description?: React.ReactNode\n placeholder?: string\n defaultValue?: string\n submitText?: string\n cancelText?: string\n onSubmit: (value: string) => void | Promise<void>\n onCancel?: () => void\n isLoading?: boolean\n}\n\nexport const PromptDialog: React.FC<PromptDialogProps> = ({\n title = 'Enter Value',\n description,\n placeholder,\n defaultValue = '',\n submitText = 'Submit',\n cancelText = 'Cancel',\n onSubmit,\n onCancel,\n onClose,\n isLoading = false,\n ...props\n}) => {\n const [value, setValue] = React.useState(defaultValue)\n\n const handleCancel = useCallback(() => {\n onCancel?.()\n onClose()\n }, [onCancel, onClose])\n\n const handleSubmit = useCallback(\n async (e: React.FormEvent) => {\n e.preventDefault()\n await onSubmit(value)\n onClose()\n },\n [onSubmit, value, onClose]\n )\n\n return (\n <Modal title={title} onClose={onClose} {...props}>\n <form onSubmit={handleSubmit}>\n {description && (\n <p className=\"text-sm text-silver mb-4\">{description}</p>\n )}\n <input\n type=\"text\"\n value={value}\n onChange={(e) => setValue(e.target.value)}\n placeholder={placeholder}\n className={cx(\n 'w-full px-3 py-2 bg-graphite border border-ash',\n 'text-white placeholder:text-zinc',\n 'focus:border-gold focus:ring-1 focus:ring-gold focus:outline-none',\n 'mb-6'\n )}\n autoFocus\n />\n <div className=\"flex justify-end gap-3\">\n <Button\n type=\"button\"\n variant=\"outlined\"\n onClick={handleCancel}\n disabled={isLoading}\n >\n {cancelText}\n </Button>\n <Button type=\"submit\" variant=\"important\" loading={isLoading}>\n {submitText}\n </Button>\n </div>\n </form>\n </Modal>\n )\n}\n\nPromptDialog.displayName = 'PromptDialog'\n","import React, {createContext, useCallback, useContext, useId, useState} from 'react'\nimport {cx} from '../utils/cx'\n\n// Context for managing tab state\ninterface TabsContextValue {\n activeTab: string\n setActiveTab: (id: string) => void\n baseId: string\n}\n\nconst TabsContext = createContext<TabsContextValue | null>(null)\n\nfunction useTabsContext() {\n const context = useContext(TabsContext)\n if (!context) {\n throw new Error('Tabs components must be used within a Tabs provider')\n }\n return context\n}\n\n// Main Tabs container\nexport interface TabsProps extends React.HTMLAttributes<HTMLDivElement> {\n /** The id of the initially active tab */\n defaultValue?: string\n /** Controlled active tab value */\n value?: string\n /** Callback when active tab changes */\n onValueChange?: (value: string) => void\n}\n\nexport const Tabs = React.forwardRef<HTMLDivElement, TabsProps>(\n ({defaultValue, value, onValueChange, children, className, ...props}, ref) => {\n const [internalValue, setInternalValue] = useState(defaultValue ?? '')\n const isControlled = value !== undefined\n const activeTab = isControlled ? value : internalValue\n const baseId = useId()\n\n const setActiveTab = useCallback(\n (id: string) => {\n if (!isControlled) {\n setInternalValue(id)\n }\n onValueChange?.(id)\n },\n [isControlled, onValueChange]\n )\n\n return (\n <TabsContext.Provider value={{activeTab, setActiveTab, baseId}}>\n <div ref={ref} className={cx('w-full', className)} {...props}>\n {children}\n </div>\n </TabsContext.Provider>\n )\n }\n)\n\nTabs.displayName = 'Tabs'\n\n// TabList - container for Tab buttons\nexport interface TabListProps extends React.HTMLAttributes<HTMLDivElement> {\n}\n\nexport const TabList = React.forwardRef<HTMLDivElement, TabListProps>(\n ({children, className, ...props}, ref) => {\n return (\n <div\n ref={ref}\n role=\"tablist\"\n className={cx(\n 'flex border-b border-ash',\n className\n )}\n {...props}\n >\n {children}\n </div>\n )\n }\n)\n\nTabList.displayName = 'TabList'\n\n// Tab - individual tab button\nexport interface TabProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n /** Unique identifier for this tab */\n value: string\n}\n\nexport const Tab = React.forwardRef<HTMLButtonElement, TabProps>(\n ({value, children, className, disabled, ...props}, ref) => {\n const {activeTab, setActiveTab, baseId} = useTabsContext()\n const isActive = activeTab === value\n const panelId = `${baseId}-panel-${value}`\n const tabId = `${baseId}-tab-${value}`\n\n return (\n <button\n ref={ref}\n id={tabId}\n type=\"button\"\n role=\"tab\"\n aria-selected={isActive}\n aria-controls={panelId}\n tabIndex={isActive ? 0 : -1}\n disabled={disabled}\n onClick={() => setActiveTab(value)}\n className={cx(\n 'px-4 py-2 text-sm font-medium transition-all duration-fast',\n 'border-b-2 -mb-px',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-gold focus-visible:ring-inset',\n isActive\n ? 'border-gold text-gold'\n : 'border-transparent text-silver hover:text-white hover:border-ash',\n disabled && 'opacity-50 cursor-not-allowed',\n className\n )}\n {...props}\n >\n {children}\n </button>\n )\n }\n)\n\nTab.displayName = 'Tab'\n\n// TabPanel - content panel for a tab\nexport interface TabPanelProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Value matching the corresponding Tab */\n value: string\n /** Force the panel to stay mounted when inactive */\n forceMount?: boolean\n}\n\nexport const TabPanel = React.forwardRef<HTMLDivElement, TabPanelProps>(\n ({value, forceMount = false, children, className, ...props}, ref) => {\n const {activeTab, baseId} = useTabsContext()\n const isActive = activeTab === value\n const panelId = `${baseId}-panel-${value}`\n const tabId = `${baseId}-tab-${value}`\n\n if (!isActive && !forceMount) {\n return null\n }\n\n return (\n <div\n ref={ref}\n id={panelId}\n role=\"tabpanel\"\n aria-labelledby={tabId}\n tabIndex={0}\n hidden={!isActive}\n className={cx(\n 'pt-4 focus-visible:outline-none',\n !isActive && 'hidden',\n className\n )}\n {...props}\n >\n {children}\n </div>\n )\n }\n)\n\nTabPanel.displayName = 'TabPanel'\n","import React, {createContext, useCallback, useContext, useId, useState} from 'react'\nimport {ChevronDown} from 'lucide-react'\nimport {cx} from '../utils/cx'\n\n// Context for managing accordion state\ninterface AccordionContextValue {\n expandedItems: Set<string>\n toggleItem: (id: string) => void\n type: 'single' | 'multiple'\n}\n\nconst AccordionContext = createContext<AccordionContextValue | null>(null)\n\nfunction useAccordionContext() {\n const context = useContext(AccordionContext)\n if (!context) {\n throw new Error('Accordion components must be used within an Accordion provider')\n }\n return context\n}\n\n// Main Accordion container\nexport interface AccordionProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Allow multiple items to be open at once */\n type?: 'single' | 'multiple'\n /** Default expanded item(s) */\n defaultValue?: string | string[]\n /** Controlled expanded item(s) */\n value?: string | string[]\n /** Callback when expanded items change */\n onValueChange?: (value: string | string[]) => void\n}\n\nexport const Accordion = React.forwardRef<HTMLDivElement, AccordionProps>(\n (\n {type = 'single', defaultValue, value, onValueChange, children, className, ...props},\n ref\n ) => {\n const [internalValue, setInternalValue] = useState<Set<string>>(() => {\n if (defaultValue) {\n return new Set(Array.isArray(defaultValue) ? defaultValue : [defaultValue])\n }\n return new Set()\n })\n\n const isControlled = value !== undefined\n const expandedItems = isControlled\n ? new Set(Array.isArray(value) ? value : [value])\n : internalValue\n\n const toggleItem = useCallback(\n (id: string) => {\n const newSet = new Set(expandedItems)\n\n if (newSet.has(id)) {\n newSet.delete(id)\n } else {\n if (type === 'single') {\n newSet.clear()\n }\n newSet.add(id)\n }\n\n if (!isControlled) {\n setInternalValue(newSet)\n }\n\n const newValue = Array.from(newSet)\n onValueChange?.(type === 'single' ? newValue[0] ?? '' : newValue)\n },\n [expandedItems, type, isControlled, onValueChange]\n )\n\n return (\n <AccordionContext.Provider value={{expandedItems, toggleItem, type}}>\n <div\n ref={ref}\n className={cx('divide-y divide-ash border border-ash', className)}\n {...props}\n >\n {children}\n </div>\n </AccordionContext.Provider>\n )\n }\n)\n\nAccordion.displayName = 'Accordion'\n\n// AccordionItem - individual accordion section\nexport interface AccordionItemProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Unique identifier for this item */\n value: string\n /** Disable this item */\n disabled?: boolean\n}\n\nconst AccordionItemContext = createContext<{ value: string; disabled: boolean } | null>(null)\n\nexport const AccordionItem = React.forwardRef<HTMLDivElement, AccordionItemProps>(\n ({value, disabled = false, children, className, ...props}, ref) => {\n return (\n <AccordionItemContext.Provider value={{value, disabled}}>\n <div\n ref={ref}\n data-state={useAccordionContext().expandedItems.has(value) ? 'open' : 'closed'}\n className={cx('bg-charcoal', className)}\n {...props}\n >\n {children}\n </div>\n </AccordionItemContext.Provider>\n )\n }\n)\n\nAccordionItem.displayName = 'AccordionItem'\n\n// AccordionTrigger - clickable header\nexport interface AccordionTriggerProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n}\n\nexport const AccordionTrigger = React.forwardRef<HTMLButtonElement, AccordionTriggerProps>(\n ({children, className, ...props}, ref) => {\n const {expandedItems, toggleItem} = useAccordionContext()\n const itemContext = useContext(AccordionItemContext)\n const baseId = useId()\n\n if (!itemContext) {\n throw new Error('AccordionTrigger must be used within an AccordionItem')\n }\n\n const {value, disabled} = itemContext\n const isExpanded = expandedItems.has(value)\n\n return (\n <h3 className=\"m-0\">\n <button\n ref={ref}\n type=\"button\"\n id={`${baseId}-trigger-${value}`}\n aria-expanded={isExpanded}\n aria-controls={`${baseId}-content-${value}`}\n disabled={disabled}\n onClick={() => toggleItem(value)}\n className={cx(\n 'flex w-full items-center justify-between px-4 py-3',\n 'text-left text-sm font-medium text-white',\n 'transition-colors duration-fast',\n 'hover:bg-graphite',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-gold focus-visible:ring-inset',\n disabled && 'opacity-50 cursor-not-allowed',\n className\n )}\n {...props}\n >\n <span>{children}</span>\n <ChevronDown\n className={cx(\n 'h-4 w-4 text-silver transition-transform duration-200',\n isExpanded && 'rotate-180'\n )}\n />\n </button>\n </h3>\n )\n }\n)\n\nAccordionTrigger.displayName = 'AccordionTrigger'\n\n// AccordionContent - expandable content\nexport interface AccordionContentProps extends React.HTMLAttributes<HTMLDivElement> {\n}\n\nexport const AccordionContent = React.forwardRef<HTMLDivElement, AccordionContentProps>(\n ({children, className, ...props}, ref) => {\n const {expandedItems} = useAccordionContext()\n const itemContext = useContext(AccordionItemContext)\n const baseId = useId()\n\n if (!itemContext) {\n throw new Error('AccordionContent must be used within an AccordionItem')\n }\n\n const {value} = itemContext\n const isExpanded = expandedItems.has(value)\n\n return (\n <div\n ref={ref}\n id={`${baseId}-content-${value}`}\n role=\"region\"\n aria-labelledby={`${baseId}-trigger-${value}`}\n hidden={!isExpanded}\n className={cx(\n 'overflow-hidden transition-all duration-200',\n isExpanded ? 'animate-fade-in' : 'hidden',\n className\n )}\n {...props}\n >\n <div className=\"px-4 pb-4 text-sm text-silver\">{children}</div>\n </div>\n )\n }\n)\n\nAccordionContent.displayName = 'AccordionContent'\n","import React, {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useId,\n useRef,\n useState,\n} from 'react'\nimport {cx} from '../utils/cx'\n\n// Context for managing menu state\ninterface MenuContextValue {\n isOpen: boolean\n setIsOpen: (open: boolean) => void\n triggerId: string\n menuId: string\n}\n\nconst MenuContext = createContext<MenuContextValue | null>(null)\n\nfunction useMenuContext() {\n const context = useContext(MenuContext)\n if (!context) {\n throw new Error('Menu components must be used within a Menu provider')\n }\n return context\n}\n\n// Main Menu container\nexport interface MenuProps {\n children: React.ReactNode\n open?: boolean\n onOpenChange?: (open: boolean) => void\n}\n\nexport const Menu: React.FC<MenuProps> = ({children, open, onOpenChange}) => {\n const [internalOpen, setInternalOpen] = useState(false)\n const isControlled = open !== undefined\n const isOpen = isControlled ? open : internalOpen\n const baseId = useId()\n\n const setIsOpen = useCallback(\n (newOpen: boolean) => {\n if (!isControlled) {\n setInternalOpen(newOpen)\n }\n onOpenChange?.(newOpen)\n },\n [isControlled, onOpenChange]\n )\n\n return (\n <MenuContext.Provider\n value={{\n isOpen,\n setIsOpen,\n triggerId: `${baseId}-trigger`,\n menuId: `${baseId}-menu`,\n }}\n >\n <div className=\"relative inline-block\">{children}</div>\n </MenuContext.Provider>\n )\n}\n\nMenu.displayName = 'Menu'\n\n// MenuTrigger - button that opens the menu\nexport interface MenuTriggerProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n asChild?: boolean\n}\n\nexport const MenuTrigger = React.forwardRef<HTMLButtonElement, MenuTriggerProps>(\n ({children, className, asChild, ...props}, ref) => {\n const {isOpen, setIsOpen, triggerId, menuId} = useMenuContext()\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n e.preventDefault()\n setIsOpen(!isOpen)\n props.onClick?.(e)\n }\n\n return (\n <button\n ref={ref}\n id={triggerId}\n type=\"button\"\n aria-haspopup=\"menu\"\n aria-expanded={isOpen}\n aria-controls={menuId}\n onClick={handleClick}\n className={cx(\n 'inline-flex items-center justify-center',\n className\n )}\n {...props}\n >\n {children}\n </button>\n )\n }\n)\n\nMenuTrigger.displayName = 'MenuTrigger'\n\n// MenuContent - the dropdown menu\nexport interface MenuContentProps extends React.HTMLAttributes<HTMLDivElement> {\n align?: 'start' | 'center' | 'end'\n side?: 'top' | 'bottom'\n}\n\nexport const MenuContent = React.forwardRef<HTMLDivElement, MenuContentProps>(\n ({children, className, align = 'start', side = 'bottom', ...props}, ref) => {\n const {isOpen, setIsOpen, triggerId, menuId} = useMenuContext()\n const menuRef = useRef<HTMLDivElement>(null)\n\n // Close on outside click\n useEffect(() => {\n if (!isOpen) {\n return\n }\n\n const handleClickOutside = (e: MouseEvent) => {\n const trigger = document.getElementById(triggerId)\n if (\n menuRef.current &&\n !menuRef.current.contains(e.target as Node) &&\n trigger &&\n !trigger.contains(e.target as Node)\n ) {\n setIsOpen(false)\n }\n }\n\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n setIsOpen(false)\n }\n }\n\n document.addEventListener('mousedown', handleClickOutside)\n document.addEventListener('keydown', handleEscape)\n\n return () => {\n document.removeEventListener('mousedown', handleClickOutside)\n document.removeEventListener('keydown', handleEscape)\n }\n }, [isOpen, setIsOpen, triggerId])\n\n if (!isOpen) {\n return null\n }\n\n const alignmentClasses = {\n start: 'left-0',\n center: 'left-1/2 -translate-x-1/2',\n end: 'right-0',\n }\n\n const sideClasses = {\n top: 'bottom-full mb-1',\n bottom: 'top-full mt-1',\n }\n\n return (\n <div\n ref={(node) => {\n menuRef.current = node\n if (typeof ref === 'function') {\n ref(node)\n } else if (ref) {\n ref.current = node\n }\n }}\n id={menuId}\n role=\"menu\"\n aria-labelledby={triggerId}\n className={cx(\n 'absolute z-50 min-w-40 py-1',\n 'bg-charcoal border border-ash shadow-lg',\n 'animate-fade-in',\n alignmentClasses[align],\n sideClasses[side],\n className\n )}\n {...props}\n >\n {children}\n </div>\n )\n }\n)\n\nMenuContent.displayName = 'MenuContent'\n\n// MenuItem - individual menu option\nexport interface MenuItemProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n icon?: React.ReactNode\n destructive?: boolean\n}\n\nexport const MenuItem = React.forwardRef<HTMLButtonElement, MenuItemProps>(\n ({children, className, icon, destructive, disabled, onClick, ...props}, ref) => {\n const {setIsOpen} = useMenuContext()\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n if (disabled) {\n return\n }\n onClick?.(e)\n setIsOpen(false)\n }\n\n return (\n <button\n ref={ref}\n type=\"button\"\n role=\"menuitem\"\n disabled={disabled}\n onClick={handleClick}\n className={cx(\n 'flex w-full items-center gap-2 px-3 py-2 text-sm text-left',\n 'transition-colors duration-fast',\n destructive\n ? 'text-error hover:bg-error/10'\n : 'text-white hover:bg-graphite',\n 'focus-visible:outline-none focus-visible:bg-graphite',\n disabled && 'opacity-50 cursor-not-allowed',\n className\n )}\n {...props}\n >\n {icon && <span className=\"w-4 h-4 shrink-0\">{icon}</span>}\n {children}\n </button>\n )\n }\n)\n\nMenuItem.displayName = 'MenuItem'\n\n// MenuSeparator - divider between menu items\nexport const MenuSeparator = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({className, ...props}, ref) => (\n <div\n ref={ref}\n role=\"separator\"\n className={cx('my-1 h-px bg-ash', className)}\n {...props}\n />\n))\n\nMenuSeparator.displayName = 'MenuSeparator'\n\n// MenuLabel - non-interactive label\nexport const MenuLabel = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({className, children, ...props}, ref) => (\n <div\n ref={ref}\n className={cx('px-3 py-1.5 text-xs font-medium text-silver', className)}\n {...props}\n >\n {children}\n </div>\n))\n\nMenuLabel.displayName = 'MenuLabel'\n","import React from 'react'\nimport {cx} from '../utils/cx'\n\n// Main Navbar container\nexport interface NavbarProps extends React.HTMLAttributes<HTMLElement> {\n fixed?: boolean\n bordered?: boolean\n}\n\nexport const Navbar = React.forwardRef<HTMLElement, NavbarProps>(\n ({fixed = false, bordered = true, className, children, ...props}, ref) => {\n return (\n <nav\n ref={ref}\n className={cx(\n 'w-full bg-charcoal px-4 py-3',\n bordered && 'border-b border-ash',\n fixed && 'fixed top-0 left-0 right-0 z-40',\n className\n )}\n {...props}\n >\n <div className=\"flex items-center justify-between\">{children}</div>\n </nav>\n )\n }\n)\n\nNavbar.displayName = 'Navbar'\n\n// NavbarBrand - logo/brand section\nexport interface NavbarBrandProps extends React.HTMLAttributes<HTMLDivElement> {\n}\n\nexport const NavbarBrand = React.forwardRef<HTMLDivElement, NavbarBrandProps>(\n ({className, children, ...props}, ref) => {\n return (\n <div\n ref={ref}\n className={cx('flex items-center gap-2', className)}\n {...props}\n >\n {children}\n </div>\n )\n }\n)\n\nNavbarBrand.displayName = 'NavbarBrand'\n\n// NavbarContent - center or end content area\nexport interface NavbarContentProps extends React.HTMLAttributes<HTMLDivElement> {\n position?: 'start' | 'center' | 'end'\n}\n\nexport const NavbarContent = React.forwardRef<HTMLDivElement, NavbarContentProps>(\n ({position = 'center', className, children, ...props}, ref) => {\n const positionClasses = {\n start: 'mr-auto',\n center: 'mx-auto',\n end: 'ml-auto',\n }\n\n return (\n <div\n ref={ref}\n className={cx(\n 'flex items-center gap-4',\n positionClasses[position],\n className\n )}\n {...props}\n >\n {children}\n </div>\n )\n }\n)\n\nNavbarContent.displayName = 'NavbarContent'\n\n// NavbarItem - individual navigation item\nexport interface NavbarItemProps extends React.HTMLAttributes<HTMLDivElement> {\n active?: boolean\n}\n\nexport const NavbarItem = React.forwardRef<HTMLDivElement, NavbarItemProps>(\n ({active = false, className, children, ...props}, ref) => {\n return (\n <div\n ref={ref}\n className={cx(\n 'flex items-center',\n className\n )}\n {...props}\n >\n {children}\n </div>\n )\n }\n)\n\nNavbarItem.displayName = 'NavbarItem'\n\n// NavbarLink - navigation link\nexport interface NavbarLinkProps extends React.AnchorHTMLAttributes<HTMLAnchorElement> {\n active?: boolean\n}\n\nexport const NavbarLink = React.forwardRef<HTMLAnchorElement, NavbarLinkProps>(\n ({active = false, className, children, ...props}, ref) => {\n return (\n <a\n ref={ref}\n className={cx(\n 'text-sm font-medium transition-colors duration-fast',\n active ? 'text-gold' : 'text-silver hover:text-white',\n className\n )}\n {...props}\n >\n {children}\n </a>\n )\n }\n)\n\nNavbarLink.displayName = 'NavbarLink'\n\n// NavbarDivider - vertical separator\nexport const NavbarDivider = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({className, ...props}, ref) => (\n <div\n ref={ref}\n className={cx('h-6 w-px bg-ash mx-2', className)}\n {...props}\n />\n))\n\nNavbarDivider.displayName = 'NavbarDivider'\n","import React from 'react'\nimport {ChevronRight} from 'lucide-react'\nimport {cx} from '../utils'\n\n// Breadcrumb container\nexport interface BreadcrumbProps extends React.HTMLAttributes<HTMLElement> {\n separator?: React.ReactNode\n}\n\nexport const Breadcrumb = React.forwardRef<HTMLElement, BreadcrumbProps>(\n ({separator, className, children, ...props}, ref) => {\n const items = React.Children.toArray(children)\n const defaultSeparator = <ChevronRight className=\"h-4 w-4 text-ash\"/>\n\n return (\n <nav ref={ref} aria-label=\"Breadcrumb\" className={className} {...props}>\n <ol className=\"flex items-center gap-2\">\n {items.map((child, index) => (\n <li key={index} className=\"flex items-center gap-2\">\n {child}\n {index < items.length - 1 && (\n <span aria-hidden=\"true\">{separator ?? defaultSeparator}</span>\n )}\n </li>\n ))}\n </ol>\n </nav>\n )\n }\n)\n\nBreadcrumb.displayName = 'Breadcrumb'\n\n// BreadcrumbItem - individual breadcrumb item\nexport interface BreadcrumbItemProps extends React.HTMLAttributes<HTMLSpanElement> {\n current?: boolean\n}\n\nexport const BreadcrumbItem = React.forwardRef<HTMLSpanElement, BreadcrumbItemProps>(\n ({current = false, className, children, ...props}, ref) => {\n return (\n <span\n ref={ref}\n aria-current={current ? 'page' : undefined}\n className={cx(\n 'text-sm',\n current ? 'text-white font-medium' : 'text-silver',\n className\n )}\n {...props}\n >\n {children}\n </span>\n )\n }\n)\n\nBreadcrumbItem.displayName = 'BreadcrumbItem'\n\n// BreadcrumbLink - clickable breadcrumb link\nexport interface BreadcrumbLinkProps extends React.AnchorHTMLAttributes<HTMLAnchorElement> {\n}\n\nexport const BreadcrumbLink = React.forwardRef<HTMLAnchorElement, BreadcrumbLinkProps>(\n ({className, children, ...props}, ref) => {\n return (\n <a\n ref={ref}\n className={cx(\n 'text-sm text-silver hover:text-gold transition-colors duration-fast',\n className\n )}\n {...props}\n >\n {children}\n </a>\n )\n }\n)\n\nBreadcrumbLink.displayName = 'BreadcrumbLink'\n","import React from 'react'\nimport {ChevronLeft, ChevronRight, MoreHorizontal} from 'lucide-react'\nimport {cx} from '../utils/cx'\n\nexport interface PaginationProps extends React.HTMLAttributes<HTMLElement> {\n page: number\n totalPages: number\n onPageChange: (page: number) => void\n siblingCount?: number\n showEdges?: boolean\n}\n\nfunction generatePagination(\n currentPage: number,\n totalPages: number,\n siblingCount: number\n): (number | 'ellipsis')[] {\n const totalSlots = siblingCount * 2 + 5 // siblings + current + 2 edges + 2 ellipses max\n\n if (totalPages <= totalSlots) {\n return Array.from({length: totalPages}, (_, i) => i + 1)\n }\n\n const leftSiblingIndex = Math.max(currentPage - siblingCount, 1)\n const rightSiblingIndex = Math.min(currentPage + siblingCount, totalPages)\n\n const showLeftEllipsis = leftSiblingIndex > 2\n const showRightEllipsis = rightSiblingIndex < totalPages - 1\n\n if (!showLeftEllipsis && showRightEllipsis) {\n const leftItemCount = 3 + 2 * siblingCount\n const leftRange = Array.from({length: leftItemCount}, (_, i) => i + 1)\n return [...leftRange, 'ellipsis', totalPages]\n }\n\n if (showLeftEllipsis && !showRightEllipsis) {\n const rightItemCount = 3 + 2 * siblingCount\n const rightRange = Array.from(\n {length: rightItemCount},\n (_, i) => totalPages - rightItemCount + i + 1\n )\n return [1, 'ellipsis', ...rightRange]\n }\n\n const middleRange = Array.from(\n {length: rightSiblingIndex - leftSiblingIndex + 1},\n (_, i) => leftSiblingIndex + i\n )\n return [1, 'ellipsis', ...middleRange, 'ellipsis', totalPages]\n}\n\nexport const Pagination = React.forwardRef<HTMLElement, PaginationProps>(\n (\n {\n page,\n totalPages,\n onPageChange,\n siblingCount = 1,\n showEdges = true,\n className,\n ...props\n },\n ref\n ) => {\n const pages = generatePagination(page, totalPages, siblingCount)\n\n const buttonBaseClass =\n 'flex items-center justify-center h-8 min-w-8 px-2 text-sm ' +\n 'border border-ash transition-colors duration-fast ' +\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-gold'\n\n return (\n <nav\n ref={ref}\n role=\"navigation\"\n aria-label=\"Pagination\"\n className={cx('flex items-center gap-1', className)}\n {...props}\n >\n {/* Previous button */}\n <button\n type=\"button\"\n onClick={() => onPageChange(page - 1)}\n disabled={page <= 1}\n aria-label=\"Go to previous page\"\n className={cx(\n buttonBaseClass,\n 'text-silver hover:text-white hover:border-gold',\n page <= 1 && 'opacity-50 cursor-not-allowed hover:border-ash'\n )}\n >\n <ChevronLeft className=\"h-4 w-4\"/>\n </button>\n\n {/* Page numbers */}\n {pages.map((pageNum, index) =>\n pageNum === 'ellipsis' ? (\n <span\n key={`ellipsis-${index}`}\n className=\"flex items-center justify-center h-8 w-8 text-silver\"\n >\n <MoreHorizontal className=\"h-4 w-4\"/>\n </span>\n ) : (\n <button\n key={pageNum}\n type=\"button\"\n onClick={() => onPageChange(pageNum)}\n aria-label={`Go to page ${pageNum}`}\n aria-current={page === pageNum ? 'page' : undefined}\n className={cx(\n buttonBaseClass,\n page === pageNum\n ? 'bg-gold text-obsidian border-gold font-medium'\n : 'text-silver hover:text-white hover:border-gold'\n )}\n >\n {pageNum}\n </button>\n )\n )}\n\n {/* Next button */}\n <button\n type=\"button\"\n onClick={() => onPageChange(page + 1)}\n disabled={page >= totalPages}\n aria-label=\"Go to next page\"\n className={cx(\n buttonBaseClass,\n 'text-silver hover:text-white hover:border-gold',\n page >= totalPages && 'opacity-50 cursor-not-allowed hover:border-ash'\n )}\n >\n <ChevronRight className=\"h-4 w-4\"/>\n </button>\n </nav>\n )\n }\n)\n\nPagination.displayName = 'Pagination'\n","import React from 'react'\nimport {Check} from 'lucide-react'\nimport {cx} from '../utils/cx'\n\nexport type StepStatus = 'complete' | 'error'\n\nexport interface Step {\n id: string | number\n label: string\n}\n\nexport interface StepperProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Array of steps. Each requires: id (string | number), label (string). */\n steps: Step[]\n /** ID of the current step (must match a step.id from the steps array). */\n currentStep: string | number\n status?: StepStatus\n}\n\nexport const Stepper = React.forwardRef<HTMLDivElement, StepperProps>(\n ({steps, currentStep, status, className, ...rest}, ref) => {\n const currentIndex = steps.findIndex(step => step.id === currentStep)\n\n const getStepState = (index: number) => {\n if (index < currentIndex) {\n return 'complete'\n }\n if (index === currentIndex) {\n return status || 'current'\n }\n return 'future'\n }\n\n return (\n <div\n ref={ref}\n className={cx('flex items-center w-full', className)}\n {...rest}\n >\n {steps.map((step, index) => {\n const state = getStepState(index)\n const isLast = index === steps.length - 1\n\n return (\n <React.Fragment key={step.id}>\n <div className=\"flex flex-col items-center\">\n <div\n className={cx(\n 'flex items-center justify-center w-10 h-10 rounded-full border-2 font-semibold text-sm transition-all duration-200',\n state === 'complete' && 'bg-gold border-gold text-obsidian',\n state === 'current' && 'bg-charcoal border-gold text-gold',\n state === 'error' && 'bg-error border-error text-white',\n state === 'future' && 'bg-charcoal border-ash text-silver'\n )}\n >\n {state === 'complete' ? (\n <Check className=\"h-5 w-5\"/>\n ) : (\n <span>{index + 1}</span>\n )}\n </div>\n <span\n className={cx(\n 'mt-2 text-xs font-medium',\n state === 'complete' && 'text-gold',\n state === 'current' && 'text-white',\n state === 'error' && 'text-error',\n state === 'future' && 'text-silver'\n )}\n >\n {step.label}\n </span>\n </div>\n {!isLast && (\n <div\n className={cx(\n 'flex-1 h-0.5 mx-4 transition-all duration-200',\n index < currentIndex ? 'bg-gold' : 'bg-ash'\n )}\n />\n )}\n </React.Fragment>\n )\n })}\n </div>\n )\n }\n)\n\nStepper.displayName = 'Stepper'\n\nexport default Stepper\n","import React from 'react'\nimport type {IconProps} from './index'\n\nexport function ChatBubbleIcon({className, ...props}: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n className={className}\n {...props}\n >\n <path\n d=\"M2 3h16v11H6l-4 3V3z\"\n />\n </svg>\n )\n}\n","import React from 'react'\nimport type {IconProps} from './index'\n\nexport function ChevronLeftIcon({className, ...props}: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n className={className}\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n d=\"M12.79 5.23a.75.75 0 01-.02 1.06L8.832 10l3.938 3.71a.75.75 0 11-1.04 1.08l-4.5-4.25a.75.75 0 010-1.08l4.5-4.25a.75.75 0 011.06.02z\"\n clipRule=\"evenodd\"\n />\n </svg>\n )\n}\n","import React from 'react'\nimport type {IconProps} from './index'\n\nexport function ChevronRightIcon({className, ...props}: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n className={className}\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n d=\"M7.21 14.77a.75.75 0 01.02-1.06L11.168 10 7.23 6.29a.75.75 0 111.04-1.08l4.5 4.25a.75.75 0 010 1.08l-4.5 4.25a.75.75 0 01-1.06-.02z\"\n clipRule=\"evenodd\"\n />\n </svg>\n )\n}\n","import React from 'react'\nimport type {IconProps} from './index'\n\nexport function CloseIcon({className, ...props}: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n className={className}\n {...props}\n >\n <path\n d=\"M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 0 00-1.06-1.06L10 8.94 6.28 5.22z\"\n />\n </svg>\n )\n}\n","import React from 'react'\nimport type {IconProps} from './index'\n\nexport function ExpandIcon({className, ...props}: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n className={className}\n {...props}\n >\n <path\n d=\"M13.28 7.78l3.22-3.22v2.69a.75.75 0 001.5 0v-4.5a.75.75 0 00-.75-.75h-4.5a.75.75 0 000 1.5h2.69l-3.22 3.22a.75.75 0 001.06 1.06zM2 17.25v-4.5a.75.75 0 011.5 0v2.69l3.22-3.22a.75.75 0 011.06 1.06L4.56 16.5h2.69a.75.75 0 010 1.5h-4.5a.75.75 0 01-.75-.75z\"\n />\n </svg>\n )\n}\n","import React from 'react'\nimport type {IconProps} from './index'\n\nexport function HistoryIcon({className, ...props}: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n className={className}\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n d=\"M10 18a8 8 0 100-16 8 8 0 000 16zm.75-13a.75.75 0 00-1.5 0v5c0 .414.336.75.75.75h4a.75.75 0 000-1.5h-3.25V5z\"\n clipRule=\"evenodd\"\n />\n </svg>\n )\n}\n","import React from 'react'\nimport type {IconProps} from './index'\n\nexport function LayersIcon({className, ...props}: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n className={className}\n {...props}\n >\n <path\n d=\"M3.196 12.87l-.825.483a.75.75 0 000 1.294l7.25 4.25a.75.75 0 00.758 0l7.25-4.25a.75.75 0 000-1.294l-.825-.484-5.666 3.322a2.25 2.25 0 01-2.276 0L3.196 12.87z\"\n />\n <path\n d=\"M3.196 8.87l-.825.483a.75.75 0 000 1.294l7.25 4.25a.75.75 0 00.758 0l7.25-4.25a.75.75 0 000-1.294l-.825-.484-5.666 3.322a2.25 2.25 0 01-2.276 0L3.196 8.87z\"\n />\n <path\n d=\"M10.38 1.103a.75.75 0 00-.76 0l-7.25 4.25a.75.75 0 000 1.294l7.25 4.25a.75.75 0 00.76 0l7.25-4.25a.75.75 0 000-1.294l-7.25-4.25z\"\n />\n </svg>\n )\n}\n","import React from 'react'\nimport type {IconProps} from './index'\n\n/**\n * Media icon — a film frame with play triangle, representing video and media artifacts.\n */\nexport function MediaIcon({className, ...props}: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n className={className}\n {...props}\n >\n <path\n fillRule=\"evenodd\"\n d=\"M2 4.5A1.5 1.5 0 013.5 3h13A1.5 1.5 0 0118 4.5v11a1.5 1.5 0 01-1.5 1.5h-13A1.5 1.5 0 012 15.5v-11zM4 5v1h1V5H4zm2 0v1h1V5H6zm7 0v1h1V5h-1zm2 0v1h1V5h-1zM4 14v1h1v-1H4zm2 0v1h1v-1H6zm7 0v1h1v-1h-1zm2 0v1h1v-1h-1zM8 8.118a.5.5 0 01.757-.429l4 2.382a.5.5 0 010 .858l-4 2.382A.5.5 0 018 12.882V8.118z\"\n clipRule=\"evenodd\"\n />\n </svg>\n )\n}\n","import React from 'react'\nimport type {IconProps} from './index'\n\nexport function PlusIcon({className, ...props}: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n className={className}\n {...props}\n >\n <path\n d=\"M10.75 4.75a.75.75 0 00-1.5 0v4.5h-4.5a.75.75 0 000 1.5h4.5v4.5a.75.75 0 001.5 0v-4.5h4.5a.75.75 0 000-1.5h-4.5v-4.5z\"\n />\n </svg>\n )\n}\n","import React from 'react'\nimport {cx} from '../../utils/cx'\nimport type {IconProps} from './index'\n\nexport function CheckSquareIcon({className, ...props}: IconProps) {\n return (\n <div\n className={cx(\n 'relative w-4 h-4 flex-shrink-0 border-2 border-gold bg-gold/10',\n className\n )}\n {...props}\n >\n <svg\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n className=\"absolute inset-0 w-full h-full p-0.5\"\n >\n <path\n d=\"M3 8l3 3 7-7\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"text-gold\"\n />\n </svg>\n </div>\n )\n}\n","import React from 'react'\nimport {cx} from '../../utils/cx'\nimport type {IconProps} from './index'\n\nexport function EmptySquareIcon({className, ...props}: IconProps) {\n return (\n <div\n className={cx(\n 'w-4 h-4 flex-shrink-0 border-2 border-ash/60',\n className\n )}\n {...props}\n />\n )\n}\n","import React from 'react'\nimport {cx} from '../../utils/cx'\nimport type {IconProps} from './index'\n\nexport interface CrossSquareIconProps extends IconProps {\n /**\n * Visual variant for different states\n * - 'cancelled': subtle ash coloring\n * - 'failed': error red coloring\n */\n variant?: 'cancelled' | 'failed'\n}\n\nexport function CrossSquareIcon({className, variant = 'cancelled', ...props}: CrossSquareIconProps) {\n return (\n <div\n className={cx(\n 'relative w-4 h-4 flex-shrink-0 border-2',\n variant === 'failed' ? 'border-error/60 bg-error/5' : 'border-ash/40 bg-ash/5',\n className\n )}\n {...props}\n >\n <svg\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n className=\"absolute inset-0 w-full h-full p-0.5\"\n >\n <path\n d=\"M4 4l8 8M12 4l-8 8\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n className={variant === 'failed' ? 'text-error/60' : 'text-ash/40'}\n />\n </svg>\n </div>\n )\n}\n","import React from 'react'\nimport {cx} from '../../utils/cx'\nimport type {IconProps} from './index'\n\n/**\n * Square loading spinner with \"snake\" animation.\n * A golden stroke travels around a square border.\n */\nexport function SquareLoaderIcon({className, ...props}: IconProps) {\n return (\n <div className={cx('relative w-4 h-4 flex-shrink-0', className)} {...props}>\n <svg\n viewBox=\"0 0 16 16\"\n className=\"w-full h-full animate-snake-spin\"\n >\n {/* Square border path that the snake travels around */}\n <rect\n x=\"1\"\n y=\"1\"\n width=\"14\"\n height=\"14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n className=\"text-ash/40\"\n />\n {/* The \"snake\" - an animated stroke */}\n <rect\n x=\"1\"\n y=\"1\"\n width=\"14\"\n height=\"14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeDasharray=\"14 42\"\n strokeLinecap=\"square\"\n className=\"text-gold animate-snake-travel\"\n />\n </svg>\n </div>\n )\n}\n","import React, {useEffect, useRef, useState} from 'react'\nimport {MarkdownContent} from './MarkdownContent'\nimport {cx} from '../utils/cx'\n\nexport type MessageVariant = 'user' | 'assistant'\n\nexport interface MessageBranchInfo {\n /**\n * Current branch index (1-based)\n */\n current: number\n /**\n * Total number of sibling branches\n */\n total: number\n /**\n * Navigate to previous branch\n */\n onPrevious?: () => void\n /**\n * Navigate to next branch\n */\n onNext?: () => void\n}\n\nexport interface MessageActionsConfig {\n /**\n * Called when user edits a user message (creates a branch)\n */\n onEdit?: (newContent: string) => void\n /**\n * Called when user retries an assistant message (creates a branch)\n */\n onRetry?: () => void\n /**\n * Whether to show the copy button\n * @default true\n */\n showCopy?: boolean\n}\n\nexport interface MessageProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Whether the message is from the user or the assistant\n */\n variant?: MessageVariant\n /**\n * The message content (supports Markdown)\n */\n content: string\n /**\n * Whether the message is currently being streamed (shows cursor)\n */\n isStreaming?: boolean\n /**\n * Branch navigation info (shows branch indicator if provided and total > 1)\n */\n branchInfo?: MessageBranchInfo\n /**\n * Actions configuration (shows action bar if provided)\n */\n actions?: MessageActionsConfig\n /**\n * Whether to hide actions (e.g., during streaming)\n */\n hideActions?: boolean\n}\n\nconst variantStyles: Record<MessageVariant, string> = {\n user: 'bg-gold text-obsidian ml-auto',\n assistant: 'bg-charcoal border border-ash text-white mr-auto',\n}\n\n// Inline action button component\nconst ActionButton: React.FC<{\n onClick: () => void\n label: string\n children: React.ReactNode\n className?: string\n disabled?: boolean\n}> = ({onClick, label, children, className, disabled}) => (\n <button\n type=\"button\"\n onClick={onClick}\n disabled={disabled}\n className={cx(\n 'p-1.5 text-silver/60 hover:text-silver transition-colors duration-150',\n 'hover:bg-white/5',\n 'disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:bg-transparent',\n className\n )}\n aria-label={label}\n >\n {children}\n </button>\n)\n\n// Simple inline icons to avoid importing full icon library\nconst CopyIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className=\"w-3.5 h-3.5\">\n <rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/>\n <path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/>\n </svg>\n)\n\nconst CheckIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"\n className=\"w-3.5 h-3.5 text-success\">\n <polyline points=\"20 6 9 17 4 12\"/>\n </svg>\n)\n\nconst PencilIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className=\"w-3.5 h-3.5\">\n <path d=\"M17 3a2.85 2.83 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5Z\"/>\n <path d=\"m15 5 4 4\"/>\n </svg>\n)\n\nconst RetryIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className=\"w-3.5 h-3.5\">\n <path d=\"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8\"/>\n <path d=\"M21 3v5h-5\"/>\n <path d=\"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16\"/>\n <path d=\"M8 16H3v5\"/>\n </svg>\n)\n\nconst ChevronLeftIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className=\"w-3 h-3\">\n <path d=\"m15 18-6-6 6-6\"/>\n </svg>\n)\n\nconst ChevronRightIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className=\"w-3 h-3\">\n <path d=\"m9 18 6-6-6-6\"/>\n </svg>\n)\n\nconst GitBranchIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"\n className=\"w-3 h-3 mr-0.5 text-silver/50\">\n <line x1=\"6\" x2=\"6\" y1=\"3\" y2=\"15\"/>\n <circle cx=\"18\" cy=\"6\" r=\"3\"/>\n <circle cx=\"6\" cy=\"18\" r=\"3\"/>\n <path d=\"M18 9a9 9 0 0 1-9 9\"/>\n </svg>\n)\n\nconst XIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className=\"w-4 h-4\">\n <path d=\"M18 6 6 18\"/>\n <path d=\"m6 6 12 12\"/>\n </svg>\n)\n\nconst SendIcon = () => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className=\"w-4 h-4\">\n <path d=\"m22 2-7 20-4-9-9-4Z\"/>\n <path d=\"M22 2 11 13\"/>\n </svg>\n)\n\nexport const Message = React.forwardRef<HTMLDivElement, MessageProps>(\n ({\n variant = 'assistant',\n className,\n content,\n isStreaming,\n branchInfo,\n actions,\n hideActions,\n ...rest\n }, ref) => {\n const isUser = variant === 'user'\n const [copied, setCopied] = useState(false)\n const [isEditing, setIsEditing] = useState(false)\n const [editValue, setEditValue] = useState(content)\n const textareaRef = useRef<HTMLTextAreaElement>(null)\n\n const showBranchNav = branchInfo && branchInfo.total > 1\n const showActions = actions && !hideActions && !isStreaming\n\n // Auto-resize textarea when editing\n useEffect(() => {\n if (isEditing && textareaRef.current) {\n const textarea = textareaRef.current\n textarea.style.height = 'auto'\n textarea.style.height = `${textarea.scrollHeight}px`\n textarea.focus()\n // Move cursor to end\n textarea.setSelectionRange(textarea.value.length, textarea.value.length)\n }\n }, [isEditing])\n\n const handleCopy = async () => {\n try {\n await navigator.clipboard.writeText(content)\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n } catch {\n // Fallback\n const textArea = document.createElement('textarea')\n textArea.value = content\n document.body.appendChild(textArea)\n textArea.select()\n document.execCommand('copy')\n document.body.removeChild(textArea)\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n }\n }\n\n const handleStartEdit = () => {\n setEditValue(content)\n setIsEditing(true)\n }\n\n const handleCancelEdit = () => {\n setIsEditing(false)\n setEditValue(content)\n }\n\n const handleSubmitEdit = () => {\n const trimmed = editValue.trim()\n if (trimmed && trimmed !== content) {\n actions?.onEdit?.(trimmed)\n }\n setIsEditing(false)\n }\n\n const handleEditKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n handleSubmitEdit()\n } else if (e.key === 'Escape') {\n handleCancelEdit()\n }\n }\n\n const handleEditChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n setEditValue(e.target.value)\n // Auto-resize\n const textarea = e.target\n textarea.style.height = 'auto'\n textarea.style.height = `${textarea.scrollHeight}px`\n }\n\n return (\n <div\n ref={ref}\n className={cx(\n 'flex flex-col',\n isUser ? 'items-end' : 'items-start',\n className\n )}\n {...rest}\n >\n {/* Message bubble OR Edit input (replaces message when editing) */}\n {isUser && isEditing ? (\n <div className=\"w-full max-w-11/12\">\n <div className=\"relative bg-gold\">\n <textarea\n ref={textareaRef}\n value={editValue}\n onChange={handleEditChange}\n onKeyDown={handleEditKeyDown}\n className=\"w-full bg-transparent text-obsidian px-3 py-2 pr-20 resize-none outline-none min-h-10 text-sm\"\n rows={1}\n />\n <div className=\"absolute right-1 top-1/2 -translate-y-1/2 flex gap-0.5\">\n <button\n type=\"button\"\n onClick={handleCancelEdit}\n className=\"p-1.5 text-obsidian/60 hover:text-obsidian transition-colors\"\n aria-label=\"Cancel edit\"\n >\n <XIcon/>\n </button>\n <button\n type=\"button\"\n onClick={handleSubmitEdit}\n disabled={!editValue.trim() || editValue.trim() === content}\n className=\"p-1.5 text-obsidian/60 hover:text-obsidian transition-colors disabled:opacity-30\"\n aria-label=\"Submit edit\"\n >\n <SendIcon/>\n </button>\n </div>\n </div>\n </div>\n ) : (\n <div\n className={cx(\n 'px-3 py-2 w-fit max-w-11/12',\n variantStyles[variant]\n )}\n >\n <MarkdownContent\n content={content}\n className={cx('prose-sm', isUser ? 'prose-inherit' : 'prose-invert')}\n isStreaming={isStreaming}\n cursorClassName=\"ml-0.5\"\n />\n </div>\n )}\n\n {/* Action bar - below the message, includes branch nav on the right */}\n {showActions && !isEditing && (\n <div className={cx(\n 'flex items-center gap-0.5 mt-1',\n isUser ? 'mr-1' : 'ml-1'\n )}>\n {/* Copy - available for both */}\n {(actions.showCopy !== false) && (\n <ActionButton onClick={handleCopy}\n label={copied ? 'Copied!' : 'Copy message'}>\n {copied ? <CheckIcon/> : <CopyIcon/>}\n </ActionButton>\n )}\n\n {/* Edit - only for user messages */}\n {isUser && actions.onEdit && (\n <ActionButton onClick={handleStartEdit} label=\"Edit message\">\n <PencilIcon/>\n </ActionButton>\n )}\n\n {/* Retry - only for assistant messages */}\n {!isUser && actions.onRetry && (\n <ActionButton onClick={actions.onRetry} label=\"Regenerate response\">\n <RetryIcon/>\n </ActionButton>\n )}\n\n {/* Branch navigator - to the right of action buttons */}\n {showBranchNav && (\n <>\n <div className=\"w-px h-4 bg-ash/40 mx-1\"/>\n <div className=\"flex items-center gap-0.5 text-silver/70\">\n <GitBranchIcon/>\n <button\n type=\"button\"\n onClick={branchInfo.onPrevious}\n disabled={branchInfo.current <= 1}\n className={cx(\n 'p-0.5 hover:text-white hover:bg-white/10 transition-colors',\n 'disabled:opacity-30 disabled:cursor-not-allowed disabled:hover:bg-transparent disabled:hover:text-silver/70'\n )}\n aria-label=\"Previous branch\"\n >\n <ChevronLeftIcon/>\n </button>\n <span className=\"text-xs tabular-nums min-w-6 text-center\">\n {branchInfo.current}/{branchInfo.total}\n </span>\n <button\n type=\"button\"\n onClick={branchInfo.onNext}\n disabled={branchInfo.current >= branchInfo.total}\n className={cx(\n 'p-0.5 hover:text-white hover:bg-white/10 transition-colors',\n 'disabled:opacity-30 disabled:cursor-not-allowed disabled:hover:bg-transparent disabled:hover:text-silver/70'\n )}\n aria-label=\"Next branch\"\n >\n <ChevronRightIcon/>\n </button>\n </div>\n </>\n )}\n </div>\n )}\n </div>\n )\n }\n)\n\nMessage.displayName = 'Message'\n\nexport default Message\n","import React, {useMemo} from 'react'\nimport DOMPurify, {type Config} from 'dompurify'\nimport {marked} from 'marked'\nimport {cx} from '../utils'\n\nexport interface MarkdownContentProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Content to display (can be Markdown or HTML)\n */\n content: string\n /**\n * Whether the content should be treated as Markdown\n * @default true\n */\n isMarkdown?: boolean\n sanitizeConfig?: Config\n /**\n * When true, injects a streaming cursor at the end of the content\n */\n isStreaming?: boolean\n /**\n * Additional classes for the streaming cursor\n */\n cursorClassName?: string\n}\n\nconst DEFAULT_SANITIZE_CONFIG: Config = {\n ALLOWED_TAGS: [\n 'h1', 'h2', 'h3', 'h4', 'h5', 'h6',\n 'p', 'br', 'hr',\n 'strong', 'b', 'em', 'i', 'u', 's', 'strike', 'del', 'ins',\n 'sup', 'sub', 'mark', 'small',\n 'ul', 'ol', 'li',\n 'a',\n 'code', 'pre', 'kbd', 'samp', 'var',\n 'blockquote', 'q', 'cite', 'abbr',\n 'table', 'thead', 'tbody', 'tfoot', 'tr', 'th', 'td', 'caption', 'colgroup', 'col',\n 'div', 'span', 'details', 'summary',\n ],\n ALLOWED_ATTR: [\n 'href', 'title', 'target', 'rel',\n 'class', 'id',\n 'colspan', 'rowspan', 'scope',\n 'open',\n ],\n ADD_ATTR: ['target', 'rel'],\n ALLOWED_URI_REGEXP: /^(?:(?:https?|mailto|tel):|[^a-z]|[a-z+.-]+(?:[^a-z+.\\-:]|$))/i,\n}\n\nfunction useDOMPurifySetup() {\n useMemo(() => {\n DOMPurify.addHook('afterSanitizeAttributes', (node) => {\n if (node.tagName === 'A') {\n node.setAttribute('target', '_blank')\n node.setAttribute('rel', 'noopener noreferrer')\n }\n })\n }, [])\n}\n\nconst CURSOR_BASE_CLASSES = 'inline-block bg-current animate-cursor-blink w-0.5 h-cursor translate-y-cursor-offset'\n\n/**\n * Injects a streaming cursor at the end of the HTML content.\n * Finds the deepest last element and appends the cursor inside it.\n */\nfunction injectStreamingCursor(html: string, cursorClassName?: string): string {\n if (!html.trim()) {\n // Empty content - just return the cursor\n return `<span class=\"${cx(CURSOR_BASE_CLASSES, cursorClassName)}\" aria-hidden=\"true\"></span>`\n }\n\n const cursorHtml = `<span class=\"${cx(CURSOR_BASE_CLASSES,\n cursorClassName)}\" aria-hidden=\"true\"></span>`\n\n // Parse the HTML to find the right injection point\n const parser = new DOMParser()\n const doc = parser.parseFromString(`<div>${html}</div>`, 'text/html')\n const container = doc.body.firstChild as HTMLElement\n\n if (!container) {\n return html + cursorHtml\n }\n\n // Find the deepest last element to append the cursor to\n let target: Element = container\n while (target.lastElementChild) {\n const lastChild = target.lastElementChild\n // Stop at inline elements or elements that shouldn't have block children\n const tagName = lastChild.tagName.toLowerCase()\n if (['code', 'a', 'strong', 'em', 'b', 'i', 'span', 'mark', 'del', 's'].includes(tagName)) {\n break\n }\n target = lastChild\n }\n\n // Append cursor to the target element\n target.insertAdjacentHTML('beforeend', cursorHtml)\n\n // Return the inner HTML (excluding our wrapper div)\n return container.innerHTML\n}\n\nexport const MarkdownContent = React.forwardRef<HTMLDivElement, MarkdownContentProps>(\n ({className, content, isMarkdown = true, sanitizeConfig, isStreaming, cursorClassName, ...rest},\n ref) => {\n useDOMPurifySetup()\n\n const sanitizedHtml = useMemo(() => {\n if (!content && !isStreaming) {\n return ''\n }\n const config = sanitizeConfig ?? DEFAULT_SANITIZE_CONFIG\n\n // Convert markdown to HTML if requested\n let htmlContent: string\n if (isMarkdown) {\n try {\n // marked.parse can be sync or async, but for simple strings it's usually sync\n htmlContent = marked.parse(content) as string\n } catch (e) {\n console.error('Error parsing markdown:', e)\n htmlContent = content\n }\n } else {\n htmlContent = content\n }\n\n const sanitized = htmlContent ? DOMPurify.sanitize(htmlContent, config) : ''\n\n if (isStreaming) {\n return injectStreamingCursor(sanitized, cursorClassName)\n }\n\n return sanitized\n }, [content, sanitizeConfig, isStreaming, cursorClassName])\n\n return (\n <div\n ref={ref}\n className={cx('prose', className)}\n dangerouslySetInnerHTML={{__html: sanitizedHtml}}\n {...rest}\n />\n )\n }\n)\n\nMarkdownContent.displayName = 'MarkdownContent'\n\nexport default MarkdownContent","import React from 'react'\nimport {cx} from '../utils/cx'\n\nexport interface StreamingCursorProps extends React.HTMLAttributes<HTMLSpanElement> {\n variant?: 'block' | 'line' | 'underscore'\n}\n\nexport const StreamingCursor = React.forwardRef<HTMLSpanElement, StreamingCursorProps>(\n ({className, variant = 'line', ...rest}, ref) => {\n const variantStyles = {\n block: 'w-2.5 h-cursor translate-y-cursor-offset',\n line: 'w-0.5 h-cursor translate-y-cursor-offset',\n underscore: 'w-2.5 h-0.5 self-end mb-0.5'\n }\n\n return (\n <span\n ref={ref}\n className={cx(\n 'inline-block bg-current animate-cursor-blink',\n variantStyles[variant],\n className\n )}\n aria-hidden=\"true\"\n {...rest}\n />\n )\n }\n)\n\nStreamingCursor.displayName = 'StreamingCursor'\n\nexport default StreamingCursor\n","import React, {useCallback, useEffect, useMemo, useRef, useState} from 'react'\nimport {cx} from '../../utils'\nimport {ChatView, type ChatViewItem} from './ChatView'\nimport {type Attachment, ChatInput} from './ChatInput'\nimport {ArtifactsPanel} from './ArtifactsPanel'\nimport {areAllTasksSettled, type Task, TodosList} from './TodosList'\nimport {\n type ExternalToolDefinition,\n type ToolDefinition,\n type ToolPanelState,\n ToolSidebar\n} from './ToolSidebar'\nimport {ToolPanelContainer} from './ToolPanelContainer'\nimport {useResizable} from './hooks'\nimport type {ArtifactNode} from '../ArtifactNode'\nimport {type ConversationTree, getActivePathMessages, getSiblingInfo, switchBranch} from './types'\nimport {ChatBubbleIcon, CheckSquareIcon, MediaIcon, SquareLoaderIcon} from '../icons'\n\nexport interface ChatMessage {\n /**\n * Unique identifier for the message\n */\n id: string\n /**\n * Whether the message is from the user or the assistant\n */\n variant: 'user' | 'assistant'\n /**\n * Message content (Markdown supported)\n */\n content: string\n /**\n * Whether the message is currently streaming\n */\n isStreaming?: boolean\n}\n\nexport interface Conversation {\n id: string\n title: string\n preview?: string\n timestamp?: string\n isActive?: boolean\n}\n\nexport interface ChatInterfaceProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onSubmit'> {\n /**\n * Array of messages in the conversation (flat mode)\n * Use this OR conversationTree, not both\n */\n messages?: ChatMessage[]\n /**\n * Conversation tree for branching support\n * Use this OR messages, not both\n */\n conversationTree?: ConversationTree\n /**\n * Called when the conversation tree changes (for tree mode)\n */\n onTreeChange?: (tree: ConversationTree) => void\n /**\n * List of past conversations for the sidebar\n */\n conversations?: Conversation[]\n /**\n * Called when a message is submitted from the input.\n * Provides the text content and any files attached.\n */\n onMessageSubmit?: (message: string, attachments?: Attachment[]) => void\n /**\n * Called when a user message is edited.\n * In tree mode, this creates a new branch.\n */\n onEditMessage?: (messageId: string, newContent: string) => void\n /**\n * Called when an assistant message is retried.\n * In tree mode, this creates a new branch.\n */\n onRetryMessage?: (messageId: string) => void\n /**\n * Called when the Stop button is clicked during assistant streaming.\n */\n onStop?: () => void\n /**\n * Called when a conversation is selected from the sidebar.\n */\n onSelectConversation?: (id: string) => void\n /**\n * Called when the \"New Chat\" button is clicked in the sidebar.\n */\n onNewChat?: () => void\n /**\n * Whether the assistant is currently streaming a response.\n * Shows a stop button and disables certain actions.\n */\n isStreaming?: boolean\n /**\n * Whether to show the thinking indicator.\n * Typically shown after a user message but before the first streaming token.\n */\n isThinking?: boolean\n /**\n * Placeholder text for the main chat input.\n */\n placeholder?: string\n /**\n * Helper text shown in the empty state (when there are no messages).\n */\n emptyStateHelper?: React.ReactNode\n /**\n * Custom content to show when the conversation is empty.\n * Overrides the default centered input and helper text.\n */\n emptyState?: React.ReactNode\n /**\n * Whether to show the attachment (paperclip) button in the input.\n */\n showAttachmentButton?: boolean\n /**\n * Whether to enable message-level actions (copy, edit, retry).\n */\n enableMessageActions?: boolean\n /**\n * Current attachments for the chat input (controlled).\n */\n attachments?: Attachment[]\n /**\n * Called when attachments are added or removed in the chat input.\n */\n onAttachmentsChange?: (attachments: Attachment[]) => void\n /**\n * Top-level artifact tree nodes for the artifacts panel.\n */\n artifactNodes?: ArtifactNode[]\n /**\n * Whether the artifacts panel is currently open (controlled).\n * When set, maps to the tool panel system — opens the artifacts tool.\n */\n isArtifactsPanelOpen?: boolean\n /**\n * Called when the artifacts panel is opened or closed (controlled).\n */\n onArtifactsPanelOpenChange?: (open: boolean) => void\n /**\n * Tasks to display in the todos list tool panel.\n * Shows a list of tasks with status indicators.\n */\n tasks?: Task[]\n /**\n * Title for the todos list\n * @default \"Tasks\"\n */\n tasksTitle?: string\n /**\n * Additional tools to add to the tool sidebars. Each ExternalToolDefinition provides\n * an id, icon, label, group ('top-left' | 'bottom-left' | 'top-right' | 'bottom-right'),\n * and content (ReactNode) to render when opened. Tools in the same group are mutually\n * exclusive. Built-in tools occupy: History (top-left), Artifacts (top-right), Tasks\n * (bottom-right). Consumer tools are added alongside these.\n */\n tools?: ExternalToolDefinition[]\n}\n\n/**\n * ChatInterface is the main orchestrator for a full-featured chat experience.\n *\n * Features:\n * - ChatView (center) — main conversation area with smart scrolling\n * - Dual tool sidebar system — IntelliJ-style tool sidebars on left and right:\n * - Left sidebar: History (top-left, conversation list + new chat) + consumer tools (bottom-left)\n * - Right sidebar: Artifacts (top-right) + Tasks (bottom-right) + consumer tools\n * - Tools in the same group are mutually exclusive\n * - Both panels can be open simultaneously — chat area shrinks to accommodate\n * - Each panel is independently width-resizable\n * - Vertical split with draggable divider when both slots in a panel are active\n * - Consumer tools via `tools` prop — provide icon, label, group, and content\n * - ChatInput — position-aware input that centers in empty state\n * - Branching — support for conversation tree with branch navigation\n * - Message Actions — copy, edit, retry\n * - Thinking Indicator — shown between user message and response\n *\n * Artifacts are supplied as a tree of ArtifactNode objects via the\n * artifactNodes prop.\n */\nexport const ChatInterface = React.forwardRef<HTMLDivElement, ChatInterfaceProps>(\n (\n {\n messages = [],\n conversationTree,\n onTreeChange,\n conversations = [],\n onMessageSubmit,\n onEditMessage,\n onRetryMessage,\n onStop,\n onSelectConversation,\n onNewChat,\n isStreaming = false,\n isThinking = false,\n placeholder = 'Send a message...',\n emptyStateHelper = \"Let's talk.\",\n emptyState,\n showAttachmentButton = true,\n enableMessageActions = true,\n attachments: propsAttachments,\n onAttachmentsChange,\n artifactNodes,\n isArtifactsPanelOpen,\n onArtifactsPanelOpenChange,\n tasks = [],\n tasksTitle,\n tools: externalTools = [],\n className,\n ...rest\n },\n ref\n ) => {\n const prevArtifactNodesRef = useRef<ArtifactNode[]>([])\n const prevTasksRef = useRef<Task[]>([])\n\n // ── Tool panel state ──────────────────────────────────────────\n const [internalTools, setInternalTools] = useState<ToolPanelState>({\n 'top-left': 'history',\n 'bottom-left': null,\n 'top-right': null,\n 'bottom-right': null,\n })\n\n // Track tools the user has actively dismissed — auto-open won't reopen these\n const dismissedToolsRef = useRef<Set<string>>(new Set())\n\n // Controlled vs uncontrolled: isArtifactsPanelOpen maps to the tool system\n const isPanelControlled = isArtifactsPanelOpen !== undefined\n\n // Derive effective tool state\n const activeTools: ToolPanelState = useMemo(() => {\n if (isPanelControlled) {\n return {\n ...internalTools,\n 'top-right': isArtifactsPanelOpen ? 'artifacts' : internalTools['top-right'],\n }\n }\n return internalTools\n }, [isPanelControlled, isArtifactsPanelOpen, internalTools])\n\n const isLeftPanelOpen = activeTools['top-left'] !== null || activeTools['bottom-left']\n !== null\n const isRightPanelOpen = activeTools['top-right'] !== null || activeTools['bottom-right']\n !== null\n\n // ── Resizable panels ──────────────────────────────────────────\n const {\n width: rightToolsWidth,\n startResizing: startResizingRightTools\n } = useResizable({\n initialWidthPercent: 50,\n minWidthPercent: 25,\n maxWidthPercent: 70,\n direction: 'left'\n })\n\n const {\n width: leftToolsWidth,\n startResizing: startResizingLeftTools\n } = useResizable({\n initialWidthPercent: 25,\n minWidthPercent: 15,\n maxWidthPercent: 40,\n direction: 'right'\n })\n\n // ── Tool definitions ──────────────────────────────────────────\n const allSettled = tasks.length === 0 || areAllTasksSettled(tasks)\n\n // ── Merged tool definitions (built-in + external) ──────────────\n const allToolDefinitions: ToolDefinition[] = useMemo(() => {\n const builtIn: ToolDefinition[] = [\n {id: 'history', icon: <ChatBubbleIcon/>, label: 'History', group: 'top-left'},\n {id: 'artifacts', icon: <MediaIcon/>, label: 'Artifacts', group: 'top-right'},\n {\n id: 'todos',\n icon: allSettled ? <CheckSquareIcon/> : <SquareLoaderIcon/>,\n label: 'Tasks',\n group: 'bottom-right',\n },\n ]\n const external: ToolDefinition[] = externalTools.map(({content: _content, ...def}) => def)\n return [...builtIn, ...external]\n }, [allSettled, externalTools])\n\n // ── Toggle a tool ─────────────────────────────────────────────\n const toggleTool = useCallback((toolId: string) => {\n // Find the tool's group\n const toolDef = allToolDefinitions.find(t => t.id === toolId)\n if (!toolDef) {\n return\n }\n\n const group = toolDef.group\n\n // Special case: controlled artifacts panel\n if (toolId === 'artifacts' && isPanelControlled) {\n const isCurrentlyOpen = activeTools['top-right'] === 'artifacts'\n if (isCurrentlyOpen) {\n dismissedToolsRef.current.add('artifacts')\n } else {\n dismissedToolsRef.current.delete('artifacts')\n }\n onArtifactsPanelOpenChange?.(!isCurrentlyOpen)\n return\n }\n\n setInternalTools(prev => {\n const isCurrentlyOpen = prev[group] === toolId\n if (isCurrentlyOpen) {\n dismissedToolsRef.current.add(toolId)\n } else {\n dismissedToolsRef.current.delete(toolId)\n }\n return {\n ...prev,\n [group]: isCurrentlyOpen ? null : toolId,\n }\n })\n }, [allToolDefinitions, isPanelControlled, activeTools, onArtifactsPanelOpenChange])\n\n // ── Messages ──────────────────────────────────────────────────\n const isTreeMode = !!conversationTree\n\n const effectiveMessages: ChatMessage[] = useMemo(() => {\n if (isTreeMode && conversationTree) {\n const pathNodes = getActivePathMessages(conversationTree)\n return pathNodes.map((node) => ({\n id: node.id,\n variant: node.role,\n content: node.content,\n isStreaming: node.isStreaming,\n }))\n }\n return messages\n }, [isTreeMode, conversationTree, messages])\n\n const latestUserMessageIndex = useMemo(() => {\n for (let i = effectiveMessages.length - 1; i >= 0; i--) {\n if (effectiveMessages[i].variant === 'user') {\n return i\n }\n }\n return -1\n }, [effectiveMessages])\n\n // ── Auto-open tools when data arrives (uncontrolled mode) ─────\n // Only auto-opens a tool if the user hasn't actively dismissed it.\n useEffect(() => {\n const nodes = artifactNodes || []\n const prevNodes = prevArtifactNodesRef.current\n\n const hasNewOrChangedNode = nodes.length !== prevNodes.length\n || nodes.some((n, i) => n.id !== prevNodes[i]?.id)\n\n if (!isPanelControlled\n && hasNewOrChangedNode && nodes.length > 0\n && !dismissedToolsRef.current.has('artifacts')) {\n setInternalTools(prev => ({...prev, 'top-right': 'artifacts'}))\n }\n\n const hasNewOrUpdatedTask = (curr: Task[], prev: Task[]): boolean => {\n return curr.some(c => {\n const p = prev.find(x => x.id === c.id)\n if (!p) {\n return true\n }\n if (c.status !== p.status || c.label !== p.label) {\n return true\n }\n if (c.subtasks && hasNewOrUpdatedTask(c.subtasks, p?.subtasks || [])) {\n return true\n }\n return false\n })\n }\n\n if (hasNewOrUpdatedTask(tasks, prevTasksRef.current)\n && !dismissedToolsRef.current.has('todos')) {\n setInternalTools(prev => ({...prev, 'bottom-right': 'todos'}))\n }\n\n prevArtifactNodesRef.current = nodes\n prevTasksRef.current = tasks\n }, [artifactNodes, tasks, isPanelControlled])\n\n // ── Branch switching ──────────────────────────────────────────\n const handleBranchSwitch = useCallback(\n (nodeId: string, direction: 'prev' | 'next') => {\n if (!isTreeMode || !conversationTree || !onTreeChange) {\n return\n }\n const newTree = switchBranch(conversationTree, nodeId, direction)\n onTreeChange(newTree)\n },\n [isTreeMode, conversationTree, onTreeChange]\n )\n\n // ── Display messages ──────────────────────────────────────────\n const displayMessages: ChatViewItem[] = useMemo(() => {\n return effectiveMessages.map((msg) => {\n let branchInfo = undefined\n if (isTreeMode && conversationTree) {\n const siblingInfo = getSiblingInfo(conversationTree, msg.id)\n if (siblingInfo.total > 1) {\n branchInfo = {\n current: siblingInfo.current,\n total: siblingInfo.total,\n onPrevious: () => handleBranchSwitch(msg.id, 'prev'),\n onNext: () => handleBranchSwitch(msg.id, 'next'),\n }\n }\n }\n\n const actions = enableMessageActions\n ? {\n showCopy: true,\n onEdit: msg.variant === 'user' && onEditMessage\n ? (newContent: string) => onEditMessage(msg.id, newContent)\n : undefined,\n onRetry: msg.variant === 'assistant' && onRetryMessage\n ? () => onRetryMessage(msg.id)\n : undefined,\n }\n : undefined\n\n return {...msg, branchInfo, actions}\n })\n }, [effectiveMessages, isTreeMode, conversationTree, enableMessageActions,\n onEditMessage, onRetryMessage, handleBranchSwitch])\n\n const handleSubmit = useCallback(\n (message: string, attachments?: Attachment[]) => {\n onMessageSubmit?.(message, attachments)\n },\n [onMessageSubmit]\n )\n\n const isEmpty = effectiveMessages.length === 0\n\n // ── Derived: which sides have tools ─────────────────────────\n const leftToolDefs = useMemo(\n () => allToolDefinitions.filter(t => t.group === 'top-left' || t.group === 'bottom-left'),\n [allToolDefinitions]\n )\n const rightToolDefs = useMemo(\n () => allToolDefinitions.filter(\n t => t.group === 'top-right' || t.group === 'bottom-right'),\n [allToolDefinitions]\n )\n const hasLeftTools = leftToolDefs.length > 0\n const hasRightTools = rightToolDefs.length > 0\n\n // ── Render tool content for a given slot ──────────────────────\n const renderToolContent = (toolId: string | null) => {\n if (!toolId) {\n return null\n }\n\n switch (toolId) {\n case 'history':\n return (\n <div className=\"h-full flex flex-col\">\n <div\n className=\"flex items-center justify-between p-4 border-b border-ash/40 shrink-0\">\n <h3 className=\"text-xs font-medium text-white\">History</h3>\n {onNewChat && (\n <button\n onClick={onNewChat}\n className={cx(\n 'flex px-3 py-1.5',\n 'bg-gold/10 hover:bg-gold/20 text-gold',\n 'border border-gold/30',\n 'text-xs font-medium',\n 'transition-colors duration-200'\n )}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n className=\"w-4 h-4\"\n >\n <path\n d=\"M10.75 4.75a.75.75 0 00-1.5 0v4.5h-4.5a.75.75 0 000 1.5h4.5v4.5a.75.75 0 001.5 0v-4.5h4.5a.75.75 0 000-1.5h-4.5v-4.5z\"/>\n </svg>\n New Chat\n </button>\n )}\n </div>\n <div className=\"flex-1 overflow-y-auto py-2\">\n {conversations.length === 0 ? (\n <p className=\"px-4 py-2 text-xs text-silver/60\">No conversations yet</p>\n ) : (\n <div className=\"space-y-1 px-2\">\n {conversations.map((conversation) => (\n <button\n key={conversation.id}\n onClick={() => onSelectConversation?.(conversation.id)}\n className={cx(\n 'w-full px-3 py-2 text-left',\n 'transition-colors duration-150',\n conversation.isActive\n ? 'bg-ash/40 text-white'\n : 'text-silver hover:bg-ash/20 hover:text-white'\n )}\n >\n <p className=\"text-sm font-medium truncate\">{conversation.title}</p>\n {conversation.preview && (\n <p className=\"text-xs text-silver/60 truncate mt-0.5\">\n {conversation.preview}\n </p>\n )}\n {conversation.timestamp && (\n <p className=\"text-xs text-silver/40 mt-1\">{conversation.timestamp}</p>\n )}\n </button>\n ))}\n </div>\n )}\n </div>\n </div>\n )\n\n case 'artifacts':\n return (\n <ArtifactsPanel\n nodes={artifactNodes}\n className=\"h-full\"\n />\n )\n\n case 'todos':\n return tasks.length > 0\n ? <TodosList tasks={tasks} title={tasksTitle} className=\"h-full\"/>\n : (\n <div className=\"h-full flex flex-col\">\n <div className=\"flex items-center p-4 border-b border-ash/40 shrink-0\">\n <h3 className=\"text-xs font-medium text-white\">Tasks</h3>\n </div>\n <div className=\"flex-1 flex items-center justify-center\">\n <p className=\"text-xs text-silver/60\">No tasks</p>\n </div>\n </div>\n )\n\n default: {\n // External tool — render its content\n const externalTool = externalTools.find(t => t.id === toolId)\n return externalTool?.content ?? null\n }\n }\n }\n\n return (\n <div\n ref={ref}\n className={cx('flex h-full w-full bg-obsidian overflow-hidden', className)}\n {...rest}\n >\n {/* Left tool sidebar */}\n {hasLeftTools && (\n <ToolSidebar\n tools={leftToolDefs}\n activeTools={activeTools}\n onToggleTool={toggleTool}\n side=\"left\"\n />\n )}\n\n {/* Left tool panel */}\n {isLeftPanelOpen && (\n <ToolPanelContainer\n topContent={renderToolContent(activeTools['top-left'])}\n bottomContent={renderToolContent(activeTools['bottom-left'])}\n width={leftToolsWidth}\n onResizeStart={startResizingLeftTools}\n side=\"left\"\n />\n )}\n\n {/* Main content area */}\n <div className=\"flex-1 flex flex-col min-w-0 relative\">\n <div className={cx(\n \"flex-1 flex flex-col min-h-0 relative\",\n isEmpty ? \"justify-center\" : \"justify-start\"\n )}>\n {/* Top spacer for centering in empty state */}\n <div className={cx(\n \"transition-all duration-500 ease-in-out\",\n isEmpty ? \"flex-1\" : \"flex-zero\"\n )}/>\n\n {/* Messages Area */}\n <div className={cx(\n \"transition-all duration-500 ease-in-out overflow-hidden flex flex-col\",\n isEmpty ? \"flex-zero opacity-0\" : \"flex-1 opacity-100\"\n )}>\n <ChatView\n messages={displayMessages}\n latestUserMessageIndex={latestUserMessageIndex}\n isStreaming={isStreaming}\n isThinking={isThinking}\n className=\"flex-1\"\n />\n </div>\n\n {/* Input Area */}\n <div className={cx(\n \"transition-all duration-500 ease-in-out z-10 w-full flex flex-col items-center\",\n isEmpty ? \"p-4\" : \"shrink-0 p-4 border-t border-ash/40 bg-obsidian\"\n )}>\n {isEmpty && (\n <div className=\"mb-8 text-center animate-fade-in duration-500\">\n {emptyState ? (\n emptyState\n ) : (\n <h1 className=\"text-4xl md:text-5xl font-heading text-gold mb-2 tracking-tight\">\n Welcome!\n </h1>\n )}\n </div>\n )}\n\n <ChatInput\n position={isEmpty ? \"centered\" : \"bottom\"}\n placeholder={placeholder}\n helperText={isEmpty ? emptyStateHelper : undefined}\n onSubmit={handleSubmit}\n disabled={isEmpty ? isStreaming : (isStreaming && !onStop)}\n isStreaming={isStreaming}\n onStop={onStop}\n showAttachmentButton={showAttachmentButton}\n attachments={propsAttachments}\n onAttachmentsChange={onAttachmentsChange}\n />\n </div>\n\n {/* Bottom spacer for centering in empty state */}\n <div className={cx(\n \"transition-all duration-500 ease-in-out\",\n isEmpty ? \"flex-1\" : \"flex-zero\"\n )}/>\n </div>\n </div>\n\n {/* Right tool panel */}\n {isRightPanelOpen && (\n <ToolPanelContainer\n topContent={renderToolContent(activeTools['top-right'])}\n bottomContent={renderToolContent(activeTools['bottom-right'])}\n width={rightToolsWidth}\n onResizeStart={startResizingRightTools}\n side=\"right\"\n />\n )}\n\n {/* Right tool sidebar */}\n {hasRightTools && (\n <ToolSidebar\n tools={rightToolDefs}\n activeTools={activeTools}\n onToggleTool={toggleTool}\n side=\"right\"\n />\n )}\n </div>\n )\n }\n)\n\nChatInterface.displayName = 'ChatInterface'\n","import React, {useEffect} from 'react'\nimport {\n Message,\n type MessageActionsConfig,\n type MessageBranchInfo,\n type MessageProps,\n type MessageVariant\n} from '../Message'\nimport {cx} from '../../utils'\nimport {useScrollAnchor} from './hooks/useScrollAnchor'\nimport {useAdaptiveSpacer} from './hooks/useAdaptiveSpacer'\nimport {ThinkingIndicator} from './ThinkingIndicator'\n\nexport interface ChatViewItem extends Omit<MessageProps, 'variant' | 'children'> {\n id?: string\n variant?: MessageVariant\n /**\n * Branch navigation info for this message\n */\n branchInfo?: MessageBranchInfo\n /**\n * Actions configuration for this message\n */\n actions?: MessageActionsConfig\n}\n\nexport interface ChatViewProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Array of chat messages to display\n */\n messages: ChatViewItem[]\n /**\n * Index of the latest user message to anchor scroll to.\n * When this changes, the component scrolls that message to the top.\n */\n latestUserMessageIndex?: number\n /**\n * Whether the assistant is currently streaming a response\n */\n isStreaming?: boolean\n /**\n * Whether to show the thinking indicator (between user message and response)\n */\n isThinking?: boolean\n /**\n * Callback when the user scrolls manually\n */\n onScroll?: (e: React.UIEvent<HTMLDivElement>) => void\n}\n\n/**\n * ChatView displays a conversation thread with smart scrolling behavior.\n *\n * Key behaviors:\n * - When a user message is sent, it anchors to the top of the viewport\n * - Does NOT auto-scroll during streaming (respects user's reading position)\n * - Smooth transitions and animations\n */\nexport const ChatView = React.forwardRef<HTMLDivElement, ChatViewProps>(\n ({messages, latestUserMessageIndex, isStreaming, isThinking, onScroll, className, ...rest},\n ref) => {\n const {containerRef, anchorRef, scrollToAnchor} = useScrollAnchor({\n behavior: 'smooth',\n block: 'start',\n })\n\n const {contentRef, spacerRef, spacerHeight} = useAdaptiveSpacer({\n containerRef,\n anchorRef,\n })\n\n // Scroll to anchor when latest user message index changes\n useEffect(() => {\n if (latestUserMessageIndex !== undefined && latestUserMessageIndex >= 0) {\n scrollToAnchor()\n }\n }, [latestUserMessageIndex, scrollToAnchor])\n\n // Find the latest user message for anchoring\n const latestUserIdx =\n latestUserMessageIndex ??\n messages.reduceRight((found, msg, idx) => {\n if (found === -1 && msg.variant === 'user') {\n return idx\n }\n return found\n }, -1)\n\n // Determine if we should show thinking indicator\n // Show when isThinking is true AND there are messages AND the last message is from user\n const showThinking = isThinking && messages.length > 0 && messages[messages.length\n - 1]?.variant === 'user'\n\n return (\n <div\n ref={(node) => {\n // Handle both refs\n ;(containerRef as React.MutableRefObject<HTMLDivElement | null>).current = node\n if (typeof ref === 'function') {\n ref(node)\n } else if (ref) {\n ref.current = node\n }\n }}\n onScroll={onScroll}\n className={cx(\n 'flex flex-col w-full h-full overflow-y-auto scroll-smooth',\n 'px-4 py-6 overscroll-contain',\n className\n )}\n {...rest}\n >\n {/* Content wrapper for adaptive spacer measurement */}\n <div ref={contentRef} className=\"relative flex flex-col gap-3\">\n {messages.map(({\n id,\n variant,\n className: messageClassName,\n branchInfo,\n actions,\n isStreaming: nodeIsStreaming,\n ...messageProps\n }, index) => {\n const isAnchor = index === latestUserIdx\n const isLastMessage = index === messages.length - 1\n const showStreaming = isLastMessage && isStreaming && variant === 'assistant'\n const isMessageStreaming = showStreaming || !!nodeIsStreaming\n // Hide actions during streaming\n return (\n <div\n key={id ?? `msg-${index}`}\n ref={isAnchor ? anchorRef : undefined}\n className={isAnchor ? 'scroll-mt-4' : undefined}\n >\n <Message\n variant={variant}\n isStreaming={isMessageStreaming}\n className={messageClassName}\n branchInfo={branchInfo}\n actions={actions}\n hideActions={isMessageStreaming}\n {...messageProps}\n />\n </div>\n )\n })}\n\n {/* Thinking indicator */}\n {showThinking && (\n <ThinkingIndicator isVisible/>\n )}\n </div>\n\n {/* Adaptive bottom spacer - fills remaining space exactly */}\n <div\n ref={spacerRef}\n className=\"shrink-0 pointer-events-none\"\n style={{height: spacerHeight}}\n aria-hidden=\"true\"\n />\n </div>\n )\n }\n)\n\nChatView.displayName = 'ChatView'\n\nexport default ChatView\n","import {useCallback, useRef} from 'react'\n\nexport interface UseScrollAnchorOptions {\n /**\n * Behavior for scrolling. Defaults to 'smooth'.\n */\n behavior?: ScrollBehavior\n /**\n * Block alignment for scrollIntoView. Defaults to 'start'.\n */\n block?: ScrollLogicalPosition\n}\n\nexport interface UseScrollAnchorReturn {\n /**\n * Ref to attach to the scrollable container\n */\n containerRef: React.RefObject<HTMLDivElement | null>\n /**\n * Ref to attach to the anchor element (latest user message)\n */\n anchorRef: React.RefObject<HTMLDivElement | null>\n /**\n * Scroll the anchor element into view. Call this on user message submission.\n */\n scrollToAnchor: () => void\n /**\n * Scroll to the bottom of the container.\n */\n scrollToBottom: () => void\n /**\n * Check if user has scrolled away from the bottom.\n */\n isScrolledToBottom: () => boolean\n}\n\n/**\n * Hook for smart scroll behavior in chat interfaces.\n *\n * Key behaviors:\n * - Anchors user messages to the top of the viewport when they send a message\n * - Does NOT auto-scroll during streaming to respect user's reading position\n * - Allows manual scroll detection\n */\nexport function useScrollAnchor(\n options: UseScrollAnchorOptions = {}\n): UseScrollAnchorReturn {\n const {behavior = 'smooth', block = 'start'} = options\n\n const containerRef = useRef<HTMLDivElement>(null)\n const anchorRef = useRef<HTMLDivElement>(null)\n\n const scrollToAnchor = useCallback(() => {\n const el = anchorRef.current\n if (!el) {\n return\n }\n\n // Double rAF to ensure layout updates (e.g., adaptive spacer) have been applied.\n // First frame: other rAF callbacks (like spacer recalculation) run\n // Second frame: scroll happens with correct layout\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n el.scrollIntoView({behavior, block})\n })\n })\n }, [behavior, block])\n\n const scrollToBottom = useCallback(() => {\n const container = containerRef.current\n if (!container) {\n return\n }\n\n if (typeof container.scrollTo === 'function') {\n container.scrollTo({top: container.scrollHeight, behavior})\n } else {\n container.scrollTop = container.scrollHeight\n }\n }, [behavior])\n\n const isScrolledToBottom = useCallback(() => {\n const container = containerRef.current\n if (!container) {\n return true\n }\n\n const threshold = 50 // pixels from bottom to consider \"at bottom\"\n const {scrollTop, scrollHeight, clientHeight} = container\n return scrollHeight - scrollTop - clientHeight < threshold\n }, [])\n\n return {\n containerRef,\n anchorRef,\n scrollToAnchor,\n scrollToBottom,\n isScrolledToBottom,\n }\n}\n\nexport default useScrollAnchor\n","import {useCallback, useEffect, useRef, useState} from 'react'\n\nexport interface UseAdaptiveSpacerOptions {\n /**\n * Minimum spacer height. Defaults to 0.\n */\n minHeight?: number\n /**\n * External container ref to use instead of creating one internally.\n * Useful when sharing the container ref with other hooks (e.g., useScrollAnchor).\n */\n containerRef?: React.RefObject<HTMLDivElement | null>\n /**\n * Ref to the anchor element (e.g., latest user message).\n * When provided, spacer is calculated to allow anchor to scroll to top.\n */\n anchorRef?: React.RefObject<HTMLDivElement | null>\n}\n\nexport interface UseAdaptiveSpacerReturn {\n /**\n * Ref to attach to the scrollable container (only use if not providing external ref)\n */\n containerRef: React.RefObject<HTMLDivElement | null>\n /**\n * Ref to attach to the content wrapper (excludes spacer)\n */\n contentRef: React.RefObject<HTMLDivElement | null>\n /**\n * Ref to attach to the spacer element for imperative height updates\n */\n spacerRef: React.RefObject<HTMLDivElement | null>\n /**\n * Calculated spacer height in pixels\n */\n spacerHeight: number\n /**\n * Force recalculation of spacer height\n */\n recalculate: () => void\n}\n\n/**\n * Hook that calculates the exact spacer height needed to fill remaining viewport space\n * while allowing the anchor element to scroll to the top.\n *\n * The spacer height is calculated as:\n * spacerHeight = containerHeight - padding - heightFromAnchorToBottom\n *\n * This ensures:\n * - The anchor message can scroll to the top of the viewport\n * - Below the anchor, content + spacer fills exactly the remaining space\n * - As content below anchor grows, spacer shrinks\n * - When content exceeds available space, spacer becomes 0\n */\nexport function useAdaptiveSpacer(\n options: UseAdaptiveSpacerOptions = {}\n): UseAdaptiveSpacerReturn {\n const {minHeight = 0, containerRef: externalContainerRef, anchorRef} = options\n\n const internalContainerRef = useRef<HTMLDivElement>(null)\n const containerRef = externalContainerRef ?? internalContainerRef\n const contentRef = useRef<HTMLDivElement>(null)\n const spacerRef = useRef<HTMLDivElement>(null)\n const [spacerHeight, setSpacerHeight] = useState(0)\n\n const recalculate = useCallback(() => {\n const container = containerRef.current\n const content = contentRef.current\n if (!container || !content) {\n return\n }\n\n // Get container's computed padding\n const style = getComputedStyle(container)\n const paddingTop = parseFloat(style.paddingTop) || 0\n const paddingBottom = parseFloat(style.paddingBottom) || 0\n const availableHeight = container.clientHeight - paddingTop - paddingBottom\n\n // Calculate height from anchor to bottom of content\n // Using offsetTop for stable measurement from \"zero\" (content top)\n let heightFromAnchorToBottom: number\n const anchor = anchorRef?.current\n\n if (anchor && content.contains(anchor)) {\n // Anchor's position from the top of content (the \"zero\" point)\n // Content wrapper has position:relative, so offsetTop is relative to it\n const anchorTop = anchor.offsetTop\n heightFromAnchorToBottom = content.scrollHeight - anchorTop\n } else {\n // No anchor, use total content height\n heightFromAnchorToBottom = content.scrollHeight\n }\n\n const newSpacerHeight = Math.max(minHeight, availableHeight - heightFromAnchorToBottom)\n\n // Update DOM imperatively for immediate effect (before React commits state)\n // This ensures scrollToAnchor sees the correct spacer height\n if (spacerRef.current) {\n spacerRef.current.style.height = `${newSpacerHeight}px`\n }\n\n // Also update state for React reconciliation\n setSpacerHeight(newSpacerHeight)\n }, [minHeight, anchorRef])\n\n useEffect(() => {\n const container = containerRef.current\n const content = contentRef.current\n if (!container || !content) {\n return\n }\n\n // Initial calculation\n recalculate()\n\n // Observe both container and content for size changes\n const resizeObserver = new ResizeObserver(() => {\n recalculate()\n })\n\n resizeObserver.observe(container)\n resizeObserver.observe(content)\n\n // Also observe mutations in content (for DOM changes that don't trigger resize)\n const mutationObserver = new MutationObserver(() => {\n // Use requestAnimationFrame to batch with render\n requestAnimationFrame(recalculate)\n })\n\n mutationObserver.observe(content, {\n childList: true,\n subtree: true,\n characterData: true,\n })\n\n return () => {\n resizeObserver.disconnect()\n mutationObserver.disconnect()\n }\n }, [recalculate])\n\n return {\n containerRef,\n contentRef,\n spacerRef,\n spacerHeight,\n recalculate,\n }\n}\n\nexport default useAdaptiveSpacer\n","import React, {useEffect, useState} from 'react'\nimport {cx} from '../../utils/cx'\n\nconst THINKING_PHRASES = [\n 'Consulting the ancient tomes...',\n 'Parsing the ineffable...',\n 'Traversing the manifold of possibilities...',\n 'Genuflecting before the oracle...',\n 'Distilling quintessence...',\n 'Communing with the machine spirits...',\n 'Unfolding higher dimensions...',\n 'Perturbing the probability matrix...',\n 'Invoking the categorical imperative...',\n 'Reticulating splines...',\n 'Brewing a fresh batch of tokens...',\n 'Consulting my inner monologue...',\n 'Summoning the muse...',\n]\n\nexport interface ThinkingIndicatorProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Whether the indicator is visible/active\n */\n isVisible?: boolean\n /**\n * Interval between phrase changes in ms\n * @default 2500\n */\n phraseInterval?: number\n /**\n * Custom phrases to cycle through (defaults to built-in phrases)\n */\n phrases?: string[]\n}\n\n/**\n * ThinkingIndicator shows an animated state when the assistant is processing a request\n * but has not yet started streaming tokens. It cycles through flavorful \"thinking\" phrases.\n */\nexport const ThinkingIndicator = React.forwardRef<HTMLDivElement, ThinkingIndicatorProps>(\n (\n {\n isVisible = true,\n phraseInterval = 2500,\n phrases = THINKING_PHRASES,\n className,\n ...rest\n },\n ref\n ) => {\n // Start at a random phrase each time\n const [currentIndex, setCurrentIndex] = useState(\n () => Math.floor(Math.random() * phrases.length))\n const [isTransitioning, setIsTransitioning] = useState(false)\n\n useEffect(() => {\n if (!isVisible || phrases.length <= 1) {\n return\n }\n\n const interval = setInterval(() => {\n setIsTransitioning(true)\n\n // Wait for fade out, then change phrase\n setTimeout(() => {\n setCurrentIndex((prev) => (prev + 1) % phrases.length)\n setIsTransitioning(false)\n }, 200)\n }, phraseInterval)\n\n return () => clearInterval(interval)\n }, [isVisible, phrases.length, phraseInterval])\n\n if (!isVisible) {\n return null\n }\n\n return (\n <div\n ref={ref}\n className={cx(\n 'flex items-center gap-2 px-3 py-2 w-fit',\n 'bg-charcoal border border-ash text-silver',\n 'mr-auto',\n className\n )}\n role=\"status\"\n aria-live=\"polite\"\n {...rest}\n >\n {/* Animated dots */}\n <div className=\"flex gap-1\" aria-hidden=\"true\">\n <span className=\"w-1.5 h-1.5 bg-gold/60 rounded-full animate-pulse\"\n style={{animationDelay: '0ms'}}/>\n <span className=\"w-1.5 h-1.5 bg-gold/60 rounded-full animate-pulse\"\n style={{animationDelay: '150ms'}}/>\n <span className=\"w-1.5 h-1.5 bg-gold/60 rounded-full animate-pulse\"\n style={{animationDelay: '300ms'}}/>\n </div>\n\n {/* Phrase with fade transition */}\n <span\n className={cx(\n 'text-sm italic transition-opacity duration-200',\n isTransitioning ? 'opacity-0' : 'opacity-100'\n )}\n >\n {phrases[currentIndex]}\n </span>\n </div>\n )\n }\n)\n\nThinkingIndicator.displayName = 'ThinkingIndicator'\n\nexport default ThinkingIndicator\n","import React, {useCallback, useEffect, useRef, useState} from 'react'\nimport {cx} from '../../utils'\nimport {Paperclip, Send, Square} from 'lucide-react'\nimport {type AttachmentItem, AttachmentPreview} from '../AttachmentPreview'\nimport {createPreviewUrl, generateId, isImageFile} from './types'\n\nexport type ChatInputPosition = 'centered' | 'bottom'\n\nexport type AttachmentStatus = 'pending' | 'uploading' | 'complete' | 'error'\n\nexport interface Attachment {\n id: string\n file: File\n previewUrl?: string\n status: AttachmentStatus\n error?: string\n progress?: number\n}\n\nexport interface ChatInputProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onSubmit'> {\n /**\n * Position of the input: 'centered' for empty state, 'bottom' for conversation mode\n */\n position?: ChatInputPosition\n /**\n * Placeholder text for the input\n */\n placeholder?: string\n /**\n * Helper text shown above the input in centered mode\n */\n helperText?: React.ReactNode\n /**\n * Called when the user submits a message\n */\n onSubmit?: (message: string, attachments?: Attachment[]) => void\n /**\n * Whether the input is disabled (e.g., during streaming)\n */\n disabled?: boolean\n /**\n * Whether to animate the transition between positions\n */\n animate?: boolean\n /**\n * Whether the assistant is currently streaming (shows Stop button)\n */\n isStreaming?: boolean\n /**\n * Called when the Stop button is clicked during streaming\n */\n onStop?: () => void\n /**\n * Current attachments (controlled mode)\n */\n attachments?: Attachment[]\n /**\n * Called when attachments change (controlled mode)\n */\n onAttachmentsChange?: (attachments: Attachment[]) => void\n /**\n * Whether to show the attachment button\n */\n showAttachmentButton?: boolean\n /**\n * Accepted file types for attachments\n */\n acceptedFileTypes?: string\n}\n\n/**\n * ChatInput is a context-aware input component that can transition between\n * a centered position (for empty states) and a bottom position (for active conversations).\n *\n * Features:\n * - Auto-expanding textarea\n * - File attachments with preview\n * - Drag and drop support\n * - Streaming state with stop button\n * - Animated transition between positions\n */\nexport const ChatInput = React.forwardRef<HTMLDivElement, ChatInputProps>(\n (\n {\n position = 'bottom',\n placeholder = 'Send a message...',\n helperText,\n onSubmit,\n disabled = false,\n animate = true,\n isStreaming = false,\n onStop,\n attachments: controlledAttachments,\n onAttachmentsChange,\n showAttachmentButton = true,\n acceptedFileTypes,\n className,\n ...rest\n },\n ref\n ) => {\n const [value, setValue] = useState('')\n const [localAttachments, setLocalAttachments] = useState<Attachment[]>([])\n const [isDragOver, setIsDragOver] = useState(false)\n const textareaRef = useRef<HTMLTextAreaElement>(null)\n const fileInputRef = useRef<HTMLInputElement>(null)\n\n // Determine if using controlled or uncontrolled attachments\n const attachments = controlledAttachments ?? localAttachments\n const setAttachments = useCallback(\n (newAttachments: Attachment[] | ((prev: Attachment[]) => Attachment[])) => {\n if (onAttachmentsChange) {\n if (typeof newAttachments === 'function') {\n onAttachmentsChange(newAttachments(attachments))\n } else {\n onAttachmentsChange(newAttachments)\n }\n } else {\n setLocalAttachments(newAttachments)\n }\n },\n [attachments, onAttachmentsChange]\n )\n\n const handleSubmit = useCallback(() => {\n const trimmed = value.trim()\n if (!trimmed || disabled || isStreaming) {\n return\n }\n\n onSubmit?.(trimmed, attachments.length > 0 ? attachments : undefined)\n setValue('')\n setAttachments([])\n\n // Reset textarea height\n if (textareaRef.current) {\n textareaRef.current.style.height = 'auto'\n }\n }, [value, disabled, isStreaming, onSubmit, attachments, setAttachments])\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n handleSubmit()\n }\n },\n [handleSubmit]\n )\n\n const handleChange = useCallback((e: React.ChangeEvent<HTMLTextAreaElement>) => {\n setValue(e.target.value)\n\n // Auto-resize textarea\n const textarea = e.target\n textarea.style.height = 'auto'\n textarea.style.height = `${Math.min(textarea.scrollHeight, 200)}px`\n }, [])\n\n // Focus input when it becomes enabled\n useEffect(() => {\n if (!disabled && !isStreaming && textareaRef.current) {\n textareaRef.current.focus()\n }\n }, [disabled, isStreaming])\n\n // File handling\n const addFiles = useCallback(\n (files: FileList | File[]) => {\n const newAttachments: Attachment[] = Array.from(files).map((file) => ({\n id: generateId(),\n file,\n previewUrl: isImageFile(file) ? createPreviewUrl(file) : undefined,\n status: 'pending' as const,\n }))\n setAttachments((prev) => [...prev, ...newAttachments])\n },\n [setAttachments]\n )\n\n const handleFileSelect = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const files = e.target.files\n if (files && files.length > 0) {\n addFiles(files)\n }\n // Reset input so the same file can be selected again\n e.target.value = ''\n },\n [addFiles]\n )\n\n const handleRemoveAttachment = useCallback(\n (id: string) => {\n setAttachments((prev) => {\n const attachment = prev.find((a) => a.id === id)\n if (attachment?.previewUrl) {\n URL.revokeObjectURL(attachment.previewUrl)\n }\n return prev.filter((a) => a.id !== id)\n })\n },\n [setAttachments]\n )\n\n // Drag and drop handlers\n const handleDragEnter = useCallback((e: React.DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n setIsDragOver(true)\n }, [])\n\n const handleDragLeave = useCallback((e: React.DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n // Only set to false if we're leaving the container entirely\n if (!e.currentTarget.contains(e.relatedTarget as Node)) {\n setIsDragOver(false)\n }\n }, [])\n\n const handleDragOver = useCallback((e: React.DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n }, [])\n\n const handleDrop = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault()\n e.stopPropagation()\n setIsDragOver(false)\n\n const files = e.dataTransfer.files\n if (files && files.length > 0) {\n addFiles(files)\n }\n },\n [addFiles]\n )\n\n const isCentered = position === 'centered'\n const hasAttachments = attachments.length > 0\n const canSubmit = value.trim() && !disabled && !isStreaming\n\n return (\n <div\n ref={ref}\n className={cx(\n 'w-full',\n isCentered && 'flex flex-col items-center justify-center',\n animate && 'transition-all duration-300 ease-out',\n className\n )}\n {...rest}\n >\n {/* Helper text for centered mode */}\n {isCentered && helperText && (\n <p className=\"text-silver text-sm mb-4 text-center\">{helperText}</p>\n )}\n\n {/* Input container */}\n <div\n className={cx(\n 'relative w-full bg-charcoal border',\n isDragOver ? 'border-gold ring-1 ring-gold/30' : 'border-ash/60',\n 'focus-within:border-gold/60 focus-within:ring-1 focus-within:ring-gold/20',\n 'transition-colors duration-200',\n isCentered && 'max-w-lg'\n )}\n onDragEnter={showAttachmentButton ? handleDragEnter : undefined}\n onDragLeave={showAttachmentButton ? handleDragLeave : undefined}\n onDragOver={showAttachmentButton ? handleDragOver : undefined}\n onDrop={showAttachmentButton ? handleDrop : undefined}\n >\n {/* Attachments preview */}\n {hasAttachments && (\n <div className=\"px-3 pt-3 pb-1\">\n <AttachmentPreview\n attachments={attachments as AttachmentItem[]}\n onRemove={handleRemoveAttachment}\n removable={!isStreaming}\n />\n </div>\n )}\n\n {/* Drag overlay */}\n {isDragOver && (\n <div\n className=\"absolute inset-0 bg-gold/10 flex items-center justify-center z-10 pointer-events-none\">\n <span className=\"text-gold text-sm font-medium\">Drop files here</span>\n </div>\n )}\n\n {/* Textarea row */}\n <div className=\"flex items-end\">\n {/* Attachment button */}\n {showAttachmentButton && (\n <>\n <button\n type=\"button\"\n onClick={() => fileInputRef.current?.click()}\n disabled={disabled || isStreaming}\n className={cx(\n 'p-3 text-silver/60 hover:text-silver transition-colors',\n 'disabled:opacity-50 disabled:cursor-not-allowed'\n )}\n aria-label=\"Attach file\"\n >\n <Paperclip className=\"w-5 h-5\"/>\n </button>\n <input\n ref={fileInputRef}\n type=\"file\"\n multiple\n accept={acceptedFileTypes}\n onChange={handleFileSelect}\n className=\"hidden\"\n aria-hidden=\"true\"\n />\n </>\n )}\n\n <textarea\n ref={textareaRef}\n value={value}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n disabled={disabled || isStreaming}\n rows={1}\n className={cx(\n 'flex-1 bg-transparent text-white placeholder:text-silver/60',\n 'py-3 pr-12 resize-none outline-none min-h-12',\n !showAttachmentButton && 'pl-4',\n (disabled || isStreaming) && 'opacity-50 cursor-not-allowed'\n )}\n style={{maxHeight: 200}}\n />\n\n {/* Submit or Stop button */}\n {isStreaming ? (\n <button\n type=\"button\"\n onClick={onStop}\n className={cx(\n 'absolute right-2 bottom-2 p-2',\n 'text-error hover:bg-error/10 transition-colors duration-200'\n )}\n aria-label=\"Stop generation\"\n >\n <Square className=\"w-5 h-5 fill-current\"/>\n </button>\n ) : (\n <button\n type=\"button\"\n onClick={handleSubmit}\n disabled={!canSubmit}\n className={cx(\n 'absolute right-2 bottom-2 p-2',\n 'transition-colors duration-200',\n canSubmit\n ? 'text-gold hover:bg-gold/10'\n : 'text-silver/40 cursor-not-allowed'\n )}\n aria-label=\"Send message\"\n >\n <Send className=\"w-5 h-5\"/>\n </button>\n )}\n </div>\n </div>\n </div>\n )\n }\n)\n\nChatInput.displayName = 'ChatInput'\n\nexport default ChatInput\n","/**\n * Conversation Tree Types\n *\n * These types support branching conversations where users can:\n * - Edit their messages (creating a new branch)\n * - Retry assistant responses (creating a new branch)\n * - Navigate between different conversation branches\n */\n\n/**\n * A node in the conversation tree\n */\nexport interface MessageNode {\n /**\n * Unique identifier for this message\n */\n id: string\n /**\n * The role of the message author\n */\n role: 'user' | 'assistant'\n /**\n * The message content (may include HTML/markdown)\n */\n content: string\n /**\n * ID of the parent message (null for root messages)\n */\n parentId: string | null\n /**\n * IDs of child messages (branches/continuations)\n */\n children: string[]\n /**\n * Which sibling branch this message is (0, 1, 2...)\n * Used for UI display like \"1/3\"\n */\n branchIndex?: number\n /**\n * Whether this message is currently being streamed\n */\n isStreaming?: boolean\n /**\n * Timestamp when the message was created\n */\n createdAt?: number\n}\n\n/**\n * The full conversation tree structure\n */\nexport interface ConversationTree {\n /**\n * All nodes indexed by their ID\n */\n nodes: Record<string, MessageNode>\n /**\n * IDs of root-level messages (messages with no parent)\n */\n rootIds: string[]\n /**\n * The current \"head\" of the viewed branch\n * This is the leaf node that determines which path we're viewing\n */\n activeLeafId: string | null\n}\n\n/**\n * Attachment types for file uploads\n */\nexport type AttachmentStatus = 'pending' | 'uploading' | 'complete' | 'error'\n\nexport interface Attachment {\n /**\n * Unique identifier for the attachment\n */\n id: string\n /**\n * The File object\n */\n file: File\n /**\n * Blob URL for image previews\n */\n previewUrl?: string\n /**\n * Current upload status\n */\n status: AttachmentStatus\n /**\n * Error message if status is 'error'\n */\n error?: string\n /**\n * Upload progress (0-100)\n */\n progress?: number\n}\n\n/**\n * Helper to check if a file is an image\n */\nexport function isImageFile(file: File): boolean {\n return file.type.startsWith('image/')\n}\n\n/**\n * Helper to create a preview URL for an image file\n */\nexport function createPreviewUrl(file: File): string | undefined {\n if (isImageFile(file)) {\n return URL.createObjectURL(file)\n }\n return undefined\n}\n\n/**\n * Helper to revoke a preview URL when no longer needed\n */\nexport function revokePreviewUrl(url: string | undefined): void {\n if (url) {\n URL.revokeObjectURL(url)\n }\n}\n\n/**\n * Generate a unique ID\n */\nexport function generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`\n}\n\n/**\n * Create an empty conversation tree\n */\nexport function createEmptyTree(): ConversationTree {\n return {\n nodes: {},\n rootIds: [],\n activeLeafId: null,\n }\n}\n\n/**\n * Add a message to the tree\n */\nexport function addMessageToTree(\n tree: ConversationTree,\n message: Omit<MessageNode, 'children' | 'branchIndex'>,\n parentId: string | null = null\n): ConversationTree {\n const newNodes = {...tree.nodes}\n const newRootIds = [...tree.rootIds]\n\n // Determine branch index among siblings\n let branchIndex = 0\n if (parentId && newNodes[parentId]) {\n branchIndex = newNodes[parentId].children.length\n } else if (!parentId) {\n branchIndex = newRootIds.length\n }\n\n // Create the new node\n const newNode: MessageNode = {\n ...message,\n parentId,\n children: [],\n branchIndex,\n createdAt: message.createdAt ?? Date.now(),\n }\n\n newNodes[message.id] = newNode\n\n // Update parent's children array\n if (parentId && newNodes[parentId]) {\n newNodes[parentId] = {\n ...newNodes[parentId],\n children: [...newNodes[parentId].children, message.id],\n }\n } else {\n newRootIds.push(message.id)\n }\n\n return {\n nodes: newNodes,\n rootIds: newRootIds,\n activeLeafId: message.id,\n }\n}\n\n/**\n * Get the linear path from root to the active leaf\n */\nexport function getActivePathMessages(tree: ConversationTree): MessageNode[] {\n if (!tree.activeLeafId) {\n return []\n }\n\n const path: MessageNode[] = []\n let currentId: string | null = tree.activeLeafId\n\n // Walk up to the root\n while (currentId) {\n const node: MessageNode | undefined = tree.nodes[currentId]\n if (!node) {\n break\n }\n path.unshift(node)\n currentId = node.parentId\n }\n\n return path\n}\n\n/**\n * Get sibling count and current index for a node\n */\nexport function getSiblingInfo(tree: ConversationTree, nodeId: string): {\n total: number;\n current: number\n} {\n const node = tree.nodes[nodeId]\n if (!node) {\n return {total: 1, current: 1}\n }\n\n if (node.parentId) {\n const parent = tree.nodes[node.parentId]\n if (parent) {\n const index = parent.children.indexOf(nodeId)\n return {\n total: parent.children.length,\n current: index + 1,\n }\n }\n } else {\n // Root level node\n const index = tree.rootIds.indexOf(nodeId)\n return {\n total: tree.rootIds.length,\n current: index + 1,\n }\n }\n\n return {total: 1, current: 1}\n}\n\n/**\n * Switch to a different branch at a given node\n */\nexport function switchBranch(\n tree: ConversationTree,\n nodeId: string,\n direction: 'prev' | 'next'\n): ConversationTree {\n const node = tree.nodes[nodeId]\n if (!node) {\n return tree\n }\n\n let siblings: string[]\n let currentIndex: number\n\n if (node.parentId) {\n const parent = tree.nodes[node.parentId]\n if (!parent) {\n return tree\n }\n siblings = parent.children\n currentIndex = siblings.indexOf(nodeId)\n } else {\n siblings = tree.rootIds\n currentIndex = siblings.indexOf(nodeId)\n }\n\n if (siblings.length <= 1) {\n return tree\n }\n\n // Calculate new index\n const newIndex = direction === 'next'\n ? (currentIndex + 1) % siblings.length\n : (currentIndex - 1 + siblings.length) % siblings.length\n\n const newNodeId = siblings[newIndex]\n\n // Find the leaf of the new branch (follow first children down)\n let leafId = newNodeId\n let currentNode: MessageNode | undefined = tree.nodes[leafId]\n while (currentNode && currentNode.children.length > 0) {\n leafId = currentNode.children[0]\n currentNode = tree.nodes[leafId]\n }\n\n return {\n ...tree,\n activeLeafId: leafId,\n }\n}\n\n/**\n * Update a node's content (e.g., during streaming)\n */\nexport function updateNodeContent(\n tree: ConversationTree,\n nodeId: string,\n content: string,\n isStreaming?: boolean\n): ConversationTree {\n const node = tree.nodes[nodeId]\n if (!node) {\n return tree\n }\n\n return {\n ...tree,\n nodes: {\n ...tree.nodes,\n [nodeId]: {\n ...node,\n content,\n isStreaming: isStreaming ?? node.isStreaming,\n },\n },\n }\n}\n\n/**\n * Convert a flat message array to a conversation tree\n */\nexport function messagesToTree(\n messages: Array<{\n id: string;\n role: 'user' | 'assistant';\n content: string;\n isStreaming?: boolean\n }>\n): ConversationTree {\n let tree = createEmptyTree()\n\n for (const msg of messages) {\n const parentId = tree.activeLeafId\n tree = addMessageToTree(tree, {\n id: msg.id,\n role: msg.role,\n content: msg.content,\n parentId,\n isStreaming: msg.isStreaming,\n }, parentId)\n }\n\n return tree\n}\n\n/**\n * Check if a node has multiple children (is a branch point)\n */\nexport function isBranchPoint(tree: ConversationTree, nodeId: string): boolean {\n const node = tree.nodes[nodeId]\n return node ? node.children.length > 1 : false\n}\n","import React, {useCallback, useEffect, useRef, useState} from 'react'\nimport {cx} from '../../utils'\nimport {ArtifactCard} from '../ArtifactCard'\nimport {ArtifactGroup} from '../ArtifactGroup'\nimport {ArtifactVariantStack} from '../ArtifactVariantStack'\nimport {CardSlotLoading} from '../Card'\nimport {AudioCard} from '../AudioCard'\nimport {PdfCard} from '../PdfCard'\nimport {ScriptCard} from '../ScriptCard'\nimport {VideoCard} from '../VideoCard'\nimport {MarkdownContent} from '../MarkdownContent'\nimport {ChevronRightIcon, CloseIcon,} from '../icons'\nimport type {Artifact} from './hooks'\nimport type {ArtifactNode} from '../ArtifactNode'\nimport {useArtifactTreeNavigation} from './hooks/useArtifactTreeNavigation'\n\nconst ZOOM_LEVELS = [0.25, 0.5, 0.75, 1.0] as const\n\nexport interface ArtifactsPanelProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Top-level tree nodes to display in the navigable artifact tree.\n */\n nodes?: ArtifactNode[]\n /**\n * Whether artifacts are still loading (show skeletons)\n */\n loading?: CardSlotLoading\n}\n\n/**\n * Artifact modal for full-screen viewing\n */\nfunction ArtifactModal({\n artifact,\n onClose,\n}: {\n artifact: Artifact\n onClose: () => void\n}) {\n // Handle ESC key\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n onClose()\n }\n }\n document.addEventListener('keydown', handleKeyDown)\n return () => document.removeEventListener('keydown', handleKeyDown)\n }, [onClose])\n\n // Handle click outside\n const handleBackdropClick = useCallback((e: React.MouseEvent) => {\n if (e.target === e.currentTarget) {\n onClose()\n }\n }, [onClose])\n\n return (\n <div\n className=\"fixed inset-0 z-50 flex items-center justify-center bg-void/90 backdrop-blur-sm animate-fade-in\"\n onClick={handleBackdropClick}\n >\n <div\n className=\"relative w-11/12 h-5/6 max-w-6xl bg-charcoal border border-ash/40 flex flex-col overflow-hidden\">\n {/* Modal header */}\n <div\n className=\"flex items-center justify-between p-4 border-b border-ash/40 shrink-0\">\n <div>\n {artifact.title && (\n <h3 className=\"text-sm font-semibold text-white\">{artifact.title}</h3>\n )}\n {artifact.subtitle && (\n <p className=\"text-xs text-silver\">{artifact.subtitle}</p>\n )}\n </div>\n <button\n onClick={onClose}\n className=\"p-2 text-silver hover:text-white hover:bg-ash/20 transition-colors\"\n aria-label=\"Close modal\"\n >\n <CloseIcon className=\"w-5 h-5\"/>\n </button>\n </div>\n\n {/* Modal content */}\n <div className=\"flex-1 overflow-auto p-4\">\n {artifact.type === 'IMAGE' && (\n <img\n src={artifact.url}\n alt={artifact.alt || 'Artifact image'}\n className=\"max-w-full max-h-full object-contain mx-auto\"\n />\n )}\n {artifact.type === 'VIDEO' && (\n <VideoCard\n src={artifact.url || ''}\n aspectRatio=\"video\"\n controls\n className=\"max-w-full max-h-full mx-auto\"\n />\n )}\n {artifact.type === 'AUDIO' && (\n <AudioCard\n src={artifact.url || ''}\n controls\n className=\"max-w-xl mx-auto\"\n />\n )}\n {artifact.type === 'PDF' && (\n <PdfCard\n src={artifact.url || ''}\n className=\"h-full border-0\"\n />\n )}\n {artifact.type === 'TEXT' && (\n <MarkdownContent\n content={artifact.inlineContent || ''}\n isMarkdown={artifact.mimeType !== 'text/plain'}\n className={cx(\n \"prose prose-invert max-w-none\",\n artifact.mimeType === 'text/plain' && \"whitespace-pre-wrap\"\n )}\n />\n )}\n {artifact.type === 'SCRIPT' && artifact.scriptElements && (\n <ScriptCard\n elements={artifact.scriptElements}\n maxHeight=\"100%\"\n className=\"max-w-3xl mx-auto border-0\"\n />\n )}\n </div>\n </div>\n </div>\n )\n}\n\n/**\n * Renders a single node according to its type.\n */\nfunction NodeRenderer({\n node,\n loading,\n onExpandArtifact,\n onGroupClick,\n}: {\n node: ArtifactNode\n loading?: CardSlotLoading\n onExpandArtifact: (artifact: Artifact) => void\n onGroupClick: (node: ArtifactNode) => void\n}) {\n if (node.type === 'ARTIFACT' && node.artifact) {\n return (\n <ArtifactCard\n artifact={node.artifact}\n loading={loading}\n onExpand={onExpandArtifact}\n />\n )\n }\n\n if (node.type === 'GROUP') {\n return <ArtifactGroup node={node} onClick={onGroupClick}/>\n }\n\n if (node.type === 'VARIANT_SET') {\n return (\n <ArtifactVariantStack\n node={node}\n onExpandArtifact={onExpandArtifact}\n onGroupClick={onGroupClick}\n />\n )\n }\n\n return null\n}\n\n/**\n * ArtifactsPanel displays artifacts in a navigable tree panel.\n *\n * This is a content-only component — it fills whatever container it is\n * placed in. Opening/closing and resizing are handled by the parent\n * ToolPanelContainer and ToolSidebar.\n *\n * Groups can be entered (breadcrumb navigation) and artifact nodes\n * can be expanded to a full-screen modal.\n *\n * Supports zoom controls (0.25x–1x). Zoom uses CSS `transform: scale()`\n * on the content wrapper so the entire layout scales uniformly — cards,\n * images, gaps, and text all shrink as if the viewer is physically\n * moving back from the content.\n */\nexport const ArtifactsPanel = React.forwardRef<HTMLDivElement, ArtifactsPanelProps>(\n ({\n nodes,\n loading,\n className,\n ...rest\n }, ref) => {\n const [expandedArtifact, setExpandedArtifact] = useState<Artifact | null>(null)\n const [zoomIndex, setZoomIndex] = useState<number>(ZOOM_LEVELS.length - 1) // default 1.0\n\n const treeNav = useArtifactTreeNavigation(nodes || [])\n\n const hasNodes = !!nodes && nodes.length > 0\n\n const handleExpandArtifact = useCallback((artifact: Artifact) => {\n setExpandedArtifact(artifact)\n }, [])\n\n const handleGroupClick = useCallback((node: ArtifactNode) => {\n treeNav.navigateInto(node)\n }, [treeNav])\n\n const zoomIn = useCallback(() => {\n setZoomIndex(prev => Math.min(prev + 1, ZOOM_LEVELS.length - 1))\n }, [])\n\n const zoomOut = useCallback(() => {\n setZoomIndex(prev => Math.max(prev - 1, 0))\n }, [])\n\n const currentZoom = ZOOM_LEVELS[zoomIndex]\n\n // Measure content height so the scroll container can shrink to match the scaled visual height\n const contentRef = useRef<HTMLDivElement>(null)\n const [contentHeight, setContentHeight] = useState<number | undefined>(undefined)\n\n useEffect(() => {\n const el = contentRef.current\n if (!el) return\n const observer = new ResizeObserver(([entry]) => {\n setContentHeight(entry.contentRect.height)\n })\n observer.observe(el)\n return () => observer.disconnect()\n }, [])\n\n return (\n <>\n <div\n ref={ref}\n data-testid=\"artifacts-panel\"\n className={cx(\n 'h-full flex flex-col relative',\n className\n )}\n {...rest}\n >\n {/* Header with title and zoom controls */}\n <div\n className=\"flex items-center justify-between p-4 border-b border-ash/40 shrink-0\">\n <h3 className=\"text-sm font-semibold text-white\">Artifacts</h3>\n {hasNodes && (\n <div\n className=\"flex items-center gap-0.5\"\n data-testid=\"zoom-controls\"\n >\n <button\n onClick={zoomOut}\n disabled={zoomIndex === 0}\n className={cx(\n 'w-6 h-6 flex items-center justify-center text-xs font-bold',\n 'bg-charcoal border border-ash/40',\n zoomIndex === 0\n ? 'text-silver/30 cursor-not-allowed'\n : 'text-silver hover:text-gold hover:border-gold/40 transition-colors',\n )}\n aria-label=\"Zoom out\"\n >\n −\n </button>\n <span className=\"text-xs text-silver w-8 text-center tabular-nums\" data-testid=\"zoom-level\">\n {Math.round(currentZoom * 100)}%\n </span>\n <button\n onClick={zoomIn}\n disabled={zoomIndex === ZOOM_LEVELS.length - 1}\n className={cx(\n 'w-6 h-6 flex items-center justify-center text-xs font-bold',\n 'bg-charcoal border border-ash/40',\n zoomIndex === ZOOM_LEVELS.length - 1\n ? 'text-silver/30 cursor-not-allowed'\n : 'text-silver hover:text-gold hover:border-gold/40 transition-colors',\n )}\n aria-label=\"Zoom in\"\n >\n +\n </button>\n </div>\n )}\n </div>\n\n {/* Breadcrumb trail (tree mode only, when not at root) */}\n {hasNodes && !treeNav.isAtRoot && (\n <nav\n className=\"flex items-center gap-1 px-4 py-2 border-b border-ash/40 shrink-0 overflow-x-auto text-xs\"\n aria-label=\"Breadcrumb\"\n data-testid=\"breadcrumb-nav\"\n >\n {treeNav.breadcrumbs.map((crumb, i) => {\n const isLast = i === treeNav.breadcrumbs.length - 1\n return (\n <span key={i} className=\"flex items-center gap-1 shrink-0\">\n {i > 0 && (\n <ChevronRightIcon className=\"w-3 h-3 text-silver/50\" aria-hidden/>\n )}\n {isLast ? (\n <span className=\"text-gold font-medium\">{crumb.label}</span>\n ) : (\n <button\n onClick={() => treeNav.navigateTo(i)}\n className=\"text-silver hover:text-white transition-colors\"\n >\n {crumb.label}\n </button>\n )}\n </span>\n )\n })}\n </nav>\n )}\n\n {/* Content area — single column, natural widths, scrollable */}\n <div\n className=\"flex-1 overflow-auto relative\"\n data-testid=\"artifacts-scroll-area\"\n >\n {/* Sizer div: collapses to the scaled height so scrollbar tracks correctly */}\n <div\n style={currentZoom !== 1 && contentHeight !== undefined\n ? { height: contentHeight * currentZoom }\n : undefined\n }\n >\n <div\n ref={contentRef}\n data-testid=\"artifacts-grid\"\n className=\"p-4 space-y-4\"\n style={currentZoom !== 1\n ? {\n transform: `scale(${currentZoom})`,\n transformOrigin: 'top center',\n }\n : undefined\n }\n >\n {treeNav.currentNodes.length === 0 ? (\n <p className=\"text-xs text-silver/60 text-center py-8\">\n {hasNodes ? 'Empty group' : 'No artifacts to display'}\n </p>\n ) : (\n treeNav.currentNodes.map((node) => (\n <NodeRenderer\n key={node.id}\n node={node}\n loading={loading}\n onExpandArtifact={handleExpandArtifact}\n onGroupClick={handleGroupClick}\n />\n ))\n )}\n </div>\n </div>\n </div>\n\n </div>\n\n {/* Modal for expanded artifact */}\n {expandedArtifact && (\n <ArtifactModal\n artifact={expandedArtifact}\n onClose={() => setExpandedArtifact(null)}\n />\n )}\n </>\n )\n }\n)\n\nArtifactsPanel.displayName = 'ArtifactsPanel'\n\n/**\n * Toggle button to expand collapsed artifacts panel\n */\nexport interface ArtifactsPanelToggleProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n artifactCount?: number\n onExpand?: () => void\n}\n\nexport const ArtifactsPanelToggle = React.forwardRef<\n HTMLButtonElement,\n ArtifactsPanelToggleProps\n>(({artifactCount = 0, onExpand, className, ...rest}, ref) => {\n return (\n <button\n ref={ref}\n onClick={onExpand}\n className={cx(\n 'p-2',\n 'bg-charcoal/80 border border-ash/40',\n 'text-silver hover:text-white hover:bg-ash/20',\n 'transition-colors duration-150',\n 'flex items-center gap-2',\n 'relative',\n className\n )}\n aria-label=\"Expand artifacts panel\"\n {...rest}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n className=\"w-5 h-5\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M2 4.5A1.5 1.5 0 013.5 3h13A1.5 1.5 0 0118 4.5v11a1.5 1.5 0 01-1.5 1.5h-13A1.5 1.5 0 012 15.5v-11zM4 5v1h1V5H4zm2 0v1h1V5H6zm7 0v1h1V5h-1zm2 0v1h1V5h-1zM4 14v1h1v-1H4zm2 0v1h1v-1H6zm7 0v1h1v-1h-1zm2 0v1h1v-1h-1zM8 8.118a.5.5 0 01.757-.429l4 2.382a.5.5 0 010 .858l-4 2.382A.5.5 0 018 12.882V8.118z\"\n clipRule=\"evenodd\"\n />\n </svg>\n {artifactCount > 0 && (\n <span\n className=\"absolute -top-1 -right-1 w-4 h-4 bg-gold text-obsidian text-xs font-medium flex items-center justify-center\">\n {artifactCount}\n </span>\n )}\n </button>\n )\n})\n\nArtifactsPanelToggle.displayName = 'ArtifactsPanelToggle'\n","import React from 'react'\nimport {type CardSlotLoading} from './Card'\nimport {ImageCard} from './ImageCard'\nimport {VideoCard} from './VideoCard'\nimport {AudioCard} from './AudioCard'\nimport {PdfCard} from './PdfCard'\nimport {ScriptCard, type ScriptElement} from './ScriptCard'\nimport {TextCard} from './TextCard'\nimport {ExpandIcon} from './icons'\nimport {cx} from '../utils'\nimport {deriveCardSlotLoading} from '../utils/artifactLoading'\n\n/**\n * Artifact types supported by the system\n */\nexport const ARTIFACT_TYPES = {\n TEXT: 'TEXT',\n IMAGE: 'IMAGE',\n VIDEO: 'VIDEO',\n AUDIO: 'AUDIO',\n SCRIPT: 'SCRIPT',\n PDF: 'PDF',\n} as const\n\nexport type ArtifactType = typeof ARTIFACT_TYPES[keyof typeof ARTIFACT_TYPES]\n\nexport interface Artifact {\n id: string\n type: ArtifactType\n /**\n * For text artifacts - the content (markdown, HTML, or plain text)\n */\n inlineContent?: string\n /**\n * For artifacts that source from a URL (image, video, audio, pdf, file)\n */\n url?: string\n /**\n * The mime type of the content\n */\n mimeType?: string\n /**\n * For image artifacts - alt text\n */\n alt?: string\n /**\n * Display title shown below the artifact\n */\n title?: string\n /**\n * Display subtitle shown below the title\n */\n subtitle?: string\n /**\n * Whether this artifact is still loading (shows skeleton)\n */\n isPending?: boolean\n /**\n * Whether the artifact should span full width in the grid\n */\n fullWidth?: boolean\n /**\n * For html artifacts - structured script elements (used by ScriptCard)\n */\n scriptElements?: ScriptElement[]\n}\n\nexport interface ArtifactCardProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * The artifact object to display\n */\n artifact: Artifact\n /**\n * Callback when the artifact should be expanded/opened\n */\n onExpand?: (artifact: Artifact) => void\n /**\n * Whether the artifact is still loading\n */\n loading?: CardSlotLoading\n}\n\n/**\n * A dispatcher component that renders the appropriate specialist card\n * based on the artifact type.\n */\nexport const ArtifactCard = React.forwardRef<HTMLDivElement, ArtifactCardProps>(\n ({artifact, onExpand, loading, className, ...props}, ref) => {\n const derivedLoading = deriveCardSlotLoading(artifact)\n const commonProps = {\n title: artifact.title,\n subtitle: artifact.subtitle,\n loading: loading || derivedLoading,\n className: 'w-full',\n }\n\n const handleExpand = (e: React.MouseEvent) => {\n e.stopPropagation()\n if (onExpand) {\n onExpand(artifact)\n }\n }\n\n const renderContent = () => {\n switch (artifact.type) {\n case 'IMAGE':\n return (\n <ImageCard\n {...commonProps}\n src={artifact.url}\n alt={artifact.alt}\n aspectRatio=\"landscape\"\n />\n )\n case 'VIDEO':\n return (\n <VideoCard\n {...commonProps}\n src={artifact.url}\n aspectRatio=\"video\"\n controls\n />\n )\n case 'AUDIO':\n return (\n <AudioCard\n {...commonProps}\n src={artifact.url}\n controls\n />\n )\n case 'PDF':\n return (\n <PdfCard\n {...commonProps}\n src={artifact.url}\n />\n )\n case 'SCRIPT':\n return (\n <ScriptCard\n {...commonProps}\n elements={artifact.scriptElements || []}\n maxHeight=\"16rem\"\n />\n )\n case 'TEXT':\n return (\n <TextCard\n {...commonProps}\n content={artifact.inlineContent || ''}\n isMarkdown={artifact.mimeType !== 'text/plain'}\n contentClassName={cx(\n artifact.mimeType === 'text/plain' && \"whitespace-pre-wrap\"\n )}\n />\n )\n default:\n return null\n }\n }\n\n // Determine if the card itself should be clickable to expand\n // Video and Audio have their own controls, so we only expand via the button\n const isCardExpandable = !!onExpand && (\n artifact.type === 'IMAGE' ||\n artifact.type === 'PDF' ||\n artifact.type === 'SCRIPT' ||\n artifact.type === 'TEXT'\n )\n\n return (\n <div\n ref={ref}\n className={cx(\n 'relative group',\n isCardExpandable && 'cursor-pointer',\n artifact.fullWidth && 'col-span-full',\n className\n )}\n onClick={isCardExpandable ? handleExpand : undefined}\n {...props}\n >\n {onExpand && (\n <button\n onClick={handleExpand}\n className={cx(\n 'absolute top-2 right-2 z-10 p-1.5',\n 'bg-obsidian/80 text-silver hover:text-white hover:bg-obsidian',\n 'opacity-0 group-hover:opacity-100 transition-opacity'\n )}\n aria-label=\"Expand artifact\"\n >\n <ExpandIcon className=\"w-4 h-4\"/>\n </button>\n )}\n {renderContent()}\n </div>\n )\n }\n)\n\nArtifactCard.displayName = 'ArtifactCard'\n\nexport default ArtifactCard\n","import React from 'react'\nimport {Card, type CardProps, type CardSlotLoading} from './Card'\nimport {cx} from '../utils'\n\nexport type AspectRatioPreset = 'landscape' | 'portrait' | 'square'\nexport type AspectRatio = AspectRatioPreset | `${number}/${number}`\n\nexport interface ImageCardProps extends Omit<CardProps, 'title'> {\n src?: string\n alt?: string\n title?: React.ReactNode\n subtitle?: React.ReactNode\n aspectRatio?: AspectRatio\n objectFit?: 'cover' | 'contain'\n overlay?: React.ReactNode\n mediaClassName?: string\n contentClassName?: string\n loading?: CardSlotLoading\n}\n\nconst ASPECT_RATIO_PRESETS: Record<AspectRatioPreset, string> = {\n landscape: '3 / 2',\n portrait: '2 / 3',\n square: '1 / 1',\n}\n\nfunction resolveAspectRatio(ratio: AspectRatio): string {\n if (ratio in ASPECT_RATIO_PRESETS) {\n return ASPECT_RATIO_PRESETS[ratio as AspectRatioPreset]\n }\n return ratio.replace('/', ' / ')\n}\n\nexport const ImageCard = React.forwardRef<HTMLDivElement, ImageCardProps>(\n (\n {\n src,\n alt = '',\n title,\n subtitle,\n aspectRatio = 'landscape',\n objectFit = 'cover',\n overlay,\n mediaClassName,\n contentClassName,\n className,\n children,\n loading,\n ...props\n },\n ref\n ) => {\n return (\n <Card\n ref={ref}\n className={cx('p-0 overflow-hidden w-full', className)}\n loading={loading}\n {...props}\n >\n <Card.Media\n className={mediaClassName}\n style={{aspectRatio: resolveAspectRatio(aspectRatio)}}\n >\n <>\n {src && (\n <img\n src={src}\n alt={alt}\n className={cx(\n 'w-full h-full',\n objectFit === 'cover' ? 'object-cover' : 'object-contain'\n )}\n />\n )}\n {overlay && (\n <div\n className=\"absolute inset-0 bg-obsidian/80 opacity-0 group-hover:opacity-100 transition-opacity duration-200 flex items-center justify-center\">\n {overlay}\n </div>\n )}\n </>\n </Card.Media>\n <Card.Header\n title={title}\n subtitle={subtitle}\n className={contentClassName}\n />\n {children && <Card.Body className={contentClassName}>{children}</Card.Body>}\n </Card>\n )\n }\n)\n\nImageCard.displayName = 'ImageCard'","import React from 'react'\nimport ReactPlayer from 'react-player'\nimport {Card, type CardProps, type CardSlotLoading} from './Card'\nimport {cx} from '../utils'\n\nexport type VideoAspectRatioPreset = 'video' | 'cinema' | 'square'\nexport type VideoAspectRatio = VideoAspectRatioPreset | `${number}/${number}`\n\nexport interface VideoCardProps extends Omit<CardProps, 'title'> {\n src?: string\n title?: React.ReactNode\n subtitle?: React.ReactNode\n aspectRatio?: VideoAspectRatio\n playing?: boolean\n controls?: boolean\n light?: boolean | string\n volume?: number\n muted?: boolean\n loop?: boolean\n mediaClassName?: string\n contentClassName?: string\n playerProps?: any\n loading?: CardSlotLoading\n}\n\nconst ASPECT_RATIO_PRESETS: Record<VideoAspectRatioPreset, string> = {\n video: '16 / 9',\n cinema: '21 / 9',\n square: '1 / 1',\n}\n\nfunction resolveAspectRatio(ratio: VideoAspectRatio): string {\n if (ratio in ASPECT_RATIO_PRESETS) {\n return ASPECT_RATIO_PRESETS[ratio as VideoAspectRatioPreset]\n }\n return ratio.replace('/', ' / ')\n}\n\nexport const VideoCard = React.forwardRef<HTMLDivElement, VideoCardProps>(\n (\n {\n src,\n title,\n subtitle,\n aspectRatio = 'video',\n playing = false,\n controls = true,\n light = false,\n volume,\n muted = false,\n loop = false,\n mediaClassName,\n contentClassName,\n className,\n children,\n playerProps,\n loading,\n ...props\n },\n ref\n ) => {\n return (\n <Card\n ref={ref}\n className={cx('p-0 overflow-hidden w-full', className)}\n loading={loading}\n {...props}\n >\n <Card.Media\n className={mediaClassName}\n style={{aspectRatio: resolveAspectRatio(aspectRatio)}}\n >\n {src && (\n <ReactPlayer\n src={src}\n playing={playing}\n controls={controls}\n light={light}\n volume={volume}\n muted={muted}\n loop={loop}\n width=\"100%\"\n height=\"100%\"\n className=\"absolute top-0 left-0\"\n {...playerProps}\n />\n )}\n </Card.Media>\n <Card.Header\n title={title}\n subtitle={subtitle}\n className={contentClassName}\n />\n {children && <Card.Body className={contentClassName}>{children}</Card.Body>}\n </Card>\n )\n }\n)\n\nVideoCard.displayName = 'VideoCard'\n","import React from 'react'\nimport ReactPlayer from 'react-player'\nimport {Music} from 'lucide-react'\nimport {Card, type CardProps, type CardSlotLoading} from './Card'\nimport {cx} from '../utils'\n\nexport interface AudioCardProps extends Omit<CardProps, 'title'> {\n src?: string\n title?: React.ReactNode\n subtitle?: React.ReactNode\n playing?: boolean\n controls?: boolean\n volume?: number\n muted?: boolean\n loop?: boolean\n mediaClassName?: string\n contentClassName?: string\n playerProps?: any\n height?: string | number\n loading?: CardSlotLoading\n}\n\nexport const AudioCard = React.forwardRef<HTMLDivElement, AudioCardProps>(\n (\n {\n src,\n title,\n subtitle,\n playing = false,\n controls = true,\n volume,\n muted = false,\n loop = false,\n mediaClassName,\n contentClassName,\n className,\n children,\n playerProps,\n height = '40px',\n loading,\n ...props\n },\n ref\n ) => {\n return (\n <Card\n ref={ref}\n className={cx('p-0 overflow-hidden w-full', className)}\n loading={loading}\n {...props}\n >\n <Card.Media className={cx('bg-obsidian py-8 flex flex-col items-center justify-center',\n mediaClassName)}>\n <div className=\"mb-4 text-gold\">\n <Music size={48}/>\n </div>\n\n {src && (\n <div className=\"w-full px-4\">\n <ReactPlayer\n src={src}\n playing={playing}\n controls={controls}\n volume={volume}\n muted={muted}\n loop={loop}\n width=\"100%\"\n height={height}\n style={{backgroundColor: 'transparent'}}\n config={{\n file: {\n forceAudio: true,\n attributes: {\n style: {width: '100%', height: height}\n }\n }\n }}\n {...playerProps}\n />\n </div>\n )}\n </Card.Media>\n <Card.Header\n title={title}\n subtitle={subtitle}\n className={contentClassName}\n />\n {children && <Card.Body className={contentClassName}>{children}</Card.Body>}\n </Card>\n )\n }\n)\n\nAudioCard.displayName = 'AudioCard'\n","import React from 'react'\nimport {FileText} from 'lucide-react'\nimport {Card, type CardProps, type CardSlotLoading} from './Card'\nimport {cx} from '../utils'\n\nexport interface PdfCardProps extends Omit<CardProps, 'title'> {\n /**\n * URL of the PDF file\n */\n src?: string\n /**\n * Title of the document\n */\n title?: React.ReactNode\n /**\n * Subtitle or document metadata\n */\n subtitle?: React.ReactNode\n /**\n * Height of the PDF viewer\n */\n height?: string | number\n /**\n * Optional class name for the media container\n */\n mediaClassName?: string\n /**\n * Optional class name for the content container\n */\n contentClassName?: string\n loading?: CardSlotLoading\n}\n\n/**\n * A card for displaying PDF documents with an embedded viewer.\n */\nexport const PdfCard = React.forwardRef<HTMLDivElement, PdfCardProps>(\n (\n {\n src,\n title,\n subtitle,\n height = '400px',\n mediaClassName,\n contentClassName,\n className,\n children,\n loading,\n ...props\n },\n ref\n ) => {\n return (\n <Card\n ref={ref}\n className={cx('p-0 overflow-hidden w-full', className)}\n loading={loading}\n {...props}\n >\n <Card.Media\n className={cx('bg-obsidian', mediaClassName)}\n style={{height}}\n >\n {src && (\n <iframe\n src={`${src}#view=FitH`}\n title={typeof title === 'string' ? title : 'PDF Document'}\n className=\"w-full h-full border-0\"\n />\n )}\n </Card.Media>\n <Card.Header\n title={title}\n subtitle={subtitle}\n className={contentClassName}\n action={\n <div className=\"p-2 bg-ash/20 text-gold shrink-0\">\n <FileText size={20}/>\n </div>\n }\n />\n {children && <Card.Body className={contentClassName}>{children}</Card.Body>}\n </Card>\n )\n }\n)\n\nPdfCard.displayName = 'PdfCard'\n","import React from 'react'\nimport {cx} from '../utils'\n\nimport {Card, type CardProps, type CardSlotLoading} from './Card'\n\n/**\n * Script element types following standard screenplay format\n */\nexport const SCRIPT_ELEMENT_TYPES = {\n SCENE_HEADING: 'scene-heading',\n ACTION: 'action',\n CHARACTER: 'character',\n DIALOGUE: 'dialogue',\n PARENTHETICAL: 'parenthetical',\n TRANSITION: 'transition',\n TITLE: 'title',\n SUBTITLE: 'subtitle',\n} as const\n\nexport type ScriptElementType = typeof SCRIPT_ELEMENT_TYPES[keyof typeof SCRIPT_ELEMENT_TYPES]\n\n/**\n * A single element in the script\n */\nexport interface ScriptElement {\n /**\n * The type of script element (e.g., 'scene-heading', 'character', 'dialogue')\n */\n type: ScriptElementType\n /**\n * The text content of the element\n */\n content: string\n}\n\nexport interface ScriptCardProps extends Omit<CardProps, 'title'> {\n /**\n * Title of the script (shown at top)\n */\n title?: React.ReactNode\n /**\n * Subtitle/metadata (e.g., \"30-second spot • Directed by AI Creative\")\n */\n subtitle?: React.ReactNode\n /**\n * Array of script elements in order.\n * Available types: 'scene-heading', 'action', 'character', 'dialogue', 'parenthetical',\n * 'transition', 'title', 'subtitle'\n */\n elements: ScriptElement[]\n /**\n * Maximum height before scrolling (default: 16rem / 256px)\n */\n maxHeight?: string\n loading?: CardSlotLoading\n}\n\n/**\n * Render a script element with proper formatting\n */\nfunction ScriptElementRenderer({element}: { element: ScriptElement }) {\n switch (element.type) {\n case 'scene-heading':\n return (\n <p className=\"mt-4 mb-2 font-bold uppercase text-gold text-xs tracking-wide\">\n {element.content}\n </p>\n )\n\n case 'action':\n return (\n <p className=\"my-2 text-silver text-xs leading-relaxed\">\n {element.content}\n </p>\n )\n\n case 'character':\n return (\n <p className=\"mt-4 mb-0.5 ml-8 font-bold text-white text-xs uppercase tracking-wide\">\n {element.content}\n </p>\n )\n\n case 'parenthetical':\n return (\n <p className=\"ml-6 text-silver/70 text-xs italic\">\n ({element.content})\n </p>\n )\n\n case 'dialogue':\n return (\n <p className=\"ml-4 mr-8 text-silver text-xs leading-relaxed\">\n {element.content}\n </p>\n )\n\n case 'transition':\n return (\n <p className=\"mt-4 mb-2 text-right font-bold uppercase text-gold/80 text-xs tracking-wide\">\n {element.content}\n </p>\n )\n\n case 'title':\n return (\n <p className=\"mt-6 mb-2 text-center font-bold text-gold text-sm\">\n {element.content}\n </p>\n )\n\n case 'subtitle':\n return (\n <p className=\"text-center italic text-gold/70 text-xs\">\n {element.content}\n </p>\n )\n\n default:\n return null\n }\n}\n\n/**\n * ScriptCard displays a formatted movie/video script.\n *\n * Follows standard screenplay formatting conventions:\n * - Scene headings: uppercase, gold, left-aligned\n * - Action: silver, full width\n * - Character names: uppercase, centered-left\n * - Dialogue: indented from both sides\n * - Transitions: uppercase, right-aligned\n *\n * @example\n * ```tsx\n * <ScriptCard\n * title=\"The Arrival\"\n * elements={[\n * { type: 'scene-heading', content: 'EXT. SPACE STATION - NIGHT' },\n * { type: 'action', content: 'A lone ship approaches the docking bay.' },\n * { type: 'character', content: 'PILOT' },\n * { type: 'dialogue', content: 'Requesting permission to land.' }\n * ]}\n * />\n * ```\n */\nexport const ScriptCard = React.forwardRef<HTMLDivElement, ScriptCardProps>(\n ({title, subtitle, elements, maxHeight = '16rem', className, style, loading, ...rest},\n ref) => {\n return (\n <Card\n ref={ref}\n className={cx('p-0 overflow-hidden w-full', className)}\n loading={loading}\n {...rest}\n >\n <Card.Header\n title={title}\n subtitle={subtitle}\n />\n <Card.Body\n className=\"font-mono overflow-y-auto\"\n style={{maxHeight, ...style}}\n >\n {elements.map((element, index) => (\n <ScriptElementRenderer key={index} element={element}/>\n ))}\n </Card.Body>\n </Card>\n )\n }\n)\n\nScriptCard.displayName = 'ScriptCard'\n\nexport default ScriptCard\n","import React from 'react'\nimport {Card, type CardProps, type CardSlotLoading} from './Card'\nimport {MarkdownContent} from './MarkdownContent'\nimport {cx} from '../utils'\n\nexport interface TextCardProps extends Omit<CardProps, 'title'> {\n /**\n * Text content to display (Markdown, HTML, or plain text)\n */\n content: string\n /**\n * Optional title for the card\n */\n title?: React.ReactNode\n /**\n * Optional subtitle or metadata\n */\n subtitle?: React.ReactNode\n /**\n * Whether the content should be treated as Markdown\n * @default true\n */\n isMarkdown?: boolean\n /**\n * Maximum height of the content area before scrolling\n * @default '16rem'\n */\n maxHeight?: string | number\n /**\n * Optional class name for the content container\n */\n contentClassName?: string\n loading?: CardSlotLoading\n}\n\n/**\n * A card for displaying text content, supporting Markdown and HTML formatting.\n */\nexport const TextCard = React.forwardRef<HTMLDivElement, TextCardProps>(\n (\n {\n content,\n title,\n subtitle,\n isMarkdown = true,\n maxHeight = '16rem',\n contentClassName,\n className,\n loading,\n ...props\n },\n ref\n ) => {\n return (\n <Card\n ref={ref}\n className={cx('p-0 overflow-hidden w-full', className)}\n loading={loading}\n {...props}\n >\n <Card.Header\n title={title}\n subtitle={subtitle}\n />\n <Card.Body\n className={cx('overflow-y-auto', contentClassName)}\n style={{maxHeight}}\n >\n <MarkdownContent\n content={content}\n isMarkdown={isMarkdown}\n className=\"prose-sm prose-invert max-w-none\"\n />\n </Card.Body>\n </Card>\n )\n }\n)\n\nTextCard.displayName = 'TextCard'\n\nexport default TextCard\n","import {Artifact} from '../components'\nimport {CardSlotLoading} from '../components/Card'\n\n/**\n * Centralized policy to derive which card slots should show skeletons\n * based on the artifact's current state and pending status.\n */\nexport function deriveCardSlotLoading(a: Artifact): CardSlotLoading | undefined {\n if (!a.isPending) {\n return undefined\n }\n\n const header = {\n title: !a.title,\n subtitle: !a.subtitle,\n }\n\n const mediaNeeded = (type: string) => ['IMAGE', 'VIDEO', 'AUDIO', 'PDF'].includes(type)\n const media = mediaNeeded(a.type) && !a.url\n\n const body = (\n (a.type === 'TEXT' && !(a.inlineContent && a.inlineContent.trim().length)) ||\n (a.type === 'SCRIPT' && !(a.scriptElements && a.scriptElements.length > 0))\n )\n\n return {header, media, body}\n}\n","import React, {useEffect, useRef, useState} from 'react'\nimport {cx} from '../utils'\nimport {type ArtifactNode} from './ArtifactNode'\nimport {ArtifactCard} from './ArtifactCard'\nimport {Card} from './Card'\n\nexport interface ArtifactGroupProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onClick'> {\n /**\n * The GROUP node to display\n */\n node: ArtifactNode\n /**\n * Called when the group is clicked (e.g. to navigate into it)\n */\n onClick?: (node: ArtifactNode) => void\n}\n\n// Fixed offset for each layer behind the front card\nconst LAYER_OFFSET = '8px'\nconst LAYER_OFFSET_2X = '16px'\n\n/**\n * Renders a GROUP node as a Card with the group label as title. Inside,\n * the first child is shown on top with two offset layers behind it\n * (always shown as a visual symbol for \"group\"). A square count badge\n * shows the total items.\n */\nexport const ArtifactGroup = React.forwardRef<HTMLDivElement, ArtifactGroupProps>(\n ({node, onClick, className, ...props}, ref) => {\n const children = node.children\n const count = children.length\n const frontChild = children[0]\n\n // Detect count changes and trigger badge animation\n const prevCountRef = useRef(count)\n const [badgePing, setBadgePing] = useState(false)\n\n useEffect(() => {\n if (count !== prevCountRef.current) {\n prevCountRef.current = count\n setBadgePing(true)\n const timer = setTimeout(() => setBadgePing(false), 500)\n return () => clearTimeout(timer)\n }\n }, [count])\n\n const handleClick = () => {\n if (onClick) {\n onClick(node)\n }\n }\n\n const renderFrontContent = () => {\n if (!frontChild) {\n return (\n <div className=\"w-full aspect-video bg-graphite border border-ash/40 flex items-center justify-center\">\n <span className=\"text-silver text-sm\">Empty group</span>\n </div>\n )\n }\n\n if (frontChild.type === 'ARTIFACT' && frontChild.artifact) {\n return <ArtifactCard artifact={frontChild.artifact} className=\"w-full\"/>\n }\n\n // For nested groups or variant sets, show a label card\n return (\n <div\n className=\"w-full aspect-video bg-graphite border border-gold/30 flex flex-col items-center justify-center gap-2 p-4\">\n <span className=\"text-sm text-silver uppercase tracking-wider\">\n {frontChild.type === 'GROUP' ? 'Group' : 'Variants'}\n </span>\n <span className=\"text-white font-semibold\">{frontChild.label}</span>\n </div>\n )\n }\n\n return (\n <div\n ref={ref}\n className={cx(\n 'cursor-pointer group',\n className\n )}\n onClick={handleClick}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n handleClick()\n }\n }}\n aria-label={`${node.label} — ${count} items`}\n {...props}\n >\n <Card noPadding className=\"p-5\">\n <h3 className=\"text-lg font-semibold text-white m-0 mb-4\">{node.label}</h3>\n {/* Outer wrapper reserves space for the offset layers */}\n <div style={{paddingRight: LAYER_OFFSET_2X, paddingBottom: LAYER_OFFSET_2X}}>\n <div className=\"relative\">\n {/* Back layer */}\n <div\n className=\"absolute inset-0 bg-charcoal border border-ash/30 pointer-events-none\"\n style={{transform: `translate(${LAYER_OFFSET_2X}, ${LAYER_OFFSET_2X})`}}\n aria-hidden=\"true\"\n />\n\n {/* Middle layer */}\n <div\n className=\"absolute inset-0 bg-charcoal border border-ash/40 pointer-events-none\"\n style={{transform: `translate(${LAYER_OFFSET}, ${LAYER_OFFSET})`}}\n aria-hidden=\"true\"\n />\n\n {/* Front card */}\n <div className=\"relative transition-transform duration-200 group-hover:-translate-y-0.5\">\n {renderFrontContent()}\n </div>\n\n {/* Count badge — square */}\n <div\n className=\"absolute -top-2 -right-2 z-10 min-w-6 h-6 px-1.5 flex items-center justify-center bg-gold text-obsidian text-xs font-bold\"\n style={badgePing ? {animation: 'badge-invert 0.6s ease-in-out'} : undefined}\n >\n {count}\n </div>\n </div>\n </div>\n </Card>\n </div>\n )\n }\n)\n\nArtifactGroup.displayName = 'ArtifactGroup'\n\nexport default ArtifactGroup\n","import React from 'react'\nimport {cx} from '../utils'\nimport {type Artifact} from './ArtifactCard'\nimport {type ArtifactNode} from './ArtifactNode'\nimport {ArtifactCard} from './ArtifactCard'\nimport {ArtifactGroup} from './ArtifactGroup'\nimport {Card} from './Card'\n\nexport interface ArtifactVariantStackProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * The VARIANT_SET node to display\n */\n node: ArtifactNode\n /**\n * Passed through to ArtifactCard children for expand/open behavior\n */\n onExpandArtifact?: (artifact: Artifact) => void\n /**\n * Passed through to ArtifactGroup children for navigation\n */\n onGroupClick?: (node: ArtifactNode) => void\n}\n\n/**\n * Renders a VARIANT_SET node as a Card with the set label as title.\n * Children are displayed in a horizontal row inside the card body.\n * Children handle their own click behavior (expand for artifacts,\n * navigate for groups).\n */\nexport const ArtifactVariantStack = React.forwardRef<HTMLDivElement, ArtifactVariantStackProps>(\n ({node, onExpandArtifact, onGroupClick, className, ...props}, ref) => {\n const children = node.children\n\n const renderChild = (child: ArtifactNode) => {\n if (child.type === 'ARTIFACT' && child.artifact) {\n return (\n <div key={child.id} className=\"flex-1 min-w-0\">\n <ArtifactCard\n artifact={child.artifact}\n onExpand={onExpandArtifact}\n className=\"w-full\"\n />\n </div>\n )\n }\n\n if (child.type === 'GROUP') {\n return (\n <div key={child.id} className=\"flex-1 min-w-0\">\n <ArtifactGroup node={child} onClick={onGroupClick}/>\n </div>\n )\n }\n\n // Nested variant set placeholder\n return (\n <div key={child.id} className=\"flex-1 min-w-0\">\n <div\n className=\"aspect-video bg-graphite border border-gold/30 flex flex-col items-center justify-center gap-2 p-4\">\n <span className=\"text-xs text-silver uppercase tracking-wider\">Variants</span>\n <span className=\"text-sm text-white font-semibold truncate max-w-full\">\n {child.label}\n </span>\n </div>\n </div>\n )\n }\n\n return (\n <Card\n ref={ref}\n noPadding\n className={cx('w-full p-5', className)}\n {...props}\n >\n <h3 className=\"text-lg font-semibold text-white m-0 mb-4\">{node.label}</h3>\n <div className=\"flex gap-3\">\n {children.map(renderChild)}\n </div>\n </Card>\n )\n }\n)\n\nArtifactVariantStack.displayName = 'ArtifactVariantStack'\n\nexport default ArtifactVariantStack\n","import {useCallback, useMemo, useState} from 'react'\nimport type {ArtifactNode} from '../../ArtifactNode'\n\n/**\n * A breadcrumb entry representing one level of navigation depth.\n */\nexport interface BreadcrumbEntry {\n /** Display label for this level */\n label: string\n /** The group node at this level (null for root) */\n node: ArtifactNode | null\n}\n\n/**\n * Return type for the useArtifactTreeNavigation hook.\n */\nexport interface UseArtifactTreeNavigationReturn {\n /** Nodes to display at the current navigation level */\n currentNodes: ArtifactNode[]\n /** Breadcrumb trail from root to current level */\n breadcrumbs: BreadcrumbEntry[]\n /** Whether the user is at the root level */\n isAtRoot: boolean\n /** Navigate into a group node, pushing it onto the stack */\n navigateInto: (node: ArtifactNode) => void\n /** Navigate to a specific breadcrumb level by index */\n navigateTo: (index: number) => void\n /** Navigate back one level */\n navigateBack: () => void\n}\n\n/**\n * Manages navigation state for an artifact tree panel.\n * Maintains a stack of group nodes the user has navigated into,\n * deriving children from the node references themselves.\n */\nexport function useArtifactTreeNavigation(rootNodes: ArtifactNode[]): UseArtifactTreeNavigationReturn {\n // Stack of group nodes the user has drilled into (empty = at root)\n const [stack, setStack] = useState<ArtifactNode[]>([])\n\n const currentNodes = useMemo(() => {\n if (stack.length === 0) return rootNodes\n return stack[stack.length - 1].children\n }, [rootNodes, stack])\n\n const breadcrumbs = useMemo<BreadcrumbEntry[]>(() => {\n const entries: BreadcrumbEntry[] = [{label: 'Project', node: null}]\n for (const node of stack) {\n entries.push({label: node.label, node})\n }\n return entries\n }, [stack])\n\n const isAtRoot = stack.length === 0\n\n const navigateInto = useCallback((node: ArtifactNode) => {\n setStack(prev => [...prev, node])\n }, [])\n\n const navigateTo = useCallback((index: number) => {\n // index 0 = root, so slice to 0 clears the stack\n setStack(prev => prev.slice(0, index))\n }, [])\n\n const navigateBack = useCallback(() => {\n setStack(prev => prev.slice(0, -1))\n }, [])\n\n return {\n currentNodes,\n breadcrumbs,\n isAtRoot,\n navigateInto,\n navigateTo,\n navigateBack,\n }\n}\n","import React, {useMemo} from 'react'\nimport {cx} from '../../utils'\nimport {CheckSquareIcon, CrossSquareIcon, EmptySquareIcon, SquareLoaderIcon,} from '../icons'\n\nexport const TASK_STATUSES = {\n PENDING: 'pending',\n IN_PROGRESS: 'in_progress',\n DONE: 'done',\n CANCELLED: 'cancelled',\n FAILED: 'failed',\n} as const\n\nexport type TaskStatus = typeof TASK_STATUSES[keyof typeof TASK_STATUSES]\n\nexport interface Task {\n /**\n * Unique identifier for the task\n */\n id: string\n /**\n * Task description text\n */\n label: string\n /**\n * Current status of the task\n */\n status: TaskStatus\n /**\n * Optional subtasks (shown when parent is in_progress or done)\n */\n subtasks?: Task[]\n}\n\nexport interface TodosListProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Array of tasks to display\n */\n tasks: Task[]\n /**\n * Title for the todos list\n * @default \"Tasks\"\n */\n title?: string\n}\n\n/**\n * Get the status icon for a task\n */\nfunction TaskIcon({status}: { status: TaskStatus }) {\n switch (status) {\n case 'done':\n return <CheckSquareIcon/>\n case 'in_progress':\n return <SquareLoaderIcon/>\n case 'cancelled':\n return <CrossSquareIcon variant=\"cancelled\"/>\n case 'failed':\n return <CrossSquareIcon variant=\"failed\"/>\n case 'pending':\n default:\n return <EmptySquareIcon/>\n }\n}\n\n/**\n * Sort tasks so cancelled and failed items appear at the bottom of their group.\n * This sorts in place within the local group, not globally.\n */\nfunction sortTasks(tasks: Task[]): Task[] {\n const normal: Task[] = []\n const bottomItems: Task[] = []\n\n for (const task of tasks) {\n if (task.status === 'cancelled' || task.status === 'failed') {\n bottomItems.push(task)\n } else {\n normal.push(task)\n }\n }\n\n return [...normal, ...bottomItems]\n}\n\n/**\n * Single task item component\n */\nfunction TaskItem({task, depth = 0}: { task: Task; depth?: number }) {\n const isTerminal = task.status === 'done' || task.status === 'cancelled' || task.status\n === 'failed'\n const isSubtle = task.status === 'cancelled' || task.status === 'failed'\n\n // Show subtasks when parent is in_progress or done (to keep showing after completion)\n const showSubtasks = (task.status === 'in_progress' || task.status === 'done') &&\n task.subtasks && task.subtasks.length > 0\n const sortedSubtasks = showSubtasks ? sortTasks(task.subtasks!) : []\n\n return (\n <div className=\"flex flex-col\">\n <div\n className={cx(\n 'flex items-center gap-2 py-1',\n depth > 0 && 'pl-6'\n )}\n >\n <TaskIcon status={task.status}/>\n <span\n className={cx(\n 'text-xs leading-tight transition-colors',\n isTerminal && 'line-through',\n isSubtle ? 'text-silver/50' : 'text-silver',\n task.status === 'in_progress' && 'text-white',\n task.status === 'done' && 'text-silver/70'\n )}\n >\n {task.label}\n {task.status === 'cancelled' && (\n <span className=\"text-silver/40 ml-1\">(cancelled)</span>\n )}\n {task.status === 'failed' && (\n <span className=\"text-error/60 ml-1\">(failed)</span>\n )}\n </span>\n </div>\n\n {/* Render subtasks when parent is in_progress or done */}\n {showSubtasks && (\n <div className=\"flex flex-col\">\n {sortedSubtasks.map((subtask) => (\n <TaskItem key={subtask.id} task={subtask} depth={depth + 1}/>\n ))}\n </div>\n )}\n </div>\n )\n}\n\n/**\n * TodosList displays a structured list of tasks with status indicators.\n *\n * Features:\n * - Nested tasks with indentation\n * - Status indicators: done (checkmark), in_progress (snake animation), pending (empty),\n * cancelled, failed\n * - Done tasks are crossed out with golden checkmark\n * - Cancelled/failed tasks are crossed out with subtle styling and sorted to bottom of their local\n * group\n * - Max 1/4 screen height with scroll\n * - Subtasks appear when parent task is in_progress or done\n *\n * The component automatically sorts cancelled/failed tasks to the bottom of their local group\n * (not globally), so just changing a task's status will reorder it appropriately.\n */\nexport const TodosList = React.forwardRef<HTMLDivElement, TodosListProps>(\n ({tasks, title = 'Tasks', className, ...rest}, ref) => {\n const sortedTasks = useMemo(() => sortTasks(tasks), [tasks])\n\n // Count completed tasks (recursively)\n const countCompleted = (taskList: Task[]): number => {\n let count = 0\n for (const task of taskList) {\n if (task.status === 'done') {\n count++\n }\n if (task.subtasks) {\n count += countCompleted(task.subtasks)\n }\n }\n return count\n }\n\n const countTotal = (taskList: Task[]): number => {\n let count = taskList.length\n for (const task of taskList) {\n if (task.subtasks) {\n count += countTotal(task.subtasks)\n }\n }\n return count\n }\n\n if (tasks.length === 0) {\n return null\n }\n\n return (\n <div\n ref={ref}\n className={cx(\n 'flex flex-col h-full',\n 'overflow-hidden',\n className\n )}\n {...rest}\n >\n {/* Header */}\n <div\n className=\"flex items-center justify-between px-4 py-2 border-b border-ash/40 flex-shrink-0\">\n <h4 className=\"text-xs font-medium text-white\">{title}</h4>\n <span className=\"text-xs text-silver/60\">\n {countCompleted(tasks)}/{countTotal(tasks)}\n </span>\n </div>\n\n {/* Tasks list */}\n <div className=\"flex-1 overflow-y-auto px-4 py-2\">\n {sortedTasks.map((task) => (\n <TaskItem key={task.id} task={task}/>\n ))}\n </div>\n </div>\n )\n }\n)\n\nTodosList.displayName = 'TodosList'\n\n/**\n * Returns true when every task (and subtask, recursively) is in a\n * terminal state: done, cancelled, or failed. Returns true for empty arrays.\n */\nexport function areAllTasksSettled(tasks: Task[]): boolean {\n return tasks.every(t => {\n const settled = t.status === 'done' || t.status === 'cancelled' || t.status === 'failed'\n if (!settled) return false\n if (t.subtasks && t.subtasks.length > 0) return areAllTasksSettled(t.subtasks)\n return true\n })\n}\n\nexport default TodosList\n","import React from 'react'\nimport {cx} from '../../utils'\n\n/**\n * Position group for a tool — combines vertical position (top/bottom)\n * with sidebar side (left/right).\n */\nexport type ToolGroup = 'top-left' | 'bottom-left' | 'top-right' | 'bottom-right'\n\n/**\n * Describes a tool that can be toggled from the sidebar.\n */\nexport interface ToolDefinition {\n /**\n * Unique identifier for this tool\n */\n id: string\n /**\n * Icon element shown in the sidebar button\n */\n icon: React.ReactNode\n /**\n * Accessible label for the button\n */\n label: string\n /**\n * Which group the tool belongs to — tools in the same group\n * are mutually exclusive (opening one closes the other).\n */\n group: ToolGroup\n}\n\n/**\n * Consumer-provided tool definition passed via ChatInterface's `tools` prop.\n * Defines a custom tool with its sidebar icon and the panel content to\n * render when the tool is opened.\n */\nexport interface ExternalToolDefinition {\n /**\n * Unique identifier for this tool\n */\n id: string\n /**\n * Icon element shown in the sidebar button\n */\n icon: React.ReactNode\n /**\n * Accessible label for the button\n */\n label: string\n /**\n * Which group the tool belongs to\n */\n group: ToolGroup\n /**\n * Content to render when the tool is open\n */\n content: React.ReactNode\n}\n\n/**\n * Tracks which tool is open in each group (null = none).\n */\nexport interface ToolPanelState {\n 'top-left': string | null\n 'bottom-left': string | null\n 'top-right': string | null\n 'bottom-right': string | null\n}\n\nexport interface ToolSidebarProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Available tool definitions\n */\n tools: ToolDefinition[]\n /**\n * Current state — which tool is open per group\n */\n activeTools: ToolPanelState\n /**\n * Called when a tool button is clicked (toggle)\n */\n onToggleTool: (toolId: string) => void\n /**\n * Which side this sidebar is on — controls border direction\n */\n side: 'left' | 'right'\n}\n\n/**\n * ToolSidebar renders a vertical strip of tool icon buttons on either\n * side of the chat interface. It follows the IntelliJ pattern:\n *\n * - Top-aligned group and bottom-aligned group separated by a divider\n * - Tools in the same group are mutually exclusive\n * - Clicking an active tool closes it; clicking an inactive tool opens it\n * - Constant slim width regardless of tool panel state\n * - Can be placed on left or right side via the `side` prop\n */\nexport const ToolSidebar = React.forwardRef<HTMLDivElement, ToolSidebarProps>(\n ({tools, activeTools, onToggleTool, side, className, ...rest}, ref) => {\n const topTools = tools.filter(t => t.group === `top-${side}`)\n const bottomTools = tools.filter(t => t.group === `bottom-${side}`)\n\n const isActive = (toolId: string) => {\n const tool = tools.find(t => t.id === toolId)\n if (!tool) return false\n return activeTools[tool.group] === toolId\n }\n\n const renderButton = (tool: ToolDefinition) => {\n const active = isActive(tool.id)\n return (\n <button\n key={tool.id}\n onClick={() => onToggleTool(tool.id)}\n className={cx(\n 'w-8 h-8 flex items-center justify-center transition-colors duration-150',\n active\n ? 'bg-gold/15 text-gold border border-gold/30'\n : 'text-silver hover:text-white hover:bg-ash/20'\n )}\n aria-label={tool.label}\n aria-pressed={active}\n >\n <span className=\"w-4 h-4 block\">\n {tool.icon}\n </span>\n </button>\n )\n }\n\n return (\n <div\n ref={ref}\n className={cx(\n 'h-full w-9 bg-charcoal/80 flex flex-col items-center shrink-0 py-2',\n side === 'left' ? 'border-r border-ash/40' : 'border-l border-ash/40',\n className\n )}\n {...rest}\n >\n {/* Top-aligned tools */}\n <div className=\"flex flex-col items-center gap-1\">\n {topTools.map(renderButton)}\n </div>\n\n {/* Spacer + separator */}\n <div className=\"flex-1 flex items-center justify-center\">\n <div className=\"w-5 border-t border-ash/30\"/>\n </div>\n\n {/* Bottom-aligned tools */}\n <div className=\"flex flex-col items-center gap-1\">\n {bottomTools.map(renderButton)}\n </div>\n </div>\n )\n }\n)\n\nToolSidebar.displayName = 'ToolSidebar'\n","import React, {useCallback, useEffect, useRef, useState} from 'react'\nimport {cx} from '../../utils'\n\nexport interface ToolPanelContainerProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Content for the top tool slot (from the top group).\n * When null, the bottom slot takes full height.\n */\n topContent: React.ReactNode | null\n /**\n * Content for the bottom tool slot (from the bottom group).\n * When null, the top slot takes full height.\n */\n bottomContent: React.ReactNode | null\n /**\n * Panel width as CSS value (e.g., \"50vw\")\n */\n width?: string\n /**\n * Callback to start horizontal resizing (width dragger)\n */\n onResizeStart?: (e: React.MouseEvent) => void\n /**\n * Which side this panel is on — controls border and resize handle position\n */\n side?: 'left' | 'right'\n}\n\n/**\n * ToolPanelContainer manages the layout of one or two tool panels\n * stacked vertically. When both top and bottom slots are filled, a\n * height-adjustable divider appears between them.\n *\n * It also renders the width-resize handle on its left edge, identical\n * to the previous ArtifactsPanel resize behavior.\n */\nexport const ToolPanelContainer = React.forwardRef<HTMLDivElement, ToolPanelContainerProps>(\n ({topContent, bottomContent, width, onResizeStart, side = 'right', className, ...rest}, ref) => {\n const [topPercent, setTopPercent] = useState(60)\n const [isResizingHeight, setIsResizingHeight] = useState(false)\n const containerRef = useRef<HTMLDivElement>(null)\n const lastY = useRef<number | null>(null)\n\n const hasBoth = topContent !== null && bottomContent !== null\n\n // Height dragger handlers\n const startHeightResize = useCallback((e: React.MouseEvent) => {\n e.preventDefault()\n setIsResizingHeight(true)\n lastY.current = e.clientY\n }, [])\n\n const stopHeightResize = useCallback(() => {\n setIsResizingHeight(false)\n lastY.current = null\n }, [])\n\n const resizeHeight = useCallback(\n (e: MouseEvent) => {\n if (!isResizingHeight || lastY.current === null || !containerRef.current) return\n\n const containerHeight = containerRef.current.getBoundingClientRect().height\n if (containerHeight === 0) return\n\n const deltaY = e.clientY - lastY.current\n const deltaPercent = (deltaY / containerHeight) * 100\n\n setTopPercent(prev => {\n const next = prev + deltaPercent\n return Math.min(Math.max(next, 20), 80)\n })\n\n lastY.current = e.clientY\n },\n [isResizingHeight]\n )\n\n useEffect(() => {\n if (isResizingHeight) {\n window.addEventListener('mousemove', resizeHeight)\n window.addEventListener('mouseup', stopHeightResize)\n document.body.style.cursor = 'row-resize'\n document.body.style.userSelect = 'none'\n } else {\n window.removeEventListener('mousemove', resizeHeight)\n window.removeEventListener('mouseup', stopHeightResize)\n document.body.style.cursor = ''\n document.body.style.userSelect = ''\n }\n\n return () => {\n window.removeEventListener('mousemove', resizeHeight)\n window.removeEventListener('mouseup', stopHeightResize)\n document.body.style.cursor = ''\n document.body.style.userSelect = ''\n }\n }, [isResizingHeight, resizeHeight, stopHeightResize])\n\n return (\n <div\n ref={(node) => {\n // Merge forwarded ref and internal ref\n (containerRef as React.MutableRefObject<HTMLDivElement | null>).current = node\n if (typeof ref === 'function') ref(node)\n else if (ref) (ref as React.MutableRefObject<HTMLDivElement | null>).current = node\n }}\n className={cx(\n 'h-full bg-charcoal/50 flex flex-col relative shrink-0',\n side === 'left' ? 'border-r border-ash/40' : 'border-l border-ash/40',\n className\n )}\n style={width ? {width} : undefined}\n {...rest}\n >\n {/* Width resize handle */}\n <div\n onMouseDown={onResizeStart}\n className={cx(\n 'absolute top-0 w-1 h-full cursor-col-resize z-50',\n 'hover:bg-gold/50 transition-colors',\n side === 'left'\n ? 'right-0 after:absolute after:inset-y-0 after:-right-1 after:w-2'\n : 'left-0 after:absolute after:inset-y-0 after:-left-1 after:w-2'\n )}\n />\n\n {/* Top slot */}\n {topContent !== null && (\n <div\n className=\"min-h-0 overflow-hidden flex flex-col\"\n style={hasBoth ? {height: `${topPercent}%`} : {flex: '1 1 0%'}}\n >\n {topContent}\n </div>\n )}\n\n {/* Height dragger — only when both slots are filled */}\n {hasBoth && (\n <div\n onMouseDown={startHeightResize}\n className={cx(\n 'h-1 cursor-row-resize z-50 shrink-0',\n 'bg-ash/40 hover:bg-gold/50 transition-colors',\n 'relative',\n 'after:absolute after:-top-1 after:left-0 after:right-0 after:h-3'\n )}\n />\n )}\n\n {/* Bottom slot */}\n {bottomContent !== null && (\n <div\n className=\"min-h-0 overflow-hidden flex flex-col\"\n style={hasBoth ? {height: `${100 - topPercent}%`} : {flex: '1 1 0%'}}\n >\n {bottomContent}\n </div>\n )}\n </div>\n )\n }\n)\n\nToolPanelContainer.displayName = 'ToolPanelContainer'\n","import {useCallback, useEffect, useRef, useState} from 'react'\n\ninterface UseResizableProps {\n /**\n * Initial width as percentage of viewport (0-100)\n */\n initialWidthPercent: number\n /**\n * Minimum width as percentage of viewport (0-100)\n */\n minWidthPercent: number\n /**\n * Maximum width as percentage of viewport (0-100)\n */\n maxWidthPercent: number\n /**\n * Direction to resize from\n */\n direction: 'left' | 'right'\n}\n\n/**\n * Hook for resizable panels with percentage-based widths.\n * Returns width as a CSS percentage string (e.g., \"50%\").\n */\nexport function useResizable({\n initialWidthPercent,\n minWidthPercent,\n maxWidthPercent,\n direction,\n}: UseResizableProps) {\n const [widthPercent, setWidthPercent] = useState(initialWidthPercent)\n const [isResizing, setIsResizing] = useState(false)\n const lastX = useRef<number | null>(null)\n\n const startResizing = useCallback((e: React.MouseEvent) => {\n e.preventDefault()\n setIsResizing(true)\n lastX.current = e.clientX\n }, [])\n\n const stopResizing = useCallback(() => {\n setIsResizing(false)\n lastX.current = null\n }, [])\n\n const resize = useCallback(\n (e: MouseEvent) => {\n if (!isResizing || lastX.current === null) {\n return\n }\n\n const deltaX = e.clientX - lastX.current\n const factor = direction === 'right' ? 1 : -1\n // Convert pixel delta to percentage of viewport\n const deltaPercent = (deltaX / window.innerWidth) * 100\n\n setWidthPercent((prevPercent) => {\n const newPercent = prevPercent + deltaPercent * factor\n return Math.min(Math.max(newPercent, minWidthPercent), maxWidthPercent)\n })\n\n lastX.current = e.clientX\n },\n [isResizing, direction, minWidthPercent, maxWidthPercent]\n )\n\n useEffect(() => {\n if (isResizing) {\n window.addEventListener('mousemove', resize)\n window.addEventListener('mouseup', stopResizing)\n document.body.style.cursor = 'col-resize'\n document.body.style.userSelect = 'none'\n } else {\n window.removeEventListener('mousemove', resize)\n window.removeEventListener('mouseup', stopResizing)\n document.body.style.cursor = ''\n document.body.style.userSelect = ''\n }\n\n return () => {\n window.removeEventListener('mousemove', resize)\n window.removeEventListener('mouseup', stopResizing)\n document.body.style.cursor = ''\n document.body.style.userSelect = ''\n }\n }, [isResizing, resize, stopResizing])\n\n // Return width as CSS percentage string\n const width = `${widthPercent}vw`\n\n return {width, widthPercent, isResizing, startResizing}\n}\n","import React, {useCallback, useState} from 'react'\nimport {cx} from '../../utils/cx'\nimport {Check, Copy, Pencil, RotateCcw, Send, X,} from 'lucide-react'\n\nexport type MessageActionsVariant = 'user' | 'assistant'\n\nexport interface MessageActionsProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Whether this is for a user or assistant message\n */\n variant: MessageActionsVariant\n /**\n * The message content for copy functionality\n */\n content: string\n /**\n * Called when user wants to edit their message\n * Consumer should handle creating a branch with the edited content\n */\n onEdit?: (newContent: string) => void\n /**\n * Called when user wants to retry/regenerate the assistant response\n * Consumer should handle creating a branch with a new response\n */\n onRetry?: () => void\n /**\n * Whether the message is currently being edited\n */\n isEditing?: boolean\n /**\n * Callback to set editing state (controlled from parent)\n */\n onEditingChange?: (isEditing: boolean) => void\n /**\n * Initial content for the edit input (defaults to content prop)\n */\n editValue?: string\n}\n\nconst ActionButton: React.FC<{\n onClick: () => void\n label: string\n children: React.ReactNode\n className?: string\n disabled?: boolean\n}> = ({onClick, label, children, className, disabled}) => (\n <button\n type=\"button\"\n onClick={onClick}\n disabled={disabled}\n className={cx(\n 'p-1.5 text-silver/60 hover:text-silver transition-colors duration-150',\n 'hover:bg-white/5 ',\n 'disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:bg-transparent',\n className\n )}\n aria-label={label}\n >\n {children}\n </button>\n)\n\nexport const MessageActions = React.forwardRef<HTMLDivElement, MessageActionsProps>(\n (\n {\n variant,\n content,\n onEdit,\n onRetry,\n isEditing: controlledIsEditing,\n onEditingChange,\n editValue: controlledEditValue,\n className,\n ...rest\n },\n ref\n ) => {\n // Local state for uncontrolled mode\n const [localIsEditing, setLocalIsEditing] = useState(false)\n const [localEditValue, setLocalEditValue] = useState(content)\n const [copied, setCopied] = useState(false)\n\n // Determine if controlled or uncontrolled\n const isEditing = controlledIsEditing ?? localIsEditing\n const editValue = controlledEditValue ?? localEditValue\n\n const setIsEditing = useCallback(\n (value: boolean) => {\n if (onEditingChange) {\n onEditingChange(value)\n } else {\n setLocalIsEditing(value)\n }\n },\n [onEditingChange]\n )\n\n const setEditValue = useCallback((value: string) => {\n setLocalEditValue(value)\n }, [])\n\n const handleCopy = useCallback(async () => {\n try {\n await navigator.clipboard.writeText(content)\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n } catch {\n // Fallback for older browsers\n const textArea = document.createElement('textarea')\n textArea.value = content\n document.body.appendChild(textArea)\n textArea.select()\n document.execCommand('copy')\n document.body.removeChild(textArea)\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n }\n }, [content])\n\n const handleStartEdit = useCallback(() => {\n setLocalEditValue(content)\n setIsEditing(true)\n }, [content, setIsEditing])\n\n const handleCancelEdit = useCallback(() => {\n setIsEditing(false)\n setLocalEditValue(content)\n }, [content, setIsEditing])\n\n const handleSubmitEdit = useCallback(() => {\n const trimmed = editValue.trim()\n if (trimmed && trimmed !== content) {\n onEdit?.(trimmed)\n }\n setIsEditing(false)\n }, [editValue, content, onEdit, setIsEditing])\n\n const handleEditKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n handleSubmitEdit()\n } else if (e.key === 'Escape') {\n handleCancelEdit()\n }\n },\n [handleSubmitEdit, handleCancelEdit]\n )\n\n const isUser = variant === 'user'\n\n // Render edit mode inline\n if (isUser && isEditing) {\n return (\n <div\n ref={ref}\n className={cx('mt-2', className)}\n {...rest}\n >\n <div\n className=\"relative bg-charcoal border border-ash/60 focus-within:border-gold/60 focus-within:ring-1 focus-within:ring-gold/20\">\n <textarea\n value={editValue}\n onChange={(e) => setEditValue(e.target.value)}\n onKeyDown={handleEditKeyDown}\n className=\"w-full bg-transparent text-white px-3 py-2 pr-20 resize-none outline-none min-h-16 text-sm\"\n autoFocus\n rows={2}\n />\n <div className=\"absolute right-2 bottom-2 flex gap-1\">\n <ActionButton\n onClick={handleCancelEdit}\n label=\"Cancel edit\"\n className=\"text-silver/60 hover:text-error\"\n >\n <X className=\"w-4 h-4\"/>\n </ActionButton>\n <ActionButton\n onClick={handleSubmitEdit}\n label=\"Submit edit\"\n className=\"text-silver/60 hover:text-gold\"\n disabled={!editValue.trim() || editValue.trim() === content}\n >\n <Send className=\"w-4 h-4\"/>\n </ActionButton>\n </div>\n </div>\n <p className=\"text-xs text-silver/50 mt-1\">\n Press Enter to submit, Esc to cancel. This will create a new branch.\n </p>\n </div>\n )\n }\n\n return (\n <div\n ref={ref}\n className={cx(\n 'flex items-center gap-0.5 mt-1',\n isUser ? 'justify-end' : 'justify-start',\n className\n )}\n {...rest}\n >\n {/* Copy - available for both user and assistant */}\n <ActionButton onClick={handleCopy} label={copied ? 'Copied!' : 'Copy message'}>\n {copied ? (\n <Check className=\"w-3.5 h-3.5 text-success\"/>\n ) : (\n <Copy className=\"w-3.5 h-3.5\"/>\n )}\n </ActionButton>\n\n {/* Edit - only for user messages */}\n {isUser && onEdit && (\n <ActionButton onClick={handleStartEdit} label=\"Edit message\">\n <Pencil className=\"w-3.5 h-3.5\"/>\n </ActionButton>\n )}\n\n {/* Retry - only for assistant messages */}\n {!isUser && onRetry && (\n <ActionButton onClick={onRetry} label=\"Regenerate response\">\n <RotateCcw className=\"w-3.5 h-3.5\"/>\n </ActionButton>\n )}\n </div>\n )\n }\n)\n\nMessageActions.displayName = 'MessageActions'\n\nexport default MessageActions\n","import React from 'react'\nimport {cx} from '../../utils/cx'\nimport {ChevronLeft, ChevronRight, GitBranch} from 'lucide-react'\n\nexport interface BranchNavigatorProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Current branch index (1-based for display)\n */\n current: number\n /**\n * Total number of sibling branches\n */\n total: number\n /**\n * Called when navigating to previous branch\n */\n onPrevious?: () => void\n /**\n * Called when navigating to next branch\n */\n onNext?: () => void\n /**\n * Size variant\n */\n size?: 'sm' | 'md'\n /**\n * Whether to show the branch icon\n */\n showIcon?: boolean\n}\n\n/**\n * BranchNavigator provides a UI for switching between conversation branches.\n * Used in the Message component to navigate sibling branches (e.g., \"1/3\").\n */\nexport const BranchNavigator = React.forwardRef<HTMLDivElement, BranchNavigatorProps>(\n (\n {\n current,\n total,\n onPrevious,\n onNext,\n size = 'sm',\n showIcon = true,\n className,\n ...rest\n },\n ref\n ) => {\n // Don't render if there's only one branch\n if (total <= 1) {\n return null\n }\n\n const isFirst = current <= 1\n const isLast = current >= total\n\n const buttonSize = size === 'sm' ? 'p-0.5' : 'p-1'\n const iconSize = size === 'sm' ? 'w-3 h-3' : 'w-4 h-4'\n const textSize = size === 'sm' ? 'text-xs' : 'text-sm'\n\n return (\n <div\n ref={ref}\n className={cx(\n 'inline-flex items-center gap-0.5 text-silver/70',\n className\n )}\n role=\"navigation\"\n aria-label=\"Branch navigation\"\n {...rest}\n >\n {/* Branch icon */}\n {showIcon && (\n <GitBranch className={cx(iconSize, 'mr-0.5 text-silver/50')} aria-hidden=\"true\"/>\n )}\n\n {/* Previous button */}\n <button\n type=\"button\"\n onClick={onPrevious}\n disabled={isFirst}\n className={cx(\n buttonSize,\n 'hover:text-white hover:bg-white/10 transition-colors',\n 'disabled:opacity-30 disabled:cursor-not-allowed disabled:hover:bg-transparent disabled:hover:text-silver/70'\n )}\n aria-label=\"Previous branch\"\n >\n <ChevronLeft className={iconSize}/>\n </button>\n\n {/* Counter */}\n <span className={cx(textSize, 'tabular-nums min-w-6 text-center')}>\n {current}/{total}\n </span>\n\n {/* Next button */}\n <button\n type=\"button\"\n onClick={onNext}\n disabled={isLast}\n className={cx(\n buttonSize,\n 'hover:text-white hover:bg-white/10 transition-colors',\n 'disabled:opacity-30 disabled:cursor-not-allowed disabled:hover:bg-transparent disabled:hover:text-silver/70'\n )}\n aria-label=\"Next branch\"\n >\n <ChevronRight className={iconSize}/>\n </button>\n </div>\n )\n }\n)\n\nBranchNavigator.displayName = 'BranchNavigator'\n\nexport default BranchNavigator\n","import React from 'react'\nimport {cx} from '../utils/cx'\n\nexport type BrandIconSize = 'sm' | 'md' | 'lg'\nexport type BrandIconVariant = 'solid' | 'outline'\n\nexport interface BrandIconProps extends React.HTMLAttributes<HTMLDivElement> {\n size?: BrandIconSize\n variant?: BrandIconVariant\n}\n\nconst sizeMap: Record<BrandIconSize, string> = {\n sm: 'h-8 w-8 text-sm',\n md: 'h-12 w-12 text-base',\n lg: 'h-16 w-16 text-lg',\n}\n\nexport const BrandIcon = React.forwardRef<HTMLDivElement, BrandIconProps>(\n ({size = 'md', variant = 'solid', children, className, ...rest}, ref) => {\n const variantClasses =\n variant === 'solid'\n ? 'bg-gold text-obsidian border-2 border-gold'\n : 'bg-transparent text-gold border-2 border-gold'\n\n return (\n <div\n ref={ref}\n className={cx(\n 'inline-flex items-center justify-center rounded-none font-bold select-none overflow-hidden',\n sizeMap[size],\n variantClasses,\n className\n )}\n {...rest}\n >\n {children}\n </div>\n )\n }\n)\n\nBrandIcon.displayName = 'BrandIcon'\n\nexport default BrandIcon\n","import React from 'react'\nimport {cx} from '../utils/cx'\n\nexport interface ColorSwatchProps extends React.HTMLAttributes<HTMLDivElement> {\n color: string\n label?: string\n}\n\nexport const ColorSwatch = React.forwardRef<HTMLDivElement, ColorSwatchProps>(\n ({color, label, className, ...rest}, ref) => {\n return (\n <div\n ref={ref}\n className={cx('flex flex-col items-center gap-2', className)}\n {...rest}\n >\n <div\n className=\"h-16 w-16 border-2 border-ash rounded-none shadow-sm\"\n style={{backgroundColor: color}}\n aria-label={label || color}\n />\n {label && (\n <span className=\"text-xs text-silver font-medium\">{label}</span>\n )}\n </div>\n )\n }\n)\n\nColorSwatch.displayName = 'ColorSwatch'\n\nexport default ColorSwatch\n","import React from 'react'\nimport {cx} from '../utils/cx'\n\nexport type SectionHeadingLevel = 'h2' | 'h3'\n\nexport interface SectionHeadingProps extends React.HTMLAttributes<HTMLHeadingElement> {\n level?: SectionHeadingLevel\n}\n\nconst levelStyles = {\n h2: 'text-2xl mb-4',\n h3: 'text-xl mb-3',\n}\n\nexport const SectionHeading = React.forwardRef<HTMLHeadingElement, SectionHeadingProps>(\n ({level = 'h2', children, className, ...rest}, ref) => {\n const Component = level\n\n return (\n <Component\n ref={ref as any}\n className={cx(\n 'text-gold font-semibold tracking-tight',\n levelStyles[level],\n className\n )}\n {...rest}\n >\n {children}\n </Component>\n )\n }\n)\n\nSectionHeading.displayName = 'SectionHeading'\n\nexport default SectionHeading\n","import {type Artifact} from './ArtifactCard'\n\n/**\n * Node types in the artifact tree\n */\nexport const NODE_TYPES = {\n ARTIFACT: 'ARTIFACT',\n GROUP: 'GROUP',\n VARIANT_SET: 'VARIANT_SET',\n} as const\n\nexport type NodeType = typeof NODE_TYPES[keyof typeof NODE_TYPES]\n\n/**\n * A node in the artifact tree. Mirrors the backend ArtifactNode shape.\n * Groups and variant sets contain children; artifact nodes link to content.\n */\nexport interface ArtifactNode {\n /**\n * Unique identifier\n */\n id: string\n /**\n * The node type — ARTIFACT, GROUP, or VARIANT_SET\n */\n type: NodeType\n /**\n * Semantic name (e.g. \"storyboard\", \"protagonist_warm\")\n */\n name: string\n /**\n * Display label (e.g. \"Storyboard\", \"Warm Analog\")\n */\n label: string\n /**\n * For ARTIFACT nodes — the actual content. Null for GROUP and VARIANT_SET.\n */\n artifact?: Artifact\n /**\n * Child nodes (populated for GROUP and VARIANT_SET)\n */\n children: ArtifactNode[]\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,mBAAkB;;;ACAlB,4BAAsB;AACtB,kBAAoC;AAM7B,SAAS,MAAM,QAAsB;AAC1C,aAAO,mCAAQ,kBAAK,MAAM,CAAC;AAC7B;;;ADWO,IAAM,SAAS,aAAAA,QAAM;AAAA,EACxB,CAAC,EAAC,UAAU,WAAW,OAAO,MAAM,UAAU,OAAO,WAAW,UAAU,UAAU,GAAG,KAAI,GACvF,QAAQ;AACV,UAAM,aAAa,YAAY;AAG/B,UAAM,OACF;AAMJ,UAAM,iBAAiB;AAAA,MACrB,SACI;AAAA,MAMJ,WACI;AAAA,MAMJ,UACI;AAAA,MAMJ,UACI;AAAA,MAMJ,UACI;AAAA,MAOJ,OACI;AAAA,MAMJ,QACI;AAAA,IAKN;AAGA,UAAM,cAAc;AAAA,MAClB,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,IACN;AAEA,UAAM,eAAe,eAAe,OAAO;AAC3C,UAAM,YAAY,YAAY,IAAI;AAElC,WACI,6BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,WAAW,GAAG,MAAM,cAAc,WAAW,WAAW,cAAc,SAAS;AAAA,QAC/E,UAAU;AAAA,QACT,GAAG;AAAA;AAAA,MAEL,WACG,6BAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACG,WAAU;AAAA,UACV,eAAW;AAAA;AAAA,MACf;AAAA,MAEH;AAAA,IACH;AAAA,EAEN;AACJ;AAEA,OAAO,cAAc;;;AEnHrB,IAAAC,gBAAkB;AASX,IAAM,QAAQ,cAAAC,QAAM;AAAA,EACvB,CAAC,EAAC,QAAQ,OAAO,WAAW,aAAa,cAAc,UAAU,GAAG,KAAI,GAAG,QAAQ;AACjF,UAAM,OACF;AAMJ,UAAM,WAAW,QAAQ,qDAAqD;AAE9E,WACI,8BAAAA,QAAA,cAAC,SAAI,WAAW,GAAG,YAAY,YAAY,YAAY,KACpD,eACG,8BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG,WAAU;AAAA;AAAA,MACjB;AAAA,IACH,GAEE,8BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,WAAW;AAAA,UACP;AAAA,UACA;AAAA,UACA,cAAc,SAAS;AAAA,UACvB,eAAe,SAAS;AAAA,UACxB;AAAA,QACJ;AAAA,QACA;AAAA,QACC,GAAG;AAAA;AAAA,IACR,GACC,gBACG,8BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG,WAAU;AAAA;AAAA,MACjB;AAAA,IACH,CAEA;AAAA,EAEN;AACJ;AAEA,MAAM,cAAc;;;ACnDpB,IAAAC,gBAA+C;AAC/C,0BAAoB;;;ACDpB,IAAAC,gBAAkB;AAMX,IAAM,WAAW,cAAAC,QAAM;AAAA,EAC1B,CAAC,EAAC,WAAW,GAAG,KAAI,GAAG,QAAQ;AAC7B,WACI,8BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,WAAW,GAAG,wBAAwB,SAAS;AAAA,QAC9C,GAAG;AAAA;AAAA,IACR;AAAA,EAEN;AACJ;AAEA,SAAS,cAAc;;;ADIvB,IAAM,kBAAc,6BAAgC,EAAC,SAAS,OAAS,CAAC;AAExE,IAAM,iBAAiB,UAAM,0BAAW,WAAW;AAE5C,SAAS,YACZ,SACA,MACO;AACT,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AACA,MAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,UAAM,CAAC,SAAS,KAAK,IAAI;AACzB,WAAO,CAAC,CAAE,QAAgB,OAAO,IAAI,KAAK;AAAA,EAC5C;AACA,SAAO,CAAC,CAAE,QAAgB,IAAI;AAChC;AAUA,IAAM,iBAA8C;AAAA,EAClD,SAAS;AAAA,EACT,UAAU;AAAA,EACV,UAAU;AAAA,EACV,OAAO;AAAA,EACP,UAAU;AACZ;AAEA,IAAM,WAAW,cAAAC,QAAM;AAAA,EACnB,CACI;AAAA,IACE,UAAU;AAAA,IACV,cAAc;AAAA,IACd,WAAW;AAAA,IACX,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACC;AACH,WACI,8BAAAA,QAAA,cAAC,YAAY,UAAZ,EAAqB,OAAO,EAAC,QAAO,KACnC,8BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,WAAW;AAAA,UACP;AAAA,UACA,CAAC,aAAa;AAAA,UACd,eAAe,OAAO;AAAA,UACtB,eACA;AAAA,UACA,YAAY;AAAA,UACZ;AAAA,QACJ;AAAA,QACC,GAAG;AAAA;AAAA,MAEL;AAAA,MACA,YACG,8BAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACG,WAAU;AAAA;AAAA,QACZ,8BAAAA,QAAA,cAAC,6BAAM,WAAU,WAAS;AAAA,MAC5B;AAAA,IAEN,CACF;AAAA,EAEN;AACJ;AAEA,SAAS,cAAc;AASvB,IAAM,aAAa,cAAAA,QAAM;AAAA,EACrB,CAAC,EAAC,OAAO,UAAU,QAAQ,WAAW,UAAU,GAAG,MAAK,GAAG,QAAQ;AACjE,UAAM,EAAC,QAAO,IAAI,eAAe;AACjC,UAAM,iBAAiB,YAAY,SAAS,CAAC,UAAU,OAAO,CAAC;AAC/D,UAAM,oBAAoB,YAAY,SAAS,CAAC,UAAU,UAAU,CAAC;AACrE,UAAM,kBAAkB,YAAY,SAAS,CAAC,UAAU,QAAQ,CAAC;AAEjE,UAAM,aAAa,SAAS,YAAY,UAAU;AAElD,QAAI,CAAC,cAAc,CAAC,kBAAkB,CAAC,qBAAqB,CAAC,iBAAiB;AAC5E,aAAO;AAAA,IACT;AAEA,WACI,8BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,WAAW,GAAG,iCAAiC,SAAS;AAAA,QACvD,GAAG;AAAA;AAAA,MAEJ,SAAS,YAAY,UAAU,kBAAkB,qBAAqB,kBAEhE,8BAAAA,QAAA,cAAC,SAAI,WAAU,4CACb,8BAAAA,QAAA,cAAC,SAAI,WAAU,oBACZ,QACG,8BAAAA,QAAA,cAAC,QAAG,WAAU,0CAAwC,KAAM,IAC5D,iBACA,8BAAAA,QAAA,cAAC,YAAS,WAAU,kBAAgB,IACpC,MACH,WACG,8BAAAA,QAAA,cAAC,OAAE,WAAU,kCAAgC,QAAS,IACtD,oBACA,8BAAAA,QAAA,cAAC,YAAS,WAAU,kBAAgB,IACpC,IACN,GACC,SACG,8BAAAA,QAAA,cAAC,SAAI,WAAU,cAAY,MAAO,IAClC,kBACA,8BAAAA,QAAA,cAAC,YAAS,WAAU,oBAAkB,IACtC,IACN,IAEA;AAAA,IAEV;AAAA,EAEN;AACJ;AAEA,WAAW,cAAc;AAMzB,IAAM,WAAW,cAAAA,QAAM;AAAA,EACnB,CAAC,EAAC,WAAW,UAAU,GAAG,MAAK,GAAG,QAAQ;AACxC,UAAM,EAAC,QAAO,IAAI,eAAe;AACjC,UAAM,gBAAgB,YAAY,SAAS,MAAM;AAEjD,QAAI,CAAC,YAAY,CAAC,eAAe;AAC/B,aAAO;AAAA,IACT;AAEA,WACI,8BAAAA,QAAA,cAAC,SAAI,KAAU,WAAW,GAAG,aAAa,SAAS,GAAI,GAAG,SACvD,gBACG,8BAAAA,QAAA,cAAC,SAAI,WAAU,eACb,8BAAAA,QAAA,cAAC,YAAS,WAAU,cAAY,GAChC,8BAAAA,QAAA,cAAC,YAAS,WAAU,cAAY,GAChC,8BAAAA,QAAA,cAAC,YAAS,WAAU,aAAW,CACjC,IAEA,QAEN;AAAA,EAEN;AACJ;AAEA,SAAS,cAAc;AAOvB,IAAM,aAAa,cAAAA,QAAM;AAAA,EACrB,CAAC,EAAC,QAAQ,OAAO,WAAW,UAAU,GAAG,MAAK,GAAG,QAAQ;AACvD,UAAM,aAAa;AAAA,MACjB,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,KAAK;AAAA,MACL,SAAS;AAAA,IACX,EAAE,KAAK;AAEP,WACI,8BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,WAAW;AAAA,UACP;AAAA,UACA;AAAA,UACA;AAAA,QACJ;AAAA,QACC,GAAG;AAAA;AAAA,MAEL;AAAA,IACH;AAAA,EAEN;AACJ;AAEA,WAAW,cAAc;AAQzB,IAAM,YAAY,cAAAA,QAAM;AAAA,EACpB,CAAC;AAAA,IACC;AAAA,IACA,WAAW;AAAA,IACX;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,GAAG,QAAQ;AACT,UAAM,EAAC,QAAO,IAAI,eAAe;AACjC,UAAM,iBAAiB,YAAY,SAAS,OAAO;AACnD,UAAM,cAAc,UAAU,WAAW,SAAS;AAAA,MAChD,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,MAAM;AAAA,IACR,EAAE,MAAM,IAAI;AAEZ,QAAI,CAAC,YAAY,CAAC,gBAAgB;AAChC,aAAO;AAAA,IACT;AAEA,WACI,8BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,WAAW;AAAA,UACP;AAAA,UACA;AAAA,UACA,aAAa,SAAS;AAAA,UACtB,aAAa,YAAY;AAAA,UACzB;AAAA,QACJ;AAAA,QACC,GAAG;AAAA;AAAA,MAEL,iBACG,8BAAAA,QAAA,cAAC,YAAS,WAAU,iBAAe,IAEnC;AAAA,IAEN;AAAA,EAEN;AACJ;AAEA,UAAU,cAAc;AAGjB,IAAM,OAAO,OAAO,OAAO,UAAU;AAAA,EAC1C,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,OAAO;AACT,CAAC;;;AEpRD,IAAAC,gBAAkB;AASlB,IAAM,eAA8C;AAAA,EAClD,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,YAAY;AACd;AAEO,IAAM,YAAY,cAAAC,QAAM;AAAA,EAC3B,CAAC,EAAC,OAAO,cAAc,WAAW,UAAU,GAAG,MAAK,GAAG,QAAQ;AAC7D,WACI,8BAAAA,QAAA,cAAC,SAAI,KAAU,WAAW,GAAG,aAAa,IAAI,GAAG,SAAS,GAAI,GAAG,SAC9D,QACH;AAAA,EAEN;AACJ;AAEA,UAAU,cAAc;;;AC5BxB,IAAAC,gBAAkB;AAelB,IAAM,cAA0C;AAAA,EAC9C,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,QAAQ;AACV;AAEA,IAAM,YAAsC;AAAA,EAC1C,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,SAAS;AAAA,EACT,UAAU;AACZ;AAEA,IAAM,UAAqC;AAAA,EACzC,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,IAAI;AAAA,EACJ,IAAI;AACN;AAEA,IAAM,YAAuC;AAAA,EAC3C,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,IAAI;AAAA,EACJ,IAAI;AACN;AAEA,IAAM,YAAuC;AAAA,EAC3C,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,IAAI;AAAA,EACJ,IAAI;AACN;AAEO,IAAM,MAAM,cAAAC,QAAM;AAAA,EACrB,CAAC,EAAC,SAAS,GAAG,SAAS,SAAS,SAAS,OAAO,WAAW,UAAU,GAAG,MAAK,GAAG,QAAQ;AAEtF,UAAM,WAAW,YAAY,UAAa,YAAY,SAAY,QAAQ,MAAM,IAAI;AACpF,UAAM,YAAY,YAAY,SAAY,UAAU,OAAO,IAAI;AAC/D,UAAM,YAAY,YAAY,SAAY,UAAU,OAAO,IAAI;AAE/D,WACI,8BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,WAAW;AAAA,UACP;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,WAAW,YAAY,OAAO;AAAA,UAC9B,SAAS,UAAU,KAAK;AAAA,UACxB;AAAA,QACJ;AAAA,QACC,GAAG;AAAA;AAAA,MAEL;AAAA,IACH;AAAA,EAEN;AACJ;AAEA,IAAI,cAAc;;;AClGlB,IAAAC,gBAAkB;AAwBlB,IAAM,iBAA8D;AAAA,EAClE,MAAM;AAAA,IACJ,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAAA,EACA,IAAI;AAAA,IACF,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAAA,EACA,IAAI;AAAA,IACF,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAAA,EACA,IAAI;AAAA,IACF,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAAA,EACA,IAAI;AAAA,IACF,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAAA,EACA,OAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AACF;AAEA,IAAM,mBAAkE;AAAA,EACtE,MAAM;AAAA,IACJ,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,IAAI;AAAA,IACJ,IAAI;AAAA,EACN;AAAA,EACA,IAAI;AAAA,IACF,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,IAAI;AAAA,IACJ,IAAI;AAAA,EACN;AAAA,EACA,IAAI;AAAA,IACF,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,IAAI;AAAA,IACJ,IAAI;AAAA,EACN;AAAA,EACA,IAAI;AAAA,IACF,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,IAAI;AAAA,IACJ,IAAI;AAAA,EACN;AAAA,EACA,IAAI;AAAA,IACF,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,IAAI;AAAA,IACJ,IAAI;AAAA,EACN;AAAA,EACA,OAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,IAAI;AAAA,IACJ,IAAI;AAAA,EACN;AACF;AAEA,IAAM,kBAAgE;AAAA,EACpE,MAAM;AAAA,IACJ,OAAO;AAAA,IACP,MAAM;AAAA,IACN,MAAM;AAAA,IACN,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,EACN;AAAA,EACA,IAAI;AAAA,IACF,OAAO;AAAA,IACP,MAAM;AAAA,IACN,MAAM;AAAA,IACN,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,EACN;AAAA,EACA,IAAI;AAAA,IACF,OAAO;AAAA,IACP,MAAM;AAAA,IACN,MAAM;AAAA,IACN,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,EACN;AAAA,EACA,IAAI;AAAA,IACF,OAAO;AAAA,IACP,MAAM;AAAA,IACN,MAAM;AAAA,IACN,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,EACN;AAAA,EACA,IAAI;AAAA,IACF,OAAO;AAAA,IACP,MAAM;AAAA,IACN,MAAM;AAAA,IACN,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,EACN;AAAA,EACA,OAAO;AAAA,IACL,OAAO;AAAA,IACP,MAAM;AAAA,IACN,MAAM;AAAA,IACN,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,EACN;AACF;AAEA,SAAS,kBAAqB,OAA4D;AACxF,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,uBACL,OACA,UACQ;AACV,MAAI,UAAU,QAAW;AACvB,WAAO,CAAC;AAAA,EACV;AAEA,MAAI,CAAC,kBAAkB,KAAK,GAAG;AAC7B,UAAM,MAAM,SAAS,KAAK,KAAK;AAC/B,WAAO,MAAM,CAAC,GAAG,IAAI,CAAC;AAAA,EACxB;AAEA,QAAM,UAAoB,CAAC;AAC3B,aAAW,CAAC,YAAY,GAAG,KAAK,OAAO,QAAQ,KAAK,GAAwB;AAC1E,QAAI,QAAQ,QAAW;AACrB,YAAM,MAAM,SAAS,UAAU,IAAI,GAAG;AACtC,UAAI,KAAK;AACP,gBAAQ,KAAK,GAAG;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEO,IAAM,MAAM,cAAAC,QAAM;AAAA,EACrB,CAAC,EAAC,MAAM,QAAQ,OAAO,WAAW,UAAU,GAAG,MAAK,GAAG,QAAQ;AAC7D,UAAM,cAAc,uBAAuB,MAAM,cAAc;AAC/D,UAAM,gBAAgB,uBAAuB,QAAQ,gBAAgB;AACrE,UAAM,eAAe,uBAAuB,OAAO,eAAe;AAGlE,UAAM,UAAU,SAAS;AACzB,UAAM,cAAc,UAAU,KAAK;AAEnC,WACI,8BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,WAAW;AAAA,UACP;AAAA,UACA,GAAG;AAAA,UACH,GAAG;AAAA,UACH,GAAG;AAAA,UACH;AAAA,QACJ;AAAA,QACC,GAAG;AAAA;AAAA,MAEL;AAAA,IACH;AAAA,EAEN;AACJ;AAEA,IAAI,cAAc;;;ACpXlB,IAAAC,gBAAkB;AAiBlB,IAAMC,aAAwC;AAAA,EAC5C,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,SAAS;AAAA,EACT,UAAU;AACZ;AAEA,IAAMC,eAA4C;AAAA,EAChD,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,QAAQ;AACV;AAEA,IAAMC,WAAoC;AAAA,EACxC,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,IAAI;AAAA,EACJ,IAAI;AACN;AAEO,IAAM,QAAQ,cAAAC,QAAM;AAAA,EACvB,CACI;AAAA,IACE,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN,OAAO;AAAA,IACP,IAAI,YAAY;AAAA,IAChB;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACC;AACH,WACI,8BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,WAAW;AAAA,UACP;AAAA,UACA,cAAc,eAAe,aAAa;AAAA,UAC1C,SAASH,WAAU,KAAK;AAAA,UACxB,WAAWC,aAAY,OAAO;AAAA,UAC9BC,SAAQ,GAAG;AAAA,UACX,QAAQ;AAAA,UACR;AAAA,QACJ;AAAA,QACC,GAAG;AAAA;AAAA,MAEL;AAAA,IACH;AAAA,EAEN;AACJ;AAEA,MAAM,cAAc;;;AClFpB,IAAAE,gBAAkB;AAalB,IAAM,YAAoC;AAAA,EACxC,SAAS;AAAA,EACT,MAAM;AAAA,EACN,OAAO;AACT;AAEA,IAAM,cAA8C;AAAA,EAClD,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AACV;AAEO,IAAM,UAAU,cAAAC,QAAM;AAAA,EACzB,CACI;AAAA,IACE,cAAc;AAAA,IACd,UAAU;AAAA,IACV;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACC;AACH,UAAM,eAAe,gBAAgB;AAErC,QAAI,SAAS,cAAc;AACzB,aACI,8BAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACG,WAAW,GAAG,2BAA2B,SAAS;AAAA,UAClD,MAAK;AAAA,UACL,oBAAkB;AAAA;AAAA,QAEpB,8BAAAA,QAAA;AAAA,UAAC;AAAA;AAAA,YACG,WAAW;AAAA,cACP;AAAA,cACA,YAAY,OAAO;AAAA,cACnB,UAAU,KAAK;AAAA,YACnB;AAAA;AAAA,QACJ;AAAA,QACA,8BAAAA,QAAA,cAAC,UAAK,WAAU,kCAAgC,KAAM;AAAA,QACtD,8BAAAA,QAAA;AAAA,UAAC;AAAA;AAAA,YACG,WAAW;AAAA,cACP;AAAA,cACA,YAAY,OAAO;AAAA,cACnB,UAAU,KAAK;AAAA,YACnB;AAAA;AAAA,QACJ;AAAA,MACF;AAAA,IAEN;AAEA,WACI,8BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,MAAK;AAAA,QACL,oBAAkB;AAAA,QAClB,WAAW;AAAA,UACP,eAAe,oBAAoB;AAAA,UACnC,YAAY,OAAO;AAAA,UACnB,UAAU,KAAK;AAAA,UACf;AAAA,UACA,eAAe,aAAa;AAAA,UAC5B;AAAA,QACJ;AAAA,QACC,GAAG;AAAA;AAAA,IACR;AAAA,EAEN;AACJ;AAEA,QAAQ,cAAc;;;ACpFtB,IAAAC,iBAAkB;AAclB,IAAM,UAAsC;AAAA,EAC1C,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,OAAO;AACT;AAEA,SAAS,SAAS,MAAe;AAC/B,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,KAAK,KAAK,EAAE,MAAM,KAAK;AACrC,SAAO,MAAM,MAAM,GAAG,CAAC,EAAE,IAAI,OAAK,EAAE,CAAC,EAAG,YAAY,CAAC,EAAE,KAAK,EAAE;AAChE;AAEO,IAAM,SAAS,eAAAC,QAAM;AAAA,EACxB,CAAC,EAAC,KAAK,MAAM,IAAI,MAAM,OAAO,MAAM,QAAQ,WAAW,GAAG,KAAI,GAAG,QAAQ;AACvE,UAAM,cACF,WAAW,WAAW,eAAe,WAAW,SAAS,eAAe;AAE5E,WACI,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,WAAW;AAAA,UACP;AAAA,UACA,QAAQ,IAAI;AAAA,UACZ;AAAA,QACJ;AAAA,QACC,GAAG;AAAA;AAAA,MAEL,MACG,+BAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UAAI;AAAA,UAAU,KAAK,OAAO,QAAQ;AAAA,UAC9B,WAAU;AAAA;AAAA,MAA4B,IAE3C,+BAAAA,QAAA,cAAC,UAAK,eAAW,QAAE,SAAS,IAAI,KAAK,MAAI;AAAA,MAE5C,UACG,+BAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACG,WAAW;AAAA,YACP;AAAA;AAAA,YAEA,SAAS,OAAO,gBACZ,SAAS,OAAO,YACZ,SAAS,OAAO,gBACZ,SAAS,OAAO,YACZ,SAAS,OAAO,YAAY;AAAA,YAC5C;AAAA,UACJ;AAAA;AAAA,MACJ;AAAA,IAEN;AAAA,EAEN;AACJ;AAEA,OAAO,cAAc;;;ACvErB,IAAAC,iBAAkB;AASX,IAAM,QAAQ,eAAAC,QAAM;AAAA,EACvB,CAAC,EAAC,UAAU,WAAW,WAAW,GAAG,KAAI,GAAG,QAAQ;AAElD,UAAM,OAAO;AAGb,UAAM,iBAAiB;AAAA,MACrB,SAAS;AAAA,MACT,MAAM;AAAA,MACN,SAAS;AAAA,MACT,OAAO;AAAA,MACP,SAAS;AAAA,MACT,MAAM;AAAA,IACR;AAEA,UAAM,eAAe,eAAe,OAAO;AAE3C,WAAO,+BAAAA,QAAA,cAAC,UAAK,KAAU,WAAW,GAAG,MAAM,cAAc,SAAS,GAAI,GAAG,MAAM;AAAA,EACjF;AACJ;AAEA,MAAM,cAAc;;;AC9BpB,IAAAC,iBAAkB;AAaX,IAAM,UAAkC,CAAC;AAAA,EAC9C;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,OAAO;AACT,MAAM;AACJ,SACI,+BAAAC,QAAA,cAAC,UAAK,WAAU,2BACf,UACC,+BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACG,MAAK;AAAA,MACL,WAAW;AAAA,QACP;AAAA,QACA,OAAO,gBAAgB;AAAA,QACvB,SAAS,SAAS;AAAA,QAClB,SAAS,YAAY;AAAA,QACrB,SAAS,UAAU;AAAA,QACnB,SAAS,WAAW;AAAA,MACxB;AAAA;AAAA,IAEH;AAAA,EACH,CACF;AAEJ;;;ACrCA,IAAAC,iBAAkB;AAQX,IAAM,QAAQ,eAAAC,QAAM;AAAA,EACvB,CAAC,EAAC,aAAa,MAAM,WAAW,UAAU,GAAG,MAAK,GAAG,QAAQ;AAC3D,UAAM,QACF,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,WAAW,GAAG,kBAAkB,SAAS;AAAA,QACxC,GAAG;AAAA;AAAA,MAEL;AAAA,IACH;AAGJ,QAAI,YAAY;AACd,aAAO,+BAAAA,QAAA,cAAC,SAAI,WAAU,4BAA0B,KAAM;AAAA,IACxD;AAEA,WAAO;AAAA,EACT;AACJ;AAEA,MAAM,cAAc;AAMb,IAAM,cAAc,eAAAA,QAAM;AAAA,EAC7B,CAAC,EAAC,WAAW,UAAU,GAAG,MAAK,GAAG,QAC9B,+BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACG;AAAA,MACA,WAAW,GAAG,eAAe,SAAS;AAAA,MACrC,GAAG;AAAA;AAAA,IAEP;AAAA,EACD;AAER;AAEA,YAAY,cAAc;AAMnB,IAAM,YAAY,eAAAA,QAAM;AAAA,EAC3B,CAAC,EAAC,WAAW,UAAU,GAAG,MAAK,GAAG,QAC9B,+BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACG;AAAA,MACA,WAAW,GAAG,uBAAuB,SAAS;AAAA,MAC7C,GAAG;AAAA;AAAA,IAEP;AAAA,EACD;AAER;AAEA,UAAU,cAAc;AAMjB,IAAM,cAAc,eAAAA,QAAM;AAAA,EAC7B,CAAC,EAAC,WAAW,UAAU,GAAG,MAAK,GAAG,QAC9B,+BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACG;AAAA,MACA,WAAW,GAAG,2BAA2B,SAAS;AAAA,MACjD,GAAG;AAAA;AAAA,IAEP;AAAA,EACD;AAER;AAEA,YAAY,cAAc;AAQnB,IAAM,WAAW,eAAAA,QAAM;AAAA,EAC1B,CAAC,EAAC,YAAY,MAAM,WAAW,OAAO,WAAW,UAAU,GAAG,MAAK,GAAG,QAClE,+BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACG;AAAA,MACA,WAAW;AAAA,QACP;AAAA,QACA,aAAa;AAAA,QACb,YAAY;AAAA,QACZ;AAAA,MACJ;AAAA,MACC,GAAG;AAAA;AAAA,IAEL;AAAA,EACH;AAER;AAEA,SAAS,cAAc;AAQhB,IAAM,YAAY,eAAAA,QAAM;AAAA,EAC3B,CAAC,EAAC,UAAU,eAAe,WAAW,UAAU,GAAG,MAAK,GAAG,QACvD,+BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACG;AAAA,MACA,WAAW;AAAA,QACP;AAAA,QACA,YAAY;AAAA,QACZ;AAAA,MACJ;AAAA,MACC,GAAG;AAAA;AAAA,IAEN,+BAAAA,QAAA,cAAC,SAAI,WAAU,6BACZ,UACA,YAAY,iBACT,+BAAAA,QAAA,cAAC,UAAK,WAAU,eACnB,kBAAkB,QAAQ,WAAM,QACnC,CAEA;AAAA,EACF;AAER;AAEA,UAAU,cAAc;AAMjB,IAAM,YAAY,eAAAA,QAAM;AAAA,EAC3B,CAAC,EAAC,WAAW,UAAU,GAAG,MAAK,GAAG,QAC9B,+BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACG;AAAA,MACA,WAAW,GAAG,wBAAwB,SAAS;AAAA,MAC9C,GAAG;AAAA;AAAA,IAEL;AAAA,EACH;AAER;AAEA,UAAU,cAAc;AAMjB,IAAM,eAAe,eAAAA,QAAM;AAAA,EAC9B,CAAC,EAAC,WAAW,UAAU,GAAG,MAAK,GAAG,QAC9B,+BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACG;AAAA,MACA,WAAW,GAAG,4BAA4B,SAAS;AAAA,MAClD,GAAG;AAAA;AAAA,IAEL;AAAA,EACH;AAER;AAEA,aAAa,cAAc;;;AC9K3B,IAAAC,iBAAkB;AASX,IAAM,OAAO,eAAAC,QAAM;AAAA,EACtB,CAAC,EAAC,UAAU,WAAW,UAAU,OAAO,WAAW,UAAU,GAAG,MAAK,GAAG,QAAQ;AAC9E,UAAM,YAAY,UAAU,OAAO;AAEnC,WACI,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,WAAW;AAAA,UACP;AAAA,UACA,YAAY,cAAc;AAAA,UAC1B,YAAY,aAAa;AAAA,UACzB;AAAA,QACJ;AAAA,QACC,GAAG;AAAA;AAAA,MAEL;AAAA,IACH;AAAA,EAEN;AACJ;AAEA,KAAK,cAAc;AAWZ,IAAM,WAAW,eAAAA,QAAM;AAAA,EAC1B,CACI;AAAA,IACE;AAAA,IACA;AAAA,IACA,cAAc;AAAA,IACd,WAAW;AAAA,IACX,WAAW;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACC;AACH,UAAM,cAAc,CAAC,MAAuC;AAC1D,UAAI,UAAU;AACZ;AAAA,MACF;AACA,gBAAU,CAAC;AAAA,IACb;AAEA,WACI,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,SAAS;AAAA,QACT,WAAW;AAAA,UACP;AAAA,UACA,eAAe;AAAA,UACf,eAAe,CAAC,YAAY;AAAA,UAC5B,YAAY;AAAA,UACZ,YAAY;AAAA,UACZ;AAAA,QACJ;AAAA,QACC,GAAG;AAAA;AAAA,MAEL,WAAW,+BAAAA,QAAA,cAAC,SAAI,WAAU,cAAY,OAAQ;AAAA,MAC/C,+BAAAA,QAAA,cAAC,SAAI,WAAU,oBAAkB,QAAS;AAAA,MACzC,YAAY,+BAAAA,QAAA,cAAC,SAAI,WAAU,cAAY,QAAS;AAAA,IACnD;AAAA,EAEN;AACJ;AAEA,SAAS,cAAc;AAQhB,IAAM,eAAe,eAAAA,QAAM;AAAA,EAC9B,CAAC,EAAC,SAAS,WAAW,WAAW,GAAG,MAAK,GAAG,QAAQ;AAClD,WACI,+BAAAA,QAAA,cAAC,SAAI,KAAU,WAAW,GAAG,iBAAiB,SAAS,GAAI,GAAG,SAC5D,+BAAAA,QAAA,cAAC,UAAK,WAAU,oCAAkC,OAAQ,GACzD,aACG,+BAAAA,QAAA,cAAC,UAAK,WAAU,gCAA8B,SAAU,CAE9D;AAAA,EAEN;AACJ;AAEA,aAAa,cAAc;AAMpB,IAAM,gBAAgB,eAAAA,QAAM;AAAA,EAC/B,CAAC,EAAC,WAAW,UAAU,GAAG,MAAK,GAAG,QAAQ;AACxC,WACI,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,WAAW;AAAA,UACP;AAAA,UACA;AAAA,QACJ;AAAA,QACC,GAAG;AAAA;AAAA,MAEL;AAAA,IACH;AAAA,EAEN;AACJ;AAEA,cAAc,cAAc;;;ACjI5B,IAAAC,iBAAkB;AAElB,IAAAC,uBAUO;AA0CP,SAAS,YAAY,OAAuB;AAC1C,MAAI,UAAU,GAAG;AACf,WAAO;AAAA,EACT;AACA,QAAM,IAAI;AACV,QAAM,QAAQ,CAAC,KAAK,MAAM,MAAM,IAAI;AACpC,QAAM,IAAI,KAAK,MAAM,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,CAAC,CAAC;AAClD,SAAO,GAAG,YAAY,QAAQ,KAAK,IAAI,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC;AACvE;AAKA,SAAS,YAAY,MAAe;AAClC,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AAEA,MAAI,KAAK,WAAW,QAAQ,GAAG;AAC7B,WAAO;AAAA,EACT;AACA,MAAI,KAAK,WAAW,QAAQ,GAAG;AAC7B,WAAO;AAAA,EACT;AACA,MAAI,KAAK,WAAW,QAAQ,GAAG;AAC7B,WAAO;AAAA,EACT;AACA,MAAI,KAAK,WAAW,OAAO,GAAG;AAC5B,WAAO;AAAA,EACT;AACA,MAAI,KAAK,SAAS,YAAY,KAAK,KAAK,SAAS,YAAY,KAAK,KAAK,SAAS,MAAM,KAC/E,KAAK,SAAS,KAAK,GAAG;AAC3B,WAAO;AAAA,EACT;AACA,MAAI,KAAK,SAAS,KAAK,KAAK,KAAK,SAAS,KAAK,KAAK,KAAK,SAAS,KAAK,KAAK,KAAK,SAAS,IAAI,GAAG;AAC/F,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,IAAM,eAA+C;AAAA,EACnD,SAAS;AAAA,EACT,WAAW;AAAA,EACX,UAAU;AAAA,EACV,OAAO;AACT;AAEO,IAAM,WAAW,eAAAC,QAAM;AAAA,EAC1B,CACI;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT;AAAA,IACA;AAAA,IACA,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACC;AACH,UAAM,OAAO,YAAY,IAAI;AAC7B,UAAM,UAAU,MAAM,WAAW,QAAQ;AACzC,UAAM,cAAc,WAAW;AAE/B,WACI,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,WAAW;AAAA,UACP;AAAA,UACA;AAAA,UACA;AAAA,UACA,aAAa,MAAM;AAAA,UACnB,WAAW,WAAW;AAAA,UACtB;AAAA,QACJ;AAAA,QACA,MAAK;AAAA,QACJ,GAAG;AAAA;AAAA,MAGL,cACG,+BAAAA,QAAA,cAAC,SAAI,WAAU,oDACb,+BAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACG,KAAK;AAAA,UACL,KAAI;AAAA,UACJ,WAAU;AAAA;AAAA,MACd,CACF,IAEA,+BAAAA,QAAA,cAAC,QAAK,WAAW;AAAA,QACb;AAAA,QACA,WAAW,UAAU,eAAe;AAAA,MACxC,GAAE;AAAA,MAIN,+BAAAA,QAAA,cAAC,SAAI,WAAU,kCACjB,+BAAAA,QAAA,cAAC,UAAK,WAAU,qBAAoB,OAAO,QACxC,IACH,GACK,SAAS,UAAa,WAAW,WAC9B,+BAAAA,QAAA,cAAC,UAAK,WAAU,4BACnB,YAAY,IAAI,CACnB,GAEG,WAAW,WAAW,SACnB,+BAAAA,QAAA,cAAC,UAAK,WAAU,+BAA8B,OAAO,SACxD,KACH,CAEA;AAAA,MAGC,WAAW,eACR,+BAAAA,QAAA,cAAC,gCAAQ,WAAU,oDAAkD;AAAA,MAExE,WAAW,aACR,+BAAAA,QAAA,cAAC,SAAI,WAAU,mDAAiD;AAAA,MAInE,aAAa,YACV,+BAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACG,MAAK;AAAA,UACL,SAAS,CAAC,MAAM;AACd,cAAE,gBAAgB;AAClB,qBAAS;AAAA,UACX;AAAA,UACA,WAAW;AAAA,YACP;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACJ;AAAA,UACA,cAAY,UAAU,IAAI;AAAA;AAAA,QAE5B,+BAAAA,QAAA,cAAC,0BAAE,WAAU,eAAa;AAAA,MAC5B;AAAA,IAEN;AAAA,EAEN;AACJ;AAEA,SAAS,cAAc;;;ACzMvB,IAAAC,iBAAkB;AA+CX,IAAM,oBAAoB,eAAAC,QAAM;AAAA,EACnC,CACI;AAAA,IACE;AAAA,IACA;AAAA,IACA,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACC;AACH,QAAI,YAAY,WAAW,GAAG;AAC5B,aAAO;AAAA,IACT;AAEA,UAAM,qBAAqB,cAAc,aAAa,IAChD,YAAY,MAAM,GAAG,UAAU,IAC/B;AAEN,UAAM,cAAc,cAAc,aAAa,IACzC,KAAK,IAAI,GAAG,YAAY,SAAS,UAAU,IAC3C;AAEN,WACI,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,WAAW,GAAG,wBAAwB,SAAS;AAAA,QAC/C,MAAK;AAAA,QACL,cAAW;AAAA,QACV,GAAG;AAAA;AAAA,MAEL,mBAAmB,IAAI,CAAC,eACrB,+BAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACG,KAAK,WAAW;AAAA,UAChB,MAAM,WAAW,KAAK;AAAA,UACtB,MAAM,WAAW,KAAK;AAAA,UACtB,MAAM,WAAW,KAAK;AAAA,UACtB,QAAQ,WAAW;AAAA,UACnB,YAAY,WAAW;AAAA,UACvB,OAAO,WAAW;AAAA,UAClB;AAAA,UACA,UAAU,WAAW,MAAM,SAAS,WAAW,EAAE,IAAI;AAAA;AAAA,MACzD,CACH;AAAA,MACA,cAAc,KACX,+BAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACG,WAAU;AAAA;AAAA,QAA+F;AAAA,QACzG;AAAA,QAAY;AAAA,MAChB;AAAA,IAEN;AAAA,EAEN;AACJ;AAEA,kBAAkB,cAAc;;;ACvGhC,IAAAC,iBAAkB;AAOX,IAAM,QAAQ,eAAAC,QAAM;AAAA,EACvB,CAAC,EAAC,WAAW,UAAU,UAAU,GAAG,KAAI,GAAG,QAAQ;AACjD,WACI,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,WAAW,GAAG,gDAAgD,SAAS;AAAA,QACtE,GAAG;AAAA;AAAA,MAEL;AAAA,MACA,YAAY,+BAAAA,QAAA,cAAC,UAAK,WAAU,qBAAkB,GAAC;AAAA,IAClD;AAAA,EAEN;AACJ;AAEA,MAAM,cAAc;;;ACtBpB,IAAAC,iBAAkB;AAOX,IAAM,aAAa,eAAAC,QAAM;AAAA,EAC5B,CAAC,EAAC,WAAW,OAAO,UAAU,GAAG,KAAI,GAAG,QAAQ;AAC9C,WACI,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,WAAW,GAAG,kBAAkB,QAAQ,eAAe,eAAe,SAAS;AAAA,QAC9E,GAAG;AAAA;AAAA,MAEL;AAAA,IACH;AAAA,EAEN;AACJ;AAEA,WAAW,cAAc;;;ACrBzB,IAAAC,iBAAkB;AAOX,IAAM,WAAW,eAAAC,QAAM;AAAA,EAC1B,CAAC,EAAC,QAAQ,OAAO,WAAW,UAAU,GAAG,KAAI,GAAG,QAAQ;AAEtD,UAAM,OACF;AAOJ,UAAM,WAAW,QAAQ,qDAAqD;AAE9E,WACI,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,WAAW,GAAG,MAAM,UAAU,YAAY,cAAc,SAAS;AAAA,QACjE;AAAA,QACC,GAAG;AAAA;AAAA,IACR;AAAA,EAEN;AACJ;AAEA,SAAS,cAAc;;;AC/BvB,IAAAC,iBAAkB;AAalB,IAAM,gBAAgB;AAEf,IAAM,SAAS,eAAAC,QAAM;AAAA,EACxB,CAAC,EAAC,QAAQ,OAAO,WAAW,UAAU,SAAS,UAAU,GAAG,KAAI,GAAG,QAAQ;AACzE,WACI,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,WAAW;AAAA,UACP;AAAA,UACA;AAAA,UACA;AAAA,UACA,SAAS;AAAA,UACT;AAAA,QACJ;AAAA,QACA,OAAO;AAAA,UACL,iBAAiB;AAAA,UACjB,oBAAoB;AAAA,UACpB,kBAAkB;AAAA,UAClB,gBAAgB;AAAA,QAClB;AAAA,QACA;AAAA,QACC,GAAG;AAAA;AAAA,MAEL,UACK,QAAQ,IAAI,CAAC,QACX,+BAAAA,QAAA,cAAC,YAAO,KAAK,IAAI,OAAO,OAAO,IAAI,SAChC,IAAI,KACP,CACH,IACC;AAAA,IACR;AAAA,EAEN;AACJ;AAEA,OAAO,cAAc;;;AChDrB,IAAAC,iBAAiC;AAOjC,IAAM,eAAe;AAEd,IAAM,WAAW,eAAAC,QAAM;AAAA,EAC1B,CAAC,EAAC,WAAW,OAAO,IAAI,GAAG,KAAI,GAAG,QAAQ;AACxC,UAAM,UAAU,MAAM,KAAK,QAAQ,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,OAAO,GAAG,CAAC;AAEzE,UAAM,aAAS,4BAAY,CAAC,SAAkC;AAC5D,UAAI,MAAM;AAER,YAAI,KAAK,SAAS;AAChB,eAAK,MAAM,kBAAkB;AAAA,QAC/B;AAAA,MACF;AAEA,UAAI,OAAO,QAAQ,YAAY;AAC7B,YAAI,IAAI;AAAA,MACV,WAAW,KAAK;AACd,YAAI,UAAU;AAAA,MAChB;AAAA,IACF,GAAG,CAAC,GAAG,CAAC;AAER,WACI,+BAAAA,QAAA,cAAC,SAAI,WAAU,uBACb,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG,MAAK;AAAA,QACL,IAAI;AAAA,QACJ,KAAK;AAAA,QACL,WAAW;AAAA,UACP;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACJ;AAAA,QACA,OAAO;AAAA,UACL,oBAAoB;AAAA,UACpB,gBAAgB;AAAA,UAChB,kBAAkB;AAAA,QACpB;AAAA,QACA,UAAU,CAAC,MAAM;AACf,gBAAM,QAAQ,EAAE;AAChB,cAAI,MAAM,SAAS;AACjB,kBAAM,MAAM,kBAAkB;AAAA,UAChC,OAAO;AACL,kBAAM,MAAM,kBAAkB;AAAA,UAChC;AACA,eAAK,WAAW,CAAC;AAAA,QACnB;AAAA,QACC,GAAG;AAAA;AAAA,IACR,GACC,SACG,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QAAM,SAAS;AAAA,QACT,WAAU;AAAA;AAAA,MACd;AAAA,IACH,CAEN;AAAA,EAEN;AACJ;AAEA,SAAS,cAAc;;;ACrEvB,IAAAC,iBAAiC;AAOjC,IAAM,cAAc;AAEb,IAAM,QAAQ,eAAAC,QAAM;AAAA,EACvB,CAAC,EAAC,WAAW,OAAO,IAAI,GAAG,KAAI,GAAG,QAAQ;AACxC,UAAM,UAAU,MAAM,KAAK,QAAQ,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,OAAO,GAAG,CAAC;AAEzE,UAAM,aAAS,4BAAY,CAAC,SAAkC;AAC5D,UAAI,MAAM;AAER,YAAI,KAAK,SAAS;AAChB,eAAK,MAAM,kBAAkB;AAAA,QAC/B;AAAA,MACF;AAEA,UAAI,OAAO,QAAQ,YAAY;AAC7B,YAAI,IAAI;AAAA,MACV,WAAW,KAAK;AACd,YAAI,UAAU;AAAA,MAChB;AAAA,IACF,GAAG,CAAC,GAAG,CAAC;AAER,WACI,+BAAAA,QAAA,cAAC,SAAI,WAAU,uBACb,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG,MAAK;AAAA,QACL,IAAI;AAAA,QACJ,KAAK;AAAA,QACL,WAAW;AAAA,UACP;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACJ;AAAA,QACA,OAAO;AAAA,UACL,oBAAoB;AAAA,UACpB,gBAAgB;AAAA,UAChB,kBAAkB;AAAA,QACpB;AAAA,QACA,UAAU,CAAC,MAAM;AACf,gBAAM,QAAQ,EAAE;AAChB,cAAI,MAAM,SAAS;AACjB,kBAAM,MAAM,kBAAkB;AAE9B,gBAAI,MAAM,MAAM;AACd,oBAAM,SAAS,SAAS;AAAA,gBACpB,6BAA6B,MAAM,IAAI;AAAA,cAAI;AAC/C,qBAAO,QAAQ,CAAC,UAAU;AACxB,oBAAI,UAAU,OAAO;AACnB,wBAAM,MAAM,kBAAkB;AAAA,gBAChC;AAAA,cACF,CAAC;AAAA,YACH;AAAA,UACF,OAAO;AACL,kBAAM,MAAM,kBAAkB;AAAA,UAChC;AACA,eAAK,WAAW,CAAC;AAAA,QACnB;AAAA,QACC,GAAG;AAAA;AAAA,IACR,GACC,SACG,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QAAM,SAAS;AAAA,QACT,WAAU;AAAA;AAAA,MACd;AAAA,IACH,CAEN;AAAA,EAEN;AACJ;AAEA,MAAM,cAAc;;;AC/EpB,IAAAC,iBAAmD;AAU5C,IAAM,SAAS,eAAAC,QAAM;AAAA,EACxB,CAAC;AAAA,IACC,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,GAAG,QAAQ;AACT,UAAM,CAAC,iBAAiB,kBAAkB,QAAI,yBAAS,cAAc;AACrE,UAAM,eAAe,sBAAsB;AAC3C,UAAM,UAAU,eAAe,oBAAoB;AACnD,UAAM,gBAAY,uBAAiC,IAAI;AACvD,UAAM,cAAU;AAAA,MACZ,CAAC,SAAmC;AAClC,kBAAU,UAAU;AACpB,YAAI,OAAO,QAAQ,YAAY;AAC7B,cAAI,IAAI;AAAA,QACV,WAAW,KAAK;AACd,cAAI,UAAU;AAAA,QAChB;AAAA,MACF;AAAA,MACA,CAAC,GAAG;AAAA,IACR;AAEA,UAAM,cAAc,CAAC,MAA2C;AAC9D,UAAI,UAAU;AACZ;AAAA,MACF;AACA,YAAM,aAAa,CAAC;AACpB,UAAI,CAAC,cAAc;AACjB,2BAAmB,UAAU;AAAA,MAC/B;AACA,wBAAkB,UAAU;AAC5B,WAAK,UAAU,CAAC;AAAA,IAClB;AAEA,WACI,+BAAAA,QAAA,cAAC,SAAI,WAAU,6BACb,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG,MAAK;AAAA,QACL,MAAK;AAAA,QACL,gBAAc;AAAA,QACd,cAAY,UAAU,YAAY;AAAA,QAClC;AAAA,QACA,KAAK;AAAA,QACL,SAAS;AAAA,QACT,WAAW;AAAA,UACP;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,UAAU,YAAY;AAAA,UACtB;AAAA,QACJ;AAAA,QACC,GAAG;AAAA;AAAA,MAEV,+BAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACG,WAAW;AAAA,YACP;AAAA,YACA;AAAA,YACA,UAAU,kBAAkB;AAAA,UAChC;AAAA;AAAA,MACJ;AAAA,IACE,GACC,SACG,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG,WAAU;AAAA,QACV,SAAS,MAAM;AACb,cAAI,UAAU;AACZ;AAAA,UACF;AACA,oBAAU,SAAS,MAAM;AAAA,QAC3B;AAAA;AAAA,MAEP;AAAA,IACH,CAEA;AAAA,EAEN;AACJ;AAEA,OAAO,cAAc;;;AC9FrB,IAAAC,iBAAmD;AAiBnD,IAAM,aAAqC;AAAA,EACzC,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAEA,IAAM,aAAqC;AAAA,EACzC,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAEO,IAAM,SAAS,eAAAC,QAAM;AAAA,EACxB,CACI;AAAA,IACE,OAAO;AAAA,IACP,eAAe;AAAA,IACf,MAAM;AAAA,IACN,MAAM;AAAA,IACN,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX,cAAc;AAAA,IACd,cAAc,CAAC,MAAM,OAAO,CAAC;AAAA,IAC7B,OAAO;AAAA,IACP;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACC;AACH,UAAM,CAAC,eAAe,gBAAgB,QAAI,yBAAS,YAAY;AAC/D,UAAM,CAAC,YAAY,aAAa,QAAI,yBAAS,KAAK;AAClD,UAAM,eAAW,uBAAuB,IAAI;AAE5C,UAAM,eAAe,oBAAoB;AACzC,UAAM,QAAQ,eAAe,kBAAkB;AAE/C,UAAM,cAAe,QAAQ,QAAQ,MAAM,OAAQ;AAEnD,UAAM,kBAAc;AAAA,MAChB,CAAC,YAAoB;AACnB,YAAI,CAAC,SAAS,WAAW,UAAU;AACjC;AAAA,QACF;AAEA,cAAM,OAAO,SAAS,QAAQ,sBAAsB;AACpD,cAAM,UAAU,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,UAAU,KAAK,QAAQ,KAAK,KAAK,CAAC;AAC3E,cAAM,WAAW,MAAM,WAAW,MAAM;AACxC,cAAM,eAAe,KAAK,MAAM,WAAW,IAAI,IAAI;AACnD,cAAM,eAAe,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,YAAY,CAAC;AAE9D,YAAI,CAAC,cAAc;AACjB,2BAAiB,YAAY;AAAA,QAC/B;AACA,mBAAW,YAAY;AAAA,MACzB;AAAA,MACA,CAAC,KAAK,KAAK,MAAM,UAAU,cAAc,QAAQ;AAAA,IACrD;AAEA,UAAM,kBAAkB,CAAC,MAAwB;AAC/C,UAAI,UAAU;AACZ;AAAA,MACF;AACA,oBAAc,IAAI;AAClB,kBAAY,EAAE,OAAO;AAErB,YAAM,kBAAkB,CAACC,OAAkB;AACzC,oBAAYA,GAAE,OAAO;AAAA,MACvB;AAEA,YAAM,gBAAgB,CAACA,OAAkB;AACvC,sBAAc,KAAK;AACnB,iBAAS,oBAAoB,aAAa,eAAe;AACzD,iBAAS,oBAAoB,WAAW,aAAa;AAErD,YAAI,SAAS,SAAS;AACpB,gBAAM,OAAO,SAAS,QAAQ,sBAAsB;AACpD,gBAAM,UAAU,KAAK,IAAI,GAAG,KAAK,IAAI,IAAIA,GAAE,UAAU,KAAK,QAAQ,KAAK,KAAK,CAAC;AAC7E,gBAAM,WAAW,MAAM,WAAW,MAAM;AACxC,gBAAM,eAAe,KAAK,MAAM,WAAW,IAAI,IAAI;AACnD,gBAAM,eAAe,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,YAAY,CAAC;AAC9D,wBAAc,YAAY;AAAA,QAC5B;AAAA,MACF;AAEA,eAAS,iBAAiB,aAAa,eAAe;AACtD,eAAS,iBAAiB,WAAW,aAAa;AAAA,IACpD;AAEA,UAAM,gBAAgB,CAAC,MAA2B;AAChD,UAAI,UAAU;AACZ;AAAA,MACF;AAEA,UAAI,WAAW;AACf,cAAQ,EAAE,KAAK;AAAA,QACb,KAAK;AAAA,QACL,KAAK;AACH,qBAAW,KAAK,IAAI,KAAK,QAAQ,IAAI;AACrC;AAAA,QACF,KAAK;AAAA,QACL,KAAK;AACH,qBAAW,KAAK,IAAI,KAAK,QAAQ,IAAI;AACrC;AAAA,QACF,KAAK;AACH,qBAAW;AACX;AAAA,QACF,KAAK;AACH,qBAAW;AACX;AAAA,QACF;AACE;AAAA,MACJ;AAEA,QAAE,eAAe;AACjB,UAAI,CAAC,cAAc;AACjB,yBAAiB,QAAQ;AAAA,MAC3B;AACA,iBAAW,QAAQ;AACnB,oBAAc,QAAQ;AAAA,IACxB;AAEA,WACI,+BAAAD,QAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,WAAW,GAAG,wBAAwB,YAAY,cAAc,SAAS;AAAA,QACxE,GAAG;AAAA;AAAA,MAEN,+BAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACG,KAAK;AAAA,UACL,WAAW;AAAA,YACP;AAAA,YACA,WAAW,IAAI;AAAA,UACnB;AAAA,UACA,aAAa;AAAA;AAAA,QAGf,+BAAAA,QAAA;AAAA,UAAC;AAAA;AAAA,YACG,WAAW,GAAG,qCAAqC,WAAW,IAAI,CAAC;AAAA,YACnE,OAAO,EAAC,OAAO,GAAG,UAAU,IAAG;AAAA;AAAA,QACnC;AAAA,QAGA,+BAAAA,QAAA;AAAA,UAAC;AAAA;AAAA,YACG,MAAK;AAAA,YACL,UAAU,WAAW,KAAK;AAAA,YAC1B,iBAAe;AAAA,YACf,iBAAe;AAAA,YACf,iBAAe;AAAA,YACf,iBAAe;AAAA,YACf,WAAW;AAAA,YACX,WAAW;AAAA,cACP;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA,cAAc;AAAA,cACd,CAAC,YAAY;AAAA,cACb,WAAW,IAAI;AAAA,YACnB;AAAA,YACA,OAAO,EAAC,MAAM,GAAG,UAAU,IAAG;AAAA;AAAA,UAG/B,eAAe,cACZ,+BAAAA,QAAA;AAAA,YAAC;AAAA;AAAA,cACG,WAAU;AAAA;AAAA,YACX,YAAY,KAAK;AAAA,UACpB;AAAA,QAEN;AAAA,MACF;AAAA,IACF;AAAA,EAEN;AACJ;AAEA,OAAO,cAAc;;;AClMrB,IAAAE,iBAAkB;AAOX,IAAM,aAAa,eAAAC,QAAM;AAAA,EAC5B,CAAC,EAAC,WAAW,UAAU,GAAG,MAAK,GAAG,QAAQ;AACxC,WACI,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,WAAW,GAAG,QAAQ,SAAS;AAAA,QAC9B,GAAG;AAAA;AAAA,MAEL;AAAA,IACH;AAAA,EAEN;AACJ;AAEA,WAAW,cAAc;AAMlB,IAAM,iBAAiB,eAAAA,QAAM;AAAA,EAChC,CAAC,EAAC,WAAW,UAAU,GAAG,MAAK,GAAG,QAAQ;AACxC,WACI,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,WAAW;AAAA,UACP;AAAA,UACA;AAAA,UACA;AAAA,QACJ;AAAA,QACC,GAAG;AAAA;AAAA,MAEL;AAAA,IACH;AAAA,EAEN;AACJ;AAEA,eAAe,cAAc;AAGtB,IAAM,kBAAkB,eAAAA,QAAM;AAAA,EACjC,CAAC,EAAC,WAAW,UAAU,GAAG,MAAK,GAAG,QAAQ;AACxC,WACI,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,WAAW;AAAA,UACP;AAAA,UACA;AAAA,UACA;AAAA,QACJ;AAAA,QACC,GAAG;AAAA;AAAA,MAEL;AAAA,IACH;AAAA,EAEN;AACJ;AAEA,gBAAgB,cAAc;AAMvB,IAAM,mBAAmB,eAAAA,QAAM;AAAA,EAClC,CAAC,EAAC,WAAW,UAAU,GAAG,MAAK,GAAG,QAAQ;AACxC,WACI,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,WAAW;AAAA,UACP;AAAA,UACA;AAAA,UACA;AAAA,QACJ;AAAA,QACC,GAAG;AAAA;AAAA,MAEL;AAAA,IACH;AAAA,EAEN;AACJ;AAEA,iBAAiB,cAAc;AAGxB,IAAM,oBAAoB,eAAAA,QAAM;AAAA,EACnC,CAAC,EAAC,WAAW,UAAU,GAAG,MAAK,GAAG,QAAQ;AACxC,WACI,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,WAAW;AAAA,UACP;AAAA,UACA;AAAA,QACJ;AAAA,QACC,GAAG;AAAA;AAAA,MAEL;AAAA,IACH;AAAA,EAEN;AACJ;AAEA,kBAAkB,cAAc;AAMzB,IAAM,eAAe,eAAAA,QAAM;AAAA,EAC9B,CAAC,EAAC,WAAW,UAAU,GAAG,MAAK,GAAG,QAAQ;AACxC,WACI,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,WAAW,GAAG,mBAAmB,SAAS;AAAA,QACzC,GAAG;AAAA;AAAA,MAEL;AAAA,IACH;AAAA,EAEN;AACJ;AAEA,aAAa,cAAc;;;AClI3B,IAAAC,iBAAkB;AAClB,IAAAC,uBAAwD;AAUxD,IAAM,QAAQ;AAAA,EACZ,MAAM;AAAA,EACN,SAAS;AAAA,EACT,SAAS;AAAA,EACT,OAAO;AACT;AAEA,IAAM,gBAAgB;AAAA,EACpB,MAAM;AAAA,EACN,SAAS;AAAA,EACT,SAAS;AAAA,EACT,OAAO;AACT;AAEO,IAAM,QAAQ,eAAAC,QAAM;AAAA,EACvB,CAAC,EAAC,UAAU,QAAQ,OAAO,UAAU,WAAW,GAAG,KAAI,GAAG,QAAQ;AAChE,UAAM,OAAO,MAAM,OAAO;AAE1B,WACI,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,MAAK;AAAA,QACL,WAAW;AAAA,UACP;AAAA,UACA,cAAc,OAAO;AAAA,UACrB;AAAA,QACJ;AAAA,QACC,GAAG;AAAA;AAAA,MAEN,+BAAAA,QAAA,cAAC,QAAK,WAAU,oBAAkB;AAAA,MAClC,+BAAAA,QAAA,cAAC,SAAI,WAAU,YACZ,SAAS,+BAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACP,WAAU;AAAA;AAAA,QAA6D;AAAA,MAAM,GACjF,+BAAAA,QAAA,cAAC,SAAI,WAAU,wBAAsB,QAAS,CAChD;AAAA,IACF;AAAA,EAEN;AACJ;AAEA,MAAM,cAAc;;;ACnDpB,IAAAC,iBAAkB;AASX,IAAM,UAAU,CAAC,EAAC,WAAW,OAAO,MAAM,GAAG,KAAI,MAAoB;AAC1E,QAAM,YACF,SAAS,OAAO,YAAY,SAAS,OAAO,YAAY;AAE5D,SACI,+BAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACG,OAAM;AAAA,MACN,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,eAAc;AAAA,MACd,gBAAe;AAAA,MACf,WAAW,GAAG,0BAA0B,WAAW,SAAS;AAAA,MAC3D,GAAG;AAAA;AAAA,IAEN,+BAAAA,QAAA,cAAC,UAAK,GAAE,+BAA6B;AAAA,EACvC;AAEN;AAEA,QAAQ,cAAc;;;AC9BtB,IAAAC,iBAAkB;AAgBlB,IAAM,WAAyC;AAAA,EAC7C,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAEA,IAAMC,eAA+C;AAAA,EACnD,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,OAAO;AACT;AAEO,IAAM,WAAW,eAAAC,QAAM;AAAA,EAC1B,CACI;AAAA,IACE,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,OAAO;AAAA,IACP,UAAU;AAAA,IACV,YAAY;AAAA,IACZ;AAAA,IACA,gBAAgB;AAAA,IAChB;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACC;AACH,UAAM,aAAa,KAAK,IAAI,KAAK,KAAK,IAAI,GAAI,QAAQ,MAAO,GAAG,CAAC;AACjE,UAAM,eAAe,cACf,YAAY,OAAO,GAAG,IACtB,GAAG,KAAK,MAAM,UAAU,CAAC;AAE/B,WACI,+BAAAA,QAAA,cAAC,SAAI,KAAU,WAAW,GAAG,UAAU,SAAS,GAAI,GAAG,SACpD,aACG,+BAAAA,QAAA,cAAC,SAAI,WAAU,+BACb,+BAAAA,QAAA,cAAC,UAAK,WAAU,yBAAsB,UAAQ,GAC9C,+BAAAA,QAAA,cAAC,UAAK,WAAU,oCAAkC,YAAa,CACjE,GAEJ,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG,WAAW;AAAA,UACP;AAAA,UACA,SAAS,IAAI;AAAA,QACjB;AAAA,QACA,MAAK;AAAA,QACL,iBAAe,gBAAgB,SAAY;AAAA,QAC3C,iBAAe;AAAA,QACf,iBAAe;AAAA;AAAA,MAEjB,+BAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACG,WAAW;AAAA,YACP;AAAA,YACAD,aAAY,OAAO;AAAA,YACnB,iBAAiB;AAAA,UACrB;AAAA,UACA,OAAO;AAAA,YACL,OAAO,gBAAgB,SAAS,GAAG,UAAU;AAAA,UAC/C;AAAA;AAAA,MACJ;AAAA,IACF,CACF;AAAA,EAEN;AACJ;AAEA,SAAS,cAAc;;;ACnFvB,IAAAE,iBAAiF;AACjF,uBAA2B;AAC3B,IAAAC,uBAA+D;AA4B/D,IAAM,mBAAe,8BAAwC,IAAI;AAE1D,SAAS,WAAW;AACzB,QAAM,cAAU,2BAAW,YAAY;AACvC,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,8CAA8C;AAAA,EAChE;AAEA,QAAM,YAAQ;AAAA,IACV,CAAC,YAAmC;AAClC,aAAO,QAAQ,SAAS,OAAO;AAAA,IACjC;AAAA,IACA,CAAC,OAAO;AAAA,EACZ;AAEA,SAAO;AAAA,IACL;AAAA,IACA,SAAS,QAAQ;AAAA,EACnB;AACF;AASO,IAAM,gBAA8C,CAAC;AAAA,EAC1D;AAAA,EACA,WAAW;AAAA,EACX,kBAAkB;AACpB,MAAM;AACJ,QAAM,CAAC,QAAQ,SAAS,QAAI,yBAAsB,CAAC,CAAC;AACpD,QAAM,CAAC,SAAS,UAAU,QAAI,yBAAS,KAAK;AAE5C,gCAAU,MAAM;AACd,eAAW,IAAI;AAAA,EACjB,GAAG,CAAC,CAAC;AAEL,QAAM,eAAW;AAAA,IACb,CAAC,UAAiC;AAChC,YAAM,KAAK,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,OAAO,GAAG,CAAC;AACjD,YAAM,WAAsB;AAAA,QAC1B,GAAG;AAAA,QACH;AAAA,QACA,UAAU,MAAM,YAAY;AAAA,MAC9B;AACA,gBAAU,CAAC,SAAS,CAAC,GAAG,MAAM,QAAQ,CAAC;AACvC,aAAO;AAAA,IACT;AAAA,IACA,CAAC,eAAe;AAAA,EACpB;AAEA,QAAM,kBAAc,4BAAY,CAAC,OAAe;AAC9C,cAAU,CAAC,SAAS,KAAK,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;AAAA,EACrD,GAAG,CAAC,CAAC;AAEL,SACI,+BAAAC,QAAA,cAAC,aAAa,UAAb,EAAsB,OAAO,EAAC,QAAQ,UAAU,aAAa,SAAQ,KACnE,UACA,WAAW,+BAAAA,QAAA,cAAC,mBAAa,CAC5B;AAEN;AAEA,cAAc,cAAc;AAG5B,IAAM,gBAA0B,MAAM;AACpC,QAAM,cAAU,2BAAW,YAAY;AACvC,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,QAAM,EAAC,QAAQ,SAAQ,IAAI;AAE3B,QAAM,kBAAiD;AAAA,IACrD,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,gBAAgB;AAAA,IAChB,eAAe;AAAA,IACf,cAAc;AAAA,IACd,iBAAiB;AAAA,EACnB;AAEA,aAAO;AAAA,IACH,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG,WAAW;AAAA,UACP;AAAA,UACA,gBAAgB,QAAQ;AAAA,QAC5B;AAAA;AAAA,MAED,OAAO,IAAI,CAAC,UACT,+BAAAA,QAAA,cAAC,SAAM,KAAK,MAAM,IAAK,GAAG,OAAO,CACpC;AAAA,IACH;AAAA,IACA,SAAS;AAAA,EACb;AACF;AAMA,IAAMC,kBAA+C;AAAA,EACnD,SAAS;AAAA,EACT,SAAS;AAAA,EACT,OAAO;AAAA,EACP,SAAS;AAAA,EACT,MAAM;AACR;AAEA,IAAM,gBAAuD;AAAA,EAC3D,SAAS;AAAA,EACT,SAAS,+BAAAD,QAAA,cAAC,oCAAY,WAAU,wBAAsB;AAAA,EACtD,OAAO,+BAAAA,QAAA,cAAC,oCAAY,WAAU,sBAAoB;AAAA,EAClD,SAAS,+BAAAA,QAAA,cAAC,sCAAc,WAAU,wBAAsB;AAAA,EACxD,MAAM,+BAAAA,QAAA,cAAC,6BAAK,WAAU,qBAAmB;AAC3C;AAEA,IAAM,QAA8B,CAAC;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV;AAAA,EACA;AACF,MAAM;AACJ,QAAM,cAAU,2BAAW,YAAY;AAEvC,gCAAU,MAAM;AACd,QAAI,YAAY,WAAW,GAAG;AAC5B,YAAM,QAAQ,WAAW,MAAM;AAC7B,iBAAS,YAAY,EAAE;AAAA,MACzB,GAAG,QAAQ;AACX,aAAO,MAAM,aAAa,KAAK;AAAA,IACjC;AAAA,EACF,GAAG,CAAC,IAAI,UAAU,OAAO,CAAC;AAE1B,QAAM,OAAO,cAAc,OAAO;AAElC,SACI,+BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACG,MAAK;AAAA,MACL,WAAW;AAAA,QACP;AAAA,QACAC,gBAAe,OAAO;AAAA,MAC1B;AAAA;AAAA,IAEF,+BAAAD,QAAA,cAAC,SAAI,WAAU,gBACZ,QAAQ,+BAAAA,QAAA,cAAC,SAAI,WAAU,qBAAmB,IAAK,GAChD,+BAAAA,QAAA,cAAC,SAAI,WAAU,oBACZ,SACG,+BAAAA,QAAA,cAAC,OAAE,WAAU,oCAAkC,KAAM,GAExD,eACG,+BAAAA,QAAA,cAAC,OAAE,WAAU,8BAA4B,WAAY,GAExD,UAAU,+BAAAA,QAAA,cAAC,SAAI,WAAU,UAAQ,MAAO,CAC3C,GACA,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG,SAAS,MAAM,SAAS,YAAY,EAAE;AAAA,QACtC,WAAU;AAAA;AAAA,MAEZ,+BAAAA,QAAA,cAAC,0BAAE,WAAU,WAAS;AAAA,MACtB,+BAAAA,QAAA,cAAC,UAAK,WAAU,aAAU,SAAO;AAAA,IACnC,CACF;AAAA,EACF;AAEN;AAEA,MAAM,cAAc;;;AC3MpB,IAAAE,iBAAyC;AACzC,IAAAC,oBAA2B;AAC3B,IAAAC,uBAAgB;AAWT,IAAM,QAAQ,CAAC,EAAC,QAAQ,SAAS,OAAO,UAAU,UAAS,MAAkB;AAClF,QAAM,CAAC,SAAS,UAAU,QAAI,yBAAS,KAAK;AAE5C,gCAAU,MAAM;AACd,eAAW,IAAI;AAAA,EACjB,GAAG,CAAC,CAAC;AAEL,gCAAU,MAAM;AACd,QAAI,QAAQ;AACV,YAAM,iBAAiB,OAAO,aAAa,SAAS,gBAAgB;AACpE,eAAS,KAAK,MAAM,WAAW;AAC/B,eAAS,KAAK,MAAM,eAAe,GAAG,cAAc;AAAA,IACtD,OAAO;AACL,eAAS,KAAK,MAAM,WAAW;AAC/B,eAAS,KAAK,MAAM,eAAe;AAAA,IACrC;AACA,WAAO,MAAM;AACX,eAAS,KAAK,MAAM,WAAW;AAC/B,eAAS,KAAK,MAAM,eAAe;AAAA,IACrC;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAEX,gCAAU,MAAM;AACd,UAAM,YAAY,CAAC,MAAqB;AACtC,UAAI,EAAE,QAAQ,UAAU;AACtB,gBAAQ;AAAA,MACV;AAAA,IACF;AACA,WAAO,iBAAiB,WAAW,SAAS;AAC5C,WAAO,MAAM,OAAO,oBAAoB,WAAW,SAAS;AAAA,EAC9D,GAAG,CAAC,OAAO,CAAC;AAEZ,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAYA,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AAEA,QAAM,UACF,+BAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MAAI,WAAU;AAAA,MACV,SAAS;AAAA;AAAA,IACZ,+BAAAA,QAAA,cAAC,SAAI,WAAU,sDAAqD,eAAY,QAAM;AAAA,IACtF,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG,MAAK;AAAA,QACL,cAAW;AAAA,QACX,WAAW;AAAA,UACP;AAAA,UACA;AAAA,QACJ;AAAA,QACA,cAAW;AAAA,QACX,SAAS,CAAC,MAAM,EAAE,gBAAgB;AAAA;AAAA,MAEpC,+BAAAA,QAAA,cAAC,SAAI,WAAU,4CACZ,QAAQ,+BAAAA,QAAA,cAAC,QAAG,WAAU,0CAAwC,KAAM,IAAQ,+BAAAA,QAAA,cAAC,WAAG,GACjF,+BAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UAAO,SAAS;AAAA,UACT,WAAU;AAAA;AAAA,QAChB,+BAAAA,QAAA,cAAC,0BAAE,WAAU,WAAS;AAAA,QACtB,+BAAAA,QAAA,cAAC,UAAK,WAAU,aAAU,OAAK;AAAA,MACjC,CACF;AAAA,MACA,+BAAAA,QAAA,cAAC,SAAI,WAAU,6BAA2B,QAAS;AAAA,IACrD;AAAA,EACF;AAGJ,aAAO,gCAAa,SAAS,SAAS,IAAI;AAC5C;AAEA,MAAM,cAAc;;;AC7FpB,IAAAC,iBAAyC;AACzC,IAAAC,oBAA2B;AAC3B,IAAAC,uBAAgB;AAehB,IAAMC,YAA2D;AAAA,EAC/D,IAAI;AAAA,IACF,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,IACL,QAAQ;AAAA,EACV;AAAA,EACA,IAAI;AAAA,IACF,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,IACL,QAAQ;AAAA,EACV;AAAA,EACA,IAAI;AAAA,IACF,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,IACL,QAAQ;AAAA,EACV;AAAA,EACA,IAAI;AAAA,IACF,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,IACL,QAAQ;AAAA,EACV;AAAA,EACA,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,IACL,QAAQ;AAAA,EACV;AACF;AAEA,IAAM,mBAAmD;AAAA,EACvD,MAAM;AAAA,EACN,OAAO;AAAA,EACP,KAAK;AAAA,EACL,QAAQ;AACV;AAEA,IAAM,oBAA8E;AAAA,EAClF,MAAM,EAAC,MAAM,iBAAiB,QAAQ,oBAAmB;AAAA,EACzD,OAAO,EAAC,MAAM,iBAAiB,QAAQ,mBAAkB;AAAA,EACzD,KAAK,EAAC,MAAM,iBAAiB,QAAQ,oBAAmB;AAAA,EACxD,QAAQ,EAAC,MAAM,iBAAiB,QAAQ,mBAAkB;AAC5D;AAEO,IAAM,SAAgC,CAAC;AAAA,EAC5C;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA;AACF,MAAM;AACJ,QAAM,CAAC,SAAS,UAAU,QAAI,yBAAS,KAAK;AAE5C,gCAAU,MAAM;AACd,eAAW,IAAI;AAAA,EACjB,GAAG,CAAC,CAAC;AAEL,gCAAU,MAAM;AACd,QAAI,QAAQ;AACV,YAAM,iBAAiB,OAAO,aAAa,SAAS,gBAAgB;AACpE,eAAS,KAAK,MAAM,WAAW;AAC/B,eAAS,KAAK,MAAM,eAAe,GAAG,cAAc;AAAA,IACtD,OAAO;AACL,eAAS,KAAK,MAAM,WAAW;AAC/B,eAAS,KAAK,MAAM,eAAe;AAAA,IACrC;AACA,WAAO,MAAM;AACX,eAAS,KAAK,MAAM,WAAW;AAC/B,eAAS,KAAK,MAAM,eAAe;AAAA,IACrC;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAEX,gCAAU,MAAM;AACd,UAAM,YAAY,CAAC,MAAqB;AACtC,UAAI,EAAE,QAAQ,UAAU;AACtB,gBAAQ;AAAA,MACV;AAAA,IACF;AACA,WAAO,iBAAiB,WAAW,SAAS;AAC5C,WAAO,MAAM,OAAO,oBAAoB,WAAW,SAAS;AAAA,EAC9D,GAAG,CAAC,OAAO,CAAC;AAEZ,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,QAAM,UACF,+BAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACG,WAAW;AAAA,QACP;AAAA,QACA,SAAS,wBAAwB;AAAA,MACrC;AAAA;AAAA,IAGF,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG,WAAW;AAAA,UACP;AAAA,UACA,SAAS,gBAAgB;AAAA,QAC7B;AAAA,QACA,SAAS;AAAA,QACT,eAAY;AAAA;AAAA,IAChB;AAAA,IAGA,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG,MAAK;AAAA,QACL,cAAW;AAAA,QACX,WAAW;AAAA,UACP;AAAA,UACA;AAAA,UACA,iBAAiB,QAAQ;AAAA,UACzBD,UAAS,IAAI,EAAE,QAAQ;AAAA,UACvB,aAAa,UAAU;AAAA,UACvB,aAAa,WAAW;AAAA,UACxB,aAAa,SAAS;AAAA,UACtB,aAAa,YAAY;AAAA,UACzB,SAAS,kBAAkB,QAAQ,EAAE,OAAO,kBAAkB,QAAQ,EAAE;AAAA,UACxE;AAAA,QACJ;AAAA;AAAA,MAGF,+BAAAC,QAAA,cAAC,SAAI,WAAU,qEACZ,QACG,+BAAAA,QAAA,cAAC,QAAG,WAAU,0CAAwC,KAAM,IAE5D,+BAAAA,QAAA,cAAC,WAAG,GAER,+BAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACG,SAAS;AAAA,UACT,WAAU;AAAA;AAAA,QAEZ,+BAAAA,QAAA,cAAC,0BAAE,WAAU,WAAS;AAAA,QACtB,+BAAAA,QAAA,cAAC,UAAK,WAAU,aAAU,OAAK;AAAA,MACjC,CACF;AAAA,MAGA,+BAAAA,QAAA,cAAC,SAAI,WAAU,8BAA4B,QAAS;AAAA,IACtD;AAAA,EACF;AAGJ,aAAO,gCAAa,SAAS,SAAS,IAAI;AAC5C;AAEA,OAAO,cAAc;;;ACvKrB,IAAAC,iBAAqE;AAsBrE,IAAMC,oBAA0E;AAAA,EAC9E,KAAK;AAAA,IACH,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,KAAK;AAAA,EACP;AAAA,EACA,QAAQ;AAAA,IACN,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,KAAK;AAAA,EACP;AAAA,EACA,MAAM;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,KAAK;AAAA,EACP;AAAA,EACA,OAAO;AAAA,IACL,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,KAAK;AAAA,EACP;AACF;AAEO,IAAM,UAAkC,CAAC;AAAA,EAC9C;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,MAAM;AAAA,EACN;AAAA,EACA,sBAAsB;AACxB,MAAM;AACJ,QAAM,CAAC,cAAc,eAAe,QAAI,yBAAS,KAAK;AACtD,QAAM,eAAe,mBAAmB;AACxC,QAAM,SAAS,eAAe,iBAAiB;AAE/C,QAAM,mBAAe,uBAAuB,IAAI;AAChD,QAAM,aAAS,sBAAM;AAErB,QAAM,gBAAY;AAAA,IACd,CAAC,YAAqB;AACpB,UAAI,CAAC,cAAc;AACjB,wBAAgB,OAAO;AAAA,MACzB;AACA,qBAAe,OAAO;AAAA,IACxB;AAAA,IACA,CAAC,cAAc,YAAY;AAAA,EAC/B;AAGA,gCAAU,MAAM;AACd,QAAI,CAAC,UAAU,CAAC,qBAAqB;AACnC;AAAA,IACF;AAEA,UAAM,qBAAqB,CAAC,MAAkB;AAC5C,UAAI,aAAa,WAAW,CAAC,aAAa,QAAQ,SAAS,EAAE,MAAc,GAAG;AAC5E,kBAAU,KAAK;AAAA,MACjB;AAAA,IACF;AAEA,aAAS,iBAAiB,aAAa,kBAAkB;AACzD,WAAO,MAAM,SAAS,oBAAoB,aAAa,kBAAkB;AAAA,EAC3E,GAAG,CAAC,QAAQ,qBAAqB,SAAS,CAAC;AAG3C,gCAAU,MAAM;AACd,QAAI,CAAC,QAAQ;AACX;AAAA,IACF;AAEA,UAAM,eAAe,CAAC,MAAqB;AACzC,UAAI,EAAE,QAAQ,UAAU;AACtB,kBAAU,KAAK;AAAA,MACjB;AAAA,IACF;AAEA,aAAS,iBAAiB,WAAW,YAAY;AACjD,WAAO,MAAM,SAAS,oBAAoB,WAAW,YAAY;AAAA,EACnE,GAAG,CAAC,QAAQ,SAAS,CAAC;AAEtB,QAAM,qBAAqB,MAAM;AAC/B,cAAU,CAAC,MAAM;AAAA,EACnB;AAEA,QAAM,iBAAiB,eAAAC,QAAM,aAAa,SAAoC;AAAA,IAC5E,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,iBAAiB,GAAG,MAAM;AAAA,IAC1B,IAAI,GAAG,MAAM;AAAA,EACf,CAAC;AAED,SACI,+BAAAA,QAAA,cAAC,SAAI,KAAK,cAAc,WAAU,2BAC/B,gBACA,UACG,+BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACG,IAAI,GAAG,MAAM;AAAA,MACb,MAAK;AAAA,MACL,mBAAiB,GAAG,MAAM;AAAA,MAC1B,WAAW;AAAA,QACP;AAAA,QACA;AAAA,QACA;AAAA,QACAD,kBAAiB,QAAQ,EAAE,KAAK;AAAA,MACpC;AAAA;AAAA,IAED;AAAA,EACH,CAEN;AAEN;AAEA,QAAQ,cAAc;;;ACzItB,IAAAE,iBAAiC;AAgB1B,IAAM,gBAA8C,CAAC;AAAA,EAC1D,QAAQ;AAAA,EACR;AAAA,EACA,cAAc;AAAA,EACd,aAAa;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA,iBAAiB;AAAA,EACjB,YAAY;AAAA,EACZ,GAAG;AACL,MAAM;AACJ,QAAM,mBAAe,4BAAY,MAAM;AACrC,eAAW;AACX,YAAQ;AAAA,EACV,GAAG,CAAC,UAAU,OAAO,CAAC;AAEtB,QAAM,oBAAgB,4BAAY,YAAY;AAC5C,UAAM,UAAU;AAChB,YAAQ;AAAA,EACV,GAAG,CAAC,WAAW,OAAO,CAAC;AAEvB,SACI,+BAAAC,QAAA,cAAC,SAAM,OAAc,SAAmB,GAAG,SACxC,eACG,+BAAAA,QAAA,cAAC,OAAE,WAAU,8BAA4B,WAAY,GAEzD,+BAAAA,QAAA,cAAC,SAAI,WAAU,4BACb,+BAAAA,QAAA,cAAC,UAAO,SAAQ,YAAW,SAAS,cAAc,UAAU,aACzD,UACH,GACA,+BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACG,SAAS;AAAA,MACT,SAAS;AAAA,MACT,SAAS;AAAA;AAAA,IAEV;AAAA,EACH,CACF,CACF;AAEN;AAEA,cAAc,cAAc;AASrB,IAAM,cAA0C,CAAC;AAAA,EACtD,QAAQ;AAAA,EACR;AAAA,EACA,kBAAkB;AAAA,EAClB,UAAU;AAAA,EACV;AAAA,EACA,GAAG;AACL,MAAM;AACJ,QAAM,aAAa;AAAA,IACf,YAAY,aAAa;AAAA,IACzB,YAAY,WAAW;AAAA,EAC3B;AAEA,SACI,+BAAAA,QAAA,cAAC,SAAM,SAAmB,GAAG,SAC3B,+BAAAA,QAAA,cAAC,QAAG,WAAW,GAAG,8BAA8B,UAAU,KAAI,KAAM,GACnE,eACG,+BAAAA,QAAA,cAAC,OAAE,WAAU,8BAA4B,WAAY,GAEzD,+BAAAA,QAAA,cAAC,SAAI,WAAU,sBACb,+BAAAA,QAAA,cAAC,UAAO,SAAQ,WAAU,SAAS,WAChC,eACH,CACF,CACF;AAEN;AAEA,YAAY,cAAc;AAcnB,IAAM,eAA4C,CAAC;AAAA,EACxD,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA,eAAe;AAAA,EACf,aAAa;AAAA,EACb,aAAa;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ,GAAG;AACL,MAAM;AACJ,QAAM,CAAC,OAAO,QAAQ,IAAI,eAAAA,QAAM,SAAS,YAAY;AAErD,QAAM,mBAAe,4BAAY,MAAM;AACrC,eAAW;AACX,YAAQ;AAAA,EACV,GAAG,CAAC,UAAU,OAAO,CAAC;AAEtB,QAAM,mBAAe;AAAA,IACjB,OAAO,MAAuB;AAC5B,QAAE,eAAe;AACjB,YAAM,SAAS,KAAK;AACpB,cAAQ;AAAA,IACV;AAAA,IACA,CAAC,UAAU,OAAO,OAAO;AAAA,EAC7B;AAEA,SACI,+BAAAA,QAAA,cAAC,SAAM,OAAc,SAAmB,GAAG,SACzC,+BAAAA,QAAA,cAAC,UAAK,UAAU,gBACb,eACG,+BAAAA,QAAA,cAAC,OAAE,WAAU,8BAA4B,WAAY,GAEzD,+BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACG,MAAK;AAAA,MACL;AAAA,MACA,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,KAAK;AAAA,MACxC;AAAA,MACA,WAAW;AAAA,QACP;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACJ;AAAA,MACA,WAAS;AAAA;AAAA,EACb,GACA,+BAAAA,QAAA,cAAC,SAAI,WAAU,4BACb,+BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACG,MAAK;AAAA,MACL,SAAQ;AAAA,MACR,SAAS;AAAA,MACT,UAAU;AAAA;AAAA,IAEX;AAAA,EACH,GACA,+BAAAA,QAAA,cAAC,UAAO,MAAK,UAAS,SAAQ,aAAY,SAAS,aAChD,UACH,CACF,CACF,CACF;AAEN;AAEA,aAAa,cAAc;;;AChL3B,IAAAC,iBAA6E;AAU7E,IAAM,kBAAc,8BAAuC,IAAI;AAE/D,SAAS,iBAAiB;AACxB,QAAM,cAAU,2BAAW,WAAW;AACtC,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,qDAAqD;AAAA,EACvE;AACA,SAAO;AACT;AAYO,IAAM,OAAO,eAAAC,QAAM;AAAA,EACtB,CAAC,EAAC,cAAc,OAAO,eAAe,UAAU,WAAW,GAAG,MAAK,GAAG,QAAQ;AAC5E,UAAM,CAAC,eAAe,gBAAgB,QAAI,yBAAS,gBAAgB,EAAE;AACrE,UAAM,eAAe,UAAU;AAC/B,UAAM,YAAY,eAAe,QAAQ;AACzC,UAAM,aAAS,sBAAM;AAErB,UAAM,mBAAe;AAAA,MACjB,CAAC,OAAe;AACd,YAAI,CAAC,cAAc;AACjB,2BAAiB,EAAE;AAAA,QACrB;AACA,wBAAgB,EAAE;AAAA,MACpB;AAAA,MACA,CAAC,cAAc,aAAa;AAAA,IAChC;AAEA,WACI,+BAAAA,QAAA,cAAC,YAAY,UAAZ,EAAqB,OAAO,EAAC,WAAW,cAAc,OAAM,KAC3D,+BAAAA,QAAA,cAAC,SAAI,KAAU,WAAW,GAAG,UAAU,SAAS,GAAI,GAAG,SACpD,QACH,CACF;AAAA,EAEN;AACJ;AAEA,KAAK,cAAc;AAMZ,IAAM,UAAU,eAAAA,QAAM;AAAA,EACzB,CAAC,EAAC,UAAU,WAAW,GAAG,MAAK,GAAG,QAAQ;AACxC,WACI,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,MAAK;AAAA,QACL,WAAW;AAAA,UACP;AAAA,UACA;AAAA,QACJ;AAAA,QACC,GAAG;AAAA;AAAA,MAEL;AAAA,IACH;AAAA,EAEN;AACJ;AAEA,QAAQ,cAAc;AAQf,IAAM,MAAM,eAAAA,QAAM;AAAA,EACrB,CAAC,EAAC,OAAO,UAAU,WAAW,UAAU,GAAG,MAAK,GAAG,QAAQ;AACzD,UAAM,EAAC,WAAW,cAAc,OAAM,IAAI,eAAe;AACzD,UAAM,WAAW,cAAc;AAC/B,UAAM,UAAU,GAAG,MAAM,UAAU,KAAK;AACxC,UAAM,QAAQ,GAAG,MAAM,QAAQ,KAAK;AAEpC,WACI,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,IAAI;AAAA,QACJ,MAAK;AAAA,QACL,MAAK;AAAA,QACL,iBAAe;AAAA,QACf,iBAAe;AAAA,QACf,UAAU,WAAW,IAAI;AAAA,QACzB;AAAA,QACA,SAAS,MAAM,aAAa,KAAK;AAAA,QACjC,WAAW;AAAA,UACP;AAAA,UACA;AAAA,UACA;AAAA,UACA,WACM,0BACA;AAAA,UACN,YAAY;AAAA,UACZ;AAAA,QACJ;AAAA,QACC,GAAG;AAAA;AAAA,MAEL;AAAA,IACH;AAAA,EAEN;AACJ;AAEA,IAAI,cAAc;AAUX,IAAM,WAAW,eAAAA,QAAM;AAAA,EAC1B,CAAC,EAAC,OAAO,aAAa,OAAO,UAAU,WAAW,GAAG,MAAK,GAAG,QAAQ;AACnE,UAAM,EAAC,WAAW,OAAM,IAAI,eAAe;AAC3C,UAAM,WAAW,cAAc;AAC/B,UAAM,UAAU,GAAG,MAAM,UAAU,KAAK;AACxC,UAAM,QAAQ,GAAG,MAAM,QAAQ,KAAK;AAEpC,QAAI,CAAC,YAAY,CAAC,YAAY;AAC5B,aAAO;AAAA,IACT;AAEA,WACI,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,IAAI;AAAA,QACJ,MAAK;AAAA,QACL,mBAAiB;AAAA,QACjB,UAAU;AAAA,QACV,QAAQ,CAAC;AAAA,QACT,WAAW;AAAA,UACP;AAAA,UACA,CAAC,YAAY;AAAA,UACb;AAAA,QACJ;AAAA,QACC,GAAG;AAAA;AAAA,MAEL;AAAA,IACH;AAAA,EAEN;AACJ;AAEA,SAAS,cAAc;;;ACvKvB,IAAAC,iBAA6E;AAC7E,IAAAC,uBAA0B;AAU1B,IAAM,uBAAmB,8BAA4C,IAAI;AAEzE,SAAS,sBAAsB;AAC7B,QAAM,cAAU,2BAAW,gBAAgB;AAC3C,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,gEAAgE;AAAA,EAClF;AACA,SAAO;AACT;AAcO,IAAM,YAAY,eAAAC,QAAM;AAAA,EAC3B,CACI,EAAC,OAAO,UAAU,cAAc,OAAO,eAAe,UAAU,WAAW,GAAG,MAAK,GACnF,QACC;AACH,UAAM,CAAC,eAAe,gBAAgB,QAAI,yBAAsB,MAAM;AACpE,UAAI,cAAc;AAChB,eAAO,IAAI,IAAI,MAAM,QAAQ,YAAY,IAAI,eAAe,CAAC,YAAY,CAAC;AAAA,MAC5E;AACA,aAAO,oBAAI,IAAI;AAAA,IACjB,CAAC;AAED,UAAM,eAAe,UAAU;AAC/B,UAAM,gBAAgB,eAChB,IAAI,IAAI,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC,IAC9C;AAEN,UAAM,iBAAa;AAAA,MACf,CAAC,OAAe;AACd,cAAM,SAAS,IAAI,IAAI,aAAa;AAEpC,YAAI,OAAO,IAAI,EAAE,GAAG;AAClB,iBAAO,OAAO,EAAE;AAAA,QAClB,OAAO;AACL,cAAI,SAAS,UAAU;AACrB,mBAAO,MAAM;AAAA,UACf;AACA,iBAAO,IAAI,EAAE;AAAA,QACf;AAEA,YAAI,CAAC,cAAc;AACjB,2BAAiB,MAAM;AAAA,QACzB;AAEA,cAAM,WAAW,MAAM,KAAK,MAAM;AAClC,wBAAgB,SAAS,WAAW,SAAS,CAAC,KAAK,KAAK,QAAQ;AAAA,MAClE;AAAA,MACA,CAAC,eAAe,MAAM,cAAc,aAAa;AAAA,IACrD;AAEA,WACI,+BAAAA,QAAA,cAAC,iBAAiB,UAAjB,EAA0B,OAAO,EAAC,eAAe,YAAY,KAAI,KAChE,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,WAAW,GAAG,yCAAyC,SAAS;AAAA,QAC/D,GAAG;AAAA;AAAA,MAEL;AAAA,IACH,CACF;AAAA,EAEN;AACJ;AAEA,UAAU,cAAc;AAUxB,IAAM,2BAAuB,8BAA2D,IAAI;AAErF,IAAM,gBAAgB,eAAAA,QAAM;AAAA,EAC/B,CAAC,EAAC,OAAO,WAAW,OAAO,UAAU,WAAW,GAAG,MAAK,GAAG,QAAQ;AACjE,WACI,+BAAAA,QAAA,cAAC,qBAAqB,UAArB,EAA8B,OAAO,EAAC,OAAO,SAAQ,KACpD,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,cAAY,oBAAoB,EAAE,cAAc,IAAI,KAAK,IAAI,SAAS;AAAA,QACtE,WAAW,GAAG,eAAe,SAAS;AAAA,QACrC,GAAG;AAAA;AAAA,MAEL;AAAA,IACH,CACF;AAAA,EAEN;AACJ;AAEA,cAAc,cAAc;AAMrB,IAAM,mBAAmB,eAAAA,QAAM;AAAA,EAClC,CAAC,EAAC,UAAU,WAAW,GAAG,MAAK,GAAG,QAAQ;AACxC,UAAM,EAAC,eAAe,WAAU,IAAI,oBAAoB;AACxD,UAAM,kBAAc,2BAAW,oBAAoB;AACnD,UAAM,aAAS,sBAAM;AAErB,QAAI,CAAC,aAAa;AAChB,YAAM,IAAI,MAAM,uDAAuD;AAAA,IACzE;AAEA,UAAM,EAAC,OAAO,SAAQ,IAAI;AAC1B,UAAM,aAAa,cAAc,IAAI,KAAK;AAE1C,WACI,+BAAAA,QAAA,cAAC,QAAG,WAAU,SACZ,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,MAAK;AAAA,QACL,IAAI,GAAG,MAAM,YAAY,KAAK;AAAA,QAC9B,iBAAe;AAAA,QACf,iBAAe,GAAG,MAAM,YAAY,KAAK;AAAA,QACzC;AAAA,QACA,SAAS,MAAM,WAAW,KAAK;AAAA,QAC/B,WAAW;AAAA,UACP;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,YAAY;AAAA,UACZ;AAAA,QACJ;AAAA,QACC,GAAG;AAAA;AAAA,MAEN,+BAAAA,QAAA,cAAC,cAAM,QAAS;AAAA,MAChB,+BAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACG,WAAW;AAAA,YACP;AAAA,YACA,cAAc;AAAA,UAClB;AAAA;AAAA,MACJ;AAAA,IACF,CACF;AAAA,EAEN;AACJ;AAEA,iBAAiB,cAAc;AAMxB,IAAM,mBAAmB,eAAAA,QAAM;AAAA,EAClC,CAAC,EAAC,UAAU,WAAW,GAAG,MAAK,GAAG,QAAQ;AACxC,UAAM,EAAC,cAAa,IAAI,oBAAoB;AAC5C,UAAM,kBAAc,2BAAW,oBAAoB;AACnD,UAAM,aAAS,sBAAM;AAErB,QAAI,CAAC,aAAa;AAChB,YAAM,IAAI,MAAM,uDAAuD;AAAA,IACzE;AAEA,UAAM,EAAC,MAAK,IAAI;AAChB,UAAM,aAAa,cAAc,IAAI,KAAK;AAE1C,WACI,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,IAAI,GAAG,MAAM,YAAY,KAAK;AAAA,QAC9B,MAAK;AAAA,QACL,mBAAiB,GAAG,MAAM,YAAY,KAAK;AAAA,QAC3C,QAAQ,CAAC;AAAA,QACT,WAAW;AAAA,UACP;AAAA,UACA,aAAa,oBAAoB;AAAA,UACjC;AAAA,QACJ;AAAA,QACC,GAAG;AAAA;AAAA,MAEN,+BAAAA,QAAA,cAAC,SAAI,WAAU,mCAAiC,QAAS;AAAA,IAC3D;AAAA,EAEN;AACJ;AAEA,iBAAiB,cAAc;;;AChN/B,IAAAC,iBAQO;AAWP,IAAM,kBAAc,8BAAuC,IAAI;AAE/D,SAAS,iBAAiB;AACxB,QAAM,cAAU,2BAAW,WAAW;AACtC,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,qDAAqD;AAAA,EACvE;AACA,SAAO;AACT;AASO,IAAM,OAA4B,CAAC,EAAC,UAAU,MAAM,aAAY,MAAM;AAC3E,QAAM,CAAC,cAAc,eAAe,QAAI,yBAAS,KAAK;AACtD,QAAM,eAAe,SAAS;AAC9B,QAAM,SAAS,eAAe,OAAO;AACrC,QAAM,aAAS,sBAAM;AAErB,QAAM,gBAAY;AAAA,IACd,CAAC,YAAqB;AACpB,UAAI,CAAC,cAAc;AACjB,wBAAgB,OAAO;AAAA,MACzB;AACA,qBAAe,OAAO;AAAA,IACxB;AAAA,IACA,CAAC,cAAc,YAAY;AAAA,EAC/B;AAEA,SACI,+BAAAC,QAAA;AAAA,IAAC,YAAY;AAAA,IAAZ;AAAA,MACG,OAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA,WAAW,GAAG,MAAM;AAAA,QACpB,QAAQ,GAAG,MAAM;AAAA,MACnB;AAAA;AAAA,IAEF,+BAAAA,QAAA,cAAC,SAAI,WAAU,2BAAyB,QAAS;AAAA,EACnD;AAEN;AAEA,KAAK,cAAc;AAOZ,IAAM,cAAc,eAAAA,QAAM;AAAA,EAC7B,CAAC,EAAC,UAAU,WAAW,SAAS,GAAG,MAAK,GAAG,QAAQ;AACjD,UAAM,EAAC,QAAQ,WAAW,WAAW,OAAM,IAAI,eAAe;AAE9D,UAAM,cAAc,CAAC,MAA2C;AAC9D,QAAE,eAAe;AACjB,gBAAU,CAAC,MAAM;AACjB,YAAM,UAAU,CAAC;AAAA,IACnB;AAEA,WACI,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,IAAI;AAAA,QACJ,MAAK;AAAA,QACL,iBAAc;AAAA,QACd,iBAAe;AAAA,QACf,iBAAe;AAAA,QACf,SAAS;AAAA,QACT,WAAW;AAAA,UACP;AAAA,UACA;AAAA,QACJ;AAAA,QACC,GAAG;AAAA;AAAA,MAEL;AAAA,IACH;AAAA,EAEN;AACJ;AAEA,YAAY,cAAc;AAQnB,IAAM,cAAc,eAAAA,QAAM;AAAA,EAC7B,CAAC,EAAC,UAAU,WAAW,QAAQ,SAAS,OAAO,UAAU,GAAG,MAAK,GAAG,QAAQ;AAC1E,UAAM,EAAC,QAAQ,WAAW,WAAW,OAAM,IAAI,eAAe;AAC9D,UAAM,cAAU,uBAAuB,IAAI;AAG3C,kCAAU,MAAM;AACd,UAAI,CAAC,QAAQ;AACX;AAAA,MACF;AAEA,YAAM,qBAAqB,CAAC,MAAkB;AAC5C,cAAM,UAAU,SAAS,eAAe,SAAS;AACjD,YACI,QAAQ,WACR,CAAC,QAAQ,QAAQ,SAAS,EAAE,MAAc,KAC1C,WACA,CAAC,QAAQ,SAAS,EAAE,MAAc,GACpC;AACA,oBAAU,KAAK;AAAA,QACjB;AAAA,MACF;AAEA,YAAM,eAAe,CAAC,MAAqB;AACzC,YAAI,EAAE,QAAQ,UAAU;AACtB,oBAAU,KAAK;AAAA,QACjB;AAAA,MACF;AAEA,eAAS,iBAAiB,aAAa,kBAAkB;AACzD,eAAS,iBAAiB,WAAW,YAAY;AAEjD,aAAO,MAAM;AACX,iBAAS,oBAAoB,aAAa,kBAAkB;AAC5D,iBAAS,oBAAoB,WAAW,YAAY;AAAA,MACtD;AAAA,IACF,GAAG,CAAC,QAAQ,WAAW,SAAS,CAAC;AAEjC,QAAI,CAAC,QAAQ;AACX,aAAO;AAAA,IACT;AAEA,UAAM,mBAAmB;AAAA,MACvB,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,KAAK;AAAA,IACP;AAEA,UAAM,cAAc;AAAA,MAClB,KAAK;AAAA,MACL,QAAQ;AAAA,IACV;AAEA,WACI,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG,KAAK,CAAC,SAAS;AACb,kBAAQ,UAAU;AAClB,cAAI,OAAO,QAAQ,YAAY;AAC7B,gBAAI,IAAI;AAAA,UACV,WAAW,KAAK;AACd,gBAAI,UAAU;AAAA,UAChB;AAAA,QACF;AAAA,QACA,IAAI;AAAA,QACJ,MAAK;AAAA,QACL,mBAAiB;AAAA,QACjB,WAAW;AAAA,UACP;AAAA,UACA;AAAA,UACA;AAAA,UACA,iBAAiB,KAAK;AAAA,UACtB,YAAY,IAAI;AAAA,UAChB;AAAA,QACJ;AAAA,QACC,GAAG;AAAA;AAAA,MAEL;AAAA,IACH;AAAA,EAEN;AACJ;AAEA,YAAY,cAAc;AAQnB,IAAM,WAAW,eAAAA,QAAM;AAAA,EAC1B,CAAC,EAAC,UAAU,WAAW,MAAM,aAAa,UAAU,SAAS,GAAG,MAAK,GAAG,QAAQ;AAC9E,UAAM,EAAC,UAAS,IAAI,eAAe;AAEnC,UAAM,cAAc,CAAC,MAA2C;AAC9D,UAAI,UAAU;AACZ;AAAA,MACF;AACA,gBAAU,CAAC;AACX,gBAAU,KAAK;AAAA,IACjB;AAEA,WACI,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,MAAK;AAAA,QACL,MAAK;AAAA,QACL;AAAA,QACA,SAAS;AAAA,QACT,WAAW;AAAA,UACP;AAAA,UACA;AAAA,UACA,cACM,iCACA;AAAA,UACN;AAAA,UACA,YAAY;AAAA,UACZ;AAAA,QACJ;AAAA,QACC,GAAG;AAAA;AAAA,MAEL,QAAQ,+BAAAA,QAAA,cAAC,UAAK,WAAU,sBAAoB,IAAK;AAAA,MACjD;AAAA,IACH;AAAA,EAEN;AACJ;AAEA,SAAS,cAAc;AAGhB,IAAM,gBAAgB,eAAAA,QAAM,WAGjC,CAAC,EAAC,WAAW,GAAG,MAAK,GAAG,QACtB,+BAAAA,QAAA;AAAA,EAAC;AAAA;AAAA,IACG;AAAA,IACA,MAAK;AAAA,IACL,WAAW,GAAG,oBAAoB,SAAS;AAAA,IAC1C,GAAG;AAAA;AACR,CACH;AAED,cAAc,cAAc;AAGrB,IAAM,YAAY,eAAAA,QAAM,WAG7B,CAAC,EAAC,WAAW,UAAU,GAAG,MAAK,GAAG,QAChC,+BAAAA,QAAA;AAAA,EAAC;AAAA;AAAA,IACG;AAAA,IACA,WAAW,GAAG,+CAA+C,SAAS;AAAA,IACrE,GAAG;AAAA;AAAA,EAEL;AACH,CACH;AAED,UAAU,cAAc;;;AC/QxB,IAAAC,iBAAkB;AASX,IAAM,SAAS,eAAAC,QAAM;AAAA,EACxB,CAAC,EAAC,QAAQ,OAAO,WAAW,MAAM,WAAW,UAAU,GAAG,MAAK,GAAG,QAAQ;AACxE,WACI,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,WAAW;AAAA,UACP;AAAA,UACA,YAAY;AAAA,UACZ,SAAS;AAAA,UACT;AAAA,QACJ;AAAA,QACC,GAAG;AAAA;AAAA,MAEN,+BAAAA,QAAA,cAAC,SAAI,WAAU,uCAAqC,QAAS;AAAA,IAC/D;AAAA,EAEN;AACJ;AAEA,OAAO,cAAc;AAMd,IAAM,cAAc,eAAAA,QAAM;AAAA,EAC7B,CAAC,EAAC,WAAW,UAAU,GAAG,MAAK,GAAG,QAAQ;AACxC,WACI,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,WAAW,GAAG,2BAA2B,SAAS;AAAA,QACjD,GAAG;AAAA;AAAA,MAEL;AAAA,IACH;AAAA,EAEN;AACJ;AAEA,YAAY,cAAc;AAOnB,IAAM,gBAAgB,eAAAA,QAAM;AAAA,EAC/B,CAAC,EAAC,WAAW,UAAU,WAAW,UAAU,GAAG,MAAK,GAAG,QAAQ;AAC7D,UAAM,kBAAkB;AAAA,MACtB,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,KAAK;AAAA,IACP;AAEA,WACI,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,WAAW;AAAA,UACP;AAAA,UACA,gBAAgB,QAAQ;AAAA,UACxB;AAAA,QACJ;AAAA,QACC,GAAG;AAAA;AAAA,MAEL;AAAA,IACH;AAAA,EAEN;AACJ;AAEA,cAAc,cAAc;AAOrB,IAAM,aAAa,eAAAA,QAAM;AAAA,EAC5B,CAAC,EAAC,SAAS,OAAO,WAAW,UAAU,GAAG,MAAK,GAAG,QAAQ;AACxD,WACI,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,WAAW;AAAA,UACP;AAAA,UACA;AAAA,QACJ;AAAA,QACC,GAAG;AAAA;AAAA,MAEL;AAAA,IACH;AAAA,EAEN;AACJ;AAEA,WAAW,cAAc;AAOlB,IAAM,aAAa,eAAAA,QAAM;AAAA,EAC5B,CAAC,EAAC,SAAS,OAAO,WAAW,UAAU,GAAG,MAAK,GAAG,QAAQ;AACxD,WACI,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,WAAW;AAAA,UACP;AAAA,UACA,SAAS,cAAc;AAAA,UACvB;AAAA,QACJ;AAAA,QACC,GAAG;AAAA;AAAA,MAEL;AAAA,IACH;AAAA,EAEN;AACJ;AAEA,WAAW,cAAc;AAGlB,IAAM,gBAAgB,eAAAA,QAAM,WAGjC,CAAC,EAAC,WAAW,GAAG,MAAK,GAAG,QACtB,+BAAAA,QAAA;AAAA,EAAC;AAAA;AAAA,IACG;AAAA,IACA,WAAW,GAAG,wBAAwB,SAAS;AAAA,IAC9C,GAAG;AAAA;AACR,CACH;AAED,cAAc,cAAc;;;AC9I5B,IAAAC,iBAAkB;AAClB,IAAAC,uBAA2B;AAQpB,IAAM,aAAa,eAAAC,QAAM;AAAA,EAC5B,CAAC,EAAC,WAAW,WAAW,UAAU,GAAG,MAAK,GAAG,QAAQ;AACnD,UAAM,QAAQ,eAAAA,QAAM,SAAS,QAAQ,QAAQ;AAC7C,UAAM,mBAAmB,+BAAAA,QAAA,cAAC,qCAAa,WAAU,oBAAkB;AAEnE,WACI,+BAAAA,QAAA,cAAC,SAAI,KAAU,cAAW,cAAa,WAAuB,GAAG,SAC/D,+BAAAA,QAAA,cAAC,QAAG,WAAU,6BACX,MAAM,IAAI,CAAC,OAAO,UACf,+BAAAA,QAAA,cAAC,QAAG,KAAK,OAAO,WAAU,6BACvB,OACA,QAAQ,MAAM,SAAS,KACpB,+BAAAA,QAAA,cAAC,UAAK,eAAY,UAAQ,aAAa,gBAAiB,CAE9D,CACH,CACH,CACF;AAAA,EAEN;AACJ;AAEA,WAAW,cAAc;AAOlB,IAAM,iBAAiB,eAAAA,QAAM;AAAA,EAChC,CAAC,EAAC,UAAU,OAAO,WAAW,UAAU,GAAG,MAAK,GAAG,QAAQ;AACzD,WACI,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,gBAAc,UAAU,SAAS;AAAA,QACjC,WAAW;AAAA,UACP;AAAA,UACA,UAAU,2BAA2B;AAAA,UACrC;AAAA,QACJ;AAAA,QACC,GAAG;AAAA;AAAA,MAET;AAAA,IACH;AAAA,EAEF;AACJ;AAEA,eAAe,cAAc;AAMtB,IAAM,iBAAiB,eAAAA,QAAM;AAAA,EAChC,CAAC,EAAC,WAAW,UAAU,GAAG,MAAK,GAAG,QAAQ;AACxC,WACI,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,WAAW;AAAA,UACP;AAAA,UACA;AAAA,QACJ;AAAA,QACC,GAAG;AAAA;AAAA,MAEL;AAAA,IACH;AAAA,EAEN;AACJ;AAEA,eAAe,cAAc;;;AChF7B,IAAAC,iBAAkB;AAClB,IAAAC,uBAAwD;AAWxD,SAAS,mBACL,aACA,YACA,cACuB;AACzB,QAAM,aAAa,eAAe,IAAI;AAEtC,MAAI,cAAc,YAAY;AAC5B,WAAO,MAAM,KAAK,EAAC,QAAQ,WAAU,GAAG,CAAC,GAAG,MAAM,IAAI,CAAC;AAAA,EACzD;AAEA,QAAM,mBAAmB,KAAK,IAAI,cAAc,cAAc,CAAC;AAC/D,QAAM,oBAAoB,KAAK,IAAI,cAAc,cAAc,UAAU;AAEzE,QAAM,mBAAmB,mBAAmB;AAC5C,QAAM,oBAAoB,oBAAoB,aAAa;AAE3D,MAAI,CAAC,oBAAoB,mBAAmB;AAC1C,UAAM,gBAAgB,IAAI,IAAI;AAC9B,UAAM,YAAY,MAAM,KAAK,EAAC,QAAQ,cAAa,GAAG,CAAC,GAAG,MAAM,IAAI,CAAC;AACrE,WAAO,CAAC,GAAG,WAAW,YAAY,UAAU;AAAA,EAC9C;AAEA,MAAI,oBAAoB,CAAC,mBAAmB;AAC1C,UAAM,iBAAiB,IAAI,IAAI;AAC/B,UAAM,aAAa,MAAM;AAAA,MACrB,EAAC,QAAQ,eAAc;AAAA,MACvB,CAAC,GAAG,MAAM,aAAa,iBAAiB,IAAI;AAAA,IAChD;AACA,WAAO,CAAC,GAAG,YAAY,GAAG,UAAU;AAAA,EACtC;AAEA,QAAM,cAAc,MAAM;AAAA,IACtB,EAAC,QAAQ,oBAAoB,mBAAmB,EAAC;AAAA,IACjD,CAAC,GAAG,MAAM,mBAAmB;AAAA,EACjC;AACA,SAAO,CAAC,GAAG,YAAY,GAAG,aAAa,YAAY,UAAU;AAC/D;AAEO,IAAM,aAAa,eAAAC,QAAM;AAAA,EAC5B,CACI;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA,eAAe;AAAA,IACf,YAAY;AAAA,IACZ;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACC;AACH,UAAM,QAAQ,mBAAmB,MAAM,YAAY,YAAY;AAE/D,UAAM,kBACF;AAIJ,WACI,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,MAAK;AAAA,QACL,cAAW;AAAA,QACX,WAAW,GAAG,2BAA2B,SAAS;AAAA,QACjD,GAAG;AAAA;AAAA,MAGN,+BAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACG,MAAK;AAAA,UACL,SAAS,MAAM,aAAa,OAAO,CAAC;AAAA,UACpC,UAAU,QAAQ;AAAA,UAClB,cAAW;AAAA,UACX,WAAW;AAAA,YACP;AAAA,YACA;AAAA,YACA,QAAQ,KAAK;AAAA,UACjB;AAAA;AAAA,QAEF,+BAAAA,QAAA,cAAC,oCAAY,WAAU,WAAS;AAAA,MAClC;AAAA,MAGC,MAAM;AAAA,QAAI,CAAC,SAAS,UACb,YAAY,aACR,+BAAAA,QAAA;AAAA,UAAC;AAAA;AAAA,YACG,KAAK,YAAY,KAAK;AAAA,YACtB,WAAU;AAAA;AAAA,UAExB,+BAAAA,QAAA,cAAC,uCAAe,WAAU,WAAS;AAAA,QACrC,IAEY,+BAAAA,QAAA;AAAA,UAAC;AAAA;AAAA,YACG,KAAK;AAAA,YACL,MAAK;AAAA,YACL,SAAS,MAAM,aAAa,OAAO;AAAA,YACnC,cAAY,cAAc,OAAO;AAAA,YACjC,gBAAc,SAAS,UAAU,SAAS;AAAA,YAC1C,WAAW;AAAA,cACP;AAAA,cACA,SAAS,UACH,kDACA;AAAA,YACV;AAAA;AAAA,UAED;AAAA,QACH;AAAA,MAEZ;AAAA,MAGA,+BAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACG,MAAK;AAAA,UACL,SAAS,MAAM,aAAa,OAAO,CAAC;AAAA,UACpC,UAAU,QAAQ;AAAA,UAClB,cAAW;AAAA,UACX,WAAW;AAAA,YACP;AAAA,YACA;AAAA,YACA,QAAQ,cAAc;AAAA,UAC1B;AAAA;AAAA,QAEF,+BAAAA,QAAA,cAAC,qCAAa,WAAU,WAAS;AAAA,MACnC;AAAA,IACF;AAAA,EAEN;AACJ;AAEA,WAAW,cAAc;;;AC7IzB,IAAAC,iBAAkB;AAClB,IAAAC,wBAAoB;AAkBb,IAAM,UAAU,eAAAC,QAAM;AAAA,EACzB,CAAC,EAAC,OAAO,aAAa,QAAQ,WAAW,GAAG,KAAI,GAAG,QAAQ;AACzD,UAAM,eAAe,MAAM,UAAU,UAAQ,KAAK,OAAO,WAAW;AAEpE,UAAM,eAAe,CAAC,UAAkB;AACtC,UAAI,QAAQ,cAAc;AACxB,eAAO;AAAA,MACT;AACA,UAAI,UAAU,cAAc;AAC1B,eAAO,UAAU;AAAA,MACnB;AACA,aAAO;AAAA,IACT;AAEA,WACI,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,WAAW,GAAG,4BAA4B,SAAS;AAAA,QAClD,GAAG;AAAA;AAAA,MAEL,MAAM,IAAI,CAAC,MAAM,UAAU;AAC1B,cAAM,QAAQ,aAAa,KAAK;AAChC,cAAM,SAAS,UAAU,MAAM,SAAS;AAExC,eACI,+BAAAA,QAAA,cAAC,eAAAA,QAAM,UAAN,EAAe,KAAK,KAAK,MACxB,+BAAAA,QAAA,cAAC,SAAI,WAAU,gCACb,+BAAAA,QAAA;AAAA,UAAC;AAAA;AAAA,YACG,WAAW;AAAA,cACP;AAAA,cACA,UAAU,cAAc;AAAA,cACxB,UAAU,aAAa;AAAA,cACvB,UAAU,WAAW;AAAA,cACrB,UAAU,YAAY;AAAA,YAC1B;AAAA;AAAA,UAED,UAAU,aACP,+BAAAA,QAAA,cAAC,+BAAM,WAAU,WAAS,IAE1B,+BAAAA,QAAA,cAAC,cAAM,QAAQ,CAAE;AAAA,QAEvB,GACA,+BAAAA,QAAA;AAAA,UAAC;AAAA;AAAA,YACG,WAAW;AAAA,cACP;AAAA,cACA,UAAU,cAAc;AAAA,cACxB,UAAU,aAAa;AAAA,cACvB,UAAU,WAAW;AAAA,cACrB,UAAU,YAAY;AAAA,YAC1B;AAAA;AAAA,UAEP,KAAK;AAAA,QACR,CACI,GACC,CAAC,UACE,+BAAAA,QAAA;AAAA,UAAC;AAAA;AAAA,YACG,WAAW;AAAA,cACP;AAAA,cACA,QAAQ,eAAe,YAAY;AAAA,YACvC;AAAA;AAAA,QACJ,CAEN;AAAA,MAEN,CAAC;AAAA,IACH;AAAA,EAEN;AACJ;AAEA,QAAQ,cAAc;;;ACzFtB,IAAAC,iBAAkB;AAGX,SAAS,eAAe,EAAC,WAAW,GAAG,MAAK,GAAc;AAC/D,SACE,+BAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,OAAM;AAAA,MACN,SAAQ;AAAA,MACR,MAAK;AAAA,MACL;AAAA,MACC,GAAG;AAAA;AAAA,IAEJ,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA;AAAA,IACJ;AAAA,EACF;AAEJ;;;ACjBA,IAAAC,iBAAkB;AAGX,SAAS,gBAAgB,EAAC,WAAW,GAAG,MAAK,GAAc;AAChE,SACE,+BAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,OAAM;AAAA,MACN,SAAQ;AAAA,MACR,MAAK;AAAA,MACL;AAAA,MACC,GAAG;AAAA;AAAA,IAEJ,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,UAAS;AAAA,QACT,GAAE;AAAA,QACF,UAAS;AAAA;AAAA,IACX;AAAA,EACF;AAEJ;;;ACnBA,IAAAC,iBAAkB;AAGX,SAAS,iBAAiB,EAAC,WAAW,GAAG,MAAK,GAAc;AACjE,SACE,+BAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,OAAM;AAAA,MACN,SAAQ;AAAA,MACR,MAAK;AAAA,MACL;AAAA,MACC,GAAG;AAAA;AAAA,IAEJ,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,UAAS;AAAA,QACT,GAAE;AAAA,QACF,UAAS;AAAA;AAAA,IACX;AAAA,EACF;AAEJ;;;ACnBA,IAAAC,iBAAkB;AAGX,SAAS,UAAU,EAAC,WAAW,GAAG,MAAK,GAAc;AAC1D,SACE,+BAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,OAAM;AAAA,MACN,SAAQ;AAAA,MACR,MAAK;AAAA,MACL;AAAA,MACC,GAAG;AAAA;AAAA,IAEJ,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA;AAAA,IACJ;AAAA,EACF;AAEJ;;;ACjBA,IAAAC,iBAAkB;AAGX,SAAS,WAAW,EAAC,WAAW,GAAG,MAAK,GAAc;AAC3D,SACE,+BAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,OAAM;AAAA,MACN,SAAQ;AAAA,MACR,MAAK;AAAA,MACL;AAAA,MACC,GAAG;AAAA;AAAA,IAEJ,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA;AAAA,IACJ;AAAA,EACF;AAEJ;;;ACjBA,IAAAC,iBAAkB;AAGX,SAAS,YAAY,EAAC,WAAW,GAAG,MAAK,GAAc;AAC5D,SACE,+BAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,OAAM;AAAA,MACN,SAAQ;AAAA,MACR,MAAK;AAAA,MACL;AAAA,MACC,GAAG;AAAA;AAAA,IAEJ,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,UAAS;AAAA,QACT,GAAE;AAAA,QACF,UAAS;AAAA;AAAA,IACX;AAAA,EACF;AAEJ;;;ACnBA,IAAAC,iBAAkB;AAGX,SAAS,WAAW,EAAC,WAAW,GAAG,MAAK,GAAc;AAC3D,SACE,+BAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,OAAM;AAAA,MACN,SAAQ;AAAA,MACR,MAAK;AAAA,MACL;AAAA,MACC,GAAG;AAAA;AAAA,IAEJ,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA;AAAA,IACJ;AAAA,IACA,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA;AAAA,IACJ;AAAA,IACA,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA;AAAA,IACJ;AAAA,EACF;AAEJ;;;ACvBA,IAAAC,iBAAkB;AAMX,SAAS,UAAU,EAAC,WAAW,GAAG,MAAK,GAAc;AAC1D,SACE,+BAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,OAAM;AAAA,MACN,SAAQ;AAAA,MACR,MAAK;AAAA,MACL;AAAA,MACC,GAAG;AAAA;AAAA,IAEJ,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,UAAS;AAAA,QACT,GAAE;AAAA,QACF,UAAS;AAAA;AAAA,IACX;AAAA,EACF;AAEJ;;;ACtBA,IAAAC,iBAAkB;AAGX,SAAS,SAAS,EAAC,WAAW,GAAG,MAAK,GAAc;AACzD,SACE,+BAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,OAAM;AAAA,MACN,SAAQ;AAAA,MACR,MAAK;AAAA,MACL;AAAA,MACC,GAAG;AAAA;AAAA,IAEJ,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA;AAAA,IACJ;AAAA,EACF;AAEJ;;;ACjBA,IAAAC,iBAAkB;AAIX,SAAS,gBAAgB,EAAC,WAAW,GAAG,MAAK,GAAc;AAChE,SACE,+BAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,IAEJ,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,SAAQ;AAAA,QACR,MAAK;AAAA,QACL,WAAU;AAAA;AAAA,MAEV,+BAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACC,GAAE;AAAA,UACF,QAAO;AAAA,UACP,aAAY;AAAA,UACZ,eAAc;AAAA,UACd,gBAAe;AAAA,UACf,WAAU;AAAA;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AAEJ;;;AC7BA,IAAAC,iBAAkB;AAIX,SAAS,gBAAgB,EAAC,WAAW,GAAG,MAAK,GAAc;AAChE,SACE,+BAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;;;ACdA,IAAAC,iBAAkB;AAaX,SAAS,gBAAgB,EAAC,WAAW,UAAU,aAAa,GAAG,MAAK,GAAyB;AAClG,SACE,+BAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA,YAAY,WAAW,+BAA+B;AAAA,QACtD;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,IAEJ,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,SAAQ;AAAA,QACR,MAAK;AAAA,QACL,WAAU;AAAA;AAAA,MAEV,+BAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACC,GAAE;AAAA,UACF,QAAO;AAAA,UACP,aAAY;AAAA,UACZ,eAAc;AAAA,UACd,WAAW,YAAY,WAAW,kBAAkB;AAAA;AAAA,MACtD;AAAA,IACF;AAAA,EACF;AAEJ;;;ACtCA,IAAAC,iBAAkB;AAQX,SAAS,iBAAiB,EAAC,WAAW,GAAG,MAAK,GAAc;AACjE,SACE,+BAAAC,QAAA,cAAC,SAAI,WAAW,GAAG,kCAAkC,SAAS,GAAI,GAAG,SACnE,+BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,SAAQ;AAAA,MACR,WAAU;AAAA;AAAA,IAGV,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,GAAE;AAAA,QACF,OAAM;AAAA,QACN,QAAO;AAAA,QACP,MAAK;AAAA,QACL,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,WAAU;AAAA;AAAA,IACZ;AAAA,IAEA,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,GAAE;AAAA,QACF,OAAM;AAAA,QACN,QAAO;AAAA,QACP,MAAK;AAAA,QACL,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,iBAAgB;AAAA,QAChB,eAAc;AAAA,QACd,WAAU;AAAA;AAAA,IACZ;AAAA,EACF,CACF;AAEJ;;;AC1CA,IAAAC,iBAAiD;;;ACAjD,IAAAC,iBAA6B;AAC7B,uBAAqC;AACrC,oBAAqB;AAwBrB,IAAM,0BAAkC;AAAA,EACtC,cAAc;AAAA,IACZ;AAAA,IAAM;AAAA,IAAM;AAAA,IAAM;AAAA,IAAM;AAAA,IAAM;AAAA,IAC9B;AAAA,IAAK;AAAA,IAAM;AAAA,IACX;AAAA,IAAU;AAAA,IAAK;AAAA,IAAM;AAAA,IAAK;AAAA,IAAK;AAAA,IAAK;AAAA,IAAU;AAAA,IAAO;AAAA,IACrD;AAAA,IAAO;AAAA,IAAO;AAAA,IAAQ;AAAA,IACtB;AAAA,IAAM;AAAA,IAAM;AAAA,IACZ;AAAA,IACA;AAAA,IAAQ;AAAA,IAAO;AAAA,IAAO;AAAA,IAAQ;AAAA,IAC9B;AAAA,IAAc;AAAA,IAAK;AAAA,IAAQ;AAAA,IAC3B;AAAA,IAAS;AAAA,IAAS;AAAA,IAAS;AAAA,IAAS;AAAA,IAAM;AAAA,IAAM;AAAA,IAAM;AAAA,IAAW;AAAA,IAAY;AAAA,IAC7E;AAAA,IAAO;AAAA,IAAQ;AAAA,IAAW;AAAA,EAC5B;AAAA,EACA,cAAc;AAAA,IACZ;AAAA,IAAQ;AAAA,IAAS;AAAA,IAAU;AAAA,IAC3B;AAAA,IAAS;AAAA,IACT;AAAA,IAAW;AAAA,IAAW;AAAA,IACtB;AAAA,EACF;AAAA,EACA,UAAU,CAAC,UAAU,KAAK;AAAA,EAC1B,oBAAoB;AACtB;AAEA,SAAS,oBAAoB;AAC3B,8BAAQ,MAAM;AACZ,qBAAAC,QAAU,QAAQ,2BAA2B,CAAC,SAAS;AACrD,UAAI,KAAK,YAAY,KAAK;AACxB,aAAK,aAAa,UAAU,QAAQ;AACpC,aAAK,aAAa,OAAO,qBAAqB;AAAA,MAChD;AAAA,IACF,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AACP;AAEA,IAAM,sBAAsB;AAM5B,SAAS,sBAAsB,MAAc,iBAAkC;AAC7E,MAAI,CAAC,KAAK,KAAK,GAAG;AAEhB,WAAO,gBAAgB,GAAG,qBAAqB,eAAe,CAAC;AAAA,EACjE;AAEA,QAAM,aAAa,gBAAgB;AAAA,IAAG;AAAA,IAClC;AAAA,EAAe,CAAC;AAGpB,QAAM,SAAS,IAAI,UAAU;AAC7B,QAAM,MAAM,OAAO,gBAAgB,QAAQ,IAAI,UAAU,WAAW;AACpE,QAAM,YAAY,IAAI,KAAK;AAE3B,MAAI,CAAC,WAAW;AACd,WAAO,OAAO;AAAA,EAChB;AAGA,MAAI,SAAkB;AACtB,SAAO,OAAO,kBAAkB;AAC9B,UAAM,YAAY,OAAO;AAEzB,UAAM,UAAU,UAAU,QAAQ,YAAY;AAC9C,QAAI,CAAC,QAAQ,KAAK,UAAU,MAAM,KAAK,KAAK,QAAQ,QAAQ,OAAO,GAAG,EAAE,SAAS,OAAO,GAAG;AACzF;AAAA,IACF;AACA,aAAS;AAAA,EACX;AAGA,SAAO,mBAAmB,aAAa,UAAU;AAGjD,SAAO,UAAU;AACnB;AAEO,IAAM,kBAAkB,eAAAC,QAAM;AAAA,EACjC,CAAC,EAAC,WAAW,SAAS,aAAa,MAAM,gBAAgB,aAAa,iBAAiB,GAAG,KAAI,GAC1F,QAAQ;AACV,sBAAkB;AAElB,UAAM,oBAAgB,wBAAQ,MAAM;AAClC,UAAI,CAAC,WAAW,CAAC,aAAa;AAC5B,eAAO;AAAA,MACT;AACA,YAAM,SAAS,kBAAkB;AAGjC,UAAI;AACJ,UAAI,YAAY;AACd,YAAI;AAEF,wBAAc,qBAAO,MAAM,OAAO;AAAA,QACpC,SAAS,GAAG;AACV,kBAAQ,MAAM,2BAA2B,CAAC;AAC1C,wBAAc;AAAA,QAChB;AAAA,MACF,OAAO;AACL,sBAAc;AAAA,MAChB;AAEA,YAAM,YAAY,cAAc,iBAAAD,QAAU,SAAS,aAAa,MAAM,IAAI;AAE1E,UAAI,aAAa;AACf,eAAO,sBAAsB,WAAW,eAAe;AAAA,MACzD;AAEA,aAAO;AAAA,IACT,GAAG,CAAC,SAAS,gBAAgB,aAAa,eAAe,CAAC;AAE1D,WACI,+BAAAC,QAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,WAAW,GAAG,SAAS,SAAS;AAAA,QAChC,yBAAyB,EAAC,QAAQ,cAAa;AAAA,QAC9C,GAAG;AAAA;AAAA,IACR;AAAA,EAEN;AACJ;AAEA,gBAAgB,cAAc;;;ADhF9B,IAAMC,iBAAgD;AAAA,EACpD,MAAM;AAAA,EACN,WAAW;AACb;AAGA,IAAM,eAMD,CAAC,EAAC,SAAS,OAAO,UAAU,WAAW,SAAQ,MAChD,+BAAAC,QAAA;AAAA,EAAC;AAAA;AAAA,IACG,MAAK;AAAA,IACL;AAAA,IACA;AAAA,IACA,WAAW;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACJ;AAAA,IACA,cAAY;AAAA;AAAA,EAEb;AACH;AAIJ,IAAM,WAAW,MACb,+BAAAA,QAAA;AAAA,EAAC;AAAA;AAAA,IAAI,OAAM;AAAA,IAA6B,SAAQ;AAAA,IAAY,MAAK;AAAA,IAAO,QAAO;AAAA,IAC1E,aAAY;AAAA,IAAI,eAAc;AAAA,IAAQ,gBAAe;AAAA,IAAQ,WAAU;AAAA;AAAA,EAC1E,+BAAAA,QAAA,cAAC,UAAK,OAAM,MAAK,QAAO,MAAK,GAAE,KAAI,GAAE,KAAI,IAAG,KAAI,IAAG,KAAG;AAAA,EACtD,+BAAAA,QAAA,cAAC,UAAK,GAAE,2DAAyD;AACnE;AAGJ,IAAM,YAAY,MACd,+BAAAA,QAAA;AAAA,EAAC;AAAA;AAAA,IAAI,OAAM;AAAA,IAA6B,SAAQ;AAAA,IAAY,MAAK;AAAA,IAAO,QAAO;AAAA,IAC1E,aAAY;AAAA,IAAI,eAAc;AAAA,IAAQ,gBAAe;AAAA,IACrD,WAAU;AAAA;AAAA,EACb,+BAAAA,QAAA,cAAC,cAAS,QAAO,kBAAgB;AACnC;AAGJ,IAAM,aAAa,MACf,+BAAAA,QAAA;AAAA,EAAC;AAAA;AAAA,IAAI,OAAM;AAAA,IAA6B,SAAQ;AAAA,IAAY,MAAK;AAAA,IAAO,QAAO;AAAA,IAC1E,aAAY;AAAA,IAAI,eAAc;AAAA,IAAQ,gBAAe;AAAA,IAAQ,WAAU;AAAA;AAAA,EAC1E,+BAAAA,QAAA,cAAC,UAAK,GAAE,oDAAkD;AAAA,EAC1D,+BAAAA,QAAA,cAAC,UAAK,GAAE,aAAW;AACrB;AAGJ,IAAM,YAAY,MACd,+BAAAA,QAAA;AAAA,EAAC;AAAA;AAAA,IAAI,OAAM;AAAA,IAA6B,SAAQ;AAAA,IAAY,MAAK;AAAA,IAAO,QAAO;AAAA,IAC1E,aAAY;AAAA,IAAI,eAAc;AAAA,IAAQ,gBAAe;AAAA,IAAQ,WAAU;AAAA;AAAA,EAC1E,+BAAAA,QAAA,cAAC,UAAK,GAAE,sDAAoD;AAAA,EAC5D,+BAAAA,QAAA,cAAC,UAAK,GAAE,cAAY;AAAA,EACpB,+BAAAA,QAAA,cAAC,UAAK,GAAE,uDAAqD;AAAA,EAC7D,+BAAAA,QAAA,cAAC,UAAK,GAAE,aAAW;AACrB;AAGJ,IAAMC,mBAAkB,MACpB,+BAAAD,QAAA;AAAA,EAAC;AAAA;AAAA,IAAI,OAAM;AAAA,IAA6B,SAAQ;AAAA,IAAY,MAAK;AAAA,IAAO,QAAO;AAAA,IAC1E,aAAY;AAAA,IAAI,eAAc;AAAA,IAAQ,gBAAe;AAAA,IAAQ,WAAU;AAAA;AAAA,EAC1E,+BAAAA,QAAA,cAAC,UAAK,GAAE,kBAAgB;AAC1B;AAGJ,IAAME,oBAAmB,MACrB,+BAAAF,QAAA;AAAA,EAAC;AAAA;AAAA,IAAI,OAAM;AAAA,IAA6B,SAAQ;AAAA,IAAY,MAAK;AAAA,IAAO,QAAO;AAAA,IAC1E,aAAY;AAAA,IAAI,eAAc;AAAA,IAAQ,gBAAe;AAAA,IAAQ,WAAU;AAAA;AAAA,EAC1E,+BAAAA,QAAA,cAAC,UAAK,GAAE,iBAAe;AACzB;AAGJ,IAAM,gBAAgB,MAClB,+BAAAA,QAAA;AAAA,EAAC;AAAA;AAAA,IAAI,OAAM;AAAA,IAA6B,SAAQ;AAAA,IAAY,MAAK;AAAA,IAAO,QAAO;AAAA,IAC1E,aAAY;AAAA,IAAI,eAAc;AAAA,IAAQ,gBAAe;AAAA,IACrD,WAAU;AAAA;AAAA,EACb,+BAAAA,QAAA,cAAC,UAAK,IAAG,KAAI,IAAG,KAAI,IAAG,KAAI,IAAG,MAAI;AAAA,EAClC,+BAAAA,QAAA,cAAC,YAAO,IAAG,MAAK,IAAG,KAAI,GAAE,KAAG;AAAA,EAC5B,+BAAAA,QAAA,cAAC,YAAO,IAAG,KAAI,IAAG,MAAK,GAAE,KAAG;AAAA,EAC5B,+BAAAA,QAAA,cAAC,UAAK,GAAE,uBAAqB;AAC/B;AAGJ,IAAM,QAAQ,MACV,+BAAAA,QAAA;AAAA,EAAC;AAAA;AAAA,IAAI,OAAM;AAAA,IAA6B,SAAQ;AAAA,IAAY,MAAK;AAAA,IAAO,QAAO;AAAA,IAC1E,aAAY;AAAA,IAAI,eAAc;AAAA,IAAQ,gBAAe;AAAA,IAAQ,WAAU;AAAA;AAAA,EAC1E,+BAAAA,QAAA,cAAC,UAAK,GAAE,cAAY;AAAA,EACpB,+BAAAA,QAAA,cAAC,UAAK,GAAE,cAAY;AACtB;AAGJ,IAAM,WAAW,MACb,+BAAAA,QAAA;AAAA,EAAC;AAAA;AAAA,IAAI,OAAM;AAAA,IAA6B,SAAQ;AAAA,IAAY,MAAK;AAAA,IAAO,QAAO;AAAA,IAC1E,aAAY;AAAA,IAAI,eAAc;AAAA,IAAQ,gBAAe;AAAA,IAAQ,WAAU;AAAA;AAAA,EAC1E,+BAAAA,QAAA,cAAC,UAAK,GAAE,uBAAqB;AAAA,EAC7B,+BAAAA,QAAA,cAAC,UAAK,GAAE,eAAa;AACvB;AAGG,IAAM,UAAU,eAAAA,QAAM;AAAA,EACzB,CAAC;AAAA,IACC,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,GAAG,QAAQ;AACT,UAAM,SAAS,YAAY;AAC3B,UAAM,CAAC,QAAQ,SAAS,QAAI,yBAAS,KAAK;AAC1C,UAAM,CAAC,WAAW,YAAY,QAAI,yBAAS,KAAK;AAChD,UAAM,CAAC,WAAW,YAAY,QAAI,yBAAS,OAAO;AAClD,UAAM,kBAAc,uBAA4B,IAAI;AAEpD,UAAM,gBAAgB,cAAc,WAAW,QAAQ;AACvD,UAAM,cAAc,WAAW,CAAC,eAAe,CAAC;AAGhD,kCAAU,MAAM;AACd,UAAI,aAAa,YAAY,SAAS;AACpC,cAAM,WAAW,YAAY;AAC7B,iBAAS,MAAM,SAAS;AACxB,iBAAS,MAAM,SAAS,GAAG,SAAS,YAAY;AAChD,iBAAS,MAAM;AAEf,iBAAS,kBAAkB,SAAS,MAAM,QAAQ,SAAS,MAAM,MAAM;AAAA,MACzE;AAAA,IACF,GAAG,CAAC,SAAS,CAAC;AAEd,UAAM,aAAa,YAAY;AAC7B,UAAI;AACF,cAAM,UAAU,UAAU,UAAU,OAAO;AAC3C,kBAAU,IAAI;AACd,mBAAW,MAAM,UAAU,KAAK,GAAG,GAAI;AAAA,MACzC,QAAQ;AAEN,cAAM,WAAW,SAAS,cAAc,UAAU;AAClD,iBAAS,QAAQ;AACjB,iBAAS,KAAK,YAAY,QAAQ;AAClC,iBAAS,OAAO;AAChB,iBAAS,YAAY,MAAM;AAC3B,iBAAS,KAAK,YAAY,QAAQ;AAClC,kBAAU,IAAI;AACd,mBAAW,MAAM,UAAU,KAAK,GAAG,GAAI;AAAA,MACzC;AAAA,IACF;AAEA,UAAM,kBAAkB,MAAM;AAC5B,mBAAa,OAAO;AACpB,mBAAa,IAAI;AAAA,IACnB;AAEA,UAAM,mBAAmB,MAAM;AAC7B,mBAAa,KAAK;AAClB,mBAAa,OAAO;AAAA,IACtB;AAEA,UAAM,mBAAmB,MAAM;AAC7B,YAAM,UAAU,UAAU,KAAK;AAC/B,UAAI,WAAW,YAAY,SAAS;AAClC,iBAAS,SAAS,OAAO;AAAA,MAC3B;AACA,mBAAa,KAAK;AAAA,IACpB;AAEA,UAAM,oBAAoB,CAAC,MAAgD;AACzE,UAAI,EAAE,QAAQ,WAAW,CAAC,EAAE,UAAU;AACpC,UAAE,eAAe;AACjB,yBAAiB;AAAA,MACnB,WAAW,EAAE,QAAQ,UAAU;AAC7B,yBAAiB;AAAA,MACnB;AAAA,IACF;AAEA,UAAM,mBAAmB,CAAC,MAA8C;AACtE,mBAAa,EAAE,OAAO,KAAK;AAE3B,YAAM,WAAW,EAAE;AACnB,eAAS,MAAM,SAAS;AACxB,eAAS,MAAM,SAAS,GAAG,SAAS,YAAY;AAAA,IAClD;AAEA,WACI,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,WAAW;AAAA,UACP;AAAA,UACA,SAAS,cAAc;AAAA,UACvB;AAAA,QACJ;AAAA,QACC,GAAG;AAAA;AAAA,MAGL,UAAU,YACP,+BAAAA,QAAA,cAAC,SAAI,WAAU,wBACb,+BAAAA,QAAA,cAAC,SAAI,WAAU,sBACnB,+BAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACG,KAAK;AAAA,UACL,OAAO;AAAA,UACP,UAAU;AAAA,UACV,WAAW;AAAA,UACX,WAAU;AAAA,UACV,MAAM;AAAA;AAAA,MACV,GACM,+BAAAA,QAAA,cAAC,SAAI,WAAU,4DACb,+BAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACG,MAAK;AAAA,UACL,SAAS;AAAA,UACT,WAAU;AAAA,UACV,cAAW;AAAA;AAAA,QAEb,+BAAAA,QAAA,cAAC,WAAK;AAAA,MACR,GACA,+BAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACG,MAAK;AAAA,UACL,SAAS;AAAA,UACT,UAAU,CAAC,UAAU,KAAK,KAAK,UAAU,KAAK,MAAM;AAAA,UACpD,WAAU;AAAA,UACV,cAAW;AAAA;AAAA,QAEb,+BAAAA,QAAA,cAAC,cAAQ;AAAA,MACX,CACF,CACF,CACF,IAEA,+BAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACG,WAAW;AAAA,YACP;AAAA,YACAD,eAAc,OAAO;AAAA,UACzB;AAAA;AAAA,QAEF,+BAAAC,QAAA;AAAA,UAAC;AAAA;AAAA,YACG;AAAA,YACA,WAAW,GAAG,YAAY,SAAS,kBAAkB,cAAc;AAAA,YACnE;AAAA,YACA,iBAAgB;AAAA;AAAA,QACpB;AAAA,MACF;AAAA,MAIH,eAAe,CAAC,aACb,+BAAAA,QAAA,cAAC,SAAI,WAAW;AAAA,QACZ;AAAA,QACA,SAAS,SAAS;AAAA,MACtB,KAEI,QAAQ,aAAa,SACnB,+BAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UAAa,SAAS;AAAA,UACT,OAAO,SAAS,YAAY;AAAA;AAAA,QACvC,SAAS,+BAAAA,QAAA,cAAC,eAAS,IAAK,+BAAAA,QAAA,cAAC,cAAQ;AAAA,MACpC,GAIH,UAAU,QAAQ,UACf,+BAAAA,QAAA,cAAC,gBAAa,SAAS,iBAAiB,OAAM,kBAC5C,+BAAAA,QAAA,cAAC,gBAAU,CACb,GAIH,CAAC,UAAU,QAAQ,WAChB,+BAAAA,QAAA,cAAC,gBAAa,SAAS,QAAQ,SAAS,OAAM,yBAC5C,+BAAAA,QAAA,cAAC,eAAS,CACZ,GAIH,iBACG,+BAAAA,QAAA,6BAAAA,QAAA,gBACE,+BAAAA,QAAA,cAAC,SAAI,WAAU,2BAAyB,GACxC,+BAAAA,QAAA,cAAC,SAAI,WAAU,8CACb,+BAAAA,QAAA,cAAC,mBAAa,GACd,+BAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACG,MAAK;AAAA,UACL,SAAS,WAAW;AAAA,UACpB,UAAU,WAAW,WAAW;AAAA,UAChC,WAAW;AAAA,YACP;AAAA,YACA;AAAA,UACJ;AAAA,UACA,cAAW;AAAA;AAAA,QAEb,+BAAAA,QAAA,cAACC,kBAAA,IAAe;AAAA,MAClB,GACA,+BAAAD,QAAA,cAAC,UAAK,WAAU,8CACrB,WAAW,SAAQ,KAAE,WAAW,KACnC,GACQ,+BAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACG,MAAK;AAAA,UACL,SAAS,WAAW;AAAA,UACpB,UAAU,WAAW,WAAW,WAAW;AAAA,UAC3C,WAAW;AAAA,YACP;AAAA,YACA;AAAA,UACJ;AAAA,UACA,cAAW;AAAA;AAAA,QAEb,+BAAAA,QAAA,cAACE,mBAAA,IAAgB;AAAA,MACnB,CACF,CACF,CAEN;AAAA,IAEN;AAAA,EAEN;AACJ;AAEA,QAAQ,cAAc;;;AEpYtB,IAAAC,iBAAkB;AAOX,IAAM,kBAAkB,eAAAC,QAAM;AAAA,EACjC,CAAC,EAAC,WAAW,UAAU,QAAQ,GAAG,KAAI,GAAG,QAAQ;AAC/C,UAAMC,iBAAgB;AAAA,MACpB,OAAO;AAAA,MACP,MAAM;AAAA,MACN,YAAY;AAAA,IACd;AAEA,WACI,+BAAAD,QAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,WAAW;AAAA,UACP;AAAA,UACAC,eAAc,OAAO;AAAA,UACrB;AAAA,QACJ;AAAA,QACA,eAAY;AAAA,QACX,GAAG;AAAA;AAAA,IACR;AAAA,EAEN;AACJ;AAEA,gBAAgB,cAAc;;;AC9B9B,IAAAC,iBAAuE;;;ACAvE,IAAAC,iBAA+B;;;ACA/B,IAAAC,iBAAkC;AA4C3B,SAAS,gBACZ,UAAkC,CAAC,GACd;AACvB,QAAM,EAAC,WAAW,UAAU,QAAQ,QAAO,IAAI;AAE/C,QAAM,mBAAe,uBAAuB,IAAI;AAChD,QAAM,gBAAY,uBAAuB,IAAI;AAE7C,QAAM,qBAAiB,4BAAY,MAAM;AACvC,UAAM,KAAK,UAAU;AACrB,QAAI,CAAC,IAAI;AACP;AAAA,IACF;AAKA,0BAAsB,MAAM;AAC1B,4BAAsB,MAAM;AAC1B,WAAG,eAAe,EAAC,UAAU,MAAK,CAAC;AAAA,MACrC,CAAC;AAAA,IACH,CAAC;AAAA,EACH,GAAG,CAAC,UAAU,KAAK,CAAC;AAEpB,QAAM,qBAAiB,4BAAY,MAAM;AACvC,UAAM,YAAY,aAAa;AAC/B,QAAI,CAAC,WAAW;AACd;AAAA,IACF;AAEA,QAAI,OAAO,UAAU,aAAa,YAAY;AAC5C,gBAAU,SAAS,EAAC,KAAK,UAAU,cAAc,SAAQ,CAAC;AAAA,IAC5D,OAAO;AACL,gBAAU,YAAY,UAAU;AAAA,IAClC;AAAA,EACF,GAAG,CAAC,QAAQ,CAAC;AAEb,QAAM,yBAAqB,4BAAY,MAAM;AAC3C,UAAM,YAAY,aAAa;AAC/B,QAAI,CAAC,WAAW;AACd,aAAO;AAAA,IACT;AAEA,UAAM,YAAY;AAClB,UAAM,EAAC,WAAW,cAAc,aAAY,IAAI;AAChD,WAAO,eAAe,YAAY,eAAe;AAAA,EACnD,GAAG,CAAC,CAAC;AAEL,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ACnGA,IAAAC,iBAAuD;AAuDhD,SAAS,kBACZ,UAAoC,CAAC,GACd;AACzB,QAAM,EAAC,YAAY,GAAG,cAAc,sBAAsB,UAAS,IAAI;AAEvE,QAAM,2BAAuB,uBAAuB,IAAI;AACxD,QAAM,eAAe,wBAAwB;AAC7C,QAAM,iBAAa,uBAAuB,IAAI;AAC9C,QAAM,gBAAY,uBAAuB,IAAI;AAC7C,QAAM,CAAC,cAAc,eAAe,QAAI,yBAAS,CAAC;AAElD,QAAM,kBAAc,4BAAY,MAAM;AACpC,UAAM,YAAY,aAAa;AAC/B,UAAM,UAAU,WAAW;AAC3B,QAAI,CAAC,aAAa,CAAC,SAAS;AAC1B;AAAA,IACF;AAGA,UAAM,QAAQ,iBAAiB,SAAS;AACxC,UAAM,aAAa,WAAW,MAAM,UAAU,KAAK;AACnD,UAAM,gBAAgB,WAAW,MAAM,aAAa,KAAK;AACzD,UAAM,kBAAkB,UAAU,eAAe,aAAa;AAI9D,QAAI;AACJ,UAAM,SAAS,WAAW;AAE1B,QAAI,UAAU,QAAQ,SAAS,MAAM,GAAG;AAGtC,YAAM,YAAY,OAAO;AACzB,iCAA2B,QAAQ,eAAe;AAAA,IACpD,OAAO;AAEL,iCAA2B,QAAQ;AAAA,IACrC;AAEA,UAAM,kBAAkB,KAAK,IAAI,WAAW,kBAAkB,wBAAwB;AAItF,QAAI,UAAU,SAAS;AACrB,gBAAU,QAAQ,MAAM,SAAS,GAAG,eAAe;AAAA,IACrD;AAGA,oBAAgB,eAAe;AAAA,EACjC,GAAG,CAAC,WAAW,SAAS,CAAC;AAEzB,gCAAU,MAAM;AACd,UAAM,YAAY,aAAa;AAC/B,UAAM,UAAU,WAAW;AAC3B,QAAI,CAAC,aAAa,CAAC,SAAS;AAC1B;AAAA,IACF;AAGA,gBAAY;AAGZ,UAAM,iBAAiB,IAAI,eAAe,MAAM;AAC9C,kBAAY;AAAA,IACd,CAAC;AAED,mBAAe,QAAQ,SAAS;AAChC,mBAAe,QAAQ,OAAO;AAG9B,UAAM,mBAAmB,IAAI,iBAAiB,MAAM;AAElD,4BAAsB,WAAW;AAAA,IACnC,CAAC;AAED,qBAAiB,QAAQ,SAAS;AAAA,MAChC,WAAW;AAAA,MACX,SAAS;AAAA,MACT,eAAe;AAAA,IACjB,CAAC;AAED,WAAO,MAAM;AACX,qBAAe,WAAW;AAC1B,uBAAiB,WAAW;AAAA,IAC9B;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAEhB,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ACrJA,IAAAC,iBAAyC;AAGzC,IAAM,mBAAmB;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAsBO,IAAM,oBAAoB,eAAAC,QAAM;AAAA,EACnC,CACI;AAAA,IACE,YAAY;AAAA,IACZ,iBAAiB;AAAA,IACjB,UAAU;AAAA,IACV;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACC;AAEH,UAAM,CAAC,cAAc,eAAe,QAAI;AAAA,MACpC,MAAM,KAAK,MAAM,KAAK,OAAO,IAAI,QAAQ,MAAM;AAAA,IAAC;AACpD,UAAM,CAAC,iBAAiB,kBAAkB,QAAI,yBAAS,KAAK;AAE5D,kCAAU,MAAM;AACd,UAAI,CAAC,aAAa,QAAQ,UAAU,GAAG;AACrC;AAAA,MACF;AAEA,YAAM,WAAW,YAAY,MAAM;AACjC,2BAAmB,IAAI;AAGvB,mBAAW,MAAM;AACf,0BAAgB,CAAC,UAAU,OAAO,KAAK,QAAQ,MAAM;AACrD,6BAAmB,KAAK;AAAA,QAC1B,GAAG,GAAG;AAAA,MACR,GAAG,cAAc;AAEjB,aAAO,MAAM,cAAc,QAAQ;AAAA,IACrC,GAAG,CAAC,WAAW,QAAQ,QAAQ,cAAc,CAAC;AAE9C,QAAI,CAAC,WAAW;AACd,aAAO;AAAA,IACT;AAEA,WACI,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,WAAW;AAAA,UACP;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACJ;AAAA,QACA,MAAK;AAAA,QACL,aAAU;AAAA,QACT,GAAG;AAAA;AAAA,MAGN,+BAAAA,QAAA,cAAC,SAAI,WAAU,cAAa,eAAY,UACtC,+BAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UAAK,WAAU;AAAA,UACV,OAAO,EAAC,gBAAgB,MAAK;AAAA;AAAA,MAAE,GACrC,+BAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UAAK,WAAU;AAAA,UACV,OAAO,EAAC,gBAAgB,QAAO;AAAA;AAAA,MAAE,GACvC,+BAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UAAK,WAAU;AAAA,UACV,OAAO,EAAC,gBAAgB,QAAO;AAAA;AAAA,MAAE,CACzC;AAAA,MAGA,+BAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACG,WAAW;AAAA,YACP;AAAA,YACA,kBAAkB,cAAc;AAAA,UACpC;AAAA;AAAA,QAEL,QAAQ,YAAY;AAAA,MACvB;AAAA,IACE;AAAA,EAEN;AACJ;AAEA,kBAAkB,cAAc;;;AHxDzB,IAAM,WAAW,eAAAC,QAAM;AAAA,EAC1B,CAAC,EAAC,UAAU,wBAAwB,aAAa,YAAY,UAAU,WAAW,GAAG,KAAI,GACrF,QAAQ;AACV,UAAM,EAAC,cAAc,WAAW,eAAc,IAAI,gBAAgB;AAAA,MAChE,UAAU;AAAA,MACV,OAAO;AAAA,IACT,CAAC;AAED,UAAM,EAAC,YAAY,WAAW,aAAY,IAAI,kBAAkB;AAAA,MAC9D;AAAA,MACA;AAAA,IACF,CAAC;AAGD,kCAAU,MAAM;AACd,UAAI,2BAA2B,UAAa,0BAA0B,GAAG;AACvE,uBAAe;AAAA,MACjB;AAAA,IACF,GAAG,CAAC,wBAAwB,cAAc,CAAC;AAG3C,UAAM,gBACF,0BACA,SAAS,YAAY,CAAC,OAAO,KAAK,QAAQ;AACxC,UAAI,UAAU,MAAM,IAAI,YAAY,QAAQ;AAC1C,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT,GAAG,EAAE;AAIT,UAAM,eAAe,cAAc,SAAS,SAAS,KAAK,SAAS,SAAS,SAC1E,CAAC,GAAG,YAAY;AAElB,WACI,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG,KAAK,CAAC,SAAS;AAEb;AAAC,UAAC,aAA+D,UAAU;AAC3E,cAAI,OAAO,QAAQ,YAAY;AAC7B,gBAAI,IAAI;AAAA,UACV,WAAW,KAAK;AACd,gBAAI,UAAU;AAAA,UAChB;AAAA,QACF;AAAA,QACA;AAAA,QACA,WAAW;AAAA,UACP;AAAA,UACA;AAAA,UACA;AAAA,QACJ;AAAA,QACC,GAAG;AAAA;AAAA,MAGN,+BAAAA,QAAA,cAAC,SAAI,KAAK,YAAY,WAAU,kCAC7B,SAAS,IAAI,CAAC;AAAA,QACb;AAAA,QACA;AAAA,QACA,WAAW;AAAA,QACX;AAAA,QACA;AAAA,QACA,aAAa;AAAA,QACb,GAAG;AAAA,MACL,GAAG,UAAU;AACX,cAAM,WAAW,UAAU;AAC3B,cAAM,gBAAgB,UAAU,SAAS,SAAS;AAClD,cAAM,gBAAgB,iBAAiB,eAAe,YAAY;AAClE,cAAM,qBAAqB,iBAAiB,CAAC,CAAC;AAE9C,eACI,+BAAAA,QAAA;AAAA,UAAC;AAAA;AAAA,YACG,KAAK,MAAM,OAAO,KAAK;AAAA,YACvB,KAAK,WAAW,YAAY;AAAA,YAC5B,WAAW,WAAW,gBAAgB;AAAA;AAAA,UAExC,+BAAAA,QAAA;AAAA,YAAC;AAAA;AAAA,cACG;AAAA,cACA,aAAa;AAAA,cACb,WAAW;AAAA,cACX;AAAA,cACA;AAAA,cACA,aAAa;AAAA,cACZ,GAAG;AAAA;AAAA,UACR;AAAA,QACF;AAAA,MAEN,CAAC,GAGA,gBACG,+BAAAA,QAAA,cAAC,qBAAkB,WAAS,OAElC;AAAA,MAGA,+BAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACG,KAAK;AAAA,UACL,WAAU;AAAA,UACV,OAAO,EAAC,QAAQ,aAAY;AAAA,UAC5B,eAAY;AAAA;AAAA,MAChB;AAAA,IACF;AAAA,EAEN;AACJ;AAEA,SAAS,cAAc;;;AIrKvB,IAAAC,iBAA8D;AAE9D,IAAAC,wBAAsC;;;ACoG/B,SAAS,YAAY,MAAqB;AAC/C,SAAO,KAAK,KAAK,WAAW,QAAQ;AACtC;AAKO,SAAS,iBAAiB,MAAgC;AAC/D,MAAI,YAAY,IAAI,GAAG;AACrB,WAAO,IAAI,gBAAgB,IAAI;AAAA,EACjC;AACA,SAAO;AACT;AAKO,SAAS,iBAAiB,KAA+B;AAC9D,MAAI,KAAK;AACP,QAAI,gBAAgB,GAAG;AAAA,EACzB;AACF;AAKO,SAAS,aAAqB;AACnC,SAAO,GAAG,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,OAAO,GAAG,CAAC,CAAC;AACjE;AAKO,SAAS,kBAAoC;AAClD,SAAO;AAAA,IACL,OAAO,CAAC;AAAA,IACR,SAAS,CAAC;AAAA,IACV,cAAc;AAAA,EAChB;AACF;AAKO,SAAS,iBACZ,MACA,SACA,WAA0B,MACV;AAClB,QAAM,WAAW,EAAC,GAAG,KAAK,MAAK;AAC/B,QAAM,aAAa,CAAC,GAAG,KAAK,OAAO;AAGnC,MAAI,cAAc;AAClB,MAAI,YAAY,SAAS,QAAQ,GAAG;AAClC,kBAAc,SAAS,QAAQ,EAAE,SAAS;AAAA,EAC5C,WAAW,CAAC,UAAU;AACpB,kBAAc,WAAW;AAAA,EAC3B;AAGA,QAAM,UAAuB;AAAA,IAC3B,GAAG;AAAA,IACH;AAAA,IACA,UAAU,CAAC;AAAA,IACX;AAAA,IACA,WAAW,QAAQ,aAAa,KAAK,IAAI;AAAA,EAC3C;AAEA,WAAS,QAAQ,EAAE,IAAI;AAGvB,MAAI,YAAY,SAAS,QAAQ,GAAG;AAClC,aAAS,QAAQ,IAAI;AAAA,MACnB,GAAG,SAAS,QAAQ;AAAA,MACpB,UAAU,CAAC,GAAG,SAAS,QAAQ,EAAE,UAAU,QAAQ,EAAE;AAAA,IACvD;AAAA,EACF,OAAO;AACL,eAAW,KAAK,QAAQ,EAAE;AAAA,EAC5B;AAEA,SAAO;AAAA,IACL,OAAO;AAAA,IACP,SAAS;AAAA,IACT,cAAc,QAAQ;AAAA,EACxB;AACF;AAKO,SAAS,sBAAsB,MAAuC;AAC3E,MAAI,CAAC,KAAK,cAAc;AACtB,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,OAAsB,CAAC;AAC7B,MAAI,YAA2B,KAAK;AAGpC,SAAO,WAAW;AAChB,UAAM,OAAgC,KAAK,MAAM,SAAS;AAC1D,QAAI,CAAC,MAAM;AACT;AAAA,IACF;AACA,SAAK,QAAQ,IAAI;AACjB,gBAAY,KAAK;AAAA,EACnB;AAEA,SAAO;AACT;AAKO,SAAS,eAAe,MAAwB,QAGrD;AACA,QAAM,OAAO,KAAK,MAAM,MAAM;AAC9B,MAAI,CAAC,MAAM;AACT,WAAO,EAAC,OAAO,GAAG,SAAS,EAAC;AAAA,EAC9B;AAEA,MAAI,KAAK,UAAU;AACjB,UAAM,SAAS,KAAK,MAAM,KAAK,QAAQ;AACvC,QAAI,QAAQ;AACV,YAAM,QAAQ,OAAO,SAAS,QAAQ,MAAM;AAC5C,aAAO;AAAA,QACL,OAAO,OAAO,SAAS;AAAA,QACvB,SAAS,QAAQ;AAAA,MACnB;AAAA,IACF;AAAA,EACF,OAAO;AAEL,UAAM,QAAQ,KAAK,QAAQ,QAAQ,MAAM;AACzC,WAAO;AAAA,MACL,OAAO,KAAK,QAAQ;AAAA,MACpB,SAAS,QAAQ;AAAA,IACnB;AAAA,EACF;AAEA,SAAO,EAAC,OAAO,GAAG,SAAS,EAAC;AAC9B;AAKO,SAAS,aACZ,MACA,QACA,WACgB;AAClB,QAAM,OAAO,KAAK,MAAM,MAAM;AAC9B,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AAEA,MAAI;AACJ,MAAI;AAEJ,MAAI,KAAK,UAAU;AACjB,UAAM,SAAS,KAAK,MAAM,KAAK,QAAQ;AACvC,QAAI,CAAC,QAAQ;AACX,aAAO;AAAA,IACT;AACA,eAAW,OAAO;AAClB,mBAAe,SAAS,QAAQ,MAAM;AAAA,EACxC,OAAO;AACL,eAAW,KAAK;AAChB,mBAAe,SAAS,QAAQ,MAAM;AAAA,EACxC;AAEA,MAAI,SAAS,UAAU,GAAG;AACxB,WAAO;AAAA,EACT;AAGA,QAAM,WAAW,cAAc,UACxB,eAAe,KAAK,SAAS,UAC7B,eAAe,IAAI,SAAS,UAAU,SAAS;AAEtD,QAAM,YAAY,SAAS,QAAQ;AAGnC,MAAI,SAAS;AACb,MAAI,cAAuC,KAAK,MAAM,MAAM;AAC5D,SAAO,eAAe,YAAY,SAAS,SAAS,GAAG;AACrD,aAAS,YAAY,SAAS,CAAC;AAC/B,kBAAc,KAAK,MAAM,MAAM;AAAA,EACjC;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,cAAc;AAAA,EAChB;AACF;AAKO,SAAS,kBACZ,MACA,QACA,SACA,aACgB;AAClB,QAAM,OAAO,KAAK,MAAM,MAAM;AAC9B,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,OAAO;AAAA,MACL,GAAG,KAAK;AAAA,MACR,CAAC,MAAM,GAAG;AAAA,QACR,GAAG;AAAA,QACH;AAAA,QACA,aAAa,eAAe,KAAK;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AACF;AAKO,SAAS,eACZ,UAMgB;AAClB,MAAI,OAAO,gBAAgB;AAE3B,aAAW,OAAO,UAAU;AAC1B,UAAM,WAAW,KAAK;AACtB,WAAO,iBAAiB,MAAM;AAAA,MAC5B,IAAI,IAAI;AAAA,MACR,MAAM,IAAI;AAAA,MACV,SAAS,IAAI;AAAA,MACb;AAAA,MACA,aAAa,IAAI;AAAA,IACnB,GAAG,QAAQ;AAAA,EACb;AAEA,SAAO;AACT;AAKO,SAAS,cAAc,MAAwB,QAAyB;AAC7E,QAAM,OAAO,KAAK,MAAM,MAAM;AAC9B,SAAO,OAAO,KAAK,SAAS,SAAS,IAAI;AAC3C;;;ADvRO,IAAM,YAAY,eAAAC,QAAM;AAAA,EAC3B,CACI;AAAA,IACE,WAAW;AAAA,IACX,cAAc;AAAA,IACd;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX,UAAU;AAAA,IACV,cAAc;AAAA,IACd;AAAA,IACA,aAAa;AAAA,IACb;AAAA,IACA,uBAAuB;AAAA,IACvB;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACC;AACH,UAAM,CAAC,OAAO,QAAQ,QAAI,yBAAS,EAAE;AACrC,UAAM,CAAC,kBAAkB,mBAAmB,QAAI,yBAAuB,CAAC,CAAC;AACzE,UAAM,CAAC,YAAY,aAAa,QAAI,yBAAS,KAAK;AAClD,UAAM,kBAAc,uBAA4B,IAAI;AACpD,UAAM,mBAAe,uBAAyB,IAAI;AAGlD,UAAM,cAAc,yBAAyB;AAC7C,UAAM,qBAAiB;AAAA,MACnB,CAAC,mBAA0E;AACzE,YAAI,qBAAqB;AACvB,cAAI,OAAO,mBAAmB,YAAY;AACxC,gCAAoB,eAAe,WAAW,CAAC;AAAA,UACjD,OAAO;AACL,gCAAoB,cAAc;AAAA,UACpC;AAAA,QACF,OAAO;AACL,8BAAoB,cAAc;AAAA,QACpC;AAAA,MACF;AAAA,MACA,CAAC,aAAa,mBAAmB;AAAA,IACrC;AAEA,UAAM,mBAAe,4BAAY,MAAM;AACrC,YAAM,UAAU,MAAM,KAAK;AAC3B,UAAI,CAAC,WAAW,YAAY,aAAa;AACvC;AAAA,MACF;AAEA,iBAAW,SAAS,YAAY,SAAS,IAAI,cAAc,MAAS;AACpE,eAAS,EAAE;AACX,qBAAe,CAAC,CAAC;AAGjB,UAAI,YAAY,SAAS;AACvB,oBAAY,QAAQ,MAAM,SAAS;AAAA,MACrC;AAAA,IACF,GAAG,CAAC,OAAO,UAAU,aAAa,UAAU,aAAa,cAAc,CAAC;AAExE,UAAM,oBAAgB;AAAA,MAClB,CAAC,MAAgD;AAC/C,YAAI,EAAE,QAAQ,WAAW,CAAC,EAAE,UAAU;AACpC,YAAE,eAAe;AACjB,uBAAa;AAAA,QACf;AAAA,MACF;AAAA,MACA,CAAC,YAAY;AAAA,IACjB;AAEA,UAAM,mBAAe,4BAAY,CAAC,MAA8C;AAC9E,eAAS,EAAE,OAAO,KAAK;AAGvB,YAAM,WAAW,EAAE;AACnB,eAAS,MAAM,SAAS;AACxB,eAAS,MAAM,SAAS,GAAG,KAAK,IAAI,SAAS,cAAc,GAAG,CAAC;AAAA,IACjE,GAAG,CAAC,CAAC;AAGL,kCAAU,MAAM;AACd,UAAI,CAAC,YAAY,CAAC,eAAe,YAAY,SAAS;AACpD,oBAAY,QAAQ,MAAM;AAAA,MAC5B;AAAA,IACF,GAAG,CAAC,UAAU,WAAW,CAAC;AAG1B,UAAM,eAAW;AAAA,MACb,CAAC,UAA6B;AAC5B,cAAM,iBAA+B,MAAM,KAAK,KAAK,EAAE,IAAI,CAAC,UAAU;AAAA,UACpE,IAAI,WAAW;AAAA,UACf;AAAA,UACA,YAAY,YAAY,IAAI,IAAI,iBAAiB,IAAI,IAAI;AAAA,UACzD,QAAQ;AAAA,QACV,EAAE;AACF,uBAAe,CAAC,SAAS,CAAC,GAAG,MAAM,GAAG,cAAc,CAAC;AAAA,MACvD;AAAA,MACA,CAAC,cAAc;AAAA,IACnB;AAEA,UAAM,uBAAmB;AAAA,MACrB,CAAC,MAA2C;AAC1C,cAAM,QAAQ,EAAE,OAAO;AACvB,YAAI,SAAS,MAAM,SAAS,GAAG;AAC7B,mBAAS,KAAK;AAAA,QAChB;AAEA,UAAE,OAAO,QAAQ;AAAA,MACnB;AAAA,MACA,CAAC,QAAQ;AAAA,IACb;AAEA,UAAM,6BAAyB;AAAA,MAC3B,CAAC,OAAe;AACd,uBAAe,CAAC,SAAS;AACvB,gBAAM,aAAa,KAAK,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AAC/C,cAAI,YAAY,YAAY;AAC1B,gBAAI,gBAAgB,WAAW,UAAU;AAAA,UAC3C;AACA,iBAAO,KAAK,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE;AAAA,QACvC,CAAC;AAAA,MACH;AAAA,MACA,CAAC,cAAc;AAAA,IACnB;AAGA,UAAM,sBAAkB,4BAAY,CAAC,MAAuB;AAC1D,QAAE,eAAe;AACjB,QAAE,gBAAgB;AAClB,oBAAc,IAAI;AAAA,IACpB,GAAG,CAAC,CAAC;AAEL,UAAM,sBAAkB,4BAAY,CAAC,MAAuB;AAC1D,QAAE,eAAe;AACjB,QAAE,gBAAgB;AAElB,UAAI,CAAC,EAAE,cAAc,SAAS,EAAE,aAAqB,GAAG;AACtD,sBAAc,KAAK;AAAA,MACrB;AAAA,IACF,GAAG,CAAC,CAAC;AAEL,UAAM,qBAAiB,4BAAY,CAAC,MAAuB;AACzD,QAAE,eAAe;AACjB,QAAE,gBAAgB;AAAA,IACpB,GAAG,CAAC,CAAC;AAEL,UAAM,iBAAa;AAAA,MACf,CAAC,MAAuB;AACtB,UAAE,eAAe;AACjB,UAAE,gBAAgB;AAClB,sBAAc,KAAK;AAEnB,cAAM,QAAQ,EAAE,aAAa;AAC7B,YAAI,SAAS,MAAM,SAAS,GAAG;AAC7B,mBAAS,KAAK;AAAA,QAChB;AAAA,MACF;AAAA,MACA,CAAC,QAAQ;AAAA,IACb;AAEA,UAAM,aAAa,aAAa;AAChC,UAAM,iBAAiB,YAAY,SAAS;AAC5C,UAAM,YAAY,MAAM,KAAK,KAAK,CAAC,YAAY,CAAC;AAEhD,WACI,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,WAAW;AAAA,UACP;AAAA,UACA,cAAc;AAAA,UACd,WAAW;AAAA,UACX;AAAA,QACJ;AAAA,QACC,GAAG;AAAA;AAAA,MAGL,cAAc,cACX,+BAAAA,QAAA,cAAC,OAAE,WAAU,0CAAwC,UAAW;AAAA,MAIpE,+BAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACG,WAAW;AAAA,YACP;AAAA,YACA,aAAa,oCAAoC;AAAA,YACjD;AAAA,YACA;AAAA,YACA,cAAc;AAAA,UAClB;AAAA,UACA,aAAa,uBAAuB,kBAAkB;AAAA,UACtD,aAAa,uBAAuB,kBAAkB;AAAA,UACtD,YAAY,uBAAuB,iBAAiB;AAAA,UACpD,QAAQ,uBAAuB,aAAa;AAAA;AAAA,QAG7C,kBACG,+BAAAA,QAAA,cAAC,SAAI,WAAU,oBACb,+BAAAA,QAAA;AAAA,UAAC;AAAA;AAAA,YACG;AAAA,YACA,UAAU;AAAA,YACV,WAAW,CAAC;AAAA;AAAA,QAChB,CACF;AAAA,QAIH,cACG,+BAAAA,QAAA;AAAA,UAAC;AAAA;AAAA,YACG,WAAU;AAAA;AAAA,UACZ,+BAAAA,QAAA,cAAC,UAAK,WAAU,mCAAgC,iBAAe;AAAA,QACjE;AAAA,QAIJ,+BAAAA,QAAA,cAAC,SAAI,WAAU,oBAEZ,wBACG,+BAAAA,QAAA,6BAAAA,QAAA,gBACE,+BAAAA,QAAA;AAAA,UAAC;AAAA;AAAA,YACG,MAAK;AAAA,YACL,SAAS,MAAM,aAAa,SAAS,MAAM;AAAA,YAC3C,UAAU,YAAY;AAAA,YACtB,WAAW;AAAA,cACP;AAAA,cACA;AAAA,YACJ;AAAA,YACA,cAAW;AAAA;AAAA,UAEb,+BAAAA,QAAA,cAAC,mCAAU,WAAU,WAAS;AAAA,QAChC,GACA,+BAAAA,QAAA;AAAA,UAAC;AAAA;AAAA,YACG,KAAK;AAAA,YACL,MAAK;AAAA,YACL,UAAQ;AAAA,YACR,QAAQ;AAAA,YACR,UAAU;AAAA,YACV,WAAU;AAAA,YACV,eAAY;AAAA;AAAA,QAChB,CACF,GAGJ,+BAAAA,QAAA;AAAA,UAAC;AAAA;AAAA,YACG,KAAK;AAAA,YACL;AAAA,YACA,UAAU;AAAA,YACV,WAAW;AAAA,YACX;AAAA,YACA,UAAU,YAAY;AAAA,YACtB,MAAM;AAAA,YACN,WAAW;AAAA,cACP;AAAA,cACA;AAAA,cACA,CAAC,wBAAwB;AAAA,eACxB,YAAY,gBAAgB;AAAA,YACjC;AAAA,YACA,OAAO,EAAC,WAAW,IAAG;AAAA;AAAA,QAC1B,GAGC,cACG,+BAAAA,QAAA;AAAA,UAAC;AAAA;AAAA,YACG,MAAK;AAAA,YACL,SAAS;AAAA,YACT,WAAW;AAAA,cACP;AAAA,cACA;AAAA,YACJ;AAAA,YACA,cAAW;AAAA;AAAA,UAEb,+BAAAA,QAAA,cAAC,gCAAO,WAAU,wBAAsB;AAAA,QAC1C,IAEA,+BAAAA,QAAA;AAAA,UAAC;AAAA;AAAA,YACG,MAAK;AAAA,YACL,SAAS;AAAA,YACT,UAAU,CAAC;AAAA,YACX,WAAW;AAAA,cACP;AAAA,cACA;AAAA,cACA,YACM,+BACA;AAAA,YACV;AAAA,YACA,cAAW;AAAA;AAAA,UAEb,+BAAAA,QAAA,cAAC,8BAAK,WAAU,WAAS;AAAA,QAC3B,CAEN;AAAA,MACF;AAAA,IACF;AAAA,EAEN;AACJ;AAEA,UAAU,cAAc;;;AExXxB,IAAAC,iBAA8D;;;ACA9D,IAAAC,iBAAkB;;;ACAlB,IAAAC,iBAAkB;AAoBlB,IAAM,uBAA0D;AAAA,EAC9D,WAAW;AAAA,EACX,UAAU;AAAA,EACV,QAAQ;AACV;AAEA,SAAS,mBAAmB,OAA4B;AACtD,MAAI,SAAS,sBAAsB;AACjC,WAAO,qBAAqB,KAA0B;AAAA,EACxD;AACA,SAAO,MAAM,QAAQ,KAAK,KAAK;AACjC;AAEO,IAAM,YAAY,eAAAC,QAAM;AAAA,EAC3B,CACI;AAAA,IACE;AAAA,IACA,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA,cAAc;AAAA,IACd,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACC;AACH,WACI,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,WAAW,GAAG,8BAA8B,SAAS;AAAA,QACrD;AAAA,QACC,GAAG;AAAA;AAAA,MAEN,+BAAAA,QAAA;AAAA,QAAC,KAAK;AAAA,QAAL;AAAA,UACG,WAAW;AAAA,UACX,OAAO,EAAC,aAAa,mBAAmB,WAAW,EAAC;AAAA;AAAA,QAEtD,+BAAAA,QAAA,6BAAAA,QAAA,gBACG,OACG,+BAAAA,QAAA;AAAA,UAAC;AAAA;AAAA,YACG;AAAA,YACA;AAAA,YACA,WAAW;AAAA,cACP;AAAA,cACA,cAAc,UAAU,iBAAiB;AAAA,YAC7C;AAAA;AAAA,QACJ,GAEH,WACG,+BAAAA,QAAA;AAAA,UAAC;AAAA;AAAA,YACG,WAAU;AAAA;AAAA,UACX;AAAA,QACH,CAEN;AAAA,MACF;AAAA,MACA,+BAAAA,QAAA;AAAA,QAAC,KAAK;AAAA,QAAL;AAAA,UACG;AAAA,UACA;AAAA,UACA,WAAW;AAAA;AAAA,MACf;AAAA,MACC,YAAY,+BAAAA,QAAA,cAAC,KAAK,MAAL,EAAU,WAAW,oBAAmB,QAAS;AAAA,IACjE;AAAA,EAEN;AACJ;AAEA,UAAU,cAAc;;;AC7FxB,IAAAC,iBAAkB;AAClB,0BAAwB;AAwBxB,IAAMC,wBAA+D;AAAA,EACnE,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AACV;AAEA,SAASC,oBAAmB,OAAiC;AAC3D,MAAI,SAASD,uBAAsB;AACjC,WAAOA,sBAAqB,KAA+B;AAAA,EAC7D;AACA,SAAO,MAAM,QAAQ,KAAK,KAAK;AACjC;AAEO,IAAM,YAAY,eAAAE,QAAM;AAAA,EAC3B,CACI;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc;AAAA,IACd,UAAU;AAAA,IACV,WAAW;AAAA,IACX,QAAQ;AAAA,IACR;AAAA,IACA,QAAQ;AAAA,IACR,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACC;AACH,WACI,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,WAAW,GAAG,8BAA8B,SAAS;AAAA,QACrD;AAAA,QACC,GAAG;AAAA;AAAA,MAEN,+BAAAA,QAAA;AAAA,QAAC,KAAK;AAAA,QAAL;AAAA,UACG,WAAW;AAAA,UACX,OAAO,EAAC,aAAaD,oBAAmB,WAAW,EAAC;AAAA;AAAA,QAErD,OACG,+BAAAC,QAAA;AAAA,UAAC,oBAAAC;AAAA,UAAA;AAAA,YACG;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,OAAM;AAAA,YACN,QAAO;AAAA,YACP,WAAU;AAAA,YACT,GAAG;AAAA;AAAA,QACR;AAAA,MAEN;AAAA,MACA,+BAAAD,QAAA;AAAA,QAAC,KAAK;AAAA,QAAL;AAAA,UACG;AAAA,UACA;AAAA,UACA,WAAW;AAAA;AAAA,MACf;AAAA,MACC,YAAY,+BAAAA,QAAA,cAAC,KAAK,MAAL,EAAU,WAAW,oBAAmB,QAAS;AAAA,IACjE;AAAA,EAEN;AACJ;AAEA,UAAU,cAAc;;;ACnGxB,IAAAE,iBAAkB;AAClB,IAAAC,uBAAwB;AACxB,IAAAC,wBAAoB;AAoBb,IAAM,YAAY,eAAAC,QAAM;AAAA,EAC3B,CACI;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU;AAAA,IACV,WAAW;AAAA,IACX;AAAA,IACA,QAAQ;AAAA,IACR,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACC;AACH,WACI,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,WAAW,GAAG,8BAA8B,SAAS;AAAA,QACrD;AAAA,QACC,GAAG;AAAA;AAAA,MAEN,+BAAAA,QAAA,cAAC,KAAK,OAAL,EAAW,WAAW;AAAA,QAAG;AAAA,QACtB;AAAA,MAAc,KAChB,+BAAAA,QAAA,cAAC,SAAI,WAAU,oBACb,+BAAAA,QAAA,cAAC,+BAAM,MAAM,IAAG,CAClB,GAEC,OACG,+BAAAA,QAAA,cAAC,SAAI,WAAU,iBACb,+BAAAA,QAAA;AAAA,QAAC,qBAAAC;AAAA,QAAA;AAAA,UACG;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,OAAM;AAAA,UACN;AAAA,UACA,OAAO,EAAC,iBAAiB,cAAa;AAAA,UACtC,QAAQ;AAAA,YACN,MAAM;AAAA,cACJ,YAAY;AAAA,cACZ,YAAY;AAAA,gBACV,OAAO,EAAC,OAAO,QAAQ,OAAc;AAAA,cACvC;AAAA,YACF;AAAA,UACF;AAAA,UACC,GAAG;AAAA;AAAA,MACR,CACF,CAEN;AAAA,MACA,+BAAAD,QAAA;AAAA,QAAC,KAAK;AAAA,QAAL;AAAA,UACG;AAAA,UACA;AAAA,UACA,WAAW;AAAA;AAAA,MACf;AAAA,MACC,YAAY,+BAAAA,QAAA,cAAC,KAAK,MAAL,EAAU,WAAW,oBAAmB,QAAS;AAAA,IACjE;AAAA,EAEN;AACJ;AAEA,UAAU,cAAc;;;AC7FxB,IAAAE,iBAAkB;AAClB,IAAAC,wBAAuB;AAmChB,IAAM,UAAU,eAAAC,QAAM;AAAA,EACzB,CACI;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACC;AACH,WACI,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,WAAW,GAAG,8BAA8B,SAAS;AAAA,QACrD;AAAA,QACC,GAAG;AAAA;AAAA,MAEN,+BAAAA,QAAA;AAAA,QAAC,KAAK;AAAA,QAAL;AAAA,UACG,WAAW,GAAG,eAAe,cAAc;AAAA,UAC3C,OAAO,EAAC,OAAM;AAAA;AAAA,QAEf,OACG,+BAAAA,QAAA;AAAA,UAAC;AAAA;AAAA,YACG,KAAK,GAAG,GAAG;AAAA,YACX,OAAO,OAAO,UAAU,WAAW,QAAQ;AAAA,YAC3C,WAAU;AAAA;AAAA,QACd;AAAA,MAEN;AAAA,MACA,+BAAAA,QAAA;AAAA,QAAC,KAAK;AAAA,QAAL;AAAA,UACG;AAAA,UACA;AAAA,UACA,WAAW;AAAA,UACX,QACE,+BAAAA,QAAA,cAAC,SAAI,WAAU,sCACb,+BAAAA,QAAA,cAAC,kCAAS,MAAM,IAAG,CACrB;AAAA;AAAA,MAEN;AAAA,MACC,YAAY,+BAAAA,QAAA,cAAC,KAAK,MAAL,EAAU,WAAW,oBAAmB,QAAS;AAAA,IACjE;AAAA,EAEN;AACJ;AAEA,QAAQ,cAAc;;;ACvFtB,IAAAC,iBAAkB;AAQX,IAAM,uBAAuB;AAAA,EAClC,eAAe;AAAA,EACf,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,UAAU;AAAA,EACV,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,UAAU;AACZ;AA2CA,SAAS,sBAAsB,EAAC,QAAO,GAA+B;AACpE,UAAQ,QAAQ,MAAM;AAAA,IACpB,KAAK;AACH,aACI,+BAAAC,QAAA,cAAC,OAAE,WAAU,mEACV,QAAQ,OACX;AAAA,IAGN,KAAK;AACH,aACI,+BAAAA,QAAA,cAAC,OAAE,WAAU,8CACV,QAAQ,OACX;AAAA,IAGN,KAAK;AACH,aACI,+BAAAA,QAAA,cAAC,OAAE,WAAU,2EACV,QAAQ,OACX;AAAA,IAGN,KAAK;AACH,aACI,+BAAAA,QAAA,cAAC,OAAE,WAAU,wCAAqC,KAC9C,QAAQ,SAAQ,GACpB;AAAA,IAGN,KAAK;AACH,aACI,+BAAAA,QAAA,cAAC,OAAE,WAAU,mDACV,QAAQ,OACX;AAAA,IAGN,KAAK;AACH,aACI,+BAAAA,QAAA,cAAC,OAAE,WAAU,iFACV,QAAQ,OACX;AAAA,IAGN,KAAK;AACH,aACI,+BAAAA,QAAA,cAAC,OAAE,WAAU,uDACV,QAAQ,OACX;AAAA,IAGN,KAAK;AACH,aACI,+BAAAA,QAAA,cAAC,OAAE,WAAU,6CACV,QAAQ,OACX;AAAA,IAGN;AACE,aAAO;AAAA,EACX;AACF;AAyBO,IAAM,aAAa,eAAAA,QAAM;AAAA,EAC5B,CAAC,EAAC,OAAO,UAAU,UAAU,YAAY,SAAS,WAAW,OAAO,SAAS,GAAG,KAAI,GAChF,QAAQ;AACV,WACI,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,WAAW,GAAG,8BAA8B,SAAS;AAAA,QACrD;AAAA,QACC,GAAG;AAAA;AAAA,MAEN,+BAAAA,QAAA;AAAA,QAAC,KAAK;AAAA,QAAL;AAAA,UACG;AAAA,UACA;AAAA;AAAA,MACJ;AAAA,MACA,+BAAAA,QAAA;AAAA,QAAC,KAAK;AAAA,QAAL;AAAA,UACG,WAAU;AAAA,UACV,OAAO,EAAC,WAAW,GAAG,MAAK;AAAA;AAAA,QAE5B,SAAS,IAAI,CAAC,SAAS,UACpB,+BAAAA,QAAA,cAAC,yBAAsB,KAAK,OAAO,SAAiB,CACvD;AAAA,MACH;AAAA,IACF;AAAA,EAEN;AACJ;AAEA,WAAW,cAAc;;;AC7KzB,IAAAC,iBAAkB;AAsCX,IAAM,WAAW,eAAAC,QAAM;AAAA,EAC1B,CACI;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa;AAAA,IACb,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACC;AACH,WACI,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,WAAW,GAAG,8BAA8B,SAAS;AAAA,QACrD;AAAA,QACC,GAAG;AAAA;AAAA,MAEN,+BAAAA,QAAA;AAAA,QAAC,KAAK;AAAA,QAAL;AAAA,UACG;AAAA,UACA;AAAA;AAAA,MACJ;AAAA,MACA,+BAAAA,QAAA;AAAA,QAAC,KAAK;AAAA,QAAL;AAAA,UACG,WAAW,GAAG,mBAAmB,gBAAgB;AAAA,UACjD,OAAO,EAAC,UAAS;AAAA;AAAA,QAEnB,+BAAAA,QAAA;AAAA,UAAC;AAAA;AAAA,YACG;AAAA,YACA;AAAA,YACA,WAAU;AAAA;AAAA,QACd;AAAA,MACF;AAAA,IACF;AAAA,EAEN;AACJ;AAEA,SAAS,cAAc;;;ACxEhB,SAAS,sBAAsB,GAA0C;AAC9E,MAAI,CAAC,EAAE,WAAW;AAChB,WAAO;AAAA,EACT;AAEA,QAAM,SAAS;AAAA,IACb,OAAO,CAAC,EAAE;AAAA,IACV,UAAU,CAAC,EAAE;AAAA,EACf;AAEA,QAAM,cAAc,CAAC,SAAiB,CAAC,SAAS,SAAS,SAAS,KAAK,EAAE,SAAS,IAAI;AACtF,QAAM,QAAQ,YAAY,EAAE,IAAI,KAAK,CAAC,EAAE;AAExC,QAAM,OACD,EAAE,SAAS,UAAU,EAAE,EAAE,iBAAiB,EAAE,cAAc,KAAK,EAAE,WACjE,EAAE,SAAS,YAAY,EAAE,EAAE,kBAAkB,EAAE,eAAe,SAAS;AAG5E,SAAO,EAAC,QAAQ,OAAO,KAAI;AAC7B;;;APXO,IAAM,iBAAiB;AAAA,EAC5B,MAAM;AAAA,EACN,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,KAAK;AACP;AAgEO,IAAM,eAAe,eAAAC,QAAM;AAAA,EAC9B,CAAC,EAAC,UAAU,UAAU,SAAS,WAAW,GAAG,MAAK,GAAG,QAAQ;AAC3D,UAAM,iBAAiB,sBAAsB,QAAQ;AACrD,UAAM,cAAc;AAAA,MAClB,OAAO,SAAS;AAAA,MAChB,UAAU,SAAS;AAAA,MACnB,SAAS,WAAW;AAAA,MACpB,WAAW;AAAA,IACb;AAEA,UAAM,eAAe,CAAC,MAAwB;AAC5C,QAAE,gBAAgB;AAClB,UAAI,UAAU;AACZ,iBAAS,QAAQ;AAAA,MACnB;AAAA,IACF;AAEA,UAAM,gBAAgB,MAAM;AAC1B,cAAQ,SAAS,MAAM;AAAA,QACrB,KAAK;AACH,iBACI,+BAAAA,QAAA;AAAA,YAAC;AAAA;AAAA,cACI,GAAG;AAAA,cACJ,KAAK,SAAS;AAAA,cACd,KAAK,SAAS;AAAA,cACd,aAAY;AAAA;AAAA,UAChB;AAAA,QAEN,KAAK;AACH,iBACI,+BAAAA,QAAA;AAAA,YAAC;AAAA;AAAA,cACI,GAAG;AAAA,cACJ,KAAK,SAAS;AAAA,cACd,aAAY;AAAA,cACZ,UAAQ;AAAA;AAAA,UACZ;AAAA,QAEN,KAAK;AACH,iBACI,+BAAAA,QAAA;AAAA,YAAC;AAAA;AAAA,cACI,GAAG;AAAA,cACJ,KAAK,SAAS;AAAA,cACd,UAAQ;AAAA;AAAA,UACZ;AAAA,QAEN,KAAK;AACH,iBACI,+BAAAA,QAAA;AAAA,YAAC;AAAA;AAAA,cACI,GAAG;AAAA,cACJ,KAAK,SAAS;AAAA;AAAA,UAClB;AAAA,QAEN,KAAK;AACH,iBACI,+BAAAA,QAAA;AAAA,YAAC;AAAA;AAAA,cACI,GAAG;AAAA,cACJ,UAAU,SAAS,kBAAkB,CAAC;AAAA,cACtC,WAAU;AAAA;AAAA,UACd;AAAA,QAEN,KAAK;AACH,iBACI,+BAAAA,QAAA;AAAA,YAAC;AAAA;AAAA,cACI,GAAG;AAAA,cACJ,SAAS,SAAS,iBAAiB;AAAA,cACnC,YAAY,SAAS,aAAa;AAAA,cAClC,kBAAkB;AAAA,gBACd,SAAS,aAAa,gBAAgB;AAAA,cAC1C;AAAA;AAAA,UACJ;AAAA,QAEN;AACE,iBAAO;AAAA,MACX;AAAA,IACF;AAIA,UAAM,mBAAmB,CAAC,CAAC,aACvB,SAAS,SAAS,WAClB,SAAS,SAAS,SAClB,SAAS,SAAS,YAClB,SAAS,SAAS;AAGtB,WACI,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,WAAW;AAAA,UACP;AAAA,UACA,oBAAoB;AAAA,UACpB,SAAS,aAAa;AAAA,UACtB;AAAA,QACJ;AAAA,QACA,SAAS,mBAAmB,eAAe;AAAA,QAC1C,GAAG;AAAA;AAAA,MAEL,YACG,+BAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACG,SAAS;AAAA,UACT,WAAW;AAAA,YACP;AAAA,YACA;AAAA,YACA;AAAA,UACJ;AAAA,UACA,cAAW;AAAA;AAAA,QAEb,+BAAAA,QAAA,cAAC,cAAW,WAAU,WAAS;AAAA,MACjC;AAAA,MAEH,cAAc;AAAA,IACjB;AAAA,EAEN;AACJ;AAEA,aAAa,cAAc;;;AQ1M3B,IAAAC,iBAAiD;AAkBjD,IAAM,eAAe;AACrB,IAAM,kBAAkB;AAQjB,IAAM,gBAAgB,eAAAC,QAAM;AAAA,EAC/B,CAAC,EAAC,MAAM,SAAS,WAAW,GAAG,MAAK,GAAG,QAAQ;AAC7C,UAAM,WAAW,KAAK;AACtB,UAAM,QAAQ,SAAS;AACvB,UAAM,aAAa,SAAS,CAAC;AAG7B,UAAM,mBAAe,uBAAO,KAAK;AACjC,UAAM,CAAC,WAAW,YAAY,QAAI,yBAAS,KAAK;AAEhD,kCAAU,MAAM;AACd,UAAI,UAAU,aAAa,SAAS;AAClC,qBAAa,UAAU;AACvB,qBAAa,IAAI;AACjB,cAAM,QAAQ,WAAW,MAAM,aAAa,KAAK,GAAG,GAAG;AACvD,eAAO,MAAM,aAAa,KAAK;AAAA,MACjC;AAAA,IACF,GAAG,CAAC,KAAK,CAAC;AAEV,UAAM,cAAc,MAAM;AACxB,UAAI,SAAS;AACX,gBAAQ,IAAI;AAAA,MACd;AAAA,IACF;AAEA,UAAM,qBAAqB,MAAM;AAC/B,UAAI,CAAC,YAAY;AACf,eACI,+BAAAA,QAAA,cAAC,SAAI,WAAU,2FACb,+BAAAA,QAAA,cAAC,UAAK,WAAU,yBAAsB,aAAW,CACnD;AAAA,MAEN;AAEA,UAAI,WAAW,SAAS,cAAc,WAAW,UAAU;AACzD,eAAO,+BAAAA,QAAA,cAAC,gBAAa,UAAU,WAAW,UAAU,WAAU,UAAQ;AAAA,MACxE;AAGA,aACI,+BAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACG,WAAU;AAAA;AAAA,QACZ,+BAAAA,QAAA,cAAC,UAAK,WAAU,kDACb,WAAW,SAAS,UAAU,UAAU,UAC3C;AAAA,QACA,+BAAAA,QAAA,cAAC,UAAK,WAAU,8BAA4B,WAAW,KAAM;AAAA,MAC/D;AAAA,IAEN;AAEA,WACI,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,WAAW;AAAA,UACP;AAAA,UACA;AAAA,QACJ;AAAA,QACA,SAAS;AAAA,QACT,MAAK;AAAA,QACL,UAAU;AAAA,QACV,WAAW,CAAC,MAAM;AAChB,cAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,KAAK;AACtC,cAAE,eAAe;AACjB,wBAAY;AAAA,UACd;AAAA,QACF;AAAA,QACA,cAAY,GAAG,KAAK,KAAK,WAAM,KAAK;AAAA,QACnC,GAAG;AAAA;AAAA,MAEN,+BAAAA,QAAA,cAAC,QAAK,WAAS,MAAC,WAAU,SACxB,+BAAAA,QAAA,cAAC,QAAG,WAAU,+CAA6C,KAAK,KAAM,GAEtE,+BAAAA,QAAA,cAAC,SAAI,OAAO,EAAC,cAAc,iBAAiB,eAAe,gBAAe,KACxE,+BAAAA,QAAA,cAAC,SAAI,WAAU,cAEb,+BAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACG,WAAU;AAAA,UACV,OAAO,EAAC,WAAW,aAAa,eAAe,KAAK,eAAe,IAAG;AAAA,UACtE,eAAY;AAAA;AAAA,MAChB,GAGA,+BAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACG,WAAU;AAAA,UACV,OAAO,EAAC,WAAW,aAAa,YAAY,KAAK,YAAY,IAAG;AAAA,UAChE,eAAY;AAAA;AAAA,MAChB,GAGA,+BAAAA,QAAA,cAAC,SAAI,WAAU,6EACZ,mBAAmB,CACtB,GAGA,+BAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACG,WAAU;AAAA,UACV,OAAO,YAAY,EAAC,WAAW,gCAA+B,IAAI;AAAA;AAAA,QAEnE;AAAA,MACH,CACF,CACF,CACF;AAAA,IACF;AAAA,EAEN;AACJ;AAEA,cAAc,cAAc;;;ACvI5B,IAAAC,iBAAkB;AA6BX,IAAM,uBAAuB,eAAAC,QAAM;AAAA,EACtC,CAAC,EAAC,MAAM,kBAAkB,cAAc,WAAW,GAAG,MAAK,GAAG,QAAQ;AACpE,UAAM,WAAW,KAAK;AAEtB,UAAM,cAAc,CAAC,UAAwB;AAC3C,UAAI,MAAM,SAAS,cAAc,MAAM,UAAU;AAC/C,eACI,+BAAAA,QAAA,cAAC,SAAI,KAAK,MAAM,IAAI,WAAU,oBAC5B,+BAAAA,QAAA;AAAA,UAAC;AAAA;AAAA,YACG,UAAU,MAAM;AAAA,YAChB,UAAU;AAAA,YACV,WAAU;AAAA;AAAA,QACd,CACF;AAAA,MAEN;AAEA,UAAI,MAAM,SAAS,SAAS;AAC1B,eACI,+BAAAA,QAAA,cAAC,SAAI,KAAK,MAAM,IAAI,WAAU,oBAC5B,+BAAAA,QAAA,cAAC,iBAAc,MAAM,OAAO,SAAS,cAAa,CACpD;AAAA,MAEN;AAGA,aACI,+BAAAA,QAAA,cAAC,SAAI,KAAK,MAAM,IAAI,WAAU,oBAC5B,+BAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACG,WAAU;AAAA;AAAA,QACZ,+BAAAA,QAAA,cAAC,UAAK,WAAU,kDAA+C,UAAQ;AAAA,QACvE,+BAAAA,QAAA,cAAC,UAAK,WAAU,0DACb,MAAM,KACT;AAAA,MACF,CACF;AAAA,IAEN;AAEA,WACI,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,WAAS;AAAA,QACT,WAAW,GAAG,cAAc,SAAS;AAAA,QACpC,GAAG;AAAA;AAAA,MAEN,+BAAAA,QAAA,cAAC,QAAG,WAAU,+CAA6C,KAAK,KAAM;AAAA,MACtE,+BAAAA,QAAA,cAAC,SAAI,WAAU,gBACZ,SAAS,IAAI,WAAW,CAC3B;AAAA,IACF;AAAA,EAEN;AACJ;AAEA,qBAAqB,cAAc;;;ACpFnC,IAAAC,iBAA6C;AAoCtC,SAAS,0BAA0B,WAA4D;AAEpG,QAAM,CAAC,OAAO,QAAQ,QAAI,yBAAyB,CAAC,CAAC;AAErD,QAAM,mBAAe,wBAAQ,MAAM;AACjC,QAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,WAAO,MAAM,MAAM,SAAS,CAAC,EAAE;AAAA,EACjC,GAAG,CAAC,WAAW,KAAK,CAAC;AAErB,QAAM,kBAAc,wBAA2B,MAAM;AACnD,UAAM,UAA6B,CAAC,EAAC,OAAO,WAAW,MAAM,KAAI,CAAC;AAClE,eAAW,QAAQ,OAAO;AACxB,cAAQ,KAAK,EAAC,OAAO,KAAK,OAAO,KAAI,CAAC;AAAA,IACxC;AACA,WAAO;AAAA,EACT,GAAG,CAAC,KAAK,CAAC;AAEV,QAAM,WAAW,MAAM,WAAW;AAElC,QAAM,mBAAe,4BAAY,CAAC,SAAuB;AACvD,aAAS,UAAQ,CAAC,GAAG,MAAM,IAAI,CAAC;AAAA,EAClC,GAAG,CAAC,CAAC;AAEL,QAAM,iBAAa,4BAAY,CAAC,UAAkB;AAEhD,aAAS,UAAQ,KAAK,MAAM,GAAG,KAAK,CAAC;AAAA,EACvC,GAAG,CAAC,CAAC;AAEL,QAAM,mBAAe,4BAAY,MAAM;AACrC,aAAS,UAAQ,KAAK,MAAM,GAAG,EAAE,CAAC;AAAA,EACpC,GAAG,CAAC,CAAC;AAEL,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AX5DA,IAAM,cAAc,CAAC,MAAM,KAAK,MAAM,CAAG;AAgBzC,SAAS,cAAc;AAAA,EACrB;AAAA,EACA;AACF,GAGG;AAED,gCAAU,MAAM;AACd,UAAM,gBAAgB,CAAC,MAAqB;AAC1C,UAAI,EAAE,QAAQ,UAAU;AACtB,gBAAQ;AAAA,MACV;AAAA,IACF;AACA,aAAS,iBAAiB,WAAW,aAAa;AAClD,WAAO,MAAM,SAAS,oBAAoB,WAAW,aAAa;AAAA,EACpE,GAAG,CAAC,OAAO,CAAC;AAGZ,QAAM,0BAAsB,4BAAY,CAAC,MAAwB;AAC/D,QAAI,EAAE,WAAW,EAAE,eAAe;AAChC,cAAQ;AAAA,IACV;AAAA,EACF,GAAG,CAAC,OAAO,CAAC;AAEZ,SACI,+BAAAC,QAAA;AAAA,IAAC;AAAA;AAAA,MACG,WAAU;AAAA,MACV,SAAS;AAAA;AAAA,IAEX,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG,WAAU;AAAA;AAAA,MAEZ,+BAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACG,WAAU;AAAA;AAAA,QACZ,+BAAAA,QAAA,cAAC,aACE,SAAS,SACN,+BAAAA,QAAA,cAAC,QAAG,WAAU,sCAAoC,SAAS,KAAM,GAEpE,SAAS,YACN,+BAAAA,QAAA,cAAC,OAAE,WAAU,yBAAuB,SAAS,QAAS,CAE5D;AAAA,QACA,+BAAAA,QAAA;AAAA,UAAC;AAAA;AAAA,YACG,SAAS;AAAA,YACT,WAAU;AAAA,YACV,cAAW;AAAA;AAAA,UAEb,+BAAAA,QAAA,cAAC,aAAU,WAAU,WAAS;AAAA,QAChC;AAAA,MACF;AAAA,MAGA,+BAAAA,QAAA,cAAC,SAAI,WAAU,8BACZ,SAAS,SAAS,WACf,+BAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACG,KAAK,SAAS;AAAA,UACd,KAAK,SAAS,OAAO;AAAA,UACrB,WAAU;AAAA;AAAA,MACd,GAEH,SAAS,SAAS,WACf,+BAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACG,KAAK,SAAS,OAAO;AAAA,UACrB,aAAY;AAAA,UACZ,UAAQ;AAAA,UACR,WAAU;AAAA;AAAA,MACd,GAEH,SAAS,SAAS,WACf,+BAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACG,KAAK,SAAS,OAAO;AAAA,UACrB,UAAQ;AAAA,UACR,WAAU;AAAA;AAAA,MACd,GAEH,SAAS,SAAS,SACf,+BAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACG,KAAK,SAAS,OAAO;AAAA,UACrB,WAAU;AAAA;AAAA,MACd,GAEH,SAAS,SAAS,UACf,+BAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACG,SAAS,SAAS,iBAAiB;AAAA,UACnC,YAAY,SAAS,aAAa;AAAA,UAClC,WAAW;AAAA,YACP;AAAA,YACA,SAAS,aAAa,gBAAgB;AAAA,UAC1C;AAAA;AAAA,MACJ,GAEH,SAAS,SAAS,YAAY,SAAS,kBACpC,+BAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACG,UAAU,SAAS;AAAA,UACnB,WAAU;AAAA,UACV,WAAU;AAAA;AAAA,MACd,CAEN;AAAA,IACF;AAAA,EACF;AAEN;AAKA,SAAS,aAAa;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKG;AACD,MAAI,KAAK,SAAS,cAAc,KAAK,UAAU;AAC7C,WACI,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG,UAAU,KAAK;AAAA,QACf;AAAA,QACA,UAAU;AAAA;AAAA,IACd;AAAA,EAEN;AAEA,MAAI,KAAK,SAAS,SAAS;AACzB,WAAO,+BAAAA,QAAA,cAAC,iBAAc,MAAY,SAAS,cAAa;AAAA,EAC1D;AAEA,MAAI,KAAK,SAAS,eAAe;AAC/B,WACI,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA;AAAA,QACA;AAAA;AAAA,IACJ;AAAA,EAEN;AAEA,SAAO;AACT;AAiBO,IAAM,iBAAiB,eAAAA,QAAM;AAAA,EAChC,CAAC;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,GAAG,QAAQ;AACT,UAAM,CAAC,kBAAkB,mBAAmB,QAAI,yBAA0B,IAAI;AAC9E,UAAM,CAAC,WAAW,YAAY,QAAI,yBAAiB,YAAY,SAAS,CAAC;AAEzE,UAAM,UAAU,0BAA0B,SAAS,CAAC,CAAC;AAErD,UAAM,WAAW,CAAC,CAAC,SAAS,MAAM,SAAS;AAE3C,UAAM,2BAAuB,4BAAY,CAAC,aAAuB;AAC/D,0BAAoB,QAAQ;AAAA,IAC9B,GAAG,CAAC,CAAC;AAEL,UAAM,uBAAmB,4BAAY,CAAC,SAAuB;AAC3D,cAAQ,aAAa,IAAI;AAAA,IAC3B,GAAG,CAAC,OAAO,CAAC;AAEZ,UAAM,aAAS,4BAAY,MAAM;AAC/B,mBAAa,UAAQ,KAAK,IAAI,OAAO,GAAG,YAAY,SAAS,CAAC,CAAC;AAAA,IACjE,GAAG,CAAC,CAAC;AAEL,UAAM,cAAU,4BAAY,MAAM;AAChC,mBAAa,UAAQ,KAAK,IAAI,OAAO,GAAG,CAAC,CAAC;AAAA,IAC5C,GAAG,CAAC,CAAC;AAEL,UAAM,cAAc,YAAY,SAAS;AAGzC,UAAM,iBAAa,uBAAuB,IAAI;AAC9C,UAAM,CAAC,eAAe,gBAAgB,QAAI,yBAA6B,MAAS;AAEhF,kCAAU,MAAM;AACd,YAAM,KAAK,WAAW;AACtB,UAAI,CAAC,GAAI;AACT,YAAM,WAAW,IAAI,eAAe,CAAC,CAAC,KAAK,MAAM;AAC/C,yBAAiB,MAAM,YAAY,MAAM;AAAA,MAC3C,CAAC;AACD,eAAS,QAAQ,EAAE;AACnB,aAAO,MAAM,SAAS,WAAW;AAAA,IACnC,GAAG,CAAC,CAAC;AAEL,WACI,+BAAAA,QAAA,6BAAAA,QAAA,gBACE,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,eAAY;AAAA,QACZ,WAAW;AAAA,UACP;AAAA,UACA;AAAA,QACJ;AAAA,QACC,GAAG;AAAA;AAAA,MAGN,+BAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACG,WAAU;AAAA;AAAA,QACZ,+BAAAA,QAAA,cAAC,QAAG,WAAU,sCAAmC,WAAS;AAAA,QACzD,YACG,+BAAAA,QAAA;AAAA,UAAC;AAAA;AAAA,YACG,WAAU;AAAA,YACV,eAAY;AAAA;AAAA,UAEd,+BAAAA,QAAA;AAAA,YAAC;AAAA;AAAA,cACG,SAAS;AAAA,cACT,UAAU,cAAc;AAAA,cACxB,WAAW;AAAA,gBACP;AAAA,gBACA;AAAA,gBACA,cAAc,IACR,sCACA;AAAA,cACV;AAAA,cACA,cAAW;AAAA;AAAA,YACd;AAAA,UAED;AAAA,UACA,+BAAAA,QAAA,cAAC,UAAK,WAAU,oDAAmD,eAAY,gBAC5E,KAAK,MAAM,cAAc,GAAG,GAAE,GACjC;AAAA,UACA,+BAAAA,QAAA;AAAA,YAAC;AAAA;AAAA,cACG,SAAS;AAAA,cACT,UAAU,cAAc,YAAY,SAAS;AAAA,cAC7C,WAAW;AAAA,gBACP;AAAA,gBACA;AAAA,gBACA,cAAc,YAAY,SAAS,IAC7B,sCACA;AAAA,cACV;AAAA,cACA,cAAW;AAAA;AAAA,YACd;AAAA,UAED;AAAA,QACF;AAAA,MAEN;AAAA,MAGC,YAAY,CAAC,QAAQ,YAClB,+BAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACG,WAAU;AAAA,UACV,cAAW;AAAA,UACX,eAAY;AAAA;AAAA,QAEb,QAAQ,YAAY,IAAI,CAAC,OAAO,MAAM;AACrC,gBAAM,SAAS,MAAM,QAAQ,YAAY,SAAS;AAClD,iBACI,+BAAAA,QAAA,cAAC,UAAK,KAAK,GAAG,WAAU,sCAC3B,IAAI,KACD,+BAAAA,QAAA,cAAC,oBAAiB,WAAU,0BAAyB,eAAW,SAE7D,SACG,+BAAAA,QAAA,cAAC,UAAK,WAAU,2BAAyB,MAAM,KAAM,IAErD,+BAAAA,QAAA;AAAA,YAAC;AAAA;AAAA,cACG,SAAS,MAAM,QAAQ,WAAW,CAAC;AAAA,cACnC,WAAU;AAAA;AAAA,YAEX,MAAM;AAAA,UACT,CAEZ;AAAA,QAEA,CAAC;AAAA,MACH;AAAA,MAIJ,+BAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACG,WAAU;AAAA,UACV,eAAY;AAAA;AAAA,QAGd,+BAAAA,QAAA;AAAA,UAAC;AAAA;AAAA,YACG,OAAO,gBAAgB,KAAK,kBAAkB,SACxC,EAAE,QAAQ,gBAAgB,YAAY,IACtC;AAAA;AAAA,UAGR,+BAAAA,QAAA;AAAA,YAAC;AAAA;AAAA,cACG,KAAK;AAAA,cACL,eAAY;AAAA,cACZ,WAAU;AAAA,cACV,OAAO,gBAAgB,IACjB;AAAA,gBACA,WAAW,SAAS,WAAW;AAAA,gBAC/B,iBAAiB;AAAA,cACnB,IACE;AAAA;AAAA,YAGT,QAAQ,aAAa,WAAW,IAC7B,+BAAAA,QAAA,cAAC,OAAE,WAAU,6CACV,WAAW,gBAAgB,yBAC9B,IAEA,QAAQ,aAAa,IAAI,CAAC,SACtB,+BAAAA,QAAA;AAAA,cAAC;AAAA;AAAA,gBACG,KAAK,KAAK;AAAA,gBACV;AAAA,gBACA;AAAA,gBACA,kBAAkB;AAAA,gBAClB,cAAc;AAAA;AAAA,YAClB,CACH;AAAA,UAEL;AAAA,QACF;AAAA,MACF;AAAA,IAEF,GAGC,oBACG,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG,UAAU;AAAA,QACV,SAAS,MAAM,oBAAoB,IAAI;AAAA;AAAA,IAC3C,CAEN;AAAA,EAEN;AACJ;AAEA,eAAe,cAAc;AAUtB,IAAM,uBAAuB,eAAAA,QAAM,WAGxC,CAAC,EAAC,gBAAgB,GAAG,UAAU,WAAW,GAAG,KAAI,GAAG,QAAQ;AAC5D,SACI,+BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACG;AAAA,MACA,SAAS;AAAA,MACT,WAAW;AAAA,QACP;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACJ;AAAA,MACA,cAAW;AAAA,MACV,GAAG;AAAA;AAAA,IAEN,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG,OAAM;AAAA,QACN,SAAQ;AAAA,QACR,MAAK;AAAA,QACL,WAAU;AAAA;AAAA,MAEZ,+BAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACG,UAAS;AAAA,UACT,GAAE;AAAA,UACF,UAAS;AAAA;AAAA,MACb;AAAA,IACF;AAAA,IACC,gBAAgB,KACb,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG,WAAU;AAAA;AAAA,MACf;AAAA,IACH;AAAA,EAEF;AAEN,CAAC;AAED,qBAAqB,cAAc;;;AYjbnC,IAAAC,iBAA6B;AAItB,IAAM,gBAAgB;AAAA,EAC3B,SAAS;AAAA,EACT,aAAa;AAAA,EACb,MAAM;AAAA,EACN,WAAW;AAAA,EACX,QAAQ;AACV;AAsCA,SAAS,SAAS,EAAC,OAAM,GAA2B;AAClD,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO,+BAAAC,QAAA,cAAC,qBAAe;AAAA,IACzB,KAAK;AACH,aAAO,+BAAAA,QAAA,cAAC,sBAAgB;AAAA,IAC1B,KAAK;AACH,aAAO,+BAAAA,QAAA,cAAC,mBAAgB,SAAQ,aAAW;AAAA,IAC7C,KAAK;AACH,aAAO,+BAAAA,QAAA,cAAC,mBAAgB,SAAQ,UAAQ;AAAA,IAC1C,KAAK;AAAA,IACL;AACE,aAAO,+BAAAA,QAAA,cAAC,qBAAe;AAAA,EAC3B;AACF;AAMA,SAAS,UAAU,OAAuB;AACxC,QAAM,SAAiB,CAAC;AACxB,QAAM,cAAsB,CAAC;AAE7B,aAAW,QAAQ,OAAO;AACxB,QAAI,KAAK,WAAW,eAAe,KAAK,WAAW,UAAU;AAC3D,kBAAY,KAAK,IAAI;AAAA,IACvB,OAAO;AACL,aAAO,KAAK,IAAI;AAAA,IAClB;AAAA,EACF;AAEA,SAAO,CAAC,GAAG,QAAQ,GAAG,WAAW;AACnC;AAKA,SAAS,SAAS,EAAC,MAAM,QAAQ,EAAC,GAAmC;AACnE,QAAM,aAAa,KAAK,WAAW,UAAU,KAAK,WAAW,eAAe,KAAK,WACzE;AACR,QAAM,WAAW,KAAK,WAAW,eAAe,KAAK,WAAW;AAGhE,QAAM,gBAAgB,KAAK,WAAW,iBAAiB,KAAK,WAAW,WACnE,KAAK,YAAY,KAAK,SAAS,SAAS;AAC5C,QAAM,iBAAiB,eAAe,UAAU,KAAK,QAAS,IAAI,CAAC;AAEnE,SACI,+BAAAA,QAAA,cAAC,SAAI,WAAU,mBACb,+BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACG,WAAW;AAAA,QACP;AAAA,QACA,QAAQ,KAAK;AAAA,MACjB;AAAA;AAAA,IAEF,+BAAAA,QAAA,cAAC,YAAS,QAAQ,KAAK,QAAO;AAAA,IAC9B,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG,WAAW;AAAA,UACP;AAAA,UACA,cAAc;AAAA,UACd,WAAW,mBAAmB;AAAA,UAC9B,KAAK,WAAW,iBAAiB;AAAA,UACjC,KAAK,WAAW,UAAU;AAAA,QAC9B;AAAA;AAAA,MAEH,KAAK;AAAA,MACH,KAAK,WAAW,eACb,+BAAAA,QAAA,cAAC,UAAK,WAAU,yBAAsB,aAAW;AAAA,MAEpD,KAAK,WAAW,YACb,+BAAAA,QAAA,cAAC,UAAK,WAAU,wBAAqB,UAAQ;AAAA,IAErD;AAAA,EACA,GAGC,gBACG,+BAAAA,QAAA,cAAC,SAAI,WAAU,mBACZ,eAAe,IAAI,CAAC,YACjB,+BAAAA,QAAA,cAAC,YAAS,KAAK,QAAQ,IAAI,MAAM,SAAS,OAAO,QAAQ,GAAE,CAC9D,CACH,CAEN;AAEN;AAkBO,IAAM,YAAY,eAAAA,QAAM;AAAA,EAC3B,CAAC,EAAC,OAAO,QAAQ,SAAS,WAAW,GAAG,KAAI,GAAG,QAAQ;AACrD,UAAM,kBAAc,wBAAQ,MAAM,UAAU,KAAK,GAAG,CAAC,KAAK,CAAC;AAG3D,UAAM,iBAAiB,CAAC,aAA6B;AACnD,UAAI,QAAQ;AACZ,iBAAW,QAAQ,UAAU;AAC3B,YAAI,KAAK,WAAW,QAAQ;AAC1B;AAAA,QACF;AACA,YAAI,KAAK,UAAU;AACjB,mBAAS,eAAe,KAAK,QAAQ;AAAA,QACvC;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAEA,UAAM,aAAa,CAAC,aAA6B;AAC/C,UAAI,QAAQ,SAAS;AACrB,iBAAW,QAAQ,UAAU;AAC3B,YAAI,KAAK,UAAU;AACjB,mBAAS,WAAW,KAAK,QAAQ;AAAA,QACnC;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAEA,QAAI,MAAM,WAAW,GAAG;AACtB,aAAO;AAAA,IACT;AAEA,WACI,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,WAAW;AAAA,UACP;AAAA,UACA;AAAA,UACA;AAAA,QACJ;AAAA,QACC,GAAG;AAAA;AAAA,MAGN,+BAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACG,WAAU;AAAA;AAAA,QACZ,+BAAAA,QAAA,cAAC,QAAG,WAAU,oCAAkC,KAAM;AAAA,QACtD,+BAAAA,QAAA,cAAC,UAAK,WAAU,4BACjB,eAAe,KAAK,GAAE,KAAE,WAAW,KAAK,CAC3C;AAAA,MACE;AAAA,MAGA,+BAAAA,QAAA,cAAC,SAAI,WAAU,sCACZ,YAAY,IAAI,CAAC,SACd,+BAAAA,QAAA,cAAC,YAAS,KAAK,KAAK,IAAI,MAAW,CACtC,CACH;AAAA,IACF;AAAA,EAEN;AACJ;AAEA,UAAU,cAAc;AAMjB,SAAS,mBAAmB,OAAwB;AACzD,SAAO,MAAM,MAAM,OAAK;AACtB,UAAM,UAAU,EAAE,WAAW,UAAU,EAAE,WAAW,eAAe,EAAE,WAAW;AAChF,QAAI,CAAC,QAAS,QAAO;AACrB,QAAI,EAAE,YAAY,EAAE,SAAS,SAAS,EAAG,QAAO,mBAAmB,EAAE,QAAQ;AAC7E,WAAO;AAAA,EACT,CAAC;AACH;;;ACnOA,IAAAC,iBAAkB;AAmGX,IAAM,cAAc,eAAAC,QAAM;AAAA,EAC7B,CAAC,EAAC,OAAO,aAAa,cAAc,MAAM,WAAW,GAAG,KAAI,GAAG,QAAQ;AACrE,UAAM,WAAW,MAAM,OAAO,OAAK,EAAE,UAAU,OAAO,IAAI,EAAE;AAC5D,UAAM,cAAc,MAAM,OAAO,OAAK,EAAE,UAAU,UAAU,IAAI,EAAE;AAElE,UAAM,WAAW,CAAC,WAAmB;AACnC,YAAM,OAAO,MAAM,KAAK,OAAK,EAAE,OAAO,MAAM;AAC5C,UAAI,CAAC,KAAM,QAAO;AAClB,aAAO,YAAY,KAAK,KAAK,MAAM;AAAA,IACrC;AAEA,UAAM,eAAe,CAAC,SAAyB;AAC7C,YAAM,SAAS,SAAS,KAAK,EAAE;AAC/B,aACI,+BAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACG,KAAK,KAAK;AAAA,UACV,SAAS,MAAM,aAAa,KAAK,EAAE;AAAA,UACnC,WAAW;AAAA,YACP;AAAA,YACA,SACM,+CACA;AAAA,UACV;AAAA,UACA,cAAY,KAAK;AAAA,UACjB,gBAAc;AAAA;AAAA,QAEhB,+BAAAA,QAAA,cAAC,UAAK,WAAU,mBACb,KAAK,IACR;AAAA,MACF;AAAA,IAEN;AAEA,WACI,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,WAAW;AAAA,UACP;AAAA,UACA,SAAS,SAAS,2BAA2B;AAAA,UAC7C;AAAA,QACJ;AAAA,QACC,GAAG;AAAA;AAAA,MAGN,+BAAAA,QAAA,cAAC,SAAI,WAAU,sCACZ,SAAS,IAAI,YAAY,CAC5B;AAAA,MAGA,+BAAAA,QAAA,cAAC,SAAI,WAAU,6CACb,+BAAAA,QAAA,cAAC,SAAI,WAAU,8BAA4B,CAC7C;AAAA,MAGA,+BAAAA,QAAA,cAAC,SAAI,WAAU,sCACZ,YAAY,IAAI,YAAY,CAC/B;AAAA,IACF;AAAA,EAEN;AACJ;AAEA,YAAY,cAAc;;;ACjK1B,IAAAC,iBAA8D;AAoCvD,IAAM,qBAAqB,eAAAC,QAAM;AAAA,EACpC,CAAC,EAAC,YAAY,eAAe,OAAO,eAAe,OAAO,SAAS,WAAW,GAAG,KAAI,GAAG,QAAQ;AAC9F,UAAM,CAAC,YAAY,aAAa,QAAI,yBAAS,EAAE;AAC/C,UAAM,CAAC,kBAAkB,mBAAmB,QAAI,yBAAS,KAAK;AAC9D,UAAM,mBAAe,uBAAuB,IAAI;AAChD,UAAM,YAAQ,uBAAsB,IAAI;AAExC,UAAM,UAAU,eAAe,QAAQ,kBAAkB;AAGzD,UAAM,wBAAoB,4BAAY,CAAC,MAAwB;AAC7D,QAAE,eAAe;AACjB,0BAAoB,IAAI;AACxB,YAAM,UAAU,EAAE;AAAA,IACpB,GAAG,CAAC,CAAC;AAEL,UAAM,uBAAmB,4BAAY,MAAM;AACzC,0BAAoB,KAAK;AACzB,YAAM,UAAU;AAAA,IAClB,GAAG,CAAC,CAAC;AAEL,UAAM,mBAAe;AAAA,MACjB,CAAC,MAAkB;AACjB,YAAI,CAAC,oBAAoB,MAAM,YAAY,QAAQ,CAAC,aAAa,QAAS;AAE1E,cAAM,kBAAkB,aAAa,QAAQ,sBAAsB,EAAE;AACrE,YAAI,oBAAoB,EAAG;AAE3B,cAAM,SAAS,EAAE,UAAU,MAAM;AACjC,cAAM,eAAgB,SAAS,kBAAmB;AAElD,sBAAc,UAAQ;AACpB,gBAAM,OAAO,OAAO;AACpB,iBAAO,KAAK,IAAI,KAAK,IAAI,MAAM,EAAE,GAAG,EAAE;AAAA,QACxC,CAAC;AAED,cAAM,UAAU,EAAE;AAAA,MACpB;AAAA,MACA,CAAC,gBAAgB;AAAA,IACrB;AAEA,kCAAU,MAAM;AACd,UAAI,kBAAkB;AACpB,eAAO,iBAAiB,aAAa,YAAY;AACjD,eAAO,iBAAiB,WAAW,gBAAgB;AACnD,iBAAS,KAAK,MAAM,SAAS;AAC7B,iBAAS,KAAK,MAAM,aAAa;AAAA,MACnC,OAAO;AACL,eAAO,oBAAoB,aAAa,YAAY;AACpD,eAAO,oBAAoB,WAAW,gBAAgB;AACtD,iBAAS,KAAK,MAAM,SAAS;AAC7B,iBAAS,KAAK,MAAM,aAAa;AAAA,MACnC;AAEA,aAAO,MAAM;AACX,eAAO,oBAAoB,aAAa,YAAY;AACpD,eAAO,oBAAoB,WAAW,gBAAgB;AACtD,iBAAS,KAAK,MAAM,SAAS;AAC7B,iBAAS,KAAK,MAAM,aAAa;AAAA,MACnC;AAAA,IACF,GAAG,CAAC,kBAAkB,cAAc,gBAAgB,CAAC;AAErD,WACI,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG,KAAK,CAAC,SAAS;AAEb,UAAC,aAA+D,UAAU;AAC1E,cAAI,OAAO,QAAQ,WAAY,KAAI,IAAI;AAAA,mBAC9B,IAAK,CAAC,IAAsD,UAAU;AAAA,QACjF;AAAA,QACA,WAAW;AAAA,UACP;AAAA,UACA,SAAS,SAAS,2BAA2B;AAAA,UAC7C;AAAA,QACJ;AAAA,QACA,OAAO,QAAQ,EAAC,MAAK,IAAI;AAAA,QACxB,GAAG;AAAA;AAAA,MAGN,+BAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACG,aAAa;AAAA,UACb,WAAW;AAAA,YACP;AAAA,YACA;AAAA,YACA,SAAS,SACH,oEACA;AAAA,UACV;AAAA;AAAA,MACJ;AAAA,MAGC,eAAe,QACZ,+BAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACG,WAAU;AAAA,UACV,OAAO,UAAU,EAAC,QAAQ,GAAG,UAAU,IAAG,IAAI,EAAC,MAAM,SAAQ;AAAA;AAAA,QAE9D;AAAA,MACH;AAAA,MAIH,WACG,+BAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACG,aAAa;AAAA,UACb,WAAW;AAAA,YACP;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACJ;AAAA;AAAA,MACJ;AAAA,MAIH,kBAAkB,QACf,+BAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACG,WAAU;AAAA,UACV,OAAO,UAAU,EAAC,QAAQ,GAAG,MAAM,UAAU,IAAG,IAAI,EAAC,MAAM,SAAQ;AAAA;AAAA,QAEpE;AAAA,MACH;AAAA,IAEN;AAAA,EAEN;AACJ;AAEA,mBAAmB,cAAc;;;ACnKjC,IAAAC,iBAAuD;AAyBhD,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAsB;AACpB,QAAM,CAAC,cAAc,eAAe,QAAI,yBAAS,mBAAmB;AACpE,QAAM,CAAC,YAAY,aAAa,QAAI,yBAAS,KAAK;AAClD,QAAM,YAAQ,uBAAsB,IAAI;AAExC,QAAM,oBAAgB,4BAAY,CAAC,MAAwB;AACzD,MAAE,eAAe;AACjB,kBAAc,IAAI;AAClB,UAAM,UAAU,EAAE;AAAA,EACpB,GAAG,CAAC,CAAC;AAEL,QAAM,mBAAe,4BAAY,MAAM;AACrC,kBAAc,KAAK;AACnB,UAAM,UAAU;AAAA,EAClB,GAAG,CAAC,CAAC;AAEL,QAAM,aAAS;AAAA,IACX,CAAC,MAAkB;AACjB,UAAI,CAAC,cAAc,MAAM,YAAY,MAAM;AACzC;AAAA,MACF;AAEA,YAAM,SAAS,EAAE,UAAU,MAAM;AACjC,YAAM,SAAS,cAAc,UAAU,IAAI;AAE3C,YAAM,eAAgB,SAAS,OAAO,aAAc;AAEpD,sBAAgB,CAAC,gBAAgB;AAC/B,cAAM,aAAa,cAAc,eAAe;AAChD,eAAO,KAAK,IAAI,KAAK,IAAI,YAAY,eAAe,GAAG,eAAe;AAAA,MACxE,CAAC;AAED,YAAM,UAAU,EAAE;AAAA,IACpB;AAAA,IACA,CAAC,YAAY,WAAW,iBAAiB,eAAe;AAAA,EAC5D;AAEA,gCAAU,MAAM;AACd,QAAI,YAAY;AACd,aAAO,iBAAiB,aAAa,MAAM;AAC3C,aAAO,iBAAiB,WAAW,YAAY;AAC/C,eAAS,KAAK,MAAM,SAAS;AAC7B,eAAS,KAAK,MAAM,aAAa;AAAA,IACnC,OAAO;AACL,aAAO,oBAAoB,aAAa,MAAM;AAC9C,aAAO,oBAAoB,WAAW,YAAY;AAClD,eAAS,KAAK,MAAM,SAAS;AAC7B,eAAS,KAAK,MAAM,aAAa;AAAA,IACnC;AAEA,WAAO,MAAM;AACX,aAAO,oBAAoB,aAAa,MAAM;AAC9C,aAAO,oBAAoB,WAAW,YAAY;AAClD,eAAS,KAAK,MAAM,SAAS;AAC7B,eAAS,KAAK,MAAM,aAAa;AAAA,IACnC;AAAA,EACF,GAAG,CAAC,YAAY,QAAQ,YAAY,CAAC;AAGrC,QAAM,QAAQ,GAAG,YAAY;AAE7B,SAAO,EAAC,OAAO,cAAc,YAAY,cAAa;AACxD;;;AtB4FO,IAAM,gBAAgB,eAAAC,QAAM;AAAA,EAC/B,CACI;AAAA,IACE,WAAW,CAAC;AAAA,IACZ;AAAA,IACA;AAAA,IACA,gBAAgB,CAAC;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc;AAAA,IACd,aAAa;AAAA,IACb,cAAc;AAAA,IACd,mBAAmB;AAAA,IACnB;AAAA,IACA,uBAAuB;AAAA,IACvB,uBAAuB;AAAA,IACvB,aAAa;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ,CAAC;AAAA,IACT;AAAA,IACA,OAAO,gBAAgB,CAAC;AAAA,IACxB;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACC;AACH,UAAM,2BAAuB,uBAAuB,CAAC,CAAC;AACtD,UAAM,mBAAe,uBAAe,CAAC,CAAC;AAGtC,UAAM,CAAC,eAAe,gBAAgB,QAAI,yBAAyB;AAAA,MACjE,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,aAAa;AAAA,MACb,gBAAgB;AAAA,IAClB,CAAC;AAGD,UAAM,wBAAoB,uBAAoB,oBAAI,IAAI,CAAC;AAGvD,UAAM,oBAAoB,yBAAyB;AAGnD,UAAM,kBAA8B,wBAAQ,MAAM;AAChD,UAAI,mBAAmB;AACrB,eAAO;AAAA,UACL,GAAG;AAAA,UACH,aAAa,uBAAuB,cAAc,cAAc,WAAW;AAAA,QAC7E;AAAA,MACF;AACA,aAAO;AAAA,IACT,GAAG,CAAC,mBAAmB,sBAAsB,aAAa,CAAC;AAE3D,UAAM,kBAAkB,YAAY,UAAU,MAAM,QAAQ,YAAY,aAAa,MAC7E;AACR,UAAM,mBAAmB,YAAY,WAAW,MAAM,QAAQ,YAAY,cAAc,MAChF;AAGR,UAAM;AAAA,MACJ,OAAO;AAAA,MACP,eAAe;AAAA,IACjB,IAAI,aAAa;AAAA,MACf,qBAAqB;AAAA,MACrB,iBAAiB;AAAA,MACjB,iBAAiB;AAAA,MACjB,WAAW;AAAA,IACb,CAAC;AAED,UAAM;AAAA,MACJ,OAAO;AAAA,MACP,eAAe;AAAA,IACjB,IAAI,aAAa;AAAA,MACf,qBAAqB;AAAA,MACrB,iBAAiB;AAAA,MACjB,iBAAiB;AAAA,MACjB,WAAW;AAAA,IACb,CAAC;AAGD,UAAM,aAAa,MAAM,WAAW,KAAK,mBAAmB,KAAK;AAGjE,UAAM,yBAAuC,wBAAQ,MAAM;AACzD,YAAM,UAA4B;AAAA,QAChC,EAAC,IAAI,WAAW,MAAM,+BAAAA,QAAA,cAAC,oBAAc,GAAI,OAAO,WAAW,OAAO,WAAU;AAAA,QAC5E,EAAC,IAAI,aAAa,MAAM,+BAAAA,QAAA,cAAC,eAAS,GAAI,OAAO,aAAa,OAAO,YAAW;AAAA,QAC5E;AAAA,UACE,IAAI;AAAA,UACJ,MAAM,aAAa,+BAAAA,QAAA,cAAC,qBAAe,IAAK,+BAAAA,QAAA,cAAC,sBAAgB;AAAA,UACzD,OAAO;AAAA,UACP,OAAO;AAAA,QACT;AAAA,MACF;AACA,YAAM,WAA6B,cAAc,IAAI,CAAC,EAAC,SAAS,UAAU,GAAG,IAAG,MAAM,GAAG;AACzF,aAAO,CAAC,GAAG,SAAS,GAAG,QAAQ;AAAA,IACjC,GAAG,CAAC,YAAY,aAAa,CAAC;AAG9B,UAAM,iBAAa,4BAAY,CAAC,WAAmB;AAEjD,YAAM,UAAU,mBAAmB,KAAK,OAAK,EAAE,OAAO,MAAM;AAC5D,UAAI,CAAC,SAAS;AACZ;AAAA,MACF;AAEA,YAAM,QAAQ,QAAQ;AAGtB,UAAI,WAAW,eAAe,mBAAmB;AAC/C,cAAM,kBAAkB,YAAY,WAAW,MAAM;AACrD,YAAI,iBAAiB;AACnB,4BAAkB,QAAQ,IAAI,WAAW;AAAA,QAC3C,OAAO;AACL,4BAAkB,QAAQ,OAAO,WAAW;AAAA,QAC9C;AACA,qCAA6B,CAAC,eAAe;AAC7C;AAAA,MACF;AAEA,uBAAiB,UAAQ;AACvB,cAAM,kBAAkB,KAAK,KAAK,MAAM;AACxC,YAAI,iBAAiB;AACnB,4BAAkB,QAAQ,IAAI,MAAM;AAAA,QACtC,OAAO;AACL,4BAAkB,QAAQ,OAAO,MAAM;AAAA,QACzC;AACA,eAAO;AAAA,UACL,GAAG;AAAA,UACH,CAAC,KAAK,GAAG,kBAAkB,OAAO;AAAA,QACpC;AAAA,MACF,CAAC;AAAA,IACH,GAAG,CAAC,oBAAoB,mBAAmB,aAAa,0BAA0B,CAAC;AAGnF,UAAM,aAAa,CAAC,CAAC;AAErB,UAAM,wBAAmC,wBAAQ,MAAM;AACrD,UAAI,cAAc,kBAAkB;AAClC,cAAM,YAAY,sBAAsB,gBAAgB;AACxD,eAAO,UAAU,IAAI,CAAC,UAAU;AAAA,UAC9B,IAAI,KAAK;AAAA,UACT,SAAS,KAAK;AAAA,UACd,SAAS,KAAK;AAAA,UACd,aAAa,KAAK;AAAA,QACpB,EAAE;AAAA,MACJ;AACA,aAAO;AAAA,IACT,GAAG,CAAC,YAAY,kBAAkB,QAAQ,CAAC;AAE3C,UAAM,6BAAyB,wBAAQ,MAAM;AAC3C,eAAS,IAAI,kBAAkB,SAAS,GAAG,KAAK,GAAG,KAAK;AACtD,YAAI,kBAAkB,CAAC,EAAE,YAAY,QAAQ;AAC3C,iBAAO;AAAA,QACT;AAAA,MACF;AACA,aAAO;AAAA,IACT,GAAG,CAAC,iBAAiB,CAAC;AAItB,kCAAU,MAAM;AACd,YAAM,QAAQ,iBAAiB,CAAC;AAChC,YAAM,YAAY,qBAAqB;AAEvC,YAAM,sBAAsB,MAAM,WAAW,UAAU,UAChD,MAAM,KAAK,CAAC,GAAG,MAAM,EAAE,OAAO,UAAU,CAAC,GAAG,EAAE;AAErD,UAAI,CAAC,qBACE,uBAAuB,MAAM,SAAS,KACtC,CAAC,kBAAkB,QAAQ,IAAI,WAAW,GAAG;AAClD,yBAAiB,WAAS,EAAC,GAAG,MAAM,aAAa,YAAW,EAAE;AAAA,MAChE;AAEA,YAAM,sBAAsB,CAAC,MAAc,SAA0B;AACnE,eAAO,KAAK,KAAK,OAAK;AACpB,gBAAM,IAAI,KAAK,KAAK,OAAK,EAAE,OAAO,EAAE,EAAE;AACtC,cAAI,CAAC,GAAG;AACN,mBAAO;AAAA,UACT;AACA,cAAI,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO;AAChD,mBAAO;AAAA,UACT;AACA,cAAI,EAAE,YAAY,oBAAoB,EAAE,UAAU,GAAG,YAAY,CAAC,CAAC,GAAG;AACpE,mBAAO;AAAA,UACT;AACA,iBAAO;AAAA,QACT,CAAC;AAAA,MACH;AAEA,UAAI,oBAAoB,OAAO,aAAa,OAAO,KAC5C,CAAC,kBAAkB,QAAQ,IAAI,OAAO,GAAG;AAC9C,yBAAiB,WAAS,EAAC,GAAG,MAAM,gBAAgB,QAAO,EAAE;AAAA,MAC/D;AAEA,2BAAqB,UAAU;AAC/B,mBAAa,UAAU;AAAA,IACzB,GAAG,CAAC,eAAe,OAAO,iBAAiB,CAAC;AAG5C,UAAM,yBAAqB;AAAA,MACvB,CAAC,QAAgB,cAA+B;AAC9C,YAAI,CAAC,cAAc,CAAC,oBAAoB,CAAC,cAAc;AACrD;AAAA,QACF;AACA,cAAM,UAAU,aAAa,kBAAkB,QAAQ,SAAS;AAChE,qBAAa,OAAO;AAAA,MACtB;AAAA,MACA,CAAC,YAAY,kBAAkB,YAAY;AAAA,IAC/C;AAGA,UAAM,sBAAkC,wBAAQ,MAAM;AACpD,aAAO,kBAAkB,IAAI,CAAC,QAAQ;AACpC,YAAI,aAAa;AACjB,YAAI,cAAc,kBAAkB;AAClC,gBAAM,cAAc,eAAe,kBAAkB,IAAI,EAAE;AAC3D,cAAI,YAAY,QAAQ,GAAG;AACzB,yBAAa;AAAA,cACX,SAAS,YAAY;AAAA,cACrB,OAAO,YAAY;AAAA,cACnB,YAAY,MAAM,mBAAmB,IAAI,IAAI,MAAM;AAAA,cACnD,QAAQ,MAAM,mBAAmB,IAAI,IAAI,MAAM;AAAA,YACjD;AAAA,UACF;AAAA,QACF;AAEA,cAAM,UAAU,uBACV;AAAA,UACA,UAAU;AAAA,UACV,QAAQ,IAAI,YAAY,UAAU,gBAC5B,CAAC,eAAuB,cAAc,IAAI,IAAI,UAAU,IACxD;AAAA,UACN,SAAS,IAAI,YAAY,eAAe,iBAClC,MAAM,eAAe,IAAI,EAAE,IAC3B;AAAA,QACR,IACE;AAEN,eAAO,EAAC,GAAG,KAAK,YAAY,QAAO;AAAA,MACrC,CAAC;AAAA,IACH,GAAG;AAAA,MAAC;AAAA,MAAmB;AAAA,MAAY;AAAA,MAAkB;AAAA,MACnD;AAAA,MAAe;AAAA,MAAgB;AAAA,IAAkB,CAAC;AAEpD,UAAM,mBAAe;AAAA,MACjB,CAAC,SAAiB,gBAA+B;AAC/C,0BAAkB,SAAS,WAAW;AAAA,MACxC;AAAA,MACA,CAAC,eAAe;AAAA,IACpB;AAEA,UAAM,UAAU,kBAAkB,WAAW;AAG7C,UAAM,mBAAe;AAAA,MACjB,MAAM,mBAAmB,OAAO,OAAK,EAAE,UAAU,cAAc,EAAE,UAAU,aAAa;AAAA,MACxF,CAAC,kBAAkB;AAAA,IACvB;AACA,UAAM,oBAAgB;AAAA,MAClB,MAAM,mBAAmB;AAAA,QACrB,OAAK,EAAE,UAAU,eAAe,EAAE,UAAU;AAAA,MAAc;AAAA,MAC9D,CAAC,kBAAkB;AAAA,IACvB;AACA,UAAM,eAAe,aAAa,SAAS;AAC3C,UAAM,gBAAgB,cAAc,SAAS;AAG7C,UAAM,oBAAoB,CAAC,WAA0B;AACnD,UAAI,CAAC,QAAQ;AACX,eAAO;AAAA,MACT;AAEA,cAAQ,QAAQ;AAAA,QACd,KAAK;AACH,iBACI,+BAAAA,QAAA,cAAC,SAAI,WAAU,0BACb,+BAAAA,QAAA;AAAA,YAAC;AAAA;AAAA,cACG,WAAU;AAAA;AAAA,YACZ,+BAAAA,QAAA,cAAC,QAAG,WAAU,oCAAiC,SAAO;AAAA,YACrD,aACG,+BAAAA,QAAA;AAAA,cAAC;AAAA;AAAA,gBACG,SAAS;AAAA,gBACT,WAAW;AAAA,kBACP;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA;AAAA,gBACJ;AAAA;AAAA,cAEF,+BAAAA,QAAA;AAAA,gBAAC;AAAA;AAAA,kBACG,OAAM;AAAA,kBACN,SAAQ;AAAA,kBACR,MAAK;AAAA,kBACL,WAAU;AAAA;AAAA,gBAEZ,+BAAAA,QAAA;AAAA,kBAAC;AAAA;AAAA,oBACG,GAAE;AAAA;AAAA,gBAAuH;AAAA,cAC/H;AAAA,cAAM;AAAA,YAER;AAAA,UAEN,GACA,+BAAAA,QAAA,cAAC,SAAI,WAAU,iCACZ,cAAc,WAAW,IACtB,+BAAAA,QAAA,cAAC,OAAE,WAAU,sCAAmC,sBAAoB,IAEpE,+BAAAA,QAAA,cAAC,SAAI,WAAU,oBACZ,cAAc,IAAI,CAAC,iBAChB,+BAAAA,QAAA;AAAA,YAAC;AAAA;AAAA,cACG,KAAK,aAAa;AAAA,cAClB,SAAS,MAAM,uBAAuB,aAAa,EAAE;AAAA,cACrD,WAAW;AAAA,gBACP;AAAA,gBACA;AAAA,gBACA,aAAa,WACP,yBACA;AAAA,cACV;AAAA;AAAA,YAEF,+BAAAA,QAAA,cAAC,OAAE,WAAU,kCAAgC,aAAa,KAAM;AAAA,YAC/D,aAAa,WACV,+BAAAA,QAAA,cAAC,OAAE,WAAU,4CACV,aAAa,OAChB;AAAA,YAEH,aAAa,aACV,+BAAAA,QAAA,cAAC,OAAE,WAAU,iCAA+B,aAAa,SAAU;AAAA,UAEzE,CACH,CACH,CAEN,CACF;AAAA,QAGN,KAAK;AACH,iBACI,+BAAAA,QAAA;AAAA,YAAC;AAAA;AAAA,cACG,OAAO;AAAA,cACP,WAAU;AAAA;AAAA,UACd;AAAA,QAGN,KAAK;AACH,iBAAO,MAAM,SAAS,IAChB,+BAAAA,QAAA,cAAC,aAAU,OAAc,OAAO,YAAY,WAAU,UAAQ,IAE5D,+BAAAA,QAAA,cAAC,SAAI,WAAU,0BACb,+BAAAA,QAAA,cAAC,SAAI,WAAU,2DACb,+BAAAA,QAAA,cAAC,QAAG,WAAU,oCAAiC,OAAK,CACtD,GACA,+BAAAA,QAAA,cAAC,SAAI,WAAU,6CACb,+BAAAA,QAAA,cAAC,OAAE,WAAU,4BAAyB,UAAQ,CAChD,CACF;AAAA,QAGV,SAAS;AAEP,gBAAM,eAAe,cAAc,KAAK,OAAK,EAAE,OAAO,MAAM;AAC5D,iBAAO,cAAc,WAAW;AAAA,QAClC;AAAA,MACF;AAAA,IACF;AAEA,WACI,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,WAAW,GAAG,kDAAkD,SAAS;AAAA,QACxE,GAAG;AAAA;AAAA,MAGL,gBACG,+BAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACG,OAAO;AAAA,UACP;AAAA,UACA,cAAc;AAAA,UACd,MAAK;AAAA;AAAA,MACT;AAAA,MAIH,mBACG,+BAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACG,YAAY,kBAAkB,YAAY,UAAU,CAAC;AAAA,UACrD,eAAe,kBAAkB,YAAY,aAAa,CAAC;AAAA,UAC3D,OAAO;AAAA,UACP,eAAe;AAAA,UACf,MAAK;AAAA;AAAA,MACT;AAAA,MAIJ,+BAAAA,QAAA,cAAC,SAAI,WAAU,2CACb,+BAAAA,QAAA,cAAC,SAAI,WAAW;AAAA,QACZ;AAAA,QACA,UAAU,mBAAmB;AAAA,MACjC,KAEE,+BAAAA,QAAA,cAAC,SAAI,WAAW;AAAA,QACZ;AAAA,QACA,UAAU,WAAW;AAAA,MACzB,GAAE,GAGF,+BAAAA,QAAA,cAAC,SAAI,WAAW;AAAA,QACZ;AAAA,QACA,UAAU,wBAAwB;AAAA,MACtC,KACE,+BAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACG,UAAU;AAAA,UACV;AAAA,UACA;AAAA,UACA;AAAA,UACA,WAAU;AAAA;AAAA,MACd,CACF,GAGA,+BAAAA,QAAA,cAAC,SAAI,WAAW;AAAA,QACZ;AAAA,QACA,UAAU,QAAQ;AAAA,MACtB,KACG,WACG,+BAAAA,QAAA,cAAC,SAAI,WAAU,mDACZ,aACG,aAEA,+BAAAA,QAAA,cAAC,QAAG,WAAU,qEAAkE,UAEhF,CAEN,GAGJ,+BAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACG,UAAU,UAAU,aAAa;AAAA,UACjC;AAAA,UACA,YAAY,UAAU,mBAAmB;AAAA,UACzC,UAAU;AAAA,UACV,UAAU,UAAU,cAAe,eAAe,CAAC;AAAA,UACnD;AAAA,UACA;AAAA,UACA;AAAA,UACA,aAAa;AAAA,UACb;AAAA;AAAA,MACJ,CACF,GAGA,+BAAAA,QAAA,cAAC,SAAI,WAAW;AAAA,QACZ;AAAA,QACA,UAAU,WAAW;AAAA,MACzB,GAAE,CACJ,CACF;AAAA,MAGC,oBACG,+BAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACG,YAAY,kBAAkB,YAAY,WAAW,CAAC;AAAA,UACtD,eAAe,kBAAkB,YAAY,cAAc,CAAC;AAAA,UAC5D,OAAO;AAAA,UACP,eAAe;AAAA,UACf,MAAK;AAAA;AAAA,MACT;AAAA,MAIH,iBACG,+BAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACG,OAAO;AAAA,UACP;AAAA,UACA,cAAc;AAAA,UACd,MAAK;AAAA;AAAA,MACT;AAAA,IAEN;AAAA,EAEN;AACJ;AAEA,cAAc,cAAc;;;AuBpqB5B,IAAAC,iBAA2C;AAE3C,IAAAC,wBAAuD;AAqCvD,IAAMC,gBAMD,CAAC,EAAC,SAAS,OAAO,UAAU,WAAW,SAAQ,MAChD,+BAAAC,QAAA;AAAA,EAAC;AAAA;AAAA,IACG,MAAK;AAAA,IACL;AAAA,IACA;AAAA,IACA,WAAW;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACJ;AAAA,IACA,cAAY;AAAA;AAAA,EAEb;AACH;AAGG,IAAM,iBAAiB,eAAAA,QAAM;AAAA,EAChC,CACI;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX;AAAA,IACA,WAAW;AAAA,IACX;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACC;AAEH,UAAM,CAAC,gBAAgB,iBAAiB,QAAI,yBAAS,KAAK;AAC1D,UAAM,CAAC,gBAAgB,iBAAiB,QAAI,yBAAS,OAAO;AAC5D,UAAM,CAAC,QAAQ,SAAS,QAAI,yBAAS,KAAK;AAG1C,UAAM,YAAY,uBAAuB;AACzC,UAAM,YAAY,uBAAuB;AAEzC,UAAM,mBAAe;AAAA,MACjB,CAAC,UAAmB;AAClB,YAAI,iBAAiB;AACnB,0BAAgB,KAAK;AAAA,QACvB,OAAO;AACL,4BAAkB,KAAK;AAAA,QACzB;AAAA,MACF;AAAA,MACA,CAAC,eAAe;AAAA,IACpB;AAEA,UAAM,mBAAe,4BAAY,CAAC,UAAkB;AAClD,wBAAkB,KAAK;AAAA,IACzB,GAAG,CAAC,CAAC;AAEL,UAAM,iBAAa,4BAAY,YAAY;AACzC,UAAI;AACF,cAAM,UAAU,UAAU,UAAU,OAAO;AAC3C,kBAAU,IAAI;AACd,mBAAW,MAAM,UAAU,KAAK,GAAG,GAAI;AAAA,MACzC,QAAQ;AAEN,cAAM,WAAW,SAAS,cAAc,UAAU;AAClD,iBAAS,QAAQ;AACjB,iBAAS,KAAK,YAAY,QAAQ;AAClC,iBAAS,OAAO;AAChB,iBAAS,YAAY,MAAM;AAC3B,iBAAS,KAAK,YAAY,QAAQ;AAClC,kBAAU,IAAI;AACd,mBAAW,MAAM,UAAU,KAAK,GAAG,GAAI;AAAA,MACzC;AAAA,IACF,GAAG,CAAC,OAAO,CAAC;AAEZ,UAAM,sBAAkB,4BAAY,MAAM;AACxC,wBAAkB,OAAO;AACzB,mBAAa,IAAI;AAAA,IACnB,GAAG,CAAC,SAAS,YAAY,CAAC;AAE1B,UAAM,uBAAmB,4BAAY,MAAM;AACzC,mBAAa,KAAK;AAClB,wBAAkB,OAAO;AAAA,IAC3B,GAAG,CAAC,SAAS,YAAY,CAAC;AAE1B,UAAM,uBAAmB,4BAAY,MAAM;AACzC,YAAM,UAAU,UAAU,KAAK;AAC/B,UAAI,WAAW,YAAY,SAAS;AAClC,iBAAS,OAAO;AAAA,MAClB;AACA,mBAAa,KAAK;AAAA,IACpB,GAAG,CAAC,WAAW,SAAS,QAAQ,YAAY,CAAC;AAE7C,UAAM,wBAAoB;AAAA,MACtB,CAAC,MAAgD;AAC/C,YAAI,EAAE,QAAQ,WAAW,CAAC,EAAE,UAAU;AACpC,YAAE,eAAe;AACjB,2BAAiB;AAAA,QACnB,WAAW,EAAE,QAAQ,UAAU;AAC7B,2BAAiB;AAAA,QACnB;AAAA,MACF;AAAA,MACA,CAAC,kBAAkB,gBAAgB;AAAA,IACvC;AAEA,UAAM,SAAS,YAAY;AAG3B,QAAI,UAAU,WAAW;AACvB,aACI,+BAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACG;AAAA,UACA,WAAW,GAAG,QAAQ,SAAS;AAAA,UAC9B,GAAG;AAAA;AAAA,QAEN,+BAAAA,QAAA;AAAA,UAAC;AAAA;AAAA,YACG,WAAU;AAAA;AAAA,UAChB,+BAAAA,QAAA;AAAA,YAAC;AAAA;AAAA,cACG,OAAO;AAAA,cACP,UAAU,CAAC,MAAM,aAAa,EAAE,OAAO,KAAK;AAAA,cAC5C,WAAW;AAAA,cACX,WAAU;AAAA,cACV,WAAS;AAAA,cACT,MAAM;AAAA;AAAA,UACV;AAAA,UACI,+BAAAA,QAAA,cAAC,SAAI,WAAU,0CACb,+BAAAA,QAAA;AAAA,YAACD;AAAA,YAAA;AAAA,cACG,SAAS;AAAA,cACT,OAAM;AAAA,cACN,WAAU;AAAA;AAAA,YAEZ,+BAAAC,QAAA,cAAC,2BAAE,WAAU,WAAS;AAAA,UACxB,GACA,+BAAAA,QAAA;AAAA,YAACD;AAAA,YAAA;AAAA,cACG,SAAS;AAAA,cACT,OAAM;AAAA,cACN,WAAU;AAAA,cACV,UAAU,CAAC,UAAU,KAAK,KAAK,UAAU,KAAK,MAAM;AAAA;AAAA,YAEtD,+BAAAC,QAAA,cAAC,8BAAK,WAAU,WAAS;AAAA,UAC3B,CACF;AAAA,QACF;AAAA,QACA,+BAAAA,QAAA,cAAC,OAAE,WAAU,iCAA8B,sEAE3C;AAAA,MACF;AAAA,IAEN;AAEA,WACI,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,WAAW;AAAA,UACP;AAAA,UACA,SAAS,gBAAgB;AAAA,UACzB;AAAA,QACJ;AAAA,QACC,GAAG;AAAA;AAAA,MAGN,+BAAAA,QAAA,cAACD,eAAA,EAAa,SAAS,YAAY,OAAO,SAAS,YAAY,kBAC5D,SACG,+BAAAC,QAAA,cAAC,+BAAM,WAAU,4BAA0B,IAE3C,+BAAAA,QAAA,cAAC,8BAAK,WAAU,eAAa,CAEnC;AAAA,MAGC,UAAU,UACP,+BAAAA,QAAA,cAACD,eAAA,EAAa,SAAS,iBAAiB,OAAM,kBAC5C,+BAAAC,QAAA,cAAC,gCAAO,WAAU,eAAa,CACjC;AAAA,MAIH,CAAC,UAAU,WACR,+BAAAA,QAAA,cAACD,eAAA,EAAa,SAAS,SAAS,OAAM,yBACpC,+BAAAC,QAAA,cAAC,mCAAU,WAAU,eAAa,CACpC;AAAA,IAEN;AAAA,EAEN;AACJ;AAEA,eAAe,cAAc;;;ACvO7B,IAAAC,iBAAkB;AAElB,IAAAC,wBAAmD;AAiC5C,IAAM,kBAAkB,eAAAC,QAAM;AAAA,EACjC,CACI;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP,WAAW;AAAA,IACX;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACC;AAEH,QAAI,SAAS,GAAG;AACd,aAAO;AAAA,IACT;AAEA,UAAM,UAAU,WAAW;AAC3B,UAAM,SAAS,WAAW;AAE1B,UAAM,aAAa,SAAS,OAAO,UAAU;AAC7C,UAAM,WAAW,SAAS,OAAO,YAAY;AAC7C,UAAM,WAAW,SAAS,OAAO,YAAY;AAE7C,WACI,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,WAAW;AAAA,UACP;AAAA,UACA;AAAA,QACJ;AAAA,QACA,MAAK;AAAA,QACL,cAAW;AAAA,QACV,GAAG;AAAA;AAAA,MAGL,YACG,+BAAAA,QAAA,cAAC,mCAAU,WAAW,GAAG,UAAU,uBAAuB,GAAG,eAAY,QAAM;AAAA,MAInF,+BAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACG,MAAK;AAAA,UACL,SAAS;AAAA,UACT,UAAU;AAAA,UACV,WAAW;AAAA,YACP;AAAA,YACA;AAAA,YACA;AAAA,UACJ;AAAA,UACA,cAAW;AAAA;AAAA,QAEb,+BAAAA,QAAA,cAAC,qCAAY,WAAW,UAAS;AAAA,MACnC;AAAA,MAGA,+BAAAA,QAAA,cAAC,UAAK,WAAW,GAAG,UAAU,kCAAkC,KACjE,SAAQ,KAAE,KACb;AAAA,MAGI,+BAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACG,MAAK;AAAA,UACL,SAAS;AAAA,UACT,UAAU;AAAA,UACV,WAAW;AAAA,YACP;AAAA,YACA;AAAA,YACA;AAAA,UACJ;AAAA,UACA,cAAW;AAAA;AAAA,QAEb,+BAAAA,QAAA,cAAC,sCAAa,WAAW,UAAS;AAAA,MACpC;AAAA,IACF;AAAA,EAEN;AACJ;AAEA,gBAAgB,cAAc;;;ACpH9B,IAAAC,iBAAkB;AAWlB,IAAMC,WAAyC;AAAA,EAC7C,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAEO,IAAM,YAAY,eAAAC,QAAM;AAAA,EAC3B,CAAC,EAAC,OAAO,MAAM,UAAU,SAAS,UAAU,WAAW,GAAG,KAAI,GAAG,QAAQ;AACvE,UAAM,iBACF,YAAY,UACN,+CACA;AAEV,WACI,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,WAAW;AAAA,UACP;AAAA,UACAD,SAAQ,IAAI;AAAA,UACZ;AAAA,UACA;AAAA,QACJ;AAAA,QACC,GAAG;AAAA;AAAA,MAEL;AAAA,IACH;AAAA,EAEN;AACJ;AAEA,UAAU,cAAc;;;ACzCxB,IAAAE,iBAAkB;AAQX,IAAM,cAAc,eAAAC,QAAM;AAAA,EAC7B,CAAC,EAAC,OAAO,OAAO,WAAW,GAAG,KAAI,GAAG,QAAQ;AAC3C,WACI,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,WAAW,GAAG,oCAAoC,SAAS;AAAA,QAC1D,GAAG;AAAA;AAAA,MAEN,+BAAAA,QAAA;AAAA,QAAC;AAAA;AAAA,UACG,WAAU;AAAA,UACV,OAAO,EAAC,iBAAiB,MAAK;AAAA,UAC9B,cAAY,SAAS;AAAA;AAAA,MACzB;AAAA,MACC,SACG,+BAAAA,QAAA,cAAC,UAAK,WAAU,qCAAmC,KAAM;AAAA,IAE/D;AAAA,EAEN;AACJ;AAEA,YAAY,cAAc;;;AC7B1B,IAAAC,iBAAkB;AASlB,IAAM,cAAc;AAAA,EAClB,IAAI;AAAA,EACJ,IAAI;AACN;AAEO,IAAM,iBAAiB,eAAAC,QAAM;AAAA,EAChC,CAAC,EAAC,QAAQ,MAAM,UAAU,WAAW,GAAG,KAAI,GAAG,QAAQ;AACrD,UAAM,YAAY;AAElB,WACI,+BAAAA,QAAA;AAAA,MAAC;AAAA;AAAA,QACG;AAAA,QACA,WAAW;AAAA,UACP;AAAA,UACA,YAAY,KAAK;AAAA,UACjB;AAAA,QACJ;AAAA,QACC,GAAG;AAAA;AAAA,MAEL;AAAA,IACH;AAAA,EAEN;AACJ;AAEA,eAAe,cAAc;;;AC7BtB,IAAM,aAAa;AAAA,EACxB,UAAU;AAAA,EACV,OAAO;AAAA,EACP,aAAa;AACf;;;AtFKO,IAAM,UAAU;","names":["React","import_react","React","import_react","import_react","React","React","import_react","React","import_react","React","import_react","React","import_react","ALIGN_MAP","JUSTIFY_MAP","GAP_MAP","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","import_lucide_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React","e","import_react","React","import_react","import_lucide_react","React","import_react","React","import_react","VARIANT_MAP","React","import_react","import_lucide_react","React","VARIANT_STYLES","import_react","import_react_dom","import_lucide_react","React","import_react","import_react_dom","import_lucide_react","SIZE_MAP","React","import_react","POSITION_CLASSES","React","import_react","React","import_react","React","import_react","import_lucide_react","React","import_react","React","import_react","React","import_react","import_lucide_react","React","import_react","import_lucide_react","React","import_react","import_lucide_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","import_react","DOMPurify","React","variantStyles","React","ChevronLeftIcon","ChevronRightIcon","import_react","React","variantStyles","import_react","import_react","import_react","import_react","import_react","React","React","import_react","import_lucide_react","React","import_react","import_react","import_react","React","import_react","ASPECT_RATIO_PRESETS","resolveAspectRatio","React","ReactPlayer","import_react","import_react_player","import_lucide_react","React","ReactPlayer","import_react","import_lucide_react","React","import_react","React","import_react","React","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","React","import_react","import_lucide_react","ActionButton","React","import_react","import_lucide_react","React","import_react","sizeMap","React","import_react","React","import_react","React"]}