@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,722 @@
1
+ import { i as defaultWidgetRendererLocale, n as chartAriaLabel, r as WidgetTooltip, t as chartAccessibilitySummary } from "./lieselthuriot-widget-renderer-chart-accessibility-CXEeXwdH.mjs";
2
+ import * as i0 from "@angular/core";
3
+ import { Component, effect, inject, input, signal, viewChild } from "@angular/core";
4
+ import { init, use } from "echarts/core";
5
+ import { BarChart, FunnelChart, GaugeChart, LineChart, PieChart } from "echarts/charts";
6
+ import { GridComponent, LegendComponent, TitleComponent, TooltipComponent } from "echarts/components";
7
+ import { SVGRenderer } from "echarts/renderers";
8
+ function chartOptions(element, tooltipLayer, tooltipEnabled = true) {
9
+ const base = {
10
+ animation: false,
11
+ title: element.title ? {
12
+ text: element.title,
13
+ left: "center",
14
+ textStyle: {
15
+ fontSize: element.style.font.size,
16
+ color: element.style.color.title
17
+ }
18
+ } : void 0,
19
+ legend: (element.type === "pie" || element.type === "donut" || element.type === "funnel") && element.showLegend ? {
20
+ bottom: 10,
21
+ textStyle: {
22
+ fontSize: element.style.font.size,
23
+ color: element.style.color.legend
24
+ }
25
+ } : void 0,
26
+ tooltip: {
27
+ show: tooltipEnabled,
28
+ trigger: element.type === "pie" || element.type === "donut" || element.type === "funnel" ? "item" : "axis",
29
+ ...tooltipLayer ? {
30
+ appendToBody: false,
31
+ appendTo: tooltipLayer
32
+ } : {}
33
+ }
34
+ };
35
+ if (element.type === "pie" || element.type === "donut") return {
36
+ ...base,
37
+ series: [{
38
+ type: "pie",
39
+ center: ["50%", element.title ? "54%" : "50%"],
40
+ radius: element.type === "donut" ? [element.title ? "34%" : "45%", element.title ? "54%" : "72%"] : element.title ? "62%" : "68%",
41
+ label: { show: false },
42
+ labelLine: { show: false },
43
+ data: element.data.map(({ label, value, color }) => ({
44
+ name: label,
45
+ value,
46
+ ...color ? { itemStyle: { color } } : {}
47
+ }))
48
+ }]
49
+ };
50
+ if (element.type === "funnel") return {
51
+ ...base,
52
+ series: [{
53
+ type: "funnel",
54
+ left: "8%",
55
+ right: "8%",
56
+ top: element.title ? 38 : 12,
57
+ bottom: element.showLegend ? 38 : 12,
58
+ min: 0,
59
+ max: Math.max(...element.data.map(({ value }) => value), 1),
60
+ minSize: "10%",
61
+ maxSize: "88%",
62
+ sort: "descending",
63
+ gap: 3,
64
+ label: { show: false },
65
+ labelLine: { show: false },
66
+ emphasis: {
67
+ label: { show: false },
68
+ labelLine: { show: false }
69
+ },
70
+ data: element.data.map(({ label, value, color }) => ({
71
+ name: label,
72
+ value,
73
+ ...color ? { itemStyle: { color } } : {}
74
+ }))
75
+ }]
76
+ };
77
+ if (element.type === "gauge") {
78
+ const percentage = Math.max(0, Math.min(1, (element.data.value - element.data.min) / (element.data.max - element.data.min)));
79
+ return {
80
+ ...base,
81
+ title: element.title ? {
82
+ text: element.title,
83
+ left: "center",
84
+ bottom: 0,
85
+ textStyle: {
86
+ fontSize: element.style.font.size,
87
+ color: element.style.color.title
88
+ }
89
+ } : void 0,
90
+ series: [{
91
+ type: "gauge",
92
+ center: ["50%", "58%"],
93
+ radius: "78%",
94
+ startAngle: 200,
95
+ endAngle: -20,
96
+ min: element.data.min,
97
+ max: element.data.max,
98
+ splitNumber: 6,
99
+ axisLine: { lineStyle: {
100
+ width: 16,
101
+ cap: "round",
102
+ color: [[percentage, element.style.color.fill], [1, element.style.color.track]]
103
+ } },
104
+ axisTick: {
105
+ distance: -22,
106
+ splitNumber: 5,
107
+ length: 4,
108
+ lineStyle: {
109
+ color: element.style.color.legend,
110
+ width: 1
111
+ }
112
+ },
113
+ splitLine: {
114
+ distance: -24,
115
+ length: 8,
116
+ lineStyle: {
117
+ color: element.style.color.legend,
118
+ width: 2
119
+ }
120
+ },
121
+ axisLabel: {
122
+ show: element.showLegend,
123
+ distance: -2,
124
+ color: element.style.color.legend,
125
+ fontSize: element.style.font.size,
126
+ formatter: (value) => `${Math.round(value)}`
127
+ },
128
+ pointer: {
129
+ show: true,
130
+ length: "55%",
131
+ width: 5,
132
+ itemStyle: { color: element.style.color.legend }
133
+ },
134
+ progress: {
135
+ show: true,
136
+ itemStyle: { color: element.style.color.fill }
137
+ },
138
+ detail: {
139
+ show: element.showLegend,
140
+ valueAnimation: false,
141
+ formatter: (value) => `${Math.round(value)}`,
142
+ color: element.style.color.legend,
143
+ fontSize: element.style.font.size
144
+ },
145
+ data: [{ value: element.data.value }]
146
+ }]
147
+ };
148
+ }
149
+ const seriesElement = element;
150
+ return {
151
+ ...base,
152
+ grid: {
153
+ left: 34,
154
+ right: 12,
155
+ top: element.title ? 30 : 12,
156
+ bottom: element.showLegend ? 28 : 24,
157
+ outerBoundsMode: "same",
158
+ outerBoundsContain: "axisLabel"
159
+ },
160
+ xAxis: {
161
+ type: "category",
162
+ data: element.data.map(({ label }) => label),
163
+ axisLabel: {
164
+ color: seriesElement.style.axis.label,
165
+ fontSize: seriesElement.style.font.size
166
+ },
167
+ axisLine: { lineStyle: { color: seriesElement.style.axis.line } }
168
+ },
169
+ yAxis: {
170
+ type: "value",
171
+ axisLabel: {
172
+ color: seriesElement.style.axis.label,
173
+ fontSize: seriesElement.style.font.size
174
+ },
175
+ axisLine: { lineStyle: { color: seriesElement.style.axis.line } },
176
+ splitLine: { lineStyle: { color: seriesElement.style.axis.grid } }
177
+ },
178
+ series: [{
179
+ type: seriesElement.type,
180
+ data: seriesElement.data.map(({ value, color }) => ({
181
+ value,
182
+ ...seriesElement.type === "line" ? { itemStyle: { color: color ?? seriesElement.style.color.line } } : { itemStyle: { color } }
183
+ })),
184
+ itemStyle: seriesElement.type === "line" ? { color: seriesElement.style.color.line } : void 0,
185
+ lineStyle: seriesElement.type === "line" ? { color: seriesElement.style.color.line } : void 0,
186
+ symbol: seriesElement.type === "line" ? "circle" : void 0,
187
+ smooth: seriesElement.type === "line"
188
+ }]
189
+ };
190
+ }
191
+ use([
192
+ BarChart,
193
+ GaugeChart,
194
+ LineChart,
195
+ PieChart,
196
+ FunnelChart,
197
+ GridComponent,
198
+ LegendComponent,
199
+ TitleComponent,
200
+ TooltipComponent,
201
+ SVGRenderer
202
+ ]);
203
+ var EchartsElementRenderer = class EchartsElementRenderer {
204
+ element = input.required(...ngDevMode ? [{ debugName: "element" }] : /* istanbul ignore next */ []);
205
+ sensitiveHidden = input(false, ...ngDevMode ? [{ debugName: "sensitiveHidden" }] : /* istanbul ignore next */ []);
206
+ locale = input(defaultWidgetRendererLocale, ...ngDevMode ? [{ debugName: "locale" }] : /* istanbul ignore next */ []);
207
+ summaryId = `chart-summary-${crypto.randomUUID()}`;
208
+ chartHost = viewChild("chartHost", ...ngDevMode ? [{ debugName: "chartHost" }] : /* istanbul ignore next */ []);
209
+ chartHostElement = null;
210
+ chartInstance = null;
211
+ resizeObserver = null;
212
+ tooltip = inject(WidgetTooltip);
213
+ constructor() {
214
+ effect(() => {
215
+ const host = this.chartHost()?.nativeElement ?? null;
216
+ if (!host) return;
217
+ if (host !== this.chartHostElement) {
218
+ this.destroyChart();
219
+ this.chartHostElement = host;
220
+ this.chartInstance = init(host, void 0, { renderer: "svg" });
221
+ if (typeof ResizeObserver !== "undefined") {
222
+ const chart = this.chartInstance;
223
+ this.resizeObserver = new ResizeObserver(() => {
224
+ if (this.chartInstance === chart) chart.resize();
225
+ });
226
+ this.resizeObserver.observe(host);
227
+ }
228
+ }
229
+ const tooltipEnabled = !this.sensitiveHidden();
230
+ if (!tooltipEnabled) this.chartInstance?.dispatchAction({ type: "hideTip" });
231
+ this.chartInstance?.setOption(chartOptions(this.element(), this.tooltip.overlayElement() ?? void 0, tooltipEnabled), true);
232
+ });
233
+ }
234
+ ngOnDestroy() {
235
+ this.destroyChart();
236
+ }
237
+ ariaLabel(element) {
238
+ return chartAriaLabel(element, this.locale().aria.chart);
239
+ }
240
+ accessibilitySummary(element) {
241
+ return chartAccessibilitySummary(element, this.locale().aria.chart);
242
+ }
243
+ destroyChart() {
244
+ this.resizeObserver?.disconnect();
245
+ this.chartInstance?.dispose();
246
+ this.resizeObserver = null;
247
+ this.chartInstance = null;
248
+ this.chartHostElement = null;
249
+ }
250
+ static ɵfac = i0.ɵɵngDeclareFactory({
251
+ minVersion: "12.0.0",
252
+ version: "22.2.3",
253
+ ngImport: i0,
254
+ type: EchartsElementRenderer,
255
+ deps: [],
256
+ target: i0.ɵɵFactoryTarget.Component
257
+ });
258
+ static ɵcmp = i0.ɵɵngDeclareComponent({
259
+ minVersion: "17.0.0",
260
+ version: "22.2.3",
261
+ type: EchartsElementRenderer,
262
+ isStandalone: true,
263
+ selector: "widget-echarts-element",
264
+ inputs: {
265
+ element: {
266
+ classPropertyName: "element",
267
+ publicName: "element",
268
+ isSignal: true,
269
+ isRequired: true,
270
+ transformFunction: null
271
+ },
272
+ sensitiveHidden: {
273
+ classPropertyName: "sensitiveHidden",
274
+ publicName: "sensitiveHidden",
275
+ isSignal: true,
276
+ isRequired: false,
277
+ transformFunction: null
278
+ },
279
+ locale: {
280
+ classPropertyName: "locale",
281
+ publicName: "locale",
282
+ isSignal: true,
283
+ isRequired: false,
284
+ transformFunction: null
285
+ }
286
+ },
287
+ viewQueries: [{
288
+ propertyName: "chartHost",
289
+ first: true,
290
+ predicate: ["chartHost"],
291
+ descendants: true,
292
+ isSignal: true
293
+ }],
294
+ ngImport: i0,
295
+ template: `<div
296
+ class="chart-chart"
297
+ [attr.aria-label]="ariaLabel(element())"
298
+ [attr.aria-describedby]="sensitiveHidden() ? null : summaryId"
299
+ [attr.aria-hidden]="sensitiveHidden() ? 'true' : null"
300
+ [style.pointer-events]="sensitiveHidden() ? 'none' : null"
301
+ role="img"
302
+ >
303
+ <div #chartHost class="chart-host"></div>
304
+ @if (!sensitiveHidden()) {
305
+ <span class="visually-hidden" [id]="summaryId">{{ accessibilitySummary(element()) }}</span>
306
+ }
307
+ </div>`,
308
+ isInline: true,
309
+ styles: [":host{display:block;width:100%;height:100%;min-width:0;min-height:0;--widget-renderer-chart-min-height: 40px}.chart-chart{position:relative;width:100%;height:100%;min-height:var(--widget-renderer-chart-min-height)}.chart-host{width:100%;height:100%;min-height:var(--widget-renderer-chart-min-height)}.visually-hidden{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}\n"]
310
+ });
311
+ };
312
+ i0.ɵɵngDeclareClassMetadata({
313
+ minVersion: "12.0.0",
314
+ version: "22.2.3",
315
+ ngImport: i0,
316
+ type: EchartsElementRenderer,
317
+ decorators: [{
318
+ type: Component,
319
+ args: [{
320
+ selector: "widget-echarts-element",
321
+ template: `<div
322
+ class="chart-chart"
323
+ [attr.aria-label]="ariaLabel(element())"
324
+ [attr.aria-describedby]="sensitiveHidden() ? null : summaryId"
325
+ [attr.aria-hidden]="sensitiveHidden() ? 'true' : null"
326
+ [style.pointer-events]="sensitiveHidden() ? 'none' : null"
327
+ role="img"
328
+ >
329
+ <div #chartHost class="chart-host"></div>
330
+ @if (!sensitiveHidden()) {
331
+ <span class="visually-hidden" [id]="summaryId">{{ accessibilitySummary(element()) }}</span>
332
+ }
333
+ </div>`,
334
+ styles: [":host{display:block;width:100%;height:100%;min-width:0;min-height:0;--widget-renderer-chart-min-height: 40px}.chart-chart{position:relative;width:100%;height:100%;min-height:var(--widget-renderer-chart-min-height)}.chart-host{width:100%;height:100%;min-height:var(--widget-renderer-chart-min-height)}.visually-hidden{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}\n"]
335
+ }]
336
+ }],
337
+ ctorParameters: () => [],
338
+ propDecorators: {
339
+ element: [{
340
+ type: i0.Input,
341
+ args: [{
342
+ isSignal: true,
343
+ alias: "element",
344
+ required: true
345
+ }]
346
+ }],
347
+ sensitiveHidden: [{
348
+ type: i0.Input,
349
+ args: [{
350
+ isSignal: true,
351
+ alias: "sensitiveHidden",
352
+ required: false
353
+ }]
354
+ }],
355
+ locale: [{
356
+ type: i0.Input,
357
+ args: [{
358
+ isSignal: true,
359
+ alias: "locale",
360
+ required: false
361
+ }]
362
+ }],
363
+ chartHost: [{
364
+ type: i0.ViewChild,
365
+ args: ["chartHost", { isSignal: true }]
366
+ }]
367
+ }
368
+ });
369
+ var ProgressElementRenderer = class ProgressElementRenderer {
370
+ element = input.required(...ngDevMode ? [{ debugName: "element" }] : /* istanbul ignore next */ []);
371
+ sensitiveHidden = input(false, ...ngDevMode ? [{ debugName: "sensitiveHidden" }] : /* istanbul ignore next */ []);
372
+ locale = input(defaultWidgetRendererLocale, ...ngDevMode ? [{ debugName: "locale" }] : /* istanbul ignore next */ []);
373
+ summaryId = `progress-summary-${crypto.randomUUID()}`;
374
+ tooltipIndex = signal(null, ...ngDevMode ? [{ debugName: "tooltipIndex" }] : /* istanbul ignore next */ []);
375
+ widgetTooltip = inject(WidgetTooltip);
376
+ tooltipOwner = {};
377
+ tooltipHideTimer = null;
378
+ constructor() {
379
+ effect(() => {
380
+ this.element();
381
+ this.sensitiveHidden();
382
+ this.clearTooltip();
383
+ });
384
+ }
385
+ ngOnDestroy() {
386
+ this.cancelTooltipHide();
387
+ this.widgetTooltip.hideProgress(this.tooltipOwner);
388
+ }
389
+ progressStyle(element) {
390
+ const radius = element.style.radius ?? {
391
+ segment: 0,
392
+ track: 999
393
+ };
394
+ return {
395
+ "--progress-track": element.style.color.track,
396
+ "--progress-title-color": element.style.color.title,
397
+ "--progress-legend-color": element.style.color.legend,
398
+ "--progress-font-size": `${element.style?.font.size ?? 11}px`,
399
+ "--progress-segment-radius": `${radius.segment}px`,
400
+ "--progress-track-radius": `${radius.track}px`
401
+ };
402
+ }
403
+ progressItems(element) {
404
+ const range = element.data.max - element.data.min;
405
+ let position = element.data.min;
406
+ return element.data.items.map((item, index) => {
407
+ const start = position;
408
+ position += item.value;
409
+ return {
410
+ item,
411
+ index,
412
+ start,
413
+ end: position,
414
+ width: item.value / range * 100,
415
+ center: (start - element.data.min + item.value / 2) / range * 100
416
+ };
417
+ });
418
+ }
419
+ progressSegments(element) {
420
+ return this.progressItems(element).filter(({ item }) => item.kind === "segment");
421
+ }
422
+ segment(item) {
423
+ return item;
424
+ }
425
+ segmentStyle(width, color) {
426
+ return {
427
+ width: `${width}%`,
428
+ ...color ? { background: color } : {}
429
+ };
430
+ }
431
+ progressValue(element) {
432
+ return element.data.items.reduce((total, item) => total + (item.kind === "segment" ? item.value : 0), 0);
433
+ }
434
+ showTooltip(index, event) {
435
+ if (this.sensitiveHidden()) return;
436
+ this.cancelTooltipHide();
437
+ this.showTooltipAt(index, event.currentTarget instanceof HTMLElement ? event.currentTarget : event.target instanceof HTMLElement ? event.target : null);
438
+ }
439
+ hideTooltip(index) {
440
+ this.cancelTooltipHide();
441
+ this.tooltipHideTimer = setTimeout(() => {
442
+ if (this.tooltipIndex() === index) {
443
+ this.tooltipIndex.set(null);
444
+ this.widgetTooltip.hideProgress(this.tooltipOwner);
445
+ }
446
+ this.tooltipHideTimer = null;
447
+ }, 100);
448
+ }
449
+ moveTooltip(index, event) {
450
+ if (this.sensitiveHidden() || event.pointerType === "touch") return;
451
+ this.positionTooltip(index, event);
452
+ }
453
+ toggleTouchTooltip(index, event) {
454
+ if (this.sensitiveHidden() || event.pointerType === "mouse") return;
455
+ event.stopPropagation();
456
+ this.cancelTooltipHide();
457
+ if (this.tooltipIndex() === index) {
458
+ this.tooltipIndex.set(null);
459
+ this.widgetTooltip.hideProgress(this.tooltipOwner);
460
+ return;
461
+ }
462
+ this.positionTooltip(index, event);
463
+ }
464
+ segmentKeyDown(index, event) {
465
+ if (event.key !== "Escape") return;
466
+ event.preventDefault();
467
+ this.hideTooltip(index);
468
+ }
469
+ onDocumentPointerDown(event) {
470
+ if (!(event.target instanceof Element) || !event.target.closest(".progress-segment")) {
471
+ this.tooltipIndex.set(null);
472
+ this.widgetTooltip.hideProgress(this.tooltipOwner);
473
+ }
474
+ }
475
+ positionTooltip(index, event) {
476
+ const target = event.currentTarget;
477
+ if (!(target instanceof HTMLElement)) return;
478
+ this.showTooltipAt(index, target, event.clientX, event.clientY);
479
+ }
480
+ showTooltipAt(index, target, x, y) {
481
+ if (!target) return;
482
+ const shell = this.widgetTooltip.overlayElement()?.parentElement;
483
+ if (!shell) return;
484
+ const bounds = shell.getBoundingClientRect();
485
+ const targetBounds = target.getBoundingClientRect();
486
+ const entry = this.progressSegments(this.element()).find(({ index: entryIndex }) => entryIndex === index);
487
+ if (!entry) return;
488
+ const segment = this.segment(entry.item);
489
+ this.tooltipIndex.set(index);
490
+ this.widgetTooltip.showProgress(this.tooltipOwner, {
491
+ x: (x ?? targetBounds.left + targetBounds.width / 2) - bounds.left,
492
+ y: (y ?? targetBounds.top) - bounds.top,
493
+ label: segment.label,
494
+ value: segment.value,
495
+ color: segment.color
496
+ });
497
+ }
498
+ cancelTooltipHide() {
499
+ if (this.tooltipHideTimer) clearTimeout(this.tooltipHideTimer);
500
+ this.tooltipHideTimer = null;
501
+ }
502
+ clearTooltip() {
503
+ this.cancelTooltipHide();
504
+ this.tooltipIndex.set(null);
505
+ this.widgetTooltip.hideProgress(this.tooltipOwner);
506
+ }
507
+ progressTextAlign(element) {
508
+ return (element.grid.anchor ?? "center").endsWith("left") ? "left" : (element.grid.anchor ?? "center").endsWith("right") ? "right" : "center";
509
+ }
510
+ ariaLabel(element) {
511
+ return chartAriaLabel(element, this.locale().aria.chart);
512
+ }
513
+ accessibilitySummary(element) {
514
+ return chartAccessibilitySummary(element, this.locale().aria.chart);
515
+ }
516
+ static ɵfac = i0.ɵɵngDeclareFactory({
517
+ minVersion: "12.0.0",
518
+ version: "22.2.3",
519
+ ngImport: i0,
520
+ type: ProgressElementRenderer,
521
+ deps: [],
522
+ target: i0.ɵɵFactoryTarget.Component
523
+ });
524
+ static ɵcmp = i0.ɵɵngDeclareComponent({
525
+ minVersion: "17.0.0",
526
+ version: "22.2.3",
527
+ type: ProgressElementRenderer,
528
+ isStandalone: true,
529
+ selector: "widget-progress-element",
530
+ inputs: {
531
+ element: {
532
+ classPropertyName: "element",
533
+ publicName: "element",
534
+ isSignal: true,
535
+ isRequired: true,
536
+ transformFunction: null
537
+ },
538
+ sensitiveHidden: {
539
+ classPropertyName: "sensitiveHidden",
540
+ publicName: "sensitiveHidden",
541
+ isSignal: true,
542
+ isRequired: false,
543
+ transformFunction: null
544
+ },
545
+ locale: {
546
+ classPropertyName: "locale",
547
+ publicName: "locale",
548
+ isSignal: true,
549
+ isRequired: false,
550
+ transformFunction: null
551
+ }
552
+ },
553
+ host: {
554
+ listeners: { "document:pointerdown": "onDocumentPointerDown($event)" },
555
+ classAttribute: "is-progress"
556
+ },
557
+ ngImport: i0,
558
+ template: "<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",
559
+ styles: [":host{display:block;width:100%;height:auto;max-height:100%;--widget-renderer-progress-label-padding: 6px}.progress-element{display:flex;width:100%;flex-direction:column;justify-content:center;gap:7px;color:inherit;font-size:11px}.progress-track{display:flex;overflow:hidden;height:10px;border:1px solid transparent;border-radius:var(--progress-track-radius);background:var(--progress-track)}.progress-track-wrap{position:relative;display:block}.progress-title{padding-inline:var(--widget-renderer-progress-label-padding);overflow:hidden;color:var(--progress-title-color);font-size:var(--progress-font-size);text-overflow:ellipsis;white-space:nowrap}.progress-item{position:relative;display:block;flex:0 0 auto;height:100%;padding:0;border:0;border-radius:var(--progress-segment-radius)}.progress-segment{cursor:pointer}.progress-segment:focus-visible{z-index:1;outline:2px solid currentColor;outline-offset:-2px}.progress-segment.is-active{overflow:hidden}.progress-segment.is-active:after{position:absolute;inset:0;content:\"\";background:repeating-linear-gradient(135deg,transparent 0,transparent 18px,rgb(255 255 255 / .18) 18px,rgb(255 255 255 / .18) 36px);background-position:0 0;background-size:51px 51px;animation:progress-active .9s linear infinite}@keyframes progress-active{0%{background-position:0 0}to{background-position:51px 0}}@media(prefers-reduced-motion:reduce){.progress-segment.is-active:after,.progress-tooltip{animation:none;transition:none}}.progress-legend{display:flex;flex-wrap:wrap;gap:5px 12px;padding-inline:var(--widget-renderer-progress-label-padding)}.progress-label{display:inline-flex;align-items:center;gap:5px;color:var(--progress-legend-color);font-size:var(--progress-font-size)}.legend-marker,.tooltip-marker{width:9px;height:9px;flex:0 0 auto;border-radius:50%}.progress-tooltip{--tooltip-x: 50%;--tooltip-y: 0px;--tooltip-border: rgb(0 0 0 / .12);position:absolute;z-index:4;top:var(--tooltip-y);left:clamp(64px,var(--tooltip-x),calc(100% - 64px));display:flex;min-width:104px;align-items:center;gap:7px;padding:10px;transform:translate(-50%,calc(-100% - 10px));transition:left .4s cubic-bezier(.23,1,.32,1),top .4s cubic-bezier(.23,1,.32,1);border:1px solid var(--tooltip-border);border-radius:var(--widget-renderer-radius, 4px);background:var(--widget-renderer-control-hover-background, #fff);box-shadow:1px 2px 10px #0003;color:#6e7079;font-size:14px;font-weight:400;line-height:1;pointer-events:none;white-space:nowrap}.progress-tooltip strong{margin-inline-start:auto;color:#464646;font-size:14px;font-weight:900}.visually-hidden{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}\n"]
560
+ });
561
+ };
562
+ i0.ɵɵngDeclareClassMetadata({
563
+ minVersion: "12.0.0",
564
+ version: "22.2.3",
565
+ ngImport: i0,
566
+ type: ProgressElementRenderer,
567
+ decorators: [{
568
+ type: Component,
569
+ args: [{
570
+ selector: "widget-progress-element",
571
+ host: {
572
+ class: "is-progress",
573
+ "(document:pointerdown)": "onDocumentPointerDown($event)"
574
+ },
575
+ template: "<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",
576
+ styles: [":host{display:block;width:100%;height:auto;max-height:100%;--widget-renderer-progress-label-padding: 6px}.progress-element{display:flex;width:100%;flex-direction:column;justify-content:center;gap:7px;color:inherit;font-size:11px}.progress-track{display:flex;overflow:hidden;height:10px;border:1px solid transparent;border-radius:var(--progress-track-radius);background:var(--progress-track)}.progress-track-wrap{position:relative;display:block}.progress-title{padding-inline:var(--widget-renderer-progress-label-padding);overflow:hidden;color:var(--progress-title-color);font-size:var(--progress-font-size);text-overflow:ellipsis;white-space:nowrap}.progress-item{position:relative;display:block;flex:0 0 auto;height:100%;padding:0;border:0;border-radius:var(--progress-segment-radius)}.progress-segment{cursor:pointer}.progress-segment:focus-visible{z-index:1;outline:2px solid currentColor;outline-offset:-2px}.progress-segment.is-active{overflow:hidden}.progress-segment.is-active:after{position:absolute;inset:0;content:\"\";background:repeating-linear-gradient(135deg,transparent 0,transparent 18px,rgb(255 255 255 / .18) 18px,rgb(255 255 255 / .18) 36px);background-position:0 0;background-size:51px 51px;animation:progress-active .9s linear infinite}@keyframes progress-active{0%{background-position:0 0}to{background-position:51px 0}}@media(prefers-reduced-motion:reduce){.progress-segment.is-active:after,.progress-tooltip{animation:none;transition:none}}.progress-legend{display:flex;flex-wrap:wrap;gap:5px 12px;padding-inline:var(--widget-renderer-progress-label-padding)}.progress-label{display:inline-flex;align-items:center;gap:5px;color:var(--progress-legend-color);font-size:var(--progress-font-size)}.legend-marker,.tooltip-marker{width:9px;height:9px;flex:0 0 auto;border-radius:50%}.progress-tooltip{--tooltip-x: 50%;--tooltip-y: 0px;--tooltip-border: rgb(0 0 0 / .12);position:absolute;z-index:4;top:var(--tooltip-y);left:clamp(64px,var(--tooltip-x),calc(100% - 64px));display:flex;min-width:104px;align-items:center;gap:7px;padding:10px;transform:translate(-50%,calc(-100% - 10px));transition:left .4s cubic-bezier(.23,1,.32,1),top .4s cubic-bezier(.23,1,.32,1);border:1px solid var(--tooltip-border);border-radius:var(--widget-renderer-radius, 4px);background:var(--widget-renderer-control-hover-background, #fff);box-shadow:1px 2px 10px #0003;color:#6e7079;font-size:14px;font-weight:400;line-height:1;pointer-events:none;white-space:nowrap}.progress-tooltip strong{margin-inline-start:auto;color:#464646;font-size:14px;font-weight:900}.visually-hidden{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}\n"]
577
+ }]
578
+ }],
579
+ ctorParameters: () => [],
580
+ propDecorators: {
581
+ element: [{
582
+ type: i0.Input,
583
+ args: [{
584
+ isSignal: true,
585
+ alias: "element",
586
+ required: true
587
+ }]
588
+ }],
589
+ sensitiveHidden: [{
590
+ type: i0.Input,
591
+ args: [{
592
+ isSignal: true,
593
+ alias: "sensitiveHidden",
594
+ required: false
595
+ }]
596
+ }],
597
+ locale: [{
598
+ type: i0.Input,
599
+ args: [{
600
+ isSignal: true,
601
+ alias: "locale",
602
+ required: false
603
+ }]
604
+ }]
605
+ }
606
+ });
607
+ var ChartElementRenderer = class ChartElementRenderer {
608
+ element = input.required(...ngDevMode ? [{ debugName: "element" }] : /* istanbul ignore next */ []);
609
+ sensitiveHidden = input(false, ...ngDevMode ? [{ debugName: "sensitiveHidden" }] : /* istanbul ignore next */ []);
610
+ locale = input(defaultWidgetRendererLocale, ...ngDevMode ? [{ debugName: "locale" }] : /* istanbul ignore next */ []);
611
+ isProgress(element) {
612
+ return element.type === "progress";
613
+ }
614
+ progress(element) {
615
+ return element;
616
+ }
617
+ chart(element) {
618
+ return element;
619
+ }
620
+ static ɵfac = i0.ɵɵngDeclareFactory({
621
+ minVersion: "12.0.0",
622
+ version: "22.2.3",
623
+ ngImport: i0,
624
+ type: ChartElementRenderer,
625
+ deps: [],
626
+ target: i0.ɵɵFactoryTarget.Component
627
+ });
628
+ static ɵcmp = i0.ɵɵngDeclareComponent({
629
+ minVersion: "17.0.0",
630
+ version: "22.2.3",
631
+ type: ChartElementRenderer,
632
+ isStandalone: true,
633
+ selector: "widget-chart-element",
634
+ inputs: {
635
+ element: {
636
+ classPropertyName: "element",
637
+ publicName: "element",
638
+ isSignal: true,
639
+ isRequired: true,
640
+ transformFunction: null
641
+ },
642
+ sensitiveHidden: {
643
+ classPropertyName: "sensitiveHidden",
644
+ publicName: "sensitiveHidden",
645
+ isSignal: true,
646
+ isRequired: false,
647
+ transformFunction: null
648
+ },
649
+ locale: {
650
+ classPropertyName: "locale",
651
+ publicName: "locale",
652
+ isSignal: true,
653
+ isRequired: false,
654
+ transformFunction: null
655
+ }
656
+ },
657
+ ngImport: i0,
658
+ template: "@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",
659
+ dependencies: [{
660
+ kind: "component",
661
+ type: EchartsElementRenderer,
662
+ selector: "widget-echarts-element",
663
+ inputs: [
664
+ "element",
665
+ "sensitiveHidden",
666
+ "locale"
667
+ ]
668
+ }, {
669
+ kind: "component",
670
+ type: ProgressElementRenderer,
671
+ selector: "widget-progress-element",
672
+ inputs: [
673
+ "element",
674
+ "sensitiveHidden",
675
+ "locale"
676
+ ]
677
+ }]
678
+ });
679
+ };
680
+ i0.ɵɵngDeclareClassMetadata({
681
+ minVersion: "12.0.0",
682
+ version: "22.2.3",
683
+ ngImport: i0,
684
+ type: ChartElementRenderer,
685
+ decorators: [{
686
+ type: Component,
687
+ args: [{
688
+ selector: "widget-chart-element",
689
+ imports: [EchartsElementRenderer, ProgressElementRenderer],
690
+ template: "@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"
691
+ }]
692
+ }],
693
+ propDecorators: {
694
+ element: [{
695
+ type: i0.Input,
696
+ args: [{
697
+ isSignal: true,
698
+ alias: "element",
699
+ required: true
700
+ }]
701
+ }],
702
+ sensitiveHidden: [{
703
+ type: i0.Input,
704
+ args: [{
705
+ isSignal: true,
706
+ alias: "sensitiveHidden",
707
+ required: false
708
+ }]
709
+ }],
710
+ locale: [{
711
+ type: i0.Input,
712
+ args: [{
713
+ isSignal: true,
714
+ alias: "locale",
715
+ required: false
716
+ }]
717
+ }]
718
+ }
719
+ });
720
+ export { ChartElementRenderer };
721
+
722
+ //# sourceMappingURL=lieselthuriot-widget-renderer-chart-element-renderer-BO3V-jYo.mjs.map