@lieselthuriot/widget-renderer 0.1.0 → 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.
@@ -1,722 +0,0 @@
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