@lieselthuriot/widget-renderer 0.0.0-stage → 0.1.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":[],"sources":["../../../projects/widget-renderer/src/lib/widget-hydration.ts","../../../projects/widget-renderer/src/lib/widget-validation.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 interface WidgetValidationIssue {\n path: string;\n message: string;\n}\n\nexport interface WidgetParseSuccess {\n success: true;\n data: WidgetInput;\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\nexport function safeParseWidgetInput(value: unknown): WidgetParseResult {\n const issues = validateWidget(value);\n return issues.length ? { success: false, issues } : { success: true, data: value as WidgetInput };\n}\n\nexport function parseWidgetInput(value: unknown): WidgetInput {\n const result = safeParseWidgetInput(value);\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 { 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, WidgetValidationIssue } 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 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 ? { success: false as const, issues: [] } : safeParseWidgetInput(widget);\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<WidgetValidationIssue[]>(() => {\n const result = this.parsedWidget();\n return result.success ? [] : result.issues;\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 (validationIssues().length > 0) {\n <widget-validation-overlay [issues]=\"validationIssues()\" />\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.progress(); as progress) {\n <span\n class=\"progress-tooltip\"\n role=\"tooltip\"\n [style.--tooltip-x.px]=\"progress.x\"\n [style.--tooltip-y.px]=\"progress.y\"\n [style.--tooltip-border]=\"progress.color || 'rgb(0 0 0 / 0.12)'\"\n ><span class=\"tooltip-marker\" [style.background]=\"progress.color\"></span\n ><span>{{ progress.label }}</span\n ><strong>{{ progress.value }}</strong></span\n >\n }\n </div>\n </section>\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,54 @@
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.1.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
+ "echarts"
23
+ ],
24
+ "publishConfig": {
25
+ "access": "public"
26
+ },
27
+ "files": [
28
+ "fesm2022",
29
+ "types",
30
+ "README.md",
31
+ "LICENSE"
32
+ ],
33
+ "peerDependencies": {
34
+ "@angular/common": "^21.0.0 || ^22.0.0",
35
+ "@angular/core": "^21.0.0 || ^22.0.0",
36
+ "echarts": "^6.1.0"
37
+ },
38
+ "sideEffects": false,
39
+ "module": "fesm2022/lieselthuriot-widget-renderer.mjs",
40
+ "typings": "types/lieselthuriot-widget-renderer.d.ts",
41
+ "exports": {
42
+ "./package.json": {
43
+ "default": "./package.json"
44
+ },
45
+ ".": {
46
+ "types": "./types/lieselthuriot-widget-renderer.d.ts",
47
+ "default": "./fesm2022/lieselthuriot-widget-renderer.mjs"
48
+ }
49
+ },
50
+ "type": "module",
51
+ "dependencies": {
52
+ "tslib": "^2.3.0"
53
+ }
6
54
  }
@@ -0,0 +1,363 @@
1
+ import * as i0 from "@angular/core";
2
+ import { OnDestroy } from "@angular/core";
3
+ export type GridUnit = 'pixel' | 'auto' | 'star';
4
+ export type WidgetElementType = 'text' | 'image' | 'button' | 'divider' | 'pie' | 'donut' | 'funnel' | 'gauge' | 'bar' | 'line' | 'progress';
5
+ export type ButtonMethod = 'get' | 'post';
6
+ export type WidgetSize = 'mini' | 'compact' | 'tall' | 'square' | 'wide' | 'mega' | 'banner' | 'hero';
7
+ export type ElementAnchor = 'top left' | 'top center' | 'top right' | 'center left' | 'center' | 'center right' | 'bottom left' | 'bottom center' | 'bottom right';
8
+ export type GridTrack = {
9
+ size: number;
10
+ unit: 'pixel' | 'star';
11
+ } | {
12
+ size?: never;
13
+ unit: 'auto';
14
+ };
15
+ export interface BackgroundConfig {
16
+ image?: string;
17
+ sensitive: boolean;
18
+ repeat: boolean;
19
+ color?: string;
20
+ size: 'cover' | 'contain' | 'auto';
21
+ anchor: ElementAnchor;
22
+ overlayColor?: string;
23
+ }
24
+ export interface RefreshConfig {
25
+ enabled: boolean;
26
+ label: string;
27
+ }
28
+ export interface TextStyle {
29
+ color: string;
30
+ font: TextFontStyle;
31
+ align: 'left' | 'center' | 'right';
32
+ wrap: boolean;
33
+ background?: string;
34
+ radius?: number;
35
+ padding?: TextPadding | null;
36
+ }
37
+ export interface TextPadding {
38
+ vertical: number;
39
+ horizontal: number;
40
+ }
41
+ export interface ElementGrid {
42
+ row: number;
43
+ column: number;
44
+ rowSpan: number;
45
+ columnSpan: number;
46
+ anchor?: ElementAnchor;
47
+ }
48
+ export interface TextFontStyle {
49
+ size: number;
50
+ bold?: boolean;
51
+ italic?: boolean;
52
+ underline?: boolean;
53
+ strikethrough?: boolean;
54
+ }
55
+ export interface ChartFontStyle {
56
+ size: number;
57
+ }
58
+ export interface WidgetElementBase {
59
+ type: WidgetElementType;
60
+ grid: ElementGrid;
61
+ sensitive: boolean;
62
+ }
63
+ export interface TextElement extends WidgetElementBase {
64
+ type: 'text';
65
+ text: string;
66
+ style: TextStyle;
67
+ }
68
+ export interface ImageElement extends WidgetElementBase {
69
+ type: 'image';
70
+ source: string;
71
+ alt: string;
72
+ fit: 'cover' | 'contain' | 'fill';
73
+ overlayColor?: string;
74
+ radius: number;
75
+ }
76
+ export interface ButtonElement extends WidgetElementBase {
77
+ type: 'button';
78
+ label: string;
79
+ method: ButtonMethod;
80
+ url: string;
81
+ body?: string | null;
82
+ requestRefresh: boolean;
83
+ showOnlyOnHover: boolean;
84
+ style: 'solid' | 'outline';
85
+ }
86
+ export interface DividerElement extends WidgetElementBase {
87
+ type: 'divider';
88
+ orientation: 'horizontal' | 'vertical';
89
+ style: {
90
+ color: string;
91
+ };
92
+ }
93
+ export interface ChartDataPoint {
94
+ label: string;
95
+ value: number;
96
+ color?: string | null;
97
+ }
98
+ export interface ChartElementBase extends WidgetElementBase {
99
+ type: 'pie' | 'donut' | 'funnel' | 'gauge' | 'bar' | 'line' | 'progress';
100
+ title?: string;
101
+ showLegend: boolean;
102
+ }
103
+ export interface DataVisualStyle {
104
+ color: {
105
+ legend: string;
106
+ };
107
+ font: ChartFontStyle;
108
+ }
109
+ export interface ChartStyle extends DataVisualStyle {
110
+ color: DataVisualStyle['color'] & {
111
+ title: string;
112
+ };
113
+ }
114
+ export interface AxisChartStyle extends ChartStyle {
115
+ color: ChartStyle['color'] & {
116
+ line?: string;
117
+ };
118
+ axis: {
119
+ label: string;
120
+ line: string;
121
+ grid: string;
122
+ };
123
+ }
124
+ export interface FillTrackStyle extends DataVisualStyle {
125
+ color: DataVisualStyle['color'] & {
126
+ fill: string;
127
+ track: string;
128
+ };
129
+ }
130
+ export interface ProgressSegment {
131
+ kind: 'segment';
132
+ label: string;
133
+ value: number;
134
+ color: string;
135
+ active: boolean;
136
+ }
137
+ export interface ProgressGap {
138
+ kind: 'gap';
139
+ value: number;
140
+ }
141
+ export type ProgressItem = ProgressSegment | ProgressGap;
142
+ export interface ProgressData {
143
+ min: number;
144
+ max: number;
145
+ items: ProgressItem[];
146
+ }
147
+ export interface ProgressRadius {
148
+ segment: number;
149
+ track: number;
150
+ }
151
+ export interface GaugeData {
152
+ value: number;
153
+ min: number;
154
+ max: number;
155
+ }
156
+ export interface ValueChartStyle extends FillTrackStyle {
157
+ color: FillTrackStyle['color'] & {
158
+ title: string;
159
+ };
160
+ }
161
+ export interface ProgressStyle extends DataVisualStyle {
162
+ color: DataVisualStyle['color'] & {
163
+ title: string;
164
+ track: string;
165
+ };
166
+ radius?: ProgressRadius | null;
167
+ }
168
+ export interface PieElement extends ChartElementBase {
169
+ type: 'pie' | 'donut';
170
+ data: ChartDataPoint[];
171
+ style: ChartStyle;
172
+ }
173
+ export interface FunnelElement extends ChartElementBase {
174
+ type: 'funnel';
175
+ data: ChartDataPoint[];
176
+ style: ChartStyle;
177
+ }
178
+ export interface GaugeElement extends ChartElementBase {
179
+ type: 'gauge';
180
+ data: GaugeData;
181
+ style: ValueChartStyle;
182
+ }
183
+ export interface SeriesElement extends ChartElementBase {
184
+ type: 'bar' | 'line';
185
+ data: ChartDataPoint[];
186
+ style: AxisChartStyle;
187
+ }
188
+ export interface ProgressElement extends ChartElementBase {
189
+ type: 'progress';
190
+ data: ProgressData;
191
+ style: ProgressStyle;
192
+ }
193
+ export type ChartElement = PieElement | FunnelElement | GaugeElement | SeriesElement;
194
+ export type WidgetElement = TextElement | ImageElement | ButtonElement | DividerElement | ChartElement | ProgressElement;
195
+ export type ButtonElementContract = Omit<ButtonElement, 'requestRefresh' | 'showOnlyOnHover'> & {
196
+ requestRefresh?: boolean;
197
+ showOnlyOnHover?: boolean;
198
+ };
199
+ export type WidgetElementContract = TextElement | ImageElement | ButtonElementContract | Omit<DividerElement, 'sensitive'> | ChartElement | ProgressElement;
200
+ export interface Widget {
201
+ version: 2;
202
+ id: string;
203
+ size: WidgetSize;
204
+ rows: GridTrack[];
205
+ columns: GridTrack[];
206
+ background: BackgroundConfig;
207
+ refresh: RefreshConfig;
208
+ elements: WidgetElement[];
209
+ }
210
+ export type WidgetContract = Omit<Widget, 'refresh' | 'elements'> & {
211
+ refresh?: RefreshConfig | null;
212
+ elements: WidgetElementContract[];
213
+ };
214
+ export type WidgetInput = WidgetContract;
215
+ export declare function normalizeWidgetInput(widget: WidgetInput): WidgetInput;
216
+ export interface WidgetValidationIssue {
217
+ path: string;
218
+ message: string;
219
+ }
220
+ export interface WidgetParseSuccess {
221
+ success: true;
222
+ data: WidgetInput;
223
+ }
224
+ export interface WidgetParseFailure {
225
+ success: false;
226
+ issues: WidgetValidationIssue[];
227
+ }
228
+ export type WidgetParseResult = WidgetParseSuccess | WidgetParseFailure;
229
+ export declare class WidgetValidationError extends Error {
230
+ readonly issues: WidgetValidationIssue[];
231
+ constructor(issues: WidgetValidationIssue[]);
232
+ }
233
+ export declare function safeParseWidgetInput(value: unknown): WidgetParseResult;
234
+ export declare function parseWidgetInput(value: unknown): WidgetInput;
235
+ export declare function isWidgetContract(value: unknown): value is WidgetContract;
236
+ export declare function isWidget(value: unknown): value is Widget;
237
+ export declare const WIDGET_HEIGHT = 245;
238
+ export declare const WIDGET_PADDING = 18;
239
+ export declare const WIDGET_GAP = 8;
240
+ export declare const WIDGET_CELL_WIDTH = 133;
241
+ export declare const WIDGET_CELL_HEIGHT = 123;
242
+ export declare function widgetFootprint(size: WidgetSize | unknown): {
243
+ columns: number;
244
+ rows: number;
245
+ };
246
+ export declare function gridSpanSize(span: number, cellSize: number): number;
247
+ export declare function widgetWidth(size: WidgetSize | unknown): number;
248
+ export declare function widgetHeight(size: WidgetSize | unknown): number;
249
+ export declare function gridTemplate(tracks: GridTrack[]): string;
250
+ export declare function elementGridStyle(element: WidgetElement): Record<string, string>;
251
+ export interface WidgetRendererChartLocale {
252
+ progressAriaLabel: (title: string | undefined, value: string, range: string) => string;
253
+ gaugeAriaLabel: (title: string | undefined, value: string, max: string) => string;
254
+ chartAriaLabel: (title: string | undefined, chartType: string, pointCount: number) => string;
255
+ progressSummary: (title: string | undefined, value: string, min: string, max: string, breakdown: string) => string;
256
+ gaugeSummary: (title: string | undefined, value: string, max: string, percentage: string) => string;
257
+ dataSummary: (title: string | undefined, points: string) => string;
258
+ noDataSummary: (title: string | undefined) => string;
259
+ noSegmentsSummary: string;
260
+ morePoints: (count: number) => string;
261
+ progressSegmentLabel: (label: string, value: string) => string;
262
+ progressBreakdown: (label: string, start: string, end: string) => string;
263
+ }
264
+ export interface WidgetRendererAriaLocale {
265
+ toolbarActions: string;
266
+ loading: string;
267
+ showSensitiveData: string;
268
+ hideSensitiveData: string;
269
+ imageUnavailable: string;
270
+ chart: WidgetRendererChartLocale;
271
+ }
272
+ export interface WidgetRendererLocale {
273
+ aria: WidgetRendererAriaLocale;
274
+ }
275
+ export interface WidgetRendererLocaleOverrides {
276
+ aria?: Partial<Omit<WidgetRendererAriaLocale, 'chart'>> & {
277
+ chart?: Partial<WidgetRendererChartLocale>;
278
+ };
279
+ }
280
+ export declare const defaultWidgetRendererLocale: WidgetRendererLocale;
281
+ export declare const germanWidgetRendererLocale: WidgetRendererLocale;
282
+ export declare const frenchWidgetRendererLocale: WidgetRendererLocale;
283
+ export declare const dutchWidgetRendererLocale: WidgetRendererLocale;
284
+ interface ProgressTooltipState {
285
+ x: number;
286
+ y: number;
287
+ label: string;
288
+ value: number;
289
+ color?: string;
290
+ }
291
+ declare class WidgetTooltip {
292
+ readonly progress: import("@angular/core").WritableSignal<ProgressTooltipState | null>;
293
+ private readonly overlay;
294
+ private progressOwner;
295
+ setOverlay(overlay: HTMLElement): void;
296
+ overlayElement(): HTMLElement | null;
297
+ showProgress(owner: object, state: ProgressTooltipState): void;
298
+ hideProgress(owner: object): void;
299
+ clear(): void;
300
+ static ɵfac: i0.ɵɵFactoryDeclaration<WidgetTooltip, never>;
301
+ static ɵprov: i0.ɵɵInjectableDeclaration<any>;
302
+ }
303
+ export type WidgetLoading = boolean | Widget['size'];
304
+ export declare class WidgetRenderer implements OnDestroy {
305
+ readonly widget: import("@angular/core").InputSignal<import("@lieselthuriot/widget-renderer").WidgetContract | null>;
306
+ readonly loading: import("@angular/core").InputSignal<WidgetLoading>;
307
+ readonly darkMode: import("@angular/core").InputSignal<boolean>;
308
+ readonly locale: import("@angular/core").InputSignal<WidgetRendererLocaleOverrides>;
309
+ readonly refreshRequested: import("@angular/core").OutputEmitterRef<void>;
310
+ readonly actionRequested: import("@angular/core").OutputEmitterRef<{
311
+ element: ButtonElement;
312
+ event: Event;
313
+ }>;
314
+ readonly sensitiveVisible: import("@angular/core").WritableSignal<boolean>;
315
+ protected readonly tooltip: WidgetTooltip;
316
+ private readonly tooltipLayer;
317
+ private readonly parsedWidget;
318
+ protected readonly isLoading: import("@angular/core").Signal<boolean>;
319
+ protected readonly resolvedLocale: import("@angular/core").Signal<WidgetRendererLocale>;
320
+ protected readonly loadingSize: import("@angular/core").Signal<import("@lieselthuriot/widget-renderer").WidgetSize>;
321
+ readonly validationIssues: import("@angular/core").Signal<WidgetValidationIssue[]>;
322
+ protected readonly renderWidget: import("@angular/core").Signal<Widget>;
323
+ readonly hasSensitiveElements: import("@angular/core").Signal<boolean>;
324
+ readonly backgroundSensitive: import("@angular/core").Signal<boolean>;
325
+ readonly gridRows: import("@angular/core").Signal<string>;
326
+ readonly gridColumns: import("@angular/core").Signal<string>;
327
+ readonly widgetWidth: import("@angular/core").Signal<number>;
328
+ readonly widgetHeight: import("@angular/core").Signal<number>;
329
+ readonly backgroundImage: import("@angular/core").Signal<string>;
330
+ constructor();
331
+ ngOnDestroy(): void;
332
+ protected toggleSensitive(): void;
333
+ static ɵfac: i0.ɵɵFactoryDeclaration<WidgetRenderer, never>;
334
+ static ɵcmp: i0.ɵɵComponentDeclaration<WidgetRenderer, "widget-renderer", never, {
335
+ "widget": {
336
+ "alias": "widget";
337
+ "required": false;
338
+ "isSignal": true;
339
+ };
340
+ "loading": {
341
+ "alias": "loading";
342
+ "required": false;
343
+ "isSignal": true;
344
+ };
345
+ "darkMode": {
346
+ "alias": "darkMode";
347
+ "required": false;
348
+ "isSignal": true;
349
+ };
350
+ "locale": {
351
+ "alias": "locale";
352
+ "required": false;
353
+ "isSignal": true;
354
+ };
355
+ }, {
356
+ "refreshRequested": "refreshRequested";
357
+ "actionRequested": "actionRequested";
358
+ }, never, never, true, never>;
359
+ }
360
+ export declare function chartAriaLabel(element: ChartElement | ProgressElement, locale?: WidgetRendererChartLocale): string;
361
+ export declare function chartAccessibilitySummary(element: ChartElement | ProgressElement, locale?: WidgetRendererChartLocale): string;
362
+ export {};
363
+ //# sourceMappingURL=lieselthuriot-widget-renderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lieselthuriot-widget-renderer.d.ts","names":[],"sources":["../../../projects/widget-renderer/src/lib/widget.model.ts","../../../projects/widget-renderer/src/lib/widget-hydration.ts","../../../projects/widget-renderer/src/lib/widget-validation.ts","../../../projects/widget-renderer/src/lib/widget-layout.ts","../../../projects/widget-renderer/src/lib/widget-locale.ts","../../../projects/widget-renderer/src/lib/widget-tooltip.ts","../../../projects/widget-renderer/src/lib/widget-renderer.ts","../../../projects/widget-renderer/src/lib/chart-accessibility.ts"],"mappings":"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"}