@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.
- package/LICENSE +21 -0
- package/README.md +299 -3
- package/fesm2022/lieselthuriot-widget-renderer-chart-accessibility-BzH2alxy.mjs +185 -0
- package/fesm2022/lieselthuriot-widget-renderer-chart-accessibility-BzH2alxy.mjs.map +1 -0
- package/fesm2022/lieselthuriot-widget-renderer-chart-element-renderer-wVHdIYuJ.mjs +993 -0
- package/fesm2022/lieselthuriot-widget-renderer-chart-element-renderer-wVHdIYuJ.mjs.map +1 -0
- package/fesm2022/lieselthuriot-widget-renderer.mjs +1697 -0
- package/fesm2022/lieselthuriot-widget-renderer.mjs.map +1 -0
- package/package.json +53 -3
- package/types/lieselthuriot-widget-renderer.d.ts +397 -0
- package/types/lieselthuriot-widget-renderer.d.ts.map +1 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lieselthuriot-widget-renderer-chart-element-renderer-wVHdIYuJ.mjs","names":["ticks","arrayTicks"],"sources":["../../../projects/widget-renderer/src/lib/gauge-chart-layout.ts","../../../projects/widget-renderer/src/lib/interactive-chart.ts","../../../projects/widget-renderer/src/lib/gauge-chart-renderer.ts","../../../projects/widget-renderer/src/lib/gauge-chart-renderer.html","../../../projects/widget-renderer/src/lib/part-chart-layout.ts","../../../projects/widget-renderer/src/lib/part-chart-renderer.ts","../../../projects/widget-renderer/src/lib/part-chart-renderer.html","../../../projects/widget-renderer/src/lib/progress-element-renderer.ts","../../../projects/widget-renderer/src/lib/progress-element-renderer.html","../../../projects/widget-renderer/src/lib/series-chart-layout.ts","../../../projects/widget-renderer/src/lib/series-chart-renderer.ts","../../../projects/widget-renderer/src/lib/series-chart-renderer.html","../../../projects/widget-renderer/src/lib/chart-element-renderer.ts","../../../projects/widget-renderer/src/lib/chart-element-renderer.html"],"sourcesContent":["import { arc } from 'd3-shape';\nimport { GaugeElement } from './widget.model';\n\nconst START_ANGLE = (-110 * Math.PI) / 180;\nconst END_ANGLE = (110 * Math.PI) / 180;\nconst SPLITS = 6;\nconst MINOR_SPLITS = 5;\nconst BELOW_CENTER = Math.sin((20 * Math.PI) / 180);\n\nexport interface GaugeTick {\n x1: number;\n y1: number;\n x2: number;\n y2: number;\n major: boolean;\n}\n\nexport interface GaugeLabel {\n x: number;\n y: number;\n text: string;\n}\n\nexport interface GaugeChartLayout {\n centerX: number;\n centerY: number;\n radius: number;\n track: string;\n fill: string;\n ticks: GaugeTick[];\n labels: GaugeLabel[];\n pointer: string;\n valueY: number;\n}\n\nexport function gaugeRatio(element: GaugeElement): number {\n const { value, min, max } = element.data;\n return max === min ? 0 : Math.max(0, Math.min(1, (value - min) / (max - min)));\n}\n\nfunction polar(centerX: number, centerY: number, radius: number, angle: number): [number, number] {\n return [centerX + radius * Math.sin(angle), centerY - radius * Math.cos(angle)];\n}\n\nexport function gaugeChartLayout(\n element: GaugeElement,\n width: number,\n height: number,\n): GaugeChartLayout {\n const fontSize = element.style.font.size;\n const outside = element.showLegend ? 16 + fontSize * 1.2 : 12;\n const radius = Math.max(\n 8,\n Math.min(width / 2 - outside, (height - outside - 4) / (1 + BELOW_CENTER)),\n );\n const centerX = width / 2;\n const used = outside + radius * (1 + BELOW_CENTER);\n const centerY = outside + radius + Math.max(0, (height - used) / 2);\n const band = Math.min(16, radius * 0.25);\n const ring = arc<{ startAngle: number; endAngle: number }>()\n .innerRadius(radius - band)\n .outerRadius(radius)\n .cornerRadius(band / 2);\n const valueAngle = START_ANGLE + (END_ANGLE - START_ANGLE) * gaugeRatio(element);\n const ticks: GaugeTick[] = [];\n const labels: GaugeLabel[] = [];\n const { min, max } = element.data;\n for (let step = 0; step <= SPLITS * MINOR_SPLITS; step++) {\n const major = step % MINOR_SPLITS === 0;\n const angle = START_ANGLE + ((END_ANGLE - START_ANGLE) * step) / (SPLITS * MINOR_SPLITS);\n const [x1, y1] = polar(centerX, centerY, radius + 2, angle);\n const [x2, y2] = polar(centerX, centerY, radius + (major ? 10 : 6), angle);\n ticks.push({ x1, y1, x2, y2, major });\n if (major && element.showLegend) {\n const [x, y] = polar(centerX, centerY, radius + 12 + fontSize * 0.8, angle);\n const value = min + ((max - min) * step) / (SPLITS * MINOR_SPLITS);\n labels.push({ x, y, text: `${Math.round(value)}` });\n }\n }\n const length = radius * 0.55;\n const [tipX, tipY] = polar(centerX, centerY, length, valueAngle);\n const [leftX, leftY] = polar(centerX, centerY, 2.5, valueAngle - Math.PI / 2);\n const [rightX, rightY] = polar(centerX, centerY, 2.5, valueAngle + Math.PI / 2);\n return {\n centerX,\n centerY,\n radius,\n track: ring({ startAngle: START_ANGLE, endAngle: END_ANGLE }) ?? '',\n fill:\n valueAngle > START_ANGLE\n ? (ring({ startAngle: START_ANGLE, endAngle: valueAngle }) ?? '')\n : '',\n ticks,\n labels,\n pointer: `${leftX},${leftY} ${tipX},${tipY} ${rightX},${rightY}`,\n valueY: centerY + radius * 0.4,\n };\n}\n","import {\n Directive,\n ElementRef,\n OnDestroy,\n Signal,\n afterNextRender,\n computed,\n effect,\n inject,\n input,\n signal,\n viewChild,\n} from '@angular/core';\nimport { chartAccessibilitySummary, chartAriaLabel } from './chart-accessibility';\nimport { ChartElement } from './widget.model';\nimport { WidgetTooltip } from './widget-tooltip';\nimport { defaultWidgetRendererLocale, WidgetRendererLocale } from './widget-locale';\n\nexport const DEFAULT_CHART_COLORS = [\n '#5470c6',\n '#91cc75',\n '#fac858',\n '#ee6666',\n '#73c0de',\n '#3ba272',\n '#fc8452',\n '#9a60b4',\n '#ea7ccc',\n];\n\nexport function defaultChartColor(index: number): string {\n return DEFAULT_CHART_COLORS[index % DEFAULT_CHART_COLORS.length];\n}\n\nexport interface ChartPoint {\n index: number;\n label: string;\n value: number;\n color: string;\n anchorX: number;\n anchorY: number;\n}\n\n@Directive({\n host: { '(document:pointerdown)': 'onDocumentPointerDown($event)' },\n})\nexport abstract class InteractiveChart<T extends ChartElement> implements OnDestroy {\n readonly element = input.required<T>();\n readonly sensitiveHidden = input(false);\n readonly locale = input<WidgetRendererLocale>(defaultWidgetRendererLocale);\n protected readonly summaryId = `chart-summary-${crypto.randomUUID()}`;\n protected readonly activeIndex = signal<number | null>(null);\n protected readonly size = signal({ width: 0, height: 0 });\n protected readonly announcement = computed(() => {\n const point = this.activePoint();\n return point ? this.locale().aria.chart.dataPointLabel(point.label, `${point.value}`) : '';\n });\n private readonly activePoint = computed(() => {\n const index = this.activeIndex();\n return index === null ? undefined : this.points()[index];\n });\n private readonly host = viewChild.required<ElementRef<HTMLElement>>('chartHost');\n private readonly widgetTooltip = inject(WidgetTooltip);\n private readonly tooltipOwner = {};\n private resizeObserver: ResizeObserver | null = null;\n\n protected abstract readonly points: Signal<ChartPoint[]>;\n\n constructor() {\n afterNextRender(() => {\n const host = this.host().nativeElement;\n this.measure(host);\n if (typeof ResizeObserver === 'undefined') return;\n this.resizeObserver = new ResizeObserver(() => this.measure(host));\n this.resizeObserver.observe(host);\n });\n effect(() => {\n this.element();\n this.sensitiveHidden();\n this.hideTooltip();\n });\n effect(() => {\n const owner = this.widgetTooltip.owner();\n if (owner && owner !== this.tooltipOwner) this.activeIndex.set(null);\n });\n }\n\n ngOnDestroy(): void {\n this.resizeObserver?.disconnect();\n this.widgetTooltip.hide(this.tooltipOwner);\n }\n\n protected ariaLabel(element: T): string {\n return chartAriaLabel(element, this.locale().aria.chart);\n }\n protected accessibilitySummary(element: T): string {\n return chartAccessibilitySummary(element, this.locale().aria.chart);\n }\n\n protected pointerMove(index: number, event: PointerEvent): void {\n if (this.sensitiveHidden()) return;\n if (event.pointerType === 'touch') event.stopPropagation();\n const point = this.points()[index];\n if (point) this.showTooltip(point, event.clientX, event.clientY);\n }\n protected pointerLeave(): void {\n this.hideTooltip();\n }\n protected focus(): void {\n if (this.sensitiveHidden()) return;\n this.select(this.activeIndex() ?? 0);\n }\n protected keyDown(event: KeyboardEvent): void {\n if (event.key === 'Escape') {\n if (this.activeIndex() === null) return;\n event.preventDefault();\n this.hideTooltip();\n return;\n }\n const count = this.points().length;\n if (!count || this.sensitiveHidden()) return;\n const current = this.activeIndex();\n const next =\n event.key === 'ArrowRight' || event.key === 'ArrowDown'\n ? current === null\n ? 0\n : Math.min(count - 1, current + 1)\n : event.key === 'ArrowLeft' || event.key === 'ArrowUp'\n ? current === null\n ? 0\n : Math.max(0, current - 1)\n : event.key === 'Home'\n ? 0\n : event.key === 'End'\n ? count - 1\n : null;\n if (next === null) return;\n event.preventDefault();\n this.select(next);\n }\n protected onDocumentPointerDown(event: PointerEvent): void {\n if (!(event.target instanceof Element) || !this.host().nativeElement.contains(event.target)) {\n this.hideTooltip();\n }\n }\n\n private select(index: number): void {\n const point = this.points()[index];\n if (!point) return;\n const bounds = this.host().nativeElement.getBoundingClientRect();\n this.showTooltip(point, bounds.left + point.anchorX, bounds.top + point.anchorY);\n }\n private showTooltip(point: ChartPoint, clientX: number, clientY: number): void {\n const shell = this.widgetTooltip.overlayElement()?.parentElement;\n this.activeIndex.set(point.index);\n if (!shell) return;\n const bounds = shell.getBoundingClientRect();\n this.widgetTooltip.show(this.tooltipOwner, {\n x: clientX - bounds.left,\n y: clientY - bounds.top,\n label: point.label,\n value: point.value,\n color: point.color,\n });\n }\n private hideTooltip(): void {\n this.activeIndex.set(null);\n this.widgetTooltip.hide(this.tooltipOwner);\n }\n private measure(host: HTMLElement): void {\n const width = host.clientWidth;\n const height = host.clientHeight;\n const current = this.size();\n if (current.width !== width || current.height !== height) this.size.set({ width, height });\n }\n}\n","import { Component, computed } from '@angular/core';\nimport { gaugeChartLayout } from './gauge-chart-layout';\nimport { ChartPoint, InteractiveChart } from './interactive-chart';\nimport { GaugeElement } from './widget.model';\n\n@Component({\n selector: 'widget-gauge-chart',\n templateUrl: './gauge-chart-renderer.html',\n styleUrl: './chart-renderer.css',\n})\nexport class GaugeChartRenderer extends InteractiveChart<GaugeElement> {\n protected readonly layout = computed(() => {\n const { width, height } = this.size();\n return width > 0 && height > 0 ? gaugeChartLayout(this.element(), width, height) : null;\n });\n protected readonly points = computed<ChartPoint[]>(() => {\n const layout = this.layout();\n const element = this.element();\n return layout\n ? [\n {\n index: 0,\n label: element.title || this.locale().aria.chart.gaugeValueLabel,\n value: element.data.value,\n color: element.style.color.fill,\n anchorX: layout.centerX,\n anchorY: layout.centerY - layout.radius,\n },\n ]\n : [];\n });\n protected roundedValue(element: GaugeElement): number {\n return Math.round(element.data.value);\n }\n}\n","<div\n class=\"chart-chart chart-stack\"\n [attr.aria-hidden]=\"sensitiveHidden() ? 'true' : null\"\n [style.pointer-events]=\"sensitiveHidden() ? 'none' : null\"\n [style.font-size.px]=\"element().style.font.size\"\n>\n <div #chartHost class=\"chart-host\">\n <svg\n class=\"chart-svg gauge-chart\"\n role=\"img\"\n [attr.aria-label]=\"ariaLabel(element())\"\n [attr.aria-describedby]=\"sensitiveHidden() ? null : summaryId\"\n [attr.tabindex]=\"sensitiveHidden() ? -1 : 0\"\n [attr.width]=\"size().width\"\n [attr.height]=\"size().height\"\n (focus)=\"focus()\"\n (blur)=\"pointerLeave()\"\n (keydown)=\"keyDown($event)\"\n >\n @if (layout(); as gauge) {\n <g\n class=\"chart-shape\"\n (pointerenter)=\"pointerMove(0, $event)\"\n (pointermove)=\"pointerMove(0, $event)\"\n (pointerdown)=\"pointerMove(0, $event)\"\n (pointerleave)=\"pointerLeave()\"\n >\n <g [attr.transform]=\"'translate(' + gauge.centerX + ',' + gauge.centerY + ')'\">\n <path [attr.d]=\"gauge.track\" [attr.fill]=\"element().style.color.track\" />\n @if (gauge.fill) {\n <path [attr.d]=\"gauge.fill\" [attr.fill]=\"element().style.color.fill\" />\n }\n </g>\n @for (tick of gauge.ticks; track $index) {\n <line\n [attr.x1]=\"tick.x1\"\n [attr.y1]=\"tick.y1\"\n [attr.x2]=\"tick.x2\"\n [attr.y2]=\"tick.y2\"\n [attr.stroke]=\"element().style.color.legend\"\n [attr.stroke-width]=\"tick.major ? 2 : 1\"\n />\n }\n @for (label of gauge.labels; track $index) {\n <text\n text-anchor=\"middle\"\n dominant-baseline=\"middle\"\n [attr.x]=\"label.x\"\n [attr.y]=\"label.y\"\n [attr.fill]=\"element().style.color.legend\"\n >\n {{ label.text }}\n </text>\n }\n <polygon [attr.points]=\"gauge.pointer\" [attr.fill]=\"element().style.color.legend\" />\n <circle\n [attr.cx]=\"gauge.centerX\"\n [attr.cy]=\"gauge.centerY\"\n r=\"4\"\n [attr.fill]=\"element().style.color.legend\"\n />\n @if (element().showLegend) {\n <text\n class=\"gauge-value\"\n text-anchor=\"middle\"\n dominant-baseline=\"middle\"\n [attr.x]=\"gauge.centerX\"\n [attr.y]=\"gauge.valueY\"\n [attr.fill]=\"element().style.color.legend\"\n >\n {{ roundedValue(element()) }}\n </text>\n }\n </g>\n }\n </svg>\n </div>\n @if (element().title) {\n <span class=\"chart-title\" [style.color]=\"element().style.color.title\">{{\n element().title\n }}</span>\n }\n @if (!sensitiveHidden()) {\n <span class=\"visually-hidden\" [id]=\"summaryId\">{{ accessibilitySummary(element()) }}</span>\n <span class=\"visually-hidden\" aria-live=\"polite\">{{ announcement() }}</span>\n }\n</div>\n","import { arc, pie } from 'd3-shape';\nimport { defaultChartColor } from './interactive-chart';\nimport { ChartDataPoint, FunnelElement, PieElement } from './widget.model';\n\nconst HOVER_GROWTH = 6;\n\nexport interface PieSlice {\n index: number;\n label: string;\n value: number;\n color: string;\n path: string;\n activePath: string;\n centroid: [number, number];\n}\n\nexport interface PieChartLayout {\n centerX: number;\n centerY: number;\n innerRadius: number;\n outerRadius: number;\n slices: PieSlice[];\n}\n\nexport interface FunnelSegment {\n index: number;\n label: string;\n value: number;\n color: string;\n points: string;\n centerX: number;\n centerY: number;\n}\n\nexport function chartColor(point: ChartDataPoint, index: number): string {\n return point.color || defaultChartColor(index);\n}\n\nexport function pieChartLayout(element: PieElement, width: number, height: number): PieChartLayout {\n const outerRadius = Math.max(0, (Math.min(width, height) / 2) * 0.86 - HOVER_GROWTH);\n const innerRadius = element.type === 'donut' ? outerRadius * 0.62 : 0;\n const shape = arc<{ startAngle: number; endAngle: number }>().innerRadius(innerRadius);\n const arcs = pie<ChartDataPoint>()\n .sort(null)\n .value(({ value }) => Math.max(0, value))(element.data);\n return {\n centerX: width / 2,\n centerY: height / 2,\n innerRadius,\n outerRadius,\n slices: arcs.map((slice, index) => {\n const point = element.data[index];\n const angles = { startAngle: slice.startAngle, endAngle: slice.endAngle };\n const centroid = shape.outerRadius(outerRadius).centroid(angles);\n return {\n index,\n label: point.label,\n value: point.value,\n color: chartColor(point, index),\n path: shape.outerRadius(outerRadius)(angles) ?? '',\n activePath: shape.outerRadius(outerRadius + HOVER_GROWTH)(angles) ?? '',\n centroid: [centroid[0] + width / 2, centroid[1] + height / 2],\n };\n }),\n };\n}\n\nexport function funnelChartLayout(\n element: FunnelElement,\n width: number,\n height: number,\n): FunnelSegment[] {\n const gap = 3;\n const count = element.data.length;\n if (!count) return [];\n const boxLeft = width * 0.08;\n const boxWidth = width * 0.84;\n const top = 4;\n const itemHeight = Math.max(1, (height - top * 2 - gap * (count - 1)) / count);\n const max = Math.max(1, ...element.data.map(({ value }) => value));\n const size = (value: number) => boxWidth * (0.1 + 0.78 * Math.min(1, Math.max(0, value / max)));\n const order = element.data\n .map((point, index) => ({ point, index }))\n .sort((a, b) => b.point.value - a.point.value);\n const centerX = boxLeft + boxWidth / 2;\n const segments = order.map(({ point, index }, position) => {\n const y = top + position * (itemHeight + gap);\n const topWidth = size(point.value);\n const bottomWidth = size(order[position + 1]?.point.value ?? 0);\n return {\n index,\n label: point.label,\n value: point.value,\n color: chartColor(point, index),\n points: [\n [centerX - topWidth / 2, y],\n [centerX + topWidth / 2, y],\n [centerX + bottomWidth / 2, y + itemHeight],\n [centerX - bottomWidth / 2, y + itemHeight],\n ]\n .map(([x, pointY]) => `${x},${pointY}`)\n .join(' '),\n centerX,\n centerY: y + itemHeight / 2,\n };\n });\n return segments.sort((a, b) => a.index - b.index);\n}\n","import { Component, computed } from '@angular/core';\nimport { ChartPoint, InteractiveChart } from './interactive-chart';\nimport { chartColor, funnelChartLayout, pieChartLayout } from './part-chart-layout';\nimport { FunnelElement, PieElement } from './widget.model';\n\n@Component({\n selector: 'widget-part-chart',\n templateUrl: './part-chart-renderer.html',\n styleUrl: './chart-renderer.css',\n})\nexport class PartChartRenderer extends InteractiveChart<PieElement | FunnelElement> {\n protected readonly pie = computed(() => {\n const element = this.element();\n const { width, height } = this.size();\n return element.type !== 'funnel' && width > 0 && height > 0\n ? pieChartLayout(element, width, height)\n : null;\n });\n protected readonly funnel = computed(() => {\n const element = this.element();\n const { width, height } = this.size();\n return element.type === 'funnel' && width > 0 && height > 0\n ? funnelChartLayout(element, width, height)\n : null;\n });\n protected readonly legend = computed(() =>\n this.element().data.map((point, index) => ({\n index,\n label: point.label,\n color: chartColor(point, index),\n })),\n );\n protected readonly points = computed<ChartPoint[]>(() => {\n const pie = this.pie();\n if (pie) {\n return pie.slices.map(({ index, label, value, color, centroid }) => ({\n index,\n label,\n value,\n color,\n anchorX: centroid[0],\n anchorY: centroid[1],\n }));\n }\n return (this.funnel() ?? []).map(({ index, label, value, color, centerX, centerY }) => ({\n index,\n label,\n value,\n color,\n anchorX: centerX,\n anchorY: centerY,\n }));\n });\n}\n","<div\n class=\"chart-chart chart-stack\"\n [attr.aria-hidden]=\"sensitiveHidden() ? 'true' : null\"\n [style.pointer-events]=\"sensitiveHidden() ? 'none' : null\"\n [style.font-size.px]=\"element().style.font.size\"\n>\n @if (element().title) {\n <span class=\"chart-title\" [style.color]=\"element().style.color.title\">{{\n element().title\n }}</span>\n }\n <div #chartHost class=\"chart-host\">\n <svg\n class=\"chart-svg part-chart\"\n role=\"img\"\n [attr.aria-label]=\"ariaLabel(element())\"\n [attr.aria-describedby]=\"sensitiveHidden() ? null : summaryId\"\n [attr.tabindex]=\"sensitiveHidden() || !element().data.length ? -1 : 0\"\n [attr.width]=\"size().width\"\n [attr.height]=\"size().height\"\n (focus)=\"focus()\"\n (blur)=\"pointerLeave()\"\n (keydown)=\"keyDown($event)\"\n >\n @if (pie(); as chart) {\n <g [attr.transform]=\"'translate(' + chart.centerX + ',' + chart.centerY + ')'\">\n @for (slice of chart.slices; track slice.index) {\n <path\n class=\"chart-shape\"\n [class.is-dimmed]=\"activeIndex() !== null && activeIndex() !== slice.index\"\n [attr.d]=\"activeIndex() === slice.index ? slice.activePath : slice.path\"\n [attr.fill]=\"slice.color\"\n (pointerenter)=\"pointerMove(slice.index, $event)\"\n (pointermove)=\"pointerMove(slice.index, $event)\"\n (pointerdown)=\"pointerMove(slice.index, $event)\"\n (pointerleave)=\"pointerLeave()\"\n />\n }\n </g>\n }\n @if (funnel(); as segments) {\n @for (segment of segments; track segment.index) {\n <polygon\n class=\"chart-shape\"\n [class.is-dimmed]=\"activeIndex() !== null && activeIndex() !== segment.index\"\n [attr.points]=\"segment.points\"\n [attr.fill]=\"segment.color\"\n (pointerenter)=\"pointerMove(segment.index, $event)\"\n (pointermove)=\"pointerMove(segment.index, $event)\"\n (pointerdown)=\"pointerMove(segment.index, $event)\"\n (pointerleave)=\"pointerLeave()\"\n />\n }\n }\n </svg>\n </div>\n @if (element().showLegend) {\n <div class=\"chart-legend\" [style.color]=\"element().style.color.legend\" aria-hidden=\"true\">\n @for (item of legend(); track item.index) {\n <span class=\"chart-legend-item\"\n ><span class=\"chart-legend-marker\" [style.background]=\"item.color\"></span\n >{{ item.label }}</span\n >\n }\n </div>\n }\n @if (!sensitiveHidden()) {\n <span class=\"visually-hidden\" [id]=\"summaryId\">{{ accessibilitySummary(element()) }}</span>\n <span class=\"visually-hidden\" aria-live=\"polite\">{{ announcement() }}</span>\n }\n</div>\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.hide(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.hide(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.hide(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.hide(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.show(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.hide(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 { tickIncrement, ticks as arrayTicks } from 'd3-array';\nimport { curveMonotoneX, line } from 'd3-shape';\nimport { SeriesElement } from './widget.model';\n\nexport const DEFAULT_SERIES_COLOR = '#5470c6';\nconst CHAR_WIDTH = 0.6;\nconst numberFormat = new Intl.NumberFormat('en-US', { maximumFractionDigits: 2 });\n\nfunction niceDomain(start: number, stop: number, count: number): [number, number] {\n let previous: number | undefined;\n for (let attempt = 0; attempt < 10; attempt++) {\n const step = tickIncrement(start, stop, count);\n if (step === previous || step === 0 || !Number.isFinite(step)) break;\n if (step > 0) {\n start = Math.floor(start / step) * step;\n stop = Math.ceil(stop / step) * step;\n } else {\n start = Math.ceil(start * step) / step;\n stop = Math.floor(stop * step) / step;\n }\n previous = step;\n }\n return [start, stop];\n}\n\nexport interface SeriesChartTick {\n value: number;\n y: number;\n label: string;\n}\n\nexport interface SeriesChartCategory {\n index: number;\n label: string;\n value: number;\n color: string;\n x: number;\n center: number;\n width: number;\n barY: number;\n barHeight: number;\n pointY: number;\n showLabel: boolean;\n}\n\nexport interface SeriesChartLayout {\n width: number;\n height: number;\n plot: { left: number; top: number; right: number; bottom: number };\n title: { x: number; y: number } | null;\n ticks: SeriesChartTick[];\n zeroY: number;\n categories: SeriesChartCategory[];\n linePath: string | null;\n bandWidth: number;\n barWidth: number;\n}\n\nexport function estimateTextWidth(text: string, fontSize: number): number {\n return text.length * fontSize * CHAR_WIDTH;\n}\n\nexport function formatAxisValue(value: number): string {\n return numberFormat.format(value);\n}\n\nexport function seriesChartLayout(\n element: SeriesElement,\n width: number,\n height: number,\n): SeriesChartLayout {\n const fontSize = element.style.font.size;\n const values = element.data.map(({ value }) => value);\n const minValue = Math.min(0, ...values);\n const maxValue = Math.max(0, ...values);\n const top = element.title ? Math.max(30, fontSize + 18) : 12;\n const bottom = Math.max(top + 1, height - fontSize - (element.showLegend ? 38 : 34));\n const plotHeight = Math.max(1, bottom - top);\n const tickCount = Math.min(5, Math.max(2, Math.round(plotHeight / 45)));\n const [domainMin, domainMax] = niceDomain(\n minValue,\n minValue === maxValue ? 1 : maxValue,\n tickCount,\n );\n const y = (value: number) =>\n bottom - ((value - domainMin) / (domainMax - domainMin)) * (bottom - top);\n const ticks = arrayTicks(domainMin, domainMax, tickCount).map((value) => ({\n value,\n y: y(value),\n label: formatAxisValue(value),\n }));\n const labelWidth = Math.max(0, ...ticks.map(({ label }) => estimateTextWidth(label, fontSize)));\n const left = Math.min(width / 2, labelWidth + 34);\n const right = Math.max(left + 1, width - 12);\n const bandWidth = (right - left) / Math.max(1, element.data.length);\n const barWidth = Math.max(1, Math.min(bandWidth * 0.6, 48));\n const labelSlot = Math.max(\n 1,\n ...element.data.map(({ label }) => estimateTextWidth(label, fontSize) + 8),\n );\n const labelInterval = Math.max(1, Math.ceil(labelSlot / Math.max(bandWidth, 1)));\n const zeroY = y(0);\n const lineColor = element.style.color.line ?? DEFAULT_SERIES_COLOR;\n const categories = element.data.map(({ label, value, color }, index) => {\n const bandX = left + index * bandWidth;\n const valueY = y(value);\n return {\n index,\n label,\n value,\n color: color ?? (element.type === 'line' ? lineColor : DEFAULT_SERIES_COLOR),\n x: bandX,\n center: bandX + bandWidth / 2,\n width: bandWidth,\n barY: Math.min(valueY, zeroY),\n barHeight: Math.abs(zeroY - valueY),\n pointY: valueY,\n showLabel: index % labelInterval === 0,\n };\n });\n const linePath =\n element.type === 'line' && categories.length\n ? line<SeriesChartCategory>()\n .x(({ center }) => center)\n .y(({ pointY }) => pointY)\n .curve(curveMonotoneX)(categories)\n : null;\n return {\n width,\n height,\n plot: { left, top, right, bottom },\n title: element.title ? { x: width / 2, y: 5 + fontSize } : null,\n ticks,\n zeroY,\n categories,\n linePath,\n bandWidth,\n barWidth,\n };\n}\n","import { Component, computed } from '@angular/core';\nimport { ChartPoint, InteractiveChart } from './interactive-chart';\nimport { DEFAULT_SERIES_COLOR, seriesChartLayout } from './series-chart-layout';\nimport { SeriesElement } from './widget.model';\n\n@Component({\n selector: 'widget-series-chart',\n templateUrl: './series-chart-renderer.html',\n styleUrl: './chart-renderer.css',\n})\nexport class SeriesChartRenderer extends InteractiveChart<SeriesElement> {\n protected readonly lineColor = computed(\n () => this.element().style.color.line ?? DEFAULT_SERIES_COLOR,\n );\n protected readonly layout = computed(() => {\n const { width, height } = this.size();\n return width > 0 && height > 0 ? seriesChartLayout(this.element(), width, height) : null;\n });\n protected readonly points = computed<ChartPoint[]>(\n () =>\n this.layout()?.categories.map(({ index, label, value, color, center, pointY }) => ({\n index,\n label,\n value,\n color,\n anchorX: center,\n anchorY: pointY,\n })) ?? [],\n );\n}\n","<div\n class=\"chart-chart\"\n [attr.aria-hidden]=\"sensitiveHidden() ? 'true' : null\"\n [style.pointer-events]=\"sensitiveHidden() ? 'none' : null\"\n>\n <div #chartHost class=\"chart-host\">\n <svg\n class=\"chart-svg series-chart\"\n role=\"img\"\n [attr.aria-label]=\"ariaLabel(element())\"\n [attr.aria-describedby]=\"sensitiveHidden() ? null : summaryId\"\n [attr.tabindex]=\"sensitiveHidden() || !element().data.length ? -1 : 0\"\n [attr.width]=\"layout()?.width ?? 0\"\n [attr.height]=\"layout()?.height ?? 0\"\n [attr.viewBox]=\"layout() ? '0 0 ' + layout()!.width + ' ' + layout()!.height : null\"\n [style.font-size.px]=\"element().style.font.size\"\n (focus)=\"focus()\"\n (blur)=\"pointerLeave()\"\n (keydown)=\"keyDown($event)\"\n >\n @if (layout(); as chart) {\n @if (chart.title) {\n <text\n class=\"series-title\"\n text-anchor=\"middle\"\n [attr.x]=\"chart.title.x\"\n [attr.y]=\"chart.title.y\"\n [attr.fill]=\"element().style.color.title\"\n >\n {{ element().title }}\n </text>\n }\n @for (tick of chart.ticks; track tick.value) {\n <line\n [attr.x1]=\"chart.plot.left\"\n [attr.x2]=\"chart.plot.right\"\n [attr.y1]=\"tick.y\"\n [attr.y2]=\"tick.y\"\n [attr.stroke]=\"element().style.axis.grid\"\n />\n <text\n text-anchor=\"end\"\n dominant-baseline=\"middle\"\n [attr.x]=\"chart.plot.left - 8\"\n [attr.y]=\"tick.y\"\n [attr.fill]=\"element().style.axis.label\"\n >\n {{ tick.label }}\n </text>\n }\n @if (activeIndex() !== null && chart.categories[activeIndex()!]; as active) {\n @if (element().type === 'bar') {\n <rect\n class=\"series-pointer\"\n [attr.x]=\"active.x\"\n [attr.y]=\"chart.plot.top\"\n [attr.width]=\"active.width\"\n [attr.height]=\"chart.plot.bottom - chart.plot.top\"\n />\n } @else {\n <line\n class=\"series-pointer-line\"\n [attr.x1]=\"active.center\"\n [attr.x2]=\"active.center\"\n [attr.y1]=\"chart.plot.top\"\n [attr.y2]=\"chart.plot.bottom\"\n />\n }\n }\n @if (element().type === 'bar') {\n @for (category of chart.categories; track category.index) {\n <rect\n [attr.x]=\"category.center - chart.barWidth / 2\"\n [attr.y]=\"category.barY\"\n [attr.width]=\"chart.barWidth\"\n [attr.height]=\"category.barHeight\"\n [attr.fill]=\"category.color\"\n />\n }\n } @else {\n @if (chart.linePath) {\n <path class=\"series-line\" [attr.d]=\"chart.linePath\" [attr.stroke]=\"lineColor()\" />\n }\n @for (category of chart.categories; track category.index) {\n <circle\n class=\"series-point\"\n [attr.cx]=\"category.center\"\n [attr.cy]=\"category.pointY\"\n [attr.r]=\"activeIndex() === category.index ? 5 : 3\"\n [attr.fill]=\"category.color\"\n />\n }\n }\n <line\n [attr.x1]=\"chart.plot.left\"\n [attr.x2]=\"chart.plot.right\"\n [attr.y1]=\"chart.zeroY\"\n [attr.y2]=\"chart.zeroY\"\n [attr.stroke]=\"element().style.axis.line\"\n />\n @for (category of chart.categories; track category.index) {\n <line\n [attr.x1]=\"category.x\"\n [attr.x2]=\"category.x\"\n [attr.y1]=\"chart.plot.bottom\"\n [attr.y2]=\"chart.plot.bottom + 5\"\n [attr.stroke]=\"element().style.axis.line\"\n />\n @if (category.showLabel) {\n <text\n text-anchor=\"middle\"\n dominant-baseline=\"hanging\"\n [attr.x]=\"category.center\"\n [attr.y]=\"chart.plot.bottom + 8\"\n [attr.fill]=\"element().style.axis.label\"\n >\n {{ category.label }}\n </text>\n }\n }\n @if (!sensitiveHidden()) {\n @for (category of chart.categories; track category.index) {\n <rect\n class=\"series-hit\"\n [attr.x]=\"category.x\"\n [attr.y]=\"chart.plot.top\"\n [attr.width]=\"category.width\"\n [attr.height]=\"chart.plot.bottom - chart.plot.top\"\n (pointerenter)=\"pointerMove(category.index, $event)\"\n (pointermove)=\"pointerMove(category.index, $event)\"\n (pointerdown)=\"pointerMove(category.index, $event)\"\n (pointerleave)=\"pointerLeave()\"\n />\n }\n }\n }\n </svg>\n </div>\n @if (!sensitiveHidden()) {\n <span class=\"visually-hidden\" [id]=\"summaryId\">{{ accessibilitySummary(element()) }}</span>\n <span class=\"visually-hidden\" aria-live=\"polite\">{{ announcement() }}</span>\n }\n</div>\n","import { Component, input } from '@angular/core';\nimport {\n ChartElement,\n FunnelElement,\n GaugeElement,\n PieElement,\n ProgressElement,\n SeriesElement,\n WidgetElement,\n} from './widget.model';\nimport { GaugeChartRenderer } from './gauge-chart-renderer';\nimport { PartChartRenderer } from './part-chart-renderer';\nimport { ProgressElementRenderer } from './progress-element-renderer';\nimport { SeriesChartRenderer } from './series-chart-renderer';\nimport { defaultWidgetRendererLocale, WidgetRendererLocale } from './widget-locale';\n\n@Component({\n selector: 'widget-chart-element',\n templateUrl: './chart-element-renderer.html',\n imports: [GaugeChartRenderer, PartChartRenderer, ProgressElementRenderer, SeriesChartRenderer],\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 gauge(element: ChartElement | ProgressElement): GaugeElement {\n return element as GaugeElement;\n }\n\n protected isSeries(element: WidgetElement): element is SeriesElement {\n return element.type === 'bar' || element.type === 'line';\n }\n\n protected series(element: ChartElement | ProgressElement): SeriesElement {\n return element as SeriesElement;\n }\n\n protected isPart(element: WidgetElement): element is PieElement | FunnelElement {\n return element.type === 'pie' || element.type === 'donut' || element.type === 'funnel';\n }\n\n protected part(element: ChartElement | ProgressElement): PieElement | FunnelElement {\n return element as PieElement | FunnelElement;\n }\n}\n","@if (isProgress(element())) {\n <widget-progress-element\n [element]=\"progress(element())\"\n [sensitiveHidden]=\"sensitiveHidden()\"\n [locale]=\"locale()\"\n />\n} @else if (isSeries(element())) {\n <widget-series-chart\n [element]=\"series(element())\"\n [sensitiveHidden]=\"sensitiveHidden()\"\n [locale]=\"locale()\"\n />\n} @else if (isPart(element())) {\n <widget-part-chart\n [element]=\"part(element())\"\n [sensitiveHidden]=\"sensitiveHidden()\"\n [locale]=\"locale()\"\n />\n} @else {\n <widget-gauge-chart\n [element]=\"gauge(element())\"\n [sensitiveHidden]=\"sensitiveHidden()\"\n [locale]=\"locale()\"\n />\n}\n"],"mappings":"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"}
|