@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.js","sources":["../src/core/schema.ts","../src/core/format.ts","../src/core/suggest.ts","../src/core/locale.ts","../src/elements/u-metric.ts","../src/elements/u-gauge.ts","../src/elements/u-table.ts","../src/elements/u-form.ts","../src/elements/u-compose.ts","../src/elements/u-content.ts","../src/elements/u-kv.ts","../src/elements/u-code.ts","../src/elements/u-citation.ts","../src/elements/u-status.ts","../src/elements/u-steps.ts","../src/elements/u-rating.ts","../src/elements/u-video.ts","../src/elements/u-gallery.ts","../src/elements/u-widget.ts"],"sourcesContent":["import type { UWidgetSpec, FieldType } from './types.js';\nimport { getFormdownParser } from './formdown.js';\n\n/** Result of spec validation via {@link validate}. */\nexport interface ValidationResult {\n /** Whether the spec passed all validation checks. */\n valid: boolean;\n /** Error messages — issues that prevent correct rendering. */\n errors: string[];\n /** Warning messages — non-fatal issues or recommendations. */\n warnings: string[];\n}\n\n/** Valid field types for form fields. */\nconst VALID_FIELD_TYPES = new Set<string>([\n 'text', 'email', 'password', 'tel', 'url', 'textarea',\n 'number', 'select', 'multiselect', 'date', 'datetime',\n 'time', 'toggle', 'range', 'radio', 'checkbox',\n] satisfies FieldType[]);\n\n/** Maximum recursion depth for compose children. */\nconst MAX_COMPOSE_DEPTH = 10;\n\n/** Widgets that expect an array for `data`. */\nconst ARRAY_DATA = new Set([\n 'stat-group', 'table', 'list', 'steps', 'gallery',\n 'chart.bar', 'chart.line', 'chart.area', 'chart.pie',\n 'chart.scatter', 'chart.radar', 'chart.heatmap', 'chart.box',\n 'chart.funnel', 'chart.waterfall', 'chart.treemap',\n]);\n\n/** Widgets that expect an object for `data`. */\nconst OBJECT_DATA = new Set(['metric', 'gauge', 'progress', 'header', 'code', 'rating', 'video']);\n\n/**\n * Validate a u-widget spec.\n *\n * Checks structural correctness: required fields, data type expectations,\n * compose children, field/action definitions. Also validates that mapping\n * fields exist in the data (produces warnings, not errors).\n *\n * @param spec - The spec object to validate (any type accepted for safety).\n * @returns Validation result with `valid`, `errors`, and `warnings`.\n *\n * @example\n * ```ts\n * const result = validate({ widget: 'metric', data: { value: 42 } });\n * console.log(result.valid); // true\n * ```\n */\nexport function validate(spec: unknown, _depth = 0): ValidationResult {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n if (_depth > MAX_COMPOSE_DEPTH) {\n return { valid: false, errors: ['compose children exceed maximum nesting depth (' + MAX_COMPOSE_DEPTH + ')'], warnings };\n }\n\n if (spec == null || typeof spec !== 'object') {\n return { valid: false, errors: ['Spec must be a non-null object'], warnings };\n }\n\n const obj = spec as Record<string, unknown>;\n\n if (typeof obj.widget !== 'string' || obj.widget.length === 0) {\n errors.push('Required field \"widget\" must be a non-empty string');\n return { valid: false, errors, warnings };\n }\n\n const widget = obj.widget as string;\n\n if (obj.type !== undefined && obj.type !== 'u-widget') {\n errors.push('\"type\" must be \"u-widget\" if specified');\n }\n\n if (obj.fields !== undefined && obj.formdown !== undefined) {\n errors.push('\"fields\" and \"formdown\" are mutually exclusive');\n }\n\n // Data type validation\n if (obj.data !== undefined) {\n if (ARRAY_DATA.has(widget) && !Array.isArray(obj.data)) {\n errors.push(`\"${widget}\" expects \"data\" to be an array, got ${typeof obj.data}`);\n }\n if (OBJECT_DATA.has(widget) && (Array.isArray(obj.data) || typeof obj.data !== 'object')) {\n errors.push(`\"${widget}\" expects \"data\" to be an object, got ${Array.isArray(obj.data) ? 'array' : typeof obj.data}`);\n }\n }\n\n if (widget === 'compose') {\n if (!Array.isArray(obj.children)) {\n errors.push('\"compose\" widget requires a \"children\" array');\n } else {\n for (let i = 0; i < obj.children.length; i++) {\n const child = obj.children[i];\n if (child == null || typeof child !== 'object' || typeof (child as Record<string, unknown>).widget !== 'string') {\n errors.push(`children[${i}] must be an object with a \"widget\" field`);\n } else {\n // Recursively validate children with depth tracking\n const childResult = validate(child, _depth + 1);\n if (!childResult.valid) {\n errors.push(...childResult.errors.map(e => `children[${i}]: ${e}`));\n }\n warnings.push(...childResult.warnings.map(w => `children[${i}]: ${w}`));\n }\n }\n }\n\n if (obj.layout !== undefined) {\n const validLayouts = ['stack', 'row', 'grid'];\n if (!validLayouts.includes(obj.layout as string)) {\n errors.push(`\"layout\" must be one of: ${validLayouts.join(', ')}`);\n }\n }\n }\n\n // Validate fields array items\n if (Array.isArray(obj.fields)) {\n for (let i = 0; i < (obj.fields as unknown[]).length; i++) {\n const f = (obj.fields as unknown[])[i] as Record<string, unknown> | null;\n if (f == null || typeof f !== 'object' || typeof f.field !== 'string') {\n errors.push(`fields[${i}] must have a \"field\" string property`);\n } else if (f.type != null && !VALID_FIELD_TYPES.has(f.type as string)) {\n warnings.push(`fields[${i}].type \"${f.type}\" is not a recognized field type`);\n }\n }\n }\n\n // Validate formdown string is parseable\n if (typeof obj.formdown === 'string' && obj.formdown.length > 0 && !obj.fields) {\n try {\n getFormdownParser()(obj.formdown);\n } catch {\n warnings.push('formdown string could not be parsed — check syntax');\n }\n }\n\n // Validate actions array items\n if (Array.isArray(obj.actions)) {\n for (let i = 0; i < (obj.actions as unknown[]).length; i++) {\n const a = (obj.actions as unknown[])[i] as Record<string, unknown> | null;\n if (a == null || typeof a !== 'object' || typeof a.label !== 'string' || typeof a.action !== 'string') {\n errors.push(`actions[${i}] must have \"label\" and \"action\" string properties`);\n }\n }\n }\n\n // Validate mapping fields against data\n if (obj.mapping && typeof obj.mapping === 'object' && obj.data) {\n const mapping = obj.mapping as Record<string, unknown>;\n const dataKeys = getDataKeys(obj.data);\n\n if (dataKeys) {\n // Check scalar mapping fields\n for (const key of ['x', 'y', 'label', 'value', 'color', 'size', 'axis', 'primary', 'secondary', 'icon', 'avatar', 'trailing'] as const) {\n const val = mapping[key];\n if (typeof val === 'string' && !dataKeys.has(val)) {\n warnings.push(`mapping.${key} references \"${val}\" which is not found in data keys [${[...dataKeys].join(', ')}]`);\n }\n if (Array.isArray(val)) {\n for (const item of val) {\n if (typeof item === 'string' && !dataKeys.has(item)) {\n warnings.push(`mapping.${key} references \"${item}\" which is not found in data keys [${[...dataKeys].join(', ')}]`);\n }\n }\n }\n }\n }\n }\n\n return { valid: errors.length === 0, errors, warnings };\n}\n\n/** Extract the set of data field keys from a spec's data. */\nfunction getDataKeys(data: unknown): Set<string> | undefined {\n if (Array.isArray(data) && data.length > 0 && data[0] && typeof data[0] === 'object') {\n return new Set(Object.keys(data[0] as Record<string, unknown>));\n }\n if (data && typeof data === 'object' && !Array.isArray(data)) {\n return new Set(Object.keys(data as Record<string, unknown>));\n }\n return undefined;\n}\n\n/**\n * Type guard that checks if a value is a valid {@link UWidgetSpec}.\n *\n * Equivalent to `validate(value).valid`, but narrows the TypeScript type.\n *\n * @param value - The value to check.\n * @returns `true` if the value passes validation.\n */\nexport function isWidgetSpec(value: unknown): value is UWidgetSpec {\n return validate(value).valid;\n}\n","type FormatType = 'number' | 'currency' | 'percent' | 'date' | 'datetime' | 'bytes';\n\nconst BYTE_UNITS = ['B', 'KB', 'MB', 'GB', 'TB'];\n\n/**\n * Format a value according to a format hint string.\n *\n * Supported formats: `\"number\"`, `\"currency\"`, `\"currency:EUR\"`, `\"percent\"`,\n * `\"date\"`, `\"datetime\"`, `\"bytes\"`. Returns `String(value)` for unknown formats.\n *\n * @param value - The value to format (coerced to number where needed).\n * @param format - Format hint, optionally with a parameter after `:` (e.g., `\"currency:USD\"`).\n * @param locale - BCP 47 locale tag for number/currency formatting. Falls back to browser default.\n * @returns Formatted string, or empty string if value is null/undefined.\n *\n * @example\n * ```ts\n * formatValue(1234.5, 'number') // \"1,234.5\"\n * formatValue(1234.5, 'currency:EUR') // \"€1,234.50\"\n * formatValue(73, 'percent') // \"73%\"\n * formatValue(1536000, 'bytes') // \"1.5 MB\"\n * ```\n */\nexport function formatValue(value: unknown, format?: string, locale?: string): string {\n if (value == null) return '';\n\n // Parse format string: 'currency:USD' → type='currency', param='USD'\n const [type, param] = format?.split(':') ?? [];\n\n switch (type as FormatType) {\n case 'number':\n return formatNumber(value, locale);\n case 'currency':\n return formatCurrency(value, param, locale);\n case 'percent':\n return formatPercent(value, locale);\n case 'date':\n return formatDate(value, locale);\n case 'datetime':\n return formatDatetime(value, locale);\n case 'bytes':\n return formatBytes(value);\n default:\n return String(value);\n }\n}\n\nfunction formatNumber(value: unknown, locale?: string): string {\n const num = Number(value);\n if (isNaN(num)) return String(value);\n return new Intl.NumberFormat(locale).format(num);\n}\n\nfunction formatCurrency(value: unknown, currencyCode?: string, locale?: string): string {\n const num = Number(value);\n if (isNaN(num)) return String(value);\n try {\n return new Intl.NumberFormat(locale, {\n style: 'currency',\n currency: currencyCode || 'USD',\n }).format(num);\n } catch {\n // Invalid currency code fallback\n return new Intl.NumberFormat(locale, {\n style: 'currency',\n currency: 'USD',\n }).format(num);\n }\n}\n\nfunction formatPercent(value: unknown, locale?: string): string {\n const num = Number(value);\n if (isNaN(num)) return String(value);\n if (locale) {\n try {\n return new Intl.NumberFormat(locale, {\n style: 'percent',\n maximumFractionDigits: 2,\n }).format(num / 100);\n } catch {\n // Invalid locale fallback\n }\n }\n return num + '%';\n}\n\nfunction formatDate(value: unknown, locale?: string): string {\n if (typeof value === 'string' && /^\\d{4}-\\d{2}-\\d{2}/.test(value)) {\n if (locale) {\n try {\n const d = new Date(value);\n if (!isNaN(d.getTime())) {\n return new Intl.DateTimeFormat(locale, {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n }).format(d);\n }\n } catch {\n // Invalid locale fallback\n }\n }\n return value.slice(0, 10);\n }\n return String(value);\n}\n\nfunction formatDatetime(value: unknown, locale?: string): string {\n if (typeof value === 'string' && /^\\d{4}-\\d{2}-\\d{2}/.test(value)) {\n if (locale) {\n try {\n const d = new Date(value);\n if (!isNaN(d.getTime())) {\n return new Intl.DateTimeFormat(locale, {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n }).format(d);\n }\n } catch {\n // Invalid locale fallback\n }\n }\n return value.slice(0, 16).replace('T', ' ');\n }\n return String(value);\n}\n\nfunction formatBytes(value: unknown): string {\n const raw = Number(value);\n if (isNaN(raw)) return String(value);\n\n const sign = raw < 0 ? '-' : '';\n let num = Math.abs(raw);\n\n let i = 0;\n while (num >= 1024 && i < BYTE_UNITS.length - 1) {\n num /= 1024;\n i++;\n }\n return sign + (i === 0 ? num : num.toFixed(1)) + ' ' + BYTE_UNITS[i];\n}\n","/**\n * Widget name suggestion for typo detection.\n *\n * Compares an unrecognized widget name against all known types\n * using Levenshtein distance and returns the closest match.\n */\n\n/** All known widget type identifiers. */\nconst KNOWN_WIDGETS: readonly string[] = [\n 'chart.bar', 'chart.line', 'chart.area', 'chart.pie',\n 'chart.scatter', 'chart.radar', 'chart.heatmap', 'chart.box',\n 'chart.funnel', 'chart.waterfall', 'chart.treemap',\n 'metric', 'stat-group', 'gauge', 'progress',\n 'table', 'list', 'form', 'confirm', 'compose',\n 'markdown', 'image', 'callout',\n 'kv', 'code', 'citation', 'status', 'steps', 'rating',\n 'video', 'gallery', 'actions', 'divider', 'header',\n];\n\n/**\n * Suggest a known widget name for a potentially mistyped input.\n *\n * Returns the closest match if the Levenshtein distance is within\n * a reasonable threshold (max 3, and less than half the input length).\n * Returns `undefined` if no good match is found.\n *\n * @param input - The unrecognized widget name.\n * @returns The suggested widget name, or `undefined`.\n *\n * @example\n * ```ts\n * suggestWidget('chart.barr') // → 'chart.bar'\n * suggestWidget('metrc') // → 'metric'\n * suggestWidget('xyzabc') // → undefined\n * ```\n */\nexport function suggestWidget(input: string): string | undefined {\n if (!input) return undefined;\n\n const lower = input.toLowerCase();\n let bestMatch: string | undefined;\n let bestDist = Infinity;\n\n for (const known of KNOWN_WIDGETS) {\n const dist = levenshtein(lower, known);\n if (dist < bestDist) {\n bestDist = dist;\n bestMatch = known;\n }\n }\n\n // Threshold: max distance 3, and less than half the input length\n const maxDist = Math.min(3, Math.floor(lower.length / 2));\n if (bestDist <= maxDist && bestDist > 0) {\n return bestMatch;\n }\n\n return undefined;\n}\n\n/**\n * Compute the Levenshtein distance between two strings.\n * Uses the Wagner–Fischer dynamic programming algorithm.\n */\nfunction levenshtein(a: string, b: string): number {\n const m = a.length;\n const n = b.length;\n\n // Optimize for empty strings\n if (m === 0) return n;\n if (n === 0) return m;\n\n // Single-row DP to save memory\n const row = new Array<number>(n + 1);\n for (let j = 0; j <= n; j++) row[j] = j;\n\n for (let i = 1; i <= m; i++) {\n let prev = i - 1;\n row[0] = i;\n\n for (let j = 1; j <= n; j++) {\n const cost = a[i - 1] === b[j - 1] ? 0 : 1;\n const val = Math.min(\n row[j] + 1, // deletion\n row[j - 1] + 1, // insertion\n prev + cost, // substitution\n );\n prev = row[j];\n row[j] = val;\n }\n }\n\n return row[n];\n}\n","/**\n * Lightweight locale registry for u-widgets.\n *\n * Scope: library-internal chrome strings only (validation messages,\n * pagination labels, ARIA labels). NOT a general i18n framework.\n *\n * English is the built-in default. Consumers register other locales:\n * registerLocale('ko', { prev: '이전', next: '다음', ... });\n */\n\nexport interface UWidgetLocaleStrings {\n // UI chrome — table pagination\n prev: string;\n next: string;\n searchPlaceholder: string;\n\n // ARIA labels — table\n searchTable: string;\n previousPage: string;\n nextPage: string;\n tablePagination: string;\n dataTable: string;\n\n // Validation messages — form (templates with {label}, {min}, {max})\n required: string;\n minLength: string;\n maxLength: string;\n minValue: string;\n maxValue: string;\n invalidEmail: string;\n invalidUrl: string;\n invalidPattern: string;\n}\n\nconst EN: UWidgetLocaleStrings = {\n // UI chrome\n prev: 'Prev',\n next: 'Next',\n searchPlaceholder: 'Search...',\n\n // ARIA\n searchTable: 'Search table',\n previousPage: 'Previous page',\n nextPage: 'Next page',\n tablePagination: 'Table pagination',\n dataTable: 'Data table',\n\n // Validation\n required: '{label} is required',\n minLength: '{label} must be at least {min} characters',\n maxLength: '{label} must be at most {max} characters',\n minValue: '{label} must be at least {min}',\n maxValue: '{label} must be at most {max}',\n invalidEmail: '{label} must be a valid email address',\n invalidUrl: '{label} must be a valid URL',\n invalidPattern: '{label} format is invalid',\n};\n\nconst registry = new Map<string, UWidgetLocaleStrings>();\n\n/**\n * Register a locale for u-widgets chrome strings.\n * Partial overrides are merged with English defaults.\n */\nexport function registerLocale(\n lang: string,\n strings: Partial<UWidgetLocaleStrings>,\n): void {\n registry.set(lang.toLowerCase(), { ...EN, ...strings });\n}\n\n/**\n * Resolve locale strings for the given language tag.\n *\n * Resolution order:\n * 1. Exact match (e.g. 'ko-KR')\n * 2. Base language (e.g. 'ko')\n * 3. English fallback\n */\nexport function getLocaleStrings(lang?: string): UWidgetLocaleStrings {\n if (!lang) return EN;\n\n const key = lang.toLowerCase();\n if (registry.has(key)) return registry.get(key)!;\n\n // Try base language: 'ko-KR' → 'ko'\n const base = key.split('-')[0];\n if (base !== key && registry.has(base)) return registry.get(base)!;\n\n return EN;\n}\n\n/**\n * Format a template string by replacing {key} placeholders.\n */\nexport function formatTemplate(\n template: string,\n params: Record<string, string | number>,\n): string {\n return template.replace(/\\{(\\w+)\\}/g, (_, key) =>\n params[key] != null ? String(params[key]) : `{${key}}`,\n );\n}\n\n/**\n * Get the English defaults (for testing / reference).\n */\nexport function getDefaultLocale(): UWidgetLocaleStrings {\n return { ...EN };\n}\n","import { LitElement, html, css, nothing } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport type { UWidgetSpec } from '../core/types.js';\nimport { themeStyles } from '../styles/tokens.js';\n\ninterface MetricData {\n value: number | string;\n label?: string;\n unit?: string;\n prefix?: string;\n suffix?: string;\n change?: number;\n trend?: 'up' | 'down' | 'flat';\n icon?: string;\n description?: string;\n}\n\nfunction toMetricData(data: Record<string, unknown>): MetricData {\n return {\n value: (data.value as number | string) ?? 0,\n label: data.label as string | undefined,\n unit: data.unit as string | undefined,\n prefix: data.prefix as string | undefined,\n suffix: data.suffix as string | undefined,\n change: data.change as number | undefined,\n trend: data.trend as MetricData['trend'],\n icon: data.icon as string | undefined,\n description: data.description as string | undefined,\n };\n}\n\n@customElement('u-metric')\nexport class UMetric extends LitElement {\n static styles = [themeStyles, css`\n :host {\n display: block;\n font-family: system-ui, -apple-system, sans-serif;\n container: u-metric / inline-size;\n }\n\n /* ── metric (single) ── */\n .metric {\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n\n .metric-value {\n font-size: 2rem;\n font-weight: 700;\n line-height: 1.1;\n color: var(--u-widget-text, #1a1a2e);\n }\n\n @container u-metric (max-width: 30rem) {\n .metric-value {\n font-size: 1.5rem;\n }\n }\n\n .metric-unit {\n font-size: 0.875rem;\n font-weight: 400;\n color: var(--u-widget-text-secondary, #64748b);\n margin-left: 4px;\n }\n\n .metric-change {\n font-size: 0.8125rem;\n font-weight: 500;\n display: inline-flex;\n align-items: center;\n gap: 2px;\n }\n\n .metric-change[data-trend='up'] {\n color: var(--u-widget-positive, #16a34a);\n }\n\n .metric-change[data-trend='down'] {\n color: var(--u-widget-negative, #dc2626);\n }\n\n .metric-change[data-trend='flat'] {\n color: var(--u-widget-text-secondary, #64748b);\n }\n\n .metric-label {\n font-size: 0.8125rem;\n color: var(--u-widget-text-secondary, #64748b);\n font-weight: 500;\n }\n\n .metric-icon { font-size: 1.25rem; line-height: 1; margin-bottom: 2px; }\n .metric-description { font-size: 0.75rem; color: var(--u-widget-text-secondary, #64748b); margin-top: 2px; line-height: 1.3; }\n\n /* ── stat-group ── */\n .stat-group {\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n gap: 1.5rem;\n }\n\n .stat-group .metric {\n flex: 1;\n min-width: 100px;\n }\n\n .stat-group .metric + .metric {\n border-left: 1px solid var(--u-widget-border, #e2e8f0);\n padding-left: 1.5rem;\n }\n\n @container u-metric (max-width: 30rem) {\n .stat-group {\n flex-direction: column;\n gap: 1rem;\n }\n\n .stat-group .metric {\n flex: none;\n min-width: 0;\n }\n\n .stat-group .metric + .metric {\n border-left: none;\n padding-left: 0;\n border-top: 1px solid var(--u-widget-border, #e2e8f0);\n padding-top: 1rem;\n }\n }\n `];\n\n @property({ type: Object })\n spec: UWidgetSpec | null = null;\n\n render() {\n if (!this.spec?.data) return nothing;\n\n if (this.spec.widget === 'stat-group') {\n return this.renderStatGroup();\n }\n\n return this.renderMetric(toMetricData(this.spec.data as Record<string, unknown>));\n }\n\n private renderStatGroup() {\n const items = this.spec!.data as Record<string, unknown>[];\n if (!Array.isArray(items)) return nothing;\n\n return html`\n <div class=\"stat-group\" part=\"stat-group\">\n ${items.map((item) => this.renderMetric(toMetricData(item)))}\n </div>\n `;\n }\n\n private renderMetric(m: MetricData) {\n const trendArrow =\n m.trend === 'up' ? '\\u2191' : m.trend === 'down' ? '\\u2193' : m.trend === 'flat' ? '\\u2192' : '';\n\n const ariaLabel = m.label\n ? `${m.label}: ${m.prefix ?? ''}${m.value}${m.unit ?? ''}${m.suffix ?? ''}`\n : undefined;\n\n return html`\n <div class=\"metric\" part=\"metric\" aria-label=${ariaLabel ?? nothing}>\n ${m.icon ? html`<div class=\"metric-icon\" part=\"icon\">${m.icon}</div>` : nothing}\n ${m.label ? html`<div class=\"metric-label\" part=\"label\">${m.label}</div>` : nothing}\n <div class=\"metric-value\" part=\"value\">\n ${m.prefix ?? ''}${m.value}${m.unit ? html`<span class=\"metric-unit\">${m.unit}</span>` : ''}${m.suffix ?? ''}\n </div>\n ${m.change != null\n ? html`<span class=\"metric-change\" data-trend=${m.trend ?? 'flat'} part=\"change\"\n >${trendArrow} ${m.change > 0 ? '+' : ''}${m.change}%</span\n >`\n : nothing}\n ${m.description ? html`<div class=\"metric-description\" part=\"description\">${m.description}</div>` : nothing}\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'u-metric': UMetric;\n }\n}\n","import { LitElement, html, css, nothing } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport type { UWidgetSpec } from '../core/types.js';\nimport { themeStyles } from '../styles/tokens.js';\n\ninterface GaugeOptions {\n min: number;\n max: number;\n unit: string;\n thresholds: { to: number; color: string }[];\n}\n\nconst DEFAULT_GAUGE_OPTIONS: GaugeOptions = {\n min: 0,\n max: 100,\n unit: '',\n thresholds: [],\n};\n\nconst COLOR_MAP: Record<string, string> = {\n green: '#16a34a',\n yellow: '#eab308',\n orange: '#f97316',\n red: '#dc2626',\n blue: '#2563eb',\n gray: '#6b7280',\n};\n\nfunction resolveColor(color: string): string {\n return COLOR_MAP[color] ?? color;\n}\n\n// SVG arc path helper\nfunction describeArc(cx: number, cy: number, r: number, startDeg: number, endDeg: number): string {\n const startRad = ((startDeg - 90) * Math.PI) / 180;\n const endRad = ((endDeg - 90) * Math.PI) / 180;\n const x1 = cx + r * Math.cos(startRad);\n const y1 = cy + r * Math.sin(startRad);\n const x2 = cx + r * Math.cos(endRad);\n const y2 = cy + r * Math.sin(endRad);\n const largeArc = endDeg - startDeg > 180 ? 1 : 0;\n return `M ${x1} ${y1} A ${r} ${r} 0 ${largeArc} 1 ${x2} ${y2}`;\n}\n\n@customElement('u-gauge')\nexport class UGauge extends LitElement {\n static styles = [themeStyles, css`\n :host {\n display: block;\n font-family: system-ui, -apple-system, sans-serif;\n container: u-gauge / inline-size;\n }\n\n .gauge-container {\n position: relative;\n display: flex;\n flex-direction: column;\n align-items: center;\n }\n\n .gauge-wrapper {\n position: relative;\n width: 100%;\n max-width: var(--u-widget-gauge-size, 160px);\n }\n\n .gauge-svg {\n display: block;\n width: 100%;\n }\n\n .gauge-track {\n stroke: var(--u-widget-border, #e2e8f0);\n }\n\n .gauge-center {\n position: absolute;\n /* Arc center (100,100) in viewBox 200×195 → 50% x, 51.3% y */\n top: 51.3%;\n left: 50%;\n transform: translate(-50%, -50%);\n text-align: center;\n }\n\n .gauge-value {\n font-size: 1.75rem;\n font-weight: 700;\n line-height: 1.2;\n color: var(--u-widget-text, #1a1a2e);\n }\n\n .gauge-unit {\n font-size: 0.75rem;\n color: var(--u-widget-text-secondary, #64748b);\n }\n\n /* ── progress bar ── */\n .progress-container {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n\n .progress-bar-track {\n width: 100%;\n height: 8px;\n background: var(--u-widget-border, #e2e8f0);\n border-radius: 4px;\n overflow: hidden;\n }\n\n .progress-bar-fill {\n height: 100%;\n border-radius: 4px;\n transition: width 0.3s ease;\n }\n\n .progress-info {\n display: flex;\n justify-content: space-between;\n font-size: 0.8125rem;\n color: var(--u-widget-text-secondary, #64748b);\n }\n\n @container u-gauge (max-width: 10rem) {\n .gauge-value {\n font-size: 1.25rem;\n }\n\n .gauge-unit {\n font-size: 0.625rem;\n }\n\n .progress-info {\n font-size: 0.75rem;\n }\n\n .progress-bar-track {\n height: 6px;\n }\n }\n `];\n\n @property({ type: Object })\n spec: UWidgetSpec | null = null;\n\n render() {\n if (!this.spec?.data) return nothing;\n\n if (this.spec.widget === 'progress') {\n return this.renderProgress();\n }\n\n return this.renderGauge();\n }\n\n private getOptions(): GaugeOptions {\n const opts = (this.spec!.options ?? {}) as Partial<GaugeOptions>;\n return { ...DEFAULT_GAUGE_OPTIONS, ...opts };\n }\n\n private getValue(): number {\n const data = this.spec!.data as Record<string, unknown>;\n return Number(data.value ?? 0);\n }\n\n private renderGauge() {\n const opts = this.getOptions();\n const value = this.getValue();\n const range = opts.max - opts.min;\n const pct = range > 0 ? Math.max(0, Math.min(1, (value - opts.min) / range)) : 0;\n const color = this.getThresholdColor(value, opts);\n\n const cx = 100, cy = 100, r = 80;\n const startAngle = 150;\n const totalAngle = 240;\n const endAngle = startAngle + totalAngle * pct;\n\n const trackPath = describeArc(cx, cy, r, startAngle, startAngle + totalAngle);\n const fillPath = pct > 0 ? describeArc(cx, cy, r, startAngle, endAngle) : null;\n\n const label = typeof this.spec!.title === 'string' ? this.spec!.title : 'Gauge';\n const valueText = `${value}${opts.unit}`;\n\n return html`\n <div class=\"gauge-container\" part=\"gauge\"\n role=\"meter\"\n aria-valuenow=${value}\n aria-valuemin=${opts.min}\n aria-valuemax=${opts.max}\n aria-label=${label}\n aria-valuetext=${valueText}\n >\n <div class=\"gauge-wrapper\">\n <div class=\"gauge-center\">\n <div class=\"gauge-value\" part=\"value\">${value}</div>\n ${opts.unit ? html`<div class=\"gauge-unit\" part=\"unit\">${opts.unit}</div>` : nothing}\n </div>\n <svg class=\"gauge-svg\" viewBox=\"0 0 200 195\" role=\"presentation\" aria-hidden=\"true\">\n <path class=\"gauge-track\" d=\"${trackPath}\" fill=\"none\" stroke-width=\"12\" stroke-linecap=\"round\"></path>\n <path class=\"gauge-fill\" d=\"${fillPath ?? 'M0 0'}\" fill=\"none\" stroke=\"${fillPath ? color : 'none'}\" stroke-width=\"12\" stroke-linecap=\"round\"></path>\n </svg>\n </div>\n </div>\n `;\n }\n\n private renderProgress() {\n const data = this.spec!.data as Record<string, unknown>;\n const value = Number(data.value ?? 0);\n const max = Number(data.max ?? (this.spec!.options as Record<string, unknown>)?.max ?? 100);\n const pct = max > 0 ? Math.max(0, Math.min(100, (value / max) * 100)) : 0;\n const opts = this.getOptions();\n const color = this.getThresholdColor(value, opts);\n const label = this.formatLabel(value, pct);\n\n const ariaLabel = typeof this.spec!.title === 'string' ? this.spec!.title : 'Progress';\n\n return html`\n <div class=\"progress-container\" part=\"progress\"\n role=\"progressbar\"\n aria-valuenow=${value}\n aria-valuemin=${0}\n aria-valuemax=${max}\n aria-label=${ariaLabel}\n >\n <div class=\"progress-bar-track\">\n <div\n class=\"progress-bar-fill\"\n style=\"width:${pct}%; background:${color || 'var(--u-widget-primary, #4f46e5)'}\"\n part=\"progress-fill\"\n ></div>\n </div>\n <div class=\"progress-info\">\n <span>${label}</span>\n <span>${Math.round(pct)}%</span>\n </div>\n </div>\n `;\n }\n\n private formatLabel(value: number, pct: number): string {\n const opts = this.spec!.options as Record<string, unknown> | undefined;\n if (opts?.label) {\n return String(opts.label)\n .replace('{value}', String(value))\n .replace('{percent}', String(Math.round(pct)));\n }\n return String(value);\n }\n\n private getThresholdColor(value: number, opts: GaugeOptions): string {\n if (!opts.thresholds?.length) return 'var(--u-widget-primary, #4f46e5)';\n\n const sorted = [...opts.thresholds].sort((a, b) => a.to - b.to);\n for (const t of sorted) {\n if (value <= t.to) return resolveColor(t.color);\n }\n return resolveColor(sorted[sorted.length - 1].color);\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'u-gauge': UGauge;\n }\n}\n","import { LitElement, html, css, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport type { UWidgetSpec, UWidgetColumnDefinition, UWidgetEvent } from '../core/types.js';\nimport { formatValue } from '../core/format.js';\nimport { getLocaleStrings } from '../core/locale.js';\nimport { themeStyles } from '../styles/tokens.js';\n\ntype SortDir = 'asc' | 'desc' | null;\n\n@customElement('u-table')\nexport class UTable extends LitElement {\n static styles = [themeStyles, css`\n :host {\n display: block;\n font-family: system-ui, -apple-system, sans-serif;\n container: u-table / inline-size;\n }\n\n /* ── table ── */\n .table-wrapper {\n overflow-x: auto;\n scrollbar-width: thin;\n scrollbar-color: var(--u-widget-border, #e2e8f0) transparent;\n }\n .table-wrapper::-webkit-scrollbar { height: 4px; }\n .table-wrapper::-webkit-scrollbar-thumb {\n background: var(--u-widget-border, #e2e8f0);\n border-radius: 2px;\n }\n\n table {\n width: 100%;\n border-collapse: collapse;\n font-size: 0.875rem;\n }\n\n th {\n text-align: left;\n font-weight: 600;\n color: var(--u-widget-text-secondary, #64748b);\n padding: 8px 12px;\n border-bottom: 2px solid var(--u-widget-border, #e2e8f0);\n white-space: nowrap;\n font-size: 0.8125rem;\n text-transform: uppercase;\n letter-spacing: 0.025em;\n }\n\n th[data-sortable] {\n cursor: pointer;\n user-select: none;\n }\n\n th[data-sortable]:hover,\n th[data-sortable]:focus-visible {\n color: var(--u-widget-text, #1a1a2e);\n outline: 2px solid var(--u-widget-primary, #4f46e5);\n outline-offset: -2px;\n }\n\n .sort-arrow {\n margin-left: 4px;\n font-size: 0.6875rem;\n }\n\n td {\n padding: 8px 12px;\n border-bottom: 1px solid var(--u-widget-border, #e2e8f0);\n color: var(--u-widget-text, #1a1a2e);\n }\n\n tbody tr {\n cursor: pointer;\n outline: none;\n }\n\n tbody tr:hover td {\n background: var(--u-widget-surface, #f1f5f9);\n }\n\n tbody tr:focus td {\n background: var(--u-widget-surface, #f1f5f9);\n }\n\n tbody tr:focus {\n box-shadow: inset 3px 0 0 var(--u-widget-primary, #4f46e5);\n }\n\n tr:last-child td {\n border-bottom: none;\n }\n\n th[data-align='center'],\n td[data-align='center'] {\n text-align: center;\n }\n\n th[data-align='right'],\n td[data-align='right'] {\n text-align: right;\n }\n\n /* ── list ── */\n .list-container {\n display: flex;\n flex-direction: column;\n }\n\n .list-item {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 0 10px 8px;\n border-bottom: 1px solid var(--u-widget-border, #e2e8f0);\n cursor: pointer;\n outline: none;\n }\n\n .list-item:hover {\n background: var(--u-widget-surface, #f1f5f9);\n }\n\n .list-item:focus {\n background: var(--u-widget-surface, #f1f5f9);\n box-shadow: inset 3px 0 0 var(--u-widget-primary, #4f46e5);\n }\n\n .list-item:last-child {\n border-bottom: none;\n }\n\n .list-icon {\n flex-shrink: 0;\n width: 32px;\n height: 32px;\n border-radius: 50%;\n background: var(--u-widget-surface, #f1f5f9);\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 0.75rem;\n color: var(--u-widget-text-secondary, #64748b);\n }\n\n .list-avatar {\n flex-shrink: 0;\n width: 32px;\n height: 32px;\n border-radius: 50%;\n object-fit: cover;\n }\n\n .list-content {\n flex: 1;\n min-width: 0;\n }\n\n .list-primary {\n font-size: 0.875rem;\n font-weight: 500;\n color: var(--u-widget-text, #1a1a2e);\n }\n\n .list-secondary {\n font-size: 0.8125rem;\n color: var(--u-widget-text-secondary, #64748b);\n margin-top: 2px;\n }\n\n .list-trailing {\n flex-shrink: 0;\n font-size: 0.8125rem;\n font-weight: 500;\n color: var(--u-widget-text-secondary, #64748b);\n }\n\n .list-badge {\n flex-shrink: 0;\n display: inline-flex;\n align-items: center;\n padding: 2px 8px;\n border-radius: 10px;\n font-size: 0.6875rem;\n font-weight: 500;\n background: var(--u-widget-surface, #f1f5f9);\n color: var(--u-widget-text-secondary, #64748b);\n white-space: nowrap;\n }\n\n /* ── search ── */\n .search-box {\n margin-bottom: 8px;\n }\n\n .search-input {\n width: 100%;\n box-sizing: border-box;\n padding: 6px 10px;\n font-size: 0.8125rem;\n border: 1px solid var(--u-widget-border, #e2e8f0);\n border-radius: 4px;\n outline: none;\n font-family: inherit;\n color: var(--u-widget-text, #1a1a2e);\n background: var(--u-widget-bg, #fff);\n }\n\n .search-input:focus {\n border-color: var(--u-widget-primary, #4f46e5);\n }\n\n /* ── pagination ── */\n .pagination {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n margin-top: 8px;\n font-size: 0.8125rem;\n color: var(--u-widget-text-secondary, #64748b);\n }\n\n .pagination button {\n padding: 4px 10px;\n border: 1px solid var(--u-widget-border, #e2e8f0);\n border-radius: 4px;\n background: var(--u-widget-bg, #fff);\n color: var(--u-widget-text, #1a1a2e);\n cursor: pointer;\n font-size: 0.75rem;\n font-family: inherit;\n }\n\n .pagination button:hover:not(:disabled) {\n background: var(--u-widget-surface, #f1f5f9);\n }\n\n .pagination button:disabled {\n opacity: 0.4;\n cursor: default;\n }\n\n /* ── compact ── */\n .compact table {\n font-size: 0.75rem;\n }\n\n .compact th {\n padding: 4px 8px;\n font-size: 0.6875rem;\n }\n\n .compact td {\n padding: 4px 8px;\n }\n\n .compact .list-item {\n padding: 6px 0 6px 8px;\n gap: 8px;\n }\n\n .compact .list-icon {\n width: 24px;\n height: 24px;\n font-size: 0.625rem;\n }\n\n .compact .list-avatar {\n width: 24px;\n height: 24px;\n }\n\n .compact .list-primary {\n font-size: 0.75rem;\n }\n\n .compact .list-secondary {\n font-size: 0.6875rem;\n }\n\n .compact .list-trailing {\n font-size: 0.6875rem;\n }\n\n /* ── container-query responsive ── */\n @container u-table (max-width: 30rem) {\n table {\n font-size: 0.75rem;\n }\n\n th {\n padding: 4px 8px;\n font-size: 0.6875rem;\n }\n\n td {\n padding: 4px 8px;\n }\n\n .list-item {\n padding: 6px 0 6px 8px;\n gap: 8px;\n }\n\n .list-icon,\n .list-avatar {\n width: 24px;\n height: 24px;\n }\n\n .list-primary {\n font-size: 0.75rem;\n }\n\n .list-secondary,\n .list-trailing {\n font-size: 0.6875rem;\n }\n }\n `];\n\n @property({ type: Object })\n spec: UWidgetSpec | null = null;\n\n @state()\n private _sortField: string | null = null;\n\n @state()\n private _sortDir: SortDir = null;\n\n @state()\n private _page = 0;\n\n @state()\n private _searchQuery = '';\n\n @state()\n private _focusedIdx = 0;\n\n willUpdate(changed: Map<string, unknown>) {\n if (changed.has('spec')) {\n this._sortField = null;\n this._sortDir = null;\n this._page = 0;\n this._searchQuery = '';\n this._focusedIdx = 0;\n }\n }\n\n render() {\n if (!this.spec?.data || !Array.isArray(this.spec.data)) return nothing;\n\n if (this.spec.widget === 'list') {\n return this.renderList();\n }\n\n return this.renderTable();\n }\n\n private get _locale() {\n const locale = this.spec?.options?.locale;\n return getLocaleStrings(typeof locale === 'string' ? locale : undefined);\n }\n\n private renderTable() {\n const data = this.spec!.data as Record<string, unknown>[];\n const columns = this.getColumns(data);\n const locale = this._locale;\n const sortable = this.spec!.options?.sortable !== false;\n const searchable = !!this.spec!.options?.searchable;\n const compact = !!this.spec!.options?.compact;\n const pageSize = Number(this.spec!.options?.pageSize) || 0;\n\n // Pipeline: filter → sort → paginate\n const filtered = this._searchQuery ? this.filterData(data, columns) : data;\n const sorted = this._sortField && this._sortDir ? this.sortData(filtered) : filtered;\n const totalPages = pageSize > 0 ? Math.max(1, Math.ceil(sorted.length / pageSize)) : 1;\n const page = Math.min(this._page, totalPages - 1);\n const visible = pageSize > 0 ? sorted.slice(page * pageSize, (page + 1) * pageSize) : sorted;\n\n const searchBox = searchable ? html`\n <div class=\"search-box\" part=\"search\">\n <input\n class=\"search-input\"\n type=\"text\"\n placeholder=${locale.searchPlaceholder}\n aria-label=${locale.searchTable}\n .value=${this._searchQuery}\n @input=${this._onSearch}\n />\n </div>\n ` : nothing;\n\n const paginationBar = pageSize > 0 && totalPages > 1 ? html`\n <nav class=\"pagination\" part=\"pagination\" aria-label=${locale.tablePagination}>\n <button aria-label=${locale.previousPage} ?disabled=${page === 0} @click=${() => this._onPageChange(page - 1)}>${locale.prev}</button>\n <span aria-live=\"polite\">${page + 1} / ${totalPages}</span>\n <button aria-label=${locale.nextPage} ?disabled=${page >= totalPages - 1} @click=${() => this._onPageChange(page + 1)}>${locale.next}</button>\n </nav>\n ` : nothing;\n\n return html`<div class=\"table-container${compact ? ' compact' : ''}\">\n ${searchBox}\n <div class=\"table-wrapper\" part=\"table\">\n <table aria-label=${this.spec!.title ?? locale.dataTable}>\n <thead>\n <tr>\n ${columns.map(\n (col) => html`<th\n scope=\"col\"\n data-align=${col.align ?? 'left'}\n ?data-sortable=${sortable}\n tabindex=${sortable ? '0' : nothing}\n @click=${sortable ? () => this._onSort(col.field) : undefined}\n @keydown=${sortable ? (e: KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n this._onSort(col.field);\n }\n } : undefined}\n aria-sort=${this._sortField === col.field && this._sortDir\n ? this._sortDir === 'asc' ? 'ascending' : 'descending'\n : 'none'}\n part=\"th\"\n >${col.label ?? col.field}${this._sortField === col.field && this._sortDir\n ? html`<span class=\"sort-arrow\">${this._sortDir === 'asc' ? '\\u25B2' : '\\u25BC'}</span>`\n : nothing}</th>`,\n )}\n </tr>\n </thead>\n <tbody @keydown=${this._onTableKeydown}>\n ${visible.map(\n (row, idx) => html`\n <tr part=\"tr\"\n tabindex=${idx === this._focusedIdx ? '0' : '-1'}\n @click=${() => this._onRowClick(row, pageSize > 0 ? page * pageSize + idx : idx)}\n @keydown=${(e: KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n this._onRowClick(row, pageSize > 0 ? page * pageSize + idx : idx);\n }\n }}\n >\n ${columns.map(\n (col) =>\n html`<td data-align=${col.align ?? 'left'} part=\"td\"\n >${formatValue(row[col.field], col.format, typeof this.spec!.options?.locale === 'string' ? this.spec!.options.locale : undefined)}</td\n >`,\n )}\n </tr>\n `,\n )}\n </tbody>\n </table>\n </div>\n ${paginationBar}\n </div>`;\n }\n\n private _onTableKeydown = (e: KeyboardEvent) => {\n const target = e.target as HTMLElement;\n const row = target.closest('tr');\n if (!row) return;\n\n const tbody = row.parentElement;\n if (!tbody) return;\n\n const rows = Array.from(tbody.querySelectorAll('tr'));\n const idx = rows.indexOf(row);\n let nextIdx = -1;\n\n switch (e.key) {\n case 'ArrowDown':\n nextIdx = Math.min(idx + 1, rows.length - 1);\n break;\n case 'ArrowUp':\n nextIdx = Math.max(idx - 1, 0);\n break;\n case 'Home':\n nextIdx = 0;\n break;\n case 'End':\n nextIdx = rows.length - 1;\n break;\n default:\n return;\n }\n\n e.preventDefault();\n if (nextIdx !== idx && nextIdx >= 0) {\n this._focusedIdx = nextIdx;\n this.updateComplete.then(() => {\n const newRows = this.shadowRoot?.querySelectorAll('tbody tr');\n (newRows?.[nextIdx] as HTMLElement)?.focus();\n });\n }\n };\n\n private _onListKeydown = (e: KeyboardEvent) => {\n const target = e.target as HTMLElement;\n const item = target.closest('.list-item') as HTMLElement | null;\n if (!item) return;\n\n const container = item.parentElement;\n if (!container) return;\n\n const items = Array.from(container.querySelectorAll('.list-item')) as HTMLElement[];\n const idx = items.indexOf(item);\n let nextIdx = -1;\n\n switch (e.key) {\n case 'ArrowDown':\n nextIdx = Math.min(idx + 1, items.length - 1);\n break;\n case 'ArrowUp':\n nextIdx = Math.max(idx - 1, 0);\n break;\n case 'Home':\n nextIdx = 0;\n break;\n case 'End':\n nextIdx = items.length - 1;\n break;\n default:\n return;\n }\n\n e.preventDefault();\n if (nextIdx !== idx && nextIdx >= 0) {\n this._focusedIdx = nextIdx;\n this.updateComplete.then(() => {\n const newItems = this.shadowRoot?.querySelectorAll('.list-item');\n (newItems?.[nextIdx] as HTMLElement)?.focus();\n });\n }\n };\n\n private _onPageChange(newPage: number) {\n this._page = newPage;\n this._focusedIdx = 0;\n this.updateComplete.then(() => {\n const firstRow = this.shadowRoot?.querySelector('tbody tr[tabindex=\"0\"]') as HTMLElement | null;\n firstRow?.focus();\n });\n }\n\n private _onSearch = (e: Event) => {\n this._searchQuery = (e.target as HTMLInputElement).value;\n this._page = 0;\n };\n\n private filterData(data: Record<string, unknown>[], columns: UWidgetColumnDefinition[]): Record<string, unknown>[] {\n const q = this._searchQuery.toLowerCase();\n const fields = columns.map((c) => c.field);\n return data.filter((row) =>\n fields.some((f) => String(row[f] ?? '').toLowerCase().includes(q)),\n );\n }\n\n private _onSort(field: string) {\n if (this._sortField === field) {\n // cycle: asc → desc → none\n if (this._sortDir === 'asc') {\n this._sortDir = 'desc';\n } else {\n this._sortField = null;\n this._sortDir = null;\n }\n } else {\n this._sortField = field;\n this._sortDir = 'asc';\n }\n }\n\n private sortData(data: Record<string, unknown>[]): Record<string, unknown>[] {\n const field = this._sortField!;\n const dir = this._sortDir!;\n return [...data].sort((a, b) => {\n const av = a[field];\n const bv = b[field];\n if (av == null && bv == null) return 0;\n if (av == null) return 1;\n if (bv == null) return -1;\n\n let cmp: number;\n if (typeof av === 'number' && typeof bv === 'number') {\n cmp = av - bv;\n } else {\n // Try numeric comparison for string values that look like numbers\n const an = Number(av), bn = Number(bv);\n cmp = (String(av) !== '' && String(bv) !== '' && !isNaN(an) && !isNaN(bn))\n ? an - bn\n : String(av).localeCompare(String(bv));\n }\n return dir === 'asc' ? cmp : -cmp;\n });\n }\n\n private renderList() {\n const data = this.spec!.data as Record<string, unknown>[];\n const mapping = this.spec!.mapping;\n const compact = !!this.spec!.options?.compact;\n const primaryKey = mapping?.primary ?? this.inferPrimaryKey(data);\n const secondaryKey = mapping?.secondary;\n const iconKey = mapping?.icon;\n const avatarKey = mapping?.avatar;\n const trailingKey = mapping?.trailing;\n const badgeKey = mapping?.badge;\n\n return html`\n <div class=\"list-container${compact ? ' compact' : ''}\" part=\"list\" @keydown=${this._onListKeydown}>\n ${data.map(\n (item, idx) => html`\n <div class=\"list-item\" part=\"list-item\"\n tabindex=${idx === this._focusedIdx ? '0' : '-1'}\n @click=${() => this._onRowClick(item, idx)}\n @keydown=${(e: KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n this._onRowClick(item, idx);\n }\n }}\n >\n ${avatarKey && item[avatarKey]\n ? html`<img class=\"list-avatar\" src=${String(item[avatarKey])} alt=\"\" part=\"avatar\" />`\n : iconKey\n ? html`<div class=\"list-icon\" part=\"icon\">${this.getIconLetter(item[iconKey])}</div>`\n : nothing}\n <div class=\"list-content\">\n <div class=\"list-primary\" part=\"primary\">${item[primaryKey] ?? ''}</div>\n ${secondaryKey\n ? html`<div class=\"list-secondary\" part=\"secondary\">${item[secondaryKey] ?? ''}</div>`\n : nothing}\n </div>\n ${badgeKey && item[badgeKey] != null\n ? html`<span class=\"list-badge\" part=\"badge\">${item[badgeKey]}</span>`\n : nothing}\n ${trailingKey && item[trailingKey] != null\n ? html`<div class=\"list-trailing\" part=\"trailing\">${item[trailingKey]}</div>`\n : nothing}\n </div>\n `,\n )}\n </div>\n `;\n }\n\n private _onRowClick(row: Record<string, unknown>, index: number) {\n if (!this.spec) return;\n const detail: UWidgetEvent = {\n type: 'select',\n widget: this.spec.widget,\n id: this.spec.id,\n data: { ...row, _index: index },\n };\n this.dispatchEvent(\n new CustomEvent('u-widget-internal', {\n detail,\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n private getColumns(data: Record<string, unknown>[]): UWidgetColumnDefinition[] {\n if (this.spec!.mapping?.columns) return this.spec!.mapping.columns;\n\n // Auto-infer from first record\n if (data.length === 0) return [];\n return Object.keys(data[0]).map((field) => ({ field }));\n }\n\n private inferPrimaryKey(data: Record<string, unknown>[]): string {\n if (data.length === 0) return '';\n const keys = Object.keys(data[0]);\n // Prefer well-known primary key names\n const primaryCandidates = ['name', 'title', 'label', 'id', 'key'];\n for (const candidate of primaryCandidates) {\n if (keys.includes(candidate)) return candidate;\n }\n // Fallback: first string field\n const sample = data[0];\n const stringKey = keys.find((k) => typeof sample[k] === 'string');\n return stringKey ?? keys[0] ?? '';\n }\n\n private getIconLetter(value: unknown): string {\n const str = String(value ?? '');\n return str.charAt(0).toUpperCase();\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'u-table': UTable;\n }\n}\n","import { LitElement, html, css, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport type { UWidgetSpec, UWidgetFieldDefinition, UWidgetAction, UWidgetEvent } from '../core/types.js';\nimport { getLocaleStrings, formatTemplate } from '../core/locale.js';\nimport { themeStyles } from '../styles/tokens.js';\n\n@customElement('u-form')\nexport class UForm extends LitElement {\n static styles = [themeStyles, css`\n :host {\n display: block;\n font-family: system-ui, -apple-system, sans-serif;\n container: u-form / inline-size;\n }\n\n .form-container {\n display: flex;\n flex-direction: column;\n gap: 16px;\n }\n\n .field {\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n\n .field-label {\n font-size: 0.8125rem;\n font-weight: 600;\n color: var(--u-widget-text, #1a1a2e);\n }\n\n .field-label .required {\n color: var(--u-widget-negative, #dc2626);\n margin-left: 2px;\n }\n\n input,\n textarea,\n select {\n padding: 8px 12px;\n border: 1px solid var(--u-widget-border, #e2e8f0);\n border-radius: 6px;\n font-size: 0.875rem;\n font-family: inherit;\n color: var(--u-widget-text, #1a1a2e);\n background: var(--u-widget-bg, #fff);\n outline: none;\n transition: border-color 0.15s;\n }\n\n input:focus,\n textarea:focus,\n select:focus {\n border-color: var(--u-widget-primary, #4f46e5);\n box-shadow: 0 0 0 3px rgba(79, 70, 229, 0.1);\n }\n\n textarea {\n resize: vertical;\n }\n\n .toggle-wrapper {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .toggle-track {\n width: 44px;\n height: 24px;\n border-radius: 12px;\n background: var(--u-widget-border, #e2e8f0);\n cursor: pointer;\n position: relative;\n transition: background 0.2s;\n }\n\n .toggle-track[data-on='true'] {\n background: var(--u-widget-primary, #4f46e5);\n }\n\n .toggle-thumb {\n width: 20px;\n height: 20px;\n border-radius: 50%;\n background: white;\n position: absolute;\n top: 2px;\n left: 2px;\n transition: transform 0.2s;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);\n }\n\n .toggle-track[data-on='true'] .toggle-thumb {\n transform: translateX(20px);\n }\n\n .checkbox-group,\n .radio-group {\n display: flex;\n flex-direction: column;\n gap: 6px;\n }\n\n .multiselect-group {\n display: flex;\n flex-direction: column;\n gap: 4px;\n border: 1px solid var(--u-widget-border, #e2e8f0);\n border-radius: 6px;\n padding: 8px;\n max-height: 180px;\n overflow-y: auto;\n }\n\n .checkbox-group label,\n .radio-group label,\n .multiselect-group label {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 0.875rem;\n cursor: pointer;\n }\n\n .actions {\n display: flex;\n gap: 8px;\n justify-content: flex-end;\n padding-top: 8px;\n }\n\n button {\n padding: 8px 20px;\n border-radius: 6px;\n font-size: 0.875rem;\n font-weight: 500;\n cursor: pointer;\n border: 1px solid var(--u-widget-border, #e2e8f0);\n background: var(--u-widget-bg, #fff);\n color: var(--u-widget-text, #1a1a2e);\n transition: all 0.15s;\n }\n\n button:hover {\n background: var(--u-widget-surface, #f1f5f9);\n }\n\n button[data-style='primary'] {\n background: var(--u-widget-primary, #4f46e5);\n color: white;\n border-color: transparent;\n }\n\n button[data-style='primary']:hover {\n opacity: 0.9;\n }\n\n button[data-style='danger'] {\n background: var(--u-widget-negative, #dc2626);\n color: white;\n border-color: transparent;\n }\n\n .field-error {\n font-size: 0.75rem;\n color: var(--u-widget-negative, #dc2626);\n margin-top: 2px;\n }\n\n input.invalid,\n textarea.invalid,\n select.invalid {\n border-color: var(--u-widget-negative, #dc2626);\n }\n\n input.invalid:focus,\n textarea.invalid:focus,\n select.invalid:focus {\n box-shadow: 0 0 0 3px rgba(220, 38, 38, 0.1);\n }\n\n /* ── confirm ── */\n .confirm-container {\n display: flex;\n flex-direction: column;\n gap: 16px;\n }\n\n .confirm-description {\n font-size: 0.9375rem;\n color: var(--u-widget-text, #1a1a2e);\n line-height: 1.5;\n }\n\n @container u-form (max-width: 20rem) {\n .form-container {\n gap: 12px;\n }\n\n .field-label {\n font-size: 0.75rem;\n }\n\n input, textarea, select {\n font-size: 0.8125rem;\n padding: 6px 8px;\n }\n\n .actions {\n flex-direction: column;\n }\n\n .actions button {\n width: 100%;\n text-align: center;\n }\n\n button {\n padding: 8px 14px;\n font-size: 0.8125rem;\n }\n }\n `];\n\n @property({ type: Object })\n spec: UWidgetSpec | null = null;\n\n @state()\n private _formData: Record<string, unknown> = {};\n\n @state()\n private _errors: Record<string, string> = {};\n\n willUpdate(changed: Map<string, unknown>) {\n if (changed.has('spec') && this.spec) {\n this._formData = { ...(this.spec.data as Record<string, unknown> ?? {}) };\n this._errors = {};\n }\n }\n\n render() {\n if (!this.spec) return nothing;\n\n if (this.spec.widget === 'confirm') {\n return this.renderConfirm();\n }\n\n return this.renderForm();\n }\n\n private renderForm() {\n const fields = this.spec!.fields ?? [];\n const actions = this.spec!.actions ?? [];\n\n return html`\n <form class=\"form-container\" part=\"form\" @submit=${this._onFormSubmit}>\n ${fields.map((f) => this.renderField(f))}\n ${actions.length > 0 ? this.renderActions(actions) : nothing}\n </form>\n `;\n }\n\n private renderConfirm() {\n const desc = this.spec!.description;\n const actions = this.spec!.actions ?? [];\n\n return html`\n <div class=\"confirm-container\" part=\"confirm\" @keydown=${this._onConfirmKeydown}>\n ${desc ? html`<div class=\"confirm-description\" part=\"description\">${desc}</div>` : nothing}\n ${actions.length > 0 ? this.renderActions(actions) : nothing}\n </div>\n `;\n }\n\n private renderField(field: UWidgetFieldDefinition) {\n const value = this._formData[field.field];\n const type = field.type ?? 'text';\n const error = this._errors[field.field];\n const errorId = `err-${field.field}`;\n\n return html`\n <div class=\"field\" part=\"field\">\n ${field.label\n ? html`<label class=\"field-label\" for=${`input-${field.field}`} part=\"label\"\n >${field.label}${field.required ? html`<span class=\"required\">*</span>` : nothing}</label\n >`\n : nothing}\n ${this.renderInput(field, type, value, error ? errorId : undefined)}\n ${error ? html`<div class=\"field-error\" id=${errorId} role=\"alert\" part=\"field-error\">${error}</div>` : nothing}\n </div>\n `;\n }\n\n private renderInput(\n field: UWidgetFieldDefinition,\n type: string,\n value: unknown,\n errorId?: string,\n ) {\n const hasError = !!this._errors[field.field];\n\n switch (type) {\n case 'textarea':\n return html`<textarea\n id=${`input-${field.field}`}\n class=${hasError ? 'invalid' : ''}\n .value=${String(value ?? '')}\n placeholder=${field.placeholder ?? ''}\n rows=${field.rows ?? 3}\n ?required=${field.required}\n minlength=${field.minLength ?? ''}\n maxlength=${field.maxLength ?? ''}\n aria-invalid=${hasError ? 'true' : 'false'}\n aria-describedby=${errorId ?? nothing}\n ?aria-required=${field.required}\n @input=${(e: Event) => this._onChange(field.field, (e.target as HTMLTextAreaElement).value)}\n part=\"input\"\n ></textarea>`;\n\n case 'select':\n return html`<select\n id=${`input-${field.field}`}\n class=${hasError ? 'invalid' : ''}\n .value=${String(value ?? '')}\n ?required=${field.required}\n aria-invalid=${hasError ? 'true' : 'false'}\n aria-describedby=${errorId ?? nothing}\n @change=${(e: Event) => this._onChange(field.field, (e.target as HTMLSelectElement).value)}\n part=\"input\"\n >\n <option value=\"\">--</option>\n ${(field.options ?? []).map(\n (opt) => html`<option value=${opt}>${opt}</option>`,\n )}\n </select>`;\n\n case 'multiselect':\n return html`<div class=\"multiselect-group\" part=\"multiselect-group\" role=\"group\" aria-label=${field.label ?? field.field} aria-invalid=${hasError ? 'true' : 'false'} aria-describedby=${errorId ?? nothing}>\n ${(field.options ?? []).map(\n (opt) => html`\n <label>\n <input\n type=\"checkbox\"\n value=${opt}\n ?checked=${Array.isArray(value) && value.includes(opt)}\n @change=${(e: Event) => {\n const checked = (e.target as HTMLInputElement).checked;\n const current = Array.isArray(value) ? [...value] : [];\n this._onChange(\n field.field,\n checked ? [...current, opt] : current.filter((v) => v !== opt),\n );\n }}\n />\n ${opt}\n </label>\n `,\n )}\n </div>`;\n\n case 'toggle':\n return html`<div class=\"toggle-wrapper\">\n <div\n class=\"toggle-track\"\n data-on=${!!value}\n role=\"switch\"\n aria-checked=${!!value}\n aria-label=${field.label ?? field.field}\n tabindex=\"0\"\n @click=${() => this._onChange(field.field, !value)}\n @keydown=${(e: KeyboardEvent) => {\n if (e.key === ' ' || e.key === 'Enter') {\n e.preventDefault();\n this._onChange(field.field, !value);\n }\n }}\n part=\"toggle\"\n >\n <div class=\"toggle-thumb\"></div>\n </div>\n </div>`;\n\n case 'radio':\n return html`<div class=\"radio-group\" part=\"radio-group\" role=\"radiogroup\" aria-label=${field.label ?? field.field} aria-invalid=${hasError ? 'true' : 'false'} aria-describedby=${errorId ?? nothing}>\n ${(field.options ?? []).map(\n (opt) => html`\n <label>\n <input\n type=\"radio\"\n name=${field.field}\n value=${opt}\n ?checked=${value === opt}\n @change=${() => this._onChange(field.field, opt)}\n />\n ${opt}\n </label>\n `,\n )}\n </div>`;\n\n case 'checkbox':\n return html`<div class=\"checkbox-group\" part=\"checkbox-group\" role=\"group\" aria-label=${field.label ?? field.field} aria-invalid=${hasError ? 'true' : 'false'} aria-describedby=${errorId ?? nothing}>\n ${(field.options ?? []).map(\n (opt) => html`\n <label>\n <input\n type=\"checkbox\"\n value=${opt}\n ?checked=${Array.isArray(value) && value.includes(opt)}\n @change=${(e: Event) => {\n const checked = (e.target as HTMLInputElement).checked;\n const current = Array.isArray(value) ? [...value] : [];\n this._onChange(\n field.field,\n checked ? [...current, opt] : current.filter((v) => v !== opt),\n );\n }}\n />\n ${opt}\n </label>\n `,\n )}\n </div>`;\n\n default: {\n // Map deprecated 'datetime' to the valid HTML input type\n const htmlType = type === 'datetime' ? 'datetime-local' : type;\n return html`<input\n type=${htmlType}\n id=${`input-${field.field}`}\n class=${hasError ? 'invalid' : ''}\n .value=${String(value ?? '')}\n placeholder=${field.placeholder ?? ''}\n ?required=${field.required}\n aria-invalid=${hasError ? 'true' : 'false'}\n aria-describedby=${errorId ?? nothing}\n ?aria-required=${field.required}\n min=${field.min ?? ''}\n max=${field.max ?? ''}\n step=${field.step ?? ''}\n minlength=${field.minLength ?? ''}\n maxlength=${field.maxLength ?? ''}\n pattern=${field.pattern ?? ''}\n @input=${(e: Event) => {\n const raw = (e.target as HTMLInputElement).value;\n const coerced = (type === 'number' || type === 'range') && raw !== ''\n ? Number(raw) : raw;\n this._onChange(field.field, coerced);\n }}\n part=\"input\"\n />`;}\n }\n }\n\n private renderActions(actions: UWidgetAction[]) {\n return html`\n <div class=\"actions\" part=\"actions\">\n ${actions.map(\n (a) => html`\n <button\n type=${a.action === 'submit' ? 'submit' : 'button'}\n data-style=${a.style ?? 'default'}\n ?disabled=${a.disabled}\n @click=${(e: Event) => {\n if (a.action === 'submit') e.preventDefault();\n this._onAction(a);\n }}\n part=\"action-btn\"\n >\n ${a.label}\n </button>\n `,\n )}\n </div>\n `;\n }\n\n private _onFormSubmit = (e: Event) => {\n e.preventDefault();\n const submitAction = (this.spec?.actions ?? []).find((a) => a.action === 'submit');\n if (submitAction) {\n this._onAction(submitAction);\n } else if (this._validate()) {\n this._emitEvent({\n type: 'submit',\n widget: this.spec!.widget,\n id: this.spec!.id,\n data: { ...this._formData },\n });\n }\n };\n\n private _onConfirmKeydown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n const cancelAction = (this.spec?.actions ?? []).find((a) => a.action === 'cancel');\n if (cancelAction) {\n this._onAction(cancelAction);\n }\n }\n };\n\n private _onChange(field: string, value: unknown) {\n this._formData = { ...this._formData, [field]: value };\n // Clear error for this field on change\n if (this._errors[field]) {\n const updated = { ...this._errors };\n delete updated[field];\n this._errors = updated;\n }\n this._emitEvent({\n type: 'change',\n widget: this.spec!.widget,\n id: this.spec!.id,\n data: { field, value },\n });\n }\n\n private get _locale() {\n const locale = this.spec?.options?.locale;\n return getLocaleStrings(typeof locale === 'string' ? locale : undefined);\n }\n\n private _validate(): boolean {\n const fields = this.spec?.fields ?? [];\n const errors: Record<string, string> = {};\n const locale = this._locale;\n\n for (const field of fields) {\n const value = this._formData[field.field];\n const label = field.label ?? field.field;\n\n // Required check\n if (field.required) {\n if (value == null || value === '' || (Array.isArray(value) && value.length === 0)) {\n errors[field.field] = field.message ?? formatTemplate(locale.required, { label });\n continue; // Skip further checks if empty\n }\n }\n\n // Skip further checks if value is empty and not required\n if (value == null || value === '') continue;\n\n // maxLength check (text, textarea)\n if (field.maxLength != null && typeof value === 'string' && value.length > field.maxLength) {\n errors[field.field] = field.message ?? formatTemplate(locale.maxLength, { label, max: field.maxLength });\n }\n\n // min/max check (number, range)\n if (field.min != null && typeof value === 'number' && value < Number(field.min)) {\n errors[field.field] = field.message ?? formatTemplate(locale.minValue, { label, min: field.min });\n }\n if (field.max != null && typeof value === 'number' && value > Number(field.max)) {\n errors[field.field] = field.message ?? formatTemplate(locale.maxValue, { label, max: field.max });\n }\n\n // minLength check (text, textarea)\n if (field.minLength != null && typeof value === 'string' && value.length < field.minLength) {\n errors[field.field] = field.message ?? formatTemplate(locale.minLength, { label, min: field.minLength });\n continue;\n }\n\n // Email pattern check\n if (field.type === 'email' && typeof value === 'string') {\n if (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(value)) {\n errors[field.field] = field.message ?? formatTemplate(locale.invalidEmail, { label });\n continue;\n }\n }\n\n // URL pattern check\n if (field.type === 'url' && typeof value === 'string') {\n if (!/^https?:\\/\\/.+/.test(value)) {\n errors[field.field] = field.message ?? formatTemplate(locale.invalidUrl, { label });\n continue;\n }\n }\n\n // Custom pattern check\n if (field.pattern && typeof value === 'string') {\n try {\n if (!new RegExp(field.pattern).test(value)) {\n errors[field.field] = field.message ?? formatTemplate(locale.invalidPattern, { label });\n }\n } catch {\n // Invalid regex pattern — skip validation\n }\n }\n }\n\n this._errors = errors;\n return Object.keys(errors).length === 0;\n }\n\n private _onAction(action: UWidgetAction) {\n if (action.action === 'submit') {\n if (!this._validate()) return;\n this._emitEvent({\n type: 'submit',\n widget: this.spec!.widget,\n id: this.spec!.id,\n data: { ...this._formData },\n });\n } else if (action.action === 'cancel') {\n this._emitEvent({\n type: 'action',\n widget: this.spec!.widget,\n id: this.spec!.id,\n action: 'cancel',\n });\n } else {\n this._emitEvent({\n type: 'action',\n widget: this.spec!.widget,\n id: this.spec!.id,\n action: action.action,\n data: { ...this._formData },\n });\n }\n }\n\n private _emitEvent(detail: UWidgetEvent) {\n this.dispatchEvent(\n new CustomEvent('u-widget-internal', {\n detail,\n bubbles: true,\n composed: true,\n }),\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'u-form': UForm;\n }\n}\n","import { LitElement, html, css, nothing } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport type { UWidgetSpec, UWidgetChildSpec } from '../core/types.js';\nimport { themeStyles } from '../styles/tokens.js';\n\n@customElement('u-compose')\nexport class UCompose extends LitElement {\n static styles = [themeStyles, css`\n :host {\n display: block;\n container: u-compose / inline-size;\n }\n\n .compose-container {\n display: flex;\n flex-direction: column;\n }\n\n .compose-title {\n font-size: 1.125rem;\n font-weight: 600;\n color: var(--u-widget-text, #1a1a2e);\n margin-bottom: 12px;\n }\n\n .layout-stack {\n display: flex;\n flex-direction: column;\n gap: var(--u-widget-gap, 16px);\n }\n\n .layout-row {\n display: flex;\n flex-direction: row;\n gap: var(--u-widget-gap, 16px);\n }\n\n .layout-row > * {\n flex: 1;\n min-width: 0;\n }\n\n .layout-grid {\n display: grid;\n gap: var(--u-widget-gap, 16px);\n }\n\n .child-card {\n padding: 16px 20px;\n border-radius: var(--u-widget-radius, 6px);\n border: 1px solid var(--u-widget-border, #e2e8f0);\n background: var(--u-widget-bg, #fff);\n box-shadow: var(--u-widget-shadow);\n transition: box-shadow 0.2s;\n }\n\n /* ── collapsed child (details/summary) ── */\n details.child-collapsed {\n border: 1px solid var(--u-widget-border, #e2e8f0);\n border-radius: 6px;\n overflow: hidden;\n }\n\n details.child-collapsed > summary {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 12px;\n font-size: 0.875rem;\n font-weight: 500;\n color: var(--u-widget-text, #1a1a2e);\n cursor: pointer;\n user-select: none;\n list-style: none;\n background: var(--u-widget-surface, #f1f5f9);\n }\n\n details.child-collapsed > summary::-webkit-details-marker { display: none; }\n\n details.child-collapsed > summary::before {\n content: '\\\\25B6';\n font-size: 0.625rem;\n transition: transform 0.15s;\n }\n\n details.child-collapsed[open] > summary::before {\n transform: rotate(90deg);\n }\n\n details.child-collapsed > .collapsed-content {\n padding: 12px;\n }\n\n /* ── container-query responsive ── */\n @container u-compose (max-width: 30rem) {\n .layout-row {\n flex-direction: column;\n }\n\n .layout-grid {\n grid-template-columns: 1fr !important;\n }\n }\n `];\n\n @property({ type: Object })\n spec: UWidgetSpec | null = null;\n\n @property({ type: String, reflect: true })\n theme: string | null = null;\n\n render() {\n if (!this.spec) return nothing;\n\n const layout = this.spec.layout ?? 'stack';\n const columns = this.spec.columns ?? 2;\n const children = this.spec.children ?? [];\n const title = this.spec.title;\n const items = children.map((c: UWidgetChildSpec) => this._child(c));\n\n const roleAttr = title ? 'region' : undefined;\n\n if (layout === 'row') {\n return html`<div class=\"compose-container\" part=\"compose\" role=${roleAttr ?? nothing} aria-label=${title ?? nothing}>${title ? html`<div class=\"compose-title\" part=\"title\">${title}</div>` : nothing}<div class=\"layout-row\" part=\"layout\">${items}</div></div>`;\n }\n\n if (layout === 'grid') {\n const gridCols = this._gridColumns(columns);\n return html`<div class=\"compose-container\" part=\"compose\" role=${roleAttr ?? nothing} aria-label=${title ?? nothing}>${title ? html`<div class=\"compose-title\" part=\"title\">${title}</div>` : nothing}<div class=\"layout-grid\" part=\"layout\" style=\"grid-template-columns: ${gridCols}\">${items}</div></div>`;\n }\n\n return html`<div class=\"compose-container\" part=\"compose\" role=${roleAttr ?? nothing} aria-label=${title ?? nothing}>${title ? html`<div class=\"compose-title\" part=\"title\">${title}</div>` : nothing}<div class=\"layout-stack\" part=\"layout\">${items}</div></div>`;\n }\n\n /** Compute grid-template-columns from options.widths or fallback to equal columns. */\n private _gridColumns(columns: number): string {\n const options = (this.spec?.options ?? {}) as Record<string, unknown>;\n const widths = options.widths;\n\n if (!Array.isArray(widths) || widths.length === 0) {\n return `repeat(${columns}, 1fr)`;\n }\n\n return widths.map((w: unknown) => {\n if (w === 'auto') return 'auto';\n if (w === 'stretch') return '1fr';\n const n = Number(w);\n if (Number.isFinite(n) && n > 0) return `${n}fr`;\n return '1fr'; // fallback\n }).join(' ');\n }\n\n private _child(child: UWidgetChildSpec) {\n const t = this.theme;\n const span = child.span ? Math.max(1, Math.floor(Number(child.span) || 1)) : 0;\n const spanStyle = span > 1 ? `grid-column: span ${span}` : '';\n const options = (this.spec?.options ?? {}) as Record<string, unknown>;\n const isCard = Boolean(options.card);\n\n const widgetHtml = html`<u-widget .spec=${child as UWidgetSpec} theme=${t ?? nothing}></u-widget>`;\n\n // Collapsed child: wrap in <details>/<summary>\n if (child.collapsed) {\n const summary = child.title || 'Details';\n return html`\n <details class=\"child-collapsed\" part=\"child\" style=${spanStyle || nothing}>\n <summary part=\"collapsed-summary\">${summary}</summary>\n <div class=\"collapsed-content\">${widgetHtml}</div>\n </details>\n `;\n }\n\n const cls = isCard ? 'child child-card' : 'child';\n if (spanStyle) {\n return html`<div class=${cls} style=${spanStyle} part=\"child\">${widgetHtml}</div>`;\n }\n return html`<div class=${cls} part=\"child\">${widgetHtml}</div>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'u-compose': UCompose;\n }\n}\n","import { LitElement, html, css, nothing } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport type { UWidgetSpec } from '../core/types.js';\nimport { themeStyles } from '../styles/tokens.js';\n\n@customElement('u-content')\nexport class UContent extends LitElement {\n static styles = [themeStyles, css`\n :host {\n display: block;\n font-family: system-ui, -apple-system, sans-serif;\n container: u-content / inline-size;\n }\n\n /* ── markdown ── */\n .markdown {\n font-size: 0.875rem;\n line-height: 1.6;\n color: var(--u-widget-text, #1a1a2e);\n }\n\n .markdown p {\n margin: 0.5em 0;\n }\n\n .markdown h1,\n .markdown h2,\n .markdown h3,\n .markdown h4 {\n margin: 0.75em 0 0.25em;\n font-weight: 600;\n color: var(--u-widget-text, #1a1a2e);\n }\n\n .markdown h1 { font-size: 1.5rem; }\n .markdown h2 { font-size: 1.25rem; }\n .markdown h3 { font-size: 1.1rem; }\n .markdown h4 { font-size: 1rem; }\n\n .markdown strong { font-weight: 600; }\n .markdown em { font-style: italic; }\n\n .markdown code {\n background: var(--u-widget-surface, #f1f5f9);\n padding: 0.15em 0.4em;\n border-radius: 3px;\n font-size: 0.8125rem;\n font-family: 'SF Mono', 'Fira Code', monospace;\n }\n\n .markdown pre {\n background: var(--u-widget-surface, #f1f5f9);\n padding: 12px;\n border-radius: 6px;\n overflow-x: auto;\n font-size: 0.8125rem;\n }\n\n .markdown pre code {\n background: none;\n padding: 0;\n }\n\n .markdown ul,\n .markdown ol {\n padding-left: 1.5em;\n margin: 0.5em 0;\n }\n\n .markdown blockquote {\n border-left: 3px solid var(--u-widget-border, #e2e8f0);\n padding-left: 12px;\n margin: 0.5em 0;\n color: var(--u-widget-text-secondary, #64748b);\n }\n\n .markdown a {\n color: var(--u-widget-primary, #4f46e5);\n text-decoration: none;\n }\n\n .markdown a:hover {\n text-decoration: underline;\n }\n\n .markdown table {\n width: 100%;\n border-collapse: collapse;\n margin: 0.5em 0;\n font-size: 0.8125rem;\n }\n\n .markdown th,\n .markdown td {\n border: 1px solid var(--u-widget-border, #e2e8f0);\n padding: 6px 10px;\n }\n\n .markdown th {\n background: var(--u-widget-surface, #f1f5f9);\n font-weight: 600;\n text-align: left;\n }\n\n .markdown hr {\n border: none;\n border-top: 1px solid var(--u-widget-border, #e2e8f0);\n margin: 1em 0;\n }\n\n /* ── image ── */\n .image-container {\n text-align: center;\n }\n\n .image-container img {\n max-width: 100%;\n height: auto;\n border-radius: 6px;\n }\n\n .image-caption {\n margin-top: 6px;\n font-size: 0.8125rem;\n color: var(--u-widget-text-secondary, #64748b);\n }\n\n /* ── callout ── */\n .callout {\n padding: 12px 16px;\n border-radius: 6px;\n border-left: 4px solid;\n font-size: 0.875rem;\n line-height: 1.5;\n }\n\n .callout-info {\n background: color-mix(in srgb, var(--u-widget-primary, #3b82f6) 12%, var(--u-widget-bg, #fff));\n border-left-color: var(--u-widget-primary, #3b82f6);\n color: var(--u-widget-text, #1a1a2e);\n }\n\n .callout-warning {\n background: color-mix(in srgb, var(--u-widget-warning, #f59e0b) 12%, var(--u-widget-bg, #fff));\n border-left-color: var(--u-widget-warning, #f59e0b);\n color: var(--u-widget-text, #1a1a2e);\n }\n\n .callout-error {\n background: color-mix(in srgb, var(--u-widget-negative, #ef4444) 12%, var(--u-widget-bg, #fff));\n border-left-color: var(--u-widget-negative, #ef4444);\n color: var(--u-widget-text, #1a1a2e);\n }\n\n .callout-success {\n background: color-mix(in srgb, var(--u-widget-positive, #22c55e) 12%, var(--u-widget-bg, #fff));\n border-left-color: var(--u-widget-positive, #22c55e);\n color: var(--u-widget-text, #1a1a2e);\n }\n\n .callout-title {\n font-weight: 600;\n margin-bottom: 4px;\n }\n\n @container u-content (max-width: 20rem) {\n .markdown {\n font-size: 0.8125rem;\n }\n\n .markdown h1 { font-size: 1.25rem; }\n .markdown h2 { font-size: 1.1rem; }\n .markdown h3 { font-size: 1rem; }\n\n .callout {\n padding: 8px 12px;\n font-size: 0.8125rem;\n }\n\n .image-caption {\n font-size: 0.75rem;\n }\n }\n `];\n\n @property({ type: Object })\n spec: UWidgetSpec | null = null;\n\n render() {\n if (!this.spec) return nothing;\n\n switch (this.spec.widget) {\n case 'markdown':\n return this.renderMarkdown();\n case 'image':\n return this.renderImage();\n case 'callout':\n return this.renderCallout();\n default:\n return nothing;\n }\n }\n\n private renderMarkdown() {\n const data = this.spec!.data;\n const content = typeof data === 'string'\n ? data\n : (data as Record<string, unknown>)?.content as string ?? '';\n\n if (!content) return nothing;\n\n return html`<div class=\"markdown\" part=\"markdown\"\n .innerHTML=${this.parseMarkdown(content)}\n ></div>`;\n }\n\n private renderImage() {\n const data = this.spec!.data as Record<string, unknown>;\n if (!data) return nothing;\n\n const rawSrc = String(data.src ?? '');\n const alt = String(data.alt ?? '');\n const caption = data.caption as string | undefined;\n const src = this.sanitizeUrl(rawSrc);\n\n if (!src) return nothing;\n\n return html`<div class=\"image-container\" part=\"image\">\n <img src=${src} alt=${alt} loading=\"lazy\" />\n ${caption ? html`<div class=\"image-caption\" part=\"caption\">${caption}</div>` : nothing}\n </div>`;\n }\n\n private renderCallout() {\n const data = this.spec!.data as Record<string, unknown>;\n if (!data) return nothing;\n\n const message = String(data.message ?? '');\n const level = String(data.level ?? 'info');\n const title = data.title as string | undefined;\n const validLevels = ['info', 'warning', 'error', 'success'];\n const cls = validLevels.includes(level) ? level : 'info';\n\n const isUrgent = cls === 'warning' || cls === 'error';\n return html`<div class=\"callout callout-${cls}\" part=\"callout\" role=${isUrgent ? 'alert' : 'note'} aria-live=${isUrgent ? 'assertive' : 'polite'}>\n ${title ? html`<div class=\"callout-title\" part=\"callout-title\">${title}</div>` : nothing}\n <div part=\"callout-message\">${message}</div>\n </div>`;\n }\n\n /**\n * Minimal markdown parser — handles the most common patterns.\n * Intentionally lightweight; does NOT pull in a full markdown library.\n */\n private parseMarkdown(text: string): string {\n let result = this.escapeHtml(text);\n\n // Headers (must be at start of line)\n result = result.replace(/^#### (.+)$/gm, '<h4>$1</h4>');\n result = result.replace(/^### (.+)$/gm, '<h3>$1</h3>');\n result = result.replace(/^## (.+)$/gm, '<h2>$1</h2>');\n result = result.replace(/^# (.+)$/gm, '<h1>$1</h1>');\n\n // Horizontal rule\n result = result.replace(/^---$/gm, '<hr>');\n\n // Code blocks (``` ... ```)\n result = result.replace(/```[\\s\\S]*?```/g, (match) => {\n const inner = match.slice(3, -3).replace(/^\\w*\\n/, ''); // Remove language hint\n return `<pre><code>${inner}</code></pre>`;\n });\n\n // Tables (must be before inline formatting)\n result = result.replace(\n /^(\\|.+\\|)\\n(\\|[\\s:|-]+\\|)\\n((?:\\|.+\\|\\n?)+)/gm,\n (_match, headerLine: string, sepLine: string, bodyBlock: string) => {\n const parseCells = (line: string) =>\n line.split('|').slice(1, -1).map(c => c.trim());\n const headers = parseCells(headerLine);\n const aligns = parseCells(sepLine).map(s => {\n if (s.startsWith(':') && s.endsWith(':')) return 'center';\n if (s.endsWith(':')) return 'right';\n return 'left';\n });\n const rows = bodyBlock.trim().split('\\n').map(parseCells);\n\n const ths = headers.map((h, i) =>\n `<th scope=\"col\" style=\"text-align:${aligns[i] ?? 'left'}\">${h}</th>`).join('');\n const trs = rows.map(row =>\n '<tr>' + row.map((c, i) =>\n `<td style=\"text-align:${aligns[i] ?? 'left'}\">${c}</td>`).join('') + '</tr>').join('');\n\n return `<table><thead><tr>${ths}</tr></thead><tbody>${trs}</tbody></table>`;\n },\n );\n\n // Inline code\n result = result.replace(/`([^`]+)`/g, '<code>$1</code>');\n\n // Bold and italic\n result = result.replace(/\\*\\*\\*(.+?)\\*\\*\\*/g, '<strong><em>$1</em></strong>');\n result = result.replace(/\\*\\*(.+?)\\*\\*/g, '<strong>$1</strong>');\n result = result.replace(/\\*(.+?)\\*/g, '<em>$1</em>');\n\n // Links (sanitize href to block javascript:/data:/vbscript: XSS)\n result = result.replace(\n /\\[([^\\]]+)\\]\\(([^)]+)\\)/g,\n (_match, text: string, href: string) => {\n const safe = this.sanitizeUrl(href);\n return `<a href=\"${safe}\" target=\"_blank\" rel=\"noopener\">${text}</a>`;\n },\n );\n\n // Blockquotes\n result = result.replace(/^&gt; (.+)$/gm, '<blockquote>$1</blockquote>');\n\n // Ordered lists\n result = result.replace(/^\\d+\\. (.+)$/gm, '<li data-ol>$1</li>');\n result = result.replace(/(<li data-ol>.*<\\/li>\\n?)+/g, (m) =>\n `<ol>${m.replace(/ data-ol/g, '')}</ol>`);\n\n // Unordered lists\n result = result.replace(/^- (.+)$/gm, '<li>$1</li>');\n result = result.replace(/(<li>.*<\\/li>\\n?)+/g, '<ul>$&</ul>');\n\n // Paragraphs (double newlines)\n result = result.replace(/\\n\\n+/g, '</p><p>');\n if (!result.startsWith('<h') && !result.startsWith('<ul') && !result.startsWith('<ol') && !result.startsWith('<pre') && !result.startsWith('<blockquote') && !result.startsWith('<hr')) {\n result = `<p>${result}</p>`;\n }\n\n // Single newlines → <br> (protect content inside <pre> blocks)\n result = result.replace(/<pre>[\\s\\S]*?<\\/pre>/g, (m) =>\n m.replace(/\\n/g, '\\x00NL\\x00'));\n result = result.replace(/\\n/g, '<br>');\n result = result.replace(/\\x00NL\\x00/g, '\\n');\n\n return result;\n }\n\n private sanitizeUrl(url: string): string {\n // Strip all whitespace + zero-width/invisible Unicode characters\n const stripped = url.replace(/[\\s\\u200B\\u200C\\u200D\\uFEFF\\u00AD\\u200E\\u200F]/g, '');\n if (/^(javascript|data|vbscript):/i.test(stripped)) return '';\n return url;\n }\n\n private escapeHtml(text: string): string {\n return text\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;');\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'u-content': UContent;\n }\n}\n","import { LitElement, html, css, nothing } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport type { UWidgetSpec } from '../core/types.js';\nimport { themeStyles } from '../styles/tokens.js';\n\n/**\n * <u-kv> — Key-value pair display widget.\n *\n * Renders structured key-value data in vertical, horizontal, or grid layout.\n * Data can be a flat object or an array of { key, value } pairs.\n */\n@customElement('u-kv')\nexport class UKv extends LitElement {\n static styles = [themeStyles, css`\n :host {\n display: block;\n font-family: system-ui, -apple-system, sans-serif;\n container: u-kv / inline-size;\n }\n\n .kv-vertical {\n display: grid;\n grid-template-columns: auto auto;\n gap: 8px 12px;\n justify-content: center;\n }\n\n .kv-horizontal {\n display: flex;\n flex-wrap: wrap;\n gap: 8px 24px;\n }\n\n .kv-grid {\n display: grid;\n gap: 8px 24px;\n }\n\n .kv-pair {\n display: flex;\n gap: 8px;\n align-items: baseline;\n min-width: 0;\n }\n\n .kv-vertical .kv-pair {\n display: contents;\n }\n\n .kv-vertical .kv-key {\n text-align: right;\n }\n\n .kv-vertical .kv-value {\n text-align: left;\n }\n\n .kv-key {\n font-size: 0.8125rem;\n font-weight: 500;\n color: var(--u-widget-text-secondary, #64748b);\n flex-shrink: 0;\n }\n\n .kv-value {\n font-size: 0.875rem;\n font-weight: 600;\n color: var(--u-widget-text, #1a1a2e);\n text-align: right;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .kv-horizontal .kv-pair {\n flex-direction: column;\n gap: 2px;\n }\n\n .kv-horizontal .kv-value {\n text-align: left;\n }\n\n .kv-grid .kv-pair {\n flex-direction: column;\n gap: 2px;\n }\n\n .kv-grid .kv-value {\n text-align: left;\n }\n\n @container u-kv (max-width: 20rem) {\n .kv-horizontal {\n flex-direction: column;\n gap: 8px;\n }\n\n .kv-key {\n font-size: 0.75rem;\n }\n\n .kv-value {\n font-size: 0.8125rem;\n }\n }\n `];\n\n @property({ type: Object })\n spec: UWidgetSpec | null = null;\n\n render() {\n if (!this.spec) return nothing;\n\n const pairs = this._extractPairs();\n if (pairs.length === 0) return nothing;\n\n const options = (this.spec.options ?? {}) as Record<string, unknown>;\n const layout = String(options.layout ?? 'vertical');\n const columns = Number(options.columns ?? 2);\n\n const gridStyle = layout === 'grid'\n ? `grid-template-columns: repeat(${columns}, 1fr)`\n : '';\n\n return html`\n <div\n class=${`kv-${layout === 'grid' ? 'grid' : layout === 'horizontal' ? 'horizontal' : 'vertical'}`}\n style=${gridStyle}\n part=\"kv\"\n role=\"list\"\n aria-label=${this.spec.title ?? 'Key-value pairs'}\n >\n ${pairs.map(([key, value]) => html`\n <div class=\"kv-pair\" part=\"kv-pair\" role=\"listitem\">\n <span class=\"kv-key\" part=\"kv-key\">${key}</span>\n <span class=\"kv-value\" part=\"kv-value\">${String(value)}</span>\n </div>\n `)}\n </div>\n `;\n }\n\n private _extractPairs(): [string, unknown][] {\n const data = this.spec?.data;\n if (!data) return [];\n\n // Array of { key, value } objects\n if (Array.isArray(data)) {\n return data\n .filter((item): item is Record<string, unknown> =>\n item != null && typeof item === 'object' && 'key' in item && 'value' in item)\n .map((item) => [String(item.key), item.value]);\n }\n\n // Flat object — all keys become pairs\n if (typeof data === 'object') {\n return Object.entries(data as Record<string, unknown>);\n }\n\n return [];\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'u-kv': UKv;\n }\n}\n","import { LitElement, html, css, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport type { UWidgetSpec } from '../core/types.js';\nimport { themeStyles } from '../styles/tokens.js';\n\n// ── Mini Syntax Highlighter ──\n// Lightweight, CSS-class-based token highlighting for 12 languages.\n// No external dependencies. Targets ~2KB gzip.\n\n/** Comment style: [lineComment, [blockOpen, blockClose]] */\nconst CM: Record<string, (string | [string, string] | undefined)[]> = {\n javascript: ['//', ['/*', '*/']],\n typescript: ['//', ['/*', '*/']],\n python: ['#'],\n java: ['//', ['/*', '*/']],\n csharp: ['//', ['/*', '*/']],\n go: ['//', ['/*', '*/']],\n rust: ['//', ['/*', '*/']],\n sql: ['--', ['/*', '*/']],\n bash: ['#'],\n css: [undefined, ['/*', '*/']],\n html: [undefined, ['<!--', '-->']],\n};\n\n/** Keyword sets per language. Space-separated, lazily parsed into Sets. */\nconst KW: Record<string, string> = {\n javascript: 'async await break case catch class const continue default delete do else export extends false finally for from function if import in instanceof let new null of return static super switch this throw true try typeof undefined var void while with yield',\n typescript: 'abstract any as async await boolean break case catch class const continue declare default delete do else enum export extends false finally for from function if implements import in instanceof interface is keyof let namespace never new null number of override private protected public readonly return static string super switch this throw true try type typeof undefined var void while with yield',\n python: 'False None True and as assert async await break class continue def del elif else except finally for from global if import in is lambda nonlocal not or pass raise return try while with yield',\n java: 'abstract boolean break byte case catch char class continue default do double else enum extends false final finally float for if implements import instanceof int interface long new null package private protected public return short static super switch this throw throws true try void volatile while',\n csharp: 'abstract as async await base bool break byte case catch char class const continue decimal default do double else enum false finally float for foreach if in int interface internal is lock long namespace new null object out override params private protected public readonly ref return sealed short static string struct switch this throw true try typeof var virtual void while yield',\n go: 'break case chan const continue default defer else fallthrough false for func go goto if import interface map nil package range return select struct switch true type var',\n rust: 'as async await break const continue crate dyn else enum extern false fn for if impl in let loop match mod move mut pub ref return self static struct super trait true type unsafe use where while',\n sql: 'ALL ALTER AND AS ASC BETWEEN BY CASE CREATE DELETE DESC DISTINCT DROP ELSE END EXISTS FALSE FROM GROUP HAVING IF IN INDEX INSERT INTO IS JOIN LEFT LIKE LIMIT NOT NULL ON OR ORDER PRIMARY SELECT SET TABLE THEN TRUE UNION UPDATE VALUES WHERE',\n bash: 'break case do done elif else esac fi for function if in local read return select then until while',\n};\n\n/** Language aliases. */\nconst AL: Record<string, string> = {\n js: 'javascript', ts: 'typescript', py: 'python', cs: 'csharp',\n sh: 'bash', shell: 'bash', zsh: 'bash', jsx: 'javascript', tsx: 'typescript',\n cpp: 'java', c: 'java', xml: 'html', svg: 'html',\n scss: 'css', less: 'css', jsonc: 'json', psql: 'sql', mysql: 'sql',\n};\n\n/** Lazily-built keyword Sets. */\nconst _kwCache = new Map<string, Set<string>>();\nfunction kwSet(lang: string): Set<string> {\n let s = _kwCache.get(lang);\n if (!s) {\n const str = KW[lang] || '';\n s = str ? new Set(str.split(' ')) : new Set();\n _kwCache.set(lang, s);\n }\n return s;\n}\n\n/** Escape HTML special characters. */\nfunction esc(s: string): string {\n return s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n}\n\n/** Wrap token text in a span, handling newlines by closing/reopening the span. */\nfunction wrap(text: string, cls: string): string {\n const escaped = esc(text);\n if (!escaped.includes('\\n')) return `<span class=\"hl-${cls}\">${escaped}</span>`;\n return escaped.split('\\n').map(line => `<span class=\"hl-${cls}\">${line}</span>`).join('\\n');\n}\n\n/** Find the end index of a string literal starting at `start`. */\nfunction strEnd(code: string, start: number, quote: string): number {\n let i = start + 1;\n while (i < code.length) {\n if (code[i] === '\\\\') { i += 2; continue; }\n if (code[i] === quote) return i + 1;\n if (quote !== '`' && code[i] === '\\n') return i;\n i++;\n }\n return code.length;\n}\n\n/**\n * Highlight code and return an HTML string with syntax-colored spans.\n * Token classes: hl-k (keyword), hl-s (string), hl-c (comment), hl-n (number).\n */\nfunction highlight(code: string, lang: string): string {\n if (!lang) return esc(code);\n const resolved = AL[lang] || lang;\n\n // JSON has special handling\n if (resolved === 'json') return highlightJSON(code);\n\n const kw = kwSet(resolved);\n const cmRules = CM[resolved];\n const lineComment = cmRules?.[0] as string | undefined;\n const blockComment = cmRules?.[1] as [string, string] | undefined;\n const hasTemplateStrings = resolved === 'javascript' || resolved === 'typescript';\n\n let result = '';\n let i = 0;\n const len = code.length;\n\n while (i < len) {\n // Block comment\n if (blockComment && code.startsWith(blockComment[0], i)) {\n const end = code.indexOf(blockComment[1], i + blockComment[0].length);\n const slice = end === -1 ? code.slice(i) : code.slice(i, end + blockComment[1].length);\n result += wrap(slice, 'c');\n i += slice.length;\n continue;\n }\n\n // Line comment\n if (lineComment && code.startsWith(lineComment, i)) {\n const end = code.indexOf('\\n', i);\n const slice = end === -1 ? code.slice(i) : code.slice(i, end);\n result += wrap(slice, 'c');\n i += slice.length;\n continue;\n }\n\n // Strings\n const ch = code[i];\n if (ch === '\"' || ch === \"'\" || (ch === '`' && hasTemplateStrings)) {\n const end = strEnd(code, i, ch);\n result += wrap(code.slice(i, end), 's');\n i = end;\n continue;\n }\n\n // Numbers (not preceded by letter/underscore)\n if (/\\d/.test(ch) && (i === 0 || !/[a-zA-Z_$]/.test(code[i - 1]))) {\n let j = i + 1;\n while (j < len && /[0-9a-fA-FxXoObBeE._]/.test(code[j])) j++;\n result += wrap(code.slice(i, j), 'n');\n i = j;\n continue;\n }\n\n // Identifiers / keywords\n if (/[a-zA-Z_$]/.test(ch)) {\n let j = i + 1;\n while (j < len && /[a-zA-Z0-9_$]/.test(code[j])) j++;\n const word = code.slice(i, j);\n result += kw.has(word) ? `<span class=\"hl-k\">${esc(word)}</span>` : esc(word);\n i = j;\n continue;\n }\n\n // HTML tags (for html/xml/svg languages)\n if (resolved === 'html' && ch === '<' && i + 1 < len && /[a-zA-Z/!]/.test(code[i + 1])) {\n const end = code.indexOf('>', i);\n if (end !== -1) {\n result += `<span class=\"hl-k\">${esc(code.slice(i, end + 1))}</span>`;\n i = end + 1;\n continue;\n }\n }\n\n // CSS property names\n if (resolved === 'css' && /[a-z-]/.test(ch)) {\n let j = i + 1;\n while (j < len && /[a-z-]/.test(code[j])) j++;\n const word = code.slice(i, j);\n // If followed by ':', it's a property name\n const afterWord = code.slice(j).trimStart();\n if (afterWord[0] === ':') {\n result += `<span class=\"hl-k\">${esc(word)}</span>`;\n } else {\n result += esc(word);\n }\n i = j;\n continue;\n }\n\n // Default: output character\n result += esc(ch);\n i++;\n }\n\n return result;\n}\n\n/** Highlight JSON: keys (hl-k), string values (hl-s), numbers (hl-n), booleans/null (hl-k). */\nfunction highlightJSON(code: string): string {\n let result = '';\n let i = 0;\n const len = code.length;\n\n while (i < len) {\n const ch = code[i];\n\n if (ch === '\"') {\n const end = strEnd(code, i, '\"');\n const slice = code.slice(i, end);\n // Key if followed by ':'\n const after = code.slice(end).trimStart();\n result += wrap(slice, after[0] === ':' ? 'k' : 's');\n i = end;\n continue;\n }\n\n if (/[\\d-]/.test(ch) && (i === 0 || /[\\s,:\\[{]/.test(code[i - 1]))) {\n let j = i + 1;\n while (j < len && /[0-9.eE+\\-]/.test(code[j])) j++;\n result += wrap(code.slice(i, j), 'n');\n i = j;\n continue;\n }\n\n let matched = false;\n for (const kw of ['true', 'false', 'null']) {\n if (code.startsWith(kw, i)) {\n result += `<span class=\"hl-k\">${kw}</span>`;\n i += kw.length;\n matched = true;\n break;\n }\n }\n if (matched) continue;\n\n result += esc(ch);\n i++;\n }\n\n return result;\n}\n\n// ── Component ──\n\n/**\n * <u-code> — Syntax-highlighted code display widget.\n *\n * Supports 12 languages with a lightweight built-in highlighter.\n * Features: line numbers, highlighted lines, copy button, scroll containment.\n */\n@customElement('u-code')\nexport class UCode extends LitElement {\n static styles = [themeStyles, css`\n :host {\n display: block;\n font-family: system-ui, -apple-system, sans-serif;\n container: u-code / inline-size;\n }\n\n .code-block {\n border: 1px solid var(--u-widget-border, #e2e8f0);\n border-radius: 6px;\n overflow: hidden;\n }\n\n .code-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 6px 12px;\n background: var(--u-widget-surface, #f1f5f9);\n border-bottom: 1px solid var(--u-widget-border, #e2e8f0);\n }\n\n .code-lang {\n font-size: 0.6875rem;\n font-weight: 600;\n color: var(--u-widget-text-secondary, #64748b);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n }\n\n .code-copy {\n padding: 2px 10px;\n border-radius: 4px;\n border: 1px solid var(--u-widget-border, #e2e8f0);\n background: var(--u-widget-bg, #fff);\n color: var(--u-widget-text-secondary, #64748b);\n cursor: pointer;\n font-size: 0.6875rem;\n font-family: inherit;\n transition: all 0.15s;\n }\n .code-copy:hover {\n background: var(--u-widget-bg, #fff);\n color: var(--u-widget-text, #1a1a2e);\n }\n .code-copy[data-copied] {\n color: var(--u-widget-positive, #16a34a);\n border-color: var(--u-widget-positive, #16a34a);\n }\n\n .code-body {\n overflow: auto;\n background: var(--u-widget-bg, #fff);\n }\n :host([theme=\"dark\"]) .code-body { background: #1e1e2e; }\n\n pre {\n margin: 0;\n padding: 12px;\n font-family: 'Cascadia Code', 'Fira Code', 'JetBrains Mono', 'Source Code Pro', Consolas, Monaco, monospace;\n font-size: 0.8125rem;\n line-height: 1.5;\n tab-size: 2;\n white-space: pre;\n }\n pre[data-wrap=\"true\"] { white-space: pre-wrap; word-break: break-all; }\n\n .line { display: block; }\n\n .line-no {\n display: inline-block;\n width: 3ch;\n text-align: right;\n margin-right: 1.5ch;\n color: var(--u-widget-text-secondary, #94a3b8);\n user-select: none;\n opacity: 0.5;\n }\n\n .line-hl {\n background: rgba(79, 70, 229, 0.08);\n margin: 0 -12px;\n padding: 0 12px;\n }\n :host([theme=\"dark\"]) .line-hl { background: rgba(79, 70, 229, 0.15); }\n\n /* Syntax token colors */\n .hl-k { color: #8b5cf6; } /* keyword — purple */\n .hl-s { color: #059669; } /* string — green */\n .hl-c { color: #94a3b8; font-style: italic; } /* comment — gray */\n .hl-n { color: #d97706; } /* number — amber */\n\n :host([theme=\"dark\"]) .hl-k { color: #a78bfa; }\n :host([theme=\"dark\"]) .hl-s { color: #34d399; }\n :host([theme=\"dark\"]) .hl-c { color: #64748b; }\n :host([theme=\"dark\"]) .hl-n { color: #fbbf24; }\n\n @container u-code (max-width: 20rem) {\n pre { font-size: 0.75rem; padding: 8px; }\n .code-header { padding: 4px 8px; }\n .line-no { width: 2.5ch; margin-right: 1ch; }\n }\n `];\n\n @property({ type: Object })\n spec: UWidgetSpec | null = null;\n\n @property({ type: String, reflect: true })\n theme: string | null = null;\n\n @state() private _copied = false;\n\n render() {\n if (!this.spec) return nothing;\n\n const data = this.spec.data as Record<string, unknown> | undefined;\n if (!data) return nothing;\n\n const content = String(data.content ?? '');\n if (!content) return nothing;\n\n const language = String(data.language ?? '').toLowerCase();\n const options = (this.spec.options ?? {}) as Record<string, unknown>;\n const lineNumbers = options.lineNumbers !== false;\n const wrapText = Boolean(options.wrap ?? false);\n const maxHeight = options.maxHeight ? String(options.maxHeight) : undefined;\n const highlightLines = new Set(\n Array.isArray(options.highlight) ? (options.highlight as number[]) : [],\n );\n\n // Highlight and split into lines\n const highlighted = highlight(content, language);\n const lines = highlighted.split('\\n');\n\n const linesHtml = lines.map((line, i) => {\n const num = i + 1;\n const hl = highlightLines.has(num) ? ' line-hl' : '';\n const numHtml = lineNumbers ? `<span class=\"line-no\">${num}</span>` : '';\n return `<span class=\"line${hl}\">${numHtml}${line || ' '}</span>`;\n }).join('');\n\n const bodyStyle = maxHeight ? `max-height: ${maxHeight}` : '';\n\n return html`\n <div class=\"code-block\" part=\"code\">\n <div class=\"code-header\" part=\"code-header\">\n <span class=\"code-lang\">${language || 'code'}</span>\n <button\n class=\"code-copy\"\n part=\"code-copy\"\n ?data-copied=${this._copied}\n @click=${this._copyCode}\n >${this._copied ? 'Copied!' : 'Copy'}</button>\n </div>\n <div class=\"code-body\" part=\"code-body\" style=${bodyStyle}>\n <pre data-wrap=${String(wrapText)}><code .innerHTML=${linesHtml}></code></pre>\n </div>\n </div>\n `;\n }\n\n private async _copyCode() {\n const data = this.spec?.data as Record<string, unknown> | undefined;\n const content = String(data?.content ?? '');\n if (!content) return;\n\n try {\n await navigator.clipboard.writeText(content);\n } catch {\n // Clipboard API may not be available (e.g., non-HTTPS or test environment)\n }\n this._copied = true;\n setTimeout(() => { this._copied = false; }, 2000);\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'u-code': UCode;\n }\n}\n","import { LitElement, html, css, nothing } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport type { UWidgetSpec, UWidgetEvent } from '../core/types.js';\nimport { themeStyles } from '../styles/tokens.js';\n\ninterface CitationItem {\n title: string;\n url?: string;\n snippet?: string;\n source?: string;\n}\n\n/**\n * <u-citation> — Source/reference card widget.\n *\n * Renders one or more citations with title, URL, snippet, and source.\n * Supports compact (single-line) and numbered display modes.\n */\n@customElement('u-citation')\nexport class UCitation extends LitElement {\n static styles = [themeStyles, css`\n :host {\n display: block;\n font-family: system-ui, -apple-system, sans-serif;\n container: u-citation / inline-size;\n }\n\n .citations {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n\n .cite-item {\n display: flex;\n gap: 10px;\n padding: 10px 14px;\n border-radius: 6px;\n border: 1px solid var(--u-widget-border, #e2e8f0);\n background: var(--u-widget-bg, #fff);\n cursor: default;\n transition: border-color 0.15s;\n }\n .cite-item[data-link] { cursor: pointer; }\n .cite-item[data-link]:hover {\n border-color: var(--u-widget-primary, #4f46e5);\n }\n\n .cite-num {\n flex-shrink: 0;\n width: 22px;\n height: 22px;\n border-radius: 4px;\n background: var(--u-widget-surface, #f1f5f9);\n font-size: 0.6875rem;\n font-weight: 700;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--u-widget-text-secondary, #64748b);\n }\n\n .cite-body {\n flex: 1;\n min-width: 0;\n }\n\n .cite-title {\n font-size: 0.875rem;\n font-weight: 600;\n color: var(--u-widget-text, #1a1a2e);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .cite-item[data-link] .cite-title {\n color: var(--u-widget-primary, #4f46e5);\n }\n\n .cite-url {\n font-size: 0.6875rem;\n color: var(--u-widget-text-secondary, #94a3b8);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n margin-top: 1px;\n }\n\n .cite-snippet {\n font-size: 0.8125rem;\n color: var(--u-widget-text-secondary, #64748b);\n margin-top: 4px;\n line-height: 1.4;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n }\n\n .cite-source {\n font-size: 0.6875rem;\n color: var(--u-widget-text-secondary, #94a3b8);\n margin-top: 4px;\n }\n\n /* Compact mode */\n .citations[data-compact] .cite-item {\n padding: 6px 10px;\n }\n .citations[data-compact] .cite-snippet,\n .citations[data-compact] .cite-source { display: none; }\n\n @container u-citation (max-width: 20rem) {\n .cite-title { font-size: 0.8125rem; }\n .cite-snippet { font-size: 0.75rem; }\n }\n `];\n\n @property({ type: Object })\n spec: UWidgetSpec | null = null;\n\n @property({ type: String, reflect: true })\n theme: string | null = null;\n\n render() {\n if (!this.spec) return nothing;\n\n const items = this._extractItems();\n if (items.length === 0) return nothing;\n\n const options = (this.spec.options ?? {}) as Record<string, unknown>;\n const compact = Boolean(options.compact ?? false);\n const numbered = options.numbered !== false;\n\n return html`\n <div class=\"citations\" part=\"citations\" ?data-compact=${compact} role=\"list\" aria-label=${this.spec.title ?? 'Citations'}>\n ${items.map((item, i) => this._renderItem(item, i, numbered))}\n </div>\n `;\n }\n\n private _renderItem(item: CitationItem, index: number, numbered: boolean) {\n const hasLink = Boolean(item.url);\n const displayUrl = item.url ? this._extractDomain(item.url) : undefined;\n\n return html`\n <div\n class=\"cite-item\"\n part=\"cite-item\"\n role=\"listitem\"\n ?data-link=${hasLink}\n @click=${hasLink ? () => this._handleClick(item) : undefined}\n >\n ${numbered ? html`<span class=\"cite-num\" part=\"cite-num\">${index + 1}</span>` : nothing}\n <div class=\"cite-body\">\n <div class=\"cite-title\" part=\"cite-title\">${item.title}</div>\n ${displayUrl ? html`<div class=\"cite-url\" part=\"cite-url\">${displayUrl}</div>` : nothing}\n ${item.snippet ? html`<div class=\"cite-snippet\" part=\"cite-snippet\">${item.snippet}</div>` : nothing}\n ${item.source ? html`<div class=\"cite-source\" part=\"cite-source\">${item.source}</div>` : nothing}\n </div>\n </div>\n `;\n }\n\n private _handleClick(item: CitationItem) {\n if (!item.url) return;\n\n // Sanitize URL — strip invisible chars and block dangerous protocols\n const safeUrl = item.url.replace(/[\\s\\u200B-\\u200F\\uFEFF\\u00AD]/g, '');\n if (/^(javascript|data|vbscript):/i.test(safeUrl)) return;\n\n this.dispatchEvent(\n new CustomEvent('u-widget-internal', {\n detail: {\n type: 'action',\n widget: 'citation',\n id: this.spec?.id,\n action: 'navigate',\n data: { url: safeUrl, title: item.title },\n } satisfies UWidgetEvent,\n bubbles: true,\n composed: true,\n }),\n );\n\n window.open(safeUrl, '_blank', 'noopener');\n }\n\n private _extractDomain(url: string): string {\n try {\n return new URL(url).hostname;\n } catch {\n return url;\n }\n }\n\n private _extractItems(): CitationItem[] {\n const data = this.spec?.data;\n if (!data) return [];\n\n // Array of citation objects\n if (Array.isArray(data)) {\n return data.filter((item): item is Record<string, unknown> =>\n item != null && typeof item === 'object' && 'title' in item,\n ).map(item => ({\n title: String(item.title ?? ''),\n url: item.url ? String(item.url) : undefined,\n snippet: item.snippet ? String(item.snippet) : undefined,\n source: item.source ? String(item.source) : undefined,\n }));\n }\n\n // Single citation object\n if (typeof data === 'object' && 'title' in data) {\n const d = data as Record<string, unknown>;\n return [{\n title: String(d.title ?? ''),\n url: d.url ? String(d.url) : undefined,\n snippet: d.snippet ? String(d.snippet) : undefined,\n source: d.source ? String(d.source) : undefined,\n }];\n }\n\n return [];\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'u-citation': UCitation;\n }\n}\n","import { LitElement, html, css, nothing } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport type { UWidgetSpec } from '../core/types.js';\nimport { themeStyles } from '../styles/tokens.js';\n\ntype StatusLevel = 'info' | 'success' | 'warning' | 'error' | 'neutral';\n\ninterface StatusItem {\n label: string;\n value: string;\n level: StatusLevel;\n}\n\nconst VALID_LEVELS = new Set(['info', 'success', 'warning', 'error', 'neutral']);\n\n/** Level → indicator symbol. */\nconst LEVEL_ICONS: Record<StatusLevel, string> = {\n info: '\\u25CF', // ●\n success: '\\u2713', // ✓\n warning: '\\u25B2', // ▲\n error: '\\u2715', // ✕\n neutral: '\\u25CB', // ○\n};\n\n/**\n * <u-status> — Status indicator widget.\n *\n * Renders one or more status items with label, value, and level-based coloring.\n * Single item or array of items.\n */\n@customElement('u-status')\nexport class UStatus extends LitElement {\n static styles = [themeStyles, css`\n :host {\n display: block;\n font-family: system-ui, -apple-system, sans-serif;\n container: u-status / inline-size;\n }\n\n .status-list {\n display: flex;\n flex-wrap: wrap;\n gap: 12px 24px;\n }\n\n .status-item {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 0.875rem;\n }\n\n .status-icon {\n font-size: 0.75rem;\n flex-shrink: 0;\n }\n\n .status-label {\n color: var(--u-widget-text-secondary, #64748b);\n font-weight: 500;\n }\n\n .status-label::after {\n content: ':';\n }\n\n .status-value {\n font-weight: 600;\n }\n\n /* Level colors */\n [data-level=\"info\"] .status-icon,\n [data-level=\"info\"] .status-value {\n color: var(--u-widget-primary, #3b82f6);\n }\n [data-level=\"success\"] .status-icon,\n [data-level=\"success\"] .status-value {\n color: var(--u-widget-positive, #16a34a);\n }\n [data-level=\"warning\"] .status-icon,\n [data-level=\"warning\"] .status-value {\n color: var(--u-widget-warning, #f59e0b);\n }\n [data-level=\"error\"] .status-icon,\n [data-level=\"error\"] .status-value {\n color: var(--u-widget-negative, #dc2626);\n }\n [data-level=\"neutral\"] .status-icon,\n [data-level=\"neutral\"] .status-value {\n color: var(--u-widget-text-secondary, #64748b);\n }\n\n @container u-status (max-width: 20rem) {\n .status-list { gap: 8px 16px; }\n .status-item { font-size: 0.8125rem; }\n }\n `];\n\n @property({ type: Object })\n spec: UWidgetSpec | null = null;\n\n @property({ type: String, reflect: true })\n theme: string | null = null;\n\n render() {\n if (!this.spec) return nothing;\n\n const items = this._extractItems();\n if (items.length === 0) return nothing;\n\n return html`\n <div class=\"status-list\" part=\"status\" role=\"list\" aria-label=${this.spec.title ?? 'Status'}>\n ${items.map(item => html`\n <div class=\"status-item\" part=\"status-item\" role=\"listitem\" data-level=${item.level}>\n <span class=\"status-icon\" part=\"status-icon\" aria-hidden=\"true\">${LEVEL_ICONS[item.level]}</span>\n <span class=\"status-label\" part=\"status-label\">${item.label}</span>\n <span class=\"status-value\" part=\"status-value\">${item.value}</span>\n </div>\n `)}\n </div>\n `;\n }\n\n private _extractItems(): StatusItem[] {\n const data = this.spec?.data;\n if (!data) return [];\n\n // Array of status items\n if (Array.isArray(data)) {\n return data.filter((item): item is Record<string, unknown> =>\n item != null && typeof item === 'object' && 'label' in item && 'value' in item,\n ).map(item => ({\n label: String(item.label),\n value: String(item.value),\n level: this._resolveLevel(item.level),\n }));\n }\n\n // Single status item\n if (typeof data === 'object' && 'label' in data && 'value' in data) {\n const d = data as Record<string, unknown>;\n return [{\n label: String(d.label),\n value: String(d.value),\n level: this._resolveLevel(d.level),\n }];\n }\n\n return [];\n }\n\n private _resolveLevel(level: unknown): StatusLevel {\n const s = String(level ?? 'info');\n return VALID_LEVELS.has(s) ? s as StatusLevel : 'info';\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'u-status': UStatus;\n }\n}\n","import { LitElement, html, css, nothing, type TemplateResult } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport type { UWidgetSpec } from '../core/types.js';\nimport { themeStyles } from '../styles/tokens.js';\n\ntype StepStatus = 'done' | 'active' | 'pending' | 'error';\n\ninterface StepItem {\n label: string;\n status: StepStatus;\n description?: string;\n icon?: string;\n}\n\nconst VALID_STATUSES = new Set(['done', 'active', 'pending', 'error']);\n\n/** Returns an SVG icon or custom text icon for a step status. */\nfunction statusIcon(status: StepStatus, iconOverride?: string): TemplateResult {\n if (iconOverride) return html`<span class=\"step-icon-text\">${iconOverride}</span>`;\n switch (status) {\n case 'done':\n return html`<svg class=\"step-svg\" viewBox=\"0 0 16 16\" fill=\"currentColor\"><path d=\"M13.78 4.22a.75.75 0 0 1 0 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L2.22 9.28a.75.75 0 1 1 1.06-1.06L6 10.94l6.72-6.72a.75.75 0 0 1 1.06 0Z\"/></svg>`;\n case 'active':\n return html`<svg class=\"step-svg\" viewBox=\"0 0 16 16\" fill=\"currentColor\"><circle cx=\"8\" cy=\"8\" r=\"5\"/></svg>`;\n case 'pending':\n return html`<svg class=\"step-svg\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"><circle cx=\"8\" cy=\"8\" r=\"5\"/></svg>`;\n case 'error':\n return html`<svg class=\"step-svg\" viewBox=\"0 0 16 16\" fill=\"currentColor\"><path d=\"M4.47 4.47a.75.75 0 0 1 1.06 0L8 6.94l2.47-2.47a.75.75 0 1 1 1.06 1.06L9.06 8l2.47 2.47a.75.75 0 1 1-1.06 1.06L8 9.06l-2.47 2.47a.75.75 0 0 1-1.06-1.06L6.94 8 4.47 5.53a.75.75 0 0 1 0-1.06Z\"/></svg>`;\n }\n}\n\n/**\n * <u-steps> — Multi-step progress indicator widget.\n *\n * Renders a sequence of steps with status indicators.\n * Supports vertical and horizontal layouts, compact mode.\n */\n@customElement('u-steps')\nexport class USteps extends LitElement {\n static styles = [themeStyles, css`\n :host {\n display: block;\n font-family: system-ui, -apple-system, sans-serif;\n container: u-steps / inline-size;\n }\n\n /* ── Vertical Layout ── */\n .steps-vertical {\n display: flex;\n flex-direction: column;\n gap: 0;\n }\n\n .step-v {\n display: flex;\n gap: 12px;\n min-height: 48px;\n }\n\n .step-v:last-child { min-height: auto; }\n\n .step-track {\n display: flex;\n flex-direction: column;\n align-items: center;\n width: 24px;\n flex-shrink: 0;\n }\n\n .step-icon {\n width: 24px;\n height: 24px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 0.75rem;\n font-weight: 700;\n flex-shrink: 0;\n }\n\n .step-svg { width: 14px; height: 14px; }\n .step-icon-text { font-size: 0.75rem; line-height: 1; }\n\n .step-line {\n width: 2px;\n flex: 1;\n min-height: 12px;\n background: var(--u-widget-border, #e2e8f0);\n }\n\n [data-status=\"pending\"] .step-line {\n background: repeating-linear-gradient(\n to bottom,\n var(--u-widget-border, #e2e8f0) 0px,\n var(--u-widget-border, #e2e8f0) 3px,\n transparent 3px,\n transparent 6px\n );\n }\n\n .step-v:last-child .step-line { display: none; }\n\n .step-body {\n padding-bottom: 12px;\n flex: 1;\n min-width: 0;\n }\n\n .step-v:last-child .step-body { padding-bottom: 0; }\n\n .step-label {\n font-size: 0.875rem;\n font-weight: 500;\n line-height: 24px;\n }\n\n .step-desc {\n font-size: 0.8125rem;\n color: var(--u-widget-text-secondary, #64748b);\n margin-top: 2px;\n line-height: 1.4;\n }\n\n /* ── Horizontal Layout ── */\n .steps-horizontal {\n display: flex;\n align-items: flex-start;\n }\n\n .step-h {\n display: flex;\n flex-direction: column;\n align-items: center;\n flex: 1;\n min-width: 0;\n position: relative;\n }\n\n .step-h-top {\n display: flex;\n align-items: center;\n width: 100%;\n }\n\n .step-h-line {\n flex: 1;\n height: 2px;\n background: var(--u-widget-border, #e2e8f0);\n }\n\n .step-h:first-child .step-h-line:first-child,\n .step-h:last-child .step-h-line:last-child {\n visibility: hidden;\n }\n\n .step-h-line[data-done] {\n background: var(--u-widget-positive, #16a34a);\n }\n\n .step-h-line:not([data-done]) {\n background: repeating-linear-gradient(\n to right,\n var(--u-widget-border, #e2e8f0) 0px,\n var(--u-widget-border, #e2e8f0) 3px,\n transparent 3px,\n transparent 6px\n );\n }\n\n .step-h .step-label {\n text-align: center;\n font-size: 0.75rem;\n line-height: 1.3;\n margin-top: 6px;\n max-width: 100%;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n /* ── Status Colors ── */\n [data-status=\"done\"] .step-icon {\n background: var(--u-widget-positive, #16a34a);\n color: white;\n }\n [data-status=\"done\"] .step-label {\n color: var(--u-widget-text, #1a1a2e);\n }\n [data-status=\"done\"] .step-line {\n background: var(--u-widget-positive, #16a34a);\n }\n\n [data-status=\"active\"] .step-icon {\n background: var(--u-widget-primary, #4f46e5);\n color: white;\n }\n [data-status=\"active\"] .step-label {\n color: var(--u-widget-primary, #4f46e5);\n font-weight: 600;\n }\n\n [data-status=\"pending\"] .step-icon {\n background: var(--u-widget-surface, #f1f5f9);\n color: var(--u-widget-text-secondary, #64748b);\n }\n [data-status=\"pending\"] .step-label {\n color: var(--u-widget-text-secondary, #64748b);\n }\n\n [data-status=\"error\"] .step-icon {\n background: var(--u-widget-negative, #dc2626);\n color: white;\n }\n [data-status=\"error\"] .step-label {\n color: var(--u-widget-negative, #dc2626);\n }\n\n /* ── Compact Mode ── */\n .steps-vertical[data-compact] .step-v { min-height: 36px; }\n .steps-vertical[data-compact] .step-desc { display: none; }\n .steps-vertical[data-compact] .step-body { padding-bottom: 6px; }\n .steps-vertical[data-compact] .step-line { min-height: 6px; }\n\n .steps-horizontal[data-compact] .step-icon { width: 20px; height: 20px; font-size: 0.625rem; }\n .steps-horizontal[data-compact] .step-label { font-size: 0.6875rem; margin-top: 4px; }\n\n @container u-steps (max-width: 20rem) {\n .step-label { font-size: 0.8125rem; }\n .step-desc { font-size: 0.75rem; }\n\n /* horizontal → vertical auto-conversion on narrow containers */\n .steps-horizontal {\n flex-direction: column;\n align-items: stretch;\n }\n\n .step-h {\n flex-direction: row;\n align-items: flex-start;\n gap: 12px;\n }\n\n .step-h-top {\n flex-direction: column;\n width: 24px;\n flex-shrink: 0;\n align-items: center;\n }\n\n .step-h-line {\n width: 2px;\n height: auto;\n flex: 1;\n min-height: 12px;\n }\n\n .step-h:first-child .step-h-line:first-child,\n .step-h:last-child .step-h-line:last-child {\n display: none;\n }\n\n .step-h .step-label {\n text-align: left;\n white-space: normal;\n margin-top: 0;\n line-height: 24px;\n font-size: 0.8125rem;\n }\n }\n `];\n\n @property({ type: Object })\n spec: UWidgetSpec | null = null;\n\n @property({ type: String, reflect: true })\n theme: string | null = null;\n\n render() {\n if (!this.spec) return nothing;\n\n const items = this._extractItems();\n if (items.length === 0) return nothing;\n\n const options = (this.spec.options ?? {}) as Record<string, unknown>;\n const layout = String(options.layout ?? 'vertical');\n const compact = Boolean(options.compact ?? false);\n\n if (layout === 'horizontal') {\n return this._renderHorizontal(items, compact);\n }\n return this._renderVertical(items, compact);\n }\n\n private _renderVertical(items: StepItem[], compact: boolean) {\n return html`\n <div class=\"steps-vertical\" part=\"steps\" ?data-compact=${compact}\n role=\"list\" aria-label=${this.spec?.title ?? 'Steps'}>\n ${items.map(item => html`\n <div class=\"step-v\" part=\"step\" role=\"listitem\" data-status=${item.status}>\n <div class=\"step-track\">\n <span class=\"step-icon\" part=\"step-icon\" aria-hidden=\"true\">${statusIcon(item.status, item.icon)}</span>\n <div class=\"step-line\"></div>\n </div>\n <div class=\"step-body\">\n <div class=\"step-label\" part=\"step-label\">${item.label}</div>\n ${item.description ? html`<div class=\"step-desc\" part=\"step-desc\">${item.description}</div>` : nothing}\n </div>\n </div>\n `)}\n </div>\n `;\n }\n\n private _renderHorizontal(items: StepItem[], compact: boolean) {\n return html`\n <div class=\"steps-horizontal\" part=\"steps\" ?data-compact=${compact}\n role=\"list\" aria-label=${this.spec?.title ?? 'Steps'}>\n ${items.map((item, i) => {\n const prevDone = i > 0 && items[i - 1].status === 'done';\n const isDone = item.status === 'done';\n return html`\n <div class=\"step-h\" part=\"step\" role=\"listitem\" data-status=${item.status}>\n <div class=\"step-h-top\">\n <div class=\"step-h-line\" ?data-done=${prevDone}></div>\n <span class=\"step-icon\" part=\"step-icon\" aria-hidden=\"true\">${statusIcon(item.status, item.icon)}</span>\n <div class=\"step-h-line\" ?data-done=${isDone}></div>\n </div>\n <div class=\"step-label\" part=\"step-label\">${item.label}</div>\n </div>\n `;\n })}\n </div>\n `;\n }\n\n private _extractItems(): StepItem[] {\n const data = this.spec?.data;\n if (!data || !Array.isArray(data)) return [];\n\n return data.filter((item): item is Record<string, unknown> =>\n item != null && typeof item === 'object' && 'label' in item,\n ).map(item => ({\n label: String(item.label),\n status: this._resolveStatus(item.status),\n description: item.description ? String(item.description) : undefined,\n icon: item.icon ? String(item.icon) : undefined,\n }));\n }\n\n private _resolveStatus(status: unknown): StepStatus {\n const s = String(status ?? 'pending');\n return VALID_STATUSES.has(s) ? s as StepStatus : 'pending';\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'u-steps': USteps;\n }\n}\n","import { LitElement, html, css, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport type { UWidgetSpec, UWidgetEvent } from '../core/types.js';\nimport { themeStyles } from '../styles/tokens.js';\n\ntype RatingIcon = 'star' | 'heart' | 'thumb';\n\n/** Icon characters for each type. [empty, half, full] */\nconst ICONS: Record<RatingIcon, [string, string, string]> = {\n star: ['\\u2606', '\\u2605', '\\u2605'], // ☆, ★, ★\n heart: ['\\u2661', '\\u2665', '\\u2665'], // ♡, ♥, ♥\n thumb: ['\\u{1F44D}', '\\u{1F44D}', '\\u{1F44D}'], // 👍\n};\n\n/**\n * <u-rating> — Star/heart/thumb rating widget.\n *\n * Display-only or interactive mode. Supports fractional values for display.\n */\n@customElement('u-rating')\nexport class URating extends LitElement {\n static styles = [themeStyles, css`\n :host {\n display: block;\n font-family: system-ui, -apple-system, sans-serif;\n container: u-rating / inline-size;\n }\n\n .rating {\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .rating-icons {\n display: flex;\n gap: 2px;\n }\n\n .rating-icon {\n font-size: 1.25rem;\n cursor: default;\n user-select: none;\n transition: transform 0.1s;\n position: relative;\n line-height: 1;\n }\n\n .rating-icon[data-interactive] {\n cursor: pointer;\n }\n\n .rating-icon[data-interactive]:hover {\n transform: scale(1.2);\n }\n\n /* Colors by state */\n .rating-icon[data-state=\"empty\"] {\n color: var(--u-widget-text-secondary, #94a3b8);\n }\n\n .rating-icon[data-state=\"full\"] {\n color: #f59e0b;\n }\n\n .rating-icon[data-state=\"half\"] {\n color: #f59e0b;\n }\n\n .rating-icon[data-icon=\"heart\"][data-state=\"full\"],\n .rating-icon[data-icon=\"heart\"][data-state=\"half\"] {\n color: #ef4444;\n }\n\n .rating-icon[data-icon=\"thumb\"][data-state=\"full\"] {\n color: var(--u-widget-primary, #4f46e5);\n }\n\n /* Half-star overlay */\n .rating-icon-half {\n position: relative;\n display: inline-block;\n }\n\n .rating-icon-half .half-overlay {\n position: absolute;\n left: 0;\n top: 0;\n overflow: hidden;\n width: 50%;\n }\n\n /* Value display */\n .rating-value {\n font-size: 0.875rem;\n font-weight: 600;\n color: var(--u-widget-text, #1a1a2e);\n }\n\n .rating-count {\n font-size: 0.8125rem;\n color: var(--u-widget-text-secondary, #64748b);\n }\n\n .rating-label {\n font-size: 0.8125rem;\n color: var(--u-widget-text-secondary, #64748b);\n }\n\n /* Hover preview */\n .rating-icon[data-preview=\"true\"] {\n color: #f59e0b;\n }\n\n .rating-icon[data-icon=\"heart\"][data-preview=\"true\"] {\n color: #ef4444;\n }\n\n .rating-icon[data-icon=\"thumb\"][data-preview=\"true\"] {\n color: var(--u-widget-primary, #4f46e5);\n }\n\n @container u-rating (max-width: 20rem) {\n .rating-icon { font-size: 1rem; }\n .rating-value { font-size: 0.8125rem; }\n }\n `];\n\n @property({ type: Object })\n spec: UWidgetSpec | null = null;\n\n @property({ type: String, reflect: true })\n theme: string | null = null;\n\n @state()\n private _hoverIdx = -1;\n\n render() {\n if (!this.spec) return nothing;\n\n const data = (this.spec.data ?? {}) as Record<string, unknown>;\n const options = (this.spec.options ?? {}) as Record<string, unknown>;\n\n const value = typeof data.value === 'number' ? data.value : 0;\n const max = typeof options.max === 'number' ? options.max : (typeof data.max === 'number' ? data.max : 5);\n const interactive = Boolean(options.interactive ?? false);\n const icon = this._resolveIcon(options.icon);\n const labelText = typeof options.label === 'string' ? options.label : undefined;\n const count = typeof data.count === 'number' ? data.count : undefined;\n\n const icons = ICONS[icon];\n const displayValue = this._hoverIdx >= 0 ? this._hoverIdx + 1 : value;\n\n return html`\n <div class=\"rating\" part=\"rating\" role=${interactive ? 'radiogroup' : 'img'}\n aria-label=${this.spec.title ?? labelText ?? `Rating: ${value} out of ${max}`}>\n ${labelText ? html`<span class=\"rating-label\" part=\"rating-label\">${labelText}</span>` : nothing}\n <div class=\"rating-icons\" part=\"rating-icons\"\n @mouseleave=${interactive ? () => { this._hoverIdx = -1; } : undefined}>\n ${Array.from({ length: max }, (_, i) => this._renderIcon(i, displayValue, icons, icon, interactive))}\n </div>\n ${!interactive && value > 0 ? html`<span class=\"rating-value\" part=\"rating-value\">${value}</span>` : nothing}\n ${count != null ? html`<span class=\"rating-count\" part=\"rating-count\">(${count})</span>` : nothing}\n </div>\n `;\n }\n\n private _renderIcon(idx: number, value: number, icons: [string, string, string], iconType: RatingIcon, interactive: boolean) {\n const pos = idx + 1;\n const isPreview = interactive && this._hoverIdx >= 0 && pos <= this._hoverIdx + 1;\n\n let state: 'empty' | 'half' | 'full';\n if (isPreview) {\n state = 'full';\n } else if (pos <= Math.floor(value)) {\n state = 'full';\n } else if (pos === Math.ceil(value) && value % 1 >= 0.25 && value % 1 < 0.75) {\n // Thumb icon has no distinct half glyph — round to nearest\n state = iconType === 'thumb' ? (value % 1 >= 0.5 ? 'full' : 'empty') : 'half';\n } else {\n state = 'empty';\n }\n\n const char = state === 'half' ? icons[0] : (state === 'full' ? icons[2] : icons[0]);\n\n if (state === 'half') {\n return html`\n <span class=\"rating-icon rating-icon-half\"\n data-state=\"half\" data-icon=${iconType}\n ?data-interactive=${interactive}\n ?data-preview=${isPreview}\n role=${interactive ? 'radio' : 'presentation'}\n aria-label=${interactive ? `${pos}` : nothing}\n @mouseenter=${interactive ? () => { this._hoverIdx = idx; } : undefined}\n @click=${interactive ? () => this._select(pos) : undefined}>\n <span aria-hidden=\"true\">${icons[0]}</span>\n <span class=\"half-overlay\" aria-hidden=\"true\">\n <span style=\"color: inherit\">${icons[2]}</span>\n </span>\n </span>\n `;\n }\n\n return html`\n <span class=\"rating-icon\"\n data-state=${state} data-icon=${iconType}\n ?data-interactive=${interactive}\n ?data-preview=${isPreview}\n role=${interactive ? 'radio' : 'presentation'}\n aria-label=${interactive ? `${pos}` : nothing}\n aria-checked=${interactive ? String(state === 'full' && !isPreview) : nothing}\n @mouseenter=${interactive ? () => { this._hoverIdx = idx; } : undefined}\n @click=${interactive ? () => this._select(pos) : undefined}>\n <span aria-hidden=\"true\">${char}</span>\n </span>\n `;\n }\n\n private _select(value: number) {\n this.dispatchEvent(\n new CustomEvent('u-widget-internal', {\n detail: {\n type: 'submit',\n widget: 'rating',\n id: this.spec?.id,\n data: { value },\n } satisfies UWidgetEvent,\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n private _resolveIcon(icon: unknown): RatingIcon {\n const s = String(icon ?? 'star');\n return s === 'heart' || s === 'thumb' ? s : 'star';\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'u-rating': URating;\n }\n}\n","import { LitElement, html, css, nothing } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport type { UWidgetSpec } from '../core/types.js';\nimport { themeStyles } from '../styles/tokens.js';\n\n@customElement('u-video')\nexport class UVideo extends LitElement {\n static styles = [themeStyles, css`\n :host {\n display: block;\n font-family: system-ui, -apple-system, sans-serif;\n container: u-video / inline-size;\n }\n\n .video-container {\n text-align: center;\n }\n\n video {\n max-width: 100%;\n border-radius: 6px;\n background: #000;\n }\n\n .video-caption {\n margin-top: 6px;\n font-size: 0.8125rem;\n color: var(--u-widget-text-secondary, #64748b);\n }\n\n @container u-video (max-width: 20rem) {\n video {\n border-radius: 4px;\n }\n\n .video-caption {\n font-size: 0.75rem;\n margin-top: 4px;\n }\n }\n `];\n\n @property({ type: Object })\n spec: UWidgetSpec | null = null;\n\n @property({ type: String, reflect: true })\n theme: string | null = null;\n\n render() {\n if (!this.spec) return nothing;\n\n const data = this.spec.data as Record<string, unknown> | undefined;\n if (!data) return nothing;\n\n const rawSrc = String(data.src ?? '');\n const src = this._sanitizeUrl(rawSrc);\n if (!src) return nothing;\n\n const poster = data.poster ? this._sanitizeUrl(String(data.poster)) : undefined;\n const alt = String(data.alt ?? '');\n const caption = data.caption as string | undefined;\n\n const opts = (this.spec.options ?? {}) as Record<string, unknown>;\n const controls = opts.controls !== false; // default true\n const autoplay = opts.autoplay === true;\n const loop = opts.loop === true;\n const muted = opts.muted === true || autoplay; // autoplay requires muted in most browsers\n\n return html`\n <div class=\"video-container\" part=\"video\">\n <video\n src=${src}\n poster=${poster ?? nothing}\n aria-label=${alt || nothing}\n ?controls=${controls}\n ?autoplay=${autoplay}\n ?loop=${loop}\n ?muted=${muted}\n playsinline\n preload=\"metadata\"\n part=\"video-element\"\n ></video>\n ${caption ? html`<div class=\"video-caption\" part=\"caption\">${caption}</div>` : nothing}\n </div>\n `;\n }\n\n private _sanitizeUrl(url: string): string {\n const stripped = url.replace(/[\\s\\u200B\\u200C\\u200D\\uFEFF\\u00AD\\u200E\\u200F]/g, '');\n if (/^(javascript|data|vbscript):/i.test(stripped)) return '';\n return url;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'u-video': UVideo;\n }\n}\n","import { LitElement, html, css, nothing } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport type { UWidgetSpec } from '../core/types.js';\nimport { themeStyles } from '../styles/tokens.js';\n\ninterface GalleryItem {\n src: string;\n alt?: string;\n caption?: string;\n}\n\n@customElement('u-gallery')\nexport class UGallery extends LitElement {\n static styles = [themeStyles, css`\n :host {\n display: block;\n font-family: system-ui, -apple-system, sans-serif;\n container: u-gallery / inline-size;\n }\n\n .gallery-grid {\n display: grid;\n gap: 8px;\n }\n\n .gallery-item {\n overflow: hidden;\n border-radius: 6px;\n background: var(--u-widget-surface, #f1f5f9);\n }\n\n .gallery-item img {\n display: block;\n width: 100%;\n height: 100%;\n object-fit: cover;\n }\n\n .gallery-caption {\n padding: 4px 8px;\n font-size: 0.75rem;\n color: var(--u-widget-text-secondary, #64748b);\n background: var(--u-widget-surface, #f1f5f9);\n }\n\n @container u-gallery (max-width: 20rem) {\n .gallery-grid {\n grid-template-columns: 1fr !important;\n }\n }\n `];\n\n @property({ type: Object })\n spec: UWidgetSpec | null = null;\n\n @property({ type: String, reflect: true })\n theme: string | null = null;\n\n render() {\n if (!this.spec) return nothing;\n\n const data = this.spec.data;\n if (!Array.isArray(data)) return nothing;\n\n const items = (data as Record<string, unknown>[])\n .filter((d) => d && typeof d.src === 'string' && d.src)\n .map((d) => ({\n src: this._sanitizeUrl(String(d.src)),\n alt: d.alt ? String(d.alt) : undefined,\n caption: d.caption ? String(d.caption) : undefined,\n }))\n .filter((item) => item.src); // Remove items with blocked URLs\n\n if (items.length === 0) return nothing;\n\n const opts = (this.spec.options ?? {}) as Record<string, unknown>;\n const columns = Number(opts.columns) || 0;\n const aspectRatio = String(opts.aspectRatio ?? 'auto');\n\n const gridCols = columns > 0\n ? `repeat(${columns}, 1fr)`\n : `repeat(auto-fill, minmax(150px, 1fr))`;\n\n const aspectStyle = aspectRatio !== 'auto'\n ? `aspect-ratio: ${aspectRatio.replace(':', '/')};`\n : '';\n\n const title = this.spec.title;\n\n return html`\n <div class=\"gallery-grid\" part=\"gallery\" role=\"list\"\n aria-label=${title ?? 'Gallery'}\n style=\"grid-template-columns: ${gridCols}\">\n ${items.map((item) => this._renderItem(item, aspectStyle))}\n </div>\n `;\n }\n\n private _renderItem(item: GalleryItem, aspectStyle: string) {\n return html`\n <figure class=\"gallery-item\" part=\"gallery-item\" role=\"listitem\" style=${aspectStyle || nothing}>\n <img\n src=${item.src}\n alt=${item.alt ?? ''}\n loading=\"lazy\"\n part=\"gallery-image\"\n />\n ${item.caption ? html`<figcaption class=\"gallery-caption\" part=\"gallery-caption\">${item.caption}</figcaption>` : nothing}\n </figure>\n `;\n }\n\n private _sanitizeUrl(url: string): string {\n const stripped = url.replace(/[\\s\\u200B\\u200C\\u200D\\uFEFF\\u00AD\\u200E\\u200F]/g, '');\n if (/^(javascript|data|vbscript):/i.test(stripped)) return '';\n return url;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'u-gallery': UGallery;\n }\n}\n","import { LitElement, html, css, nothing } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport type { UWidgetSpec, UWidgetAction, UWidgetEvent } from '../core/types.js';\nimport { validate } from '../core/schema.js';\nimport { normalize } from '../core/normalize.js';\nimport { infer } from '../core/infer.js';\nimport { suggestWidget } from '../core/suggest.js';\nimport { themeStyles } from '../styles/tokens.js';\nimport './u-metric.js';\nimport './u-gauge.js';\nimport './u-table.js';\nimport './u-form.js';\nimport './u-compose.js';\nimport './u-content.js';\nimport './u-kv.js';\nimport './u-code.js';\nimport './u-citation.js';\nimport './u-status.js';\nimport './u-steps.js';\nimport './u-rating.js';\nimport './u-video.js';\nimport './u-gallery.js';\n\n/**\n * <u-widget> — Entry point router element.\n * Reads spec.widget and delegates to the appropriate sub-component.\n *\n * Supports theme attribute: theme=\"dark\" | theme=\"light\" | (auto via prefers-color-scheme)\n */\n@customElement('u-widget')\nexport class UWidget extends LitElement {\n static styles = [\n themeStyles,\n css`\n :host {\n display: block;\n container: u-widget / inline-size;\n }\n\n .error-card {\n padding: 10px 14px;\n border-radius: 6px;\n border: 1px solid var(--u-widget-negative, #ef4444);\n background: color-mix(in srgb, var(--u-widget-negative, #ef4444) 8%, var(--u-widget-bg, #fff));\n font-size: 0.8125rem;\n }\n\n .error-header { font-weight: 600; color: var(--u-widget-negative, #ef4444); margin-bottom: 4px; }\n .error-list { margin: 0; padding-left: 20px; color: var(--u-widget-text-secondary, #64748b); }\n\n .fallback-card {\n padding: 10px 14px;\n border-radius: 6px;\n border: 1px dashed var(--u-widget-border, #e2e8f0);\n font-size: 0.8125rem;\n }\n .fallback-label { font-size: 0.6875rem; font-weight: 600; color: var(--u-widget-text-secondary, #64748b); margin-bottom: 6px; }\n .fallback-hint { font-size: 0.75rem; color: var(--u-widget-primary, #4f46e5); margin-bottom: 6px; }\n .fallback-card pre { margin: 0; white-space: pre-wrap; font-size: 0.75rem; color: var(--u-widget-text-secondary, #64748b); max-height: 200px; overflow-y: auto; }\n\n .card-container {\n padding: 16px 20px;\n border-radius: var(--u-widget-radius, 6px);\n border: 1px solid var(--u-widget-border, #e2e8f0);\n background: var(--u-widget-bg, #fff);\n box-shadow: var(--u-widget-shadow);\n transition: box-shadow 0.2s;\n }\n\n /* ── shared action button styles ── */\n [part=\"widget-container\"] {\n display: contents;\n }\n\n [part=\"action-btn\"] {\n padding: 8px 20px;\n border-radius: 6px;\n font-size: 0.875rem;\n font-weight: 500;\n cursor: pointer;\n border: 1px solid var(--u-widget-border, #e2e8f0);\n background: var(--u-widget-bg, #fff);\n color: var(--u-widget-text, #1a1a2e);\n transition: all 0.15s;\n font-family: inherit;\n }\n\n [part=\"action-btn\"]:hover {\n background: var(--u-widget-surface, #f1f5f9);\n }\n\n [part=\"action-btn\"][data-style='primary'] {\n background: var(--u-widget-primary, #4f46e5);\n color: white;\n border-color: transparent;\n }\n\n [part=\"action-btn\"][data-style='primary']:hover {\n opacity: 0.9;\n }\n\n [part=\"action-btn\"][data-style='danger'] {\n background: var(--u-widget-negative, #dc2626);\n color: white;\n border-color: transparent;\n }\n\n [part=\"action-btn\"]:disabled {\n opacity: 0.5;\n cursor: default;\n }\n\n /* ── global action bar ── */\n .global-actions {\n display: flex;\n gap: 8px;\n justify-content: flex-end;\n padding-top: 10px;\n flex-wrap: wrap;\n }\n\n /* ── standalone actions widget ── */\n .actions-widget {\n display: flex;\n gap: 8px;\n flex-wrap: wrap;\n }\n\n .actions-widget[data-layout='column'] {\n flex-direction: column;\n }\n\n /* ── divider widget ── */\n .divider {\n display: flex;\n align-items: center;\n gap: 12px;\n color: var(--u-widget-text-secondary, #64748b);\n font-size: 0.75rem;\n }\n\n .divider::before,\n .divider::after {\n content: '';\n flex: 1;\n border-top: 1px solid var(--u-widget-border, #e2e8f0);\n }\n\n .divider:empty::after { display: none; }\n .divider:empty { border-top: 1px solid var(--u-widget-border, #e2e8f0); }\n .divider:empty::before { display: none; }\n\n .divider-spacing-small { margin: 4px 0; }\n .divider-spacing-default { margin: 12px 0; }\n .divider-spacing-large { margin: 24px 0; }\n\n /* ── header widget ── */\n .header-widget {\n font-weight: 600;\n color: var(--u-widget-text, #1a1a2e);\n margin: 0;\n }\n\n .header-widget[data-level='1'] { font-size: 1.5rem; }\n .header-widget[data-level='2'] { font-size: 1.25rem; }\n .header-widget[data-level='3'] { font-size: 1.1rem; }\n\n /* ── responsive: narrow container ── */\n @container u-widget (max-width: 20rem) {\n .global-actions {\n flex-direction: column;\n }\n\n .global-actions [part=\"action-btn\"] {\n width: 100%;\n text-align: center;\n }\n\n .actions-widget:not([data-layout='column']) {\n flex-direction: column;\n }\n\n .actions-widget [part=\"action-btn\"] {\n width: 100%;\n text-align: center;\n }\n\n .card-container {\n padding: 12px 14px;\n }\n\n [part=\"action-btn\"] {\n padding: 8px 14px;\n font-size: 0.8125rem;\n }\n\n .header-widget[data-level='1'] { font-size: 1.25rem; }\n .header-widget[data-level='2'] { font-size: 1.1rem; }\n .header-widget[data-level='3'] { font-size: 1rem; }\n }\n `,\n ];\n\n @property({\n type: Object,\n converter: {\n fromAttribute(value: string | null) {\n if (!value) return null;\n try {\n return JSON.parse(value);\n } catch (e) {\n console.warn('[u-widget] Invalid JSON in spec attribute:', (e as Error).message);\n return null;\n }\n },\n },\n })\n spec: UWidgetSpec | null = null;\n\n /** Theme override: \"dark\" | \"light\" | null (auto via prefers-color-scheme). */\n @property({ type: String, reflect: true })\n theme: string | null = null;\n\n /** Locale tag (e.g. 'ko', 'en-US'). Propagated to sub-components via spec.options.locale. */\n @property({ type: String, reflect: true })\n locale: string | null = null;\n\n connectedCallback() {\n super.connectedCallback();\n this.addEventListener('u-widget-internal', this._handleInternalEvent as EventListener);\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this.removeEventListener('u-widget-internal', this._handleInternalEvent as EventListener);\n }\n\n private _handleInternalEvent = (e: CustomEvent<UWidgetEvent>) => {\n e.stopPropagation();\n this.dispatchEvent(\n new CustomEvent('u-widget-event', {\n detail: e.detail,\n bubbles: true,\n composed: true,\n }),\n );\n };\n\n render() {\n if (!this.spec) {\n return html`<slot></slot>`;\n }\n\n const result = validate(this.spec);\n if (!result.valid) {\n return this.renderError(result.errors);\n }\n\n const spec = normalize(this.spec);\n return this.renderWidget(spec);\n }\n\n private renderWidget(spec: UWidgetSpec) {\n const widget = spec.widget;\n\n // Auto-infer mapping if missing\n const mapping = spec.mapping ?? infer(widget, spec.data);\n let resolved = mapping ? { ...spec, mapping } : spec;\n\n // Propagate locale attribute to spec if not already set\n if (this.locale && !resolved.options?.locale) {\n resolved = {\n ...resolved,\n options: { ...resolved.options, locale: this.locale },\n };\n }\n\n const t = this.theme;\n\n // Determine if actions should be rendered at router level\n // form/confirm handle their own actions; standalone \"actions\" widget also self-handles\n const selfHandlesActions = widget === 'form' || widget === 'confirm' || widget === 'actions';\n const globalActions = !selfHandlesActions ? (resolved.actions ?? []) : [];\n\n let widgetHtml;\n switch (widget) {\n case 'metric':\n case 'stat-group':\n widgetHtml = html`<u-metric .spec=${resolved} theme=${t ?? nothing}></u-metric>`;\n break;\n case 'gauge':\n case 'progress':\n widgetHtml = html`<u-gauge .spec=${resolved} theme=${t ?? nothing}></u-gauge>`;\n break;\n case 'table':\n case 'list':\n widgetHtml = html`<u-table .spec=${resolved} theme=${t ?? nothing}></u-table>`;\n break;\n case 'form':\n case 'confirm':\n widgetHtml = html`<u-form .spec=${resolved} theme=${t ?? nothing}></u-form>`;\n break;\n case 'compose':\n widgetHtml = html`<u-compose .spec=${resolved} theme=${t ?? nothing}></u-compose>`;\n break;\n case 'markdown':\n case 'image':\n case 'callout':\n widgetHtml = html`<u-content .spec=${resolved} theme=${t ?? nothing}></u-content>`;\n break;\n case 'kv':\n widgetHtml = html`<u-kv .spec=${resolved} theme=${t ?? nothing}></u-kv>`;\n break;\n case 'code':\n widgetHtml = html`<u-code .spec=${resolved} theme=${t ?? nothing}></u-code>`;\n break;\n case 'citation':\n widgetHtml = html`<u-citation .spec=${resolved} theme=${t ?? nothing}></u-citation>`;\n break;\n case 'status':\n widgetHtml = html`<u-status .spec=${resolved} theme=${t ?? nothing}></u-status>`;\n break;\n case 'steps':\n widgetHtml = html`<u-steps .spec=${resolved} theme=${t ?? nothing}></u-steps>`;\n break;\n case 'rating':\n widgetHtml = html`<u-rating .spec=${resolved} theme=${t ?? nothing}></u-rating>`;\n break;\n case 'video':\n widgetHtml = html`<u-video .spec=${resolved} theme=${t ?? nothing}></u-video>`;\n break;\n case 'gallery':\n widgetHtml = html`<u-gallery .spec=${resolved} theme=${t ?? nothing}></u-gallery>`;\n break;\n case 'actions':\n widgetHtml = this.renderActionsWidget(resolved);\n break;\n case 'divider':\n widgetHtml = this.renderDivider(resolved);\n break;\n case 'header':\n widgetHtml = this.renderHeader(resolved);\n break;\n default:\n // chart.* types are handled by u-chart if loaded (separate entry point)\n if (widget.startsWith('chart.') && customElements.get('u-chart')) {\n widgetHtml = html`<u-chart .spec=${resolved} theme=${t ?? nothing}></u-chart>`;\n break;\n }\n return this.renderFallback(resolved);\n }\n\n // Wrap in card container if options.card is set\n const isCard = Boolean((resolved.options as Record<string, unknown>)?.card);\n if (isCard) {\n widgetHtml = html`<div class=\"card-container\" part=\"card\">${widgetHtml}</div>`;\n }\n\n // Append global action bar if actions are present\n if (globalActions.length > 0) {\n const actionButtons = globalActions.map((a) => html`\n <button\n data-style=${a.style ?? 'default'}\n ?disabled=${a.disabled}\n @click=${() => this._dispatchAction(resolved, a)}\n part=\"action-btn\"\n >${a.label}</button>\n `);\n return html`<div part=\"widget-container\">${widgetHtml}<div class=\"global-actions\" part=\"actions\">${actionButtons}</div></div>`;\n }\n\n return widgetHtml;\n }\n\n /** Render standalone \"actions\" widget — a group of action buttons. */\n private renderActionsWidget(spec: UWidgetSpec) {\n const actions = spec.actions ?? [];\n if (actions.length === 0) return nothing;\n\n const options = (spec.options ?? {}) as Record<string, unknown>;\n const layout = String(options.layout ?? 'wrap');\n\n return html`\n <div class=\"actions-widget\" data-layout=${layout} part=\"actions\" role=\"group\" aria-label=${spec.title ?? 'Actions'}>\n ${actions.map((a) => html`\n <button\n data-style=${a.style ?? 'default'}\n ?disabled=${a.disabled}\n @click=${() => this._dispatchAction(spec, a)}\n part=\"action-btn\"\n >${a.label}</button>\n `)}\n </div>\n `;\n }\n\n /** Render inline divider widget. */\n private renderDivider(spec: UWidgetSpec) {\n const options = (spec.options ?? {}) as Record<string, unknown>;\n const label = options.label as string | undefined;\n const spacing = String(options.spacing ?? 'default');\n\n return html`\n <div class=\"divider divider-spacing-${spacing}\" part=\"divider\" role=\"separator\">\n ${label ?? nothing}\n </div>\n `;\n }\n\n /** Render inline header widget. */\n private renderHeader(spec: UWidgetSpec) {\n const data = spec.data as Record<string, unknown> | undefined;\n const text = String(data?.text ?? spec.title ?? '');\n const level = String(data?.level ?? '2');\n\n if (!text) return nothing;\n\n return html`\n <div class=\"header-widget\" data-level=${level} part=\"header\" role=\"heading\" aria-level=${level}>\n ${text}\n </div>\n `;\n }\n\n /** Dispatch an action event from the global action bar or actions widget. */\n private _dispatchAction(spec: UWidgetSpec, action: UWidgetAction) {\n if (action.action === 'navigate' && action.url) {\n window.open(action.url, '_blank', 'noopener');\n return;\n }\n\n this.dispatchEvent(\n new CustomEvent('u-widget-event', {\n detail: {\n type: 'action',\n widget: spec.widget,\n id: spec.id,\n action: action.action,\n data: action.url ? { url: action.url } : undefined,\n } satisfies UWidgetEvent,\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n private renderFallback(spec: UWidgetSpec) {\n const suggestion = suggestWidget(spec.widget);\n return html`\n <div class=\"fallback-card\" part=\"fallback\">\n <div class=\"fallback-label\">${spec.title ?? `Unknown widget: ${spec.widget}`}</div>\n ${suggestion ? html`<div class=\"fallback-hint\">Did you mean <strong>${suggestion}</strong>?</div>` : ''}\n <pre part=\"json\"><code>${JSON.stringify(spec, null, 2)}</code></pre>\n </div>\n `;\n }\n\n private renderError(errors: string[]) {\n return html`\n <div class=\"error-card\" part=\"error\">\n <div class=\"error-header\">\n <span aria-hidden=\"true\">&#x26A0;</span>\n <span>Invalid widget spec</span>\n </div>\n <ul class=\"error-list\">\n ${errors.map((e) => html`<li>${e}</li>`)}\n </ul>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'u-widget': UWidget;\n }\n}\n"],"names":["VALID_FIELD_TYPES","MAX_COMPOSE_DEPTH","ARRAY_DATA","OBJECT_DATA","validate","spec","_depth","errors","warnings","obj","widget","i","child","childResult","e","w","validLayouts","f","getFormdownParser","a","mapping","dataKeys","getDataKeys","key","val","item","data","isWidgetSpec","value","BYTE_UNITS","formatValue","format","locale","type","param","formatNumber","formatCurrency","formatPercent","formatDate","formatDatetime","formatBytes","num","currencyCode","d","raw","sign","KNOWN_WIDGETS","suggestWidget","input","lower","bestMatch","bestDist","known","dist","levenshtein","maxDist","b","m","n","row","j","prev","cost","EN","registry","registerLocale","lang","strings","getLocaleStrings","base","formatTemplate","template","params","_","getDefaultLocale","toMetricData","UMetric","LitElement","nothing","items","html","trendArrow","ariaLabel","themeStyles","css","__decorateClass","property","customElement","DEFAULT_GAUGE_OPTIONS","COLOR_MAP","resolveColor","color","describeArc","cx","cy","r","startDeg","endDeg","startRad","endRad","x1","y1","x2","y2","largeArc","UGauge","opts","range","pct","startAngle","totalAngle","endAngle","trackPath","fillPath","label","valueText","max","sorted","t","UTable","tbody","rows","idx","nextIdx","container","changed","columns","sortable","searchable","compact","pageSize","filtered","totalPages","page","visible","searchBox","paginationBar","col","newPage","q","fields","c","field","dir","av","bv","cmp","an","bn","primaryKey","secondaryKey","iconKey","avatarKey","trailingKey","badgeKey","index","detail","keys","primaryCandidates","candidate","sample","k","state","UForm","submitAction","cancelAction","actions","desc","error","errorId","hasError","opt","checked","current","v","coerced","updated","action","UCompose","layout","children","title","roleAttr","gridCols","widths","span","spanStyle","isCard","widgetHtml","summary","cls","UContent","content","rawSrc","alt","caption","src","message","level","isUrgent","text","result","match","_match","headerLine","sepLine","bodyBlock","parseCells","line","headers","aligns","s","ths","h","trs","href","url","stripped","UKv","pairs","options","gridStyle","CM","KW","AL","_kwCache","kwSet","str","esc","wrap","escaped","strEnd","code","start","quote","highlight","resolved","highlightJSON","kw","cmRules","lineComment","blockComment","hasTemplateStrings","len","end","slice","ch","word","after","matched","UCode","language","lineNumbers","wrapText","maxHeight","highlightLines","linesHtml","hl","numHtml","bodyStyle","UCitation","numbered","hasLink","displayUrl","safeUrl","VALID_LEVELS","LEVEL_ICONS","UStatus","VALID_STATUSES","statusIcon","status","iconOverride","USteps","prevDone","isDone","ICONS","URating","interactive","icon","labelText","count","icons","displayValue","iconType","pos","isPreview","char","UVideo","poster","controls","autoplay","loop","muted","UGallery","aspectRatio","aspectStyle","UWidget","normalize","infer","globalActions","actionButtons","spacing","suggestion"],"mappings":"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AA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA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"}