@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,1435 @@
1
+ import { a as dutchWidgetRendererLocale, i as defaultWidgetRendererLocale, n as chartAriaLabel, o as frenchWidgetRendererLocale, r as WidgetTooltip, s as germanWidgetRendererLocale, t as chartAccessibilitySummary } from "./lieselthuriot-widget-renderer-chart-accessibility-CXEeXwdH.mjs";
2
+ import * as i0 from "@angular/core";
3
+ import { Component, computed, effect, inject, input, output, signal, viewChild } from "@angular/core";
4
+ function normalizeElement(element) {
5
+ return {
6
+ ...element,
7
+ ...element.type === "text" && !element.style.padding ? { style: {
8
+ ...element.style,
9
+ padding: {
10
+ vertical: 0,
11
+ horizontal: 0
12
+ }
13
+ } } : {},
14
+ ...element.type === "button" ? {
15
+ requestRefresh: element.requestRefresh ?? false,
16
+ showOnlyOnHover: element.showOnlyOnHover ?? false
17
+ } : {},
18
+ sensitive: element.type === "divider" ? false : element.sensitive
19
+ };
20
+ }
21
+ function normalizeWidgetInput(widget) {
22
+ return {
23
+ ...widget,
24
+ elements: widget.elements.map(normalizeElement)
25
+ };
26
+ }
27
+ var WidgetValidationError = class extends Error {
28
+ issues;
29
+ constructor(issues) {
30
+ super(issues.map(({ path, message }) => `${path}: ${message}`).join("; "));
31
+ this.issues = issues;
32
+ this.name = "WidgetValidationError";
33
+ }
34
+ };
35
+ const anchors = [
36
+ "top left",
37
+ "top center",
38
+ "top right",
39
+ "center left",
40
+ "center",
41
+ "center right",
42
+ "bottom left",
43
+ "bottom center",
44
+ "bottom right"
45
+ ];
46
+ const elementTypes = [
47
+ "text",
48
+ "image",
49
+ "button",
50
+ "divider",
51
+ "pie",
52
+ "donut",
53
+ "funnel",
54
+ "gauge",
55
+ "bar",
56
+ "line",
57
+ "progress"
58
+ ];
59
+ const gridUnits = [
60
+ "pixel",
61
+ "auto",
62
+ "star"
63
+ ];
64
+ function isRecord(value) {
65
+ return typeof value === "object" && value !== null && !Array.isArray(value);
66
+ }
67
+ function isString(value) {
68
+ return typeof value === "string";
69
+ }
70
+ function isBoolean(value) {
71
+ return typeof value === "boolean";
72
+ }
73
+ function isFiniteNumber(value) {
74
+ return typeof value === "number" && Number.isFinite(value);
75
+ }
76
+ function isOneOf(value, values) {
77
+ return typeof value === "string" && values.includes(value);
78
+ }
79
+ function addIssue(issues, path, message) {
80
+ issues.push({
81
+ path,
82
+ message
83
+ });
84
+ }
85
+ function requiredString(value, path, issues, allowEmpty = false) {
86
+ if (!isString(value) || !allowEmpty && value.length === 0) {
87
+ addIssue(issues, path, allowEmpty ? "must be a string" : "must be a non-empty string");
88
+ return false;
89
+ }
90
+ return true;
91
+ }
92
+ function requiredBoolean(value, path, issues) {
93
+ if (!isBoolean(value)) {
94
+ addIssue(issues, path, "must be a boolean");
95
+ return false;
96
+ }
97
+ return true;
98
+ }
99
+ function requiredNumber(value, path, issues, minimum = 0) {
100
+ if (!isFiniteNumber(value) || value < minimum) {
101
+ addIssue(issues, path, `must be a finite number greater than or equal to ${minimum}`);
102
+ return false;
103
+ }
104
+ return true;
105
+ }
106
+ function validateTextFont(value, path, issues) {
107
+ if (!isRecord(value)) {
108
+ addIssue(issues, path, "must be an object");
109
+ return;
110
+ }
111
+ requiredNumber(value["size"], `${path}.size`, issues, 1);
112
+ for (const key of [
113
+ "bold",
114
+ "italic",
115
+ "underline",
116
+ "strikethrough"
117
+ ]) if (value[key] !== void 0) requiredBoolean(value[key], `${path}.${key}`, issues);
118
+ }
119
+ function validateChartFont(value, path, issues) {
120
+ if (!isRecord(value)) {
121
+ addIssue(issues, path, "must be an object");
122
+ return;
123
+ }
124
+ requiredNumber(value["size"], `${path}.size`, issues, 1);
125
+ }
126
+ function validateGrid(value, path, issues) {
127
+ if (!isRecord(value)) {
128
+ addIssue(issues, path, "must be an object");
129
+ return;
130
+ }
131
+ requiredNumber(value["row"], `${path}.row`, issues);
132
+ requiredNumber(value["column"], `${path}.column`, issues);
133
+ requiredNumber(value["rowSpan"], `${path}.rowSpan`, issues, 1);
134
+ requiredNumber(value["columnSpan"], `${path}.columnSpan`, issues, 1);
135
+ if (value["anchor"] !== void 0 && !isOneOf(value["anchor"], anchors)) addIssue(issues, `${path}.anchor`, "has an unsupported value");
136
+ }
137
+ function validateStyle(value, path, issues, axisMode = "optional", fontMode = "chart", requiredColors = []) {
138
+ if (!isRecord(value)) {
139
+ addIssue(issues, path, "must be an object");
140
+ return;
141
+ }
142
+ (fontMode === "text" ? validateTextFont : validateChartFont)(value["font"], `${path}.font`, issues);
143
+ const color = value["color"];
144
+ if (isRecord(color)) {
145
+ for (const key of [
146
+ "legend",
147
+ "title",
148
+ "line",
149
+ "fill",
150
+ "track"
151
+ ]) if (requiredColors.includes(key) || color[key] !== void 0) requiredString(color[key], `${path}.color.${key}`, issues, true);
152
+ } else if (requiredColors.length) addIssue(issues, `${path}.color`, "must be an object");
153
+ else requiredString(color, `${path}.color`, issues, true);
154
+ if (axisMode === "required") {
155
+ if (!isRecord(value["axis"])) addIssue(issues, `${path}.axis`, "must be an object");
156
+ else for (const key of [
157
+ "label",
158
+ "line",
159
+ "grid"
160
+ ]) requiredString(value["axis"][key], `${path}.axis.${key}`, issues, true);
161
+ } else if (axisMode === "forbidden" && value["axis"] !== void 0) addIssue(issues, `${path}.axis`, "is not supported for this chart");
162
+ }
163
+ function validateDataPoints(value, path, issues, allowNullColor) {
164
+ if (!Array.isArray(value)) {
165
+ addIssue(issues, path, "must be an array");
166
+ return;
167
+ }
168
+ value.forEach((point, index) => {
169
+ const pointPath = `${path}[${index}]`;
170
+ if (!isRecord(point)) {
171
+ addIssue(issues, pointPath, "must be an object");
172
+ return;
173
+ }
174
+ requiredString(point["label"], `${pointPath}.label`, issues, true);
175
+ requiredNumber(point["value"], `${pointPath}.value`, issues);
176
+ if (point["color"] === void 0) {
177
+ if (!allowNullColor) addIssue(issues, `${pointPath}.color`, "must be a string");
178
+ } else if (point["color"] === null) {
179
+ if (!allowNullColor) addIssue(issues, `${pointPath}.color`, "must be a string");
180
+ } else requiredString(point["color"], `${pointPath}.color`, issues, true);
181
+ });
182
+ }
183
+ function validateProgressData(value, path, issues) {
184
+ if (!isRecord(value)) {
185
+ addIssue(issues, path, "must be an object");
186
+ return;
187
+ }
188
+ requiredNumber(value["min"], `${path}.min`, issues);
189
+ requiredNumber(value["max"], `${path}.max`, issues);
190
+ if (typeof value["min"] === "number" && typeof value["max"] === "number" && value["min"] >= value["max"]) addIssue(issues, `${path}.max`, "must be greater than min");
191
+ const items = value["items"];
192
+ if (!Array.isArray(items)) {
193
+ addIssue(issues, `${path}.items`, "must be an array");
194
+ return;
195
+ }
196
+ let total = 0;
197
+ items.forEach((item, index) => {
198
+ const itemPath = `${path}.items[${index}]`;
199
+ if (!isRecord(item)) {
200
+ addIssue(issues, itemPath, "must be an object");
201
+ return;
202
+ }
203
+ if (!isOneOf(item["kind"], ["segment", "gap"])) {
204
+ addIssue(issues, `${itemPath}.kind`, "has an unsupported value");
205
+ return;
206
+ }
207
+ requiredNumber(item["value"], `${itemPath}.value`, issues);
208
+ if (typeof item["value"] === "number" && Number.isFinite(item["value"])) {
209
+ if (item["value"] < 0) addIssue(issues, `${itemPath}.value`, "must not be negative");
210
+ else total += item["value"];
211
+ }
212
+ if (item["kind"] === "segment") {
213
+ requiredString(item["label"], `${itemPath}.label`, issues);
214
+ requiredString(item["color"], `${itemPath}.color`, issues);
215
+ requiredBoolean(item["active"], `${itemPath}.active`, issues);
216
+ }
217
+ });
218
+ if (typeof value["min"] === "number" && typeof value["max"] === "number" && Number.isFinite(value["min"]) && Number.isFinite(value["max"]) && total > value["max"] - value["min"]) addIssue(issues, `${path}.items`, "total value must not exceed the progress range");
219
+ }
220
+ function validateElement(value, path, issues) {
221
+ if (!isRecord(value)) {
222
+ addIssue(issues, path, "must be an object");
223
+ return;
224
+ }
225
+ const issuePath = path;
226
+ if (!isOneOf(value["type"], elementTypes)) {
227
+ addIssue(issues, `${issuePath}.type`, "has an unsupported value");
228
+ return;
229
+ }
230
+ validateGrid(value["grid"], `${issuePath}.grid`, issues);
231
+ if (value["type"] !== "divider" || value["sensitive"] !== void 0) requiredBoolean(value["sensitive"], `${issuePath}.sensitive`, issues);
232
+ switch (value["type"]) {
233
+ case "text":
234
+ requiredString(value["text"], `${issuePath}.text`, issues, true);
235
+ validateStyle(value["style"], `${issuePath}.style`, issues, "optional", "text");
236
+ if (!isRecord(value["style"])) break;
237
+ requiredString(value["style"]["color"], `${issuePath}.style.color`, issues, true);
238
+ if (value["style"]["background"] !== void 0) requiredString(value["style"]["background"], `${issuePath}.style.background`, issues, true);
239
+ if (value["style"]["padding"] !== void 0) {
240
+ const padding = value["style"]["padding"];
241
+ if (padding !== null && !isRecord(padding)) addIssue(issues, `${issuePath}.style.padding`, "must be an object or null");
242
+ else if (padding !== null) {
243
+ requiredNumber(padding["vertical"], `${issuePath}.style.padding.vertical`, issues);
244
+ requiredNumber(padding["horizontal"], `${issuePath}.style.padding.horizontal`, issues);
245
+ }
246
+ }
247
+ if (value["style"]["radius"] !== void 0) requiredNumber(value["style"]["radius"], `${issuePath}.style.radius`, issues);
248
+ if (!isOneOf(value["style"]["align"], [
249
+ "left",
250
+ "center",
251
+ "right"
252
+ ])) addIssue(issues, `${issuePath}.style.align`, "has an unsupported value");
253
+ requiredBoolean(value["style"]["wrap"], `${issuePath}.style.wrap`, issues);
254
+ break;
255
+ case "image":
256
+ requiredString(value["source"], `${issuePath}.source`, issues);
257
+ requiredString(value["alt"], `${issuePath}.alt`, issues, true);
258
+ if (!isOneOf(value["fit"], [
259
+ "cover",
260
+ "contain",
261
+ "fill"
262
+ ])) addIssue(issues, `${issuePath}.fit`, "has an unsupported value");
263
+ requiredNumber(value["radius"], `${issuePath}.radius`, issues);
264
+ break;
265
+ case "button":
266
+ requiredString(value["label"], `${issuePath}.label`, issues, true);
267
+ if (!isOneOf(value["method"], ["get", "post"])) addIssue(issues, `${issuePath}.method`, "has an unsupported value");
268
+ requiredString(value["url"], `${issuePath}.url`, issues, true);
269
+ if (value["body"] !== void 0 && value["body"] !== null && !isString(value["body"])) addIssue(issues, `${issuePath}.body`, "must be a string or null");
270
+ if (value["method"] === "get" && value["body"] !== void 0 && value["body"] !== null) addIssue(issues, `${issuePath}.body`, "must be empty for GET buttons");
271
+ if (value["requestRefresh"] !== void 0) requiredBoolean(value["requestRefresh"], `${issuePath}.requestRefresh`, issues);
272
+ if (value["showOnlyOnHover"] !== void 0) requiredBoolean(value["showOnlyOnHover"], `${issuePath}.showOnlyOnHover`, issues);
273
+ if (!isOneOf(value["style"], ["solid", "outline"])) addIssue(issues, `${issuePath}.style`, "has an unsupported value");
274
+ break;
275
+ case "divider":
276
+ if (!isOneOf(value["orientation"], ["horizontal", "vertical"])) addIssue(issues, `${issuePath}.orientation`, "has an unsupported value");
277
+ if (!isRecord(value["style"])) addIssue(issues, `${issuePath}.style`, "must be an object");
278
+ else requiredString(value["style"]["color"], `${issuePath}.style.color`, issues);
279
+ break;
280
+ case "gauge":
281
+ if (value["title"] !== void 0) requiredString(value["title"], `${issuePath}.title`, issues, true);
282
+ requiredBoolean(value["showLegend"], `${issuePath}.showLegend`, issues);
283
+ validateRange(value["data"], `${issuePath}.data`, issues, false);
284
+ validateStyle(value["style"], `${issuePath}.style`, issues, "optional", "chart", [
285
+ "legend",
286
+ "title",
287
+ "fill",
288
+ "track"
289
+ ]);
290
+ break;
291
+ case "progress":
292
+ if (value["title"] !== void 0) requiredString(value["title"], `${issuePath}.title`, issues, true);
293
+ validateProgressData(value["data"], `${issuePath}.data`, issues);
294
+ validateStyle(value["style"], `${issuePath}.style`, issues, "optional", "chart", [
295
+ "legend",
296
+ "title",
297
+ "track"
298
+ ]);
299
+ if (isRecord(value["style"])) {
300
+ const radius = value["style"]["radius"];
301
+ if (radius !== void 0 && radius !== null) {
302
+ if (!isRecord(radius)) addIssue(issues, `${issuePath}.style.radius`, "must be an object, null, or undefined");
303
+ else {
304
+ requiredNumber(radius["segment"], `${issuePath}.style.radius.segment`, issues);
305
+ requiredNumber(radius["track"], `${issuePath}.style.radius.track`, issues);
306
+ }
307
+ }
308
+ }
309
+ requiredBoolean(value["showLegend"], `${issuePath}.showLegend`, issues);
310
+ break;
311
+ case "pie":
312
+ case "donut":
313
+ case "funnel":
314
+ case "bar":
315
+ case "line":
316
+ if (value["title"] !== void 0) requiredString(value["title"], `${issuePath}.title`, issues, true);
317
+ requiredBoolean(value["showLegend"], `${issuePath}.showLegend`, issues);
318
+ validateDataPoints(value["data"], `${issuePath}.data`, issues, value["type"] === "line");
319
+ validateStyle(value["style"], `${issuePath}.style`, issues, value["type"] === "pie" || value["type"] === "donut" || value["type"] === "funnel" ? "forbidden" : "required", "chart", value["type"] === "bar" || value["type"] === "line" ? [
320
+ "legend",
321
+ "title",
322
+ "line"
323
+ ] : ["legend", "title"]);
324
+ }
325
+ }
326
+ function validateRange(value, path, issues, hasLabel) {
327
+ if (!isRecord(value)) {
328
+ addIssue(issues, path, "must be an object");
329
+ return;
330
+ }
331
+ if (hasLabel) requiredString(value["label"], `${path}.label`, issues, true);
332
+ if (hasLabel) {
333
+ optionalString(value["separator"], `${path}.separator`, issues);
334
+ optionalString(value["suffix"], `${path}.suffix`, issues);
335
+ }
336
+ requiredNumber(value["value"], `${path}.value`, issues);
337
+ requiredNumber(value["min"], `${path}.min`, issues);
338
+ requiredNumber(value["max"], `${path}.max`, issues);
339
+ if (isFiniteNumber(value["min"]) && isFiniteNumber(value["max"]) && value["min"] >= value["max"]) addIssue(issues, path, "minimum must be less than maximum");
340
+ }
341
+ function optionalString(value, path, issues) {
342
+ if (value !== void 0 && value !== null && !isString(value)) addIssue(issues, path, "must be a string, null, or undefined");
343
+ }
344
+ function validateWidget(value) {
345
+ const issues = [];
346
+ if (!isRecord(value)) return [{
347
+ path: "$",
348
+ message: "must be an object"
349
+ }];
350
+ if (value["version"] !== 2) addIssue(issues, "version", "must be 2");
351
+ requiredString(value["id"], "id", issues, true);
352
+ if (!isOneOf(value["size"], [
353
+ "mini",
354
+ "compact",
355
+ "tall",
356
+ "square",
357
+ "wide",
358
+ "mega",
359
+ "banner",
360
+ "hero"
361
+ ])) addIssue(issues, "size", "must be mini, compact, tall, square, wide, mega, banner, or hero");
362
+ for (const key of ["rows", "columns"]) {
363
+ if (!Array.isArray(value[key]) || value[key].length === 0) {
364
+ addIssue(issues, key, "must be a non-empty array");
365
+ continue;
366
+ }
367
+ value[key].forEach((track, index) => {
368
+ const path = `${key}[${index}]`;
369
+ if (!isRecord(track)) {
370
+ addIssue(issues, path, "must be an object");
371
+ return;
372
+ }
373
+ const unit = track["unit"];
374
+ if (!isOneOf(unit, gridUnits)) addIssue(issues, `${path}.unit`, "has an unsupported value");
375
+ if (unit === "auto") {
376
+ if (track["size"] !== void 0) addIssue(issues, `${path}.size`, "must not be set for auto tracks");
377
+ } else requiredNumber(track["size"], `${path}.size`, issues, 0);
378
+ });
379
+ }
380
+ const background = value["background"];
381
+ if (!isRecord(background)) addIssue(issues, "background", "must be an object");
382
+ else {
383
+ requiredBoolean(background["sensitive"], "background.sensitive", issues);
384
+ requiredBoolean(background["repeat"], "background.repeat", issues);
385
+ if (!isOneOf(background["size"], [
386
+ "cover",
387
+ "contain",
388
+ "auto"
389
+ ])) addIssue(issues, "background.size", "has an unsupported value");
390
+ if (!isOneOf(background["anchor"], anchors)) addIssue(issues, "background.anchor", "has an unsupported value");
391
+ if (background["image"] !== void 0) requiredString(background["image"], "background.image", issues, true);
392
+ }
393
+ const refresh = value["refresh"];
394
+ if (refresh !== void 0 && refresh !== null && !isRecord(refresh)) addIssue(issues, "refresh", "must be an object or null");
395
+ else if (isRecord(refresh)) {
396
+ requiredBoolean(refresh["enabled"], "refresh.enabled", issues);
397
+ requiredString(refresh["label"], "refresh.label", issues, true);
398
+ }
399
+ if (!Array.isArray(value["elements"])) addIssue(issues, "elements", "must be an array");
400
+ else value["elements"].forEach((element, index) => validateElement(element, `elements[${index}]`, issues));
401
+ return issues;
402
+ }
403
+ function safeParseWidgetInput(value) {
404
+ const issues = validateWidget(value);
405
+ return issues.length ? {
406
+ success: false,
407
+ issues
408
+ } : {
409
+ success: true,
410
+ data: value
411
+ };
412
+ }
413
+ function parseWidgetInput(value) {
414
+ const result = safeParseWidgetInput(value);
415
+ if (!result.success) throw new WidgetValidationError(result.issues);
416
+ return result.data;
417
+ }
418
+ function isWidgetContract(value) {
419
+ return safeParseWidgetInput(value).success;
420
+ }
421
+ function isWidget(value) {
422
+ return safeParseWidgetInput(value).success;
423
+ }
424
+ const WIDGET_HEIGHT = 245;
425
+ const WIDGET_PADDING = 18;
426
+ const WIDGET_GAP = 8;
427
+ const WIDGET_CELL_WIDTH = 133;
428
+ const WIDGET_CELL_HEIGHT = 123;
429
+ const footprintBySize = {
430
+ mini: {
431
+ columns: 1,
432
+ rows: 1
433
+ },
434
+ compact: {
435
+ columns: 2,
436
+ rows: 1
437
+ },
438
+ tall: {
439
+ columns: 1,
440
+ rows: 2
441
+ },
442
+ square: {
443
+ columns: 2,
444
+ rows: 2
445
+ },
446
+ wide: {
447
+ columns: 4,
448
+ rows: 2
449
+ },
450
+ mega: {
451
+ columns: 4,
452
+ rows: 4
453
+ },
454
+ banner: {
455
+ columns: 2,
456
+ rows: 4
457
+ },
458
+ hero: {
459
+ columns: 8,
460
+ rows: 4
461
+ }
462
+ };
463
+ function widgetFootprint(size) {
464
+ return typeof size === "string" && size in footprintBySize ? footprintBySize[size] : footprintBySize.square;
465
+ }
466
+ function gridSpanSize(span, cellSize) {
467
+ return span * cellSize + Math.max(0, span - 1) * 8;
468
+ }
469
+ function widgetWidth(size) {
470
+ return gridSpanSize(widgetFootprint(size).columns, 133);
471
+ }
472
+ function widgetHeight(size) {
473
+ return gridSpanSize(widgetFootprint(size).rows, 123);
474
+ }
475
+ function gridTemplate(tracks) {
476
+ return tracks.map((track) => track.unit === "auto" ? "auto" : `${track.size}${track.unit === "star" ? "fr" : "px"}`).join(" ");
477
+ }
478
+ function elementGridStyle(element) {
479
+ return {
480
+ "grid-row": `${element.grid.row + 1} / span ${element.grid.rowSpan}`,
481
+ "grid-column": `${element.grid.column + 1} / span ${element.grid.columnSpan}`
482
+ };
483
+ }
484
+ var WidgetElementRenderer = class WidgetElementRenderer {
485
+ element = input.required(...ngDevMode ? [{ debugName: "element" }] : /* istanbul ignore next */ []);
486
+ sensitiveVisible = input(false, ...ngDevMode ? [{ debugName: "sensitiveVisible" }] : /* istanbul ignore next */ []);
487
+ locale = input(defaultWidgetRendererLocale, ...ngDevMode ? [{ debugName: "locale" }] : /* istanbul ignore next */ []);
488
+ actionRequested = output();
489
+ failedImage = signal(null, ...ngDevMode ? [{ debugName: "failedImage" }] : /* istanbul ignore next */ []);
490
+ isText(element) {
491
+ return element.type === "text";
492
+ }
493
+ isImage(element) {
494
+ return element.type === "image";
495
+ }
496
+ isButton(element) {
497
+ return element.type === "button";
498
+ }
499
+ isChart(element) {
500
+ return [
501
+ "pie",
502
+ "donut",
503
+ "funnel",
504
+ "gauge",
505
+ "bar",
506
+ "line",
507
+ "progress"
508
+ ].includes(element.type);
509
+ }
510
+ isSensitive(element) {
511
+ return ("sensitive" in element ? element.sensitive : false) && !this.sensitiveVisible();
512
+ }
513
+ sensitiveBlur(element) {
514
+ if (!element.sensitive) return null;
515
+ if (element.type !== "text") return "2px";
516
+ return `${Math.min(Math.max(element.style.font.size * .25, 2), 10)}px`;
517
+ }
518
+ elementAlt(element) {
519
+ return this.isSensitive(element) ? "" : element.alt;
520
+ }
521
+ imageFailed(element) {
522
+ const failedImage = this.failedImage();
523
+ return failedImage?.element === element && failedImage.source === element.source;
524
+ }
525
+ imageLoadFailed(element) {
526
+ this.failedImage.set({
527
+ element,
528
+ source: element.source
529
+ });
530
+ }
531
+ requestAction(element, event) {
532
+ if (this.isSensitive(element)) return;
533
+ this.actionRequested.emit({
534
+ element,
535
+ event
536
+ });
537
+ }
538
+ horizontalAnchor(anchor) {
539
+ return anchor.endsWith("left") ? "flex-start" : anchor.endsWith("right") ? "flex-end" : "center";
540
+ }
541
+ verticalAnchor(anchor) {
542
+ return anchor.startsWith("top") ? "flex-start" : anchor.startsWith("bottom") ? "flex-end" : "center";
543
+ }
544
+ textFontWeight(element) {
545
+ return element.style.font.bold ? 700 : 400;
546
+ }
547
+ textFontStyle(element) {
548
+ return element.style.font.italic ? "italic" : "normal";
549
+ }
550
+ textFontDecoration(element) {
551
+ return [element.style.font.underline && "underline", element.style.font.strikethrough && "line-through"].filter(Boolean).join(" ") || "none";
552
+ }
553
+ elementId(element) {
554
+ return "id" in element ? element.id : null;
555
+ }
556
+ gridRow() {
557
+ return `${this.element().grid.row + 1} / span ${this.element().grid.rowSpan}`;
558
+ }
559
+ gridColumn() {
560
+ return `${this.element().grid.column + 1} / span ${this.element().grid.columnSpan}`;
561
+ }
562
+ static ɵfac = i0.ɵɵngDeclareFactory({
563
+ minVersion: "12.0.0",
564
+ version: "22.2.3",
565
+ ngImport: i0,
566
+ type: WidgetElementRenderer,
567
+ deps: [],
568
+ target: i0.ɵɵFactoryTarget.Component
569
+ });
570
+ static ɵcmp = i0.ɵɵngDeclareComponent({
571
+ minVersion: "17.0.0",
572
+ version: "22.2.3",
573
+ type: WidgetElementRenderer,
574
+ isStandalone: true,
575
+ selector: "widget-element-renderer",
576
+ inputs: {
577
+ element: {
578
+ classPropertyName: "element",
579
+ publicName: "element",
580
+ isSignal: true,
581
+ isRequired: true,
582
+ transformFunction: null
583
+ },
584
+ sensitiveVisible: {
585
+ classPropertyName: "sensitiveVisible",
586
+ publicName: "sensitiveVisible",
587
+ isSignal: true,
588
+ isRequired: false,
589
+ transformFunction: null
590
+ },
591
+ locale: {
592
+ classPropertyName: "locale",
593
+ publicName: "locale",
594
+ isSignal: true,
595
+ isRequired: false,
596
+ transformFunction: null
597
+ }
598
+ },
599
+ outputs: { actionRequested: "actionRequested" },
600
+ host: { properties: {
601
+ "style.grid-row": "gridRow()",
602
+ "style.grid-column": "gridColumn()"
603
+ } },
604
+ ngImport: i0,
605
+ template: "@let item = element();\n<div\n class=\"widget-element\"\n [attr.data-widget-element-id]=\"elementId(item)\"\n [attr.aria-hidden]=\"isSensitive(item) ? 'true' : null\"\n [class.is-sensitive]=\"isSensitive(item)\"\n>\n <div\n class=\"element-content\"\n [class.is-sensitive]=\"isSensitive(item)\"\n [style.--sensitive-blur]=\"sensitiveBlur(item)\"\n [style.justify-content]=\"\n isChart(item) && item.type !== 'progress'\n ? 'stretch'\n : horizontalAnchor(item.grid.anchor ?? 'center')\n \"\n [style.align-items]=\"\n isChart(item) && item.type !== 'progress'\n ? 'stretch'\n : verticalAnchor(item.grid.anchor ?? 'center')\n \"\n >\n @if (isText(item)) {\n @let text = item;\n <span\n class=\"text-element\"\n [style.color]=\"text.style.color\"\n [style.font-size.px]=\"text.style.font.size\"\n [style.font-weight]=\"textFontWeight(text)\"\n [style.font-style]=\"textFontStyle(text)\"\n [style.text-decoration]=\"textFontDecoration(text)\"\n [style.text-align]=\"text.style.align\"\n [style.white-space]=\"text.style.wrap ? 'pre-wrap' : 'pre'\"\n [style.background-color]=\"text.style.background || null\"\n [style.border-radius.px]=\"text.style.radius\"\n [style.padding]=\"\n text.style.padding\n ? text.style.padding.vertical + 'px ' + text.style.padding.horizontal + 'px'\n : null\n \"\n >{{ text.text }}</span\n >\n } @else if (isImage(item)) {\n @let image = item;\n @if (imageFailed(image)) {\n <div\n class=\"image-placeholder\"\n role=\"img\"\n [attr.aria-label]=\"elementAlt(image) || locale().aria.imageUnavailable\"\n [style.border-radius.px]=\"image.radius\"\n >\n <svg aria-hidden=\"true\" viewBox=\"0 0 64 48\" focusable=\"false\">\n <rect x=\"2\" y=\"2\" width=\"60\" height=\"44\" rx=\"5\" />\n <circle cx=\"20\" cy=\"17\" r=\"5\" />\n <path d=\"m8 39 15-14 9 8 7-6 17 12\" />\n </svg>\n </div>\n } @else {\n <img\n [src]=\"image.source\"\n [alt]=\"elementAlt(image)\"\n [style.object-fit]=\"image.fit\"\n [style.object-position]=\"image.grid.anchor ?? 'center'\"\n [style.border-radius.px]=\"image.radius\"\n (error)=\"imageLoadFailed(image)\"\n />\n }\n <span\n class=\"image-overlay\"\n [style.background-color]=\"image.overlayColor || 'transparent'\"\n [style.border-radius.px]=\"image.radius\"\n ></span>\n } @else if (isButton(item)) {\n @let button = item;\n <button\n type=\"button\"\n class=\"action-button\"\n [class.solid]=\"button.style === 'solid'\"\n [class.outline]=\"button.style === 'outline'\"\n [class.show-only-on-hover]=\"button.showOnlyOnHover\"\n [disabled]=\"isSensitive(button)\"\n (click)=\"requestAction(button, $event)\"\n [tabindex]=\"isSensitive(button) ? -1 : 0\"\n >\n {{ button.label }}\n </button>\n } @else if (item.type === 'divider') {\n @let divider = item;\n <div\n class=\"divider-element\"\n [class.is-vertical]=\"divider.orientation === 'vertical'\"\n role=\"separator\"\n [attr.aria-orientation]=\"divider.orientation\"\n [style.background-color]=\"divider.style.color\"\n ></div>\n } @else if (isChart(item)) {\n @let chart = item;\n @defer (on immediate) {\n <widget-chart-element\n [class.is-progress]=\"chart.type === 'progress'\"\n [element]=\"chart\"\n [sensitiveHidden]=\"isSensitive(chart)\"\n [locale]=\"locale()\"\n />\n } @placeholder {\n <div class=\"chart-placeholder\" aria-hidden=\"true\"></div>\n }\n }\n </div>\n</div>\n",
606
+ styles: [":host{position:relative;min-width:0;min-height:0;display:flex;z-index:1}.widget-element{position:relative;min-width:0;min-height:0;display:flex;z-index:1;width:100%;height:100%}.element-content{display:flex;width:100%;height:100%;min-width:0;min-height:0}.element-content:has(widget-chart-element){align-items:stretch}.element-content>widget-chart-element{flex:0 1 auto;width:100%;height:100%;max-width:100%;max-height:100%}.element-content>widget-chart-element.is-progress{height:auto}.chart-placeholder{width:100%;height:100%}.text-element{display:inline-block;overflow:visible;line-height:1.2}img{width:100%;height:100%;display:block}.image-overlay{position:absolute;inset:0;z-index:1;pointer-events:none;border-radius:inherit}.image-placeholder{display:flex;width:100%;height:100%;align-items:center;justify-content:center;overflow:hidden;background:#dfe5ee}.image-placeholder svg{width:min(56px,45%);height:auto;fill:none;stroke:#8c9ab0;stroke-linecap:round;stroke-linejoin:round;stroke-width:2}.divider-element{width:100%;height:2px;flex:0 0 auto;border-radius:var(--widget-renderer-pill-radius, 999px)}.divider-element.is-vertical{width:2px;height:100%}.element-content.is-sensitive{filter:blur(var(--sensitive-blur, 2px));-webkit-user-select:none;user-select:none}.action-button{pointer-events:var(--widget-renderer-actions-pointer-events, auto);min-height:30px;border-radius:var(--widget-renderer-radius, 8px);padding:6px 10px;font:600 12px/1.1 inherit;cursor:var(--widget-renderer-action-cursor, pointer)}.action-button.show-only-on-hover{opacity:0;pointer-events:none;transform:translateY(2px);transition:opacity var(--widget-renderer-transition-duration, .16s) var(--widget-renderer-transition-easing, ease),transform var(--widget-renderer-transition-duration, .16s) var(--widget-renderer-transition-easing, ease)}:host-context(.widget-shell:hover) .action-button.show-only-on-hover,:host-context(.widget-shell:focus-within) .action-button.show-only-on-hover{opacity:1;pointer-events:auto;transform:translateY(0)}@media(prefers-reduced-motion:reduce){.action-button.show-only-on-hover{transition:none}}.action-button.solid{border:1px solid var(--widget-renderer-action-background, #151515);background:var(--widget-renderer-action-background, #151515);color:var(--widget-renderer-action-color, #fff)}.action-button.outline{border:1px solid var(--widget-renderer-action-outline-border, #737373);background:var(--widget-renderer-action-outline-background, #fff);color:var(--widget-renderer-action-outline-color, #151515)}\n"],
607
+ deferBlockDependencies: [() => [import("./lieselthuriot-widget-renderer-chart-element-renderer-BO3V-jYo.mjs").then((m) => m.ChartElementRenderer)]]
608
+ });
609
+ };
610
+ i0.ɵɵngDeclareClassMetadataAsync({
611
+ minVersion: "18.0.0",
612
+ version: "22.2.3",
613
+ ngImport: i0,
614
+ type: WidgetElementRenderer,
615
+ resolveDeferredDeps: () => [import("./lieselthuriot-widget-renderer-chart-element-renderer-BO3V-jYo.mjs").then((m) => m.ChartElementRenderer)],
616
+ resolveMetadata: (ChartElementRenderer) => ({
617
+ decorators: [{
618
+ type: Component,
619
+ args: [{
620
+ selector: "widget-element-renderer",
621
+ imports: [ChartElementRenderer],
622
+ host: {
623
+ "[style.grid-row]": "gridRow()",
624
+ "[style.grid-column]": "gridColumn()"
625
+ },
626
+ template: "@let item = element();\n<div\n class=\"widget-element\"\n [attr.data-widget-element-id]=\"elementId(item)\"\n [attr.aria-hidden]=\"isSensitive(item) ? 'true' : null\"\n [class.is-sensitive]=\"isSensitive(item)\"\n>\n <div\n class=\"element-content\"\n [class.is-sensitive]=\"isSensitive(item)\"\n [style.--sensitive-blur]=\"sensitiveBlur(item)\"\n [style.justify-content]=\"\n isChart(item) && item.type !== 'progress'\n ? 'stretch'\n : horizontalAnchor(item.grid.anchor ?? 'center')\n \"\n [style.align-items]=\"\n isChart(item) && item.type !== 'progress'\n ? 'stretch'\n : verticalAnchor(item.grid.anchor ?? 'center')\n \"\n >\n @if (isText(item)) {\n @let text = item;\n <span\n class=\"text-element\"\n [style.color]=\"text.style.color\"\n [style.font-size.px]=\"text.style.font.size\"\n [style.font-weight]=\"textFontWeight(text)\"\n [style.font-style]=\"textFontStyle(text)\"\n [style.text-decoration]=\"textFontDecoration(text)\"\n [style.text-align]=\"text.style.align\"\n [style.white-space]=\"text.style.wrap ? 'pre-wrap' : 'pre'\"\n [style.background-color]=\"text.style.background || null\"\n [style.border-radius.px]=\"text.style.radius\"\n [style.padding]=\"\n text.style.padding\n ? text.style.padding.vertical + 'px ' + text.style.padding.horizontal + 'px'\n : null\n \"\n >{{ text.text }}</span\n >\n } @else if (isImage(item)) {\n @let image = item;\n @if (imageFailed(image)) {\n <div\n class=\"image-placeholder\"\n role=\"img\"\n [attr.aria-label]=\"elementAlt(image) || locale().aria.imageUnavailable\"\n [style.border-radius.px]=\"image.radius\"\n >\n <svg aria-hidden=\"true\" viewBox=\"0 0 64 48\" focusable=\"false\">\n <rect x=\"2\" y=\"2\" width=\"60\" height=\"44\" rx=\"5\" />\n <circle cx=\"20\" cy=\"17\" r=\"5\" />\n <path d=\"m8 39 15-14 9 8 7-6 17 12\" />\n </svg>\n </div>\n } @else {\n <img\n [src]=\"image.source\"\n [alt]=\"elementAlt(image)\"\n [style.object-fit]=\"image.fit\"\n [style.object-position]=\"image.grid.anchor ?? 'center'\"\n [style.border-radius.px]=\"image.radius\"\n (error)=\"imageLoadFailed(image)\"\n />\n }\n <span\n class=\"image-overlay\"\n [style.background-color]=\"image.overlayColor || 'transparent'\"\n [style.border-radius.px]=\"image.radius\"\n ></span>\n } @else if (isButton(item)) {\n @let button = item;\n <button\n type=\"button\"\n class=\"action-button\"\n [class.solid]=\"button.style === 'solid'\"\n [class.outline]=\"button.style === 'outline'\"\n [class.show-only-on-hover]=\"button.showOnlyOnHover\"\n [disabled]=\"isSensitive(button)\"\n (click)=\"requestAction(button, $event)\"\n [tabindex]=\"isSensitive(button) ? -1 : 0\"\n >\n {{ button.label }}\n </button>\n } @else if (item.type === 'divider') {\n @let divider = item;\n <div\n class=\"divider-element\"\n [class.is-vertical]=\"divider.orientation === 'vertical'\"\n role=\"separator\"\n [attr.aria-orientation]=\"divider.orientation\"\n [style.background-color]=\"divider.style.color\"\n ></div>\n } @else if (isChart(item)) {\n @let chart = item;\n @defer (on immediate) {\n <widget-chart-element\n [class.is-progress]=\"chart.type === 'progress'\"\n [element]=\"chart\"\n [sensitiveHidden]=\"isSensitive(chart)\"\n [locale]=\"locale()\"\n />\n } @placeholder {\n <div class=\"chart-placeholder\" aria-hidden=\"true\"></div>\n }\n }\n </div>\n</div>\n",
627
+ styles: [":host{position:relative;min-width:0;min-height:0;display:flex;z-index:1}.widget-element{position:relative;min-width:0;min-height:0;display:flex;z-index:1;width:100%;height:100%}.element-content{display:flex;width:100%;height:100%;min-width:0;min-height:0}.element-content:has(widget-chart-element){align-items:stretch}.element-content>widget-chart-element{flex:0 1 auto;width:100%;height:100%;max-width:100%;max-height:100%}.element-content>widget-chart-element.is-progress{height:auto}.chart-placeholder{width:100%;height:100%}.text-element{display:inline-block;overflow:visible;line-height:1.2}img{width:100%;height:100%;display:block}.image-overlay{position:absolute;inset:0;z-index:1;pointer-events:none;border-radius:inherit}.image-placeholder{display:flex;width:100%;height:100%;align-items:center;justify-content:center;overflow:hidden;background:#dfe5ee}.image-placeholder svg{width:min(56px,45%);height:auto;fill:none;stroke:#8c9ab0;stroke-linecap:round;stroke-linejoin:round;stroke-width:2}.divider-element{width:100%;height:2px;flex:0 0 auto;border-radius:var(--widget-renderer-pill-radius, 999px)}.divider-element.is-vertical{width:2px;height:100%}.element-content.is-sensitive{filter:blur(var(--sensitive-blur, 2px));-webkit-user-select:none;user-select:none}.action-button{pointer-events:var(--widget-renderer-actions-pointer-events, auto);min-height:30px;border-radius:var(--widget-renderer-radius, 8px);padding:6px 10px;font:600 12px/1.1 inherit;cursor:var(--widget-renderer-action-cursor, pointer)}.action-button.show-only-on-hover{opacity:0;pointer-events:none;transform:translateY(2px);transition:opacity var(--widget-renderer-transition-duration, .16s) var(--widget-renderer-transition-easing, ease),transform var(--widget-renderer-transition-duration, .16s) var(--widget-renderer-transition-easing, ease)}:host-context(.widget-shell:hover) .action-button.show-only-on-hover,:host-context(.widget-shell:focus-within) .action-button.show-only-on-hover{opacity:1;pointer-events:auto;transform:translateY(0)}@media(prefers-reduced-motion:reduce){.action-button.show-only-on-hover{transition:none}}.action-button.solid{border:1px solid var(--widget-renderer-action-background, #151515);background:var(--widget-renderer-action-background, #151515);color:var(--widget-renderer-action-color, #fff)}.action-button.outline{border:1px solid var(--widget-renderer-action-outline-border, #737373);background:var(--widget-renderer-action-outline-background, #fff);color:var(--widget-renderer-action-outline-color, #151515)}\n"]
628
+ }]
629
+ }],
630
+ ctorParameters: null,
631
+ propDecorators: {
632
+ element: [{
633
+ type: i0.Input,
634
+ args: [{
635
+ isSignal: true,
636
+ alias: "element",
637
+ required: true
638
+ }]
639
+ }],
640
+ sensitiveVisible: [{
641
+ type: i0.Input,
642
+ args: [{
643
+ isSignal: true,
644
+ alias: "sensitiveVisible",
645
+ required: false
646
+ }]
647
+ }],
648
+ locale: [{
649
+ type: i0.Input,
650
+ args: [{
651
+ isSignal: true,
652
+ alias: "locale",
653
+ required: false
654
+ }]
655
+ }],
656
+ actionRequested: [{
657
+ type: i0.Output,
658
+ args: ["actionRequested"]
659
+ }]
660
+ }
661
+ })
662
+ });
663
+ var WidgetSkeleton = class WidgetSkeleton {
664
+ size = input.required(...ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []);
665
+ darkMode = input(false, ...ngDevMode ? [{ debugName: "darkMode" }] : /* istanbul ignore next */ []);
666
+ locale = input(defaultWidgetRendererLocale, ...ngDevMode ? [{ debugName: "locale" }] : /* istanbul ignore next */ []);
667
+ static ɵfac = i0.ɵɵngDeclareFactory({
668
+ minVersion: "12.0.0",
669
+ version: "22.2.3",
670
+ ngImport: i0,
671
+ type: WidgetSkeleton,
672
+ deps: [],
673
+ target: i0.ɵɵFactoryTarget.Component
674
+ });
675
+ static ɵcmp = i0.ɵɵngDeclareComponent({
676
+ minVersion: "17.1.0",
677
+ version: "22.2.3",
678
+ type: WidgetSkeleton,
679
+ isStandalone: true,
680
+ selector: "widget-skeleton",
681
+ inputs: {
682
+ size: {
683
+ classPropertyName: "size",
684
+ publicName: "size",
685
+ isSignal: true,
686
+ isRequired: true,
687
+ transformFunction: null
688
+ },
689
+ darkMode: {
690
+ classPropertyName: "darkMode",
691
+ publicName: "darkMode",
692
+ isSignal: true,
693
+ isRequired: false,
694
+ transformFunction: null
695
+ },
696
+ locale: {
697
+ classPropertyName: "locale",
698
+ publicName: "locale",
699
+ isSignal: true,
700
+ isRequired: false,
701
+ transformFunction: null
702
+ }
703
+ },
704
+ ngImport: i0,
705
+ template: "<div\n class=\"widget-skeleton\"\n [class.is-mini]=\"size() === 'mini'\"\n [class.is-compact]=\"size() === 'compact'\"\n [class.is-tall]=\"size() === 'tall'\"\n [class.is-wide]=\"size() === 'wide'\"\n [class.is-mega]=\"size() === 'mega'\"\n [class.is-banner]=\"size() === 'banner'\"\n [class.is-hero]=\"size() === 'hero'\"\n [class.is-dark]=\"darkMode()\"\n role=\"status\"\n [attr.aria-label]=\"locale().aria.loading\"\n>\n <div class=\"skeleton-toolbar\"></div>\n <div class=\"skeleton-content\">\n <span class=\"skeleton-line skeleton-line-small\"></span>\n <span class=\"skeleton-line skeleton-line-title\"></span>\n <span class=\"skeleton-line skeleton-line-copy\"></span>\n <span class=\"skeleton-chart\"></span>\n <span class=\"skeleton-button\"></span>\n </div>\n</div>\n",
706
+ styles: [":host{display:block}.widget-skeleton{position:relative;width:274px;max-width:100%;height:254px;box-sizing:border-box;overflow:hidden;border-radius:var(--widget-renderer-radius);background:#dfe5ee;box-shadow:var(--widget-renderer-shadow)}.widget-skeleton.is-wide{width:556px}.widget-skeleton.is-mini{width:133px;height:123px}.widget-skeleton.is-compact{width:274px;height:123px}.widget-skeleton.is-tall{width:133px;height:254px}.widget-skeleton.is-mega{width:556px;height:516px}.widget-skeleton.is-banner{width:274px;height:516px}.widget-skeleton.is-hero{width:1120px;height:516px}.widget-skeleton.is-mini .skeleton-toolbar{top:8px;right:8px;width:22px;height:22px}.widget-skeleton.is-mini .skeleton-content{box-sizing:border-box;height:100%;gap:3px;padding:24px 12px 8px}.widget-skeleton.is-mini .skeleton-line{height:6px}.widget-skeleton.is-mini .skeleton-line-title{height:10px}.widget-skeleton.is-mini .skeleton-chart{flex:1 1 auto;min-height:20px;margin-top:0}.widget-skeleton.is-mini .skeleton-button{width:42px;height:18px}.widget-skeleton:is(.is-compact,.is-tall) .skeleton-content{box-sizing:border-box;height:100%;gap:5px;padding:30px 12px 10px}.widget-skeleton.is-compact .skeleton-chart{min-height:28px;margin-top:0}.widget-skeleton.is-tall .skeleton-chart{flex:1 1 auto;min-height:45px;margin-top:0}.widget-skeleton:is(.is-mega,.is-banner,.is-hero) .skeleton-content{box-sizing:border-box;height:100%}.widget-skeleton:is(.is-mega,.is-banner,.is-hero) .skeleton-chart{flex:1 1 auto;min-height:180px}.widget-skeleton.is-dark{background:#182236}.skeleton-line,.skeleton-chart,.skeleton-button{background:linear-gradient(100deg,#dfe5ee 20%,#f2f5f9,#dfe5ee 70%);background-size:200% 100%;animation:skeleton-shimmer 1.8s linear infinite}.widget-skeleton.is-dark .skeleton-line,.widget-skeleton.is-dark .skeleton-chart,.widget-skeleton.is-dark .skeleton-button{background:linear-gradient(100deg,#182236 20%,#2b3b59,#182236 70%);background-size:200% 100%}.skeleton-toolbar{position:absolute;top:12px;right:12px;width:var(--widget-renderer-control-size);height:var(--widget-renderer-control-size);border-radius:var(--widget-renderer-radius);background:#c4cedd}.widget-skeleton.is-dark .skeleton-toolbar{background:#2b3b59}.skeleton-content{display:flex;flex-direction:column;gap:10px;padding:44px var(--widget-renderer-content-padding) 16px}.skeleton-line{display:block;height:10px;border-radius:var(--widget-renderer-pill-radius)}.skeleton-line-small{width:28%}.skeleton-line-title{width:72%;height:20px}.skeleton-line-copy{width:58%}.skeleton-chart{width:100%;height:64px;margin-top:2px;border-radius:var(--widget-renderer-radius)}.skeleton-button{align-self:flex-end;width:58px;height:30px;border-radius:var(--widget-renderer-radius)}@keyframes skeleton-shimmer{0%{background-position:100% 0}to{background-position:-100% 0}}@media(prefers-reduced-motion:reduce){.skeleton-line,.skeleton-chart,.skeleton-button{animation:none}}\n"]
707
+ });
708
+ };
709
+ i0.ɵɵngDeclareClassMetadata({
710
+ minVersion: "12.0.0",
711
+ version: "22.2.3",
712
+ ngImport: i0,
713
+ type: WidgetSkeleton,
714
+ decorators: [{
715
+ type: Component,
716
+ args: [{
717
+ selector: "widget-skeleton",
718
+ template: "<div\n class=\"widget-skeleton\"\n [class.is-mini]=\"size() === 'mini'\"\n [class.is-compact]=\"size() === 'compact'\"\n [class.is-tall]=\"size() === 'tall'\"\n [class.is-wide]=\"size() === 'wide'\"\n [class.is-mega]=\"size() === 'mega'\"\n [class.is-banner]=\"size() === 'banner'\"\n [class.is-hero]=\"size() === 'hero'\"\n [class.is-dark]=\"darkMode()\"\n role=\"status\"\n [attr.aria-label]=\"locale().aria.loading\"\n>\n <div class=\"skeleton-toolbar\"></div>\n <div class=\"skeleton-content\">\n <span class=\"skeleton-line skeleton-line-small\"></span>\n <span class=\"skeleton-line skeleton-line-title\"></span>\n <span class=\"skeleton-line skeleton-line-copy\"></span>\n <span class=\"skeleton-chart\"></span>\n <span class=\"skeleton-button\"></span>\n </div>\n</div>\n",
719
+ styles: [":host{display:block}.widget-skeleton{position:relative;width:274px;max-width:100%;height:254px;box-sizing:border-box;overflow:hidden;border-radius:var(--widget-renderer-radius);background:#dfe5ee;box-shadow:var(--widget-renderer-shadow)}.widget-skeleton.is-wide{width:556px}.widget-skeleton.is-mini{width:133px;height:123px}.widget-skeleton.is-compact{width:274px;height:123px}.widget-skeleton.is-tall{width:133px;height:254px}.widget-skeleton.is-mega{width:556px;height:516px}.widget-skeleton.is-banner{width:274px;height:516px}.widget-skeleton.is-hero{width:1120px;height:516px}.widget-skeleton.is-mini .skeleton-toolbar{top:8px;right:8px;width:22px;height:22px}.widget-skeleton.is-mini .skeleton-content{box-sizing:border-box;height:100%;gap:3px;padding:24px 12px 8px}.widget-skeleton.is-mini .skeleton-line{height:6px}.widget-skeleton.is-mini .skeleton-line-title{height:10px}.widget-skeleton.is-mini .skeleton-chart{flex:1 1 auto;min-height:20px;margin-top:0}.widget-skeleton.is-mini .skeleton-button{width:42px;height:18px}.widget-skeleton:is(.is-compact,.is-tall) .skeleton-content{box-sizing:border-box;height:100%;gap:5px;padding:30px 12px 10px}.widget-skeleton.is-compact .skeleton-chart{min-height:28px;margin-top:0}.widget-skeleton.is-tall .skeleton-chart{flex:1 1 auto;min-height:45px;margin-top:0}.widget-skeleton:is(.is-mega,.is-banner,.is-hero) .skeleton-content{box-sizing:border-box;height:100%}.widget-skeleton:is(.is-mega,.is-banner,.is-hero) .skeleton-chart{flex:1 1 auto;min-height:180px}.widget-skeleton.is-dark{background:#182236}.skeleton-line,.skeleton-chart,.skeleton-button{background:linear-gradient(100deg,#dfe5ee 20%,#f2f5f9,#dfe5ee 70%);background-size:200% 100%;animation:skeleton-shimmer 1.8s linear infinite}.widget-skeleton.is-dark .skeleton-line,.widget-skeleton.is-dark .skeleton-chart,.widget-skeleton.is-dark .skeleton-button{background:linear-gradient(100deg,#182236 20%,#2b3b59,#182236 70%);background-size:200% 100%}.skeleton-toolbar{position:absolute;top:12px;right:12px;width:var(--widget-renderer-control-size);height:var(--widget-renderer-control-size);border-radius:var(--widget-renderer-radius);background:#c4cedd}.widget-skeleton.is-dark .skeleton-toolbar{background:#2b3b59}.skeleton-content{display:flex;flex-direction:column;gap:10px;padding:44px var(--widget-renderer-content-padding) 16px}.skeleton-line{display:block;height:10px;border-radius:var(--widget-renderer-pill-radius)}.skeleton-line-small{width:28%}.skeleton-line-title{width:72%;height:20px}.skeleton-line-copy{width:58%}.skeleton-chart{width:100%;height:64px;margin-top:2px;border-radius:var(--widget-renderer-radius)}.skeleton-button{align-self:flex-end;width:58px;height:30px;border-radius:var(--widget-renderer-radius)}@keyframes skeleton-shimmer{0%{background-position:100% 0}to{background-position:-100% 0}}@media(prefers-reduced-motion:reduce){.skeleton-line,.skeleton-chart,.skeleton-button{animation:none}}\n"]
720
+ }]
721
+ }],
722
+ propDecorators: {
723
+ size: [{
724
+ type: i0.Input,
725
+ args: [{
726
+ isSignal: true,
727
+ alias: "size",
728
+ required: true
729
+ }]
730
+ }],
731
+ darkMode: [{
732
+ type: i0.Input,
733
+ args: [{
734
+ isSignal: true,
735
+ alias: "darkMode",
736
+ required: false
737
+ }]
738
+ }],
739
+ locale: [{
740
+ type: i0.Input,
741
+ args: [{
742
+ isSignal: true,
743
+ alias: "locale",
744
+ required: false
745
+ }]
746
+ }]
747
+ }
748
+ });
749
+ var WidgetBackground = class WidgetBackground {
750
+ background = input.required(...ngDevMode ? [{ debugName: "background" }] : /* istanbul ignore next */ []);
751
+ sensitive = input(false, ...ngDevMode ? [{ debugName: "sensitive" }] : /* istanbul ignore next */ []);
752
+ image = input("none", ...ngDevMode ? [{ debugName: "image" }] : /* istanbul ignore next */ []);
753
+ static ɵfac = i0.ɵɵngDeclareFactory({
754
+ minVersion: "12.0.0",
755
+ version: "22.2.3",
756
+ ngImport: i0,
757
+ type: WidgetBackground,
758
+ deps: [],
759
+ target: i0.ɵɵFactoryTarget.Component
760
+ });
761
+ static ɵcmp = i0.ɵɵngDeclareComponent({
762
+ minVersion: "17.1.0",
763
+ version: "22.2.3",
764
+ type: WidgetBackground,
765
+ isStandalone: true,
766
+ selector: "widget-background",
767
+ inputs: {
768
+ background: {
769
+ classPropertyName: "background",
770
+ publicName: "background",
771
+ isSignal: true,
772
+ isRequired: true,
773
+ transformFunction: null
774
+ },
775
+ sensitive: {
776
+ classPropertyName: "sensitive",
777
+ publicName: "sensitive",
778
+ isSignal: true,
779
+ isRequired: false,
780
+ transformFunction: null
781
+ },
782
+ image: {
783
+ classPropertyName: "image",
784
+ publicName: "image",
785
+ isSignal: true,
786
+ isRequired: false,
787
+ transformFunction: null
788
+ }
789
+ },
790
+ ngImport: i0,
791
+ template: `<div
792
+ class="widget-background"
793
+ [class.is-sensitive]="sensitive()"
794
+ style="background-image: none"
795
+ >
796
+ <div
797
+ class="widget-background-image"
798
+ [class.is-sensitive]="sensitive()"
799
+ [style.background-image]="image()"
800
+ [style.background-size]="background().size"
801
+ [style.background-position]="background().anchor"
802
+ [style.background-repeat]="background().repeat ? 'repeat' : 'no-repeat'"
803
+ ></div>
804
+ </div>
805
+ <div
806
+ class="widget-overlay"
807
+ [style.background-color]="background().overlayColor || 'transparent'"
808
+ ></div>`,
809
+ isInline: true,
810
+ styles: [":host{position:absolute;inset:0}.widget-background{position:absolute;inset:0}.widget-background-image{position:absolute;inset:0;background-position:center;background-repeat:no-repeat;background-size:cover;transition:filter var(--widget-renderer-transition-duration, .16s) var(--widget-renderer-transition-easing, ease)}.widget-background-image.is-sensitive{inset:-18px;filter:blur(18px);transform:scale(1.04)}.widget-overlay{position:absolute;inset:0;pointer-events:none;z-index:0}\n"]
811
+ });
812
+ };
813
+ i0.ɵɵngDeclareClassMetadata({
814
+ minVersion: "12.0.0",
815
+ version: "22.2.3",
816
+ ngImport: i0,
817
+ type: WidgetBackground,
818
+ decorators: [{
819
+ type: Component,
820
+ args: [{
821
+ selector: "widget-background",
822
+ template: `<div
823
+ class="widget-background"
824
+ [class.is-sensitive]="sensitive()"
825
+ style="background-image: none"
826
+ >
827
+ <div
828
+ class="widget-background-image"
829
+ [class.is-sensitive]="sensitive()"
830
+ [style.background-image]="image()"
831
+ [style.background-size]="background().size"
832
+ [style.background-position]="background().anchor"
833
+ [style.background-repeat]="background().repeat ? 'repeat' : 'no-repeat'"
834
+ ></div>
835
+ </div>
836
+ <div
837
+ class="widget-overlay"
838
+ [style.background-color]="background().overlayColor || 'transparent'"
839
+ ></div>`,
840
+ styles: [":host{position:absolute;inset:0}.widget-background{position:absolute;inset:0}.widget-background-image{position:absolute;inset:0;background-position:center;background-repeat:no-repeat;background-size:cover;transition:filter var(--widget-renderer-transition-duration, .16s) var(--widget-renderer-transition-easing, ease)}.widget-background-image.is-sensitive{inset:-18px;filter:blur(18px);transform:scale(1.04)}.widget-overlay{position:absolute;inset:0;pointer-events:none;z-index:0}\n"]
841
+ }]
842
+ }],
843
+ propDecorators: {
844
+ background: [{
845
+ type: i0.Input,
846
+ args: [{
847
+ isSignal: true,
848
+ alias: "background",
849
+ required: true
850
+ }]
851
+ }],
852
+ sensitive: [{
853
+ type: i0.Input,
854
+ args: [{
855
+ isSignal: true,
856
+ alias: "sensitive",
857
+ required: false
858
+ }]
859
+ }],
860
+ image: [{
861
+ type: i0.Input,
862
+ args: [{
863
+ isSignal: true,
864
+ alias: "image",
865
+ required: false
866
+ }]
867
+ }]
868
+ }
869
+ });
870
+ var WidgetToolbar = class WidgetToolbar {
871
+ refresh = input(null, ...ngDevMode ? [{ debugName: "refresh" }] : /* istanbul ignore next */ []);
872
+ hasSensitiveElements = input(false, ...ngDevMode ? [{ debugName: "hasSensitiveElements" }] : /* istanbul ignore next */ []);
873
+ sensitiveVisible = input(false, ...ngDevMode ? [{ debugName: "sensitiveVisible" }] : /* istanbul ignore next */ []);
874
+ locale = input(defaultWidgetRendererLocale, ...ngDevMode ? [{ debugName: "locale" }] : /* istanbul ignore next */ []);
875
+ refreshRequested = output();
876
+ sensitiveToggled = output();
877
+ static ɵfac = i0.ɵɵngDeclareFactory({
878
+ minVersion: "12.0.0",
879
+ version: "22.2.3",
880
+ ngImport: i0,
881
+ type: WidgetToolbar,
882
+ deps: [],
883
+ target: i0.ɵɵFactoryTarget.Component
884
+ });
885
+ static ɵcmp = i0.ɵɵngDeclareComponent({
886
+ minVersion: "17.0.0",
887
+ version: "22.2.3",
888
+ type: WidgetToolbar,
889
+ isStandalone: true,
890
+ selector: "widget-toolbar",
891
+ inputs: {
892
+ refresh: {
893
+ classPropertyName: "refresh",
894
+ publicName: "refresh",
895
+ isSignal: true,
896
+ isRequired: false,
897
+ transformFunction: null
898
+ },
899
+ hasSensitiveElements: {
900
+ classPropertyName: "hasSensitiveElements",
901
+ publicName: "hasSensitiveElements",
902
+ isSignal: true,
903
+ isRequired: false,
904
+ transformFunction: null
905
+ },
906
+ sensitiveVisible: {
907
+ classPropertyName: "sensitiveVisible",
908
+ publicName: "sensitiveVisible",
909
+ isSignal: true,
910
+ isRequired: false,
911
+ transformFunction: null
912
+ },
913
+ locale: {
914
+ classPropertyName: "locale",
915
+ publicName: "locale",
916
+ isSignal: true,
917
+ isRequired: false,
918
+ transformFunction: null
919
+ }
920
+ },
921
+ outputs: {
922
+ refreshRequested: "refreshRequested",
923
+ sensitiveToggled: "sensitiveToggled"
924
+ },
925
+ ngImport: i0,
926
+ template: `<div class="widget-toolbar" [attr.aria-label]="locale().aria.toolbarActions">
927
+ @if (refresh()?.enabled) {
928
+ <button
929
+ type="button"
930
+ class="icon-button"
931
+ [attr.aria-label]="refresh()?.label"
932
+ [title]="refresh()?.label"
933
+ (click)="refreshRequested.emit()"
934
+ >
935
+ ↻
936
+ </button>
937
+ }
938
+ @if (hasSensitiveElements()) {
939
+ <button
940
+ type="button"
941
+ class="icon-button"
942
+ [attr.aria-label]="
943
+ sensitiveVisible() ? locale().aria.hideSensitiveData : locale().aria.showSensitiveData
944
+ "
945
+ [title]="
946
+ sensitiveVisible() ? locale().aria.hideSensitiveData : locale().aria.showSensitiveData
947
+ "
948
+ (click)="sensitiveToggled.emit()"
949
+ >
950
+ @if (sensitiveVisible()) {
951
+ <svg aria-hidden="true" viewBox="0 0 24 24" focusable="false">
952
+ <path d="M2 12s3.5-6 10-6 10 6 10 6-3.5 6-10 6S2 12 2 12Z" />
953
+ <circle cx="12" cy="12" r="2.5" />
954
+ </svg>
955
+ } @else {
956
+ <svg aria-hidden="true" viewBox="0 0 24 24" focusable="false">
957
+ <path
958
+ d="m3 3 18 18M10.6 5.3A10.7 10.7 0 0 1 12 5c6.5 0 10 7 10 7a18.4 18.4 0 0 1-3.1 3.8M6.2 6.2C3.5 8 2 12 2 12s3.5 7 10 7a10.7 10.7 0 0 1-3.4-.6"
959
+ />
960
+ </svg>
961
+ }
962
+ </button>
963
+ }
964
+ </div>`,
965
+ isInline: true,
966
+ styles: [":host{position:absolute;top:8px;right:8px;z-index:3}.widget-toolbar{display:flex;gap:4px;opacity:0;transform:translateY(-4px);transition:opacity var(--widget-renderer-transition-duration, .16s) var(--widget-renderer-transition-easing, ease),transform var(--widget-renderer-transition-duration, .16s) var(--widget-renderer-transition-easing, ease)}:host-context(.widget-shell:hover) .widget-toolbar,:host-context(.widget-shell:focus-within) .widget-toolbar{opacity:1;transform:translateY(0)}.icon-button{display:inline-flex;align-items:center;justify-content:center;pointer-events:var(--widget-renderer-actions-pointer-events, auto);width:var(--widget-renderer-control-size, 28px);height:var(--widget-renderer-control-size, 28px);border:1px solid var(--widget-renderer-control-border, #ffffff38);border-radius:var(--widget-renderer-radius, 8px);background:var(--widget-renderer-control-background, #10182ccc);color:var(--widget-renderer-action-color, #fff);cursor:pointer}.icon-button svg{width:16px;height:16px;fill:none;stroke:currentColor;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.8}.icon-button:hover,.icon-button:focus-visible{border-color:var(--widget-renderer-control-hover-border, #17233c);background:var(--widget-renderer-control-hover-background, #fff);color:var(--widget-renderer-control-hover-color, #17233c)}\n"]
967
+ });
968
+ };
969
+ i0.ɵɵngDeclareClassMetadata({
970
+ minVersion: "12.0.0",
971
+ version: "22.2.3",
972
+ ngImport: i0,
973
+ type: WidgetToolbar,
974
+ decorators: [{
975
+ type: Component,
976
+ args: [{
977
+ selector: "widget-toolbar",
978
+ template: `<div class="widget-toolbar" [attr.aria-label]="locale().aria.toolbarActions">
979
+ @if (refresh()?.enabled) {
980
+ <button
981
+ type="button"
982
+ class="icon-button"
983
+ [attr.aria-label]="refresh()?.label"
984
+ [title]="refresh()?.label"
985
+ (click)="refreshRequested.emit()"
986
+ >
987
+ ↻
988
+ </button>
989
+ }
990
+ @if (hasSensitiveElements()) {
991
+ <button
992
+ type="button"
993
+ class="icon-button"
994
+ [attr.aria-label]="
995
+ sensitiveVisible() ? locale().aria.hideSensitiveData : locale().aria.showSensitiveData
996
+ "
997
+ [title]="
998
+ sensitiveVisible() ? locale().aria.hideSensitiveData : locale().aria.showSensitiveData
999
+ "
1000
+ (click)="sensitiveToggled.emit()"
1001
+ >
1002
+ @if (sensitiveVisible()) {
1003
+ <svg aria-hidden="true" viewBox="0 0 24 24" focusable="false">
1004
+ <path d="M2 12s3.5-6 10-6 10 6 10 6-3.5 6-10 6S2 12 2 12Z" />
1005
+ <circle cx="12" cy="12" r="2.5" />
1006
+ </svg>
1007
+ } @else {
1008
+ <svg aria-hidden="true" viewBox="0 0 24 24" focusable="false">
1009
+ <path
1010
+ d="m3 3 18 18M10.6 5.3A10.7 10.7 0 0 1 12 5c6.5 0 10 7 10 7a18.4 18.4 0 0 1-3.1 3.8M6.2 6.2C3.5 8 2 12 2 12s3.5 7 10 7a10.7 10.7 0 0 1-3.4-.6"
1011
+ />
1012
+ </svg>
1013
+ }
1014
+ </button>
1015
+ }
1016
+ </div>`,
1017
+ styles: [":host{position:absolute;top:8px;right:8px;z-index:3}.widget-toolbar{display:flex;gap:4px;opacity:0;transform:translateY(-4px);transition:opacity var(--widget-renderer-transition-duration, .16s) var(--widget-renderer-transition-easing, ease),transform var(--widget-renderer-transition-duration, .16s) var(--widget-renderer-transition-easing, ease)}:host-context(.widget-shell:hover) .widget-toolbar,:host-context(.widget-shell:focus-within) .widget-toolbar{opacity:1;transform:translateY(0)}.icon-button{display:inline-flex;align-items:center;justify-content:center;pointer-events:var(--widget-renderer-actions-pointer-events, auto);width:var(--widget-renderer-control-size, 28px);height:var(--widget-renderer-control-size, 28px);border:1px solid var(--widget-renderer-control-border, #ffffff38);border-radius:var(--widget-renderer-radius, 8px);background:var(--widget-renderer-control-background, #10182ccc);color:var(--widget-renderer-action-color, #fff);cursor:pointer}.icon-button svg{width:16px;height:16px;fill:none;stroke:currentColor;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.8}.icon-button:hover,.icon-button:focus-visible{border-color:var(--widget-renderer-control-hover-border, #17233c);background:var(--widget-renderer-control-hover-background, #fff);color:var(--widget-renderer-control-hover-color, #17233c)}\n"]
1018
+ }]
1019
+ }],
1020
+ propDecorators: {
1021
+ refresh: [{
1022
+ type: i0.Input,
1023
+ args: [{
1024
+ isSignal: true,
1025
+ alias: "refresh",
1026
+ required: false
1027
+ }]
1028
+ }],
1029
+ hasSensitiveElements: [{
1030
+ type: i0.Input,
1031
+ args: [{
1032
+ isSignal: true,
1033
+ alias: "hasSensitiveElements",
1034
+ required: false
1035
+ }]
1036
+ }],
1037
+ sensitiveVisible: [{
1038
+ type: i0.Input,
1039
+ args: [{
1040
+ isSignal: true,
1041
+ alias: "sensitiveVisible",
1042
+ required: false
1043
+ }]
1044
+ }],
1045
+ locale: [{
1046
+ type: i0.Input,
1047
+ args: [{
1048
+ isSignal: true,
1049
+ alias: "locale",
1050
+ required: false
1051
+ }]
1052
+ }],
1053
+ refreshRequested: [{
1054
+ type: i0.Output,
1055
+ args: ["refreshRequested"]
1056
+ }],
1057
+ sensitiveToggled: [{
1058
+ type: i0.Output,
1059
+ args: ["sensitiveToggled"]
1060
+ }]
1061
+ }
1062
+ });
1063
+ var WidgetValidationOverlay = class WidgetValidationOverlay {
1064
+ issues = input.required(...ngDevMode ? [{ debugName: "issues" }] : /* istanbul ignore next */ []);
1065
+ static ɵfac = i0.ɵɵngDeclareFactory({
1066
+ minVersion: "12.0.0",
1067
+ version: "22.2.3",
1068
+ ngImport: i0,
1069
+ type: WidgetValidationOverlay,
1070
+ deps: [],
1071
+ target: i0.ɵɵFactoryTarget.Component
1072
+ });
1073
+ static ɵcmp = i0.ɵɵngDeclareComponent({
1074
+ minVersion: "17.0.0",
1075
+ version: "22.2.3",
1076
+ type: WidgetValidationOverlay,
1077
+ isStandalone: true,
1078
+ selector: "widget-validation-overlay",
1079
+ inputs: { issues: {
1080
+ classPropertyName: "issues",
1081
+ publicName: "issues",
1082
+ isSignal: true,
1083
+ isRequired: true,
1084
+ transformFunction: null
1085
+ } },
1086
+ ngImport: i0,
1087
+ template: `<div class="widget-validation-overlay" role="alert" aria-live="polite">
1088
+ <strong class="widget-validation-title">Widget validation failed</strong>
1089
+ <ul class="widget-validation-issues">
1090
+ @for (issue of issues(); track $index) {
1091
+ <li>
1092
+ <code>{{ issue.path }}</code
1093
+ >: {{ issue.message }}
1094
+ </li>
1095
+ }
1096
+ </ul>
1097
+ </div>`,
1098
+ isInline: true,
1099
+ styles: [":host{position:absolute;inset:0;z-index:2}.widget-validation-overlay{height:100%;display:flex;flex-direction:column;gap:8px;box-sizing:border-box;overflow:auto;padding:var(--widget-renderer-content-padding, 18px);border:1px solid #e06a6a;background:#fff4f4ef;color:#7f1d1d;pointer-events:auto}.widget-validation-title{font-size:13px}.widget-validation-issues{display:grid;gap:4px;margin:0;padding-inline-start:18px;font:12px/1.4 ui-monospace,SFMono-Regular,Consolas,monospace}.widget-validation-issues code{font:inherit;font-weight:700}:host-context(html[data-theme=\"dark\"]) .widget-validation-overlay{border-color:#f08a8a;background:#3b1717ef;color:#ffd6d6}\n"]
1100
+ });
1101
+ };
1102
+ i0.ɵɵngDeclareClassMetadata({
1103
+ minVersion: "12.0.0",
1104
+ version: "22.2.3",
1105
+ ngImport: i0,
1106
+ type: WidgetValidationOverlay,
1107
+ decorators: [{
1108
+ type: Component,
1109
+ args: [{
1110
+ selector: "widget-validation-overlay",
1111
+ template: `<div class="widget-validation-overlay" role="alert" aria-live="polite">
1112
+ <strong class="widget-validation-title">Widget validation failed</strong>
1113
+ <ul class="widget-validation-issues">
1114
+ @for (issue of issues(); track $index) {
1115
+ <li>
1116
+ <code>{{ issue.path }}</code
1117
+ >: {{ issue.message }}
1118
+ </li>
1119
+ }
1120
+ </ul>
1121
+ </div>`,
1122
+ styles: [":host{position:absolute;inset:0;z-index:2}.widget-validation-overlay{height:100%;display:flex;flex-direction:column;gap:8px;box-sizing:border-box;overflow:auto;padding:var(--widget-renderer-content-padding, 18px);border:1px solid #e06a6a;background:#fff4f4ef;color:#7f1d1d;pointer-events:auto}.widget-validation-title{font-size:13px}.widget-validation-issues{display:grid;gap:4px;margin:0;padding-inline-start:18px;font:12px/1.4 ui-monospace,SFMono-Regular,Consolas,monospace}.widget-validation-issues code{font:inherit;font-weight:700}:host-context(html[data-theme=\"dark\"]) .widget-validation-overlay{border-color:#f08a8a;background:#3b1717ef;color:#ffd6d6}\n"]
1123
+ }]
1124
+ }],
1125
+ propDecorators: { issues: [{
1126
+ type: i0.Input,
1127
+ args: [{
1128
+ isSignal: true,
1129
+ alias: "issues",
1130
+ required: true
1131
+ }]
1132
+ }] }
1133
+ });
1134
+ var WidgetRenderer = class WidgetRenderer {
1135
+ widget = input(null, ...ngDevMode ? [{ debugName: "widget" }] : /* istanbul ignore next */ []);
1136
+ loading = input(false, ...ngDevMode ? [{ debugName: "loading" }] : /* istanbul ignore next */ []);
1137
+ darkMode = input(false, ...ngDevMode ? [{ debugName: "darkMode" }] : /* istanbul ignore next */ []);
1138
+ locale = input({}, ...ngDevMode ? [{ debugName: "locale" }] : /* istanbul ignore next */ []);
1139
+ refreshRequested = output();
1140
+ actionRequested = output();
1141
+ sensitiveVisible = signal(false, ...ngDevMode ? [{ debugName: "sensitiveVisible" }] : /* istanbul ignore next */ []);
1142
+ tooltip = inject(WidgetTooltip);
1143
+ tooltipLayer = viewChild("tooltipLayer", ...ngDevMode ? [{ debugName: "tooltipLayer" }] : /* istanbul ignore next */ []);
1144
+ parsedWidget = computed(() => {
1145
+ const widget = this.widget();
1146
+ return widget === null ? {
1147
+ success: false,
1148
+ issues: []
1149
+ } : safeParseWidgetInput(widget);
1150
+ }, ...ngDevMode ? [{ debugName: "parsedWidget" }] : /* istanbul ignore next */ []);
1151
+ isLoading = computed(() => this.loading() !== false, ...ngDevMode ? [{ debugName: "isLoading" }] : /* istanbul ignore next */ []);
1152
+ resolvedLocale = computed(() => ({
1153
+ ...defaultWidgetRendererLocale,
1154
+ aria: {
1155
+ ...defaultWidgetRendererLocale.aria,
1156
+ ...this.locale().aria,
1157
+ chart: {
1158
+ ...defaultWidgetRendererLocale.aria.chart,
1159
+ ...this.locale().aria?.chart
1160
+ }
1161
+ }
1162
+ }), ...ngDevMode ? [{ debugName: "resolvedLocale" }] : /* istanbul ignore next */ []);
1163
+ loadingSize = computed(() => {
1164
+ const loading = this.loading();
1165
+ return typeof loading === "string" ? loading : "square";
1166
+ }, ...ngDevMode ? [{ debugName: "loadingSize" }] : /* istanbul ignore next */ []);
1167
+ validationIssues = computed(() => {
1168
+ const result = this.parsedWidget();
1169
+ return result.success ? [] : result.issues;
1170
+ }, ...ngDevMode ? [{ debugName: "validationIssues" }] : /* istanbul ignore next */ []);
1171
+ renderWidget = computed(() => {
1172
+ const result = this.parsedWidget();
1173
+ if (!result.success) return {
1174
+ ...emptyWidget,
1175
+ size: widgetSizeOrSquare(this.widget()?.size)
1176
+ };
1177
+ return {
1178
+ ...normalizeWidgetInput(result.data),
1179
+ refresh: result.data.refresh ?? emptyWidget.refresh
1180
+ };
1181
+ }, ...ngDevMode ? [{ debugName: "renderWidget" }] : /* istanbul ignore next */ []);
1182
+ hasSensitiveElements = computed(() => {
1183
+ const widget = this.renderWidget();
1184
+ return widget.background.sensitive || widget.elements.some((element) => "sensitive" in element && element.sensitive);
1185
+ }, ...ngDevMode ? [{ debugName: "hasSensitiveElements" }] : /* istanbul ignore next */ []);
1186
+ backgroundSensitive = computed(() => {
1187
+ return this.renderWidget().background.sensitive && !this.sensitiveVisible();
1188
+ }, ...ngDevMode ? [{ debugName: "backgroundSensitive" }] : /* istanbul ignore next */ []);
1189
+ gridRows = computed(() => gridTemplate(this.renderWidget().rows), ...ngDevMode ? [{ debugName: "gridRows" }] : /* istanbul ignore next */ []);
1190
+ gridColumns = computed(() => gridTemplate(this.renderWidget().columns), ...ngDevMode ? [{ debugName: "gridColumns" }] : /* istanbul ignore next */ []);
1191
+ widgetWidth = computed(() => widgetWidth(this.renderWidget().size), ...ngDevMode ? [{ debugName: "widgetWidth" }] : /* istanbul ignore next */ []);
1192
+ widgetHeight = computed(() => widgetHeight(this.renderWidget().size), ...ngDevMode ? [{ debugName: "widgetHeight" }] : /* istanbul ignore next */ []);
1193
+ backgroundImage = computed(() => {
1194
+ const image = this.renderWidget().background.image;
1195
+ return image ? `url("${image}")` : "none";
1196
+ }, ...ngDevMode ? [{ debugName: "backgroundImage" }] : /* istanbul ignore next */ []);
1197
+ constructor() {
1198
+ effect(() => {
1199
+ this.widget();
1200
+ this.sensitiveVisible.set(false);
1201
+ });
1202
+ effect(() => {
1203
+ if (this.loading() !== false) this.sensitiveVisible.set(false);
1204
+ });
1205
+ effect(() => {
1206
+ const layer = this.tooltipLayer()?.nativeElement;
1207
+ if (layer) this.tooltip.setOverlay(layer);
1208
+ });
1209
+ }
1210
+ ngOnDestroy() {
1211
+ this.tooltip.clear();
1212
+ }
1213
+ toggleSensitive() {
1214
+ this.sensitiveVisible.update((visible) => !visible);
1215
+ }
1216
+ static ɵfac = i0.ɵɵngDeclareFactory({
1217
+ minVersion: "12.0.0",
1218
+ version: "22.2.3",
1219
+ ngImport: i0,
1220
+ type: WidgetRenderer,
1221
+ deps: [],
1222
+ target: i0.ɵɵFactoryTarget.Component
1223
+ });
1224
+ static ɵcmp = i0.ɵɵngDeclareComponent({
1225
+ minVersion: "17.0.0",
1226
+ version: "22.2.3",
1227
+ type: WidgetRenderer,
1228
+ isStandalone: true,
1229
+ selector: "widget-renderer",
1230
+ inputs: {
1231
+ widget: {
1232
+ classPropertyName: "widget",
1233
+ publicName: "widget",
1234
+ isSignal: true,
1235
+ isRequired: false,
1236
+ transformFunction: null
1237
+ },
1238
+ loading: {
1239
+ classPropertyName: "loading",
1240
+ publicName: "loading",
1241
+ isSignal: true,
1242
+ isRequired: false,
1243
+ transformFunction: null
1244
+ },
1245
+ darkMode: {
1246
+ classPropertyName: "darkMode",
1247
+ publicName: "darkMode",
1248
+ isSignal: true,
1249
+ isRequired: false,
1250
+ transformFunction: null
1251
+ },
1252
+ locale: {
1253
+ classPropertyName: "locale",
1254
+ publicName: "locale",
1255
+ isSignal: true,
1256
+ isRequired: false,
1257
+ transformFunction: null
1258
+ }
1259
+ },
1260
+ outputs: {
1261
+ refreshRequested: "refreshRequested",
1262
+ actionRequested: "actionRequested"
1263
+ },
1264
+ providers: [WidgetTooltip],
1265
+ viewQueries: [{
1266
+ propertyName: "tooltipLayer",
1267
+ first: true,
1268
+ predicate: ["tooltipLayer"],
1269
+ descendants: true,
1270
+ isSignal: true
1271
+ }],
1272
+ ngImport: i0,
1273
+ template: "@if (isLoading()) {\n <widget-skeleton [size]=\"loadingSize()\" [darkMode]=\"darkMode()\" [locale]=\"resolvedLocale()\" />\n} @else {\n @let widget = renderWidget();\n <section class=\"widget-shell\" [style.width.px]=\"widgetWidth()\" [style.height.px]=\"widgetHeight()\">\n <div\n class=\"widget-viewport\"\n [style.background-color]=\"widget.background.color || 'transparent'\"\n >\n <widget-background\n [background]=\"widget.background\"\n [sensitive]=\"backgroundSensitive()\"\n [image]=\"backgroundImage()\"\n />\n @if (validationIssues().length > 0) {\n <widget-validation-overlay [issues]=\"validationIssues()\" />\n }\n <widget-toolbar\n [refresh]=\"widget.refresh\"\n [hasSensitiveElements]=\"hasSensitiveElements()\"\n [sensitiveVisible]=\"sensitiveVisible()\"\n [locale]=\"resolvedLocale()\"\n (refreshRequested)=\"refreshRequested.emit()\"\n (sensitiveToggled)=\"toggleSensitive()\"\n />\n <div\n class=\"widget-grid\"\n [style.grid-template-rows]=\"gridRows()\"\n [style.grid-template-columns]=\"gridColumns()\"\n >\n @for (element of widget.elements; track $index) {\n <widget-element-renderer\n [element]=\"element\"\n [sensitiveVisible]=\"sensitiveVisible()\"\n [locale]=\"resolvedLocale()\"\n (actionRequested)=\"actionRequested.emit($event)\"\n />\n }\n </div>\n </div>\n <div #tooltipLayer class=\"widget-tooltip-layer\">\n @if (tooltip.progress(); as progress) {\n <span\n class=\"progress-tooltip\"\n role=\"tooltip\"\n [style.--tooltip-x.px]=\"progress.x\"\n [style.--tooltip-y.px]=\"progress.y\"\n [style.--tooltip-border]=\"progress.color || 'rgb(0 0 0 / 0.12)'\"\n ><span class=\"tooltip-marker\" [style.background]=\"progress.color\"></span\n ><span>{{ progress.label }}</span\n ><strong>{{ progress.value }}</strong></span\n >\n }\n </div>\n </section>\n}\n",
1274
+ styles: [":host{display:block;--widget-renderer-radius: 8px;--widget-renderer-pill-radius: 999px;--widget-renderer-control-size: 28px;--widget-renderer-content-padding: 18px;--widget-renderer-shadow: 0 18px 40px #10182c38;--widget-renderer-transition-duration: .16s;--widget-renderer-transition-easing: ease;--widget-renderer-control-background: #10182ccc;--widget-renderer-control-border: #ffffff38;--widget-renderer-control-hover-border: #17233c;--widget-renderer-control-hover-background: #fff;--widget-renderer-control-hover-color: #17233c;--widget-renderer-action-background: #151515;--widget-renderer-action-color: #fff;--widget-renderer-action-outline-border: #737373;--widget-renderer-action-outline-background: #fff;--widget-renderer-action-outline-color: #151515}.widget-skeleton{position:relative;width:274px;max-width:100%;height:254px;box-sizing:border-box;overflow:hidden;border-radius:var(--widget-renderer-radius);background:#dfe5ee;box-shadow:var(--widget-renderer-shadow)}.widget-skeleton.is-wide{width:556px}.widget-skeleton.is-mini{width:133px;height:123px}.widget-skeleton.is-compact{width:274px;height:123px}.widget-skeleton.is-tall{width:133px;height:254px}.widget-skeleton.is-mega{width:556px;height:516px}.widget-skeleton.is-banner{width:274px;height:516px}.widget-skeleton.is-hero{width:1120px;height:516px}.widget-skeleton.is-mini .skeleton-toolbar{top:8px;right:8px;width:22px;height:22px}.widget-skeleton.is-mini .skeleton-content{box-sizing:border-box;height:100%;gap:3px;padding:24px 12px 8px}.widget-skeleton.is-mini .skeleton-line{height:6px}.widget-skeleton.is-mini .skeleton-line-title{height:10px}.widget-skeleton.is-mini .skeleton-chart{flex:1 1 auto;min-height:20px;margin-top:0}.widget-skeleton.is-mini .skeleton-button{width:42px;height:18px}.widget-skeleton:is(.is-compact,.is-tall) .skeleton-content{box-sizing:border-box;height:100%;gap:5px;padding:30px 12px 10px}.widget-skeleton.is-compact .skeleton-chart{min-height:28px;margin-top:0}.widget-skeleton.is-tall .skeleton-chart{flex:1 1 auto;min-height:45px;margin-top:0}.widget-skeleton:is(.is-mega,.is-banner,.is-hero) .skeleton-content{box-sizing:border-box;height:100%}.widget-skeleton:is(.is-mega,.is-banner,.is-hero) .skeleton-chart{flex:1 1 auto;min-height:180px}.widget-skeleton.is-dark{background:#182236}.skeleton-line,.skeleton-chart,.skeleton-button{background:linear-gradient(100deg,#dfe5ee 20%,#f2f5f9,#dfe5ee 70%);background-size:200% 100%;animation:skeleton-shimmer 1.8s linear infinite}.widget-skeleton.is-dark .skeleton-line,.widget-skeleton.is-dark .skeleton-chart,.widget-skeleton.is-dark .skeleton-button{background:linear-gradient(100deg,#182236 20%,#2b3b59,#182236 70%);background-size:200% 100%}.skeleton-toolbar{position:absolute;top:12px;right:12px;width:var(--widget-renderer-control-size);height:var(--widget-renderer-control-size);border-radius:var(--widget-renderer-radius);background:#c4cedd}.widget-skeleton.is-dark .skeleton-toolbar{background:#2b3b59}.skeleton-content{display:flex;flex-direction:column;gap:10px;padding:44px var(--widget-renderer-content-padding) 16px}.skeleton-line{display:block;height:10px;border-radius:var(--widget-renderer-pill-radius)}.skeleton-line-small{width:28%}.skeleton-line-title{width:72%;height:20px}.skeleton-line-copy{width:58%}.skeleton-chart{width:100%;height:64px;margin-top:2px;border-radius:var(--widget-renderer-radius)}.skeleton-button{align-self:flex-end;width:58px;height:30px;border-radius:var(--widget-renderer-radius)}@keyframes skeleton-shimmer{0%{background-position:100% 0}to{background-position:-100% 0}}@media(prefers-reduced-motion:reduce){.skeleton-line,.skeleton-chart,.skeleton-button{animation:none}}.widget-shell{position:relative;overflow:visible;box-sizing:border-box;color:#f6f7fb}.widget-viewport{position:absolute;inset:0;overflow:hidden;border-radius:var(--widget-renderer-radius);box-shadow:var(--widget-renderer-shadow)}.widget-viewport:after{position:absolute;inset:0;z-index:5;box-sizing:border-box;border:1px solid #10182c26;border-radius:inherit;content:\"\";pointer-events:none}.widget-tooltip-layer{position:absolute;inset:0;z-index:6;overflow:visible;pointer-events:none}.progress-tooltip{--tooltip-border: rgb(0 0 0 / .12);position:absolute;z-index:4;top:var(--tooltip-y);left:var(--tooltip-x);display:flex;min-width:104px;align-items:center;gap:7px;padding:10px;transform:translate(-50%,calc(-100% - 10px));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;white-space:nowrap}.progress-tooltip strong{margin-inline-start:auto;color:#464646;font-size:14px;font-weight:900}.tooltip-marker{width:9px;height:9px;flex:0 0 auto;border-radius:50%}.widget-grid{position:absolute;inset:0;display:grid;gap:8px;padding:18px}.chart-placeholder{width:100%;height:100%}.element-content{display:flex;width:100%;height:100%;min-width:0;min-height:0}.element-content:has(widget-chart-element){align-items:stretch}.element-content>widget-chart-element{flex:0 1 auto;width:100%;height:100%;max-width:100%;max-height:100%}.element-content>widget-chart-element.is-progress{height:auto}.divider-element{width:100%;height:2px;flex:0 0 auto;border-radius:var(--widget-renderer-pill-radius)}.divider-element.is-vertical{width:2px;height:100%}.element-content.is-sensitive{filter:blur(var(--sensitive-blur, 2px));-webkit-user-select:none;user-select:none}.text-element{display:inline-block;overflow:visible;line-height:1.2}img{width:100%;height:100%;display:block}.image-overlay{position:absolute;inset:0;z-index:1;pointer-events:none;border-radius:inherit}.image-placeholder{display:flex;width:100%;height:100%;align-items:center;justify-content:center;overflow:hidden;background:#dfe5ee}.image-placeholder svg{width:min(56px,45%);height:auto;fill:none;stroke:#8c9ab0;stroke-linecap:round;stroke-linejoin:round;stroke-width:2}.action-button{min-height:30px;border-radius:var(--widget-renderer-radius);padding:6px 10px;font:600 12px/1.1 inherit;cursor:var(--widget-renderer-action-cursor, pointer)}.action-button.show-only-on-hover{opacity:0;pointer-events:none;transform:translateY(2px);transition:opacity var(--widget-renderer-transition-duration) var(--widget-renderer-transition-easing),transform var(--widget-renderer-transition-duration) var(--widget-renderer-transition-easing)}.widget-shell:hover .action-button.show-only-on-hover,.widget-shell:focus-within .action-button.show-only-on-hover{opacity:1;pointer-events:auto;transform:translateY(0)}.action-button.solid{border:1px solid #151515;background:#151515;color:#fff}.action-button.outline{border:1px solid #737373;background:#fff;color:#151515}\n"],
1275
+ dependencies: [
1276
+ {
1277
+ kind: "component",
1278
+ type: WidgetElementRenderer,
1279
+ selector: "widget-element-renderer",
1280
+ inputs: [
1281
+ "element",
1282
+ "sensitiveVisible",
1283
+ "locale"
1284
+ ],
1285
+ outputs: ["actionRequested"]
1286
+ },
1287
+ {
1288
+ kind: "component",
1289
+ type: WidgetSkeleton,
1290
+ selector: "widget-skeleton",
1291
+ inputs: [
1292
+ "size",
1293
+ "darkMode",
1294
+ "locale"
1295
+ ]
1296
+ },
1297
+ {
1298
+ kind: "component",
1299
+ type: WidgetBackground,
1300
+ selector: "widget-background",
1301
+ inputs: [
1302
+ "background",
1303
+ "sensitive",
1304
+ "image"
1305
+ ]
1306
+ },
1307
+ {
1308
+ kind: "component",
1309
+ type: WidgetToolbar,
1310
+ selector: "widget-toolbar",
1311
+ inputs: [
1312
+ "refresh",
1313
+ "hasSensitiveElements",
1314
+ "sensitiveVisible",
1315
+ "locale"
1316
+ ],
1317
+ outputs: ["refreshRequested", "sensitiveToggled"]
1318
+ },
1319
+ {
1320
+ kind: "component",
1321
+ type: WidgetValidationOverlay,
1322
+ selector: "widget-validation-overlay",
1323
+ inputs: ["issues"]
1324
+ }
1325
+ ]
1326
+ });
1327
+ };
1328
+ i0.ɵɵngDeclareClassMetadata({
1329
+ minVersion: "12.0.0",
1330
+ version: "22.2.3",
1331
+ ngImport: i0,
1332
+ type: WidgetRenderer,
1333
+ decorators: [{
1334
+ type: Component,
1335
+ args: [{
1336
+ selector: "widget-renderer",
1337
+ providers: [WidgetTooltip],
1338
+ imports: [
1339
+ WidgetElementRenderer,
1340
+ WidgetSkeleton,
1341
+ WidgetBackground,
1342
+ WidgetToolbar,
1343
+ WidgetValidationOverlay
1344
+ ],
1345
+ template: "@if (isLoading()) {\n <widget-skeleton [size]=\"loadingSize()\" [darkMode]=\"darkMode()\" [locale]=\"resolvedLocale()\" />\n} @else {\n @let widget = renderWidget();\n <section class=\"widget-shell\" [style.width.px]=\"widgetWidth()\" [style.height.px]=\"widgetHeight()\">\n <div\n class=\"widget-viewport\"\n [style.background-color]=\"widget.background.color || 'transparent'\"\n >\n <widget-background\n [background]=\"widget.background\"\n [sensitive]=\"backgroundSensitive()\"\n [image]=\"backgroundImage()\"\n />\n @if (validationIssues().length > 0) {\n <widget-validation-overlay [issues]=\"validationIssues()\" />\n }\n <widget-toolbar\n [refresh]=\"widget.refresh\"\n [hasSensitiveElements]=\"hasSensitiveElements()\"\n [sensitiveVisible]=\"sensitiveVisible()\"\n [locale]=\"resolvedLocale()\"\n (refreshRequested)=\"refreshRequested.emit()\"\n (sensitiveToggled)=\"toggleSensitive()\"\n />\n <div\n class=\"widget-grid\"\n [style.grid-template-rows]=\"gridRows()\"\n [style.grid-template-columns]=\"gridColumns()\"\n >\n @for (element of widget.elements; track $index) {\n <widget-element-renderer\n [element]=\"element\"\n [sensitiveVisible]=\"sensitiveVisible()\"\n [locale]=\"resolvedLocale()\"\n (actionRequested)=\"actionRequested.emit($event)\"\n />\n }\n </div>\n </div>\n <div #tooltipLayer class=\"widget-tooltip-layer\">\n @if (tooltip.progress(); as progress) {\n <span\n class=\"progress-tooltip\"\n role=\"tooltip\"\n [style.--tooltip-x.px]=\"progress.x\"\n [style.--tooltip-y.px]=\"progress.y\"\n [style.--tooltip-border]=\"progress.color || 'rgb(0 0 0 / 0.12)'\"\n ><span class=\"tooltip-marker\" [style.background]=\"progress.color\"></span\n ><span>{{ progress.label }}</span\n ><strong>{{ progress.value }}</strong></span\n >\n }\n </div>\n </section>\n}\n",
1346
+ styles: [":host{display:block;--widget-renderer-radius: 8px;--widget-renderer-pill-radius: 999px;--widget-renderer-control-size: 28px;--widget-renderer-content-padding: 18px;--widget-renderer-shadow: 0 18px 40px #10182c38;--widget-renderer-transition-duration: .16s;--widget-renderer-transition-easing: ease;--widget-renderer-control-background: #10182ccc;--widget-renderer-control-border: #ffffff38;--widget-renderer-control-hover-border: #17233c;--widget-renderer-control-hover-background: #fff;--widget-renderer-control-hover-color: #17233c;--widget-renderer-action-background: #151515;--widget-renderer-action-color: #fff;--widget-renderer-action-outline-border: #737373;--widget-renderer-action-outline-background: #fff;--widget-renderer-action-outline-color: #151515}.widget-skeleton{position:relative;width:274px;max-width:100%;height:254px;box-sizing:border-box;overflow:hidden;border-radius:var(--widget-renderer-radius);background:#dfe5ee;box-shadow:var(--widget-renderer-shadow)}.widget-skeleton.is-wide{width:556px}.widget-skeleton.is-mini{width:133px;height:123px}.widget-skeleton.is-compact{width:274px;height:123px}.widget-skeleton.is-tall{width:133px;height:254px}.widget-skeleton.is-mega{width:556px;height:516px}.widget-skeleton.is-banner{width:274px;height:516px}.widget-skeleton.is-hero{width:1120px;height:516px}.widget-skeleton.is-mini .skeleton-toolbar{top:8px;right:8px;width:22px;height:22px}.widget-skeleton.is-mini .skeleton-content{box-sizing:border-box;height:100%;gap:3px;padding:24px 12px 8px}.widget-skeleton.is-mini .skeleton-line{height:6px}.widget-skeleton.is-mini .skeleton-line-title{height:10px}.widget-skeleton.is-mini .skeleton-chart{flex:1 1 auto;min-height:20px;margin-top:0}.widget-skeleton.is-mini .skeleton-button{width:42px;height:18px}.widget-skeleton:is(.is-compact,.is-tall) .skeleton-content{box-sizing:border-box;height:100%;gap:5px;padding:30px 12px 10px}.widget-skeleton.is-compact .skeleton-chart{min-height:28px;margin-top:0}.widget-skeleton.is-tall .skeleton-chart{flex:1 1 auto;min-height:45px;margin-top:0}.widget-skeleton:is(.is-mega,.is-banner,.is-hero) .skeleton-content{box-sizing:border-box;height:100%}.widget-skeleton:is(.is-mega,.is-banner,.is-hero) .skeleton-chart{flex:1 1 auto;min-height:180px}.widget-skeleton.is-dark{background:#182236}.skeleton-line,.skeleton-chart,.skeleton-button{background:linear-gradient(100deg,#dfe5ee 20%,#f2f5f9,#dfe5ee 70%);background-size:200% 100%;animation:skeleton-shimmer 1.8s linear infinite}.widget-skeleton.is-dark .skeleton-line,.widget-skeleton.is-dark .skeleton-chart,.widget-skeleton.is-dark .skeleton-button{background:linear-gradient(100deg,#182236 20%,#2b3b59,#182236 70%);background-size:200% 100%}.skeleton-toolbar{position:absolute;top:12px;right:12px;width:var(--widget-renderer-control-size);height:var(--widget-renderer-control-size);border-radius:var(--widget-renderer-radius);background:#c4cedd}.widget-skeleton.is-dark .skeleton-toolbar{background:#2b3b59}.skeleton-content{display:flex;flex-direction:column;gap:10px;padding:44px var(--widget-renderer-content-padding) 16px}.skeleton-line{display:block;height:10px;border-radius:var(--widget-renderer-pill-radius)}.skeleton-line-small{width:28%}.skeleton-line-title{width:72%;height:20px}.skeleton-line-copy{width:58%}.skeleton-chart{width:100%;height:64px;margin-top:2px;border-radius:var(--widget-renderer-radius)}.skeleton-button{align-self:flex-end;width:58px;height:30px;border-radius:var(--widget-renderer-radius)}@keyframes skeleton-shimmer{0%{background-position:100% 0}to{background-position:-100% 0}}@media(prefers-reduced-motion:reduce){.skeleton-line,.skeleton-chart,.skeleton-button{animation:none}}.widget-shell{position:relative;overflow:visible;box-sizing:border-box;color:#f6f7fb}.widget-viewport{position:absolute;inset:0;overflow:hidden;border-radius:var(--widget-renderer-radius);box-shadow:var(--widget-renderer-shadow)}.widget-viewport:after{position:absolute;inset:0;z-index:5;box-sizing:border-box;border:1px solid #10182c26;border-radius:inherit;content:\"\";pointer-events:none}.widget-tooltip-layer{position:absolute;inset:0;z-index:6;overflow:visible;pointer-events:none}.progress-tooltip{--tooltip-border: rgb(0 0 0 / .12);position:absolute;z-index:4;top:var(--tooltip-y);left:var(--tooltip-x);display:flex;min-width:104px;align-items:center;gap:7px;padding:10px;transform:translate(-50%,calc(-100% - 10px));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;white-space:nowrap}.progress-tooltip strong{margin-inline-start:auto;color:#464646;font-size:14px;font-weight:900}.tooltip-marker{width:9px;height:9px;flex:0 0 auto;border-radius:50%}.widget-grid{position:absolute;inset:0;display:grid;gap:8px;padding:18px}.chart-placeholder{width:100%;height:100%}.element-content{display:flex;width:100%;height:100%;min-width:0;min-height:0}.element-content:has(widget-chart-element){align-items:stretch}.element-content>widget-chart-element{flex:0 1 auto;width:100%;height:100%;max-width:100%;max-height:100%}.element-content>widget-chart-element.is-progress{height:auto}.divider-element{width:100%;height:2px;flex:0 0 auto;border-radius:var(--widget-renderer-pill-radius)}.divider-element.is-vertical{width:2px;height:100%}.element-content.is-sensitive{filter:blur(var(--sensitive-blur, 2px));-webkit-user-select:none;user-select:none}.text-element{display:inline-block;overflow:visible;line-height:1.2}img{width:100%;height:100%;display:block}.image-overlay{position:absolute;inset:0;z-index:1;pointer-events:none;border-radius:inherit}.image-placeholder{display:flex;width:100%;height:100%;align-items:center;justify-content:center;overflow:hidden;background:#dfe5ee}.image-placeholder svg{width:min(56px,45%);height:auto;fill:none;stroke:#8c9ab0;stroke-linecap:round;stroke-linejoin:round;stroke-width:2}.action-button{min-height:30px;border-radius:var(--widget-renderer-radius);padding:6px 10px;font:600 12px/1.1 inherit;cursor:var(--widget-renderer-action-cursor, pointer)}.action-button.show-only-on-hover{opacity:0;pointer-events:none;transform:translateY(2px);transition:opacity var(--widget-renderer-transition-duration) var(--widget-renderer-transition-easing),transform var(--widget-renderer-transition-duration) var(--widget-renderer-transition-easing)}.widget-shell:hover .action-button.show-only-on-hover,.widget-shell:focus-within .action-button.show-only-on-hover{opacity:1;pointer-events:auto;transform:translateY(0)}.action-button.solid{border:1px solid #151515;background:#151515;color:#fff}.action-button.outline{border:1px solid #737373;background:#fff;color:#151515}\n"]
1347
+ }]
1348
+ }],
1349
+ ctorParameters: () => [],
1350
+ propDecorators: {
1351
+ widget: [{
1352
+ type: i0.Input,
1353
+ args: [{
1354
+ isSignal: true,
1355
+ alias: "widget",
1356
+ required: false
1357
+ }]
1358
+ }],
1359
+ loading: [{
1360
+ type: i0.Input,
1361
+ args: [{
1362
+ isSignal: true,
1363
+ alias: "loading",
1364
+ required: false
1365
+ }]
1366
+ }],
1367
+ darkMode: [{
1368
+ type: i0.Input,
1369
+ args: [{
1370
+ isSignal: true,
1371
+ alias: "darkMode",
1372
+ required: false
1373
+ }]
1374
+ }],
1375
+ locale: [{
1376
+ type: i0.Input,
1377
+ args: [{
1378
+ isSignal: true,
1379
+ alias: "locale",
1380
+ required: false
1381
+ }]
1382
+ }],
1383
+ refreshRequested: [{
1384
+ type: i0.Output,
1385
+ args: ["refreshRequested"]
1386
+ }],
1387
+ actionRequested: [{
1388
+ type: i0.Output,
1389
+ args: ["actionRequested"]
1390
+ }],
1391
+ tooltipLayer: [{
1392
+ type: i0.ViewChild,
1393
+ args: ["tooltipLayer", { isSignal: true }]
1394
+ }]
1395
+ }
1396
+ });
1397
+ const emptyWidget = {
1398
+ version: 2,
1399
+ id: "empty-widget",
1400
+ size: "square",
1401
+ rows: [{
1402
+ size: 1,
1403
+ unit: "star"
1404
+ }],
1405
+ columns: [{
1406
+ size: 1,
1407
+ unit: "star"
1408
+ }],
1409
+ background: {
1410
+ sensitive: false,
1411
+ repeat: false,
1412
+ size: "auto",
1413
+ anchor: "center"
1414
+ },
1415
+ refresh: {
1416
+ enabled: false,
1417
+ label: "Refresh widget"
1418
+ },
1419
+ elements: []
1420
+ };
1421
+ function widgetSizeOrSquare(value) {
1422
+ return [
1423
+ "mini",
1424
+ "compact",
1425
+ "tall",
1426
+ "square",
1427
+ "wide",
1428
+ "mega",
1429
+ "banner",
1430
+ "hero"
1431
+ ].includes(value) ? value : "square";
1432
+ }
1433
+ export { WIDGET_CELL_HEIGHT, WIDGET_CELL_WIDTH, WIDGET_GAP, WIDGET_HEIGHT, WIDGET_PADDING, WidgetRenderer, WidgetValidationError, chartAccessibilitySummary, chartAriaLabel, defaultWidgetRendererLocale, dutchWidgetRendererLocale, elementGridStyle, frenchWidgetRendererLocale, germanWidgetRendererLocale, gridSpanSize, gridTemplate, isWidget, isWidgetContract, normalizeWidgetInput, parseWidgetInput, safeParseWidgetInput, widgetFootprint, widgetHeight, widgetWidth };
1434
+
1435
+ //# sourceMappingURL=lieselthuriot-widget-renderer.mjs.map