@ng-prism/core 21.4.4 → 21.5.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.
Files changed (105) hide show
  1. package/README.md +1 -1
  2. package/dist/app/canvas/prism-canvas-rulers.component.d.ts +16 -0
  3. package/dist/app/canvas/prism-canvas-rulers.component.d.ts.map +1 -0
  4. package/dist/app/canvas/prism-canvas-rulers.component.js +177 -0
  5. package/dist/app/canvas/prism-canvas-toolbar.component.d.ts +14 -0
  6. package/dist/app/canvas/prism-canvas-toolbar.component.d.ts.map +1 -0
  7. package/dist/app/canvas/prism-canvas-toolbar.component.js +144 -0
  8. package/dist/app/canvas/prism-code-drawer.component.d.ts +12 -0
  9. package/dist/app/canvas/prism-code-drawer.component.d.ts.map +1 -0
  10. package/dist/app/canvas/prism-code-drawer.component.js +114 -0
  11. package/dist/app/component-head/prism-component-head.component.d.ts +15 -0
  12. package/dist/app/component-head/prism-component-head.component.d.ts.map +1 -0
  13. package/dist/app/component-head/prism-component-head.component.js +207 -0
  14. package/dist/app/component-head/prism-stat.component.d.ts +10 -0
  15. package/dist/app/component-head/prism-stat.component.d.ts.map +1 -0
  16. package/dist/app/component-head/prism-stat.component.js +52 -0
  17. package/dist/app/controls/boolean-control.component.d.ts.map +1 -1
  18. package/dist/app/controls/boolean-control.component.js +16 -44
  19. package/dist/app/controls/json-control.component.d.ts.map +1 -1
  20. package/dist/app/controls/json-control.component.js +33 -54
  21. package/dist/app/controls/number-control.component.d.ts.map +1 -1
  22. package/dist/app/controls/number-control.component.js +18 -35
  23. package/dist/app/controls/string-control.component.d.ts.map +1 -1
  24. package/dist/app/controls/string-control.component.js +14 -41
  25. package/dist/app/controls/union-control.component.d.ts.map +1 -1
  26. package/dist/app/controls/union-control.component.js +26 -50
  27. package/dist/app/directives/prism-resizer.directive.d.ts +14 -0
  28. package/dist/app/directives/prism-resizer.directive.d.ts.map +1 -0
  29. package/dist/app/directives/prism-resizer.directive.js +71 -0
  30. package/dist/app/header/prism-header.component.d.ts +3 -0
  31. package/dist/app/header/prism-header.component.d.ts.map +1 -1
  32. package/dist/app/header/prism-header.component.js +91 -215
  33. package/dist/app/icons/prism-icon.component.d.ts +10 -0
  34. package/dist/app/icons/prism-icon.component.d.ts.map +1 -0
  35. package/dist/app/icons/prism-icon.component.js +64 -0
  36. package/dist/app/index.d.ts +4 -3
  37. package/dist/app/index.d.ts.map +1 -1
  38. package/dist/app/index.js +4 -3
  39. package/dist/app/layout-menu/prism-layout-menu.component.d.ts.map +1 -1
  40. package/dist/app/layout-menu/prism-layout-menu.component.js +63 -69
  41. package/dist/app/panels/a11y/a11y-core.plugin.d.ts.map +1 -1
  42. package/dist/app/panels/a11y/a11y-core.plugin.js +1 -0
  43. package/dist/app/panels/a11y/a11y-keyboard.component.d.ts.map +1 -1
  44. package/dist/app/panels/a11y/a11y-keyboard.component.js +61 -100
  45. package/dist/app/panels/a11y/a11y-overlay-host.component.d.ts +4 -0
  46. package/dist/app/panels/a11y/a11y-overlay-host.component.d.ts.map +1 -1
  47. package/dist/app/panels/a11y/a11y-overlay-host.component.js +87 -11
  48. package/dist/app/panels/a11y/a11y-panel.component.d.ts +0 -2
  49. package/dist/app/panels/a11y/a11y-panel.component.d.ts.map +1 -1
  50. package/dist/app/panels/a11y/a11y-panel.component.js +70 -85
  51. package/dist/app/panels/a11y/a11y-score.component.d.ts +2 -1
  52. package/dist/app/panels/a11y/a11y-score.component.d.ts.map +1 -1
  53. package/dist/app/panels/a11y/a11y-score.component.js +55 -49
  54. package/dist/app/panels/a11y/a11y-sr.component.d.ts +1 -9
  55. package/dist/app/panels/a11y/a11y-sr.component.d.ts.map +1 -1
  56. package/dist/app/panels/a11y/a11y-sr.component.js +60 -208
  57. package/dist/app/panels/a11y/a11y-tree.component.d.ts +2 -4
  58. package/dist/app/panels/a11y/a11y-tree.component.d.ts.map +1 -1
  59. package/dist/app/panels/a11y/a11y-tree.component.js +92 -137
  60. package/dist/app/panels/a11y/a11y-violations.component.d.ts +2 -6
  61. package/dist/app/panels/a11y/a11y-violations.component.d.ts.map +1 -1
  62. package/dist/app/panels/a11y/a11y-violations.component.js +126 -373
  63. package/dist/app/panels/controls/controls-plugin.d.ts.map +1 -1
  64. package/dist/app/panels/controls/controls-plugin.js +1 -0
  65. package/dist/app/panels/controls/prism-controls-panel.component.d.ts.map +1 -1
  66. package/dist/app/panels/controls/prism-controls-panel.component.js +96 -88
  67. package/dist/app/panels/events/events-plugin.d.ts.map +1 -1
  68. package/dist/app/panels/events/events-plugin.js +1 -0
  69. package/dist/app/panels/events/prism-events-panel.component.d.ts +1 -0
  70. package/dist/app/panels/events/prism-events-panel.component.d.ts.map +1 -1
  71. package/dist/app/panels/events/prism-events-panel.component.js +44 -46
  72. package/dist/app/panels/panel-host/prism-panel-host.component.d.ts +7 -2
  73. package/dist/app/panels/panel-host/prism-panel-host.component.d.ts.map +1 -1
  74. package/dist/app/panels/panel-host/prism-panel-host.component.js +102 -42
  75. package/dist/app/renderer/prism-renderer.component.d.ts +5 -6
  76. package/dist/app/renderer/prism-renderer.component.d.ts.map +1 -1
  77. package/dist/app/renderer/prism-renderer.component.js +84 -150
  78. package/dist/app/services/prism-canvas.service.d.ts +18 -0
  79. package/dist/app/services/prism-canvas.service.d.ts.map +1 -0
  80. package/dist/app/services/prism-canvas.service.js +63 -0
  81. package/dist/app/services/prism-theme.service.d.ts +13 -1
  82. package/dist/app/services/prism-theme.service.d.ts.map +1 -1
  83. package/dist/app/services/prism-theme.service.js +56 -9
  84. package/dist/app/shell/prism-shell.component.d.ts +1 -2
  85. package/dist/app/shell/prism-shell.component.d.ts.map +1 -1
  86. package/dist/app/shell/prism-shell.component.js +189 -178
  87. package/dist/app/sidebar/prism-sidebar.component.d.ts +16 -10
  88. package/dist/app/sidebar/prism-sidebar.component.d.ts.map +1 -1
  89. package/dist/app/sidebar/prism-sidebar.component.js +318 -204
  90. package/dist/app/theme/prism-default-theme.d.ts +1 -0
  91. package/dist/app/theme/prism-default-theme.d.ts.map +1 -1
  92. package/dist/app/theme/prism-default-theme.js +53 -34
  93. package/dist/app/variant-ribbon/prism-variant-ribbon.component.d.ts +13 -0
  94. package/dist/app/variant-ribbon/prism-variant-ribbon.component.d.ts.map +1 -0
  95. package/dist/app/variant-ribbon/prism-variant-ribbon.component.js +134 -0
  96. package/dist/app/view-tab-bar/prism-view-tab-bar.component.d.ts.map +1 -1
  97. package/dist/app/view-tab-bar/prism-view-tab-bar.component.js +15 -11
  98. package/dist/decorator/showcase.decorator.d.ts +1 -3
  99. package/dist/decorator/showcase.decorator.d.ts.map +1 -1
  100. package/dist/decorator/showcase.decorator.js +2 -6
  101. package/dist/plugin/plugin.types.d.ts +1 -0
  102. package/dist/plugin/plugin.types.d.ts.map +1 -1
  103. package/dist/schematics/ng-add/index.d.ts.map +1 -1
  104. package/dist/schematics/ng-add/index.js +2 -1
  105. package/package.json +6 -6
@@ -1,8 +1,8 @@
1
1
  import { NgComponentOutlet } from '@angular/common';
2
- import { Component, computed, createEnvironmentInjector, effect, EnvironmentInjector, inject, signal } from '@angular/core';
2
+ import { Component, computed, createEnvironmentInjector, effect, EnvironmentInjector, inject, signal, ChangeDetectionStrategy, } from '@angular/core';
3
+ import { PrismIconComponent } from '../../icons/prism-icon.component.js';
3
4
  import { BUILTIN_PANELS } from '../builtin-panels.js';
4
5
  import { A11yAuditService } from '../a11y/a11y-audit.service.js';
5
- import { A11yScoreComponent } from '../a11y/a11y-score.component.js';
6
6
  import { PrismNavigationService } from '../../services/prism-navigation.service.js';
7
7
  import { PrismPanelService } from '../../services/prism-panel.service.js';
8
8
  import { PrismPluginService } from '../../services/prism-plugin.service.js';
@@ -10,41 +10,47 @@ import { PrismRendererService } from '../../services/prism-renderer.service.js';
10
10
  import * as i0 from "@angular/core";
11
11
  const _forTrack0 = ($index, $item) => $item.id;
12
12
  function PrismPanelHostComponent_For_3_Conditional_1_Template(rf, ctx) { if (rf & 1) {
13
- i0.ɵɵelement(0, "prism-a11y-score", 5);
13
+ i0.ɵɵelement(0, "prism-icon", 5);
14
14
  } if (rf & 2) {
15
- const ctx_r2 = i0.ɵɵnextContext(2);
16
- i0.ɵɵproperty("score", ctx_r2.a11yScore())("compact", true);
15
+ const panel_r2 = i0.ɵɵnextContext().$implicit;
16
+ i0.ɵɵproperty("name", panel_r2.icon)("size", 13);
17
17
  } }
18
- function PrismPanelHostComponent_For_3_Conditional_2_Template(rf, ctx) { if (rf & 1) {
19
- i0.ɵɵelement(0, "prism-a11y-score", 5);
18
+ function PrismPanelHostComponent_For_3_Conditional_3_Template(rf, ctx) { if (rf & 1) {
19
+ i0.ɵɵelementStart(0, "span", 7);
20
+ i0.ɵɵtext(1);
21
+ i0.ɵɵelementEnd();
20
22
  } if (rf & 2) {
21
- const ctx_r2 = i0.ɵɵnextContext(2);
22
- i0.ɵɵproperty("score", ctx_r2.coverageScore())("compact", true);
23
+ const badge_r4 = ctx;
24
+ i0.ɵɵclassProp("ok", badge_r4.variant === "ok")("warn", badge_r4.variant === "warn")("danger", badge_r4.variant === "danger");
25
+ i0.ɵɵadvance();
26
+ i0.ɵɵtextInterpolate(badge_r4.text);
23
27
  } }
24
28
  function PrismPanelHostComponent_For_3_Template(rf, ctx) { if (rf & 1) {
25
29
  const _r1 = i0.ɵɵgetCurrentView();
26
30
  i0.ɵɵelementStart(0, "button", 4);
27
31
  i0.ɵɵlistener("click", function PrismPanelHostComponent_For_3_Template_button_click_0_listener() { const panel_r2 = i0.ɵɵrestoreView(_r1).$implicit; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.panelService.activePanelId.set(panel_r2.id)); });
28
- i0.ɵɵconditionalCreate(1, PrismPanelHostComponent_For_3_Conditional_1_Template, 1, 2, "prism-a11y-score", 5);
29
- i0.ɵɵconditionalCreate(2, PrismPanelHostComponent_For_3_Conditional_2_Template, 1, 2, "prism-a11y-score", 5);
30
- i0.ɵɵtext(3);
32
+ i0.ɵɵconditionalCreate(1, PrismPanelHostComponent_For_3_Conditional_1_Template, 1, 2, "prism-icon", 5);
33
+ i0.ɵɵtext(2);
34
+ i0.ɵɵconditionalCreate(3, PrismPanelHostComponent_For_3_Conditional_3_Template, 2, 7, "span", 6);
31
35
  i0.ɵɵelementEnd();
32
36
  } if (rf & 2) {
37
+ let tmp_15_0;
33
38
  const panel_r2 = ctx.$implicit;
34
39
  const ctx_r2 = i0.ɵɵnextContext();
35
- i0.ɵɵclassProp("prism-panel-host__tab--active", ctx_r2.panelService.activePanelId() === panel_r2.id);
40
+ i0.ɵɵclassProp("p-tab--active", ctx_r2.panelService.activePanelId() === panel_r2.id);
41
+ i0.ɵɵattribute("aria-selected", ctx_r2.panelService.activePanelId() === panel_r2.id)("aria-controls", ctx_r2.panelService.activePanelId() === panel_r2.id ? "panel-" + panel_r2.id : null);
36
42
  i0.ɵɵadvance();
37
- i0.ɵɵconditional(panel_r2.id === "a11y" && ctx_r2.a11yScore() !== null ? 1 : -1);
38
- i0.ɵɵadvance();
39
- i0.ɵɵconditional(panel_r2.id === "coverage" && ctx_r2.coverageScore() !== null ? 2 : -1);
43
+ i0.ɵɵconditional(panel_r2.icon ? 1 : -1);
40
44
  i0.ɵɵadvance();
41
45
  i0.ɵɵtextInterpolate1(" ", panel_r2.label, " ");
46
+ i0.ɵɵadvance();
47
+ i0.ɵɵconditional((tmp_15_0 = ctx_r2.panelBadge(panel_r2.id)) ? 3 : -1, tmp_15_0);
42
48
  } }
43
49
  function PrismPanelHostComponent_Conditional_5_ng_container_0_Template(rf, ctx) { if (rf & 1) {
44
50
  i0.ɵɵelementContainer(0);
45
51
  } }
46
52
  function PrismPanelHostComponent_Conditional_5_Template(rf, ctx) { if (rf & 1) {
47
- i0.ɵɵtemplate(0, PrismPanelHostComponent_Conditional_5_ng_container_0_Template, 1, 0, "ng-container", 6);
53
+ i0.ɵɵtemplate(0, PrismPanelHostComponent_Conditional_5_ng_container_0_Template, 1, 0, "ng-container", 8);
48
54
  } if (rf & 2) {
49
55
  const ctx_r2 = i0.ɵɵnextContext();
50
56
  i0.ɵɵproperty("ngComponentOutlet", ctx_r2.resolvedComponent())("ngComponentOutletInputs", ctx_r2.panelInputs())("ngComponentOutletInjector", ctx_r2.activeInjector());
@@ -64,6 +70,35 @@ export class PrismPanelHostComponent {
64
70
  return null;
65
71
  return coverage.score;
66
72
  }, ...(ngDevMode ? [{ debugName: "coverageScore" }] : []));
73
+ inputCount = computed(() => {
74
+ const comp = this.nav.activeComponent();
75
+ return comp?.meta.inputs.length ?? 0;
76
+ }, ...(ngDevMode ? [{ debugName: "inputCount" }] : []));
77
+ panelBadge(panelId) {
78
+ if (panelId === 'controls') {
79
+ const count = this.inputCount();
80
+ return count > 0 ? { text: String(count), variant: 'default' } : null;
81
+ }
82
+ if (panelId === 'a11y') {
83
+ const score = this.a11yScore();
84
+ if (score === null)
85
+ return null;
86
+ return {
87
+ text: String(score),
88
+ variant: score >= 90 ? 'ok' : score >= 70 ? 'warn' : 'danger',
89
+ };
90
+ }
91
+ if (panelId === 'coverage') {
92
+ const score = this.coverageScore();
93
+ if (score === null)
94
+ return null;
95
+ return {
96
+ text: String(score),
97
+ variant: score >= 90 ? 'ok' : score >= 70 ? 'warn' : 'danger',
98
+ };
99
+ }
100
+ return null;
101
+ }
67
102
  builtInPanels = BUILTIN_PANELS;
68
103
  allPanels = computed(() => {
69
104
  const comp = this.nav.activeComponent();
@@ -140,9 +175,9 @@ export class PrismPanelHostComponent {
140
175
  this.injectorCache.forEach((injector) => injector.destroy());
141
176
  }
142
177
  static ɵfac = function PrismPanelHostComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || PrismPanelHostComponent)(); };
143
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: PrismPanelHostComponent, selectors: [["prism-panel-host"]], decls: 6, vars: 1, consts: [[1, "prism-panel-host"], [1, "prism-panel-host__tabs"], [1, "prism-panel-host__tab", 3, "prism-panel-host__tab--active"], [1, "prism-panel-host__content"], [1, "prism-panel-host__tab", 3, "click"], [2, "width", "18px", "height", "18px", 3, "score", "compact"], [4, "ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector"]], template: function PrismPanelHostComponent_Template(rf, ctx) { if (rf & 1) {
144
- i0.ɵɵelementStart(0, "div", 0)(1, "div", 1);
145
- i0.ɵɵrepeaterCreate(2, PrismPanelHostComponent_For_3_Template, 4, 5, "button", 2, _forTrack0);
178
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: PrismPanelHostComponent, selectors: [["prism-panel-host"]], decls: 6, vars: 2, consts: [[1, "panel"], ["role", "tablist", 1, "panel-tabs"], ["role", "tab", 1, "p-tab", 3, "p-tab--active"], ["role", "tabpanel", 1, "panel-body", 3, "id"], ["role", "tab", 1, "p-tab", 3, "click"], [3, "name", "size"], [1, "p-tab-badge", 3, "ok", "warn", "danger"], [1, "p-tab-badge"], [4, "ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector"]], template: function PrismPanelHostComponent_Template(rf, ctx) { if (rf & 1) {
179
+ i0.ɵɵelementStart(0, "div", 0)(1, "nav", 1);
180
+ i0.ɵɵrepeaterCreate(2, PrismPanelHostComponent_For_3_Template, 4, 7, "button", 2, _forTrack0);
146
181
  i0.ɵɵelementEnd();
147
182
  i0.ɵɵelementStart(4, "div", 3);
148
183
  i0.ɵɵconditionalCreate(5, PrismPanelHostComponent_Conditional_5_Template, 1, 3, "ng-container");
@@ -150,37 +185,62 @@ export class PrismPanelHostComponent {
150
185
  } if (rf & 2) {
151
186
  i0.ɵɵadvance(2);
152
187
  i0.ɵɵrepeater(ctx.allPanels());
153
- i0.ɵɵadvance(3);
188
+ i0.ɵɵadvance(2);
189
+ i0.ɵɵproperty("id", "panel-" + ctx.panelService.activePanelId());
190
+ i0.ɵɵadvance();
154
191
  i0.ɵɵconditional(ctx.resolvedComponent() ? 5 : -1);
155
- } }, dependencies: [NgComponentOutlet, A11yScoreComponent], styles: [".prism-panel-host[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--prism-bg-elevated);\n }\n\n .prism-panel-host__tabs[_ngcontent-%COMP%] {\n display: flex;\n border-bottom: 1px solid var(--prism-border);\n padding: 0 8px;\n flex-shrink: 0;\n background: var(--prism-bg-elevated);\n }\n\n .prism-panel-host__tab[_ngcontent-%COMP%] {\n padding: 9px 14px;\n font-size: 13px;\n font-family: var(--prism-font-sans);\n border: none;\n background: none;\n color: var(--prism-text-muted);\n cursor: pointer;\n position: relative;\n margin-bottom: -1px;\n transition: color 0.12s;\n }\n\n .prism-panel-host__tab[_ngcontent-%COMP%]::after {\n content: '';\n position: absolute;\n bottom: 0;\n left: 8px;\n right: 8px;\n height: 2px;\n background: linear-gradient(90deg, var(--prism-primary-from), var(--prism-primary-to));\n opacity: 0;\n transition: opacity 0.12s;\n }\n\n .prism-panel-host__tab[_ngcontent-%COMP%]:hover { color: var(--prism-text-2); }\n\n .prism-panel-host__tab--active[_ngcontent-%COMP%] { color: var(--prism-primary); font-weight: 500; }\n\n .prism-panel-host__tab--active[_ngcontent-%COMP%]::after { opacity: 1; }\n\n .prism-panel-host__tab[_ngcontent-%COMP%] { display: flex; align-items: center; gap: 6px; }\n\n .prism-panel-host__content[_ngcontent-%COMP%] {\n flex: 1;\n overflow: auto;\n }"] });
192
+ } }, dependencies: [NgComponentOutlet, PrismIconComponent], styles: [".panel[_ngcontent-%COMP%] {\n background: var(--prism-bg-elevated);\n border-top: 1px solid var(--prism-border);\n display: flex;\n flex-direction: column;\n min-height: 0;\n overflow: hidden;\n height: 100%;\n }\n\n .panel-tabs[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 2px;\n padding: 0 16px;\n height: 40px;\n border-bottom: 1px solid var(--prism-border);\n background: var(--prism-bg);\n overflow-x: auto;\n scrollbar-width: none;\n flex-shrink: 0;\n }\n .panel-tabs[_ngcontent-%COMP%]::-webkit-scrollbar { display: none; }\n\n .p-tab[_ngcontent-%COMP%] {\n position: relative;\n height: 100%;\n display: flex;\n align-items: center;\n gap: 7px;\n padding: 0 12px;\n font-size: var(--fs-md);\n font-weight: 500;\n color: var(--prism-text-muted);\n white-space: nowrap;\n transition: color var(--dur-fast);\n background: none;\n border: none;\n cursor: pointer;\n font-family: var(--font-sans);\n }\n .p-tab[_ngcontent-%COMP%]:hover { color: var(--prism-text-2); }\n .p-tab--active[_ngcontent-%COMP%] { color: var(--prism-text); }\n .p-tab--active[_ngcontent-%COMP%]::after {\n content: '';\n position: absolute;\n left: 8px;\n right: 8px;\n bottom: -1px;\n height: 2px;\n background: linear-gradient(90deg, var(--prism-primary-from), var(--prism-primary-to));\n border-radius: 1px;\n }\n\n .p-tab-badge[_ngcontent-%COMP%] {\n min-width: 16px;\n height: 16px;\n padding: 0 5px;\n border-radius: 8px;\n background: color-mix(in srgb, var(--prism-primary) 18%, transparent);\n color: var(--prism-primary);\n font-family: var(--font-mono);\n font-size: 10px;\n font-weight: 700;\n display: grid;\n place-items: center;\n }\n .p-tab-badge.ok[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--prism-success) 18%, transparent);\n color: var(--prism-success);\n }\n .p-tab-badge.warn[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--prism-warn) 18%, transparent);\n color: var(--prism-warn);\n }\n .p-tab-badge.danger[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--prism-danger) 18%, transparent);\n color: var(--prism-danger);\n }\n\n .panel-tabs-right[_ngcontent-%COMP%] {\n margin-left: auto;\n display: flex;\n align-items: center;\n gap: 4px;\n padding-left: 10px;\n }\n\n .icon-btn[_ngcontent-%COMP%] {\n width: 28px;\n height: 28px;\n display: grid;\n place-items: center;\n border-radius: var(--radius-sm);\n color: var(--prism-text-muted);\n background: none;\n border: none;\n cursor: pointer;\n transition: all var(--dur-fast);\n }\n .icon-btn[_ngcontent-%COMP%]:hover {\n background: var(--prism-input-bg);\n color: var(--prism-text);\n }\n\n .panel-body[_ngcontent-%COMP%] {\n flex: 1;\n min-height: 0;\n overflow: auto;\n background: var(--prism-bg-elevated);\n }\n .panel-body[_ngcontent-%COMP%]::-webkit-scrollbar { width: 8px; height: 8px; }\n .panel-body[_ngcontent-%COMP%]::-webkit-scrollbar-thumb { background: var(--prism-border-strong); border-radius: 4px; }\n\n [_ngcontent-%COMP%]:focus-visible {\n outline: 2px solid var(--prism-primary);\n outline-offset: 2px;\n }"], changeDetection: 0 });
156
193
  }
157
194
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(PrismPanelHostComponent, [{
158
195
  type: Component,
159
- args: [{ selector: 'prism-panel-host', standalone: true, imports: [NgComponentOutlet, A11yScoreComponent], template: `
160
- <div class="prism-panel-host">
161
- <div class="prism-panel-host__tabs">
196
+ args: [{ selector: 'prism-panel-host', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [NgComponentOutlet, PrismIconComponent], template: `
197
+ <div class="panel">
198
+ <nav class="panel-tabs" role="tablist">
162
199
  @for (panel of allPanels(); track panel.id) {
163
- <button
164
- class="prism-panel-host__tab"
165
- [class.prism-panel-host__tab--active]="panelService.activePanelId() === panel.id"
166
- (click)="panelService.activePanelId.set(panel.id)"
200
+ <button
201
+ class="p-tab"
202
+ [class.p-tab--active]="panelService.activePanelId() === panel.id"
203
+ (click)="panelService.activePanelId.set(panel.id)"
204
+ role="tab"
205
+ [attr.aria-selected]="panelService.activePanelId() === panel.id"
206
+ [attr.aria-controls]="
207
+ panelService.activePanelId() === panel.id
208
+ ? 'panel-' + panel.id
209
+ : null
210
+ "
211
+ >
212
+ @if (panel.icon) {
213
+ <prism-icon [name]="panel.icon" [size]="13" />
214
+ }
215
+ {{ panel.label }}
216
+ @if (panelBadge(panel.id); as badge) {
217
+ <span
218
+ class="p-tab-badge"
219
+ [class.ok]="badge.variant === 'ok'"
220
+ [class.warn]="badge.variant === 'warn'"
221
+ [class.danger]="badge.variant === 'danger'"
222
+ >{{ badge.text }}</span
167
223
  >
168
- @if (panel.id === 'a11y' && a11yScore() !== null) {
169
- <prism-a11y-score [score]="a11yScore()!" [compact]="true" style="width:18px;height:18px;" />
170
- }
171
- @if (panel.id === 'coverage' && coverageScore() !== null) {
172
- <prism-a11y-score [score]="coverageScore()!" [compact]="true" style="width:18px;height:18px;" />
173
- }
174
- {{ panel.label }}
175
- </button>
224
+ }
225
+ </button>
176
226
  }
177
- </div>
178
- <div class="prism-panel-host__content">
227
+ </nav>
228
+ <div
229
+ class="panel-body"
230
+ [id]="'panel-' + panelService.activePanelId()"
231
+ role="tabpanel"
232
+ >
179
233
  @if (resolvedComponent()) {
180
- <ng-container *ngComponentOutlet="resolvedComponent(); inputs: panelInputs(); injector: activeInjector()" />
234
+ <ng-container
235
+ *ngComponentOutlet="
236
+ resolvedComponent();
237
+ inputs: panelInputs();
238
+ injector: activeInjector()
239
+ "
240
+ />
181
241
  }
182
242
  </div>
183
243
  </div>
184
- `, styles: ["\n .prism-panel-host {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--prism-bg-elevated);\n }\n\n .prism-panel-host__tabs {\n display: flex;\n border-bottom: 1px solid var(--prism-border);\n padding: 0 8px;\n flex-shrink: 0;\n background: var(--prism-bg-elevated);\n }\n\n .prism-panel-host__tab {\n padding: 9px 14px;\n font-size: 13px;\n font-family: var(--prism-font-sans);\n border: none;\n background: none;\n color: var(--prism-text-muted);\n cursor: pointer;\n position: relative;\n margin-bottom: -1px;\n transition: color 0.12s;\n }\n\n .prism-panel-host__tab::after {\n content: '';\n position: absolute;\n bottom: 0;\n left: 8px;\n right: 8px;\n height: 2px;\n background: linear-gradient(90deg, var(--prism-primary-from), var(--prism-primary-to));\n opacity: 0;\n transition: opacity 0.12s;\n }\n\n .prism-panel-host__tab:hover { color: var(--prism-text-2); }\n\n .prism-panel-host__tab--active { color: var(--prism-primary); font-weight: 500; }\n\n .prism-panel-host__tab--active::after { opacity: 1; }\n\n .prism-panel-host__tab { display: flex; align-items: center; gap: 6px; }\n\n .prism-panel-host__content {\n flex: 1;\n overflow: auto;\n }\n "] }]
244
+ `, styles: ["\n .panel {\n background: var(--prism-bg-elevated);\n border-top: 1px solid var(--prism-border);\n display: flex;\n flex-direction: column;\n min-height: 0;\n overflow: hidden;\n height: 100%;\n }\n\n .panel-tabs {\n display: flex;\n align-items: center;\n gap: 2px;\n padding: 0 16px;\n height: 40px;\n border-bottom: 1px solid var(--prism-border);\n background: var(--prism-bg);\n overflow-x: auto;\n scrollbar-width: none;\n flex-shrink: 0;\n }\n .panel-tabs::-webkit-scrollbar { display: none; }\n\n .p-tab {\n position: relative;\n height: 100%;\n display: flex;\n align-items: center;\n gap: 7px;\n padding: 0 12px;\n font-size: var(--fs-md);\n font-weight: 500;\n color: var(--prism-text-muted);\n white-space: nowrap;\n transition: color var(--dur-fast);\n background: none;\n border: none;\n cursor: pointer;\n font-family: var(--font-sans);\n }\n .p-tab:hover { color: var(--prism-text-2); }\n .p-tab--active { color: var(--prism-text); }\n .p-tab--active::after {\n content: '';\n position: absolute;\n left: 8px;\n right: 8px;\n bottom: -1px;\n height: 2px;\n background: linear-gradient(90deg, var(--prism-primary-from), var(--prism-primary-to));\n border-radius: 1px;\n }\n\n .p-tab-badge {\n min-width: 16px;\n height: 16px;\n padding: 0 5px;\n border-radius: 8px;\n background: color-mix(in srgb, var(--prism-primary) 18%, transparent);\n color: var(--prism-primary);\n font-family: var(--font-mono);\n font-size: 10px;\n font-weight: 700;\n display: grid;\n place-items: center;\n }\n .p-tab-badge.ok {\n background: color-mix(in srgb, var(--prism-success) 18%, transparent);\n color: var(--prism-success);\n }\n .p-tab-badge.warn {\n background: color-mix(in srgb, var(--prism-warn) 18%, transparent);\n color: var(--prism-warn);\n }\n .p-tab-badge.danger {\n background: color-mix(in srgb, var(--prism-danger) 18%, transparent);\n color: var(--prism-danger);\n }\n\n .panel-tabs-right {\n margin-left: auto;\n display: flex;\n align-items: center;\n gap: 4px;\n padding-left: 10px;\n }\n\n .icon-btn {\n width: 28px;\n height: 28px;\n display: grid;\n place-items: center;\n border-radius: var(--radius-sm);\n color: var(--prism-text-muted);\n background: none;\n border: none;\n cursor: pointer;\n transition: all var(--dur-fast);\n }\n .icon-btn:hover {\n background: var(--prism-input-bg);\n color: var(--prism-text);\n }\n\n .panel-body {\n flex: 1;\n min-height: 0;\n overflow: auto;\n background: var(--prism-bg-elevated);\n }\n .panel-body::-webkit-scrollbar { width: 8px; height: 8px; }\n .panel-body::-webkit-scrollbar-thumb { background: var(--prism-border-strong); border-radius: 4px; }\n\n :focus-visible {\n outline: 2px solid var(--prism-primary);\n outline-offset: 2px;\n }\n "] }]
185
245
  }], () => [], null); })();
186
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(PrismPanelHostComponent, { className: "PrismPanelHostComponent", filePath: "app/panels/panel-host/prism-panel-host.component.ts", lineNumber: 97 }); })();
246
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(PrismPanelHostComponent, { className: "PrismPanelHostComponent", filePath: "app/panels/panel-host/prism-panel-host.component.ts", lineNumber: 198 }); })();
@@ -1,33 +1,32 @@
1
1
  import { Injector, type Type } from '@angular/core';
2
- import { A11yPerspectiveService } from '../panels/a11y/a11y-perspective.service.js';
3
2
  import { PrismNavigationService } from '../services/prism-navigation.service.js';
4
3
  import { PrismRendererService } from '../services/prism-renderer.service.js';
4
+ import { PrismCanvasService } from '../services/prism-canvas.service.js';
5
5
  import * as i0 from "@angular/core";
6
6
  export declare class PrismRendererComponent {
7
+ protected readonly Math: Math;
7
8
  protected readonly navigationService: PrismNavigationService;
8
9
  protected readonly rendererService: PrismRendererService;
9
- protected readonly perspectiveService: A11yPerspectiveService;
10
+ protected readonly canvasService: PrismCanvasService;
10
11
  private readonly eventLogService;
11
12
  private readonly manifestService;
12
13
  private readonly injector;
13
14
  private readonly destroyRef;
14
15
  private readonly host;
15
16
  private readonly rendererHooks;
17
+ private readonly panelService;
18
+ private readonly pluginService;
16
19
  private readonly outlet;
17
20
  private componentRef;
18
21
  private outputSubscriptions;
19
22
  private lastProjectedContent;
20
23
  private isRenderPage;
21
- private readonly panelService;
22
- private readonly pluginService;
23
24
  private readonly overlayCache;
24
25
  readonly activeOverlay: import("@angular/core").WritableSignal<Type<unknown> | null>;
25
26
  protected readonly overlayInputs: {
26
27
  rendererService: PrismRendererService;
27
28
  };
28
29
  protected readonly overlayInjector: import("@angular/core").Signal<import("@angular/core").EnvironmentInjector | Injector>;
29
- readonly codeVisible: import("@angular/core").WritableSignal<boolean>;
30
- readonly snippet: import("@angular/core").Signal<string>;
31
30
  constructor();
32
31
  private createComponent;
33
32
  private cleanup;
@@ -1 +1 @@
1
- {"version":3,"file":"prism-renderer.component.d.ts","sourceRoot":"","sources":["../../../src/app/renderer/prism-renderer.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAQL,QAAQ,EAER,KAAK,IAAI,EAIV,MAAM,eAAe,CAAC;AAOvB,OAAO,EAAE,sBAAsB,EAAE,MAAM,4CAA4C,CAAC;AAIpF,OAAO,EAAE,sBAAsB,EAAE,MAAM,yCAAyC,CAAC;AAGjF,OAAO,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;;AAG7E,qBA4Ka,sBAAsB;IACjC,SAAS,CAAC,QAAQ,CAAC,iBAAiB,yBAAkC;IACtE,SAAS,CAAC,QAAQ,CAAC,eAAe,uBAAgC;IAClE,SAAS,CAAC,QAAQ,CAAC,kBAAkB,yBAAkC;IACvE,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAgC;IAChE,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAgC;IAChE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAoB;IAC7C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAsB;IACjD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAmC;IACxD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAoD;IAElF,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA4D;IACnF,OAAO,CAAC,YAAY,CAAsC;IAC1D,OAAO,CAAC,mBAAmB,CAAsC;IACjE,OAAO,CAAC,oBAAoB,CAA0D;IACtF,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA6B;IAC1D,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA8B;IAC5D,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAoC;IACjE,QAAQ,CAAC,aAAa,+DAAsC;IAC5D,SAAS,CAAC,QAAQ,CAAC,aAAa;;MAA6C;IAE7E,SAAS,CAAC,QAAQ,CAAC,eAAe,yFAG/B;IAEH,QAAQ,CAAC,WAAW,kDAAiB;IAErC,QAAQ,CAAC,OAAO,yCAgBb;;IAkFH,OAAO,CAAC,eAAe;IAiEvB,OAAO,CAAC,OAAO;yCAhMJ,sBAAsB;2CAAtB,sBAAsB;CA8MlC"}
1
+ {"version":3,"file":"prism-renderer.component.d.ts","sourceRoot":"","sources":["../../../src/app/renderer/prism-renderer.component.ts"],"names":[],"mappings":"AAAA,OAAO,EASL,QAAQ,EAER,KAAK,IAAI,EAIV,MAAM,eAAe,CAAC;AAYvB,OAAO,EAAE,sBAAsB,EAAE,MAAM,yCAAyC,CAAC;AAGjF,OAAO,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAC7E,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;;AAGzE,qBAmHa,sBAAsB;IACjC,SAAS,CAAC,QAAQ,CAAC,IAAI,OAAQ;IAC/B,SAAS,CAAC,QAAQ,CAAC,iBAAiB,yBAAkC;IACtE,SAAS,CAAC,QAAQ,CAAC,eAAe,uBAAgC;IAClE,SAAS,CAAC,QAAQ,CAAC,aAAa,qBAA8B;IAC9D,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAgC;IAChE,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAgC;IAChE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAoB;IAC7C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAsB;IACjD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAmC;IACxD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAE3B;IAEH,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA6B;IAC1D,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA8B;IAE5D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAEpB;IACH,OAAO,CAAC,YAAY,CAAsC;IAC1D,OAAO,CAAC,mBAAmB,CAAsC;IACjE,OAAO,CAAC,oBAAoB,CAChB;IACZ,OAAO,CAAC,YAAY,CAAS;IAE7B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAoC;IACjE,QAAQ,CAAC,aAAa,+DAAsC;IAC5D,SAAS,CAAC,QAAQ,CAAC,aAAa;;MAA6C;IAC7E,SAAS,CAAC,QAAQ,CAAC,eAAe,yFAG/B;;IAuFH,OAAO,CAAC,eAAe;IA6FvB,OAAO,CAAC,OAAO;yCApNJ,sBAAsB;2CAAtB,sBAAsB;CAkOlC"}