@ng-prism/core 21.11.0 → 21.12.0-beta.1

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.
Files changed (71) hide show
  1. package/dist/app/header/prism-header-widget-host.component.d.ts +11 -0
  2. package/dist/app/header/prism-header-widget-host.component.d.ts.map +1 -0
  3. package/dist/app/header/prism-header-widget-host.component.js +57 -0
  4. package/dist/app/header/prism-header.component.d.ts +3 -0
  5. package/dist/app/header/prism-header.component.d.ts.map +1 -1
  6. package/dist/app/header/prism-header.component.js +76 -20
  7. package/dist/app/panels/a11y/a11y-header-badge.component.d.ts +16 -0
  8. package/dist/app/panels/a11y/a11y-header-badge.component.d.ts.map +1 -0
  9. package/dist/app/panels/a11y/a11y-header-badge.component.js +84 -0
  10. package/dist/app/panels/a11y/a11y-thresholds.d.ts +6 -0
  11. package/dist/app/panels/a11y/a11y-thresholds.d.ts.map +1 -0
  12. package/dist/app/panels/a11y/a11y-thresholds.js +13 -0
  13. package/dist/app/panels/a11y/a11y.types.d.ts +33 -0
  14. package/dist/app/panels/a11y/a11y.types.d.ts.map +1 -1
  15. package/dist/app/panels/builtin-header-widgets.d.ts +3 -0
  16. package/dist/app/panels/builtin-header-widgets.d.ts.map +1 -0
  17. package/dist/app/panels/builtin-header-widgets.js +9 -0
  18. package/dist/app/panels/panel-host/prism-panel-host.component.d.ts +16 -5
  19. package/dist/app/panels/panel-host/prism-panel-host.component.d.ts.map +1 -1
  20. package/dist/app/panels/panel-host/prism-panel-host.component.js +91 -44
  21. package/dist/app/provide-prism.d.ts.map +1 -1
  22. package/dist/app/provide-prism.js +11 -0
  23. package/dist/app/renderer/prism-renderer.component.d.ts +2 -0
  24. package/dist/app/renderer/prism-renderer.component.d.ts.map +1 -1
  25. package/dist/app/renderer/prism-renderer.component.js +18 -3
  26. package/dist/app/services/prism-panel.service.d.ts +5 -0
  27. package/dist/app/services/prism-panel.service.d.ts.map +1 -1
  28. package/dist/app/services/prism-panel.service.js +7 -3
  29. package/dist/app/services/prism-plugin.service.d.ts +4 -1
  30. package/dist/app/services/prism-plugin.service.d.ts.map +1 -1
  31. package/dist/app/services/prism-plugin.service.js +11 -0
  32. package/dist/app/variant-ribbon/prism-variant-ribbon.component.d.ts +4 -1
  33. package/dist/app/variant-ribbon/prism-variant-ribbon.component.d.ts.map +1 -1
  34. package/dist/app/variant-ribbon/prism-variant-ribbon.component.js +67 -36
  35. package/dist/builder/a11y/a11y-report-reader.d.ts +12 -0
  36. package/dist/builder/a11y/a11y-report-reader.d.ts.map +1 -0
  37. package/dist/builder/a11y/a11y-report-reader.js +49 -0
  38. package/dist/builder/manifest/runtime-manifest.generator.d.ts +1 -0
  39. package/dist/builder/manifest/runtime-manifest.generator.d.ts.map +1 -1
  40. package/dist/builder/manifest/runtime-manifest.generator.js +8 -1
  41. package/dist/builder/plugin-runner/plugin-runner.d.ts.map +1 -1
  42. package/dist/builder/plugin-runner/plugin-runner.js +3 -1
  43. package/dist/builder/shared/prism-pipeline.d.ts.map +1 -1
  44. package/dist/builder/shared/prism-pipeline.js +19 -1
  45. package/dist/cli/audit-a11y/aggregator.d.ts +10 -0
  46. package/dist/cli/audit-a11y/aggregator.d.ts.map +1 -0
  47. package/dist/cli/audit-a11y/aggregator.js +64 -0
  48. package/dist/cli/audit-a11y/auditor.d.ts +14 -0
  49. package/dist/cli/audit-a11y/auditor.d.ts.map +1 -0
  50. package/dist/cli/audit-a11y/auditor.js +104 -0
  51. package/dist/cli/audit-a11y/cli.d.ts +3 -0
  52. package/dist/cli/audit-a11y/cli.d.ts.map +1 -0
  53. package/dist/cli/audit-a11y/cli.js +143 -0
  54. package/dist/cli/audit-a11y/index.d.ts +4 -0
  55. package/dist/cli/audit-a11y/index.d.ts.map +1 -0
  56. package/dist/cli/audit-a11y/index.js +3 -0
  57. package/dist/cli/audit-a11y/static-server.d.ts +11 -0
  58. package/dist/cli/audit-a11y/static-server.d.ts.map +1 -0
  59. package/dist/cli/audit-a11y/static-server.js +61 -0
  60. package/dist/decorator/index.d.ts +1 -1
  61. package/dist/decorator/index.d.ts.map +1 -1
  62. package/dist/decorator/showcase.decorator.d.ts +1 -1
  63. package/dist/decorator/showcase.decorator.d.ts.map +1 -1
  64. package/dist/decorator/showcase.types.d.ts +20 -6
  65. package/dist/decorator/showcase.types.d.ts.map +1 -1
  66. package/dist/plugin/index.d.ts +2 -2
  67. package/dist/plugin/index.d.ts.map +1 -1
  68. package/dist/plugin/index.js +1 -1
  69. package/dist/plugin/plugin.types.d.ts +33 -0
  70. package/dist/plugin/plugin.types.d.ts.map +1 -1
  71. package/package.json +12 -3
@@ -0,0 +1,11 @@
1
+ import { type Type } from '@angular/core';
2
+ import type { HeaderWidgetDefinition } from '../../plugin/plugin.types.js';
3
+ import * as i0 from "@angular/core";
4
+ export declare class PrismHeaderWidgetHostComponent {
5
+ readonly widget: import("@angular/core").InputSignal<HeaderWidgetDefinition>;
6
+ protected readonly resolved: import("@angular/core").WritableSignal<Type<unknown> | null>;
7
+ constructor();
8
+ static ɵfac: i0.ɵɵFactoryDeclaration<PrismHeaderWidgetHostComponent, never>;
9
+ static ɵcmp: i0.ɵɵComponentDeclaration<PrismHeaderWidgetHostComponent, "prism-header-widget-host", never, { "widget": { "alias": "widget"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
10
+ }
11
+ //# sourceMappingURL=prism-header-widget-host.component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prism-header-widget-host.component.d.ts","sourceRoot":"","sources":["../../../src/app/header/prism-header-widget-host.component.ts"],"names":[],"mappings":"AACA,OAAO,EAML,KAAK,IAAI,EACV,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;;AAI3E,qBAca,8BAA8B;IACzC,QAAQ,CAAC,MAAM,8DAA4C;IAE3D,SAAS,CAAC,QAAQ,CAAC,QAAQ,+DAAsC;;yCAHtD,8BAA8B;2CAA9B,8BAA8B;CA8B1C"}
@@ -0,0 +1,57 @@
1
+ import { NgComponentOutlet } from '@angular/common';
2
+ import { ChangeDetectionStrategy, Component, effect, input, signal, } from '@angular/core';
3
+ import * as i0 from "@angular/core";
4
+ function PrismHeaderWidgetHostComponent_Conditional_0_ng_container_0_Template(rf, ctx) { if (rf & 1) {
5
+ i0.ɵɵelementContainer(0);
6
+ } }
7
+ function PrismHeaderWidgetHostComponent_Conditional_0_Template(rf, ctx) { if (rf & 1) {
8
+ i0.ɵɵtemplate(0, PrismHeaderWidgetHostComponent_Conditional_0_ng_container_0_Template, 1, 0, "ng-container", 0);
9
+ } if (rf & 2) {
10
+ i0.ɵɵproperty("ngComponentOutlet", ctx);
11
+ } }
12
+ const lazyCache = new Map();
13
+ export class PrismHeaderWidgetHostComponent {
14
+ widget = input.required(...(ngDevMode ? [{ debugName: "widget" }] : []));
15
+ resolved = signal(null, ...(ngDevMode ? [{ debugName: "resolved" }] : []));
16
+ constructor() {
17
+ effect(() => {
18
+ const w = this.widget();
19
+ if (w.component) {
20
+ this.resolved.set(w.component);
21
+ return;
22
+ }
23
+ if (!w.loadComponent) {
24
+ this.resolved.set(null);
25
+ return;
26
+ }
27
+ const cached = lazyCache.get(w.id);
28
+ if (cached) {
29
+ this.resolved.set(cached);
30
+ return;
31
+ }
32
+ this.resolved.set(null);
33
+ w.loadComponent().then((comp) => {
34
+ lazyCache.set(w.id, comp);
35
+ if (this.widget().id === w.id) {
36
+ this.resolved.set(comp);
37
+ }
38
+ });
39
+ });
40
+ }
41
+ static ɵfac = function PrismHeaderWidgetHostComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || PrismHeaderWidgetHostComponent)(); };
42
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: PrismHeaderWidgetHostComponent, selectors: [["prism-header-widget-host"]], inputs: { widget: [1, "widget"] }, decls: 1, vars: 1, consts: [[4, "ngComponentOutlet"]], template: function PrismHeaderWidgetHostComponent_Template(rf, ctx) { if (rf & 1) {
43
+ i0.ɵɵconditionalCreate(0, PrismHeaderWidgetHostComponent_Conditional_0_Template, 1, 1, "ng-container");
44
+ } if (rf & 2) {
45
+ let tmp_0_0;
46
+ i0.ɵɵconditional((tmp_0_0 = ctx.resolved()) ? 0 : -1, tmp_0_0);
47
+ } }, dependencies: [NgComponentOutlet], styles: ["[_nghost-%COMP%] { display: contents; }"], changeDetection: 0 });
48
+ }
49
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(PrismHeaderWidgetHostComponent, [{
50
+ type: Component,
51
+ args: [{ selector: 'prism-header-widget-host', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [NgComponentOutlet], template: `
52
+ @if (resolved(); as comp) {
53
+ <ng-container *ngComponentOutlet="comp" />
54
+ }
55
+ `, styles: ["\n :host { display: contents; }\n "] }]
56
+ }], () => [], { widget: [{ type: i0.Input, args: [{ isSignal: true, alias: "widget", required: true }] }] }); })();
57
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(PrismHeaderWidgetHostComponent, { className: "PrismHeaderWidgetHostComponent", filePath: "app/header/prism-header-widget-host.component.ts", lineNumber: 28 }); })();
@@ -3,8 +3,11 @@ import { PrismThemeService } from '../services/prism-theme.service.js';
3
3
  import * as i0 from "@angular/core";
4
4
  export declare class PrismHeaderComponent {
5
5
  private readonly config;
6
+ private readonly pluginService;
6
7
  protected readonly searchService: PrismSearchService;
7
8
  protected readonly themeService: PrismThemeService;
9
+ protected readonly widgetsStart: import("@angular/core").Signal<import("../../plugin/plugin.types.js").HeaderWidgetDefinition[]>;
10
+ protected readonly widgetsEnd: import("@angular/core").Signal<import("../../plugin/plugin.types.js").HeaderWidgetDefinition[]>;
8
11
  protected readonly logoUrl: import("@angular/core").Signal<string | null>;
9
12
  protected readonly title: import("@angular/core").Signal<string>;
10
13
  protected readonly subtitle: import("@angular/core").Signal<string | null>;
@@ -1 +1 @@
1
- {"version":3,"file":"prism-header.component.d.ts","sourceRoot":"","sources":["../../../src/app/header/prism-header.component.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AACzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;;AAEvE,qBAmMa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuC;IAC9D,SAAS,CAAC,QAAQ,CAAC,aAAa,qBAA8B;IAC9D,SAAS,CAAC,QAAQ,CAAC,YAAY,oBAA6B;IAE5D,SAAS,CAAC,QAAQ,CAAC,OAAO,gDAKvB;IAEH,SAAS,CAAC,QAAQ,CAAC,KAAK,yCAAmD;IAC3E,SAAS,CAAC,QAAQ,CAAC,QAAQ,gDAAgD;IAE3E,SAAS,CAAC,QAAQ,CAAC,cAAc,gDAO9B;IAGH,SAAS,CAAC,WAAW,CAAC,CAAC,EAAE,aAAa,GAAG,IAAI;IAO7C,SAAS,CAAC,aAAa,IAAI,IAAI;yCAhCpB,oBAAoB;2CAApB,oBAAoB;CAmChC"}
1
+ {"version":3,"file":"prism-header.component.d.ts","sourceRoot":"","sources":["../../../src/app/header/prism-header.component.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AACzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;;AAGvE,qBA4Na,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuC;IAC9D,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA8B;IAC5D,SAAS,CAAC,QAAQ,CAAC,aAAa,qBAA8B;IAC9D,SAAS,CAAC,QAAQ,CAAC,YAAY,oBAA6B;IAE5D,SAAS,CAAC,QAAQ,CAAC,YAAY,kGAGoB;IAEnD,SAAS,CAAC,QAAQ,CAAC,UAAU,kGAGsB;IAEnD,SAAS,CAAC,QAAQ,CAAC,OAAO,gDAKvB;IAEH,SAAS,CAAC,QAAQ,CAAC,KAAK,yCAAmD;IAC3E,SAAS,CAAC,QAAQ,CAAC,QAAQ,gDAAgD;IAE3E,SAAS,CAAC,QAAQ,CAAC,cAAc,gDAO9B;IAGH,SAAS,CAAC,WAAW,CAAC,CAAC,EAAE,aAAa,GAAG,IAAI;IAO7C,SAAS,CAAC,aAAa,IAAI,IAAI;yCA3CpB,oBAAoB;2CAApB,oBAAoB;CA8ChC"}
@@ -2,9 +2,13 @@ import { Component, computed, inject, ChangeDetectionStrategy, HostListener, } f
2
2
  import { PrismIconComponent } from '../icons/prism-icon.component.js';
3
3
  import { PrismLayoutMenuComponent } from '../layout-menu/prism-layout-menu.component.js';
4
4
  import { PRISM_CONFIG } from '../tokens/prism-tokens.js';
5
+ import { BUILTIN_HEADER_WIDGETS } from '../panels/builtin-header-widgets.js';
6
+ import { PrismPluginService } from '../services/prism-plugin.service.js';
5
7
  import { PrismSearchService } from '../services/prism-search.service.js';
6
8
  import { PrismThemeService } from '../services/prism-theme.service.js';
9
+ import { PrismHeaderWidgetHostComponent } from './prism-header-widget-host.component.js';
7
10
  import * as i0 from "@angular/core";
11
+ const _forTrack0 = ($index, $item) => $item.id;
8
12
  function PrismHeaderComponent_Conditional_2_Template(rf, ctx) { if (rf & 1) {
9
13
  i0.ɵɵelement(0, "img", 2);
10
14
  } if (rf & 2) {
@@ -13,7 +17,7 @@ function PrismHeaderComponent_Conditional_2_Template(rf, ctx) { if (rf & 1) {
13
17
  } }
14
18
  function PrismHeaderComponent_Conditional_3_Template(rf, ctx) { if (rf & 1) {
15
19
  i0.ɵɵelementStart(0, "div", 3);
16
- i0.ɵɵelement(1, "img", 12);
20
+ i0.ɵɵelement(1, "img", 14);
17
21
  i0.ɵɵelementEnd();
18
22
  } }
19
23
  function PrismHeaderComponent_Conditional_7_Template(rf, ctx) { if (rf & 1) {
@@ -25,8 +29,29 @@ function PrismHeaderComponent_Conditional_7_Template(rf, ctx) { if (rf & 1) {
25
29
  i0.ɵɵadvance();
26
30
  i0.ɵɵtextInterpolate(ctx_r0.subtitle());
27
31
  } }
28
- function PrismHeaderComponent_Conditional_9_Template(rf, ctx) { if (rf & 1) {
29
- i0.ɵɵelementStart(0, "span", 8);
32
+ function PrismHeaderComponent_Conditional_8_For_2_Template(rf, ctx) { if (rf & 1) {
33
+ i0.ɵɵelement(0, "prism-header-widget-host", 9);
34
+ } if (rf & 2) {
35
+ const w_r2 = ctx.$implicit;
36
+ i0.ɵɵproperty("widget", w_r2);
37
+ } }
38
+ function PrismHeaderComponent_Conditional_8_Template(rf, ctx) { if (rf & 1) {
39
+ i0.ɵɵelementStart(0, "div", 7);
40
+ i0.ɵɵrepeaterCreate(1, PrismHeaderComponent_Conditional_8_For_2_Template, 1, 1, "prism-header-widget-host", 9, _forTrack0);
41
+ i0.ɵɵelementEnd();
42
+ } if (rf & 2) {
43
+ const ctx_r0 = i0.ɵɵnextContext();
44
+ i0.ɵɵadvance();
45
+ i0.ɵɵrepeater(ctx_r0.widgetsStart());
46
+ } }
47
+ function PrismHeaderComponent_For_11_Template(rf, ctx) { if (rf & 1) {
48
+ i0.ɵɵelement(0, "prism-header-widget-host", 9);
49
+ } if (rf & 2) {
50
+ const w_r3 = ctx.$implicit;
51
+ i0.ɵɵproperty("widget", w_r3);
52
+ } }
53
+ function PrismHeaderComponent_Conditional_12_Template(rf, ctx) { if (rf & 1) {
54
+ i0.ɵɵelementStart(0, "span", 10);
30
55
  i0.ɵɵtext(1);
31
56
  i0.ɵɵelementEnd();
32
57
  } if (rf & 2) {
@@ -34,20 +59,29 @@ function PrismHeaderComponent_Conditional_9_Template(rf, ctx) { if (rf & 1) {
34
59
  i0.ɵɵadvance();
35
60
  i0.ɵɵtextInterpolate(ctx_r0.buildInfoLabel());
36
61
  } }
37
- function PrismHeaderComponent_Conditional_11_Template(rf, ctx) { if (rf & 1) {
38
- i0.ɵɵelement(0, "prism-icon", 10);
62
+ function PrismHeaderComponent_Conditional_14_Template(rf, ctx) { if (rf & 1) {
63
+ i0.ɵɵelement(0, "prism-icon", 12);
39
64
  } if (rf & 2) {
40
65
  i0.ɵɵproperty("size", 16);
41
66
  } }
42
- function PrismHeaderComponent_Conditional_12_Template(rf, ctx) { if (rf & 1) {
43
- i0.ɵɵelement(0, "prism-icon", 11);
67
+ function PrismHeaderComponent_Conditional_15_Template(rf, ctx) { if (rf & 1) {
68
+ i0.ɵɵelement(0, "prism-icon", 13);
44
69
  } if (rf & 2) {
45
70
  i0.ɵɵproperty("size", 16);
46
71
  } }
47
72
  export class PrismHeaderComponent {
48
73
  config = inject(PRISM_CONFIG);
74
+ pluginService = inject(PrismPluginService);
49
75
  searchService = inject(PrismSearchService);
50
76
  themeService = inject(PrismThemeService);
77
+ widgetsStart = computed(() => [
78
+ ...BUILTIN_HEADER_WIDGETS.filter((w) => w.placement === 'start'),
79
+ ...this.pluginService.headerWidgetsStart(),
80
+ ].sort((a, b) => (a.order ?? 0) - (b.order ?? 0)), ...(ngDevMode ? [{ debugName: "widgetsStart" }] : []));
81
+ widgetsEnd = computed(() => [
82
+ ...BUILTIN_HEADER_WIDGETS.filter((w) => (w.placement ?? 'end') === 'end'),
83
+ ...this.pluginService.headerWidgetsEnd(),
84
+ ].sort((a, b) => (a.order ?? 0) - (b.order ?? 0)), ...(ngDevMode ? [{ debugName: "widgetsEnd" }] : []));
51
85
  logoUrl = computed(() => {
52
86
  const logo = this.config.logo;
53
87
  if (!logo)
@@ -80,7 +114,7 @@ export class PrismHeaderComponent {
80
114
  static ɵfac = function PrismHeaderComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || PrismHeaderComponent)(); };
81
115
  static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: PrismHeaderComponent, selectors: [["prism-header"]], hostBindings: function PrismHeaderComponent_HostBindings(rf, ctx) { if (rf & 1) {
82
116
  i0.ɵɵlistener("keydown", function PrismHeaderComponent_keydown_HostBindingHandler($event) { return ctx.onGlobalKey($event); }, i0.ɵɵresolveDocument);
83
- } }, decls: 14, vars: 8, consts: [[1, "prism-header"], [1, "prism-header__brand"], [1, "prism-header__logo-img", 3, "src", "alt"], [1, "prism-header__logo-default"], [1, "prism-header__brand-text"], [1, "prism-header__brand-name"], [1, "prism-header__brand-sub"], [1, "prism-header__actions"], [1, "prism-header__build-pill"], [1, "prism-header__icon-btn", 3, "click", "title"], ["name", "sun", 3, "size"], ["name", "moon", 3, "size"], ["alt", "ng prism logo", "src", "data:image/png;base64,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"]], template: function PrismHeaderComponent_Template(rf, ctx) { if (rf & 1) {
117
+ } }, decls: 17, vars: 9, consts: [[1, "prism-header"], [1, "prism-header__brand"], [1, "prism-header__logo-img", 3, "src", "alt"], [1, "prism-header__logo-default"], [1, "prism-header__brand-text"], [1, "prism-header__brand-name"], [1, "prism-header__brand-sub"], [1, "prism-header__widgets", "prism-header__widgets--start"], [1, "prism-header__actions"], [3, "widget"], [1, "prism-header__build-pill"], [1, "prism-header__icon-btn", 3, "click", "title"], ["name", "sun", 3, "size"], ["name", "moon", 3, "size"], ["alt", "ng prism logo", "src", "data:image/png;base64,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"]], template: function PrismHeaderComponent_Template(rf, ctx) { if (rf & 1) {
84
118
  i0.ɵɵelementStart(0, "header", 0)(1, "div", 1);
85
119
  i0.ɵɵconditionalCreate(2, PrismHeaderComponent_Conditional_2_Template, 1, 2, "img", 2)(3, PrismHeaderComponent_Conditional_3_Template, 2, 0, "div", 3);
86
120
  i0.ɵɵelementStart(4, "div", 4)(5, "span", 5);
@@ -88,13 +122,15 @@ export class PrismHeaderComponent {
88
122
  i0.ɵɵelementEnd();
89
123
  i0.ɵɵconditionalCreate(7, PrismHeaderComponent_Conditional_7_Template, 2, 1, "span", 6);
90
124
  i0.ɵɵelementEnd()();
91
- i0.ɵɵelementStart(8, "div", 7);
92
- i0.ɵɵconditionalCreate(9, PrismHeaderComponent_Conditional_9_Template, 2, 1, "span", 8);
93
- i0.ɵɵelementStart(10, "button", 9);
94
- i0.ɵɵlistener("click", function PrismHeaderComponent_Template_button_click_10_listener() { return ctx.themeService.toggle(); });
95
- i0.ɵɵconditionalCreate(11, PrismHeaderComponent_Conditional_11_Template, 1, 1, "prism-icon", 10)(12, PrismHeaderComponent_Conditional_12_Template, 1, 1, "prism-icon", 11);
125
+ i0.ɵɵconditionalCreate(8, PrismHeaderComponent_Conditional_8_Template, 3, 0, "div", 7);
126
+ i0.ɵɵelementStart(9, "div", 8);
127
+ i0.ɵɵrepeaterCreate(10, PrismHeaderComponent_For_11_Template, 1, 1, "prism-header-widget-host", 9, _forTrack0);
128
+ i0.ɵɵconditionalCreate(12, PrismHeaderComponent_Conditional_12_Template, 2, 1, "span", 10);
129
+ i0.ɵɵelementStart(13, "button", 11);
130
+ i0.ɵɵlistener("click", function PrismHeaderComponent_Template_button_click_13_listener() { return ctx.themeService.toggle(); });
131
+ i0.ɵɵconditionalCreate(14, PrismHeaderComponent_Conditional_14_Template, 1, 1, "prism-icon", 12)(15, PrismHeaderComponent_Conditional_15_Template, 1, 1, "prism-icon", 13);
96
132
  i0.ɵɵelementEnd();
97
- i0.ɵɵelement(13, "prism-layout-menu");
133
+ i0.ɵɵelement(16, "prism-layout-menu");
98
134
  i0.ɵɵelementEnd()();
99
135
  } if (rf & 2) {
100
136
  i0.ɵɵadvance(2);
@@ -103,18 +139,28 @@ export class PrismHeaderComponent {
103
139
  i0.ɵɵtextInterpolate(ctx.title());
104
140
  i0.ɵɵadvance();
105
141
  i0.ɵɵconditional(ctx.subtitle() ? 7 : -1);
142
+ i0.ɵɵadvance();
143
+ i0.ɵɵconditional(ctx.widgetsStart().length ? 8 : -1);
106
144
  i0.ɵɵadvance(2);
107
- i0.ɵɵconditional(ctx.buildInfoLabel() ? 9 : -1);
145
+ i0.ɵɵrepeater(ctx.widgetsEnd());
146
+ i0.ɵɵadvance(2);
147
+ i0.ɵɵconditional(ctx.buildInfoLabel() ? 12 : -1);
108
148
  i0.ɵɵadvance();
109
149
  i0.ɵɵproperty("title", ctx.themeService.isDark() ? "Switch to light mode" : "Switch to dark mode");
110
150
  i0.ɵɵattribute("aria-label", ctx.themeService.isDark() ? "Switch to light mode" : "Switch to dark mode")("aria-pressed", ctx.themeService.isDark());
111
151
  i0.ɵɵadvance();
112
- i0.ɵɵconditional(ctx.themeService.isDark() ? 11 : 12);
113
- } }, dependencies: [PrismIconComponent, PrismLayoutMenuComponent], styles: [".prism-header[_ngcontent-%COMP%] {\n height: 52px;\n display: grid;\n grid-template-columns: minmax(min-content, var(--sw, 264px)) 1fr auto;\n align-items: center;\n padding: 0 14px 0 0;\n background: var(--prism-bg);\n border-bottom: 1px solid var(--prism-border);\n }\n\n .prism-header__brand[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 0 16px;\n cursor: pointer;\n white-space: nowrap;\n }\n\n .prism-header__logo-default[_ngcontent-%COMP%] {\n width: 26px;\n height: 26px;\n flex: 0 0 26px;\n color: var(--prism-primary);\n filter: drop-shadow(0 0 8px var(--prism-glow-strong));\n }\n .prism-header__logo-default[_ngcontent-%COMP%] img[_ngcontent-%COMP%] { width: 30px; }\n\n .prism-header__logo-img[_ngcontent-%COMP%] {\n height: 26px;\n width: auto;\n object-fit: contain;\n }\n\n .prism-header__brand-text[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n line-height: 1.1;\n }\n\n .prism-header__brand-name[_ngcontent-%COMP%] {\n font-weight: 700;\n font-size: var(--fs-xl);\n letter-spacing: -0.01em;\n background: linear-gradient(90deg, var(--prism-primary), var(--prism-accent) 60%, var(--prism-primary-to));\n -webkit-background-clip: text;\n background-clip: text;\n color: transparent;\n }\n\n .prism-header__brand-sub[_ngcontent-%COMP%] {\n font-family: var(--font-mono);\n font-size: var(--fs-xs);\n color: var(--prism-text-ghost);\n }\n\n .prism-header__cmdbar[_ngcontent-%COMP%] {\n max-width: 540px;\n width: 100%;\n justify-self: center;\n display: flex;\n align-items: center;\n gap: 10px;\n height: 32px;\n padding: 0 12px;\n background: var(--prism-input-bg);\n border: 1px solid var(--prism-border);\n border-radius: 8px;\n color: var(--prism-text-muted);\n font-size: var(--fs-lg);\n cursor: pointer;\n transition: border-color var(--dur-fast), background var(--dur-fast);\n }\n .prism-header__cmdbar[_ngcontent-%COMP%]:hover {\n border-color: var(--prism-border-strong);\n color: var(--prism-text-2);\n }\n\n .prism-header__cmdbar-text[_ngcontent-%COMP%] {\n flex: 1;\n text-align: left;\n }\n\n .prism-header__cmdbar-shortcut[_ngcontent-%COMP%] {\n display: flex;\n gap: 3px;\n }\n .prism-header__cmdbar-shortcut[_ngcontent-%COMP%] kbd[_ngcontent-%COMP%] {\n font-family: var(--font-mono);\n font-size: 10.5px;\n padding: 1px 5px;\n border-radius: 4px;\n background: var(--prism-input-bg);\n border: 1px solid var(--prism-border);\n color: var(--prism-text-muted);\n }\n\n .prism-header__build-pill[_ngcontent-%COMP%] {\n font-family: var(--font-mono);\n font-size: var(--fs-xs);\n color: var(--prism-text-ghost);\n background: var(--prism-input-bg);\n border: 1px solid var(--prism-border);\n border-radius: 9999px;\n padding: 2px 10px;\n white-space: nowrap;\n line-height: 1.4;\n }\n\n .prism-header__actions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 6px;\n }\n\n .prism-header__icon-btn[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n display: grid;\n place-items: center;\n border-radius: 8px;\n color: var(--prism-text-muted);\n background: none;\n border: none;\n cursor: pointer;\n position: relative;\n transition: all var(--dur-fast);\n }\n .prism-header__icon-btn[_ngcontent-%COMP%]:hover {\n background: var(--prism-input-bg);\n color: var(--prism-text);\n }\n\n [_ngcontent-%COMP%]:focus-visible {\n outline: 2px solid var(--prism-primary);\n outline-offset: 2px;\n }"], changeDetection: 0 });
152
+ i0.ɵɵconditional(ctx.themeService.isDark() ? 14 : 15);
153
+ } }, dependencies: [PrismIconComponent,
154
+ PrismLayoutMenuComponent,
155
+ PrismHeaderWidgetHostComponent], styles: [".prism-header[_ngcontent-%COMP%] {\n height: 52px;\n display: grid;\n grid-template-columns: minmax(min-content, var(--sw, 264px)) 1fr auto;\n align-items: center;\n padding: 0 14px 0 0;\n background: var(--prism-bg);\n border-bottom: 1px solid var(--prism-border);\n }\n\n .prism-header__brand[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 0 16px;\n cursor: pointer;\n white-space: nowrap;\n }\n\n .prism-header__logo-default[_ngcontent-%COMP%] {\n width: 26px;\n height: 26px;\n flex: 0 0 26px;\n color: var(--prism-primary);\n filter: drop-shadow(0 0 8px var(--prism-glow-strong));\n }\n .prism-header__logo-default[_ngcontent-%COMP%] img[_ngcontent-%COMP%] { width: 30px; }\n\n .prism-header__logo-img[_ngcontent-%COMP%] {\n height: 26px;\n width: auto;\n object-fit: contain;\n }\n\n .prism-header__brand-text[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n line-height: 1.1;\n }\n\n .prism-header__brand-name[_ngcontent-%COMP%] {\n font-weight: 700;\n font-size: var(--fs-xl);\n letter-spacing: -0.01em;\n background: linear-gradient(90deg, var(--prism-primary), var(--prism-accent) 60%, var(--prism-primary-to));\n -webkit-background-clip: text;\n background-clip: text;\n color: transparent;\n }\n\n .prism-header__brand-sub[_ngcontent-%COMP%] {\n font-family: var(--font-mono);\n font-size: var(--fs-xs);\n color: var(--prism-text-ghost);\n }\n\n .prism-header__cmdbar[_ngcontent-%COMP%] {\n max-width: 540px;\n width: 100%;\n justify-self: center;\n display: flex;\n align-items: center;\n gap: 10px;\n height: 32px;\n padding: 0 12px;\n background: var(--prism-input-bg);\n border: 1px solid var(--prism-border);\n border-radius: 8px;\n color: var(--prism-text-muted);\n font-size: var(--fs-lg);\n cursor: pointer;\n transition: border-color var(--dur-fast), background var(--dur-fast);\n }\n .prism-header__cmdbar[_ngcontent-%COMP%]:hover {\n border-color: var(--prism-border-strong);\n color: var(--prism-text-2);\n }\n\n .prism-header__cmdbar-text[_ngcontent-%COMP%] {\n flex: 1;\n text-align: left;\n }\n\n .prism-header__cmdbar-shortcut[_ngcontent-%COMP%] {\n display: flex;\n gap: 3px;\n }\n .prism-header__cmdbar-shortcut[_ngcontent-%COMP%] kbd[_ngcontent-%COMP%] {\n font-family: var(--font-mono);\n font-size: 10.5px;\n padding: 1px 5px;\n border-radius: 4px;\n background: var(--prism-input-bg);\n border: 1px solid var(--prism-border);\n color: var(--prism-text-muted);\n }\n\n .prism-header__build-pill[_ngcontent-%COMP%] {\n font-family: var(--font-mono);\n font-size: var(--fs-xs);\n color: var(--prism-text-ghost);\n background: var(--prism-input-bg);\n border: 1px solid var(--prism-border);\n border-radius: 9999px;\n padding: 2px 10px;\n white-space: nowrap;\n line-height: 1.4;\n }\n\n .prism-header__actions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 6px;\n }\n\n .prism-header__widgets[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n }\n .prism-header__widgets--start[_ngcontent-%COMP%] {\n padding-left: 4px;\n justify-content: flex-start;\n }\n\n .prism-header__icon-btn[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n display: grid;\n place-items: center;\n border-radius: 8px;\n color: var(--prism-text-muted);\n background: none;\n border: none;\n cursor: pointer;\n position: relative;\n transition: all var(--dur-fast);\n }\n .prism-header__icon-btn[_ngcontent-%COMP%]:hover {\n background: var(--prism-input-bg);\n color: var(--prism-text);\n }\n\n [_ngcontent-%COMP%]:focus-visible {\n outline: 2px solid var(--prism-primary);\n outline-offset: 2px;\n }"], changeDetection: 0 });
114
156
  }
115
157
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(PrismHeaderComponent, [{
116
158
  type: Component,
117
- args: [{ selector: 'prism-header', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [PrismIconComponent, PrismLayoutMenuComponent], template: `
159
+ args: [{ selector: 'prism-header', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [
160
+ PrismIconComponent,
161
+ PrismLayoutMenuComponent,
162
+ PrismHeaderWidgetHostComponent,
163
+ ], template: `
118
164
  <header class="prism-header">
119
165
  <div class="prism-header__brand">
120
166
  @if (logoUrl()) {
@@ -134,7 +180,17 @@ export class PrismHeaderComponent {
134
180
  }
135
181
  </div>
136
182
  </div>
183
+ @if (widgetsStart().length) {
184
+ <div class="prism-header__widgets prism-header__widgets--start">
185
+ @for (w of widgetsStart(); track w.id) {
186
+ <prism-header-widget-host [widget]="w" />
187
+ }
188
+ </div>
189
+ }
137
190
  <div class="prism-header__actions">
191
+ @for (w of widgetsEnd(); track w.id) {
192
+ <prism-header-widget-host [widget]="w" />
193
+ }
138
194
  @if (buildInfoLabel()) {
139
195
  <span class="prism-header__build-pill">{{ buildInfoLabel() }}</span>
140
196
  }
@@ -162,9 +218,9 @@ export class PrismHeaderComponent {
162
218
  <prism-layout-menu />
163
219
  </div>
164
220
  </header>
165
- `, styles: ["\n .prism-header {\n height: 52px;\n display: grid;\n grid-template-columns: minmax(min-content, var(--sw, 264px)) 1fr auto;\n align-items: center;\n padding: 0 14px 0 0;\n background: var(--prism-bg);\n border-bottom: 1px solid var(--prism-border);\n }\n\n .prism-header__brand {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 0 16px;\n cursor: pointer;\n white-space: nowrap;\n }\n\n .prism-header__logo-default {\n width: 26px;\n height: 26px;\n flex: 0 0 26px;\n color: var(--prism-primary);\n filter: drop-shadow(0 0 8px var(--prism-glow-strong));\n }\n .prism-header__logo-default img { width: 30px; }\n\n .prism-header__logo-img {\n height: 26px;\n width: auto;\n object-fit: contain;\n }\n\n .prism-header__brand-text {\n display: flex;\n flex-direction: column;\n line-height: 1.1;\n }\n\n .prism-header__brand-name {\n font-weight: 700;\n font-size: var(--fs-xl);\n letter-spacing: -0.01em;\n background: linear-gradient(90deg, var(--prism-primary), var(--prism-accent) 60%, var(--prism-primary-to));\n -webkit-background-clip: text;\n background-clip: text;\n color: transparent;\n }\n\n .prism-header__brand-sub {\n font-family: var(--font-mono);\n font-size: var(--fs-xs);\n color: var(--prism-text-ghost);\n }\n\n .prism-header__cmdbar {\n max-width: 540px;\n width: 100%;\n justify-self: center;\n display: flex;\n align-items: center;\n gap: 10px;\n height: 32px;\n padding: 0 12px;\n background: var(--prism-input-bg);\n border: 1px solid var(--prism-border);\n border-radius: 8px;\n color: var(--prism-text-muted);\n font-size: var(--fs-lg);\n cursor: pointer;\n transition: border-color var(--dur-fast), background var(--dur-fast);\n }\n .prism-header__cmdbar:hover {\n border-color: var(--prism-border-strong);\n color: var(--prism-text-2);\n }\n\n .prism-header__cmdbar-text {\n flex: 1;\n text-align: left;\n }\n\n .prism-header__cmdbar-shortcut {\n display: flex;\n gap: 3px;\n }\n .prism-header__cmdbar-shortcut kbd {\n font-family: var(--font-mono);\n font-size: 10.5px;\n padding: 1px 5px;\n border-radius: 4px;\n background: var(--prism-input-bg);\n border: 1px solid var(--prism-border);\n color: var(--prism-text-muted);\n }\n\n .prism-header__build-pill {\n font-family: var(--font-mono);\n font-size: var(--fs-xs);\n color: var(--prism-text-ghost);\n background: var(--prism-input-bg);\n border: 1px solid var(--prism-border);\n border-radius: 9999px;\n padding: 2px 10px;\n white-space: nowrap;\n line-height: 1.4;\n }\n\n .prism-header__actions {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 6px;\n }\n\n .prism-header__icon-btn {\n width: 32px;\n height: 32px;\n display: grid;\n place-items: center;\n border-radius: 8px;\n color: var(--prism-text-muted);\n background: none;\n border: none;\n cursor: pointer;\n position: relative;\n transition: all var(--dur-fast);\n }\n .prism-header__icon-btn:hover {\n background: var(--prism-input-bg);\n color: var(--prism-text);\n }\n\n :focus-visible {\n outline: 2px solid var(--prism-primary);\n outline-offset: 2px;\n }\n "] }]
221
+ `, styles: ["\n .prism-header {\n height: 52px;\n display: grid;\n grid-template-columns: minmax(min-content, var(--sw, 264px)) 1fr auto;\n align-items: center;\n padding: 0 14px 0 0;\n background: var(--prism-bg);\n border-bottom: 1px solid var(--prism-border);\n }\n\n .prism-header__brand {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 0 16px;\n cursor: pointer;\n white-space: nowrap;\n }\n\n .prism-header__logo-default {\n width: 26px;\n height: 26px;\n flex: 0 0 26px;\n color: var(--prism-primary);\n filter: drop-shadow(0 0 8px var(--prism-glow-strong));\n }\n .prism-header__logo-default img { width: 30px; }\n\n .prism-header__logo-img {\n height: 26px;\n width: auto;\n object-fit: contain;\n }\n\n .prism-header__brand-text {\n display: flex;\n flex-direction: column;\n line-height: 1.1;\n }\n\n .prism-header__brand-name {\n font-weight: 700;\n font-size: var(--fs-xl);\n letter-spacing: -0.01em;\n background: linear-gradient(90deg, var(--prism-primary), var(--prism-accent) 60%, var(--prism-primary-to));\n -webkit-background-clip: text;\n background-clip: text;\n color: transparent;\n }\n\n .prism-header__brand-sub {\n font-family: var(--font-mono);\n font-size: var(--fs-xs);\n color: var(--prism-text-ghost);\n }\n\n .prism-header__cmdbar {\n max-width: 540px;\n width: 100%;\n justify-self: center;\n display: flex;\n align-items: center;\n gap: 10px;\n height: 32px;\n padding: 0 12px;\n background: var(--prism-input-bg);\n border: 1px solid var(--prism-border);\n border-radius: 8px;\n color: var(--prism-text-muted);\n font-size: var(--fs-lg);\n cursor: pointer;\n transition: border-color var(--dur-fast), background var(--dur-fast);\n }\n .prism-header__cmdbar:hover {\n border-color: var(--prism-border-strong);\n color: var(--prism-text-2);\n }\n\n .prism-header__cmdbar-text {\n flex: 1;\n text-align: left;\n }\n\n .prism-header__cmdbar-shortcut {\n display: flex;\n gap: 3px;\n }\n .prism-header__cmdbar-shortcut kbd {\n font-family: var(--font-mono);\n font-size: 10.5px;\n padding: 1px 5px;\n border-radius: 4px;\n background: var(--prism-input-bg);\n border: 1px solid var(--prism-border);\n color: var(--prism-text-muted);\n }\n\n .prism-header__build-pill {\n font-family: var(--font-mono);\n font-size: var(--fs-xs);\n color: var(--prism-text-ghost);\n background: var(--prism-input-bg);\n border: 1px solid var(--prism-border);\n border-radius: 9999px;\n padding: 2px 10px;\n white-space: nowrap;\n line-height: 1.4;\n }\n\n .prism-header__actions {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 6px;\n }\n\n .prism-header__widgets {\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n }\n .prism-header__widgets--start {\n padding-left: 4px;\n justify-content: flex-start;\n }\n\n .prism-header__icon-btn {\n width: 32px;\n height: 32px;\n display: grid;\n place-items: center;\n border-radius: 8px;\n color: var(--prism-text-muted);\n background: none;\n border: none;\n cursor: pointer;\n position: relative;\n transition: all var(--dur-fast);\n }\n .prism-header__icon-btn:hover {\n background: var(--prism-input-bg);\n color: var(--prism-text);\n }\n\n :focus-visible {\n outline: 2px solid var(--prism-primary);\n outline-offset: 2px;\n }\n "] }]
166
222
  }], null, { onGlobalKey: [{
167
223
  type: HostListener,
168
224
  args: ['document:keydown', ['$event']]
169
225
  }] }); })();
170
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(PrismHeaderComponent, { className: "PrismHeaderComponent", filePath: "app/header/prism-header.component.ts", lineNumber: 210 }); })();
226
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(PrismHeaderComponent, { className: "PrismHeaderComponent", filePath: "app/header/prism-header.component.ts", lineNumber: 238 }); })();
@@ -0,0 +1,16 @@
1
+ import * as i0 from "@angular/core";
2
+ type Variant = 'ok' | 'warn' | 'danger';
3
+ export declare class A11yHeaderBadgeComponent {
4
+ private readonly manifest;
5
+ private readonly config;
6
+ protected readonly data: import("@angular/core").Signal<{
7
+ score: number;
8
+ variant: Variant;
9
+ title: string;
10
+ } | null>;
11
+ private computeVariant;
12
+ static ɵfac: i0.ɵɵFactoryDeclaration<A11yHeaderBadgeComponent, never>;
13
+ static ɵcmp: i0.ɵɵComponentDeclaration<A11yHeaderBadgeComponent, "prism-a11y-header-badge", never, {}, {}, never, never, true, never>;
14
+ }
15
+ export {};
16
+ //# sourceMappingURL=a11y-header-badge.component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"a11y-header-badge.component.d.ts","sourceRoot":"","sources":["../../../../src/app/panels/a11y/a11y-header-badge.component.ts"],"names":[],"mappings":";AAcA,KAAK,OAAO,GAAG,IAAI,GAAG,MAAM,GAAG,QAAQ,CAAC;AAExC,qBAqFa,wBAAwB;IACnC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA2C;IACpE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuC;IAE9D,SAAS,CAAC,QAAQ,CAAC,IAAI;;;;cAoBpB;IAEH,OAAO,CAAC,cAAc;yCA1BX,wBAAwB;2CAAxB,wBAAwB;CAsCpC"}
@@ -0,0 +1,84 @@
1
+ import { ChangeDetectionStrategy, Component, computed, inject, } from '@angular/core';
2
+ import { PRISM_CONFIG, PRISM_MANIFEST } from '../../tokens/prism-tokens.js';
3
+ import { resolveA11yThresholds } from './a11y-thresholds.js';
4
+ import * as i0 from "@angular/core";
5
+ function A11yHeaderBadgeComponent_Conditional_0_Template(rf, ctx) { if (rf & 1) {
6
+ i0.ɵɵdomElementStart(0, "span", 1);
7
+ i0.ɵɵdomElement(1, "span", 2);
8
+ i0.ɵɵdomElementStart(2, "span", 3);
9
+ i0.ɵɵtext(3, "A11y");
10
+ i0.ɵɵdomElementEnd();
11
+ i0.ɵɵdomElementStart(4, "span", 4);
12
+ i0.ɵɵtext(5);
13
+ i0.ɵɵdomElementStart(6, "small");
14
+ i0.ɵɵtext(7, "%");
15
+ i0.ɵɵdomElementEnd()()();
16
+ } if (rf & 2) {
17
+ const d_r1 = ctx;
18
+ i0.ɵɵclassProp("a11y-pill--ok", d_r1.variant === "ok")("a11y-pill--warn", d_r1.variant === "warn")("a11y-pill--danger", d_r1.variant === "danger");
19
+ i0.ɵɵdomProperty("title", d_r1.title);
20
+ i0.ɵɵadvance(5);
21
+ i0.ɵɵtextInterpolate(d_r1.score);
22
+ } }
23
+ export class A11yHeaderBadgeComponent {
24
+ manifest = inject(PRISM_MANIFEST);
25
+ config = inject(PRISM_CONFIG);
26
+ data = computed(() => {
27
+ const meta = this.manifest.meta?.['a11y'];
28
+ if (!meta?.total)
29
+ return null;
30
+ const score = meta.total.score;
31
+ const thresholds = resolveA11yThresholds({
32
+ ...meta.thresholds,
33
+ ...this.config.a11y?.thresholds,
34
+ });
35
+ const variant = this.computeVariant(score, meta.total, thresholds);
36
+ return {
37
+ score,
38
+ variant,
39
+ title: `Library A11y: ${score}% (target ${thresholds.score}%)\n` +
40
+ `${meta.total.auditedComponents} components · ${meta.total.auditedVariants} variants\n` +
41
+ `Violations: ${meta.total.critical} critical · ${meta.total.serious} serious · ` +
42
+ `${meta.total.moderate} moderate · ${meta.total.minor} minor`,
43
+ };
44
+ }, ...(ngDevMode ? [{ debugName: "data" }] : []));
45
+ computeVariant(score, total, thresholds) {
46
+ if (total.critical > thresholds.critical)
47
+ return 'danger';
48
+ if (total.serious > thresholds.serious)
49
+ return 'danger';
50
+ if (score < thresholds.score * 0.75)
51
+ return 'danger';
52
+ if (score < thresholds.score)
53
+ return 'warn';
54
+ if (total.moderate > thresholds.moderate)
55
+ return 'warn';
56
+ return 'ok';
57
+ }
58
+ static ɵfac = function A11yHeaderBadgeComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || A11yHeaderBadgeComponent)(); };
59
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: A11yHeaderBadgeComponent, selectors: [["prism-a11y-header-badge"]], decls: 1, vars: 1, consts: [[1, "a11y-pill", 3, "a11y-pill--ok", "a11y-pill--warn", "a11y-pill--danger", "title"], [1, "a11y-pill", 3, "title"], [1, "a11y-pill__dot"], [1, "a11y-pill__label"], [1, "a11y-pill__value"]], template: function A11yHeaderBadgeComponent_Template(rf, ctx) { if (rf & 1) {
60
+ i0.ɵɵconditionalCreate(0, A11yHeaderBadgeComponent_Conditional_0_Template, 8, 8, "span", 0);
61
+ } if (rf & 2) {
62
+ let tmp_0_0;
63
+ i0.ɵɵconditional((tmp_0_0 = ctx.data()) ? 0 : -1, tmp_0_0);
64
+ } }, styles: ["[_nghost-%COMP%] { display: inline-flex; align-items: center; }\n\n .a11y-pill[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-family: var(--font-mono);\n font-size: var(--fs-xs);\n padding: 2px 10px;\n border-radius: 9999px;\n line-height: 1.4;\n border: 1px solid var(--prism-border);\n background: var(--prism-input-bg);\n color: var(--prism-text-muted);\n white-space: nowrap;\n }\n\n .a11y-pill__dot[_ngcontent-%COMP%] {\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: currentColor;\n }\n\n .a11y-pill__label[_ngcontent-%COMP%] {\n color: var(--prism-text-ghost);\n letter-spacing: 0.02em;\n }\n\n .a11y-pill__value[_ngcontent-%COMP%] {\n color: var(--prism-text);\n font-weight: 600;\n }\n .a11y-pill__value[_ngcontent-%COMP%] small[_ngcontent-%COMP%] {\n font-size: 9px;\n margin-left: 1px;\n color: var(--prism-text-muted);\n font-weight: 500;\n }\n\n .a11y-pill--ok[_ngcontent-%COMP%] {\n color: var(--prism-success);\n border-color: color-mix(in srgb, var(--prism-success) 35%, transparent);\n background: color-mix(in srgb, var(--prism-success) 12%, transparent);\n }\n .a11y-pill--ok[_ngcontent-%COMP%] .a11y-pill__label[_ngcontent-%COMP%], \n .a11y-pill--ok[_ngcontent-%COMP%] .a11y-pill__value[_ngcontent-%COMP%] { color: var(--prism-success); }\n\n .a11y-pill--warn[_ngcontent-%COMP%] {\n color: var(--prism-warn);\n border-color: color-mix(in srgb, var(--prism-warn) 35%, transparent);\n background: color-mix(in srgb, var(--prism-warn) 12%, transparent);\n }\n .a11y-pill--warn[_ngcontent-%COMP%] .a11y-pill__label[_ngcontent-%COMP%], \n .a11y-pill--warn[_ngcontent-%COMP%] .a11y-pill__value[_ngcontent-%COMP%] { color: var(--prism-warn); }\n\n .a11y-pill--danger[_ngcontent-%COMP%] {\n color: var(--prism-danger);\n border-color: color-mix(in srgb, var(--prism-danger) 35%, transparent);\n background: color-mix(in srgb, var(--prism-danger) 12%, transparent);\n }\n .a11y-pill--danger[_ngcontent-%COMP%] .a11y-pill__label[_ngcontent-%COMP%], \n .a11y-pill--danger[_ngcontent-%COMP%] .a11y-pill__value[_ngcontent-%COMP%] { color: var(--prism-danger); }"], changeDetection: 0 });
65
+ }
66
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(A11yHeaderBadgeComponent, [{
67
+ type: Component,
68
+ args: [{ selector: 'prism-a11y-header-badge', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: `
69
+ @if (data(); as d) {
70
+ <span
71
+ class="a11y-pill"
72
+ [class.a11y-pill--ok]="d.variant === 'ok'"
73
+ [class.a11y-pill--warn]="d.variant === 'warn'"
74
+ [class.a11y-pill--danger]="d.variant === 'danger'"
75
+ [title]="d.title"
76
+ >
77
+ <span class="a11y-pill__dot"></span>
78
+ <span class="a11y-pill__label">A11y</span>
79
+ <span class="a11y-pill__value">{{ d.score }}<small>%</small></span>
80
+ </span>
81
+ }
82
+ `, styles: ["\n :host { display: inline-flex; align-items: center; }\n\n .a11y-pill {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-family: var(--font-mono);\n font-size: var(--fs-xs);\n padding: 2px 10px;\n border-radius: 9999px;\n line-height: 1.4;\n border: 1px solid var(--prism-border);\n background: var(--prism-input-bg);\n color: var(--prism-text-muted);\n white-space: nowrap;\n }\n\n .a11y-pill__dot {\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: currentColor;\n }\n\n .a11y-pill__label {\n color: var(--prism-text-ghost);\n letter-spacing: 0.02em;\n }\n\n .a11y-pill__value {\n color: var(--prism-text);\n font-weight: 600;\n }\n .a11y-pill__value small {\n font-size: 9px;\n margin-left: 1px;\n color: var(--prism-text-muted);\n font-weight: 500;\n }\n\n .a11y-pill--ok {\n color: var(--prism-success);\n border-color: color-mix(in srgb, var(--prism-success) 35%, transparent);\n background: color-mix(in srgb, var(--prism-success) 12%, transparent);\n }\n .a11y-pill--ok .a11y-pill__label,\n .a11y-pill--ok .a11y-pill__value { color: var(--prism-success); }\n\n .a11y-pill--warn {\n color: var(--prism-warn);\n border-color: color-mix(in srgb, var(--prism-warn) 35%, transparent);\n background: color-mix(in srgb, var(--prism-warn) 12%, transparent);\n }\n .a11y-pill--warn .a11y-pill__label,\n .a11y-pill--warn .a11y-pill__value { color: var(--prism-warn); }\n\n .a11y-pill--danger {\n color: var(--prism-danger);\n border-color: color-mix(in srgb, var(--prism-danger) 35%, transparent);\n background: color-mix(in srgb, var(--prism-danger) 12%, transparent);\n }\n .a11y-pill--danger .a11y-pill__label,\n .a11y-pill--danger .a11y-pill__value { color: var(--prism-danger); }\n "] }]
83
+ }], null, null); })();
84
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(A11yHeaderBadgeComponent, { className: "A11yHeaderBadgeComponent", filePath: "app/panels/a11y/a11y-header-badge.component.ts", lineNumber: 102 }); })();
@@ -0,0 +1,6 @@
1
+ import type { A11yThresholds } from './a11y.types.js';
2
+ /** Sentinel value meaning "no upper bound" — JSON-safe (unlike Infinity, which serializes to null). */
3
+ export declare const A11Y_UNLIMITED: number;
4
+ export declare const DEFAULT_A11Y_THRESHOLDS: A11yThresholds;
5
+ export declare function resolveA11yThresholds(input?: Partial<A11yThresholds>): A11yThresholds;
6
+ //# sourceMappingURL=a11y-thresholds.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"a11y-thresholds.d.ts","sourceRoot":"","sources":["../../../../src/app/panels/a11y/a11y-thresholds.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEtD,uGAAuG;AACvG,eAAO,MAAM,cAAc,QAA0B,CAAC;AAEtD,eAAO,MAAM,uBAAuB,EAAE,cAKrC,CAAC;AAEF,wBAAgB,qBAAqB,CACnC,KAAK,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GAC9B,cAAc,CAGhB"}
@@ -0,0 +1,13 @@
1
+ /** Sentinel value meaning "no upper bound" — JSON-safe (unlike Infinity, which serializes to null). */
2
+ export const A11Y_UNLIMITED = Number.MAX_SAFE_INTEGER;
3
+ export const DEFAULT_A11Y_THRESHOLDS = {
4
+ score: 80,
5
+ critical: 0,
6
+ serious: 0,
7
+ moderate: A11Y_UNLIMITED,
8
+ };
9
+ export function resolveA11yThresholds(input) {
10
+ if (!input)
11
+ return { ...DEFAULT_A11Y_THRESHOLDS };
12
+ return { ...DEFAULT_A11Y_THRESHOLDS, ...input };
13
+ }
@@ -14,6 +14,39 @@ export interface A11yScoreResult {
14
14
  passes: number;
15
15
  incomplete: number;
16
16
  }
17
+ export interface A11yThresholds {
18
+ /** Minimum acceptable avg score (0-100). Default: 80 */
19
+ score: number;
20
+ /** Maximum allowed critical violations across the library. Default: 0 */
21
+ critical: number;
22
+ /** Maximum allowed serious violations across the library. Default: 0 */
23
+ serious: number;
24
+ /** Maximum allowed moderate violations across the library. Default: A11Y_UNLIMITED. */
25
+ moderate: number;
26
+ }
27
+ /** A11y-Report shape produced by the build-time audit (or any user script). */
28
+ export interface A11yReport {
29
+ /** Aggregate library-wide score data (avg + sum of violations). */
30
+ total: A11yScoreResult & {
31
+ auditedComponents: number;
32
+ auditedVariants: number;
33
+ };
34
+ /** Optional per-component breakdown (className → score). Used for tooltips/drilldown. */
35
+ components?: Record<string, A11yScoreResult>;
36
+ /** Timestamp the report was generated. */
37
+ generatedAt?: string;
38
+ }
39
+ /** Shape stored under `manifest.meta.a11y` once the report is merged in. */
40
+ export interface A11yManifestMeta {
41
+ total: A11yReport['total'];
42
+ thresholds: A11yThresholds;
43
+ }
44
+ export interface NgPrismA11yConfig {
45
+ /** Thresholds for the header badge color-coding and (when run via the CLI) build failure. */
46
+ thresholds?: Partial<A11yThresholds>;
47
+ /** Path to the a11y report JSON, relative to the workspace root. Default: 'a11y-report.json'. */
48
+ reportPath?: string;
49
+ }
17
50
  export interface FocusableElement {
18
51
  element: Element;
19
52
  index: number;
@@ -1 +1 @@
1
- {"version":3,"file":"a11y.types.d.ts","sourceRoot":"","sources":["../../../../src/app/panels/a11y/a11y.types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAC7C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC;IACzC,QAAQ,EAAE,QAAQ,EAAE,CAAC;IACrB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;CAClB"}
1
+ {"version":3,"file":"a11y.types.d.ts","sourceRoot":"","sources":["../../../../src/app/panels/a11y/a11y.types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAC7C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,wDAAwD;IACxD,KAAK,EAAE,MAAM,CAAC;IACd,yEAAyE;IACzE,QAAQ,EAAE,MAAM,CAAC;IACjB,wEAAwE;IACxE,OAAO,EAAE,MAAM,CAAC;IAChB,uFAAuF;IACvF,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,+EAA+E;AAC/E,MAAM,WAAW,UAAU;IACzB,mEAAmE;IACnE,KAAK,EAAE,eAAe,GAAG;QAAE,iBAAiB,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAA;KAAE,CAAC;IAChF,yFAAyF;IACzF,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAC7C,0CAA0C;IAC1C,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,4EAA4E;AAC5E,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC;IAC3B,UAAU,EAAE,cAAc,CAAC;CAC5B;AAED,MAAM,WAAW,iBAAiB;IAChC,6FAA6F;IAC7F,UAAU,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;IACrC,iGAAiG;IACjG,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC;IACzC,QAAQ,EAAE,QAAQ,EAAE,CAAC;IACrB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;CAClB"}
@@ -0,0 +1,3 @@
1
+ import type { HeaderWidgetDefinition } from '../../plugin/plugin.types.js';
2
+ export declare const BUILTIN_HEADER_WIDGETS: HeaderWidgetDefinition[];
3
+ //# sourceMappingURL=builtin-header-widgets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builtin-header-widgets.d.ts","sourceRoot":"","sources":["../../../src/app/panels/builtin-header-widgets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AAG3E,eAAO,MAAM,sBAAsB,EAAE,sBAAsB,EAO1D,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { A11yHeaderBadgeComponent } from './a11y/a11y-header-badge.component.js';
2
+ export const BUILTIN_HEADER_WIDGETS = [
3
+ {
4
+ id: 'a11y-total',
5
+ component: A11yHeaderBadgeComponent,
6
+ placement: 'end',
7
+ order: -20,
8
+ },
9
+ ];
@@ -1,11 +1,18 @@
1
1
  import { EnvironmentInjector, type Type } from '@angular/core';
2
2
  import { PrismPanelService } from '../../services/prism-panel.service.js';
3
+ import type { PanelDefinition } from '../../../plugin/plugin.types.js';
3
4
  import * as i0 from "@angular/core";
5
+ type RenderedPanelEntry = {
6
+ id: string;
7
+ component: Type<unknown>;
8
+ injector: EnvironmentInjector | null;
9
+ keepAlive: boolean;
10
+ };
4
11
  export declare class PrismPanelHostComponent {
5
12
  private readonly pluginService;
6
13
  private readonly nav;
7
14
  protected readonly panelService: PrismPanelService;
8
- private readonly envInjector;
15
+ protected readonly envInjector: EnvironmentInjector;
9
16
  private readonly auditService;
10
17
  private readonly rendererService;
11
18
  private readonly a11yScore;
@@ -16,15 +23,19 @@ export declare class PrismPanelHostComponent {
16
23
  variant: 'default' | 'ok' | 'warn' | 'danger';
17
24
  } | null;
18
25
  private readonly builtInPanels;
19
- protected readonly allPanels: import("@angular/core").Signal<import("../../../index.js").PanelDefinition[]>;
20
- protected readonly resolvedComponent: import("@angular/core").WritableSignal<Type<unknown> | null>;
26
+ protected readonly allPanels: import("@angular/core").Signal<PanelDefinition[]>;
21
27
  protected readonly panelInputs: import("@angular/core").Signal<{
22
- activeComponent: import("../../../index.js").RuntimeComponent | null;
28
+ activeComponent: import("../../../plugin/plugin.types.js").RuntimeComponent | null;
23
29
  }>;
24
30
  private readonly lazyCache;
25
- protected readonly activeInjector: import("@angular/core").Signal<EnvironmentInjector>;
31
+ private readonly renderedPanels;
32
+ protected readonly renderedPanelsArray: import("@angular/core").Signal<RenderedPanelEntry[]>;
26
33
  constructor();
34
+ private ensurePanelLoaded;
35
+ private addRenderedPanel;
36
+ private pruneRenderedPanels;
27
37
  static ɵfac: i0.ɵɵFactoryDeclaration<PrismPanelHostComponent, never>;
28
38
  static ɵcmp: i0.ɵɵComponentDeclaration<PrismPanelHostComponent, "prism-panel-host", never, {}, {}, never, never, true, never>;
29
39
  }
40
+ export {};
30
41
  //# sourceMappingURL=prism-panel-host.component.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"prism-panel-host.component.d.ts","sourceRoot":"","sources":["../../../../src/app/panels/panel-host/prism-panel-host.component.ts"],"names":[],"mappings":"AACA,OAAO,EAIL,mBAAmB,EAGnB,KAAK,IAAI,EAEV,MAAM,eAAe,CAAC;AAKvB,OAAO,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;;AAK1E,qBA+Ka,uBAAuB;IAClC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA8B;IAC5D,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAkC;IACtD,SAAS,CAAC,QAAQ,CAAC,YAAY,oBAA6B;IAC5D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA+B;IAC3D,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA4B;IACzD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAgC;IAEhE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAExB;IAEF,OAAO,CAAC,QAAQ,CAAC,aAAa,CAK3B;IAEH,OAAO,CAAC,QAAQ,CAAC,UAAU,CAGxB;IAEH,SAAS,CAAC,UAAU,CAClB,OAAO,EAAE,MAAM,GACd;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,SAAS,GAAG,IAAI,GAAG,MAAM,GAAG,QAAQ,CAAA;KAAE,GAAG,IAAI;IAwBzE,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAkB;IAEhD,SAAS,CAAC,QAAQ,CAAC,SAAS,gFAQzB;IAEH,SAAS,CAAC,QAAQ,CAAC,iBAAiB,+DAAsC;IAC1E,SAAS,CAAC,QAAQ,CAAC,WAAW;;OAE1B;IAEJ,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAoC;IAE9D,SAAS,CAAC,QAAQ,CAAC,cAAc,sDAE/B;;yCAvES,uBAAuB;2CAAvB,uBAAuB;CA6HnC"}
1
+ {"version":3,"file":"prism-panel-host.component.d.ts","sourceRoot":"","sources":["../../../../src/app/panels/panel-host/prism-panel-host.component.ts"],"names":[],"mappings":"AACA,OAAO,EAIL,mBAAmB,EAGnB,KAAK,IAAI,EAGV,MAAM,eAAe,CAAC;AAKvB,OAAO,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAI1E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;;AAEvE,KAAK,kBAAkB,GAAG;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IACzB,QAAQ,EAAE,mBAAmB,GAAG,IAAI,CAAC;IACrC,SAAS,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,qBAuLa,uBAAuB;IAClC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA8B;IAC5D,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAkC;IACtD,SAAS,CAAC,QAAQ,CAAC,YAAY,oBAA6B;IAC5D,SAAS,CAAC,QAAQ,CAAC,WAAW,sBAA+B;IAC7D,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA4B;IACzD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAgC;IAEhE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAExB;IAEF,OAAO,CAAC,QAAQ,CAAC,aAAa,CAK3B;IAEH,OAAO,CAAC,QAAQ,CAAC,UAAU,CAGxB;IAEH,SAAS,CAAC,UAAU,CAClB,OAAO,EAAE,MAAM,GACd;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,SAAS,GAAG,IAAI,GAAG,MAAM,GAAG,QAAQ,CAAA;KAAE,GAAG,IAAI;IAwBzE,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAkB;IAEhD,SAAS,CAAC,QAAQ,CAAC,SAAS,oDAQzB;IAEH,SAAS,CAAC,QAAQ,CAAC,WAAW;;OAE1B;IAEJ,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAoC;IAE9D,OAAO,CAAC,QAAQ,CAAC,cAAc,CAE7B;IACF,SAAS,CAAC,QAAQ,CAAC,mBAAmB,uDAEpC;;IAsCF,OAAO,CAAC,iBAAiB;IAuBzB,OAAO,CAAC,gBAAgB;IAcxB,OAAO,CAAC,mBAAmB;yCApJhB,uBAAuB;2CAAvB,uBAAuB;CAwKnC"}