@iyulab/u-widgets 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"u-widgets-tools.js","sources":["../src/core/widget-meta.ts","../src/core/catalog.ts","../src/core/suggest-mapping.ts","../src/core/spec-surface.ts"],"sourcesContent":["/**\n * Static description registries extracted from JSON Schema definitions.\n *\n * These registries are the single source of truth for property descriptions\n * shared between the MCP server `help()` output and the demo props panel.\n * Safety tests enforce that every key in the JSON Schema has a corresponding\n * entry here — adding a schema key without a description causes a test failure.\n */\n\n/** Mapping key descriptions (from schema $defs/mapping.properties). */\nexport const MAPPING_DOCS: Readonly<Record<string, string>> = {\n x: 'X-axis / category field',\n y: 'Y-axis value field(s)',\n label: 'Label field (pie/funnel)',\n value: 'Value field (pie/funnel/heatmap)',\n color: 'Color grouping field (scatter)',\n size: 'Size encoding field (scatter bubble)',\n axis: 'Axis field (radar indicators)',\n columns: 'Column definitions (table)',\n primary: 'Primary text field (list)',\n secondary: 'Secondary text field (list)',\n icon: 'Icon letter field (list)',\n avatar: 'Avatar image URL field (list)',\n trailing: 'Trailing value field (list)',\n badge: 'Badge/tag field (list)',\n};\n\n/** Field definition property descriptions (from schema $defs/fieldDefinition). */\nexport const FIELD_PROP_DOCS: Readonly<Record<string, string>> = {\n field: 'Key name in submitted data',\n label: 'Display label',\n type: 'Input type',\n required: 'Must be filled before submit',\n placeholder: 'Placeholder text',\n options: 'Choices for select/radio/checkbox',\n minLength: 'Minimum character length',\n maxLength: 'Maximum character length',\n pattern: 'Custom regex pattern',\n rows: 'Textarea visible rows',\n min: 'Minimum value',\n max: 'Maximum value',\n step: 'Number/range step increment',\n message: 'Custom validation error message',\n};\n\n/**\n * Well-known data field descriptions.\n * Unlike schema-bound registries, these cover common keys used across widgets.\n * Not enforced by schema tests — new keys appear with type only until added here.\n */\nexport const DATA_FIELD_DOCS: Readonly<Record<string, string>> = {\n // metric / stat-group\n value: 'The primary value to display',\n label: 'Display label or category name',\n unit: 'Value unit suffix',\n prefix: 'Text before the value',\n suffix: 'Text after the value',\n change: 'Delta / change amount',\n trend: 'Trend direction (up, down, flat)',\n // content\n content: 'Body text or markdown content',\n message: 'Message body text',\n level: 'Severity level (info, warning, error, success)',\n title: 'Heading or title text',\n src: 'Source URL (image)',\n alt: 'Alt text (image)',\n caption: 'Caption text',\n // progress\n max: 'Maximum bound value',\n // treemap / general\n name: 'Node or item name',\n children: 'Nested child nodes',\n // kv / header\n language: 'Programming language identifier',\n key: 'Key or label identifier',\n text: 'Display text content',\n // steps\n status: 'Step status (done, active, pending, error)',\n description: 'Detailed description text',\n // rating\n count: 'Number of reviews or votes',\n // video / citation\n poster: 'Video poster image URL',\n url: 'Link URL',\n snippet: 'Excerpt or summary text',\n source: 'Source name or publisher',\n // chart data\n group: 'Group / category identifier',\n min: 'Minimum stat value',\n q1: 'First quartile (25th percentile)',\n median: 'Median (50th percentile)',\n q3: 'Third quartile (75th percentile)',\n};\n\n/**\n * Well-known options descriptions.\n * Covers widget-specific rendering options used across the catalog.\n */\nexport const OPTION_DOCS: Readonly<Record<string, string>> = {\n // gauge / progress\n min: 'Minimum range value',\n max: 'Maximum range value',\n unit: 'Display unit string',\n thresholds: 'Color threshold breakpoints',\n label: 'Label template ({value}, {percent})',\n // chart\n smooth: 'Smooth curves (line/area)',\n stack: 'Stack series (bar/line/area)',\n horizontal: 'Horizontal orientation (bar)',\n donut: 'Donut style (pie)',\n colors: 'Custom color palette',\n colorRange: 'Heatmap color gradient',\n histogram: 'Histogram mode (bar)',\n referenceLines: 'Reference/threshold lines',\n step: 'Step interpolation (line)',\n legend: 'Show/hide legend',\n grid: 'Show/hide grid lines',\n animate: 'Enable/disable animation',\n showLabel: 'Show/hide data labels',\n // table / list\n pageSize: 'Rows per page',\n compact: 'Compact display mode',\n searchable: 'Enable search filter',\n locale: 'Locale for formatting/validation',\n // code\n lineNumbers: 'Show/hide line numbers (default true)',\n highlight: 'Line numbers to highlight (array)',\n maxHeight: 'Maximum height with scroll (e.g. \"300px\")',\n wrap: 'Word wrap long lines (default false)',\n // citation\n numbered: 'Show numbered badges (default true)',\n // rating\n interactive: 'Allow user input (default false)',\n icon: 'Icon type (star, heart, thumb)',\n // video\n autoplay: 'Auto-play on load (default false)',\n controls: 'Show playback controls (default true)',\n loop: 'Loop playback (default false)',\n muted: 'Start muted (default false, auto when autoplay)',\n // gallery\n aspectRatio: 'Image aspect ratio (e.g. \"1:1\", \"16:9\", default auto)',\n // compose / kv / actions / divider / steps\n layout: 'Layout mode (stack, row, grid, horizontal, vertical, wrap, column)',\n columns: 'Number of grid columns',\n widths: 'Column width ratios (number[], \"auto\", \"stretch\")',\n spacing: 'Spacing size (small, default, large)',\n card: 'Render inside a card container with shadow and border',\n};\n\n/** Action property descriptions (from schema $defs/action). */\nexport const ACTION_PROP_DOCS: Readonly<Record<string, string>> = {\n label: 'Button text',\n action: 'Action identifier (submit, cancel, navigate, custom)',\n style: 'Visual style (primary, danger, default)',\n disabled: 'Whether disabled',\n url: 'URL for navigate action',\n};\n\n// ── Per-Widget Registries ──\n\n/** Data field descriptor for well-known widget data properties. */\nexport interface DataFieldInfo {\n readonly key: string;\n readonly type: string;\n readonly desc: string;\n readonly required?: boolean;\n}\n\n/** Relevant option keys per widget type. Only lists keys from OPTION_DOCS. */\nexport const WIDGET_OPTIONS: Readonly<Record<string, readonly string[]>> = {\n 'chart.bar': ['stack', 'horizontal', 'histogram', 'colors', 'referenceLines', 'legend', 'grid', 'animate', 'showLabel'],\n 'chart.line': ['smooth', 'stack', 'step', 'colors', 'referenceLines', 'legend', 'grid', 'animate', 'showLabel'],\n 'chart.area': ['smooth', 'stack', 'colors', 'legend', 'grid', 'animate', 'showLabel'],\n 'chart.pie': ['donut', 'colors', 'legend', 'animate', 'showLabel'],\n 'chart.scatter': ['colors', 'legend', 'grid', 'animate', 'showLabel'],\n 'chart.radar': ['colors', 'legend', 'animate', 'showLabel'],\n 'chart.heatmap': ['colorRange', 'legend', 'grid', 'animate', 'showLabel'],\n 'chart.box': ['colors', 'legend', 'grid', 'animate'],\n 'chart.funnel': ['colors', 'legend', 'animate', 'showLabel'],\n 'chart.waterfall': ['colors', 'legend', 'grid', 'animate', 'showLabel'],\n 'chart.treemap': ['colors', 'animate', 'showLabel'],\n 'metric': [],\n 'stat-group': [],\n 'gauge': ['min', 'max', 'unit', 'thresholds', 'label'],\n 'progress': ['min', 'max', 'unit', 'thresholds', 'label'],\n 'table': ['pageSize', 'compact', 'searchable'],\n 'list': ['compact'],\n 'form': ['locale'],\n 'confirm': [],\n 'markdown': [],\n 'image': [],\n 'callout': [],\n 'compose': ['layout', 'columns', 'widths', 'card'],\n 'kv': ['layout', 'columns'],\n 'code': ['lineNumbers', 'highlight', 'maxHeight', 'wrap'],\n 'citation': ['compact', 'numbered'],\n 'status': [],\n 'steps': ['layout', 'compact'],\n 'rating': ['max', 'interactive', 'icon', 'label'],\n 'video': ['autoplay', 'controls', 'loop', 'muted'],\n 'gallery': ['columns', 'aspectRatio'],\n 'actions': ['layout'],\n 'divider': [],\n 'header': [],\n};\n\n/**\n * Well-known data fields per widget type.\n * Charts/table/list use user-defined fields so they are omitted.\n */\nexport const WIDGET_DATA_FIELDS: Readonly<Record<string, readonly DataFieldInfo[]>> = {\n 'metric': [\n { key: 'value', type: 'number | string', desc: 'Primary value', required: true },\n { key: 'label', type: 'string', desc: 'Display label' },\n { key: 'unit', type: 'string', desc: 'Value unit suffix' },\n { key: 'prefix', type: 'string', desc: 'Text before value' },\n { key: 'suffix', type: 'string', desc: 'Text after value' },\n { key: 'change', type: 'number', desc: 'Delta amount' },\n { key: 'trend', type: '\"up\" | \"down\" | \"flat\"', desc: 'Trend direction' },\n { key: 'icon', type: 'string', desc: 'Emoji or short text icon' },\n { key: 'description', type: 'string', desc: 'Sub-label below value' },\n ],\n 'stat-group': [\n { key: 'label', type: 'string', desc: 'Display label', required: true },\n { key: 'value', type: 'number', desc: 'Primary value', required: true },\n { key: 'unit', type: 'string', desc: 'Value unit suffix' },\n { key: 'prefix', type: 'string', desc: 'Text before value' },\n { key: 'suffix', type: 'string', desc: 'Text after value' },\n { key: 'change', type: 'number', desc: 'Delta amount' },\n { key: 'trend', type: '\"up\" | \"down\" | \"flat\"', desc: 'Trend direction' },\n { key: 'icon', type: 'string', desc: 'Emoji or short text icon' },\n { key: 'description', type: 'string', desc: 'Sub-label below value' },\n ],\n 'gauge': [\n { key: 'value', type: 'number', desc: 'Current value on the arc', required: true },\n ],\n 'progress': [\n { key: 'value', type: 'number', desc: 'Current value', required: true },\n { key: 'max', type: 'number', desc: 'Maximum bound (default 100)' },\n ],\n 'markdown': [\n { key: 'content', type: 'string', desc: 'Markdown text', required: true },\n ],\n 'image': [\n { key: 'src', type: 'string', desc: 'Image URL', required: true },\n { key: 'alt', type: 'string', desc: 'Alt text' },\n { key: 'caption', type: 'string', desc: 'Caption text' },\n ],\n 'callout': [\n { key: 'message', type: 'string', desc: 'Body text', required: true },\n { key: 'title', type: 'string', desc: 'Optional heading' },\n { key: 'level', type: '\"info\" | \"warning\" | \"error\" | \"success\"', desc: 'Severity' },\n ],\n 'code': [\n { key: 'content', type: 'string', desc: 'Code text content', required: true },\n { key: 'language', type: 'string', desc: 'Language identifier (e.g. javascript, python, sql)' },\n ],\n 'header': [\n { key: 'text', type: 'string', desc: 'Heading text', required: true },\n { key: 'level', type: '1 | 2 | 3', desc: 'Heading level (default 2)' },\n ],\n 'video': [\n { key: 'src', type: 'string', desc: 'Video URL', required: true },\n { key: 'poster', type: 'string', desc: 'Poster image URL' },\n { key: 'alt', type: 'string', desc: 'Accessible description' },\n { key: 'caption', type: 'string', desc: 'Caption text' },\n ],\n 'gallery': [\n { key: 'src', type: 'string', desc: 'Image URL', required: true },\n { key: 'alt', type: 'string', desc: 'Alt text' },\n { key: 'caption', type: 'string', desc: 'Caption text' },\n ],\n 'steps': [\n { key: 'label', type: 'string', desc: 'Step label', required: true },\n { key: 'status', type: '\"done\" | \"active\" | \"pending\" | \"error\"', desc: 'Step status (default pending)' },\n { key: 'description', type: 'string', desc: 'Step detail text' },\n { key: 'icon', type: 'string', desc: 'Custom icon (emoji/text) override' },\n ],\n 'rating': [\n { key: 'value', type: 'number', desc: 'Current rating value' },\n { key: 'max', type: 'number', desc: 'Scale maximum (default 5)' },\n { key: 'count', type: 'number', desc: 'Number of reviews' },\n ],\n 'citation': [\n { key: 'title', type: 'string', desc: 'Citation title', required: true },\n { key: 'url', type: 'string', desc: 'Link URL' },\n { key: 'snippet', type: 'string', desc: 'Excerpt text' },\n { key: 'source', type: 'string', desc: 'Source name' },\n ],\n 'status': [\n { key: 'label', type: 'string', desc: 'Status label', required: true },\n { key: 'value', type: 'string', desc: 'Status value', required: true },\n { key: 'level', type: '\"info\" | \"success\" | \"warning\" | \"error\" | \"neutral\"', desc: 'Severity level (default info)' },\n ],\n};\n\n/** Auto-inference hints — tells LLM what can be omitted. */\nexport const WIDGET_INFERENCE: Readonly<Record<string, string>> = {\n 'chart.bar': 'mapping omittable. First string → x, number fields → y.',\n 'chart.line': 'mapping omittable. First string → x, numbers → y. Date-like preferred for x.',\n 'chart.area': 'mapping omittable. Same as line — first string → x, numbers → y.',\n 'chart.pie': 'mapping omittable. First string → label, first number → value.',\n 'chart.scatter': 'mapping omittable. First two numbers → x, y. color/size optional.',\n 'chart.radar': 'mapping omittable. First string → axis, numbers → series values.',\n 'chart.heatmap': 'mapping recommended. x, y (categories), value (intensity).',\n 'chart.box': 'mapping recommended. x (group), y mapped to [min, q1, median, q3, max].',\n 'chart.funnel': 'mapping omittable. First string → label, first number → value.',\n 'chart.waterfall': 'mapping omittable. First string → x, first number → y.',\n 'chart.treemap': 'No mapping. data is [{name, value, children?}].',\n 'metric': 'No mapping needed. data is {value, label?, unit?, change?, trend?}.',\n 'stat-group': 'No mapping needed. data is [{label, value, ...}]. Optional: icon (emoji), description (sub-label).',\n 'gauge': 'No mapping needed. data is {value}. Set min/max/unit in options.',\n 'progress': 'No mapping needed. data is {value, max?}. Set label in options.',\n 'table': 'mapping.columns omittable — auto-inferred from data keys.',\n 'list': 'mapping omittable if data has primary/secondary keys. Otherwise set mapping.',\n 'form': 'Uses fields[] or formdown, not data/mapping. data provides defaults.',\n 'confirm': 'Uses title, description, actions. data is optional.',\n 'markdown': 'No mapping. data is {content: \"markdown string\"}.',\n 'image': 'No mapping. data is {src, alt?, caption?}.',\n 'callout': 'No mapping. data is {message, title?, level?}.',\n 'compose': 'Uses children[] and layout. Each child is a widget spec.',\n 'kv': 'No mapping. data is {key: val, ...} or [{key, value}]. layout in options.',\n 'code': 'No mapping. data is {content, language?}. lineNumbers/highlight/maxHeight/wrap in options.',\n 'citation': 'No mapping. data is {title, url?, snippet?, source?} or array of those. compact/numbered in options.',\n 'status': 'No mapping. data is {label, value, level?} or array of those. level: info/success/warning/error/neutral.',\n 'video': 'No mapping. data is {src, poster?, alt?, caption?}. autoplay/controls/loop/muted in options.',\n 'gallery': 'No mapping. data is [{src, alt?, caption?}]. columns/aspectRatio in options.',\n 'steps': 'No mapping. data is [{label, status?, description?, icon?}]. status: done/active/pending/error. icon: emoji/text override. layout: vertical/horizontal.',\n 'rating': 'No mapping. data is {value?, max?}. options: interactive, icon (star/heart/thumb), max, label.',\n 'actions': 'No data. Uses actions[] array. layout in options (wrap/column).',\n 'divider': 'No data. label/spacing in options.',\n 'header': 'data is {text, level?}. level defaults to 2.',\n};\n\n/** Events emitted per widget category. */\nexport const WIDGET_EVENTS: Readonly<Record<string, readonly string[]>> = {\n chart: ['select'],\n table: ['select'],\n list: ['select'],\n form: ['submit', 'change', 'action'],\n confirm: ['submit', 'action'],\n citation: ['action'],\n rating: ['submit'],\n actions: ['action'],\n};\n\n/** Get the event types emitted by a widget. Resolves `chart.*` → `chart`. */\nexport function getWidgetEvents(widget: string): readonly string[] {\n return WIDGET_EVENTS[widget] ?? WIDGET_EVENTS[widget.split('.')[0]] ?? [];\n}\n","/**\n * Widget catalog and template generation for programmatic use.\n *\n * Designed to power an MCP server or any tool that needs\n * to list widgets, describe their capabilities, or generate\n * minimal starter specs.\n */\n\nimport type { UWidgetSpec } from './types.js';\nimport type { DataFieldInfo } from './widget-meta.js';\nimport {\n MAPPING_DOCS, OPTION_DOCS, FIELD_PROP_DOCS, ACTION_PROP_DOCS,\n WIDGET_OPTIONS, WIDGET_DATA_FIELDS, WIDGET_INFERENCE,\n getWidgetEvents,\n} from './widget-meta.js';\n\n/** Describes a single widget type in the catalog. */\nexport interface WidgetInfo {\n /** Widget type identifier (e.g., `\"chart.bar\"`). */\n widget: string;\n /** Human-readable category. */\n category: 'chart' | 'display' | 'input' | 'content' | 'composition';\n /** Short description of the widget's purpose. */\n description: string;\n /** Which mapping keys are relevant for this widget. */\n mappingKeys: string[];\n /** Expected data shape. */\n dataShape: 'object' | 'array' | 'none';\n}\n\n/** Extended detail returned when `help()` is called with an exact widget name. */\nexport interface WidgetDetail extends WidgetInfo {\n /** One-line hint telling LLM what can be omitted via auto-inference. */\n autoInference: string;\n /** Well-known data fields (display/content widgets). Empty for user-defined data. */\n dataFields: DataFieldInfo[];\n /** Mapping key descriptions relevant to this widget. */\n mappingDocs: Record<string, string>;\n /** Option key descriptions relevant to this widget. */\n optionDocs: Record<string, string>;\n /** Field definition property docs (form/confirm only). */\n fieldDocs?: Record<string, string>;\n /** Action property docs (form/confirm only). */\n actionDocs?: Record<string, string>;\n /** Event types emitted by this widget. */\n events: readonly string[];\n /** Example specs (minimal template + feature-rich). */\n examples: { label: string; spec: UWidgetSpec }[];\n}\n\nconst CATALOG: readonly WidgetInfo[] = [\n // Charts\n // Charts\n { widget: 'chart.bar', category: 'chart', description: 'Bar chart for category × value comparison', mappingKeys: ['x', 'y'], dataShape: 'array' },\n { widget: 'chart.line', category: 'chart', description: 'Line chart for trends over a category axis', mappingKeys: ['x', 'y'], dataShape: 'array' },\n { widget: 'chart.area', category: 'chart', description: 'Area chart (filled line chart)', mappingKeys: ['x', 'y'], dataShape: 'array' },\n { widget: 'chart.pie', category: 'chart', description: 'Pie or donut chart for proportions', mappingKeys: ['label', 'value'], dataShape: 'array' },\n { widget: 'chart.scatter', category: 'chart', description: 'Scatter plot for two numeric dimensions', mappingKeys: ['x', 'y', 'color', 'size'], dataShape: 'array' },\n { widget: 'chart.radar', category: 'chart', description: 'Radar chart for multi-axis comparison', mappingKeys: ['axis', 'value'], dataShape: 'array' },\n { widget: 'chart.heatmap', category: 'chart', description: 'Heatmap for matrix data visualization', mappingKeys: ['x', 'y', 'value'], dataShape: 'array' },\n { widget: 'chart.box', category: 'chart', description: 'Box plot for statistical distribution', mappingKeys: ['x', 'y'], dataShape: 'array' },\n { widget: 'chart.funnel', category: 'chart', description: 'Funnel chart for sequential stages', mappingKeys: ['label', 'value'], dataShape: 'array' },\n { widget: 'chart.waterfall', category: 'chart', description: 'Waterfall chart for cumulative values', mappingKeys: ['x', 'y'], dataShape: 'array' },\n { widget: 'chart.treemap', category: 'chart', description: 'Treemap for hierarchical data', mappingKeys: [], dataShape: 'array' },\n // Display\n { widget: 'metric', category: 'display', description: 'Single KPI value with optional trend', mappingKeys: [], dataShape: 'object' },\n { widget: 'stat-group', category: 'display', description: 'Multiple KPI values in a row', mappingKeys: [], dataShape: 'array' },\n { widget: 'gauge', category: 'display', description: 'Arc gauge for a value within a range', mappingKeys: [], dataShape: 'object' },\n { widget: 'progress', category: 'display', description: 'Progress bar for a value within a range', mappingKeys: [], dataShape: 'object' },\n { widget: 'table', category: 'display', description: 'Sortable data table with auto-inferred columns', mappingKeys: ['columns'], dataShape: 'array' },\n { widget: 'list', category: 'display', description: 'Structured list with avatars and trailing values', mappingKeys: ['primary', 'secondary', 'avatar', 'icon', 'trailing', 'badge'], dataShape: 'array' },\n // Input\n { widget: 'form', category: 'input', description: 'Data entry form with typed fields', mappingKeys: [], dataShape: 'object' },\n { widget: 'confirm', category: 'input', description: 'Yes/no confirmation dialog', mappingKeys: [], dataShape: 'object' },\n // Content\n { widget: 'markdown', category: 'content', description: 'Render markdown text (headers, bold, italic, code, links, lists, tables)', mappingKeys: [], dataShape: 'object' },\n { widget: 'image', category: 'content', description: 'Display an image', mappingKeys: [], dataShape: 'object' },\n { widget: 'callout', category: 'content', description: 'Callout/alert banner', mappingKeys: [], dataShape: 'object' },\n // Chat / Interaction\n { widget: 'code', category: 'content', description: 'Syntax-highlighted code block with line numbers and copy button', mappingKeys: [], dataShape: 'object' },\n { widget: 'citation', category: 'content', description: 'Source/reference cards with title, URL, snippet, and source', mappingKeys: [], dataShape: 'array' },\n { widget: 'status', category: 'content', description: 'Status indicators with label, value, and level-based coloring', mappingKeys: [], dataShape: 'array' },\n { widget: 'steps', category: 'content', description: 'Multi-step progress indicator (done/active/pending/error)', mappingKeys: [], dataShape: 'array' },\n { widget: 'rating', category: 'content', description: 'Star/heart/thumb rating display or input', mappingKeys: [], dataShape: 'object' },\n { widget: 'video', category: 'content', description: 'Video player with controls, poster, and caption', mappingKeys: [], dataShape: 'object' },\n { widget: 'gallery', category: 'content', description: 'Image gallery grid with captions', mappingKeys: [], dataShape: 'array' },\n { widget: 'kv', category: 'content', description: 'Key-value pairs display (object or array of {key, value})', mappingKeys: [], dataShape: 'object' },\n { widget: 'actions', category: 'content', description: 'Standalone action buttons (quick replies, suggested actions)', mappingKeys: [], dataShape: 'none' },\n { widget: 'divider', category: 'content', description: 'Visual separator with optional label', mappingKeys: [], dataShape: 'none' },\n { widget: 'header', category: 'content', description: 'Section heading (h1–h3)', mappingKeys: [], dataShape: 'object' },\n // Composition\n { widget: 'compose', category: 'composition', description: 'Combine multiple widgets with layout hints', mappingKeys: [], dataShape: 'none' },\n];\n\n/**\n * Get the widget catalog.\n *\n * - No argument → list all widgets (`WidgetInfo[]`).\n * - Exact widget name → full detail (`WidgetDetail`).\n * - Category or prefix → filtered list (`WidgetInfo[]`).\n *\n * @example\n * ```ts\n * help() // → all widget descriptions\n * help('chart') // → all chart types (WidgetInfo[])\n * help('chart.bar') // → full detail (WidgetDetail)\n * ```\n */\nexport function help(): WidgetInfo[];\nexport function help(widget: string): WidgetInfo[] | WidgetDetail;\nexport function help(widget?: string): WidgetInfo[] | WidgetDetail {\n if (!widget) return [...CATALOG];\n\n // Exact match → return WidgetDetail\n const exact = CATALOG.find((w) => w.widget === widget);\n if (exact) return buildWidgetDetail(exact);\n\n // Category prefix match (e.g., 'chart', 'display', 'input')\n const byCategory = CATALOG.filter((w) => w.category === widget);\n if (byCategory.length > 0) return byCategory;\n\n // Widget prefix match (e.g., 'chart.' matches all chart types)\n const byPrefix = CATALOG.filter((w) => w.widget.startsWith(widget));\n return byPrefix;\n}\n\n/** Template data for each widget type. */\nconst TEMPLATES: Record<string, UWidgetSpec> = {\n 'chart.bar': {\n widget: 'chart.bar',\n data: [{ category: 'A', value: 30 }, { category: 'B', value: 70 }, { category: 'C', value: 45 }],\n mapping: { x: 'category', y: 'value' },\n },\n 'chart.line': {\n widget: 'chart.line',\n data: [{ month: 'Jan', value: 100 }, { month: 'Feb', value: 120 }, { month: 'Mar', value: 90 }],\n mapping: { x: 'month', y: 'value' },\n },\n 'chart.area': {\n widget: 'chart.area',\n data: [{ month: 'Jan', value: 100 }, { month: 'Feb', value: 120 }, { month: 'Mar', value: 90 }],\n mapping: { x: 'month', y: 'value' },\n },\n 'chart.pie': {\n widget: 'chart.pie',\n data: [{ name: 'A', value: 40 }, { name: 'B', value: 35 }, { name: 'C', value: 25 }],\n mapping: { label: 'name', value: 'value' },\n },\n 'chart.scatter': {\n widget: 'chart.scatter',\n data: [{ x: 10, y: 20 }, { x: 30, y: 40 }, { x: 50, y: 15 }],\n mapping: { x: 'x', y: 'y' },\n },\n 'chart.radar': {\n widget: 'chart.radar',\n data: [{ axis: 'Speed', value: 80 }, { axis: 'Power', value: 90 }, { axis: 'Defense', value: 60 }],\n mapping: { axis: 'axis', value: 'value' },\n },\n 'chart.heatmap': {\n widget: 'chart.heatmap',\n data: [\n { x: 'Mon', y: 'Morning', value: 10 },\n { x: 'Mon', y: 'Afternoon', value: 20 },\n { x: 'Tue', y: 'Morning', value: 15 },\n { x: 'Tue', y: 'Afternoon', value: 25 },\n ],\n mapping: { x: 'x', y: 'y', value: 'value' },\n },\n 'chart.box': {\n widget: 'chart.box',\n data: [{ group: 'A', min: 10, q1: 25, median: 50, q3: 75, max: 90 }],\n mapping: { x: 'group', y: ['min', 'q1', 'median', 'q3', 'max'] },\n },\n 'chart.funnel': {\n widget: 'chart.funnel',\n data: [{ stage: 'Visit', count: 1000 }, { stage: 'Click', count: 600 }, { stage: 'Purchase', count: 200 }],\n mapping: { label: 'stage', value: 'count' },\n },\n 'chart.waterfall': {\n widget: 'chart.waterfall',\n data: [{ item: 'Revenue', amount: 500 }, { item: 'Cost', amount: -200 }, { item: 'Tax', amount: -50 }],\n mapping: { x: 'item', y: 'amount' },\n },\n 'chart.treemap': {\n widget: 'chart.treemap',\n data: [{ name: 'Group A', value: 100 }, { name: 'Group B', value: 80 }],\n },\n 'metric': {\n widget: 'metric',\n data: { value: 1284, unit: 'users', change: 12.5, trend: 'up' },\n },\n 'stat-group': {\n widget: 'stat-group',\n data: [\n { label: 'Users', value: 1284, suffix: '' },\n { label: 'Revenue', value: 42000, suffix: '$' },\n ],\n },\n 'gauge': {\n widget: 'gauge',\n data: { value: 73 },\n options: { min: 0, max: 100, unit: '%' },\n },\n 'progress': {\n widget: 'progress',\n data: { value: 65 },\n options: { min: 0, max: 100, unit: '%' },\n },\n 'table': {\n widget: 'table',\n data: [\n { name: 'Alice', role: 'Engineer', status: 'Active' },\n { name: 'Bob', role: 'Designer', status: 'Away' },\n ],\n },\n 'list': {\n widget: 'list',\n data: [\n { name: 'Alice', role: 'Engineer' },\n { name: 'Bob', role: 'Designer' },\n ],\n mapping: { primary: 'name', secondary: 'role' },\n },\n 'form': {\n widget: 'form',\n fields: [\n { field: 'name', label: 'Name', type: 'text', required: true },\n { field: 'email', label: 'Email', type: 'email' },\n ],\n actions: [\n { label: 'Submit', action: 'submit', style: 'primary' },\n ],\n },\n 'confirm': {\n widget: 'confirm',\n title: 'Are you sure?',\n description: 'This action cannot be undone.',\n actions: [\n { label: 'Confirm', action: 'submit', style: 'danger' },\n { label: 'Cancel', action: 'cancel' },\n ],\n },\n 'markdown': {\n widget: 'markdown',\n data: { content: '# Hello\\n\\nThis is **markdown** content.' },\n },\n 'image': {\n widget: 'image',\n data: { src: 'https://placehold.co/300x200', alt: 'Placeholder image' },\n },\n 'callout': {\n widget: 'callout',\n data: { content: 'This is an informational callout.', variant: 'info' },\n },\n 'code': {\n widget: 'code',\n data: { content: 'const x = 42;\\nconsole.log(x);', language: 'javascript' },\n },\n 'citation': {\n widget: 'citation',\n data: [\n { title: 'u-widgets Documentation', url: 'https://github.com/iyulab/u-widgets', source: 'GitHub' },\n ],\n },\n 'status': {\n widget: 'status',\n data: [\n { label: 'API', value: 'Operational', level: 'success' },\n { label: 'DB', value: 'Degraded', level: 'warning' },\n ],\n },\n 'steps': {\n widget: 'steps',\n data: [\n { label: 'Data collection', status: 'done' },\n { label: 'Analysis', status: 'active' },\n { label: 'Report', status: 'pending' },\n ],\n },\n 'rating': {\n widget: 'rating',\n data: { value: 4.2 },\n },\n 'video': {\n widget: 'video',\n data: { src: 'https://example.com/demo.mp4', poster: 'https://example.com/thumb.jpg' },\n },\n 'gallery': {\n widget: 'gallery',\n data: [\n { src: 'https://placehold.co/300x200', alt: 'Image 1' },\n { src: 'https://placehold.co/300x200', alt: 'Image 2' },\n { src: 'https://placehold.co/300x200', alt: 'Image 3' },\n ],\n },\n 'kv': {\n widget: 'kv',\n data: { status: 'Active', plan: 'Pro', expires: '2026-03-15' },\n },\n 'actions': {\n widget: 'actions',\n actions: [\n { label: 'Analyze', action: 'analyze' },\n { label: 'Export', action: 'export', style: 'primary' },\n ],\n },\n 'divider': {\n widget: 'divider',\n },\n 'header': {\n widget: 'header',\n data: { text: 'Section Title' },\n },\n 'compose': {\n widget: 'compose',\n layout: 'grid',\n children: [\n { widget: 'metric', data: { value: 42, unit: 'items' } },\n { widget: 'metric', data: { value: 95, unit: '%' } },\n ],\n },\n};\n\n/** Feature-rich examples per widget (merged with TEMPLATES \"Minimal\" in buildWidgetDetail). */\nconst EXAMPLES: Record<string, { label: string; spec: UWidgetSpec }[]> = {\n 'chart.bar': [\n {\n label: 'Stacked multi-series',\n spec: {\n widget: 'chart.bar',\n data: [\n { quarter: 'Q1', product: 80, service: 40 },\n { quarter: 'Q2', product: 100, service: 55 },\n { quarter: 'Q3', product: 90, service: 60 },\n ],\n mapping: { x: 'quarter', y: ['product', 'service'] },\n options: { stack: true },\n },\n },\n {\n label: 'Horizontal',\n spec: {\n widget: 'chart.bar',\n data: [\n { lang: 'JavaScript', pct: 65 },\n { lang: 'Python', pct: 48 },\n { lang: 'TypeScript', pct: 35 },\n ],\n options: { horizontal: true },\n },\n },\n ],\n 'chart.line': [\n {\n label: 'Smooth multi-series',\n spec: {\n widget: 'chart.line',\n data: [\n { day: 'Mon', cpu: 45, mem: 62 },\n { day: 'Tue', cpu: 52, mem: 58 },\n { day: 'Wed', cpu: 68, mem: 71 },\n ],\n mapping: { x: 'day', y: ['cpu', 'mem'] },\n options: { smooth: true },\n },\n },\n ],\n 'chart.area': [\n {\n label: 'Stacked area',\n spec: {\n widget: 'chart.area',\n data: [\n { month: 'Jan', organic: 100, paid: 60 },\n { month: 'Feb', organic: 120, paid: 80 },\n { month: 'Mar', organic: 110, paid: 90 },\n ],\n mapping: { x: 'month', y: ['organic', 'paid'] },\n options: { stack: true },\n },\n },\n ],\n 'chart.pie': [\n {\n label: 'Donut + custom colors',\n spec: {\n widget: 'chart.pie',\n data: [\n { category: 'Completed', count: 42 },\n { category: 'In Progress', count: 18 },\n { category: 'Blocked', count: 5 },\n ],\n options: { donut: true, colors: ['#22c55e', '#f59e0b', '#ef4444'] },\n },\n },\n ],\n 'chart.scatter': [\n {\n label: 'Color groups',\n spec: {\n widget: 'chart.scatter',\n data: [\n { height: 170, weight: 65, group: 'A' },\n { height: 175, weight: 72, group: 'A' },\n { height: 160, weight: 55, group: 'B' },\n { height: 180, weight: 80, group: 'B' },\n ],\n mapping: { x: 'height', y: 'weight', color: 'group' },\n },\n },\n ],\n 'chart.radar': [\n {\n label: 'Multi-person comparison',\n spec: {\n widget: 'chart.radar',\n data: [\n { skill: 'JS', alice: 90, bob: 70 },\n { skill: 'CSS', alice: 80, bob: 85 },\n { skill: 'Node', alice: 75, bob: 60 },\n ],\n mapping: { axis: 'skill', y: ['alice', 'bob'] },\n },\n },\n ],\n 'chart.heatmap': [\n {\n label: 'Custom colorRange',\n spec: {\n widget: 'chart.heatmap',\n data: [\n { x: 'Mon', y: '9am', value: 5 },\n { x: 'Mon', y: '12pm', value: 20 },\n { x: 'Tue', y: '9am', value: 8 },\n { x: 'Tue', y: '12pm', value: 25 },\n ],\n mapping: { x: 'x', y: 'y', value: 'value' },\n options: { colorRange: ['#eff6ff', '#3b82f6', '#1e3a5f'] },\n },\n },\n ],\n 'chart.box': [\n {\n label: 'Multi-group',\n spec: {\n widget: 'chart.box',\n data: [\n { group: 'Setosa', min: 4.3, q1: 4.8, median: 5.0, q3: 5.2, max: 5.8 },\n { group: 'Versicolor', min: 4.9, q1: 5.6, median: 5.9, q3: 6.3, max: 7.0 },\n ],\n },\n },\n ],\n 'chart.funnel': [\n {\n label: 'Marketing funnel',\n spec: {\n widget: 'chart.funnel',\n data: [\n { stage: 'Impressions', count: 10000 },\n { stage: 'Clicks', count: 3500 },\n { stage: 'Sign-ups', count: 800 },\n { stage: 'Purchases', count: 200 },\n ],\n },\n },\n ],\n 'chart.waterfall': [\n {\n label: 'P&L waterfall',\n spec: {\n widget: 'chart.waterfall',\n data: [\n { item: 'Revenue', amount: 500 },\n { item: 'COGS', amount: -200 },\n { item: 'OpEx', amount: -120 },\n { item: 'Tax', amount: -50 },\n ],\n },\n },\n ],\n 'chart.treemap': [\n {\n label: 'Nested hierarchy',\n spec: {\n widget: 'chart.treemap',\n data: [\n {\n name: 'Engineering', value: 100,\n children: [\n { name: 'Frontend', value: 40 },\n { name: 'Backend', value: 35 },\n { name: 'DevOps', value: 25 },\n ],\n },\n { name: 'Design', value: 50 },\n ],\n },\n },\n ],\n 'metric': [\n {\n label: 'With prefix/suffix',\n spec: {\n widget: 'metric',\n data: { value: 4250, label: 'Revenue', prefix: '$', suffix: '/mo', change: 8.3, trend: 'up' },\n },\n },\n ],\n 'stat-group': [\n {\n label: 'With all trends',\n spec: {\n widget: 'stat-group',\n data: [\n { value: 99.9, unit: '%', label: 'Uptime', change: 0.1, trend: 'up' },\n { value: 142, label: 'Requests/s', change: -5, trend: 'down' },\n { value: 3, label: 'Incidents', change: 0, trend: 'flat' },\n ],\n },\n },\n ],\n 'gauge': [\n {\n label: 'Threshold colors',\n spec: {\n widget: 'gauge',\n data: { value: 73 },\n options: {\n min: 0, max: 100, unit: '%',\n thresholds: [\n { to: 50, color: 'green' },\n { to: 80, color: 'yellow' },\n { to: 100, color: 'red' },\n ],\n },\n },\n },\n ],\n 'progress': [\n {\n label: 'Label + thresholds',\n spec: {\n widget: 'progress',\n data: { value: 35, max: 100 },\n options: {\n label: '{percent}% complete',\n thresholds: [\n { to: 30, color: 'red' },\n { to: 60, color: 'yellow' },\n { to: 100, color: 'green' },\n ],\n },\n },\n },\n ],\n 'table': [\n {\n label: 'Formatted columns',\n spec: {\n widget: 'table',\n data: [\n { name: 'Alice', role: 'Engineer', salary: 95000 },\n { name: 'Bob', role: 'Designer', salary: 82000 },\n ],\n mapping: {\n columns: [\n { field: 'name', label: 'Name' },\n { field: 'role', label: 'Role' },\n { field: 'salary', label: 'Salary', format: 'currency', align: 'right' },\n ],\n },\n },\n },\n ],\n 'list': [\n {\n label: 'Avatar + trailing',\n spec: {\n widget: 'list',\n data: [\n { name: 'Alice Kim', role: 'Engineer', hours: '32h' },\n { name: 'Bob Park', role: 'Designer', hours: '28h' },\n ],\n mapping: { primary: 'name', secondary: 'role', trailing: 'hours' },\n },\n },\n ],\n 'form': [\n {\n label: 'Validation + pattern',\n spec: {\n widget: 'form',\n fields: [\n { field: 'username', label: 'Username', type: 'text', required: true, minLength: 3, maxLength: 20 },\n { field: 'email', label: 'Email', type: 'email', required: true },\n { field: 'plan', label: 'Plan', type: 'radio', options: ['Free', 'Pro', 'Enterprise'] },\n ],\n actions: [\n { label: 'Register', action: 'submit', style: 'primary' },\n ],\n },\n },\n ],\n 'confirm': [\n {\n label: 'Danger action',\n spec: {\n widget: 'confirm',\n title: 'Delete Project',\n description: 'This action cannot be undone.',\n actions: [\n { label: 'Cancel', action: 'cancel' },\n { label: 'Delete', action: 'submit', style: 'danger' },\n ],\n },\n },\n ],\n 'markdown': [\n {\n label: 'Rich content',\n spec: {\n widget: 'markdown',\n data: { content: '# Getting Started\\n\\nWelcome to **u-widgets**!\\n\\n- Metrics & gauges\\n- Charts with minimal JSON\\n\\n```json\\n{ \"widget\": \"metric\", \"data\": { \"value\": 42 } }\\n```' },\n },\n },\n ],\n 'image': [\n {\n label: 'With caption',\n spec: {\n widget: 'image',\n data: { src: 'https://placehold.co/400x200', alt: 'Banner', caption: 'Declarative widget system' },\n },\n },\n ],\n 'callout': [\n {\n label: 'Info with title',\n spec: {\n widget: 'callout',\n data: { title: 'Did you know?', message: 'u-widgets auto-infers mappings from data shape.', level: 'info' },\n },\n },\n ],\n 'code': [\n {\n label: 'Python with line highlights',\n spec: {\n widget: 'code',\n data: {\n content: 'def fibonacci(n):\\n if n <= 1:\\n return n\\n return fibonacci(n-1) + fibonacci(n-2)\\n\\nprint(fibonacci(10))',\n language: 'python',\n },\n options: { highlight: [2, 3] },\n },\n },\n {\n label: 'SQL query',\n spec: {\n widget: 'code',\n data: {\n content: 'SELECT u.name, COUNT(o.id) AS orders\\nFROM users u\\nLEFT JOIN orders o ON u.id = o.user_id\\nWHERE u.active = TRUE\\nGROUP BY u.name\\nORDER BY orders DESC\\nLIMIT 10;',\n language: 'sql',\n },\n },\n },\n ],\n 'citation': [\n {\n label: 'Multiple sources with snippets',\n spec: {\n widget: 'citation',\n data: [\n { title: 'Web Components MDN', url: 'https://developer.mozilla.org/docs/Web/API/Web_components', snippet: 'Create reusable custom elements.', source: 'MDN' },\n { title: 'Lit Documentation', url: 'https://lit.dev/docs/', snippet: 'Fast, lightweight web components.', source: 'lit.dev' },\n ],\n },\n },\n {\n label: 'Compact mode',\n spec: {\n widget: 'citation',\n data: [\n { title: 'Source A', url: 'https://example.com/a' },\n { title: 'Source B', url: 'https://example.com/b' },\n ],\n options: { compact: true },\n },\n },\n ],\n 'status': [\n {\n label: 'System health dashboard',\n spec: {\n widget: 'status',\n title: 'System Status',\n data: [\n { label: 'API Gateway', value: 'Operational', level: 'success' },\n { label: 'Database', value: 'Degraded', level: 'warning' },\n { label: 'CDN', value: 'Operational', level: 'success' },\n { label: 'Auth Service', value: 'Down', level: 'error' },\n { label: 'Backup', value: 'Scheduled', level: 'info' },\n ],\n },\n },\n ],\n 'steps': [\n {\n label: 'With descriptions',\n spec: {\n widget: 'steps',\n data: [\n { label: 'Collecting data', status: 'done', description: '2M records processed' },\n { label: 'Running analysis', status: 'active', description: 'Estimated 30s remaining' },\n { label: 'Generating report', status: 'pending' },\n ],\n },\n },\n {\n label: 'Horizontal layout',\n spec: {\n widget: 'steps',\n data: [\n { label: 'Upload', status: 'done' },\n { label: 'Process', status: 'active' },\n { label: 'Review', status: 'pending' },\n { label: 'Deploy', status: 'pending' },\n ],\n options: { layout: 'horizontal' },\n },\n },\n ],\n 'rating': [\n {\n label: 'Heart icon',\n spec: {\n widget: 'rating',\n data: { value: 3, max: 5 },\n options: { icon: 'heart' },\n },\n },\n {\n label: 'Interactive star',\n spec: {\n widget: 'rating',\n options: { interactive: true, label: 'Rate this answer:' },\n },\n },\n ],\n 'video': [\n {\n label: 'Autoplay muted loop',\n spec: {\n widget: 'video',\n data: { src: 'https://example.com/bg.mp4', caption: 'Background video' },\n options: { autoplay: true, loop: true, muted: true },\n },\n },\n ],\n 'gallery': [\n {\n label: 'Square grid with captions',\n spec: {\n widget: 'gallery',\n data: [\n { src: 'https://placehold.co/200', alt: 'A', caption: 'Product A' },\n { src: 'https://placehold.co/200', alt: 'B', caption: 'Product B' },\n { src: 'https://placehold.co/200', alt: 'C', caption: 'Product C' },\n { src: 'https://placehold.co/200', alt: 'D', caption: 'Product D' },\n ],\n options: { columns: 2, aspectRatio: '1:1' },\n },\n },\n ],\n 'kv': [\n {\n label: 'Array form (ordered)',\n spec: {\n widget: 'kv',\n data: [\n { key: 'Name', value: 'Alice Kim' },\n { key: 'Email', value: 'alice@example.com' },\n { key: 'Role', value: 'Engineer' },\n ],\n },\n },\n {\n label: 'Horizontal layout',\n spec: {\n widget: 'kv',\n data: { CPU: '72%', Memory: '4.2 GB', Disk: '85%' },\n options: { layout: 'horizontal' },\n },\n },\n ],\n 'actions': [\n {\n label: 'Quick replies',\n spec: {\n widget: 'actions',\n actions: [\n { label: 'Revenue analysis', action: 'analyze_revenue' },\n { label: 'Customer status', action: 'customer_status' },\n { label: 'Inventory check', action: 'check_inventory' },\n ],\n },\n },\n ],\n 'divider': [\n {\n label: 'With label',\n spec: {\n widget: 'divider',\n options: { label: 'Related items' },\n },\n },\n ],\n 'header': [\n {\n label: 'Level 1 heading',\n spec: {\n widget: 'header',\n data: { text: 'Dashboard', level: 1 },\n },\n },\n ],\n 'compose': [\n {\n label: 'Grid dashboard',\n spec: {\n widget: 'compose',\n layout: 'grid',\n columns: 2,\n children: [\n { widget: 'metric', data: { value: 99.9, unit: '%', label: 'Uptime' } },\n { widget: 'metric', data: { value: 142, label: 'Requests/s' } },\n { widget: 'progress', data: { value: 680, max: 1000 }, options: { label: '{value} / 1000' }, span: 2 },\n ],\n },\n },\n {\n label: 'Column widths (sidebar + main)',\n spec: {\n widget: 'compose',\n layout: 'grid',\n columns: 2,\n options: { widths: [1, 3] },\n children: [\n { widget: 'kv', data: { plan: 'Pro', status: 'Active' } },\n { widget: 'table', data: [{ name: 'Alice', role: 'Dev' }, { name: 'Bob', role: 'PM' }] },\n ],\n },\n },\n {\n label: 'Collapsed section',\n spec: {\n widget: 'compose',\n children: [\n { widget: 'kv', data: { summary: 'All systems operational' } },\n { widget: 'table', title: 'Detailed logs', collapsed: true, data: [{ time: '10:00', event: 'Deploy' }] },\n ],\n },\n },\n ],\n};\n\n/** Build a full WidgetDetail from a WidgetInfo catalog entry. */\nfunction buildWidgetDetail(info: WidgetInfo): WidgetDetail {\n const w = info.widget;\n\n // Mapping docs\n const mappingDocs: Record<string, string> = {};\n for (const key of info.mappingKeys) {\n if (MAPPING_DOCS[key]) mappingDocs[key] = MAPPING_DOCS[key];\n }\n\n // Option docs\n const optionDocs: Record<string, string> = {};\n for (const key of (WIDGET_OPTIONS[w] ?? [])) {\n if (OPTION_DOCS[key]) optionDocs[key] = OPTION_DOCS[key];\n }\n\n // Form/confirm-specific docs\n const isInput = w === 'form' || w === 'confirm';\n\n // Examples: template as \"Minimal\" + feature-rich\n const examples: { label: string; spec: UWidgetSpec }[] = [];\n const tmpl = TEMPLATES[w];\n if (tmpl) {\n examples.push({ label: 'Minimal', spec: JSON.parse(JSON.stringify(tmpl)) });\n }\n const extra = EXAMPLES[w];\n if (extra) {\n for (const e of extra) {\n examples.push({ label: e.label, spec: JSON.parse(JSON.stringify(e.spec)) });\n }\n }\n\n return {\n ...info,\n autoInference: WIDGET_INFERENCE[w] ?? '',\n dataFields: [...(WIDGET_DATA_FIELDS[w] ?? [])],\n mappingDocs,\n optionDocs,\n ...(isInput ? { fieldDocs: { ...FIELD_PROP_DOCS } } : {}),\n ...(isInput ? { actionDocs: { ...ACTION_PROP_DOCS } } : {}),\n events: getWidgetEvents(w),\n examples,\n };\n}\n\n/**\n * Generate a minimal template spec for a widget type.\n *\n * Returns a complete, valid spec with sample data that can be\n * used as a starting point. Returns `undefined` for unknown types.\n *\n * @param widget - Widget type identifier (e.g., `\"chart.bar\"`, `\"metric\"`).\n * @returns A deep-copied template spec, or `undefined`.\n *\n * @example\n * ```ts\n * template('metric')\n * // → { widget: 'metric', data: { value: 1284, unit: 'users', ... } }\n * ```\n */\nexport function template(widget: string): UWidgetSpec | undefined {\n const t = TEMPLATES[widget];\n if (!t) return undefined;\n return JSON.parse(JSON.stringify(t));\n}\n","/**\n * Suggest widget type and mapping from raw data shape.\n *\n * Analyzes the structure of the provided data and recommends\n * the most appropriate widget type with an auto-generated mapping.\n */\n\nimport type { UWidgetSpec, UWidgetMapping } from './types.js';\nimport { infer } from './infer.js';\nimport { isDateLikeString } from './utils.js';\n\n/** A widget + mapping recommendation. */\nexport interface MappingSuggestion {\n /** Recommended widget type. */\n widget: string;\n /** Suggested mapping for the widget. */\n mapping?: UWidgetMapping;\n /** Confidence score (0–1). Higher means better fit. */\n confidence: number;\n /** Human-readable reason for this suggestion. */\n reason: string;\n}\n\n/**\n * Suggest widget type and mapping from data alone.\n *\n * Analyzes data structure (keys, types, shape) and returns\n * ranked suggestions. If a widget type is provided, only suggests\n * a mapping for that specific widget.\n *\n * @param data - The data to analyze (object or array of records).\n * @param widget - Optional widget type to constrain the suggestion.\n * @returns Array of suggestions sorted by confidence (highest first).\n *\n * @example\n * ```ts\n * suggestMapping([{ name: 'A', value: 30 }, { name: 'B', value: 70 }])\n * // → [{ widget: 'chart.bar', mapping: { x: 'name', y: 'value' }, confidence: 0.9, ... }, ...]\n * ```\n */\nexport function suggestMapping(\n data: Record<string, unknown> | Record<string, unknown>[],\n widget?: string,\n): MappingSuggestion[] {\n if (data == null) return [];\n\n const records = Array.isArray(data) ? data : [data];\n if (records.length === 0) return [];\n\n const sample = records[0];\n const keys = Object.keys(sample);\n if (keys.length === 0) return [];\n\n const stringKeys = keys.filter((k) => typeof sample[k] === 'string');\n const numberKeys = keys.filter((k) => typeof sample[k] === 'number');\n const isArray = Array.isArray(data);\n\n // If widget is specified, just suggest mapping for that widget\n if (widget) {\n const mapping = infer(widget, data);\n if (mapping) {\n return [{ widget, mapping, confidence: 0.8, reason: `Auto-inferred mapping for ${widget}` }];\n }\n return [{ widget, confidence: 0.3, reason: `No mapping could be inferred for ${widget} from this data shape` }];\n }\n\n const suggestions: MappingSuggestion[] = [];\n\n // Single object with 'value' key → metric\n if (!isArray && numberKeys.includes('value')) {\n suggestions.push({\n widget: 'metric',\n confidence: 0.95,\n reason: 'Object data with \"value\" key is ideal for a metric widget',\n });\n }\n\n // Flat object with all primitive values (no 'value' key) → kv\n if (!isArray && !numberKeys.includes('value') && keys.length >= 2) {\n const allPrimitive = keys.every((k) => {\n const v = sample[k];\n return typeof v === 'string' || typeof v === 'number' || typeof v === 'boolean';\n });\n if (allPrimitive) {\n suggestions.push({\n widget: 'kv',\n confidence: 0.9,\n reason: 'Flat object with all primitive values is ideal for key-value display',\n });\n }\n }\n\n // Array of { key, value } objects → kv\n if (isArray && keys.includes('key') && keys.includes('value') && keys.length <= 3) {\n suggestions.push({\n widget: 'kv',\n confidence: 0.88,\n reason: 'Array with \"key\" and \"value\" fields matches key-value pair pattern',\n });\n }\n\n // Array with 1 string + 1 number → chart.bar\n if (isArray && stringKeys.length >= 1 && numberKeys.length >= 1) {\n const mapping = infer('chart.bar', data);\n suggestions.push({\n widget: 'chart.bar',\n mapping,\n confidence: numberKeys.length === 1 ? 0.9 : 0.7,\n reason: 'Category × value pattern detected',\n });\n }\n\n // Array with 1 string + multiple numbers → chart.line (multi-series)\n if (isArray && stringKeys.length >= 1 && numberKeys.length >= 2) {\n const mapping = infer('chart.line', data);\n suggestions.push({\n widget: 'chart.line',\n mapping,\n confidence: 0.8,\n reason: 'Category × multiple values pattern detected (multi-series)',\n });\n }\n\n // Array with date-like strings + numbers → chart.area (time-series)\n if (isArray && stringKeys.length >= 1 && numberKeys.length >= 1) {\n const hasDateField = stringKeys.some((k) =>\n isDateLikeString(String(records[0][k])));\n if (hasDateField) {\n const mapping = infer('chart.area', data);\n suggestions.push({\n widget: 'chart.area',\n mapping,\n confidence: 0.75,\n reason: 'Date-like category field detected — suitable for time-series area chart',\n });\n }\n }\n\n // Array with label+value → chart.pie\n if (isArray && stringKeys.length >= 1 && numberKeys.length === 1) {\n const mapping = infer('chart.pie', data);\n suggestions.push({\n widget: 'chart.pie',\n mapping,\n confidence: 0.6,\n reason: 'Label + value pattern could work as proportions',\n });\n }\n\n // Array with 2+ number fields, no string → chart.scatter\n if (isArray && numberKeys.length >= 2 && stringKeys.length === 0) {\n const mapping = infer('chart.scatter', data);\n suggestions.push({\n widget: 'chart.scatter',\n mapping,\n confidence: 0.85,\n reason: 'All-numeric data is ideal for scatter plot',\n });\n }\n\n // Array with multiple fields → table\n if (isArray && keys.length >= 2) {\n suggestions.push({\n widget: 'table',\n mapping: infer('table', data),\n confidence: 0.75,\n reason: 'Multi-field array renders well as a table',\n });\n }\n\n // Array with name-like fields → list\n if (isArray && stringKeys.length >= 1) {\n const mapping = infer('list', data);\n suggestions.push({\n widget: 'list',\n mapping,\n confidence: 0.5,\n reason: 'String fields can display as a list',\n });\n }\n\n // Single object with value + min/max → progress\n if (!isArray && numberKeys.includes('value') && (numberKeys.includes('min') || numberKeys.includes('max'))) {\n suggestions.push({\n widget: 'progress',\n confidence: 0.85,\n reason: 'Object with \"value\" and \"min\"/\"max\" is ideal for a progress bar',\n });\n }\n\n // Single object with value → gauge (lower priority than metric/progress)\n if (!isArray && numberKeys.includes('value')) {\n suggestions.push({\n widget: 'gauge',\n confidence: 0.7,\n reason: 'Object with \"value\" can display as a gauge',\n });\n }\n\n // Array with 2+ numbers and a string → chart.radar\n if (isArray && stringKeys.length >= 1 && numberKeys.length >= 2) {\n const mapping = infer('chart.radar', data);\n if (mapping) {\n suggestions.push({\n widget: 'chart.radar',\n mapping,\n confidence: 0.6,\n reason: 'Category × multiple values can display as a radar chart',\n });\n }\n }\n\n // Array with 2 string + 1 number → chart.heatmap\n if (isArray && stringKeys.length >= 2 && numberKeys.length >= 1) {\n const mapping = infer('chart.heatmap', data);\n if (mapping) {\n suggestions.push({\n widget: 'chart.heatmap',\n mapping,\n confidence: 0.65,\n reason: 'Two categories × value pattern suits a heatmap',\n });\n }\n }\n\n // Array with 5+ numbers → chart.box\n if (isArray && numberKeys.length >= 5) {\n const mapping = infer('chart.box', data);\n if (mapping) {\n suggestions.push({\n widget: 'chart.box',\n mapping,\n confidence: 0.7,\n reason: 'Five or more numeric fields fit a box plot (min/q1/median/q3/max)',\n });\n }\n }\n\n // Array with label+value (same as pie) → chart.funnel\n if (isArray && stringKeys.length >= 1 && numberKeys.length === 1) {\n const mapping = infer('chart.funnel', data);\n if (mapping) {\n suggestions.push({\n widget: 'chart.funnel',\n mapping,\n confidence: 0.45,\n reason: 'Label + value pattern can display as a funnel',\n });\n }\n }\n\n // Array with label+value → chart.waterfall\n if (isArray && stringKeys.length >= 1 && numberKeys.length >= 1) {\n const mapping = infer('chart.waterfall', data);\n if (mapping) {\n suggestions.push({\n widget: 'chart.waterfall',\n mapping,\n confidence: 0.4,\n reason: 'Category × value pattern can display as a waterfall chart',\n });\n }\n }\n\n // Array with label+value → chart.treemap\n if (isArray && stringKeys.length >= 1 && numberKeys.length >= 1) {\n const mapping = infer('chart.treemap', data);\n if (mapping) {\n suggestions.push({\n widget: 'chart.treemap',\n mapping,\n confidence: 0.35,\n reason: 'Category × value pattern can display as a treemap',\n });\n }\n }\n\n // Array of objects with label/value/suffix → stat-group\n if (isArray && keys.includes('label') && keys.includes('value')) {\n suggestions.push({\n widget: 'stat-group',\n confidence: 0.85,\n reason: 'Array with \"label\" and \"value\" keys matches stat-group pattern',\n });\n }\n\n // Sort by confidence descending\n suggestions.sort((a, b) => b.confidence - a.confidence);\n\n return suggestions;\n}\n\n/**\n * Generate a complete spec suggestion from data.\n *\n * Convenience wrapper: picks the top suggestion and returns a ready-to-use spec.\n *\n * @param data - The data to analyze.\n * @returns A complete spec, or `undefined` if no suggestion could be made.\n */\n\nexport function autoSpec(data: Record<string, unknown> | Record<string, unknown>[]): UWidgetSpec | undefined {\n const suggestions = suggestMapping(data);\n if (suggestions.length === 0) return undefined;\n\n const top = suggestions[0];\n // Only recommend if confidence meets threshold — avoid low-confidence mismatches\n if (top.confidence < 0.7) return undefined;\n\n const spec: UWidgetSpec = { widget: top.widget, data };\n if (top.mapping) spec.mapping = top.mapping;\n return spec;\n}\n","/**\n * Runtime spec scanner that extracts the full property surface from widget specs.\n *\n * `specSurface()` is the single function shared by both the MCP server and\n * the demo props panel — it scans an array of spec objects and returns every\n * key actually used, merged with descriptions from `widget-meta.ts`.\n *\n * Structural guarantee: if a spec uses a property, `specSurface()` reports it.\n */\n\nimport {\n MAPPING_DOCS,\n FIELD_PROP_DOCS,\n DATA_FIELD_DOCS,\n OPTION_DOCS,\n getWidgetEvents,\n} from './widget-meta.js';\n\n/** A single discovered property with its inferred type and optional description. */\nexport interface PropInfo {\n key: string;\n /** Inferred runtime type: `\"number\"`, `\"string\"`, `\"boolean\"`, `\"object[]\"`, etc. */\n type: string;\n /** Description from the registry when available. */\n desc?: string;\n}\n\n/** The full property surface extracted from a set of specs. */\nexport interface SpecSurface {\n /** Top-level spec keys used (data, mapping, options, …). */\n specKeys: string[];\n /** `data.*` keys with inferred types. */\n dataFields: PropInfo[];\n /** `mapping.*` keys with schema descriptions. */\n mappingKeys: PropInfo[];\n /** `options.*` keys with inferred types. */\n optionKeys: PropInfo[];\n /** `fields[].*` keys with schema descriptions. */\n fieldProps: PropInfo[];\n /** Distinct `fields[].type` values used. */\n fieldTypes: string[];\n /** Distinct `actions[].style` values used. */\n actionStyles: string[];\n /** Events emitted by this widget category. */\n events: readonly string[];\n}\n\n/** Infer a display type label from a runtime value. */\nfunction typeLabel(v: unknown): string {\n if (v === null || v === undefined) return 'null';\n if (Array.isArray(v)) {\n if (v.length === 0) return 'array';\n const first = v[0];\n if (typeof first === 'object' && first !== null) return 'object[]';\n return `${typeof first}[]`;\n }\n return typeof v;\n}\n\n/**\n * Scan an array of spec objects and collect their full property surface.\n *\n * @param specs - Array of widget spec objects (e.g. variant values).\n * @param widget - Optional widget type string for event lookup.\n * @returns The collected {@link SpecSurface}.\n */\nexport function specSurface(\n specs: object[],\n widget?: string,\n): SpecSurface {\n const specKeySet = new Set<string>();\n const dataMap = new Map<string, string>();\n const mappingMap = new Map<string, string>();\n const optionMap = new Map<string, string>();\n const fieldPropMap = new Map<string, string>();\n const fieldTypeSet = new Set<string>();\n const actionStyleSet = new Set<string>();\n\n for (const spec of specs) {\n const s = spec as Record<string, unknown>;\n\n // Top-level spec keys (everything except 'widget')\n for (const k of Object.keys(s)) {\n if (k !== 'widget') specKeySet.add(k);\n }\n\n // data\n const data = s.data;\n if (Array.isArray(data)) {\n for (const item of data) {\n if (item && typeof item === 'object') {\n for (const [k, v] of Object.entries(item as Record<string, unknown>)) {\n dataMap.set(k, typeLabel(v));\n }\n }\n }\n } else if (data && typeof data === 'object') {\n for (const [k, v] of Object.entries(data as Record<string, unknown>)) {\n dataMap.set(k, typeLabel(v));\n }\n }\n\n // mapping\n if (s.mapping && typeof s.mapping === 'object') {\n for (const [k, v] of Object.entries(s.mapping as Record<string, unknown>)) {\n mappingMap.set(k, Array.isArray(v) ? 'string[]' : String(typeof v));\n }\n }\n\n // options\n if (s.options && typeof s.options === 'object') {\n for (const [k, v] of Object.entries(s.options as Record<string, unknown>)) {\n optionMap.set(k, typeLabel(v));\n }\n }\n\n // fields (form)\n if (Array.isArray(s.fields)) {\n for (const f of s.fields as Record<string, unknown>[]) {\n for (const [k, v] of Object.entries(f)) {\n fieldPropMap.set(k, k === 'options' ? 'string[]' : typeLabel(v));\n }\n if (typeof f.type === 'string') fieldTypeSet.add(f.type);\n }\n }\n\n // actions\n if (Array.isArray(s.actions)) {\n for (const a of s.actions as Record<string, unknown>[]) {\n if (typeof a.style === 'string') actionStyleSet.add(a.style);\n }\n }\n }\n\n // Merge descriptions from registries\n const withDesc = (\n map: Map<string, string>,\n docs: Readonly<Record<string, string>>,\n ): PropInfo[] =>\n [...map.entries()].map(([key, type]) => {\n const desc = docs[key];\n return desc ? { key, type, desc } : { key, type };\n });\n\n return {\n specKeys: [...specKeySet],\n dataFields: withDesc(dataMap, DATA_FIELD_DOCS),\n mappingKeys: withDesc(mappingMap, MAPPING_DOCS),\n optionKeys: withDesc(optionMap, OPTION_DOCS),\n fieldProps: withDesc(fieldPropMap, FIELD_PROP_DOCS),\n fieldTypes: [...fieldTypeSet],\n actionStyles: [...actionStyleSet],\n events: widget ? getWidgetEvents(widget) : [],\n };\n}\n"],"names":["MAPPING_DOCS","FIELD_PROP_DOCS","DATA_FIELD_DOCS","OPTION_DOCS","ACTION_PROP_DOCS","WIDGET_OPTIONS","WIDGET_DATA_FIELDS","WIDGET_INFERENCE","WIDGET_EVENTS","getWidgetEvents","widget","CATALOG","help","exact","w","buildWidgetDetail","byCategory","TEMPLATES","EXAMPLES","info","mappingDocs","key","optionDocs","isInput","examples","tmpl","extra","e","template","t","suggestMapping","data","records","sample","keys","stringKeys","k","numberKeys","isArray","mapping","infer","suggestions","v","isDateLikeString","a","b","autoSpec","top","spec","typeLabel","first","specSurface","specs","specKeySet","dataMap","mappingMap","optionMap","fieldPropMap","fieldTypeSet","actionStyleSet","s","item","f","withDesc","map","docs","type","desc"],"mappings":"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"}