@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-chart-element-renderer-BO3V-jYo.mjs","names":[],"sources":["../../../projects/widget-renderer/src/lib/chart-options.ts","../../../projects/widget-renderer/src/lib/echarts-element-renderer.ts","../../../projects/widget-renderer/src/lib/progress-element-renderer.ts","../../../projects/widget-renderer/src/lib/progress-element-renderer.html","../../../projects/widget-renderer/src/lib/chart-element-renderer.ts","../../../projects/widget-renderer/src/lib/chart-element-renderer.html"],"sourcesContent":["import type { EChartsCoreOption } from 'echarts/core';\nimport { ChartElement } from './widget.model';\n\nexport function chartOptions(\n element: ChartElement,\n tooltipLayer?: HTMLElement,\n tooltipEnabled = true,\n): EChartsCoreOption {\n const base = {\n animation: false,\n title: element.title\n ? {\n text: element.title,\n left: 'center',\n textStyle: { fontSize: element.style.font.size, color: element.style.color.title },\n }\n : undefined,\n legend:\n (element.type === 'pie' || element.type === 'donut' || element.type === 'funnel') &&\n element.showLegend\n ? {\n bottom: 10,\n textStyle: { fontSize: element.style.font.size, color: element.style.color.legend },\n }\n : undefined,\n tooltip: {\n show: tooltipEnabled,\n trigger:\n element.type === 'pie' || element.type === 'donut' || element.type === 'funnel'\n ? 'item'\n : 'axis',\n ...(tooltipLayer ? { appendToBody: false, appendTo: tooltipLayer } : {}),\n },\n } satisfies EChartsCoreOption;\n\n if (element.type === 'pie' || element.type === 'donut') {\n return {\n ...base,\n series: [\n {\n type: 'pie',\n center: ['50%', element.title ? '54%' : '50%'],\n radius:\n element.type === 'donut'\n ? [element.title ? '34%' : '45%', element.title ? '54%' : '72%']\n : element.title\n ? '62%'\n : '68%',\n label: { show: false },\n labelLine: { show: false },\n data: element.data.map(({ label, value, color }) => ({\n name: label,\n value,\n ...(color ? { itemStyle: { color } } : {}),\n })),\n },\n ],\n };\n }\n if (element.type === 'funnel') {\n return {\n ...base,\n series: [\n {\n type: 'funnel',\n left: '8%',\n right: '8%',\n top: element.title ? 38 : 12,\n bottom: element.showLegend ? 38 : 12,\n min: 0,\n max: Math.max(...element.data.map(({ value }) => value), 1),\n minSize: '10%',\n maxSize: '88%',\n sort: 'descending',\n gap: 3,\n label: { show: false },\n labelLine: { show: false },\n emphasis: { label: { show: false }, labelLine: { show: false } },\n data: element.data.map(({ label, value, color }) => ({\n name: label,\n value,\n ...(color ? { itemStyle: { color } } : {}),\n })),\n },\n ],\n };\n }\n if (element.type === 'gauge') {\n const percentage = Math.max(\n 0,\n Math.min(1, (element.data.value - element.data.min) / (element.data.max - element.data.min)),\n );\n return {\n ...base,\n title: element.title\n ? {\n text: element.title,\n left: 'center',\n bottom: 0,\n textStyle: { fontSize: element.style.font.size, color: element.style.color.title },\n }\n : undefined,\n series: [\n {\n type: 'gauge',\n center: ['50%', '58%'],\n radius: '78%',\n startAngle: 200,\n endAngle: -20,\n min: element.data.min,\n max: element.data.max,\n splitNumber: 6,\n axisLine: {\n lineStyle: {\n width: 16,\n cap: 'round',\n color: [\n [percentage, element.style.color.fill],\n [1, element.style.color.track],\n ],\n },\n },\n axisTick: {\n distance: -22,\n splitNumber: 5,\n length: 4,\n lineStyle: { color: element.style.color.legend, width: 1 },\n },\n splitLine: {\n distance: -24,\n length: 8,\n lineStyle: { color: element.style.color.legend, width: 2 },\n },\n axisLabel: {\n show: element.showLegend,\n distance: -2,\n color: element.style.color.legend,\n fontSize: element.style.font.size,\n formatter: (value: number) => `${Math.round(value)}`,\n },\n pointer: {\n show: true,\n length: '55%',\n width: 5,\n itemStyle: { color: element.style.color.legend },\n },\n progress: { show: true, itemStyle: { color: element.style.color.fill } },\n detail: {\n show: element.showLegend,\n valueAnimation: false,\n formatter: (value: number) => `${Math.round(value)}`,\n color: element.style.color.legend,\n fontSize: element.style.font.size,\n },\n data: [{ value: element.data.value }],\n },\n ],\n };\n }\n const seriesElement = element as Extract<ChartElement, { type: 'bar' | 'line' }>;\n return {\n ...base,\n grid: {\n left: 34,\n right: 12,\n top: element.title ? 30 : 12,\n bottom: element.showLegend ? 28 : 24,\n outerBoundsMode: 'same',\n outerBoundsContain: 'axisLabel',\n },\n xAxis: {\n type: 'category',\n data: element.data.map(({ label }) => label),\n axisLabel: { color: seriesElement.style.axis.label, fontSize: seriesElement.style.font.size },\n axisLine: { lineStyle: { color: seriesElement.style.axis.line } },\n },\n yAxis: {\n type: 'value',\n axisLabel: { color: seriesElement.style.axis.label, fontSize: seriesElement.style.font.size },\n axisLine: { lineStyle: { color: seriesElement.style.axis.line } },\n splitLine: { lineStyle: { color: seriesElement.style.axis.grid } },\n },\n series: [\n {\n type: seriesElement.type,\n data: seriesElement.data.map(({ value, color }) => ({\n value,\n ...(seriesElement.type === 'line'\n ? { itemStyle: { color: color ?? seriesElement.style.color.line } }\n : { itemStyle: { color } }),\n })),\n itemStyle:\n seriesElement.type === 'line' ? { color: seriesElement.style.color.line } : undefined,\n lineStyle:\n seriesElement.type === 'line' ? { color: seriesElement.style.color.line } : undefined,\n symbol: seriesElement.type === 'line' ? 'circle' : undefined,\n smooth: seriesElement.type === 'line',\n },\n ],\n };\n}\n","import { Component, ElementRef, OnDestroy, effect, inject, input, viewChild } from '@angular/core';\nimport { use, init, type ECharts } from 'echarts/core';\nimport { BarChart, FunnelChart, GaugeChart, LineChart, PieChart } from 'echarts/charts';\nimport {\n GridComponent,\n LegendComponent,\n TitleComponent,\n TooltipComponent,\n} from 'echarts/components';\nimport { SVGRenderer } from 'echarts/renderers';\nimport { ChartElement } from './widget.model';\nimport { chartAccessibilitySummary, chartAriaLabel } from './chart-accessibility';\nimport { chartOptions } from './chart-options';\nimport { WidgetTooltip } from './widget-tooltip';\nimport { defaultWidgetRendererLocale, WidgetRendererLocale } from './widget-locale';\n\nuse([\n BarChart,\n GaugeChart,\n LineChart,\n PieChart,\n FunnelChart,\n GridComponent,\n LegendComponent,\n TitleComponent,\n TooltipComponent,\n SVGRenderer,\n]);\n\n@Component({\n selector: 'widget-echarts-element',\n template: `<div\n class=\"chart-chart\"\n [attr.aria-label]=\"ariaLabel(element())\"\n [attr.aria-describedby]=\"sensitiveHidden() ? null : summaryId\"\n [attr.aria-hidden]=\"sensitiveHidden() ? 'true' : null\"\n [style.pointer-events]=\"sensitiveHidden() ? 'none' : null\"\n role=\"img\"\n >\n <div #chartHost class=\"chart-host\"></div>\n @if (!sensitiveHidden()) {\n <span class=\"visually-hidden\" [id]=\"summaryId\">{{ accessibilitySummary(element()) }}</span>\n }\n </div>`,\n styleUrl: './echarts-element-renderer.css',\n})\nexport class EchartsElementRenderer implements OnDestroy {\n readonly element = input.required<ChartElement>();\n readonly sensitiveHidden = input(false);\n readonly locale = input<WidgetRendererLocale>(defaultWidgetRendererLocale);\n protected readonly summaryId = `chart-summary-${crypto.randomUUID()}`;\n private readonly chartHost = viewChild<ElementRef<HTMLDivElement>>('chartHost');\n private chartHostElement: HTMLDivElement | null = null;\n private chartInstance: ECharts | null = null;\n private resizeObserver: ResizeObserver | null = null;\n private readonly tooltip = inject(WidgetTooltip);\n\n constructor() {\n effect(() => {\n const host = this.chartHost()?.nativeElement ?? null;\n if (!host) return;\n if (host !== this.chartHostElement) {\n this.destroyChart();\n this.chartHostElement = host;\n this.chartInstance = init(host, undefined, { renderer: 'svg' });\n if (typeof ResizeObserver !== 'undefined') {\n const chart = this.chartInstance;\n this.resizeObserver = new ResizeObserver(() => {\n if (this.chartInstance === chart) chart.resize();\n });\n this.resizeObserver.observe(host);\n }\n }\n const tooltipEnabled = !this.sensitiveHidden();\n if (!tooltipEnabled) this.chartInstance?.dispatchAction({ type: 'hideTip' });\n this.chartInstance?.setOption(\n chartOptions(this.element(), this.tooltip.overlayElement() ?? undefined, tooltipEnabled),\n true,\n );\n });\n }\n\n ngOnDestroy(): void {\n this.destroyChart();\n }\n protected ariaLabel(element: ChartElement): string {\n return chartAriaLabel(element, this.locale().aria.chart);\n }\n protected accessibilitySummary(element: ChartElement): string {\n return chartAccessibilitySummary(element, this.locale().aria.chart);\n }\n private destroyChart(): void {\n this.resizeObserver?.disconnect();\n this.chartInstance?.dispose();\n this.resizeObserver = null;\n this.chartInstance = null;\n this.chartHostElement = null;\n }\n}\n","import { Component, OnDestroy, effect, inject, input, signal } from '@angular/core';\nimport { chartAccessibilitySummary, chartAriaLabel } from './chart-accessibility';\nimport { ProgressElement, ProgressItem, ProgressSegment } from './widget.model';\nimport { WidgetTooltip } from './widget-tooltip';\nimport { defaultWidgetRendererLocale, WidgetRendererLocale } from './widget-locale';\n\n@Component({\n selector: 'widget-progress-element',\n templateUrl: './progress-element-renderer.html',\n styleUrl: './progress-element-renderer.css',\n host: {\n class: 'is-progress',\n '(document:pointerdown)': 'onDocumentPointerDown($event)',\n },\n})\nexport class ProgressElementRenderer implements OnDestroy {\n readonly element = input.required<ProgressElement>();\n readonly sensitiveHidden = input(false);\n readonly locale = input<WidgetRendererLocale>(defaultWidgetRendererLocale);\n protected readonly summaryId = `progress-summary-${crypto.randomUUID()}`;\n protected readonly tooltipIndex = signal<number | null>(null);\n private readonly widgetTooltip = inject(WidgetTooltip);\n private readonly tooltipOwner = {};\n private tooltipHideTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor() {\n effect(() => {\n this.element();\n this.sensitiveHidden();\n this.clearTooltip();\n });\n }\n\n ngOnDestroy(): void {\n this.cancelTooltipHide();\n this.widgetTooltip.hideProgress(this.tooltipOwner);\n }\n protected progressStyle(element: ProgressElement): Record<string, string> {\n const radius = element.style.radius ?? { segment: 0, track: 999 };\n return {\n '--progress-track': element.style.color.track,\n '--progress-title-color': element.style.color.title,\n '--progress-legend-color': element.style.color.legend,\n '--progress-font-size': `${element.style?.font.size ?? 11}px`,\n '--progress-segment-radius': `${radius.segment}px`,\n '--progress-track-radius': `${radius.track}px`,\n };\n }\n protected progressItems(element: ProgressElement) {\n const range = element.data.max - element.data.min;\n let position = element.data.min;\n return element.data.items.map((item, index) => {\n const start = position;\n position += item.value;\n return {\n item,\n index,\n start,\n end: position,\n width: (item.value / range) * 100,\n center: ((start - element.data.min + item.value / 2) / range) * 100,\n };\n });\n }\n protected progressSegments(element: ProgressElement) {\n return this.progressItems(element).filter(({ item }) => item.kind === 'segment');\n }\n protected segment(item: ProgressItem): ProgressSegment {\n return item as ProgressSegment;\n }\n protected segmentStyle(width: number, color?: string): Record<string, string> {\n return { width: `${width}%`, ...(color ? { background: color } : {}) };\n }\n protected progressValue(element: ProgressElement): number {\n return element.data.items.reduce(\n (total, item) => total + (item.kind === 'segment' ? item.value : 0),\n 0,\n );\n }\n protected showTooltip(index: number, event: FocusEvent): void {\n if (this.sensitiveHidden()) return;\n this.cancelTooltipHide();\n this.showTooltipAt(\n index,\n event.currentTarget instanceof HTMLElement\n ? event.currentTarget\n : event.target instanceof HTMLElement\n ? event.target\n : null,\n );\n }\n protected hideTooltip(index: number): void {\n this.cancelTooltipHide();\n this.tooltipHideTimer = setTimeout(() => {\n if (this.tooltipIndex() === index) {\n this.tooltipIndex.set(null);\n this.widgetTooltip.hideProgress(this.tooltipOwner);\n }\n this.tooltipHideTimer = null;\n }, 100);\n }\n protected moveTooltip(index: number, event: PointerEvent): void {\n if (this.sensitiveHidden() || event.pointerType === 'touch') return;\n this.positionTooltip(index, event);\n }\n protected toggleTouchTooltip(index: number, event: PointerEvent): void {\n if (this.sensitiveHidden() || event.pointerType === 'mouse') return;\n event.stopPropagation();\n this.cancelTooltipHide();\n if (this.tooltipIndex() === index) {\n this.tooltipIndex.set(null);\n this.widgetTooltip.hideProgress(this.tooltipOwner);\n return;\n }\n this.positionTooltip(index, event);\n }\n protected segmentKeyDown(index: number, event: KeyboardEvent): void {\n if (event.key !== 'Escape') return;\n event.preventDefault();\n this.hideTooltip(index);\n }\n protected onDocumentPointerDown(event: PointerEvent): void {\n if (!(event.target instanceof Element) || !event.target.closest('.progress-segment')) {\n this.tooltipIndex.set(null);\n this.widgetTooltip.hideProgress(this.tooltipOwner);\n }\n }\n private positionTooltip(index: number, event: PointerEvent): void {\n const target = event.currentTarget;\n if (!(target instanceof HTMLElement)) return;\n this.showTooltipAt(index, target, event.clientX, event.clientY);\n }\n private showTooltipAt(index: number, target: HTMLElement | null, x?: number, y?: number): void {\n if (!target) return;\n const shell = this.widgetTooltip.overlayElement()?.parentElement;\n if (!shell) return;\n const bounds = shell.getBoundingClientRect();\n const targetBounds = target.getBoundingClientRect();\n const entry = this.progressSegments(this.element()).find(\n ({ index: entryIndex }) => entryIndex === index,\n );\n if (!entry) return;\n const segment = this.segment(entry.item);\n this.tooltipIndex.set(index);\n this.widgetTooltip.showProgress(this.tooltipOwner, {\n x: (x ?? targetBounds.left + targetBounds.width / 2) - bounds.left,\n y: (y ?? targetBounds.top) - bounds.top,\n label: segment.label,\n value: segment.value,\n color: segment.color,\n });\n }\n private cancelTooltipHide(): void {\n if (this.tooltipHideTimer) clearTimeout(this.tooltipHideTimer);\n this.tooltipHideTimer = null;\n }\n private clearTooltip(): void {\n this.cancelTooltipHide();\n this.tooltipIndex.set(null);\n this.widgetTooltip.hideProgress(this.tooltipOwner);\n }\n protected progressTextAlign(element: ProgressElement): 'left' | 'center' | 'right' {\n return (element.grid.anchor ?? 'center').endsWith('left')\n ? 'left'\n : (element.grid.anchor ?? 'center').endsWith('right')\n ? 'right'\n : 'center';\n }\n protected ariaLabel(element: ProgressElement): string {\n return chartAriaLabel(element, this.locale().aria.chart);\n }\n protected accessibilitySummary(element: ProgressElement): string {\n return chartAccessibilitySummary(element, this.locale().aria.chart);\n }\n}\n","<div\n class=\"progress-element\"\n [style]=\"progressStyle(element())\"\n [style.pointer-events]=\"sensitiveHidden() ? 'none' : null\"\n [attr.aria-hidden]=\"sensitiveHidden() ? 'true' : null\"\n>\n @if (!sensitiveHidden()) {\n <span\n class=\"visually-hidden\"\n role=\"progressbar\"\n [attr.aria-label]=\"ariaLabel(element())\"\n [attr.aria-describedby]=\"summaryId\"\n aria-valuemin=\"0\"\n [attr.aria-valuemax]=\"element().data.max - element().data.min\"\n [attr.aria-valuenow]=\"progressValue(element())\"\n ></span>\n }\n @if (element().title) {\n <span class=\"progress-title\" [style.text-align]=\"progressTextAlign(element())\">{{\n element().title\n }}</span>\n }\n <span class=\"progress-track-wrap\"\n ><span class=\"progress-track\">\n @for (entry of progressItems(element()); track entry.index) {\n @if (entry.item.kind === 'segment') {\n <button\n type=\"button\"\n class=\"progress-item progress-segment\"\n [class.is-active]=\"segment(entry.item).active\"\n [style]=\"segmentStyle(entry.width, segment(entry.item).color)\"\n [attr.tabindex]=\"sensitiveHidden() ? -1 : 0\"\n [attr.aria-label]=\"\n locale().aria.chart.progressSegmentLabel(\n segment(entry.item).label,\n segment(entry.item).value.toString()\n )\n \"\n (pointerenter)=\"moveTooltip(entry.index, $event)\"\n (pointermove)=\"moveTooltip(entry.index, $event)\"\n (pointerleave)=\"hideTooltip(entry.index)\"\n (pointerdown)=\"toggleTouchTooltip(entry.index, $event)\"\n (focus)=\"showTooltip(entry.index, $event)\"\n (blur)=\"hideTooltip(entry.index)\"\n (keydown)=\"segmentKeyDown(entry.index, $event)\"\n ></button>\n } @else {\n <span class=\"progress-item progress-gap\" [style]=\"segmentStyle(entry.width)\"></span>\n }\n }\n </span>\n </span>\n @if (element().showLegend) {\n <span class=\"progress-legend\" [style.justify-content]=\"progressTextAlign(element())\">\n @for (entry of progressSegments(element()); track entry.index) {\n <span class=\"progress-label\"\n ><span class=\"legend-marker\" [style.background]=\"segment(entry.item).color\"></span\n >{{ segment(entry.item).label }}: {{ entry.start }}–{{ entry.end }}</span\n >\n }\n </span>\n }\n @if (!sensitiveHidden()) {\n <span class=\"visually-hidden\" [id]=\"summaryId\">{{ accessibilitySummary(element()) }}</span>\n }\n</div>\n","import { Component, input } from '@angular/core';\nimport { ChartElement, ProgressElement, WidgetElement } from './widget.model';\nimport { EchartsElementRenderer } from './echarts-element-renderer';\nimport { ProgressElementRenderer } from './progress-element-renderer';\nimport { defaultWidgetRendererLocale, WidgetRendererLocale } from './widget-locale';\n\n@Component({\n selector: 'widget-chart-element',\n templateUrl: './chart-element-renderer.html',\n imports: [EchartsElementRenderer, ProgressElementRenderer],\n})\nexport class ChartElementRenderer {\n readonly element = input.required<ChartElement | ProgressElement>();\n readonly sensitiveHidden = input(false);\n readonly locale = input<WidgetRendererLocale>(defaultWidgetRendererLocale);\n\n protected isProgress(element: WidgetElement): element is ProgressElement {\n return element.type === 'progress';\n }\n\n protected progress(element: ChartElement | ProgressElement): ProgressElement {\n return element as ProgressElement;\n }\n\n protected chart(element: ChartElement | ProgressElement): ChartElement {\n return element as ChartElement;\n }\n}\n","@if (isProgress(element())) {\n <widget-progress-element\n [element]=\"progress(element())\"\n [sensitiveHidden]=\"sensitiveHidden()\"\n [locale]=\"locale()\"\n />\n} @else {\n <widget-echarts-element\n [element]=\"chart(element())\"\n [sensitiveHidden]=\"sensitiveHidden()\"\n [locale]=\"locale()\"\n />\n}\n"],"mappings":"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"}