{"version":3,"sources":["../src/core/reducer.ts","../src/core/events.ts","../src/core/parser.ts","../src/streaming/sse.ts","../src/streaming/readableStream.ts","../src/streaming/normalize.ts","../src/hooks/useGenUI.ts","../src/utils/cn.ts","../src/components/TextBlock.tsx","../src/components/table/TableRenderer.tsx","../src/components/chart/ChartRenderer.tsx","../src/components/card/CardRenderer.tsx","../src/registry/componentRegistry.ts","../src/components/ComponentRenderer.tsx","../src/GodComponent.tsx","../src/schemas/base.ts"],"names":["useReducer","useRef","useEffect","useCallback","twMerge","clsx","jsx","jsxs","BarChart","LineChart","AreaChart","DonutChart"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { UIComponent } from '../schemas/base';\nimport type { GenUIEvent } from './events';\n\n/**\n * Render node types for the render tree\n */\nexport type RenderNode =\n    | { kind: 'text'; content: string }\n    | { kind: 'component'; component: UIComponent };\n\n/**\n * State for the GenUI reducer\n */\nexport interface GenUIState {\n    nodes: RenderNode[];\n    isStreaming: boolean;\n    error: Error | null;\n}\n\n/**\n * Initial state\n */\nexport const initialState: GenUIState = {\n    nodes: [],\n    isStreaming: false,\n    error: null,\n};\n\n/**\n * Action types for the reducer\n */\nexport type GenUIAction =\n    | { type: 'START_STREAMING' }\n    | { type: 'EVENT'; event: GenUIEvent }\n    | { type: 'STOP_STREAMING' }\n    | { type: 'SET_ERROR'; error: Error }\n    | { type: 'RESET' };\n\n/**\n * Reducer for building the render tree from events\n * \n * Rules:\n * - Text deltas append to the last text node (or create new one)\n * - Components are added as new nodes\n * - Order is strictly preserved\n */\nexport function genUIReducer(state: GenUIState, action: GenUIAction): GenUIState {\n    switch (action.type) {\n        case 'START_STREAMING':\n            return {\n                ...state,\n                isStreaming: true,\n                error: null,\n            };\n\n        case 'EVENT': {\n            const { event } = action;\n\n            switch (event.type) {\n                case 'text_delta': {\n                    const nodes = [...state.nodes];\n                    const lastNode = nodes[nodes.length - 1];\n\n                    // Append to last text node or create new one\n                    if (lastNode && lastNode.kind === 'text') {\n                        nodes[nodes.length - 1] = {\n                            kind: 'text',\n                            content: lastNode.content + event.value,\n                        };\n                    } else {\n                        nodes.push({ kind: 'text', content: event.value });\n                    }\n\n                    return { ...state, nodes };\n                }\n\n                case 'component': {\n                    // Add component as new node\n                    return {\n                        ...state,\n                        nodes: [\n                            ...state.nodes,\n                            { kind: 'component', component: event.payload },\n                        ],\n                    };\n                }\n\n                case 'done':\n                    return {\n                        ...state,\n                        isStreaming: false,\n                    };\n\n                default:\n                    return state;\n            }\n        }\n\n        case 'STOP_STREAMING':\n            return {\n                ...state,\n                isStreaming: false,\n            };\n\n        case 'SET_ERROR':\n            return {\n                ...state,\n                isStreaming: false,\n                error: action.error,\n            };\n\n        case 'RESET':\n            return initialState;\n\n        default:\n            return state;\n    }\n}\n","import type { UIComponent } from '../schemas/base';\n\n/**\n * Events emitted during streaming\n */\nexport type GenUIEvent =\n    | { type: 'text_delta'; value: string }\n    | { type: 'component'; payload: UIComponent }\n    | { type: 'done' };\n\n/**\n * Create a text delta event\n */\nexport function textDelta(value: string): GenUIEvent {\n    return { type: 'text_delta', value };\n}\n\n/**\n * Create a component event\n */\nexport function componentEvent(payload: UIComponent): GenUIEvent {\n    return { type: 'component', payload };\n}\n\n/**\n * Create a done event\n */\nexport function doneEvent(): GenUIEvent {\n    return { type: 'done' };\n}\n","import type { UIComponent } from '../schemas/base';\n\n/**\n * Streaming chunk format from backend\n */\ninterface StreamingChunk {\n    delta?: { content: string };\n}\n\n/**\n * Final response format from backend\n */\ninterface FinalResponse {\n    id: string;\n    object: string;\n    data: {\n        text: string;\n        components: UIComponent[];\n    };\n}\n\n/**\n * Full response format (non-streaming)\n */\nexport interface GenUIResponse {\n    text: string;\n    components: UIComponent[];\n}\n\n/**\n * Parse a streaming chunk\n */\nexport function parseStreamingChunk(line: string): StreamingChunk | null {\n    if (!line.startsWith('data: ')) return null;\n\n    const data = line.slice(6).trim();\n    if (data === '[DONE]') return null;\n\n    try {\n        return JSON.parse(data) as StreamingChunk;\n    } catch {\n        return null;\n    }\n}\n\n/**\n * Check if chunk is final response (has 'data' field with components)\n */\nexport function isFinalResponse(chunk: unknown): chunk is FinalResponse {\n    return (\n        typeof chunk === 'object' &&\n        chunk !== null &&\n        'data' in chunk &&\n        typeof (chunk as FinalResponse).data === 'object'\n    );\n}\n\n/**\n * Extract text delta from chunk\n */\nexport function extractTextDelta(chunk: StreamingChunk): string | null {\n    return chunk.delta?.content ?? null;\n}\n\n/**\n * Parse final response to extract components\n */\nexport function parseFinalResponse(data: string): FinalResponse | null {\n    try {\n        const parsed = JSON.parse(data.replace('data: ', '').trim());\n        if (isFinalResponse(parsed)) {\n            return parsed;\n        }\n        return null;\n    } catch {\n        return null;\n    }\n}\n\n/**\n * Validate component type\n */\nexport function isValidComponentType(type: unknown): type is UIComponent['type'] {\n    return type === 'table' || type === 'chart' || type === 'card';\n}\n\n/**\n * Parse and validate a component\n */\nexport function parseComponent(data: unknown): UIComponent | null {\n    if (typeof data !== 'object' || data === null) return null;\n\n    const obj = data as Record<string, unknown>;\n    if (!isValidComponentType(obj.type)) return null;\n\n    // Basic validation passed, return as UIComponent\n    // More detailed validation happens at render time\n    return data as UIComponent;\n}\n","import type { GenUIEvent } from '../core/events';\nimport { textDelta, componentEvent, doneEvent } from '../core/events';\nimport { parseStreamingChunk, extractTextDelta, isFinalResponse } from '../core/parser';\n\n/**\n * Process an EventSource stream and yield GenUIEvents\n */\nexport async function* processEventSource(\n    eventSource: EventSource\n): AsyncGenerator<GenUIEvent> {\n    const messageQueue: MessageEvent[] = [];\n    let resolveNext: ((value: MessageEvent | null) => void) | null = null;\n    let isDone = false;\n\n    const onMessage = (event: MessageEvent) => {\n        if (resolveNext) {\n            resolveNext(event);\n            resolveNext = null;\n        } else {\n            messageQueue.push(event);\n        }\n    };\n\n    const onError = () => {\n        isDone = true;\n        if (resolveNext) {\n            resolveNext(null);\n            resolveNext = null;\n        }\n    };\n\n    eventSource.addEventListener('message', onMessage);\n    eventSource.addEventListener('error', onError);\n\n    try {\n        while (!isDone) {\n            const event = messageQueue.shift() ?? await new Promise<MessageEvent | null>((resolve) => {\n                resolveNext = resolve;\n            });\n\n            if (!event) break;\n\n            const data = event.data as string;\n\n            if (data === '[DONE]') {\n                yield doneEvent();\n                break;\n            }\n\n            try {\n                const parsed = JSON.parse(data);\n\n                // Check if it's a final response with components\n                if (isFinalResponse(parsed)) {\n                    for (const component of parsed.data.components) {\n                        yield componentEvent(component);\n                    }\n                    yield doneEvent();\n                    break;\n                }\n\n                // Otherwise, it's a streaming chunk\n                if (parsed.delta?.content) {\n                    yield textDelta(parsed.delta.content);\n                }\n            } catch {\n                // Skip malformed JSON\n            }\n        }\n    } finally {\n        eventSource.removeEventListener('message', onMessage);\n        eventSource.removeEventListener('error', onError);\n        eventSource.close();\n    }\n}\n","import type { GenUIEvent } from '../core/events';\nimport { textDelta, componentEvent, doneEvent } from '../core/events';\nimport { isFinalResponse } from '../core/parser';\n\n/**\n * Process a ReadableStream (from fetch response) and yield GenUIEvents\n */\nexport async function* processReadableStream(\n    stream: ReadableStream<Uint8Array>\n): AsyncGenerator<GenUIEvent> {\n    const reader = stream.getReader();\n    const decoder = new TextDecoder();\n    let buffer = '';\n\n    try {\n        while (true) {\n            const { done, value } = await reader.read();\n\n            if (done) {\n                yield doneEvent();\n                break;\n            }\n\n            buffer += decoder.decode(value, { stream: true });\n\n            // Process complete lines\n            const lines = buffer.split('\\n');\n            buffer = lines.pop() ?? ''; // Keep incomplete line in buffer\n\n            for (const line of lines) {\n                const trimmed = line.trim();\n                if (!trimmed) continue;\n\n                // Handle SSE format\n                if (trimmed.startsWith('data: ')) {\n                    const data = trimmed.slice(6);\n\n                    if (data === '[DONE]') {\n                        yield doneEvent();\n                        return;\n                    }\n\n                    try {\n                        const parsed = JSON.parse(data);\n\n                        // Check if it's a final response with components\n                        if (isFinalResponse(parsed)) {\n                            for (const component of parsed.data.components) {\n                                yield componentEvent(component);\n                            }\n                            yield doneEvent();\n                            return;\n                        }\n\n                        // Otherwise, it's a streaming chunk\n                        if (parsed.delta?.content) {\n                            yield textDelta(parsed.delta.content);\n                        }\n                    } catch {\n                        // Skip malformed JSON\n                    }\n                }\n            }\n        }\n    } finally {\n        reader.releaseLock();\n    }\n}\n","import type { GenUIEvent } from '../core/events';\nimport { textDelta, componentEvent, doneEvent } from '../core/events';\nimport type { GenUIResponse } from '../core/parser';\nimport { processEventSource } from './sse';\nimport { processReadableStream } from './readableStream';\n\n/**\n * Stream input types\n */\nexport type StreamInput =\n    | EventSource\n    | ReadableStream<Uint8Array>\n    | Response;\n\n/**\n * Check if input is an EventSource\n */\nfunction isEventSource(input: unknown): input is EventSource {\n    return typeof EventSource !== 'undefined' && input instanceof EventSource;\n}\n\n/**\n * Check if input is a ReadableStream\n */\nfunction isReadableStream(input: unknown): input is ReadableStream<Uint8Array> {\n    return typeof ReadableStream !== 'undefined' && input instanceof ReadableStream;\n}\n\n/**\n * Check if input is a Response (from fetch)\n */\nfunction isResponse(input: unknown): input is Response {\n    return typeof Response !== 'undefined' && input instanceof Response;\n}\n\n/**\n * Normalize any stream input to a GenUIEvent async iterator\n */\nexport async function* normalizeStream(\n    input: StreamInput\n): AsyncGenerator<GenUIEvent> {\n    if (isEventSource(input)) {\n        yield* processEventSource(input);\n    } else if (isReadableStream(input)) {\n        yield* processReadableStream(input);\n    } else if (isResponse(input)) {\n        if (!input.body) {\n            yield doneEvent();\n            return;\n        }\n        yield* processReadableStream(input.body);\n    } else {\n        throw new Error('Unsupported stream input type');\n    }\n}\n\n/**\n * Convert a static response to GenUIEvents\n */\nexport function* normalizeResponse(response: GenUIResponse): Generator<GenUIEvent> {\n    // Yield text as single delta\n    if (response.text) {\n        yield textDelta(response.text);\n    }\n\n    // Yield each component\n    for (const component of response.components) {\n        yield componentEvent(component);\n    }\n\n    yield doneEvent();\n}\n","import { useReducer, useEffect, useCallback, useRef } from 'react';\nimport type { GenUIEvent } from '../core/events';\nimport { genUIReducer, initialState, type GenUIState, type GenUIAction } from '../core/reducer';\nimport type { GenUIResponse } from '../core/parser';\nimport { normalizeStream, normalizeResponse, type StreamInput } from '../streaming/normalize';\n\ninterface UseGenUIOptions {\n    /** Static response (non-streaming) */\n    response?: GenUIResponse;\n    /** Streaming input (EventSource, ReadableStream, or Response) */\n    stream?: StreamInput;\n    /** Callback when streaming completes */\n    onComplete?: () => void;\n    /** Callback on error */\n    onError?: (error: Error) => void;\n}\n\ninterface UseGenUIResult {\n    /** Current state */\n    state: GenUIState;\n    /** Reset the state */\n    reset: () => void;\n    /** Manually dispatch an event */\n    dispatch: (action: GenUIAction) => void;\n}\n\n/**\n * Hook to manage GenUI streaming state\n */\nexport function useGenUI(options: UseGenUIOptions): UseGenUIResult {\n    const { response, stream, onComplete, onError } = options;\n    const [state, dispatch] = useReducer(genUIReducer, initialState);\n    const abortRef = useRef(false);\n\n    // Process static response\n    useEffect(() => {\n        if (!response) return;\n\n        dispatch({ type: 'RESET' });\n        dispatch({ type: 'START_STREAMING' });\n\n        for (const event of normalizeResponse(response)) {\n            dispatch({ type: 'EVENT', event });\n        }\n    }, [response]);\n\n    // Process streaming input\n    useEffect(() => {\n        if (!stream) return;\n\n        abortRef.current = false;\n        dispatch({ type: 'RESET' });\n        dispatch({ type: 'START_STREAMING' });\n\n        const processStream = async () => {\n            try {\n                for await (const event of normalizeStream(stream)) {\n                    if (abortRef.current) break;\n                    dispatch({ type: 'EVENT', event });\n                }\n                onComplete?.();\n            } catch (error) {\n                const err = error instanceof Error ? error : new Error(String(error));\n                dispatch({ type: 'SET_ERROR', error: err });\n                onError?.(err);\n            }\n        };\n\n        processStream();\n\n        return () => {\n            abortRef.current = true;\n        };\n    }, [stream, onComplete, onError]);\n\n    const reset = useCallback(() => {\n        dispatch({ type: 'RESET' });\n    }, []);\n\n    return {\n        state,\n        reset,\n        dispatch,\n    };\n}\n","import { clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\nimport type { ClassValue } from 'clsx';\n\n/**\n * Merge Tailwind classes with clsx\n */\nexport function cn(...inputs: ClassValue[]) {\n    return twMerge(clsx(inputs));\n}\n","import React from 'react';\nimport { cn } from '../utils/cn';\n\ninterface TextBlockProps {\n    content: string;\n    className?: string;\n}\n\n/**\n * Render text content with proper formatting\n * - Preserves whitespace and line breaks\n * - Uses semantic typography\n */\nexport function TextBlock({ content, className }: TextBlockProps) {\n    if (!content) return null;\n\n    return (\n        <div className={cn('prose prose-sm max-w-none dark:prose-invert', className)}>\n            <p className=\"whitespace-pre-wrap leading-relaxed text-gray-900 dark:text-gray-100\">\n                {content}\n            </p>\n        </div>\n    );\n}\n","import React from 'react';\nimport type { TableComponent } from '../../schemas/table';\nimport { cn } from '../../utils/cn';\n\ninterface TableRendererProps {\n    component: TableComponent;\n    className?: string;\n}\n\n/**\n * Render a table component using ShadCN-style table\n */\nexport function TableRenderer({ component, className }: TableRendererProps) {\n    const { title, columns, rows, sortable, paginated } = component;\n\n    return (\n        <div className={cn('w-full overflow-hidden rounded-lg border border-gray-200 dark:border-gray-700', className)}>\n            {title && (\n                <div className=\"border-b border-gray-200 bg-gray-50 px-4 py-3 dark:border-gray-700 dark:bg-gray-800\">\n                    <h3 className=\"text-sm font-semibold text-gray-900 dark:text-gray-100\">\n                        {title}\n                    </h3>\n                </div>\n            )}\n            <div className=\"overflow-x-auto\">\n                <table className=\"min-w-full divide-y divide-gray-200 dark:divide-gray-700\">\n                    <thead className=\"bg-gray-50 dark:bg-gray-800\">\n                        <tr>\n                            {columns.map((column) => (\n                                <th\n                                    key={column.key}\n                                    scope=\"col\"\n                                    className={cn(\n                                        'px-4 py-3 text-left text-xs font-medium uppercase tracking-wider text-gray-500 dark:text-gray-400',\n                                        sortable && 'cursor-pointer hover:text-gray-700 dark:hover:text-gray-200'\n                                    )}\n                                >\n                                    {column.label}\n                                </th>\n                            ))}\n                        </tr>\n                    </thead>\n                    <tbody className=\"divide-y divide-gray-200 bg-white dark:divide-gray-700 dark:bg-gray-900\">\n                        {rows.map((row, rowIndex) => (\n                            <tr\n                                key={rowIndex}\n                                className=\"hover:bg-gray-50 dark:hover:bg-gray-800\"\n                            >\n                                {columns.map((column) => (\n                                    <td\n                                        key={column.key}\n                                        className=\"whitespace-nowrap px-4 py-3 text-sm text-gray-900 dark:text-gray-100\"\n                                    >\n                                        {formatCellValue(row[column.key], column.type)}\n                                    </td>\n                                ))}\n                            </tr>\n                        ))}\n                    </tbody>\n                </table>\n            </div>\n            {paginated && rows.length > 10 && (\n                <div className=\"border-t border-gray-200 bg-gray-50 px-4 py-3 dark:border-gray-700 dark:bg-gray-800\">\n                    <p className=\"text-sm text-gray-500 dark:text-gray-400\">\n                        Showing {Math.min(10, rows.length)} of {rows.length} rows\n                    </p>\n                </div>\n            )}\n        </div>\n    );\n}\n\n/**\n * Format cell value based on column type\n */\nfunction formatCellValue(value: unknown, type?: string): React.ReactNode {\n    if (value === null || value === undefined) return '—';\n\n    switch (type) {\n        case 'number':\n            return typeof value === 'number' ? value.toLocaleString() : String(value);\n        case 'date':\n            return typeof value === 'string' ? new Date(value).toLocaleDateString() : String(value);\n        default:\n            return String(value);\n    }\n}\n","import React from 'react';\nimport {\n    BarChart,\n    LineChart,\n    AreaChart,\n    DonutChart,\n} from '@tremor/react';\nimport type { ChartComponent } from '../../schemas/chart';\nimport { cn } from '../../utils/cn';\n\ninterface ChartRendererProps {\n    component: ChartComponent;\n    className?: string;\n}\n\n// Default color palette\nconst COLORS = [\n    'blue',\n    'emerald',\n    'amber',\n    'red',\n    'violet',\n    'cyan',\n    'orange',\n    'pink',\n];\n\n/**\n * Render a chart component using Tremor\n */\nexport function ChartRenderer({ component, className }: ChartRendererProps) {\n    const { chart_type, title, labels, datasets, show_legend = true } = component;\n\n    // Transform data for Tremor charts\n    const chartData = labels.map((label, index) => {\n        const dataPoint: Record<string, unknown> = { name: label };\n        datasets.forEach((dataset) => {\n            dataPoint[dataset.label] = dataset.data[index];\n        });\n        return dataPoint;\n    });\n\n    // Get category names (dataset labels)\n    const categories = datasets.map((d) => d.label);\n\n    // Get colors for datasets\n    const colors = datasets.map((d, i) => {\n        if (d.color) {\n            // Map hex colors to Tremor color names if possible\n            return mapToTremorColor(d.color) || COLORS[i % COLORS.length];\n        }\n        return COLORS[i % COLORS.length];\n    });\n\n    return (\n        <div className={cn('w-full rounded-lg border border-gray-200 bg-white p-4 dark:border-gray-700 dark:bg-gray-900', className)}>\n            {title && (\n                <h3 className=\"mb-4 text-sm font-semibold text-gray-900 dark:text-gray-100\">\n                    {title}\n                </h3>\n            )}\n            <div className=\"h-64\">\n                {renderChart(chart_type, chartData, categories, colors, show_legend)}\n            </div>\n        </div>\n    );\n}\n\nfunction renderChart(\n    type: ChartComponent['chart_type'],\n    data: Record<string, unknown>[],\n    categories: string[],\n    colors: string[],\n    showLegend: boolean\n): React.ReactElement {\n    const commonProps = {\n        data,\n        index: 'name',\n        categories,\n        colors,\n        showLegend,\n        className: 'h-full',\n    };\n\n    switch (type) {\n        case 'bar':\n            return <BarChart {...commonProps} />;\n\n        case 'line':\n            return <LineChart {...commonProps} />;\n\n        case 'area':\n            return <AreaChart {...commonProps} />;\n\n        case 'pie':\n        case 'doughnut':\n            // For pie/doughnut, use DonutChart\n            // Transform data for donut chart\n            const donutData = data.map((item) => ({\n                name: item.name as string,\n                value: item[categories[0]] as number,\n            }));\n\n            return (\n                <DonutChart\n                    data={donutData}\n                    index=\"name\"\n                    category=\"value\"\n                    colors={colors}\n                    showLabel\n                    className=\"h-full\"\n                />\n            );\n\n        default:\n            return <div className=\"flex h-full items-center justify-center text-gray-500\">Unsupported chart type: {type}</div>;\n    }\n}\n\n/**\n * Map hex color to Tremor color name\n */\nfunction mapToTremorColor(hex: string): string | null {\n    const colorMap: Record<string, string> = {\n        '#3b82f6': 'blue',\n        '#10b981': 'emerald',\n        '#f59e0b': 'amber',\n        '#ef4444': 'red',\n        '#8b5cf6': 'violet',\n        '#06b6d4': 'cyan',\n        '#f97316': 'orange',\n        '#ec4899': 'pink',\n    };\n    return colorMap[hex.toLowerCase()] || null;\n}\n","import React from 'react';\nimport type { CardComponent, CardAction } from '../../schemas/card';\nimport { cn } from '../../utils/cn';\n\ninterface CardRendererProps {\n    component: CardComponent;\n    onAction?: (action: string) => void;\n    className?: string;\n}\n\n/**\n * Render a card component using ShadCN-style card\n */\nexport function CardRenderer({ component, onAction, className }: CardRendererProps) {\n    const { title, subtitle, content, image_url, actions, variant = 'default' } = component;\n\n    const variantStyles = {\n        default: 'bg-white dark:bg-gray-900 border border-gray-200 dark:border-gray-700',\n        outlined: 'bg-transparent border-2 border-gray-300 dark:border-gray-600',\n        elevated: 'bg-white dark:bg-gray-900 shadow-lg',\n    };\n\n    return (\n        <div\n            className={cn(\n                'rounded-lg overflow-hidden',\n                variantStyles[variant],\n                className\n            )}\n        >\n            {image_url && (\n                <div className=\"aspect-video w-full overflow-hidden\">\n                    <img\n                        src={image_url}\n                        alt={title}\n                        className=\"h-full w-full object-cover\"\n                    />\n                </div>\n            )}\n            <div className=\"p-4\">\n                <h3 className=\"text-lg font-semibold text-gray-900 dark:text-gray-100\">\n                    {title}\n                </h3>\n                {subtitle && (\n                    <p className=\"mt-1 text-sm text-gray-500 dark:text-gray-400\">\n                        {subtitle}\n                    </p>\n                )}\n                {content && (\n                    <p className=\"mt-3 text-sm text-gray-700 dark:text-gray-300\">\n                        {content}\n                    </p>\n                )}\n                {actions && actions.length > 0 && (\n                    <div className=\"mt-4 flex flex-wrap gap-2\">\n                        {actions.map((action, index) => (\n                            <CardActionButton\n                                key={index}\n                                action={action}\n                                onClick={() => onAction?.(action.action)}\n                            />\n                        ))}\n                    </div>\n                )}\n            </div>\n        </div>\n    );\n}\n\ninterface CardActionButtonProps {\n    action: CardAction;\n    onClick?: () => void;\n}\n\nfunction CardActionButton({ action, onClick }: CardActionButtonProps) {\n    const { label, variant = 'primary' } = action;\n\n    const variantStyles = {\n        primary: 'bg-blue-600 text-white hover:bg-blue-700',\n        secondary: 'bg-gray-100 text-gray-900 hover:bg-gray-200 dark:bg-gray-800 dark:text-gray-100 dark:hover:bg-gray-700',\n        danger: 'bg-red-600 text-white hover:bg-red-700',\n    };\n\n    return (\n        <button\n            type=\"button\"\n            onClick={onClick}\n            className={cn(\n                'rounded-md px-3 py-1.5 text-sm font-medium transition-colors',\n                variantStyles[variant]\n            )}\n        >\n            {label}\n        </button>\n    );\n}\n","import React from 'react';\nimport type { UIComponent } from '../schemas/base';\nimport { TableRenderer } from '../components/table/TableRenderer';\nimport { ChartRenderer } from '../components/chart/ChartRenderer';\nimport { CardRenderer } from '../components/card/CardRenderer';\nimport type { TableComponent } from '../schemas/table';\nimport type { ChartComponent } from '../schemas/chart';\nimport type { CardComponent } from '../schemas/card';\n\n/**\n * Component renderer function signature\n */\nexport type ComponentRenderer<T extends UIComponent = UIComponent> = React.FC<{\n    component: T;\n    onAction?: (action: string) => void;\n    className?: string;\n}>;\n\n/**\n * Registry of component renderers\n */\nconst registry: Map<string, ComponentRenderer<UIComponent>> = new Map();\n\n/**\n * Register a component renderer\n */\nexport function registerComponent<T extends UIComponent>(\n    type: T['type'],\n    renderer: ComponentRenderer<T>\n): void {\n    registry.set(type, renderer as ComponentRenderer<UIComponent>);\n}\n\n/**\n * Get a component renderer by type\n */\nexport function getRenderer(type: string): ComponentRenderer<UIComponent> | undefined {\n    return registry.get(type);\n}\n\n/**\n * Check if a renderer exists for a type\n */\nexport function hasRenderer(type: string): boolean {\n    return registry.has(type);\n}\n\n/**\n * Get all registered types\n */\nexport function getRegisteredTypes(): string[] {\n    return Array.from(registry.keys());\n}\n\n// Register default components\nregisterComponent<TableComponent>('table', TableRenderer);\nregisterComponent<ChartComponent>('chart', ChartRenderer);\nregisterComponent<CardComponent>('card', CardRenderer);\n\nexport { registry };\n","import React from 'react';\nimport type { UIComponent } from '../schemas/base';\nimport { getRenderer } from '../registry/componentRegistry';\nimport { cn } from '../utils/cn';\n\ninterface ComponentRendererProps {\n    component: UIComponent;\n    onAction?: (action: string) => void;\n    className?: string;\n}\n\n/**\n * Render a UI component based on its type\n * Dispatches to the correct renderer from the registry\n */\nexport function ComponentRenderer({ component, onAction, className }: ComponentRendererProps) {\n    const Renderer = getRenderer(component.type);\n\n    if (!Renderer) {\n        console.warn(`No renderer found for component type: ${component.type}`);\n        return (\n            <div className={cn('rounded-lg border border-yellow-200 bg-yellow-50 p-4 text-sm text-yellow-800', className)}>\n                Unknown component type: {component.type}\n            </div>\n        );\n    }\n\n    return (\n        <Renderer\n            component={component}\n            onAction={onAction}\n            className={className}\n        />\n    );\n}\n","import React from 'react';\nimport type { GenUIResponse } from './core/parser';\nimport type { StreamInput } from './streaming/normalize';\nimport { useGenUI } from './hooks/useGenUI';\nimport { TextBlock } from './components/TextBlock';\nimport { ComponentRenderer } from './components/ComponentRenderer';\nimport { cn } from './utils/cn';\n\ninterface GodComponentProps {\n    /** Static response (non-streaming) */\n    response?: GenUIResponse;\n    /** Streaming input (EventSource, ReadableStream, or Response) */\n    stream?: StreamInput;\n    /** Callback when an action is triggered */\n    onAction?: (action: string) => void;\n    /** Callback when streaming completes */\n    onComplete?: () => void;\n    /** Callback on error */\n    onError?: (error: Error) => void;\n    /** Custom class name */\n    className?: string;\n    /** Gap between nodes */\n    gap?: 'sm' | 'md' | 'lg';\n}\n\n/**\n * GodComponent - The main entry point for rendering Gen-UI responses\n * \n * Accepts either a static `response` or a `stream` (EventSource/ReadableStream)\n * and progressively renders text and UI components.\n */\nexport function GodComponent({\n    response,\n    stream,\n    onAction,\n    onComplete,\n    onError,\n    className,\n    gap = 'md',\n}: GodComponentProps) {\n    const { state } = useGenUI({\n        response,\n        stream,\n        onComplete,\n        onError,\n    });\n\n    const gapStyles = {\n        sm: 'space-y-2',\n        md: 'space-y-4',\n        lg: 'space-y-6',\n    };\n\n    if (state.error) {\n        return (\n            <div className={cn('rounded-lg border border-red-200 bg-red-50 p-4 text-sm text-red-800', className)}>\n                Error: {state.error.message}\n            </div>\n        );\n    }\n\n    if (state.nodes.length === 0 && !state.isStreaming) {\n        return null;\n    }\n\n    return (\n        <div className={cn(gapStyles[gap], className)}>\n            {state.nodes.map((node, index) => {\n                if (node.kind === 'text') {\n                    return <TextBlock key={index} content={node.content} />;\n                }\n\n                if (node.kind === 'component') {\n                    return (\n                        <ComponentRenderer\n                            key={index}\n                            component={node.component}\n                            onAction={onAction}\n                        />\n                    );\n                }\n\n                return null;\n            })}\n\n            {state.isStreaming && (\n                <div className=\"flex items-center gap-2 text-sm text-gray-500\">\n                    <LoadingDots />\n                    <span>Generating...</span>\n                </div>\n            )}\n        </div>\n    );\n}\n\n/**\n * Simple loading dots animation\n */\nfunction LoadingDots() {\n    return (\n        <div className=\"flex space-x-1\">\n            <div className=\"h-2 w-2 animate-bounce rounded-full bg-gray-400\" style={{ animationDelay: '0ms' }} />\n            <div className=\"h-2 w-2 animate-bounce rounded-full bg-gray-400\" style={{ animationDelay: '150ms' }} />\n            <div className=\"h-2 w-2 animate-bounce rounded-full bg-gray-400\" style={{ animationDelay: '300ms' }} />\n        </div>\n    );\n}\n\nexport default GodComponent;\n","import type { TableComponent } from './table';\nimport type { ChartComponent } from './chart';\nimport type { CardComponent } from './card';\n\n/**\n * Discriminated union of all UI components\n */\nexport type UIComponent = TableComponent | ChartComponent | CardComponent;\n\n/**\n * Type guard for TableComponent\n */\nexport function isTableComponent(component: UIComponent): component is TableComponent {\n    return component.type === 'table';\n}\n\n/**\n * Type guard for ChartComponent\n */\nexport function isChartComponent(component: UIComponent): component is ChartComponent {\n    return component.type === 'chart';\n}\n\n/**\n * Type guard for CardComponent\n */\nexport function isCardComponent(component: UIComponent): component is CardComponent {\n    return component.type === 'card';\n}\n\n// Re-export all schemas\nexport type { TableComponent, TableColumn } from './table';\nexport type { ChartComponent, ChartDataset } from './chart';\nexport type { CardComponent, CardAction } from './card';\n"]}