@lieselthuriot/widget-renderer 0.0.0-stage → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lieselthuriot-widget-renderer.mjs","names":["getWidgetWidth","getWidgetHeight"],"sources":["../../../projects/widget-renderer/src/lib/widget-hydration.ts","../../../projects/widget-renderer/src/lib/widget-validation.ts","../../../projects/widget-renderer/src/lib/widget-fingerprint.ts","../../../projects/widget-renderer/src/lib/widget-layout.ts","../../../projects/widget-renderer/src/lib/widget-element-renderer.ts","../../../projects/widget-renderer/src/lib/widget-element-renderer.html","../../../projects/widget-renderer/src/lib/widget-skeleton.ts","../../../projects/widget-renderer/src/lib/widget-skeleton.html","../../../projects/widget-renderer/src/lib/widget-background.ts","../../../projects/widget-renderer/src/lib/widget-toolbar.ts","../../../projects/widget-renderer/src/lib/widget-validation-overlay.ts","../../../projects/widget-renderer/src/lib/widget-renderer.ts","../../../projects/widget-renderer/src/lib/widget-renderer.html"],"sourcesContent":["import { WidgetElement, WidgetElementContract, WidgetInput } from './widget.model';\n\nfunction normalizeElement(\n element: WidgetElement | WidgetElementContract,\n): WidgetElement | WidgetElementContract {\n return {\n ...element,\n ...(element.type === 'text' && !element.style.padding\n ? { style: { ...element.style, padding: { vertical: 0, horizontal: 0 } } }\n : {}),\n ...(element.type === 'button'\n ? {\n requestRefresh: element.requestRefresh ?? false,\n showOnlyOnHover: element.showOnlyOnHover ?? false,\n }\n : {}),\n sensitive: element.type === 'divider' ? false : element.sensitive,\n } as WidgetElement;\n}\n\nexport function normalizeWidgetInput(widget: WidgetInput): WidgetInput {\n return {\n ...widget,\n elements: widget.elements.map(normalizeElement),\n };\n}\n","import {\n ElementAnchor,\n GridUnit,\n Widget,\n WidgetContract,\n WidgetInput,\n WidgetElementType,\n} from './widget.model';\n\nexport type WidgetValidationRuleMode = 'block' | 'report';\n\nexport interface WidgetValidationIssue {\n path: string;\n message: string;\n severity?: WidgetValidationRuleMode;\n}\n\nexport interface WidgetValidationRule {\n validate(widget: WidgetInput): readonly WidgetValidationIssue[];\n mode?: WidgetValidationRuleMode;\n}\n\nexport type WidgetValidationRuleInput =\n WidgetValidationRule | ((widget: WidgetInput) => readonly WidgetValidationIssue[]);\n\nexport interface WidgetParseOptions {\n rules?: readonly WidgetValidationRuleInput[];\n}\n\nexport interface WidgetParseSuccess {\n success: true;\n data: WidgetInput;\n issues: WidgetValidationIssue[];\n}\n\nexport interface WidgetParseFailure {\n success: false;\n issues: WidgetValidationIssue[];\n}\n\nexport type WidgetParseResult = WidgetParseSuccess | WidgetParseFailure;\n\nexport class WidgetValidationError extends Error {\n constructor(readonly issues: WidgetValidationIssue[]) {\n super(issues.map(({ path, message }) => `${path}: ${message}`).join('; '));\n this.name = 'WidgetValidationError';\n }\n}\n\nconst anchors: ElementAnchor[] = [\n 'top left',\n 'top center',\n 'top right',\n 'center left',\n 'center',\n 'center right',\n 'bottom left',\n 'bottom center',\n 'bottom right',\n];\nconst elementTypes: WidgetElementType[] = [\n 'text',\n 'image',\n 'button',\n 'divider',\n 'pie',\n 'donut',\n 'funnel',\n 'gauge',\n 'bar',\n 'line',\n 'progress',\n];\nconst gridUnits: GridUnit[] = ['pixel', 'auto', 'star'];\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction isString(value: unknown): value is string {\n return typeof value === 'string';\n}\n\nfunction isBoolean(value: unknown): value is boolean {\n return typeof value === 'boolean';\n}\n\nfunction isFiniteNumber(value: unknown): value is number {\n return typeof value === 'number' && Number.isFinite(value);\n}\n\nfunction isOneOf<T extends string>(value: unknown, values: readonly T[]): value is T {\n return typeof value === 'string' && values.includes(value as T);\n}\n\nfunction addIssue(issues: WidgetValidationIssue[], path: string, message: string): void {\n issues.push({ path, message });\n}\n\nfunction requiredString(\n value: unknown,\n path: string,\n issues: WidgetValidationIssue[],\n allowEmpty = false,\n): value is string {\n if (!isString(value) || (!allowEmpty && value.length === 0)) {\n addIssue(issues, path, allowEmpty ? 'must be a string' : 'must be a non-empty string');\n return false;\n }\n return true;\n}\n\nfunction requiredBoolean(value: unknown, path: string, issues: WidgetValidationIssue[]): boolean {\n if (!isBoolean(value)) {\n addIssue(issues, path, 'must be a boolean');\n return false;\n }\n return true;\n}\n\nfunction requiredNumber(\n value: unknown,\n path: string,\n issues: WidgetValidationIssue[],\n minimum = 0,\n): boolean {\n if (!isFiniteNumber(value) || value < minimum) {\n addIssue(issues, path, `must be a finite number greater than or equal to ${minimum}`);\n return false;\n }\n return true;\n}\n\nfunction validateTextFont(value: unknown, path: string, issues: WidgetValidationIssue[]): void {\n if (!isRecord(value)) {\n addIssue(issues, path, 'must be an object');\n return;\n }\n requiredNumber(value['size'], `${path}.size`, issues, 1);\n for (const key of ['bold', 'italic', 'underline', 'strikethrough']) {\n if (value[key] !== undefined) requiredBoolean(value[key], `${path}.${key}`, issues);\n }\n}\n\nfunction validateChartFont(value: unknown, path: string, issues: WidgetValidationIssue[]): void {\n if (!isRecord(value)) {\n addIssue(issues, path, 'must be an object');\n return;\n }\n requiredNumber(value['size'], `${path}.size`, issues, 1);\n}\n\nfunction validateGrid(value: unknown, path: string, issues: WidgetValidationIssue[]): void {\n if (!isRecord(value)) {\n addIssue(issues, path, 'must be an object');\n return;\n }\n requiredNumber(value['row'], `${path}.row`, issues);\n requiredNumber(value['column'], `${path}.column`, issues);\n requiredNumber(value['rowSpan'], `${path}.rowSpan`, issues, 1);\n requiredNumber(value['columnSpan'], `${path}.columnSpan`, issues, 1);\n if (value['anchor'] !== undefined && !isOneOf(value['anchor'], anchors)) {\n addIssue(issues, `${path}.anchor`, 'has an unsupported value');\n }\n}\n\nfunction validateStyle(\n value: unknown,\n path: string,\n issues: WidgetValidationIssue[],\n axisMode: 'required' | 'forbidden' | 'optional' = 'optional',\n fontMode: 'text' | 'chart' = 'chart',\n requiredColors: readonly string[] = [],\n): void {\n if (!isRecord(value)) {\n addIssue(issues, path, 'must be an object');\n return;\n }\n (fontMode === 'text' ? validateTextFont : validateChartFont)(\n value['font'],\n `${path}.font`,\n issues,\n );\n const color = value['color'];\n if (isRecord(color)) {\n for (const key of ['legend', 'title', 'line', 'fill', 'track']) {\n if (requiredColors.includes(key) || color[key] !== undefined)\n requiredString(color[key], `${path}.color.${key}`, issues, true);\n }\n } else if (requiredColors.length) {\n addIssue(issues, `${path}.color`, 'must be an object');\n } else {\n requiredString(color, `${path}.color`, issues, true);\n }\n if (axisMode === 'required') {\n if (!isRecord(value['axis'])) addIssue(issues, `${path}.axis`, 'must be an object');\n else\n for (const key of ['label', 'line', 'grid'])\n requiredString(value['axis'][key], `${path}.axis.${key}`, issues, true);\n } else if (axisMode === 'forbidden' && value['axis'] !== undefined) {\n addIssue(issues, `${path}.axis`, 'is not supported for this chart');\n }\n}\n\nfunction validateDataPoints(\n value: unknown,\n path: string,\n issues: WidgetValidationIssue[],\n allowNullColor: boolean,\n): void {\n if (!Array.isArray(value)) {\n addIssue(issues, path, 'must be an array');\n return;\n }\n value.forEach((point, index) => {\n const pointPath = `${path}[${index}]`;\n if (!isRecord(point)) {\n addIssue(issues, pointPath, 'must be an object');\n return;\n }\n requiredString(point['label'], `${pointPath}.label`, issues, true);\n requiredNumber(point['value'], `${pointPath}.value`, issues);\n if (point['color'] === undefined) {\n if (!allowNullColor) addIssue(issues, `${pointPath}.color`, 'must be a string');\n } else if (point['color'] === null) {\n if (!allowNullColor) addIssue(issues, `${pointPath}.color`, 'must be a string');\n } else requiredString(point['color'], `${pointPath}.color`, issues, true);\n });\n}\n\nfunction validateProgressData(value: unknown, path: string, issues: WidgetValidationIssue[]): void {\n if (!isRecord(value)) {\n addIssue(issues, path, 'must be an object');\n return;\n }\n requiredNumber(value['min'], `${path}.min`, issues);\n requiredNumber(value['max'], `${path}.max`, issues);\n if (\n typeof value['min'] === 'number' &&\n typeof value['max'] === 'number' &&\n value['min'] >= value['max']\n ) {\n addIssue(issues, `${path}.max`, 'must be greater than min');\n }\n const items = value['items'];\n if (!Array.isArray(items)) {\n addIssue(issues, `${path}.items`, 'must be an array');\n return;\n }\n let total = 0;\n items.forEach((item, index) => {\n const itemPath = `${path}.items[${index}]`;\n if (!isRecord(item)) {\n addIssue(issues, itemPath, 'must be an object');\n return;\n }\n if (!isOneOf(item['kind'], ['segment', 'gap'] as const)) {\n addIssue(issues, `${itemPath}.kind`, 'has an unsupported value');\n return;\n }\n requiredNumber(item['value'], `${itemPath}.value`, issues);\n if (typeof item['value'] === 'number' && Number.isFinite(item['value'])) {\n if (item['value'] < 0) addIssue(issues, `${itemPath}.value`, 'must not be negative');\n else total += item['value'];\n }\n if (item['kind'] === 'segment') {\n requiredString(item['label'], `${itemPath}.label`, issues);\n requiredString(item['color'], `${itemPath}.color`, issues);\n requiredBoolean(item['active'], `${itemPath}.active`, issues);\n }\n });\n if (\n typeof value['min'] === 'number' &&\n typeof value['max'] === 'number' &&\n Number.isFinite(value['min']) &&\n Number.isFinite(value['max']) &&\n total > value['max'] - value['min']\n ) {\n addIssue(issues, `${path}.items`, 'total value must not exceed the progress range');\n }\n}\n\nfunction validateElement(value: unknown, path: string, issues: WidgetValidationIssue[]): void {\n if (!isRecord(value)) {\n addIssue(issues, path, 'must be an object');\n return;\n }\n const issuePath = path;\n if (!isOneOf(value['type'], elementTypes)) {\n addIssue(issues, `${issuePath}.type`, 'has an unsupported value');\n return;\n }\n validateGrid(value['grid'], `${issuePath}.grid`, issues);\n if (value['type'] !== 'divider' || value['sensitive'] !== undefined) {\n requiredBoolean(value['sensitive'], `${issuePath}.sensitive`, issues);\n }\n switch (value['type']) {\n case 'text':\n requiredString(value['text'], `${issuePath}.text`, issues, true);\n validateStyle(value['style'], `${issuePath}.style`, issues, 'optional', 'text');\n if (!isRecord(value['style'])) break;\n requiredString(value['style']['color'], `${issuePath}.style.color`, issues, true);\n if (value['style']['background'] !== undefined)\n requiredString(value['style']['background'], `${issuePath}.style.background`, issues, true);\n if (value['style']['padding'] !== undefined) {\n const padding = value['style']['padding'];\n if (padding !== null && !isRecord(padding)) {\n addIssue(issues, `${issuePath}.style.padding`, 'must be an object or null');\n } else if (padding !== null) {\n requiredNumber(padding['vertical'], `${issuePath}.style.padding.vertical`, issues);\n requiredNumber(padding['horizontal'], `${issuePath}.style.padding.horizontal`, issues);\n }\n }\n if (value['style']['radius'] !== undefined)\n requiredNumber(value['style']['radius'], `${issuePath}.style.radius`, issues);\n if (!isOneOf(value['style']['align'], ['left', 'center', 'right'] as const))\n addIssue(issues, `${issuePath}.style.align`, 'has an unsupported value');\n requiredBoolean(value['style']['wrap'], `${issuePath}.style.wrap`, issues);\n break;\n case 'image':\n requiredString(value['source'], `${issuePath}.source`, issues);\n requiredString(value['alt'], `${issuePath}.alt`, issues, true);\n if (!isOneOf(value['fit'], ['cover', 'contain', 'fill'] as const))\n addIssue(issues, `${issuePath}.fit`, 'has an unsupported value');\n requiredNumber(value['radius'], `${issuePath}.radius`, issues);\n break;\n case 'button':\n requiredString(value['label'], `${issuePath}.label`, issues, true);\n if (!isOneOf(value['method'], ['get', 'post'] as const))\n addIssue(issues, `${issuePath}.method`, 'has an unsupported value');\n requiredString(value['url'], `${issuePath}.url`, issues, true);\n if (value['body'] !== undefined && value['body'] !== null && !isString(value['body']))\n addIssue(issues, `${issuePath}.body`, 'must be a string or null');\n if (value['method'] === 'get' && value['body'] !== undefined && value['body'] !== null)\n addIssue(issues, `${issuePath}.body`, 'must be empty for GET buttons');\n if (value['requestRefresh'] !== undefined)\n requiredBoolean(value['requestRefresh'], `${issuePath}.requestRefresh`, issues);\n if (value['showOnlyOnHover'] !== undefined)\n requiredBoolean(value['showOnlyOnHover'], `${issuePath}.showOnlyOnHover`, issues);\n if (!isOneOf(value['style'], ['solid', 'outline'] as const))\n addIssue(issues, `${issuePath}.style`, 'has an unsupported value');\n break;\n case 'divider':\n if (!isOneOf(value['orientation'], ['horizontal', 'vertical'] as const))\n addIssue(issues, `${issuePath}.orientation`, 'has an unsupported value');\n if (!isRecord(value['style'])) addIssue(issues, `${issuePath}.style`, 'must be an object');\n else requiredString(value['style']['color'], `${issuePath}.style.color`, issues);\n break;\n case 'gauge':\n if (value['title'] !== undefined)\n requiredString(value['title'], `${issuePath}.title`, issues, true);\n requiredBoolean(value['showLegend'], `${issuePath}.showLegend`, issues);\n validateRange(value['data'], `${issuePath}.data`, issues, false);\n validateStyle(value['style'], `${issuePath}.style`, issues, 'optional', 'chart', [\n 'legend',\n 'title',\n 'fill',\n 'track',\n ]);\n break;\n case 'progress':\n if (value['title'] !== undefined)\n requiredString(value['title'], `${issuePath}.title`, issues, true);\n validateProgressData(value['data'], `${issuePath}.data`, issues);\n validateStyle(value['style'], `${issuePath}.style`, issues, 'optional', 'chart', [\n 'legend',\n 'title',\n 'track',\n ]);\n if (isRecord(value['style'])) {\n const radius = value['style']['radius'];\n if (radius !== undefined && radius !== null) {\n if (!isRecord(radius))\n addIssue(issues, `${issuePath}.style.radius`, 'must be an object, null, or undefined');\n else {\n requiredNumber(radius['segment'], `${issuePath}.style.radius.segment`, issues);\n requiredNumber(radius['track'], `${issuePath}.style.radius.track`, issues);\n }\n }\n }\n requiredBoolean(value['showLegend'], `${issuePath}.showLegend`, issues);\n break;\n case 'pie':\n case 'donut':\n case 'funnel':\n case 'bar':\n case 'line':\n if (value['title'] !== undefined)\n requiredString(value['title'], `${issuePath}.title`, issues, true);\n requiredBoolean(value['showLegend'], `${issuePath}.showLegend`, issues);\n validateDataPoints(value['data'], `${issuePath}.data`, issues, value['type'] === 'line');\n validateStyle(\n value['style'],\n `${issuePath}.style`,\n issues,\n value['type'] === 'pie' || value['type'] === 'donut' || value['type'] === 'funnel'\n ? 'forbidden'\n : 'required',\n 'chart',\n value['type'] === 'bar' || value['type'] === 'line'\n ? ['legend', 'title', 'line']\n : ['legend', 'title'],\n );\n break;\n }\n}\n\nfunction validateRange(\n value: unknown,\n path: string,\n issues: WidgetValidationIssue[],\n hasLabel: boolean,\n): void {\n if (!isRecord(value)) {\n addIssue(issues, path, 'must be an object');\n return;\n }\n if (hasLabel) requiredString(value['label'], `${path}.label`, issues, true);\n if (hasLabel) {\n optionalString(value['separator'], `${path}.separator`, issues);\n optionalString(value['suffix'], `${path}.suffix`, issues);\n }\n requiredNumber(value['value'], `${path}.value`, issues);\n requiredNumber(value['min'], `${path}.min`, issues);\n requiredNumber(value['max'], `${path}.max`, issues);\n if (\n isFiniteNumber(value['min']) &&\n isFiniteNumber(value['max']) &&\n value['min'] >= value['max']\n ) {\n addIssue(issues, path, 'minimum must be less than maximum');\n }\n}\n\nfunction optionalString(value: unknown, path: string, issues: WidgetValidationIssue[]): void {\n if (value !== undefined && value !== null && !isString(value)) {\n addIssue(issues, path, 'must be a string, null, or undefined');\n }\n}\n\nfunction validateWidget(value: unknown): WidgetValidationIssue[] {\n const issues: WidgetValidationIssue[] = [];\n if (!isRecord(value)) return [{ path: '$', message: 'must be an object' }];\n if (value['version'] !== 2) addIssue(issues, 'version', 'must be 2');\n requiredString(value['id'], 'id', issues, true);\n if (\n !isOneOf(value['size'], [\n 'mini',\n 'compact',\n 'tall',\n 'square',\n 'wide',\n 'mega',\n 'banner',\n 'hero',\n ] as const)\n )\n addIssue(issues, 'size', 'must be mini, compact, tall, square, wide, mega, banner, or hero');\n for (const key of ['rows', 'columns'] as const) {\n if (!Array.isArray(value[key]) || value[key].length === 0) {\n addIssue(issues, key, 'must be a non-empty array');\n continue;\n }\n value[key].forEach((track, index) => {\n const path = `${key}[${index}]`;\n if (!isRecord(track)) {\n addIssue(issues, path, 'must be an object');\n return;\n }\n const unit = track['unit'];\n if (!isOneOf(unit, gridUnits)) addIssue(issues, `${path}.unit`, 'has an unsupported value');\n if (unit === 'auto') {\n if (track['size'] !== undefined)\n addIssue(issues, `${path}.size`, 'must not be set for auto tracks');\n } else {\n requiredNumber(track['size'], `${path}.size`, issues, 0);\n }\n });\n }\n const background = value['background'];\n if (!isRecord(background)) addIssue(issues, 'background', 'must be an object');\n else {\n requiredBoolean(background['sensitive'], 'background.sensitive', issues);\n requiredBoolean(background['repeat'], 'background.repeat', issues);\n if (!isOneOf(background['size'], ['cover', 'contain', 'auto'] as const))\n addIssue(issues, 'background.size', 'has an unsupported value');\n if (!isOneOf(background['anchor'], anchors))\n addIssue(issues, 'background.anchor', 'has an unsupported value');\n if (background['image'] !== undefined)\n requiredString(background['image'], 'background.image', issues, true);\n }\n const refresh = value['refresh'];\n if (refresh !== undefined && refresh !== null && !isRecord(refresh))\n addIssue(issues, 'refresh', 'must be an object or null');\n else if (isRecord(refresh)) {\n requiredBoolean(refresh['enabled'], 'refresh.enabled', issues);\n requiredString(refresh['label'], 'refresh.label', issues, true);\n }\n if (!Array.isArray(value['elements'])) addIssue(issues, 'elements', 'must be an array');\n else {\n value['elements'].forEach((element, index) =>\n validateElement(element, `elements[${index}]`, issues),\n );\n }\n return issues;\n}\n\nfunction runRule(rule: WidgetValidationRuleInput, widget: WidgetInput): WidgetValidationIssue[] {\n const mode = typeof rule === 'function' ? 'block' : (rule.mode ?? 'block');\n try {\n const issues = typeof rule === 'function' ? rule(widget) : rule.validate(widget);\n return issues.map((issue) => ({ ...issue, severity: mode }));\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n return [{ path: '', message: `Validation rule failed: ${reason}`, severity: mode }];\n }\n}\n\nexport function safeParseWidgetInput(\n value: unknown,\n options: WidgetParseOptions = {},\n): WidgetParseResult {\n const builtInIssues = validateWidget(value);\n if (builtInIssues.length) return { success: false, issues: builtInIssues };\n const data = value as WidgetInput;\n const issues = (options.rules ?? []).flatMap((rule) => runRule(rule, data));\n return issues.some((issue) => issue.severity === 'block')\n ? { success: false, issues }\n : { success: true, data, issues };\n}\n\nexport function parseWidgetInput(value: unknown, options: WidgetParseOptions = {}): WidgetInput {\n const result = safeParseWidgetInput(value, options);\n if (!result.success) throw new WidgetValidationError(result.issues);\n return result.data;\n}\n\nexport function isWidgetContract(value: unknown): value is WidgetContract {\n const result = safeParseWidgetInput(value);\n return result.success;\n}\n\nexport function isWidget(value: unknown): value is Widget {\n const result = safeParseWidgetInput(value);\n return result.success;\n}\n","import { safeParseWidgetInput } from './widget-validation';\nimport { WidgetElementContract, WidgetInput } from './widget.model';\n\n/**\n * Version prefix of the fingerprint algorithm. Change it whenever the set of\n * fingerprinted properties or the canonical encoding changes.\n */\nexport const WIDGET_FINGERPRINT_VERSION = 1;\n\ntype CanonicalValue =\n | string\n | number\n | boolean\n | null\n | undefined\n | CanonicalValue[]\n | { [key: string]: CanonicalValue };\n\n/**\n * Computes a stable fingerprint of a widget's look, for example to gate\n * user-built widgets behind an approval step. Content that may vary per\n * visitor (text, labels, alt text, titles, chart data, button URLs and bodies,\n * the widget id, and the refresh label) is ignored; only whether text, labels,\n * alt text, and titles are empty is included. Returns `null` for invalid input.\n */\nexport function computeWidgetFingerprint(input: unknown): string | null {\n const result = safeParseWidgetInput(input);\n if (!result.success) return null;\n const canonical = canonicalJson(widgetShape(result.data));\n return `wfp:${WIDGET_FINGERPRINT_VERSION}:${sha256Hex(new TextEncoder().encode(canonical))}`;\n}\n\nfunction widgetShape(widget: WidgetInput): CanonicalValue {\n return {\n version: widget.version,\n size: widget.size,\n rows: widget.rows as unknown as CanonicalValue,\n columns: widget.columns as unknown as CanonicalValue,\n background: widget.background as unknown as CanonicalValue,\n refresh: { enabled: widget.refresh?.enabled ?? false },\n elements: widget.elements.map(elementShape),\n };\n}\n\nfunction hasContent(value: string | null | undefined): boolean {\n return (value ?? '').trim().length > 0;\n}\n\nfunction elementShape(element: WidgetElementContract): CanonicalValue {\n const base = { type: element.type, grid: element.grid as unknown as CanonicalValue };\n switch (element.type) {\n case 'text':\n return {\n ...base,\n sensitive: element.sensitive,\n hasText: hasContent(element.text),\n style: {\n ...(element.style as unknown as Record<string, CanonicalValue>),\n font: {\n size: element.style.font.size,\n bold: element.style.font.bold ?? false,\n italic: element.style.font.italic ?? false,\n underline: element.style.font.underline ?? false,\n strikethrough: element.style.font.strikethrough ?? false,\n },\n padding: (element.style.padding ?? {\n vertical: 0,\n horizontal: 0,\n }) as unknown as CanonicalValue,\n },\n };\n case 'image':\n return {\n ...base,\n sensitive: element.sensitive,\n source: element.source,\n hasAlt: hasContent(element.alt),\n fit: element.fit,\n overlayColor: element.overlayColor,\n radius: element.radius,\n };\n case 'button':\n return {\n ...base,\n sensitive: element.sensitive,\n hasLabel: hasContent(element.label),\n method: element.method,\n requestRefresh: element.requestRefresh ?? false,\n showOnlyOnHover: element.showOnlyOnHover ?? false,\n style: element.style,\n };\n case 'divider':\n return {\n ...base,\n orientation: element.orientation,\n style: element.style as unknown as CanonicalValue,\n };\n default:\n return {\n ...base,\n sensitive: element.sensitive,\n hasTitle: hasContent(element.title),\n showLegend: element.showLegend,\n style: element.style as unknown as CanonicalValue,\n };\n }\n}\n\nfunction canonicalJson(value: CanonicalValue): string {\n if (value === null || value === undefined) return 'null';\n if (typeof value === 'boolean') return value ? 'true' : 'false';\n if (typeof value === 'number') return canonicalNumber(value);\n if (typeof value === 'string') return canonicalString(value);\n if (Array.isArray(value)) return `[${value.map(canonicalJson).join(',')}]`;\n const entries = Object.keys(value)\n .filter((key) => value[key] !== undefined && value[key] !== null)\n .sort(compareOrdinal)\n .map((key) => `${canonicalString(key)}:${canonicalJson(value[key])}`);\n return `{${entries.join(',')}}`;\n}\n\nfunction compareOrdinal(left: string, right: string): number {\n return left < right ? -1 : left > right ? 1 : 0;\n}\n\nfunction canonicalNumber(value: number): string {\n const fixed = value.toFixed(6).replace(/\\.?0+$/, '');\n return fixed === '-0' ? '0' : fixed;\n}\n\nfunction canonicalString(value: string): string {\n const normalized = value.startsWith('#') ? value.toLowerCase() : value;\n let output = '\"';\n for (const character of normalized) {\n const code = character.charCodeAt(0);\n if (character === '\"' || character === '\\\\') output += `\\\\${character}`;\n else if (code < 0x20) output += `\\\\u${code.toString(16).padStart(4, '0')}`;\n else output += character;\n }\n return `${output}\"`;\n}\n\nconst roundConstants = new Uint32Array([\n 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\n 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\n 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\n 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\n 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2,\n]);\n\nfunction sha256Hex(message: Uint8Array): string {\n const bitLength = message.length * 8;\n const paddedLength = Math.ceil((message.length + 9) / 64) * 64;\n const bytes = new Uint8Array(paddedLength);\n bytes.set(message);\n bytes[message.length] = 0x80;\n const view = new DataView(bytes.buffer);\n view.setUint32(paddedLength - 8, Math.floor(bitLength / 0x100000000));\n view.setUint32(paddedLength - 4, bitLength >>> 0);\n\n const hash = new Uint32Array([\n 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19,\n ]);\n const words = new Uint32Array(64);\n const rotate = (value: number, bits: number) => (value >>> bits) | (value << (32 - bits));\n\n for (let offset = 0; offset < paddedLength; offset += 64) {\n for (let index = 0; index < 16; index++) words[index] = view.getUint32(offset + index * 4);\n for (let index = 16; index < 64; index++) {\n const w15 = words[index - 15];\n const w2 = words[index - 2];\n const s0 = rotate(w15, 7) ^ rotate(w15, 18) ^ (w15 >>> 3);\n const s1 = rotate(w2, 17) ^ rotate(w2, 19) ^ (w2 >>> 10);\n words[index] = words[index - 16] + s0 + words[index - 7] + s1;\n }\n let [a, b, c, d, e, f, g, h] = hash;\n for (let index = 0; index < 64; index++) {\n const s1 = rotate(e, 6) ^ rotate(e, 11) ^ rotate(e, 25);\n const choice = (e & f) ^ (~e & g);\n const temp1 = (h + s1 + choice + roundConstants[index] + words[index]) >>> 0;\n const s0 = rotate(a, 2) ^ rotate(a, 13) ^ rotate(a, 22);\n const majority = (a & b) ^ (a & c) ^ (b & c);\n const temp2 = (s0 + majority) >>> 0;\n h = g;\n g = f;\n f = e;\n e = (d + temp1) >>> 0;\n d = c;\n c = b;\n b = a;\n a = (temp1 + temp2) >>> 0;\n }\n hash[0] += a;\n hash[1] += b;\n hash[2] += c;\n hash[3] += d;\n hash[4] += e;\n hash[5] += f;\n hash[6] += g;\n hash[7] += h;\n }\n return Array.from(hash, (word) => word.toString(16).padStart(8, '0')).join('');\n}\n","import { GridTrack, WidgetElement, WidgetSize } from './widget.model';\n\nexport const WIDGET_HEIGHT = 245;\nexport const WIDGET_PADDING = 18;\nexport const WIDGET_GAP = 8;\nexport const WIDGET_CELL_WIDTH = 133;\nexport const WIDGET_CELL_HEIGHT = 123;\n\nconst footprintBySize: Record<WidgetSize, { columns: number; rows: number }> = {\n mini: { columns: 1, rows: 1 },\n compact: { columns: 2, rows: 1 },\n tall: { columns: 1, rows: 2 },\n square: { columns: 2, rows: 2 },\n wide: { columns: 4, rows: 2 },\n mega: { columns: 4, rows: 4 },\n banner: { columns: 2, rows: 4 },\n hero: { columns: 8, rows: 4 },\n};\n\nexport function widgetFootprint(size: WidgetSize | unknown): { columns: number; rows: number } {\n return typeof size === 'string' && size in footprintBySize\n ? footprintBySize[size as WidgetSize]\n : footprintBySize.square;\n}\n\nexport function gridSpanSize(span: number, cellSize: number): number {\n return span * cellSize + Math.max(0, span - 1) * WIDGET_GAP;\n}\n\nexport function widgetWidth(size: WidgetSize | unknown): number {\n return gridSpanSize(widgetFootprint(size).columns, WIDGET_CELL_WIDTH);\n}\n\nexport function widgetHeight(size: WidgetSize | unknown): number {\n return gridSpanSize(widgetFootprint(size).rows, WIDGET_CELL_HEIGHT);\n}\n\nexport function gridTemplate(tracks: GridTrack[]): string {\n return tracks\n .map((track) =>\n track.unit === 'auto' ? 'auto' : `${track.size}${track.unit === 'star' ? 'fr' : 'px'}`,\n )\n .join(' ');\n}\n\nexport function elementGridStyle(element: WidgetElement): Record<string, string> {\n return {\n 'grid-row': `${element.grid.row + 1} / span ${element.grid.rowSpan}`,\n 'grid-column': `${element.grid.column + 1} / span ${element.grid.columnSpan}`,\n };\n}\n","import { Component, input, output, signal } from '@angular/core';\nimport { ChartElementRenderer } from './chart-element-renderer';\nimport {\n ButtonElement,\n ChartElement,\n ImageElement,\n ProgressElement,\n TextElement,\n WidgetElement,\n} from './widget.model';\nimport { defaultWidgetRendererLocale, WidgetRendererLocale } from './widget-locale';\n\n@Component({\n selector: 'widget-element-renderer',\n templateUrl: './widget-element-renderer.html',\n styleUrl: './widget-element-renderer.css',\n imports: [ChartElementRenderer],\n host: {\n '[style.grid-row]': 'gridRow()',\n '[style.grid-column]': 'gridColumn()',\n },\n})\nexport class WidgetElementRenderer {\n readonly element = input.required<WidgetElement>();\n readonly sensitiveVisible = input(false);\n readonly locale = input<WidgetRendererLocale>(defaultWidgetRendererLocale);\n readonly actionRequested = output<{ element: ButtonElement; event: Event }>();\n private readonly failedImage = signal<{ element: ImageElement; source: string } | null>(null);\n\n protected isText(element: WidgetElement): element is TextElement {\n return element.type === 'text';\n }\n protected isImage(element: WidgetElement): element is ImageElement {\n return element.type === 'image';\n }\n protected isButton(element: WidgetElement): element is ButtonElement {\n return element.type === 'button';\n }\n protected isChart(element: WidgetElement): element is ChartElement | ProgressElement {\n return ['pie', 'donut', 'funnel', 'gauge', 'bar', 'line', 'progress'].includes(element.type);\n }\n protected isSensitive(element: WidgetElement): boolean {\n return ('sensitive' in element ? element.sensitive : false) && !this.sensitiveVisible();\n }\n protected sensitiveBlur(element: WidgetElement): string | null {\n if (!element.sensitive) return null;\n if (element.type !== 'text') return '2px';\n return `${Math.min(Math.max(element.style.font.size * 0.25, 2), 10)}px`;\n }\n protected elementAlt(element: ImageElement): string {\n return this.isSensitive(element) ? '' : element.alt;\n }\n protected imageFailed(element: ImageElement): boolean {\n const failedImage = this.failedImage();\n return failedImage?.element === element && failedImage.source === element.source;\n }\n protected imageLoadFailed(element: ImageElement): void {\n this.failedImage.set({ element, source: element.source });\n }\n protected requestAction(element: ButtonElement, event: Event): void {\n if (this.isSensitive(element)) return;\n this.actionRequested.emit({ element, event });\n }\n protected horizontalAnchor(anchor: string): string {\n return anchor.endsWith('left')\n ? 'flex-start'\n : anchor.endsWith('right')\n ? 'flex-end'\n : 'center';\n }\n protected verticalAnchor(anchor: string): string {\n return anchor.startsWith('top')\n ? 'flex-start'\n : anchor.startsWith('bottom')\n ? 'flex-end'\n : 'center';\n }\n protected textFontWeight(element: TextElement): number {\n return element.style.font.bold ? 700 : 400;\n }\n protected textFontStyle(element: TextElement): 'normal' | 'italic' {\n return element.style.font.italic ? 'italic' : 'normal';\n }\n protected textFontDecoration(element: TextElement): string {\n return (\n [\n element.style.font.underline && 'underline',\n element.style.font.strikethrough && 'line-through',\n ]\n .filter(Boolean)\n .join(' ') || 'none'\n );\n }\n protected elementId(element: WidgetElement): string | null {\n return 'id' in element ? (element as WidgetElement & { id: string }).id : null;\n }\n protected gridRow(): string {\n return `${this.element().grid.row + 1} / span ${this.element().grid.rowSpan}`;\n }\n protected gridColumn(): string {\n return `${this.element().grid.column + 1} / span ${this.element().grid.columnSpan}`;\n }\n}\n","@let item = element();\n<div\n class=\"widget-element\"\n [attr.data-widget-element-id]=\"elementId(item)\"\n [attr.aria-hidden]=\"isSensitive(item) ? 'true' : null\"\n [class.is-sensitive]=\"isSensitive(item)\"\n>\n <div\n class=\"element-content\"\n [class.is-sensitive]=\"isSensitive(item)\"\n [style.--sensitive-blur]=\"sensitiveBlur(item)\"\n [style.justify-content]=\"\n isChart(item) && item.type !== 'progress'\n ? 'stretch'\n : horizontalAnchor(item.grid.anchor ?? 'center')\n \"\n [style.align-items]=\"\n isChart(item) && item.type !== 'progress'\n ? 'stretch'\n : verticalAnchor(item.grid.anchor ?? 'center')\n \"\n >\n @if (isText(item)) {\n @let text = item;\n <span\n class=\"text-element\"\n [style.color]=\"text.style.color\"\n [style.font-size.px]=\"text.style.font.size\"\n [style.font-weight]=\"textFontWeight(text)\"\n [style.font-style]=\"textFontStyle(text)\"\n [style.text-decoration]=\"textFontDecoration(text)\"\n [style.text-align]=\"text.style.align\"\n [style.white-space]=\"text.style.wrap ? 'pre-wrap' : 'pre'\"\n [style.background-color]=\"text.style.background || null\"\n [style.border-radius.px]=\"text.style.radius\"\n [style.padding]=\"\n text.style.padding\n ? text.style.padding.vertical + 'px ' + text.style.padding.horizontal + 'px'\n : null\n \"\n >{{ text.text }}</span\n >\n } @else if (isImage(item)) {\n @let image = item;\n @if (imageFailed(image)) {\n <div\n class=\"image-placeholder\"\n role=\"img\"\n [attr.aria-label]=\"elementAlt(image) || locale().aria.imageUnavailable\"\n [style.border-radius.px]=\"image.radius\"\n >\n <svg aria-hidden=\"true\" viewBox=\"0 0 64 48\" focusable=\"false\">\n <rect x=\"2\" y=\"2\" width=\"60\" height=\"44\" rx=\"5\" />\n <circle cx=\"20\" cy=\"17\" r=\"5\" />\n <path d=\"m8 39 15-14 9 8 7-6 17 12\" />\n </svg>\n </div>\n } @else {\n <img\n [src]=\"image.source\"\n [alt]=\"elementAlt(image)\"\n [style.object-fit]=\"image.fit\"\n [style.object-position]=\"image.grid.anchor ?? 'center'\"\n [style.border-radius.px]=\"image.radius\"\n (error)=\"imageLoadFailed(image)\"\n />\n }\n <span\n class=\"image-overlay\"\n [style.background-color]=\"image.overlayColor || 'transparent'\"\n [style.border-radius.px]=\"image.radius\"\n ></span>\n } @else if (isButton(item)) {\n @let button = item;\n <button\n type=\"button\"\n class=\"action-button\"\n [class.solid]=\"button.style === 'solid'\"\n [class.outline]=\"button.style === 'outline'\"\n [class.show-only-on-hover]=\"button.showOnlyOnHover\"\n [disabled]=\"isSensitive(button)\"\n (click)=\"requestAction(button, $event)\"\n [tabindex]=\"isSensitive(button) ? -1 : 0\"\n >\n {{ button.label }}\n </button>\n } @else if (item.type === 'divider') {\n @let divider = item;\n <div\n class=\"divider-element\"\n [class.is-vertical]=\"divider.orientation === 'vertical'\"\n role=\"separator\"\n [attr.aria-orientation]=\"divider.orientation\"\n [style.background-color]=\"divider.style.color\"\n ></div>\n } @else if (isChart(item)) {\n @let chart = item;\n @defer (on immediate) {\n <widget-chart-element\n [class.is-progress]=\"chart.type === 'progress'\"\n [element]=\"chart\"\n [sensitiveHidden]=\"isSensitive(chart)\"\n [locale]=\"locale()\"\n />\n } @placeholder {\n <div class=\"chart-placeholder\" aria-hidden=\"true\"></div>\n }\n }\n </div>\n</div>\n","import { Component, input } from '@angular/core';\nimport { Widget } from './widget.model';\nimport { defaultWidgetRendererLocale, WidgetRendererLocale } from './widget-locale';\n\n@Component({\n selector: 'widget-skeleton',\n templateUrl: './widget-skeleton.html',\n styleUrl: './widget-skeleton.css',\n})\nexport class WidgetSkeleton {\n readonly size = input.required<Widget['size']>();\n readonly darkMode = input(false);\n readonly locale = input<WidgetRendererLocale>(defaultWidgetRendererLocale);\n}\n","<div\n class=\"widget-skeleton\"\n [class.is-mini]=\"size() === 'mini'\"\n [class.is-compact]=\"size() === 'compact'\"\n [class.is-tall]=\"size() === 'tall'\"\n [class.is-wide]=\"size() === 'wide'\"\n [class.is-mega]=\"size() === 'mega'\"\n [class.is-banner]=\"size() === 'banner'\"\n [class.is-hero]=\"size() === 'hero'\"\n [class.is-dark]=\"darkMode()\"\n role=\"status\"\n [attr.aria-label]=\"locale().aria.loading\"\n>\n <div class=\"skeleton-toolbar\"></div>\n <div class=\"skeleton-content\">\n <span class=\"skeleton-line skeleton-line-small\"></span>\n <span class=\"skeleton-line skeleton-line-title\"></span>\n <span class=\"skeleton-line skeleton-line-copy\"></span>\n <span class=\"skeleton-chart\"></span>\n <span class=\"skeleton-button\"></span>\n </div>\n</div>\n","import { Component, input } from '@angular/core';\nimport { BackgroundConfig } from './widget.model';\n\n@Component({\n selector: 'widget-background',\n template: `<div\n class=\"widget-background\"\n [class.is-sensitive]=\"sensitive()\"\n style=\"background-image: none\"\n >\n <div\n class=\"widget-background-image\"\n [class.is-sensitive]=\"sensitive()\"\n [style.background-image]=\"image()\"\n [style.background-size]=\"background().size\"\n [style.background-position]=\"background().anchor\"\n [style.background-repeat]=\"background().repeat ? 'repeat' : 'no-repeat'\"\n ></div>\n </div>\n <div\n class=\"widget-overlay\"\n [style.background-color]=\"background().overlayColor || 'transparent'\"\n ></div>`,\n styles: [\n `\n :host {\n position: absolute;\n inset: 0;\n }\n .widget-background {\n position: absolute;\n inset: 0;\n }\n .widget-background-image {\n position: absolute;\n inset: 0;\n background-position: center;\n background-repeat: no-repeat;\n background-size: cover;\n transition: filter var(--widget-renderer-transition-duration, 160ms)\n var(--widget-renderer-transition-easing, ease);\n }\n .widget-background-image.is-sensitive {\n inset: -18px;\n filter: blur(18px);\n transform: scale(1.04);\n }\n .widget-overlay {\n position: absolute;\n inset: 0;\n pointer-events: none;\n z-index: 0;\n }\n `,\n ],\n})\nexport class WidgetBackground {\n readonly background = input.required<BackgroundConfig>();\n readonly sensitive = input(false);\n readonly image = input('none');\n}\n","import { Component, input, output } from '@angular/core';\nimport { RefreshConfig } from './widget.model';\nimport { defaultWidgetRendererLocale, WidgetRendererLocale } from './widget-locale';\n\n@Component({\n selector: 'widget-toolbar',\n template: `<div class=\"widget-toolbar\" [attr.aria-label]=\"locale().aria.toolbarActions\">\n @if (refresh()?.enabled) {\n <button\n type=\"button\"\n class=\"icon-button\"\n [attr.aria-label]=\"refresh()?.label\"\n [title]=\"refresh()?.label\"\n (click)=\"refreshRequested.emit()\"\n >\n ↻\n </button>\n }\n @if (hasSensitiveElements()) {\n <button\n type=\"button\"\n class=\"icon-button\"\n [attr.aria-label]=\"\n sensitiveVisible() ? locale().aria.hideSensitiveData : locale().aria.showSensitiveData\n \"\n [title]=\"\n sensitiveVisible() ? locale().aria.hideSensitiveData : locale().aria.showSensitiveData\n \"\n (click)=\"sensitiveToggled.emit()\"\n >\n @if (sensitiveVisible()) {\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" focusable=\"false\">\n <path d=\"M2 12s3.5-6 10-6 10 6 10 6-3.5 6-10 6S2 12 2 12Z\" />\n <circle cx=\"12\" cy=\"12\" r=\"2.5\" />\n </svg>\n } @else {\n <svg aria-hidden=\"true\" viewBox=\"0 0 24 24\" focusable=\"false\">\n <path\n d=\"m3 3 18 18M10.6 5.3A10.7 10.7 0 0 1 12 5c6.5 0 10 7 10 7a18.4 18.4 0 0 1-3.1 3.8M6.2 6.2C3.5 8 2 12 2 12s3.5 7 10 7a10.7 10.7 0 0 1-3.4-.6\"\n />\n </svg>\n }\n </button>\n }\n </div>`,\n styles: [\n `\n :host {\n position: absolute;\n top: 8px;\n right: 8px;\n z-index: 3;\n }\n .widget-toolbar {\n display: flex;\n gap: 4px;\n opacity: 0;\n transform: translateY(-4px);\n transition:\n opacity var(--widget-renderer-transition-duration, 160ms)\n var(--widget-renderer-transition-easing, ease),\n transform var(--widget-renderer-transition-duration, 160ms)\n var(--widget-renderer-transition-easing, ease);\n }\n :host-context(.widget-shell:hover) .widget-toolbar,\n :host-context(.widget-shell:focus-within) .widget-toolbar {\n opacity: 1;\n transform: translateY(0);\n }\n .icon-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n pointer-events: var(--widget-renderer-actions-pointer-events, auto);\n width: var(--widget-renderer-control-size, 28px);\n height: var(--widget-renderer-control-size, 28px);\n border: 1px solid var(--widget-renderer-control-border, #ffffff38);\n border-radius: var(--widget-renderer-radius, 8px);\n background: var(--widget-renderer-control-background, #10182ccc);\n color: var(--widget-renderer-action-color, #fff);\n cursor: pointer;\n }\n .icon-button svg {\n width: 16px;\n height: 16px;\n fill: none;\n stroke: currentColor;\n stroke-linecap: round;\n stroke-linejoin: round;\n stroke-width: 1.8;\n }\n .icon-button:hover,\n .icon-button:focus-visible {\n border-color: var(--widget-renderer-control-hover-border, #17233c);\n background: var(--widget-renderer-control-hover-background, #fff);\n color: var(--widget-renderer-control-hover-color, #17233c);\n }\n `,\n ],\n})\nexport class WidgetToolbar {\n readonly refresh = input<RefreshConfig | null>(null);\n readonly hasSensitiveElements = input(false);\n readonly sensitiveVisible = input(false);\n readonly locale = input<WidgetRendererLocale>(defaultWidgetRendererLocale);\n readonly refreshRequested = output<void>();\n readonly sensitiveToggled = output<void>();\n}\n","import { Component, input } from '@angular/core';\nimport { WidgetValidationIssue } from './widget-validation';\n\n@Component({\n selector: 'widget-validation-overlay',\n template: `<div class=\"widget-validation-overlay\" role=\"alert\" aria-live=\"polite\">\n <strong class=\"widget-validation-title\">Widget validation failed</strong>\n <ul class=\"widget-validation-issues\">\n @for (issue of issues(); track $index) {\n <li>\n <code>{{ issue.path }}</code\n >: {{ issue.message }}\n </li>\n }\n </ul>\n </div>`,\n styles: [\n `\n :host {\n position: absolute;\n inset: 0;\n z-index: 2;\n }\n .widget-validation-overlay {\n height: 100%;\n display: flex;\n flex-direction: column;\n gap: 8px;\n box-sizing: border-box;\n overflow: auto;\n padding: var(--widget-renderer-content-padding, 18px);\n border: 1px solid #e06a6a;\n background: #fff4f4ef;\n color: #7f1d1d;\n pointer-events: auto;\n }\n .widget-validation-title {\n font-size: 13px;\n }\n .widget-validation-issues {\n display: grid;\n gap: 4px;\n margin: 0;\n padding-inline-start: 18px;\n font:\n 12px/1.4 ui-monospace,\n SFMono-Regular,\n Consolas,\n monospace;\n }\n .widget-validation-issues code {\n font: inherit;\n font-weight: 700;\n }\n :host-context(html[data-theme='dark']) .widget-validation-overlay {\n border-color: #f08a8a;\n background: #3b1717ef;\n color: #ffd6d6;\n }\n `,\n ],\n})\nexport class WidgetValidationOverlay {\n readonly issues = input.required<WidgetValidationIssue[]>();\n}\n","import {\n Component,\n computed,\n effect,\n ElementRef,\n inject,\n input,\n OnDestroy,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { WidgetElementRenderer } from './widget-element-renderer';\nimport { WidgetSkeleton } from './widget-skeleton';\nimport { WidgetBackground } from './widget-background';\nimport { WidgetToolbar } from './widget-toolbar';\nimport { WidgetValidationOverlay } from './widget-validation-overlay';\nimport { ButtonElement, Widget, WidgetInput } from './widget.model';\nimport { normalizeWidgetInput } from './widget-hydration';\nimport { safeParseWidgetInput, WidgetValidationRuleInput } from './widget-validation';\nimport {\n gridTemplate,\n widgetHeight as getWidgetHeight,\n widgetWidth as getWidgetWidth,\n} from './widget-layout';\nimport { WidgetTooltip } from './widget-tooltip';\nimport {\n defaultWidgetRendererLocale,\n WidgetRendererLocale,\n WidgetRendererLocaleOverrides,\n} from './widget-locale';\n\nexport type WidgetLoading = boolean | Widget['size'];\n\n@Component({\n selector: 'widget-renderer',\n templateUrl: './widget-renderer.html',\n styleUrl: './widget-renderer.css',\n providers: [WidgetTooltip],\n imports: [\n WidgetElementRenderer,\n WidgetSkeleton,\n WidgetBackground,\n WidgetToolbar,\n WidgetValidationOverlay,\n ],\n})\nexport class WidgetRenderer implements OnDestroy {\n readonly widget = input<WidgetInput | null>(null);\n readonly loading = input<WidgetLoading>(false);\n readonly darkMode = input(false);\n readonly locale = input<WidgetRendererLocaleOverrides>({});\n readonly validationRules = input<readonly WidgetValidationRuleInput[]>([]);\n readonly refreshRequested = output<void>();\n readonly actionRequested = output<{ element: ButtonElement; event: Event }>();\n readonly sensitiveVisible = signal(false);\n protected readonly tooltip = inject(WidgetTooltip);\n private readonly tooltipLayer = viewChild<ElementRef<HTMLElement>>('tooltipLayer');\n private readonly parsedWidget = computed(() => {\n const widget = this.widget();\n return widget === null\n ? { success: false as const, issues: [] }\n : safeParseWidgetInput(widget, { rules: this.validationRules() });\n });\n protected readonly isLoading = computed(() => this.loading() !== false);\n protected readonly resolvedLocale = computed<WidgetRendererLocale>(() => ({\n ...defaultWidgetRendererLocale,\n aria: {\n ...defaultWidgetRendererLocale.aria,\n ...this.locale().aria,\n chart: { ...defaultWidgetRendererLocale.aria.chart, ...this.locale().aria?.chart },\n },\n }));\n protected readonly loadingSize = computed<Widget['size']>(() => {\n const loading = this.loading();\n return typeof loading === 'string' ? loading : 'square';\n });\n readonly validationIssues = computed(() => this.parsedWidget().issues);\n protected readonly blockingIssues = computed(() =>\n this.validationIssues().filter((issue) => issue.severity !== 'report'),\n );\n protected readonly renderWidget = computed<Widget>(() => {\n const result = this.parsedWidget();\n if (!result.success) {\n return { ...emptyWidget, size: widgetSizeOrSquare(this.widget()?.size) };\n }\n return {\n ...normalizeWidgetInput(result.data),\n refresh: result.data.refresh ?? emptyWidget.refresh,\n } as Widget;\n });\n readonly hasSensitiveElements = computed(() => {\n const widget = this.renderWidget();\n return (\n widget.background.sensitive ||\n widget.elements.some((element) => 'sensitive' in element && element.sensitive)\n );\n });\n readonly backgroundSensitive = computed(() => {\n const widget = this.renderWidget();\n return widget.background.sensitive && !this.sensitiveVisible();\n });\n readonly gridRows = computed(() => gridTemplate(this.renderWidget().rows));\n readonly gridColumns = computed(() => gridTemplate(this.renderWidget().columns));\n readonly widgetWidth = computed(() => getWidgetWidth(this.renderWidget().size));\n readonly widgetHeight = computed(() => getWidgetHeight(this.renderWidget().size));\n readonly backgroundImage = computed(() => {\n const image = this.renderWidget().background.image;\n return image ? `url(\"${image}\")` : 'none';\n });\n\n constructor() {\n effect(() => {\n this.widget();\n this.sensitiveVisible.set(false);\n });\n effect(() => {\n if (this.loading() !== false) this.sensitiveVisible.set(false);\n });\n effect(() => {\n const layer = this.tooltipLayer()?.nativeElement;\n if (layer) this.tooltip.setOverlay(layer);\n });\n }\n\n ngOnDestroy(): void {\n this.tooltip.clear();\n }\n\n protected toggleSensitive(): void {\n this.sensitiveVisible.update((visible) => !visible);\n }\n}\n\nconst emptyWidget: Widget = {\n version: 2,\n id: 'empty-widget',\n size: 'square',\n rows: [{ size: 1, unit: 'star' }],\n columns: [{ size: 1, unit: 'star' }],\n background: {\n sensitive: false,\n repeat: false,\n size: 'auto',\n anchor: 'center',\n },\n refresh: { enabled: false, label: 'Refresh widget' },\n elements: [],\n};\n\nfunction widgetSizeOrSquare(value: unknown): Widget['size'] {\n return ['mini', 'compact', 'tall', 'square', 'wide', 'mega', 'banner', 'hero'].includes(\n value as Widget['size'],\n )\n ? (value as Widget['size'])\n : 'square';\n}\n","@if (isLoading()) {\n <widget-skeleton [size]=\"loadingSize()\" [darkMode]=\"darkMode()\" [locale]=\"resolvedLocale()\" />\n} @else {\n @let widget = renderWidget();\n <section class=\"widget-shell\" [style.width.px]=\"widgetWidth()\" [style.height.px]=\"widgetHeight()\">\n <div\n class=\"widget-viewport\"\n [style.background-color]=\"widget.background.color || 'transparent'\"\n >\n <widget-background\n [background]=\"widget.background\"\n [sensitive]=\"backgroundSensitive()\"\n [image]=\"backgroundImage()\"\n />\n @if (blockingIssues().length > 0) {\n <widget-validation-overlay [issues]=\"blockingIssues()\" />\n }\n <widget-toolbar\n [refresh]=\"widget.refresh\"\n [hasSensitiveElements]=\"hasSensitiveElements()\"\n [sensitiveVisible]=\"sensitiveVisible()\"\n [locale]=\"resolvedLocale()\"\n (refreshRequested)=\"refreshRequested.emit()\"\n (sensitiveToggled)=\"toggleSensitive()\"\n />\n <div\n class=\"widget-grid\"\n [style.grid-template-rows]=\"gridRows()\"\n [style.grid-template-columns]=\"gridColumns()\"\n >\n @for (element of widget.elements; track $index) {\n <widget-element-renderer\n [element]=\"element\"\n [sensitiveVisible]=\"sensitiveVisible()\"\n [locale]=\"resolvedLocale()\"\n (actionRequested)=\"actionRequested.emit($event)\"\n />\n }\n </div>\n </div>\n <div #tooltipLayer class=\"widget-tooltip-layer\">\n @if (tooltip.state(); as tip) {\n <span\n class=\"chart-tooltip\"\n role=\"tooltip\"\n [style.--tooltip-x.px]=\"tip.x\"\n [style.--tooltip-y.px]=\"tip.y\"\n [style.--tooltip-border]=\"tip.color || 'rgb(0 0 0 / 0.12)'\"\n ><span class=\"tooltip-marker\" [style.background]=\"tip.color\"></span\n ><span>{{ tip.label }}</span\n ><strong>{{ tip.value }}</strong></span\n >\n }\n </div>\n </section>\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,56 @@
1
1
  {
2
2
  "name": "@lieselthuriot/widget-renderer",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "0.2.0",
4
+ "description": "Reusable Angular components for rendering data-driven dashboard widgets.",
5
+ "author": {
6
+ "name": "Liesel Thuriot"
7
+ },
8
+ "license": "MIT",
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "https://github.com/LieselThuriot/widget-studio.git"
12
+ },
13
+ "homepage": "https://github.com/LieselThuriot/widget-studio#readme",
14
+ "bugs": {
15
+ "url": "https://github.com/LieselThuriot/widget-studio/issues"
16
+ },
17
+ "keywords": [
18
+ "angular",
19
+ "dashboard",
20
+ "widget",
21
+ "widget-renderer",
22
+ "charts",
23
+ "svg"
24
+ ],
25
+ "publishConfig": {
26
+ "access": "public"
27
+ },
28
+ "files": [
29
+ "fesm2022",
30
+ "types",
31
+ "README.md",
32
+ "LICENSE"
33
+ ],
34
+ "peerDependencies": {
35
+ "@angular/common": "^21.0.0 || ^22.0.0",
36
+ "@angular/core": "^21.0.0 || ^22.0.0"
37
+ },
38
+ "dependencies": {
39
+ "d3-array": "^3.2.5",
40
+ "d3-shape": "^3.2.1",
41
+ "tslib": "^2.3.0"
42
+ },
43
+ "sideEffects": false,
44
+ "module": "fesm2022/lieselthuriot-widget-renderer.mjs",
45
+ "typings": "types/lieselthuriot-widget-renderer.d.ts",
46
+ "exports": {
47
+ "./package.json": {
48
+ "default": "./package.json"
49
+ },
50
+ ".": {
51
+ "types": "./types/lieselthuriot-widget-renderer.d.ts",
52
+ "default": "./fesm2022/lieselthuriot-widget-renderer.mjs"
53
+ }
54
+ },
55
+ "type": "module"
6
56
  }