@ng-prism/core 22.2.0-beta.3 → 22.2.0-beta.5

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 (125) hide show
  1. package/dist/app/canvas/prism-canvas-bg-pill.component.js +1 -1
  2. package/dist/app/canvas/prism-canvas-rulers.component.js +1 -1
  3. package/dist/app/canvas/prism-canvas-toolbar.component.d.ts +24 -8
  4. package/dist/app/canvas/prism-canvas-toolbar.component.d.ts.map +1 -1
  5. package/dist/app/canvas/prism-canvas-toolbar.component.js +41 -24
  6. package/dist/app/canvas/prism-template-popover.component.js +1 -1
  7. package/dist/app/component-head/prism-component-head.component.d.ts +12 -0
  8. package/dist/app/component-head/prism-component-head.component.d.ts.map +1 -1
  9. package/dist/app/component-head/prism-component-head.component.js +46 -11
  10. package/dist/app/component-head/prism-stat.component.d.ts +1 -1
  11. package/dist/app/component-head/prism-stat.component.d.ts.map +1 -1
  12. package/dist/app/component-head/prism-stat.component.js +12 -9
  13. package/dist/app/component-header/prism-component-header.component.js +1 -1
  14. package/dist/app/controls/boolean-control.component.js +1 -1
  15. package/dist/app/controls/json-control.component.js +1 -1
  16. package/dist/app/controls/number-control.component.js +1 -1
  17. package/dist/app/controls/string-control.component.js +1 -1
  18. package/dist/app/controls/union-control.component.js +1 -1
  19. package/dist/app/header/prism-header.component.js +1 -1
  20. package/dist/app/icons/icon-registry.d.ts +15 -0
  21. package/dist/app/icons/icon-registry.d.ts.map +1 -0
  22. package/dist/app/icons/icon-registry.js +42 -0
  23. package/dist/app/icons/prism-icon.component.d.ts +2 -2
  24. package/dist/app/icons/prism-icon.component.d.ts.map +1 -1
  25. package/dist/app/icons/prism-icon.component.js +7 -32
  26. package/dist/app/layout-menu/prism-layout-menu.component.js +1 -1
  27. package/dist/app/page-renderer/prism-page-renderer.component.js +1 -1
  28. package/dist/app/panels/a11y/a11y-audit.service.d.ts +1 -1
  29. package/dist/app/panels/a11y/a11y-audit.service.d.ts.map +1 -1
  30. package/dist/app/panels/a11y/a11y-header-badge.component.js +1 -1
  31. package/dist/app/panels/a11y/a11y-keyboard-overlay.component.js +1 -1
  32. package/dist/app/panels/a11y/a11y-keyboard.component.js +1 -1
  33. package/dist/app/panels/a11y/a11y-keyboard.service.d.ts +1 -1
  34. package/dist/app/panels/a11y/a11y-keyboard.service.d.ts.map +1 -1
  35. package/dist/app/panels/a11y/a11y-overlay-host.component.js +1 -1
  36. package/dist/app/panels/a11y/a11y-panel-state.service.d.ts +1 -1
  37. package/dist/app/panels/a11y/a11y-panel-state.service.d.ts.map +1 -1
  38. package/dist/app/panels/a11y/a11y-panel.component.js +1 -1
  39. package/dist/app/panels/a11y/a11y-perspective.service.d.ts +1 -1
  40. package/dist/app/panels/a11y/a11y-perspective.service.d.ts.map +1 -1
  41. package/dist/app/panels/a11y/a11y-score.component.js +1 -1
  42. package/dist/app/panels/a11y/a11y-sr-overlay.component.js +1 -1
  43. package/dist/app/panels/a11y/a11y-sr.component.js +1 -1
  44. package/dist/app/panels/a11y/a11y-sr.service.d.ts +1 -1
  45. package/dist/app/panels/a11y/a11y-sr.service.d.ts.map +1 -1
  46. package/dist/app/panels/a11y/a11y-summary.d.ts +15 -0
  47. package/dist/app/panels/a11y/a11y-summary.d.ts.map +1 -0
  48. package/dist/app/panels/a11y/a11y-summary.js +33 -0
  49. package/dist/app/panels/a11y/a11y-tree.component.js +2 -2
  50. package/dist/app/panels/a11y/a11y-tree.service.d.ts +1 -1
  51. package/dist/app/panels/a11y/a11y-tree.service.d.ts.map +1 -1
  52. package/dist/app/panels/a11y/a11y-violations.component.js +3 -3
  53. package/dist/app/panels/a11y/a11y.types.d.ts +14 -0
  54. package/dist/app/panels/a11y/a11y.types.d.ts.map +1 -1
  55. package/dist/app/panels/builtin-navigation-decorations.d.ts +8 -0
  56. package/dist/app/panels/builtin-navigation-decorations.d.ts.map +1 -0
  57. package/dist/app/panels/builtin-navigation-decorations.js +20 -0
  58. package/dist/app/panels/controls/prism-controls-panel.component.js +1 -1
  59. package/dist/app/panels/events/prism-events-panel.component.js +1 -1
  60. package/dist/app/panels/events/prism-json-node.component.js +1 -1
  61. package/dist/app/panels/panel-host/panel-badge.d.ts +35 -0
  62. package/dist/app/panels/panel-host/panel-badge.d.ts.map +1 -0
  63. package/dist/app/panels/panel-host/panel-badge.js +37 -0
  64. package/dist/app/panels/panel-host/prism-panel-host.component.d.ts +9 -6
  65. package/dist/app/panels/panel-host/prism-panel-host.component.d.ts.map +1 -1
  66. package/dist/app/panels/panel-host/prism-panel-host.component.js +27 -37
  67. package/dist/app/renderer/overlay-resolver.d.ts.map +1 -1
  68. package/dist/app/renderer/overlay-resolver.js +12 -1
  69. package/dist/app/renderer/prism-renderer.component.js +3 -5
  70. package/dist/app/services/prism-canvas.service.d.ts +1 -1
  71. package/dist/app/services/prism-canvas.service.d.ts.map +1 -1
  72. package/dist/app/services/prism-capture.service.d.ts +17 -3
  73. package/dist/app/services/prism-capture.service.d.ts.map +1 -1
  74. package/dist/app/services/prism-capture.service.js +96 -3
  75. package/dist/app/services/prism-event-log.service.d.ts +1 -1
  76. package/dist/app/services/prism-event-log.service.d.ts.map +1 -1
  77. package/dist/app/services/prism-layout.service.d.ts +1 -1
  78. package/dist/app/services/prism-layout.service.d.ts.map +1 -1
  79. package/dist/app/services/prism-manifest.service.d.ts +1 -1
  80. package/dist/app/services/prism-manifest.service.d.ts.map +1 -1
  81. package/dist/app/services/prism-navigation.service.d.ts +1 -1
  82. package/dist/app/services/prism-navigation.service.d.ts.map +1 -1
  83. package/dist/app/services/prism-panel.service.d.ts +1 -1
  84. package/dist/app/services/prism-panel.service.d.ts.map +1 -1
  85. package/dist/app/services/prism-persistence.service.d.ts +1 -1
  86. package/dist/app/services/prism-persistence.service.d.ts.map +1 -1
  87. package/dist/app/services/prism-plugin.service.d.ts +8 -2
  88. package/dist/app/services/prism-plugin.service.d.ts.map +1 -1
  89. package/dist/app/services/prism-plugin.service.js +15 -0
  90. package/dist/app/services/prism-renderer.service.d.ts +1 -1
  91. package/dist/app/services/prism-renderer.service.d.ts.map +1 -1
  92. package/dist/app/services/prism-search.service.d.ts +1 -1
  93. package/dist/app/services/prism-search.service.d.ts.map +1 -1
  94. package/dist/app/services/prism-theme.service.d.ts +1 -1
  95. package/dist/app/services/prism-theme.service.d.ts.map +1 -1
  96. package/dist/app/services/prism-url-state.service.d.ts +1 -1
  97. package/dist/app/services/prism-url-state.service.d.ts.map +1 -1
  98. package/dist/app/services/prism-variant-bg.service.d.ts +1 -1
  99. package/dist/app/services/prism-variant-bg.service.d.ts.map +1 -1
  100. package/dist/app/shell/prism-shell.component.js +2 -2
  101. package/dist/app/sidebar/navigation-decorations.d.ts +67 -0
  102. package/dist/app/sidebar/navigation-decorations.d.ts.map +1 -0
  103. package/dist/app/sidebar/navigation-decorations.js +84 -0
  104. package/dist/app/sidebar/prism-sidebar.component.d.ts +23 -6
  105. package/dist/app/sidebar/prism-sidebar.component.d.ts.map +1 -1
  106. package/dist/app/sidebar/prism-sidebar.component.js +120 -45
  107. package/dist/app/variant-ribbon/prism-variant-ribbon.component.js +3 -3
  108. package/dist/app/view-tab-bar/prism-view-panel-host.component.js +1 -1
  109. package/dist/app/view-tab-bar/prism-view-tab-bar.component.js +1 -1
  110. package/dist/builder/a11y/a11y-report-reader.d.ts +15 -1
  111. package/dist/builder/a11y/a11y-report-reader.d.ts.map +1 -1
  112. package/dist/builder/a11y/a11y-report-reader.js +37 -0
  113. package/dist/builder/scanner/component.scanner.d.ts.map +1 -1
  114. package/dist/builder/scanner/component.scanner.js +30 -3
  115. package/dist/builder/shared/prism-pipeline.d.ts.map +1 -1
  116. package/dist/builder/shared/prism-pipeline.js +19 -2
  117. package/dist/plugin/index.d.ts +2 -1
  118. package/dist/plugin/index.d.ts.map +1 -1
  119. package/dist/plugin/index.js +10 -0
  120. package/dist/plugin/plugin.types.d.ts +52 -0
  121. package/dist/plugin/plugin.types.d.ts.map +1 -1
  122. package/dist/shared/canvas-bg.type.d.ts +24 -6
  123. package/dist/shared/canvas-bg.type.d.ts.map +1 -1
  124. package/dist/shared/canvas-bg.type.js +6 -5
  125. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"prism-sidebar.component.d.ts","sourceRoot":"","sources":["../../../src/app/sidebar/prism-sidebar.component.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AAC3E,OAAO,EAAE,sBAAsB,EAAE,MAAM,yCAAyC,CAAC;AACjF,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AACzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;;AAiCzE,UAAU,eAAe;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,cAAc,EAAE,CAAC;CACzB;AAED,qBA0Ta,qBAAqB;IAChC,SAAS,CAAC,QAAQ,CAAC,iBAAiB,yBAAkC;IACtE,SAAS,CAAC,QAAQ,CAAC,aAAa,qBAA8B;IAC9D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAC6B;IAGzD,SAAS,CAAC,WAAW,CAAC,CAAC,EAAE,aAAa,GAAG,IAAI;IAa7C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA6C;IAE1E,SAAS,CAAC,QAAQ,CAAC,UAAU,yCAE1B;IAEH,SAAS,CAAC,QAAQ,CAAC,cAAc,oDAc9B;IAEH,SAAS,CAAC,QAAQ,CAAC,iBAAiB;;;;;;;;;;SAYjC;IAEH,SAAS,CAAC,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAI3C,SAAS,CAAC,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAU3C,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM;IAM/C,SAAS,CAAC,SAAS,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM;IAMjD,SAAS,CAAC,UAAU,CAAC,IAAI,EAAE,cAAc,GAAG,eAAe,GAAG,SAAS;IAMvE,SAAS,CAAC,WAAW,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM,GAAG,IAAI;IAO1D,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO;IAWjD,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI;IAQ9C,OAAO,CAAC,aAAa;IASrB,OAAO,CAAC,aAAa;yCA3HV,qBAAqB;2CAArB,qBAAqB;CAgIjC"}
1
+ {"version":3,"file":"prism-sidebar.component.d.ts","sourceRoot":"","sources":["../../../src/app/sidebar/prism-sidebar.component.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AAC3E,OAAO,EAAE,sBAAsB,EAAE,MAAM,yCAAyC,CAAC;AAEjF,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AACzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,EAKL,KAAK,cAAc,EACnB,KAAK,eAAe,EACrB,MAAM,6BAA6B,CAAC;;AAiCrC,UAAU,eAAe;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,cAAc,EAAE,CAAC;CACzB;AAED,UAAU,WAAW;IACnB,IAAI,EAAE,cAAc,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,eAAe,GAAG,IAAI,CAAC;CACrC;AAED,UAAU,iBAAiB;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,MAAM,EAAE,cAAc,CAAC;CACxB;AAED,qBAkWa,qBAAqB;IAChC,SAAS,CAAC,QAAQ,CAAC,iBAAiB,yBAAkC;IACtE,SAAS,CAAC,QAAQ,CAAC,aAAa,qBAA8B;IAC9D,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA8B;IAC5D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAC6B;IAEzD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAK1B;IAGF,SAAS,CAAC,WAAW,CAAC,CAAC,EAAE,aAAa,GAAG,IAAI;IAa7C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA6C;IAE1E,SAAS,CAAC,QAAQ,CAAC,UAAU,yCAE1B;IAEH,SAAS,CAAC,QAAQ,CAAC,cAAc,oDAc9B;IAEH,SAAS,CAAC,QAAQ,CAAC,iBAAiB;;;;;;SAqBjC;IAEH,SAAS,CAAC,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAI3C,SAAS,CAAC,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAU3C,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM;IAM/C,SAAS,CAAC,SAAS,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM;IAMjD,SAAS,CAAC,UAAU,CAAC,IAAI,EAAE,cAAc,GAAG,eAAe,GAAG,SAAS;IAMvE;;;;;OAKG;IACH,SAAS,CAAC,aAAa,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM;IAKvD,SAAS,CAAC,WAAW,CACnB,IAAI,EAAE,cAAc,EACpB,WAAW,EAAE,eAAe,GAAG,IAAI,GAClC,MAAM,GAAG,IAAI;IAShB,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO;IAWjD,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI;IAQ9C,OAAO,CAAC,aAAa;IASrB,OAAO,CAAC,aAAa;yCA5JV,qBAAqB;2CAArB,qBAAqB;CAiKjC"}
@@ -1,12 +1,18 @@
1
1
  import { Component, computed, inject, signal, viewChild, HostListener, ChangeDetectionStrategy, } from '@angular/core';
2
2
  import { PrismIconComponent } from '../icons/prism-icon.component.js';
3
+ import { BUILTIN_NAVIGATION_DECORATIONS } from '../panels/builtin-navigation-decorations.js';
3
4
  import { PrismNavigationService } from '../services/prism-navigation.service.js';
5
+ import { PrismPluginService } from '../services/prism-plugin.service.js';
4
6
  import { PrismSearchService } from '../services/prism-search.service.js';
7
+ import { decorateItem, lifecycleIcon, resolveNavigationDecorations, rollupCategory, } from './navigation-decorations.js';
5
8
  import * as i0 from "@angular/core";
6
9
  const _c0 = ["filterInput"];
7
10
  const _forTrack0 = ($index, $item) => $item.name;
8
11
  function _forTrack1($index, $item) { /* @ts-ignore */
9
12
  return this.itemKey($item); }
13
+ function _forTrack2($index, $item) { /* @ts-ignore */
14
+ return this.itemKey($item.item); }
15
+ const _forTrack3 = ($index, $item) => $item.id;
10
16
  function PrismSidebarComponent_Conditional_8_For_8_Conditional_5_For_2_Template(rf, ctx) { if (rf & 1) {
11
17
  const _r4 = i0.ɵɵgetCurrentView();
12
18
  i0.ɵɵelementStart(0, "button", 17);
@@ -48,7 +54,7 @@ function PrismSidebarComponent_Conditional_8_For_8_Template(rf, ctx) { if (rf &
48
54
  i0.ɵɵadvance();
49
55
  i0.ɵɵproperty("size", 10);
50
56
  i0.ɵɵadvance();
51
- i0.ɵɵstyleProp("--chip", cat_r2.color);
57
+ i0.ɵɵstyleProp("--%NS%chip", cat_r2.color);
52
58
  i0.ɵɵadvance();
53
59
  i0.ɵɵtextInterpolate1(" ", cat_r2.name, " ");
54
60
  i0.ɵɵadvance();
@@ -73,36 +79,59 @@ function PrismSidebarComponent_Conditional_8_Template(rf, ctx) { if (rf & 1) {
73
79
  i0.ɵɵadvance();
74
80
  i0.ɵɵrepeater(ctx_r2.pageCategories());
75
81
  } }
76
- function PrismSidebarComponent_For_10_For_7_Conditional_7_For_2_Conditional_4_Template(rf, ctx) { if (rf & 1) {
77
- i0.ɵɵelementStart(0, "span", 25);
78
- i0.ɵɵelement(1, "span", 26);
82
+ function PrismSidebarComponent_For_10_For_7_Conditional_5_Template(rf, ctx) { if (rf & 1) {
83
+ i0.ɵɵelementStart(0, "span", 24);
84
+ i0.ɵɵtext(1);
79
85
  i0.ɵɵelementEnd();
86
+ } if (rf & 2) {
87
+ const cat_r7 = i0.ɵɵnextContext().$implicit;
88
+ const ctx_r2 = i0.ɵɵnextContext(2);
89
+ i0.ɵɵclassProp("sb-group-rollup--warn", cat_r7.rollup.variant === "warn")("sb-group-rollup--danger", cat_r7.rollup.variant === "danger");
90
+ i0.ɵɵattribute("title", ctx_r2.rollupTooltip(cat_r7.rollup))("aria-label", ctx_r2.rollupTooltip(cat_r7.rollup));
91
+ i0.ɵɵadvance();
92
+ i0.ɵɵtextInterpolate(cat_r7.rollup.problems);
80
93
  } }
81
- function PrismSidebarComponent_For_10_For_7_Conditional_7_For_2_Template(rf, ctx) { if (rf & 1) {
94
+ function PrismSidebarComponent_For_10_For_7_Conditional_8_For_2_Conditional_4_For_2_Template(rf, ctx) { if (rf & 1) {
95
+ i0.ɵɵelement(0, "prism-icon", 29);
96
+ } if (rf & 2) {
97
+ const mark_r11 = ctx.$implicit;
98
+ i0.ɵɵclassMap("sb-health sb-health--" + mark_r11.variant);
99
+ i0.ɵɵproperty("name", mark_r11.icon)("size", 11);
100
+ } }
101
+ function PrismSidebarComponent_For_10_For_7_Conditional_8_For_2_Conditional_4_Template(rf, ctx) { if (rf & 1) {
102
+ i0.ɵɵelementStart(0, "span", 27);
103
+ i0.ɵɵrepeaterCreate(1, PrismSidebarComponent_For_10_For_7_Conditional_8_For_2_Conditional_4_For_2_Template, 1, 4, "prism-icon", 28, _forTrack3);
104
+ i0.ɵɵelementEnd();
105
+ } if (rf & 2) {
106
+ const row_r10 = i0.ɵɵnextContext().$implicit;
107
+ i0.ɵɵadvance();
108
+ i0.ɵɵrepeater(row_r10.decorations.marks);
109
+ } }
110
+ function PrismSidebarComponent_For_10_For_7_Conditional_8_For_2_Template(rf, ctx) { if (rf & 1) {
82
111
  const _r9 = i0.ɵɵgetCurrentView();
83
112
  i0.ɵɵelementStart(0, "button", 17);
84
- i0.ɵɵlistener("click", function PrismSidebarComponent_For_10_For_7_Conditional_7_For_2_Template_button_click_0_listener() { const item_r10 = i0.ɵɵrestoreView(_r9).$implicit; const ctx_r2 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r2.onSelect(item_r10)); });
85
- i0.ɵɵelement(1, "prism-icon", 24);
113
+ i0.ɵɵlistener("click", function PrismSidebarComponent_For_10_For_7_Conditional_8_For_2_Template_button_click_0_listener() { const row_r10 = i0.ɵɵrestoreView(_r9).$implicit; const ctx_r2 = i0.ɵɵnextContext(4); return i0.ɵɵresetView(ctx_r2.onSelect(row_r10.item)); });
114
+ i0.ɵɵelement(1, "prism-icon", 26);
86
115
  i0.ɵɵelementStart(2, "span", 18);
87
116
  i0.ɵɵtext(3);
88
117
  i0.ɵɵelementEnd();
89
- i0.ɵɵconditionalCreate(4, PrismSidebarComponent_For_10_For_7_Conditional_7_For_2_Conditional_4_Template, 2, 0, "span", 25);
118
+ i0.ɵɵconditionalCreate(4, PrismSidebarComponent_For_10_For_7_Conditional_8_For_2_Conditional_4_Template, 3, 0, "span", 27);
90
119
  i0.ɵɵelementEnd();
91
120
  } if (rf & 2) {
92
- const item_r10 = ctx.$implicit;
121
+ const row_r10 = ctx.$implicit;
93
122
  const ctx_r2 = i0.ɵɵnextContext(4);
94
- i0.ɵɵclassProp("sb-item--active", ctx_r2.isActive(item_r10))("sb-item--deprecated", ctx_r2.itemStatus(item_r10) === "deprecated");
95
- i0.ɵɵattribute("title", ctx_r2.itemTooltip(item_r10));
123
+ i0.ɵɵclassProp("sb-item--active", ctx_r2.isActive(row_r10.item))("sb-item--deprecated", ctx_r2.itemStatus(row_r10.item) === "deprecated");
124
+ i0.ɵɵattribute("title", ctx_r2.itemTooltip(row_r10.item, row_r10.decorations));
96
125
  i0.ɵɵadvance();
97
- i0.ɵɵproperty("size", 12);
126
+ i0.ɵɵproperty("name", row_r10.icon)("size", 12);
98
127
  i0.ɵɵadvance(2);
99
- i0.ɵɵtextInterpolate(ctx_r2.itemLabel(item_r10));
128
+ i0.ɵɵtextInterpolate(ctx_r2.itemLabel(row_r10.item));
100
129
  i0.ɵɵadvance();
101
- i0.ɵɵconditional(ctx_r2.itemStatus(item_r10) === "wip" ? 4 : -1);
130
+ i0.ɵɵconditional(row_r10.decorations ? 4 : -1);
102
131
  } }
103
- function PrismSidebarComponent_For_10_For_7_Conditional_7_Template(rf, ctx) { if (rf & 1) {
132
+ function PrismSidebarComponent_For_10_For_7_Conditional_8_Template(rf, ctx) { if (rf & 1) {
104
133
  i0.ɵɵelementStart(0, "div", 15);
105
- i0.ɵɵrepeaterCreate(1, PrismSidebarComponent_For_10_For_7_Conditional_7_For_2_Template, 5, 8, "button", 23, _forTrack1, true);
134
+ i0.ɵɵrepeaterCreate(1, PrismSidebarComponent_For_10_For_7_Conditional_8_For_2_Template, 5, 9, "button", 25, _forTrack2, true);
106
135
  i0.ɵɵelementEnd();
107
136
  } if (rf & 2) {
108
137
  const cat_r7 = i0.ɵɵnextContext().$implicit;
@@ -115,10 +144,11 @@ function PrismSidebarComponent_For_10_For_7_Template(rf, ctx) { if (rf & 1) {
115
144
  i0.ɵɵlistener("click", function PrismSidebarComponent_For_10_For_7_Template_button_click_1_listener() { const cat_r7 = i0.ɵɵrestoreView(_r6).$implicit; const section_r8 = i0.ɵɵnextContext().$implicit; const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.toggleCollapse("sec:" + section_r8.name + ":" + cat_r7.name)); });
116
145
  i0.ɵɵelement(2, "prism-icon", 13)(3, "span", 14);
117
146
  i0.ɵɵtext(4);
118
- i0.ɵɵelementStart(5, "span", 22);
119
- i0.ɵɵtext(6);
147
+ i0.ɵɵconditionalCreate(5, PrismSidebarComponent_For_10_For_7_Conditional_5_Template, 2, 7, "span", 22);
148
+ i0.ɵɵelementStart(6, "span", 23);
149
+ i0.ɵɵtext(7);
120
150
  i0.ɵɵelementEnd()();
121
- i0.ɵɵconditionalCreate(7, PrismSidebarComponent_For_10_For_7_Conditional_7_Template, 3, 0, "div", 15);
151
+ i0.ɵɵconditionalCreate(8, PrismSidebarComponent_For_10_For_7_Conditional_8_Template, 3, 0, "div", 15);
122
152
  i0.ɵɵelementEnd();
123
153
  } if (rf & 2) {
124
154
  const cat_r7 = ctx.$implicit;
@@ -130,13 +160,15 @@ function PrismSidebarComponent_For_10_For_7_Template(rf, ctx) { if (rf & 1) {
130
160
  i0.ɵɵadvance();
131
161
  i0.ɵɵproperty("size", 10);
132
162
  i0.ɵɵadvance();
133
- i0.ɵɵstyleProp("--chip", cat_r7.color);
163
+ i0.ɵɵstyleProp("--%NS%chip", cat_r7.color);
134
164
  i0.ɵɵadvance();
135
165
  i0.ɵɵtextInterpolate1(" ", cat_r7.name, " ");
166
+ i0.ɵɵadvance();
167
+ i0.ɵɵconditional(cat_r7.rollup.problems ? 5 : -1);
136
168
  i0.ɵɵadvance(2);
137
169
  i0.ɵɵtextInterpolate(cat_r7.items.length);
138
170
  i0.ɵɵadvance();
139
- i0.ɵɵconditional(!ctx_r2.isCollapsed("sec:" + section_r8.name + ":" + cat_r7.name) ? 7 : -1);
171
+ i0.ɵɵconditional(!ctx_r2.isCollapsed("sec:" + section_r8.name + ":" + cat_r7.name) ? 8 : -1);
140
172
  } }
141
173
  function PrismSidebarComponent_For_10_Template(rf, ctx) { if (rf & 1) {
142
174
  i0.ɵɵelementStart(0, "div", 19)(1, "span", 20);
@@ -146,7 +178,7 @@ function PrismSidebarComponent_For_10_Template(rf, ctx) { if (rf & 1) {
146
178
  i0.ɵɵelementStart(4, "span");
147
179
  i0.ɵɵtext(5);
148
180
  i0.ɵɵelementEnd()();
149
- i0.ɵɵrepeaterCreate(6, PrismSidebarComponent_For_10_For_7_Template, 8, 9, "div", 10, _forTrack0);
181
+ i0.ɵɵrepeaterCreate(6, PrismSidebarComponent_For_10_For_7_Template, 9, 10, "div", 10, _forTrack0);
150
182
  } if (rf & 2) {
151
183
  const section_r8 = ctx.$implicit;
152
184
  i0.ɵɵadvance(2);
@@ -188,8 +220,11 @@ function categoryColor(name) {
188
220
  export class PrismSidebarComponent {
189
221
  navigationService = inject(PrismNavigationService);
190
222
  searchService = inject(PrismSearchService);
223
+ pluginService = inject(PrismPluginService);
191
224
  filterInput = viewChild('filterInput', /* @ts-ignore */
192
225
  ...(ngDevMode ? [{ debugName: "filterInput" }] : /* istanbul ignore next */ []));
226
+ decorations = computed(() => resolveNavigationDecorations(BUILTIN_NAVIGATION_DECORATIONS, this.pluginService.navigationDecorations()), /* @ts-ignore */
227
+ ...(ngDevMode ? [{ debugName: "decorations" }] : /* istanbul ignore next */ []));
193
228
  onGlobalKey(e) {
194
229
  if (e.key !== '/' || e.ctrlKey || e.metaKey || e.altKey)
195
230
  return;
@@ -224,16 +259,25 @@ export class PrismSidebarComponent {
224
259
  }, /* @ts-ignore */
225
260
  ...(ngDevMode ? [{ debugName: "pageCategories" }] : /* istanbul ignore next */ []));
226
261
  componentSections = computed(() => {
262
+ const defs = this.decorations();
227
263
  return this.navigationService.sectionTree().map((section) => ({
228
264
  name: section.name,
229
265
  icon: sectionIcon(section.name),
230
266
  color: categoryColor(section.name),
231
267
  totalCount: section.totalCount,
232
- categories: section.categories.map((cat) => ({
233
- name: cat.name,
234
- color: categoryColor(cat.name),
235
- items: cat.items,
236
- })),
268
+ categories: section.categories.map((cat) => {
269
+ const items = cat.items.map((item) => ({
270
+ item,
271
+ icon: lifecycleIcon(this.itemStatus(item)),
272
+ decorations: decorateItem(item, defs),
273
+ }));
274
+ return {
275
+ name: cat.name,
276
+ color: categoryColor(cat.name),
277
+ rollup: rollupCategory(items.map((row) => row.decorations)),
278
+ items,
279
+ };
280
+ }),
237
281
  }));
238
282
  }, /* @ts-ignore */
239
283
  ...(ngDevMode ? [{ debugName: "componentSections" }] : /* istanbul ignore next */ []));
@@ -266,13 +310,26 @@ export class PrismSidebarComponent {
266
310
  ? item.data.meta.showcaseConfig.status
267
311
  : undefined;
268
312
  }
269
- itemTooltip(item) {
313
+ /**
314
+ * Accessible name for the roll-up pill. The pill otherwise renders a bare
315
+ * number distinguished only by colour — a screen reader would read the
316
+ * group head as "Feedback 3 12" with nothing naming what either number
317
+ * means, and a colour-blind reader can't tell them apart at all.
318
+ */
319
+ rollupTooltip(rollup) {
320
+ const noun = rollup.problems === 1 ? 'component needs' : 'components need';
321
+ return `${rollup.problems} ${noun} review`;
322
+ }
323
+ itemTooltip(item, decorations) {
270
324
  const status = this.itemStatus(item);
325
+ const lines = [];
271
326
  if (status === 'wip')
272
- return 'Work in progress';
327
+ lines.push('Work in progress');
273
328
  if (status === 'deprecated')
274
- return 'Deprecated / Legacy';
275
- return null;
329
+ lines.push('Deprecated / Legacy');
330
+ if (decorations)
331
+ lines.push(decorations.tooltip);
332
+ return lines.length ? lines.join('\n') : null;
276
333
  }
277
334
  isActive(item) {
278
335
  const active = this.navigationService.activeItem();
@@ -313,7 +370,7 @@ export class PrismSidebarComponent {
313
370
  i0.ɵɵqueryAdvance();
314
371
  } }, hostBindings: function PrismSidebarComponent_HostBindings(rf, ctx) { if (rf & 1) {
315
372
  i0.ɵɵlistener("keydown", function PrismSidebarComponent_keydown_HostBindingHandler($event) { return ctx.onGlobalKey($event); }, i0.ɵɵresolveDocument);
316
- } }, decls: 11, vars: 3, consts: [["filterInput", ""], [1, "prism-sidebar"], [1, "sb-filter"], ["name", "search", 3, "size"], ["placeholder", "Filter components\u2026", 3, "input", "value"], [1, "sb-scroll"], [1, "sb-pinned"], [1, "sb-pinned-head"], [1, "sb-pinned-head-l"], ["name", "pin", 1, "sb-pinned-pin", 3, "size"], [1, "sb-group", 3, "sb-group--collapsed"], [1, "sb-group"], [1, "sb-group-head", 3, "click"], ["name", "chevron-down", 3, "size"], [1, "sb-group-chip"], [1, "sb-group-body"], [1, "sb-item", 3, "sb-item--active"], [1, "sb-item", 3, "click"], [1, "sb-item-name"], [1, "sb-section-head"], [1, "sb-section-head-l"], [1, "sb-section-icon", 3, "name", "size"], [1, "sb-group-count"], [1, "sb-item", 3, "sb-item--active", "sb-item--deprecated"], ["name", "box", 1, "sb-item-icon", 3, "size"], ["title", "Work in progress", 1, "sb-item-status"], [1, "sb-item-status-dot"]], template: function PrismSidebarComponent_Template(rf, ctx) { if (rf & 1) {
373
+ } }, decls: 11, vars: 3, consts: [["filterInput", ""], [1, "prism-sidebar"], [1, "sb-filter"], ["name", "search", 3, "size"], ["placeholder", "Filter components\u2026", 3, "input", "value"], [1, "sb-scroll"], [1, "sb-pinned"], [1, "sb-pinned-head"], [1, "sb-pinned-head-l"], ["name", "pin", 1, "sb-pinned-pin", 3, "size"], [1, "sb-group", 3, "sb-group--collapsed"], [1, "sb-group"], [1, "sb-group-head", 3, "click"], ["name", "chevron-down", 3, "size"], [1, "sb-group-chip"], [1, "sb-group-body"], [1, "sb-item", 3, "sb-item--active"], [1, "sb-item", 3, "click"], [1, "sb-item-name"], [1, "sb-section-head"], [1, "sb-section-head-l"], [1, "sb-section-icon", 3, "name", "size"], [1, "sb-group-rollup", 3, "sb-group-rollup--warn", "sb-group-rollup--danger"], [1, "sb-group-count"], [1, "sb-group-rollup"], [1, "sb-item", 3, "sb-item--active", "sb-item--deprecated"], [1, "sb-item-icon", 3, "name", "size"], [1, "sb-item-health"], [3, "name", "size", "class"], [3, "name", "size"]], template: function PrismSidebarComponent_Template(rf, ctx) { if (rf & 1) {
317
374
  i0.ɵɵelementStart(0, "nav", 1)(1, "div", 2);
318
375
  i0.ɵɵelement(2, "prism-icon", 3);
319
376
  i0.ɵɵelementStart(3, "input", 4, 0);
@@ -335,7 +392,7 @@ export class PrismSidebarComponent {
335
392
  i0.ɵɵconditional(ctx.pageCategories().length > 0 ? 8 : -1);
336
393
  i0.ɵɵadvance();
337
394
  i0.ɵɵrepeater(ctx.componentSections());
338
- } }, dependencies: [PrismIconComponent], styles: [".prism-sidebar[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n overflow: hidden;\n }\n\n .sb-filter[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 12px;\n padding: 0 10px;\n height: 30px;\n background: var(--prism-input-bg);\n border: 1px solid var(--prism-border);\n border-radius: 6px;\n color: var(--prism-text-muted);\n }\n .sb-filter[_ngcontent-%COMP%] input[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n background: transparent;\n border: 0;\n outline: none;\n font-size: var(--fs-md);\n color: var(--prism-text);\n font-family: var(--font-sans);\n }\n .sb-filter[_ngcontent-%COMP%] input[_ngcontent-%COMP%]::placeholder { color: var(--prism-text-muted); }\n .sb-filter[_ngcontent-%COMP%] kbd[_ngcontent-%COMP%] {\n font-family: var(--font-mono);\n font-size: 10px;\n color: var(--prism-text-ghost);\n padding: 1px 5px;\n border: 1px solid var(--prism-border);\n border-radius: 3px;\n }\n\n .sb-scroll[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n padding: 10px 0 16px;\n padding-top: 0;\n }\n .sb-scroll[_ngcontent-%COMP%]::-webkit-scrollbar { width: 8px; }\n .sb-scroll[_ngcontent-%COMP%]::-webkit-scrollbar-thumb { background: var(--prism-border-strong); border-radius: 4px; }\n .sb-scroll[_ngcontent-%COMP%]::-webkit-scrollbar-track { background: transparent; }\n\n .sb-pinned[_ngcontent-%COMP%] {\n padding: 0 0 10px;\n margin-bottom: 4px;\n border-bottom: 1px solid var(--prism-border);\n border-top: 1px solid var(--prism-border);\n }\n .sb-section-head[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 14px 6px;\n font-size: 10.5px;\n font-weight: 700;\n letter-spacing: 0.09em;\n text-transform: uppercase;\n color: var(--prism-text-ghost);\n margin-top: 6px;\n }\n .sb-section-head-l[_ngcontent-%COMP%] { display: flex; align-items: center; gap: 6px; }\n .sb-section-icon[_ngcontent-%COMP%] { color: var(--prism-primary); }\n .sb-pinned-head[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 14px 6px;\n margin-top: 6px;\n font-size: 10.5px;\n font-weight: 700;\n letter-spacing: 0.09em;\n text-transform: uppercase;\n color: var(--prism-text-ghost);\n }\n .sb-pinned-head-l[_ngcontent-%COMP%] { display: flex; align-items: center; gap: 6px; }\n .sb-pinned-pin[_ngcontent-%COMP%] { color: var(--prism-accent); }\n\n .sb-group[_ngcontent-%COMP%] { margin-bottom: 4px; }\n .sb-group-head[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n width: 100%;\n padding: 8px 14px 6px;\n font-size: 10.5px;\n font-weight: 700;\n letter-spacing: 0.09em;\n text-transform: uppercase;\n color: var(--prism-text-ghost);\n cursor: pointer;\n user-select: none;\n background: none;\n border: none;\n text-align: left;\n font-family: var(--font-sans);\n }\n .sb-group-head[_ngcontent-%COMP%] prism-icon[_ngcontent-%COMP%] {\n transition: transform var(--dur-fast);\n color: var(--prism-text-ghost);\n }\n .sb-group--collapsed[_ngcontent-%COMP%] .sb-group-head[_ngcontent-%COMP%] prism-icon[_ngcontent-%COMP%] { transform: rotate(-90deg); }\n\n .sb-group-chip[_ngcontent-%COMP%] {\n width: 6px;\n height: 6px;\n border-radius: 2px;\n background: var(--chip, var(--prism-primary));\n box-shadow: 0 0 6px var(--chip, var(--prism-primary));\n }\n .sb-group-count[_ngcontent-%COMP%] {\n margin-left: auto;\n font-family: var(--font-mono);\n font-size: 10px;\n color: var(--prism-text-ghost);\n font-weight: 500;\n }\n\n .sb-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n height: 30px;\n padding: 0 14px 0 28px;\n font-size: 13px;\n color: var(--prism-text-2);\n cursor: pointer;\n border: none;\n border-left: 2px solid transparent;\n background: none;\n position: relative;\n transition: background var(--dur-fast), color var(--dur-fast);\n text-align: left;\n font-family: var(--font-sans);\n }\n .sb-item[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--prism-primary) 5%, transparent);\n color: var(--prism-text);\n }\n .sb-item--active[_ngcontent-%COMP%] {\n border-left-color: var(--prism-primary);\n background: color-mix(in srgb, var(--prism-primary) 12%, transparent);\n color: var(--prism-text);\n font-weight: 500;\n }\n .sb-item--active[_ngcontent-%COMP%]::before {\n content: '';\n position: absolute;\n left: -1px;\n top: 0;\n bottom: 0;\n width: 3px;\n background: linear-gradient(180deg, var(--prism-primary-from), var(--prism-primary-to));\n }\n .sb-item-icon[_ngcontent-%COMP%] { flex: 0 0 12px; opacity: 0.7; }\n .sb-item-name[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .sb-item-status[_ngcontent-%COMP%] {\n flex: 0 0 auto;\n margin-left: auto;\n display: flex;\n align-items: center;\n }\n .sb-item-status-dot[_ngcontent-%COMP%] {\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: var(--prism-warn);\n }\n\n .sb-item--deprecated[_ngcontent-%COMP%] .sb-item-name[_ngcontent-%COMP%] {\n text-decoration: line-through;\n text-decoration-thickness: 1px;\n color: var(--prism-text-ghost);\n opacity: 0.7;\n }\n\n\n [_ngcontent-%COMP%]:focus-visible {\n outline: 2px solid var(--prism-primary);\n outline-offset: 2px;\n }"] });
395
+ } }, dependencies: [PrismIconComponent], styles: [".prism-sidebar[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n overflow: hidden;\n }\n\n .sb-filter[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 12px;\n padding: 0 10px;\n height: 30px;\n background: var(--%NS%prism-input-bg);\n border: 1px solid var(--%NS%prism-border);\n border-radius: 6px;\n color: var(--%NS%prism-text-muted);\n }\n .sb-filter[_ngcontent-%COMP%] input[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n background: transparent;\n border: 0;\n outline: none;\n font-size: var(--%NS%fs-md);\n color: var(--%NS%prism-text);\n font-family: var(--%NS%font-sans);\n }\n .sb-filter[_ngcontent-%COMP%] input[_ngcontent-%COMP%]::placeholder { color: var(--%NS%prism-text-muted); }\n .sb-filter[_ngcontent-%COMP%] kbd[_ngcontent-%COMP%] {\n font-family: var(--%NS%font-mono);\n font-size: 10px;\n color: var(--%NS%prism-text-ghost);\n padding: 1px 5px;\n border: 1px solid var(--%NS%prism-border);\n border-radius: 3px;\n }\n\n .sb-scroll[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n padding: 10px 0 16px;\n padding-top: 0;\n }\n .sb-scroll[_ngcontent-%COMP%]::-webkit-scrollbar { width: 8px; }\n .sb-scroll[_ngcontent-%COMP%]::-webkit-scrollbar-thumb { background: var(--%NS%prism-border-strong); border-radius: 4px; }\n .sb-scroll[_ngcontent-%COMP%]::-webkit-scrollbar-track { background: transparent; }\n\n .sb-pinned[_ngcontent-%COMP%] {\n padding: 0 0 10px;\n margin-bottom: 4px;\n border-bottom: 1px solid var(--%NS%prism-border);\n border-top: 1px solid var(--%NS%prism-border);\n }\n .sb-section-head[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 14px 6px;\n font-size: 10.5px;\n font-weight: 700;\n letter-spacing: 0.09em;\n text-transform: uppercase;\n color: var(--%NS%prism-text-ghost);\n margin-top: 6px;\n }\n .sb-section-head-l[_ngcontent-%COMP%] { display: flex; align-items: center; gap: 6px; }\n .sb-section-icon[_ngcontent-%COMP%] { color: var(--%NS%prism-primary); }\n .sb-pinned-head[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 14px 6px;\n margin-top: 6px;\n font-size: 10.5px;\n font-weight: 700;\n letter-spacing: 0.09em;\n text-transform: uppercase;\n color: var(--%NS%prism-text-ghost);\n }\n .sb-pinned-head-l[_ngcontent-%COMP%] { display: flex; align-items: center; gap: 6px; }\n .sb-pinned-pin[_ngcontent-%COMP%] { color: var(--%NS%prism-accent); }\n\n .sb-group[_ngcontent-%COMP%] { margin-bottom: 4px; }\n .sb-group-head[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n width: 100%;\n padding: 8px 14px 6px;\n font-size: 10.5px;\n font-weight: 700;\n letter-spacing: 0.09em;\n text-transform: uppercase;\n color: var(--%NS%prism-text-ghost);\n cursor: pointer;\n user-select: none;\n background: none;\n border: none;\n text-align: left;\n font-family: var(--%NS%font-sans);\n }\n .sb-group-head[_ngcontent-%COMP%] prism-icon[_ngcontent-%COMP%] {\n transition: transform var(--%NS%dur-fast);\n color: var(--%NS%prism-text-ghost);\n }\n .sb-group--collapsed[_ngcontent-%COMP%] .sb-group-head[_ngcontent-%COMP%] prism-icon[_ngcontent-%COMP%] { transform: rotate(-90deg); }\n\n .sb-group-chip[_ngcontent-%COMP%] {\n width: 6px;\n height: 6px;\n border-radius: 2px;\n background: var(--%NS%chip, var(--%NS%prism-primary));\n box-shadow: 0 0 6px var(--%NS%chip, var(--%NS%prism-primary));\n }\n .sb-group-count[_ngcontent-%COMP%] {\n margin-left: auto;\n font-family: var(--%NS%font-mono);\n font-size: 10px;\n color: var(--%NS%prism-text-ghost);\n font-weight: 500;\n }\n\n .sb-group-rollup[_ngcontent-%COMP%] {\n margin-left: auto;\n font-family: var(--%NS%font-mono);\n font-size: 9.5px;\n font-weight: 600;\n letter-spacing: 0;\n padding: 1px 5px;\n border-radius: 8px;\n }\n .sb-group-rollup--warn[_ngcontent-%COMP%] {\n color: var(--%NS%prism-warn);\n background: color-mix(in srgb, var(--%NS%prism-warn) 16%, transparent);\n }\n .sb-group-rollup--danger[_ngcontent-%COMP%] {\n color: var(--%NS%prism-danger);\n background: color-mix(in srgb, var(--%NS%prism-danger) 16%, transparent);\n }\n .sb-group-rollup[_ngcontent-%COMP%] + .sb-group-count[_ngcontent-%COMP%] {\n margin-left: 6px;\n }\n\n .sb-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n height: 30px;\n padding: 0 14px 0 28px;\n font-size: 13px;\n color: var(--%NS%prism-text-2);\n cursor: pointer;\n border: none;\n border-left: 2px solid transparent;\n background: none;\n position: relative;\n transition: background var(--%NS%dur-fast), color var(--%NS%dur-fast);\n text-align: left;\n font-family: var(--%NS%font-sans);\n }\n .sb-item[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--%NS%prism-primary) 5%, transparent);\n color: var(--%NS%prism-text);\n }\n .sb-item--active[_ngcontent-%COMP%] {\n border-left-color: var(--%NS%prism-primary);\n background: color-mix(in srgb, var(--%NS%prism-primary) 12%, transparent);\n color: var(--%NS%prism-text);\n font-weight: 500;\n }\n .sb-item--%NS%active[_ngcontent-%COMP%]::before {\n content: '';\n position: absolute;\n left: -1px;\n top: 0;\n bottom: 0;\n width: 3px;\n background: linear-gradient(180deg, var(--%NS%prism-primary-from), var(--%NS%prism-primary-to));\n }\n .sb-item-icon[_ngcontent-%COMP%] { flex: 0 0 12px; opacity: 0.7; }\n .sb-item-name[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .sb-item-health[_ngcontent-%COMP%] {\n flex: 0 0 auto;\n margin-left: auto;\n display: flex;\n align-items: center;\n gap: 5px;\n }\n .sb-health--warn[_ngcontent-%COMP%] {\n color: var(--%NS%prism-warn);\n }\n .sb-health--danger[_ngcontent-%COMP%] {\n color: var(--%NS%prism-danger);\n }\n\n .sb-item--deprecated[_ngcontent-%COMP%] .sb-item-name[_ngcontent-%COMP%] {\n text-decoration: line-through;\n text-decoration-thickness: 1px;\n color: var(--%NS%prism-text-ghost);\n opacity: 0.7;\n }\n\n\n [_ngcontent-%COMP%]:focus-visible {\n outline: 2px solid var(--%NS%prism-primary);\n outline-offset: 2px;\n }"] });
339
396
  }
340
397
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(PrismSidebarComponent, [{
341
398
  type: Component,
@@ -421,23 +478,41 @@ export class PrismSidebarComponent {
421
478
  <prism-icon name="chevron-down" [size]="10" />
422
479
  <span class="sb-group-chip" [style.--chip]="cat.color"></span>
423
480
  {{ cat.name }}
481
+ @if (cat.rollup.problems) {
482
+ <span
483
+ class="sb-group-rollup"
484
+ [class.sb-group-rollup--warn]="cat.rollup.variant === 'warn'"
485
+ [class.sb-group-rollup--danger]="cat.rollup.variant === 'danger'"
486
+ [attr.title]="rollupTooltip(cat.rollup)"
487
+ [attr.aria-label]="rollupTooltip(cat.rollup)"
488
+ >{{ cat.rollup.problems }}</span
489
+ >
490
+ }
424
491
  <span class="sb-group-count">{{ cat.items.length }}</span>
425
492
  </button>
426
493
  @if (!isCollapsed('sec:' + section.name + ':' + cat.name)) {
427
494
  <div class="sb-group-body">
428
- @for (item of cat.items; track itemKey(item)) {
495
+ @for (row of cat.items; track itemKey(row.item)) {
429
496
  <button
430
497
  class="sb-item"
431
- [class.sb-item--active]="isActive(item)"
432
- [class.sb-item--deprecated]="itemStatus(item) === 'deprecated'"
433
- [attr.title]="itemTooltip(item)"
434
- (click)="onSelect(item)"
498
+ [class.sb-item--active]="isActive(row.item)"
499
+ [class.sb-item--deprecated]="
500
+ itemStatus(row.item) === 'deprecated'
501
+ "
502
+ [attr.title]="itemTooltip(row.item, row.decorations)"
503
+ (click)="onSelect(row.item)"
435
504
  >
436
- <prism-icon name="box" [size]="12" class="sb-item-icon" />
437
- <span class="sb-item-name">{{ itemLabel(item) }}</span>
438
- @if (itemStatus(item) === 'wip') {
439
- <span class="sb-item-status" title="Work in progress">
440
- <span class="sb-item-status-dot"></span>
505
+ <prism-icon [name]="row.icon" [size]="12" class="sb-item-icon" />
506
+ <span class="sb-item-name">{{ itemLabel(row.item) }}</span>
507
+ @if (row.decorations) {
508
+ <span class="sb-item-health">
509
+ @for (mark of row.decorations.marks; track mark.id) {
510
+ <prism-icon
511
+ [name]="mark.icon"
512
+ [size]="11"
513
+ [class]="'sb-health sb-health--' + mark.variant"
514
+ />
515
+ }
441
516
  </span>
442
517
  }
443
518
  </button>
@@ -448,9 +523,9 @@ export class PrismSidebarComponent {
448
523
  } }
449
524
  </div>
450
525
  </nav>
451
- `, styles: ["\n .prism-sidebar {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n overflow: hidden;\n }\n\n .sb-filter {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 12px;\n padding: 0 10px;\n height: 30px;\n background: var(--prism-input-bg);\n border: 1px solid var(--prism-border);\n border-radius: 6px;\n color: var(--prism-text-muted);\n }\n .sb-filter input {\n flex: 1;\n min-width: 0;\n background: transparent;\n border: 0;\n outline: none;\n font-size: var(--fs-md);\n color: var(--prism-text);\n font-family: var(--font-sans);\n }\n .sb-filter input::placeholder { color: var(--prism-text-muted); }\n .sb-filter kbd {\n font-family: var(--font-mono);\n font-size: 10px;\n color: var(--prism-text-ghost);\n padding: 1px 5px;\n border: 1px solid var(--prism-border);\n border-radius: 3px;\n }\n\n .sb-scroll {\n flex: 1;\n overflow-y: auto;\n padding: 10px 0 16px;\n padding-top: 0;\n }\n .sb-scroll::-webkit-scrollbar { width: 8px; }\n .sb-scroll::-webkit-scrollbar-thumb { background: var(--prism-border-strong); border-radius: 4px; }\n .sb-scroll::-webkit-scrollbar-track { background: transparent; }\n\n .sb-pinned {\n padding: 0 0 10px;\n margin-bottom: 4px;\n border-bottom: 1px solid var(--prism-border);\n border-top: 1px solid var(--prism-border);\n }\n .sb-section-head {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 14px 6px;\n font-size: 10.5px;\n font-weight: 700;\n letter-spacing: 0.09em;\n text-transform: uppercase;\n color: var(--prism-text-ghost);\n margin-top: 6px;\n }\n .sb-section-head-l { display: flex; align-items: center; gap: 6px; }\n .sb-section-icon { color: var(--prism-primary); }\n .sb-pinned-head {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 14px 6px;\n margin-top: 6px;\n font-size: 10.5px;\n font-weight: 700;\n letter-spacing: 0.09em;\n text-transform: uppercase;\n color: var(--prism-text-ghost);\n }\n .sb-pinned-head-l { display: flex; align-items: center; gap: 6px; }\n .sb-pinned-pin { color: var(--prism-accent); }\n\n .sb-group { margin-bottom: 4px; }\n .sb-group-head {\n display: flex;\n align-items: center;\n gap: 6px;\n width: 100%;\n padding: 8px 14px 6px;\n font-size: 10.5px;\n font-weight: 700;\n letter-spacing: 0.09em;\n text-transform: uppercase;\n color: var(--prism-text-ghost);\n cursor: pointer;\n user-select: none;\n background: none;\n border: none;\n text-align: left;\n font-family: var(--font-sans);\n }\n .sb-group-head prism-icon {\n transition: transform var(--dur-fast);\n color: var(--prism-text-ghost);\n }\n .sb-group--collapsed .sb-group-head prism-icon { transform: rotate(-90deg); }\n\n .sb-group-chip {\n width: 6px;\n height: 6px;\n border-radius: 2px;\n background: var(--chip, var(--prism-primary));\n box-shadow: 0 0 6px var(--chip, var(--prism-primary));\n }\n .sb-group-count {\n margin-left: auto;\n font-family: var(--font-mono);\n font-size: 10px;\n color: var(--prism-text-ghost);\n font-weight: 500;\n }\n\n .sb-item {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n height: 30px;\n padding: 0 14px 0 28px;\n font-size: 13px;\n color: var(--prism-text-2);\n cursor: pointer;\n border: none;\n border-left: 2px solid transparent;\n background: none;\n position: relative;\n transition: background var(--dur-fast), color var(--dur-fast);\n text-align: left;\n font-family: var(--font-sans);\n }\n .sb-item:hover {\n background: color-mix(in srgb, var(--prism-primary) 5%, transparent);\n color: var(--prism-text);\n }\n .sb-item--active {\n border-left-color: var(--prism-primary);\n background: color-mix(in srgb, var(--prism-primary) 12%, transparent);\n color: var(--prism-text);\n font-weight: 500;\n }\n .sb-item--active::before {\n content: '';\n position: absolute;\n left: -1px;\n top: 0;\n bottom: 0;\n width: 3px;\n background: linear-gradient(180deg, var(--prism-primary-from), var(--prism-primary-to));\n }\n .sb-item-icon { flex: 0 0 12px; opacity: 0.7; }\n .sb-item-name {\n flex: 1;\n min-width: 0;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .sb-item-status {\n flex: 0 0 auto;\n margin-left: auto;\n display: flex;\n align-items: center;\n }\n .sb-item-status-dot {\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: var(--prism-warn);\n }\n\n .sb-item--deprecated .sb-item-name {\n text-decoration: line-through;\n text-decoration-thickness: 1px;\n color: var(--prism-text-ghost);\n opacity: 0.7;\n }\n\n\n :focus-visible {\n outline: 2px solid var(--prism-primary);\n outline-offset: 2px;\n }\n "] }]
526
+ `, styles: ["\n .prism-sidebar {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n overflow: hidden;\n }\n\n .sb-filter {\n display: flex;\n align-items: center;\n gap: 8px;\n margin: 12px;\n padding: 0 10px;\n height: 30px;\n background: var(--prism-input-bg);\n border: 1px solid var(--prism-border);\n border-radius: 6px;\n color: var(--prism-text-muted);\n }\n .sb-filter input {\n flex: 1;\n min-width: 0;\n background: transparent;\n border: 0;\n outline: none;\n font-size: var(--fs-md);\n color: var(--prism-text);\n font-family: var(--font-sans);\n }\n .sb-filter input::placeholder { color: var(--prism-text-muted); }\n .sb-filter kbd {\n font-family: var(--font-mono);\n font-size: 10px;\n color: var(--prism-text-ghost);\n padding: 1px 5px;\n border: 1px solid var(--prism-border);\n border-radius: 3px;\n }\n\n .sb-scroll {\n flex: 1;\n overflow-y: auto;\n padding: 10px 0 16px;\n padding-top: 0;\n }\n .sb-scroll::-webkit-scrollbar { width: 8px; }\n .sb-scroll::-webkit-scrollbar-thumb { background: var(--prism-border-strong); border-radius: 4px; }\n .sb-scroll::-webkit-scrollbar-track { background: transparent; }\n\n .sb-pinned {\n padding: 0 0 10px;\n margin-bottom: 4px;\n border-bottom: 1px solid var(--prism-border);\n border-top: 1px solid var(--prism-border);\n }\n .sb-section-head {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 14px 6px;\n font-size: 10.5px;\n font-weight: 700;\n letter-spacing: 0.09em;\n text-transform: uppercase;\n color: var(--prism-text-ghost);\n margin-top: 6px;\n }\n .sb-section-head-l { display: flex; align-items: center; gap: 6px; }\n .sb-section-icon { color: var(--prism-primary); }\n .sb-pinned-head {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 14px 6px;\n margin-top: 6px;\n font-size: 10.5px;\n font-weight: 700;\n letter-spacing: 0.09em;\n text-transform: uppercase;\n color: var(--prism-text-ghost);\n }\n .sb-pinned-head-l { display: flex; align-items: center; gap: 6px; }\n .sb-pinned-pin { color: var(--prism-accent); }\n\n .sb-group { margin-bottom: 4px; }\n .sb-group-head {\n display: flex;\n align-items: center;\n gap: 6px;\n width: 100%;\n padding: 8px 14px 6px;\n font-size: 10.5px;\n font-weight: 700;\n letter-spacing: 0.09em;\n text-transform: uppercase;\n color: var(--prism-text-ghost);\n cursor: pointer;\n user-select: none;\n background: none;\n border: none;\n text-align: left;\n font-family: var(--font-sans);\n }\n .sb-group-head prism-icon {\n transition: transform var(--dur-fast);\n color: var(--prism-text-ghost);\n }\n .sb-group--collapsed .sb-group-head prism-icon { transform: rotate(-90deg); }\n\n .sb-group-chip {\n width: 6px;\n height: 6px;\n border-radius: 2px;\n background: var(--chip, var(--prism-primary));\n box-shadow: 0 0 6px var(--chip, var(--prism-primary));\n }\n .sb-group-count {\n margin-left: auto;\n font-family: var(--font-mono);\n font-size: 10px;\n color: var(--prism-text-ghost);\n font-weight: 500;\n }\n\n .sb-group-rollup {\n margin-left: auto;\n font-family: var(--font-mono);\n font-size: 9.5px;\n font-weight: 600;\n letter-spacing: 0;\n padding: 1px 5px;\n border-radius: 8px;\n }\n .sb-group-rollup--warn {\n color: var(--prism-warn);\n background: color-mix(in srgb, var(--prism-warn) 16%, transparent);\n }\n .sb-group-rollup--danger {\n color: var(--prism-danger);\n background: color-mix(in srgb, var(--prism-danger) 16%, transparent);\n }\n .sb-group-rollup + .sb-group-count {\n margin-left: 6px;\n }\n\n .sb-item {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n height: 30px;\n padding: 0 14px 0 28px;\n font-size: 13px;\n color: var(--prism-text-2);\n cursor: pointer;\n border: none;\n border-left: 2px solid transparent;\n background: none;\n position: relative;\n transition: background var(--dur-fast), color var(--dur-fast);\n text-align: left;\n font-family: var(--font-sans);\n }\n .sb-item:hover {\n background: color-mix(in srgb, var(--prism-primary) 5%, transparent);\n color: var(--prism-text);\n }\n .sb-item--active {\n border-left-color: var(--prism-primary);\n background: color-mix(in srgb, var(--prism-primary) 12%, transparent);\n color: var(--prism-text);\n font-weight: 500;\n }\n .sb-item--active::before {\n content: '';\n position: absolute;\n left: -1px;\n top: 0;\n bottom: 0;\n width: 3px;\n background: linear-gradient(180deg, var(--prism-primary-from), var(--prism-primary-to));\n }\n .sb-item-icon { flex: 0 0 12px; opacity: 0.7; }\n .sb-item-name {\n flex: 1;\n min-width: 0;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .sb-item-health {\n flex: 0 0 auto;\n margin-left: auto;\n display: flex;\n align-items: center;\n gap: 5px;\n }\n .sb-health--warn {\n color: var(--prism-warn);\n }\n .sb-health--danger {\n color: var(--prism-danger);\n }\n\n .sb-item--deprecated .sb-item-name {\n text-decoration: line-through;\n text-decoration-thickness: 1px;\n color: var(--prism-text-ghost);\n opacity: 0.7;\n }\n\n\n :focus-visible {\n outline: 2px solid var(--prism-primary);\n outline-offset: 2px;\n }\n "] }]
452
527
  }], null, { filterInput: [{ type: i0.ViewChild, args: ['filterInput', { isSignal: true }] }], onGlobalKey: [{
453
528
  type: HostListener,
454
529
  args: ['document:keydown', ['$event']]
455
530
  }] }); })();
456
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(PrismSidebarComponent, { className: "PrismSidebarComponent", filePath: "app/sidebar/prism-sidebar.component.ts", lineNumber: 368 }); })();
531
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(PrismSidebarComponent, { className: "PrismSidebarComponent", filePath: "app/sidebar/prism-sidebar.component.ts", lineNumber: 431 }); })();
@@ -17,7 +17,7 @@ function PrismVariantRibbonComponent_Conditional_0_For_4_Template(rf, ctx) { if
17
17
  const v_r5 = ctx.$implicit;
18
18
  const ɵ$index_6_r3 = ctx.$index;
19
19
  const ctx_r3 = i0.ɵɵnextContext(2);
20
- i0.ɵɵstyleProp("--vc", ctx_r3.variantColor(v_r5.name, ɵ$index_6_r3));
20
+ i0.ɵɵstyleProp("--%NS%vc", ctx_r3.variantColor(v_r5.name, ɵ$index_6_r3));
21
21
  i0.ɵɵclassProp("v-tab--active", ctx_r3.rendererService.activeVariantIndex() === ɵ$index_6_r3);
22
22
  i0.ɵɵadvance(3);
23
23
  i0.ɵɵtextInterpolate1(" ", v_r5.name, " ");
@@ -110,11 +110,11 @@ export class PrismVariantRibbonComponent {
110
110
  i0.ɵɵviewQuerySignal(ctx.tabsContainer, _c0, 5)(ctx.tabButtons, _c1, 5);
111
111
  } if (rf & 2) {
112
112
  i0.ɵɵqueryAdvance(2);
113
- } }, decls: 1, vars: 1, consts: [["tabsContainer", ""], ["tabButton", ""], [1, "variant-ribbon"], [1, "variant-ribbon-tabs"], [1, "v-tab", 3, "v-tab--active", "--vc"], [1, "variant-ribbon-right"], ["title", "Previous variant", "aria-label", "Previous variant", 1, "tool-btn", 3, "click", "disabled"], ["name", "chevron-right", 2, "transform", "rotate(180deg)", 3, "size"], ["title", "Next variant", "aria-label", "Next variant", 1, "tool-btn", 3, "click", "disabled"], ["name", "chevron-right", 3, "size"], [1, "v-tab", 3, "click"], [1, "v-dot"]], template: function PrismVariantRibbonComponent_Template(rf, ctx) { if (rf & 1) {
113
+ } }, decls: 1, vars: 1, consts: [["tabsContainer", ""], ["tabButton", ""], [1, "variant-ribbon"], [1, "variant-ribbon-tabs"], [1, "v-tab", 3, "v-tab--active", "--%NS%vc"], [1, "variant-ribbon-right"], ["title", "Previous variant", "aria-label", "Previous variant", 1, "tool-btn", 3, "click", "disabled"], ["name", "chevron-right", 2, "transform", "rotate(180deg)", 3, "size"], ["title", "Next variant", "aria-label", "Next variant", 1, "tool-btn", 3, "click", "disabled"], ["name", "chevron-right", 3, "size"], [1, "v-tab", 3, "click"], [1, "v-dot"]], template: function PrismVariantRibbonComponent_Template(rf, ctx) { if (rf & 1) {
114
114
  i0.ɵɵconditionalCreate(0, PrismVariantRibbonComponent_Conditional_0_Template, 10, 4, "nav", 2);
115
115
  } if (rf & 2) {
116
116
  i0.ɵɵconditional(ctx.variants().length > 0 ? 0 : -1);
117
- } }, dependencies: [PrismIconComponent], styles: ["[_nghost-%COMP%] { display: block; flex-shrink: 0; }\n\n .variant-ribbon[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n padding: 0 28px;\n background: var(--prism-bg);\n border-bottom: 1px solid var(--prism-border);\n height: 42px;\n }\n\n .variant-ribbon-tabs[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n display: flex;\n align-items: center;\n gap: 2px;\n height: 100%;\n overflow-x: auto;\n scrollbar-width: none;\n }\n .variant-ribbon-tabs[_ngcontent-%COMP%]::-webkit-scrollbar { display: none; }\n\n .v-tab[_ngcontent-%COMP%] {\n position: relative;\n height: 100%;\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 0 14px;\n font-size: 13px;\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 .v-tab[_ngcontent-%COMP%]::after {\n content: '';\n position: absolute;\n left: 10px;\n right: 10px;\n bottom: 0;\n height: 2px;\n background: linear-gradient(90deg, var(--prism-primary-from), var(--prism-primary-to));\n opacity: 0;\n transition: opacity var(--dur-fast);\n border-radius: 1px 1px 0 0;\n }\n .v-tab[_ngcontent-%COMP%]:hover { color: var(--prism-text-2); }\n .v-tab--active[_ngcontent-%COMP%] { color: var(--prism-text); }\n .v-tab--active[_ngcontent-%COMP%]::after { opacity: 1; }\n\n .v-dot[_ngcontent-%COMP%] {\n width: 6px;\n height: 6px;\n border-radius: 2px;\n background: var(--vc, var(--prism-primary));\n opacity: 0.6;\n }\n .v-tab--active[_ngcontent-%COMP%] .v-dot[_ngcontent-%COMP%] {\n opacity: 1;\n box-shadow: 0 0 6px var(--vc);\n }\n\n .variant-ribbon-right[_ngcontent-%COMP%] {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n gap: 8px;\n padding-left: 12px;\n margin-left: 12px;\n border-left: 1px solid var(--prism-border);\n height: 24px;\n }\n\n .tool-btn[_ngcontent-%COMP%] {\n height: 24px;\n width: 24px;\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 .tool-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n color: var(--prism-text);\n background: color-mix(in srgb, var(--prism-primary) 8%, transparent);\n }\n .tool-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.3;\n cursor: default;\n }\n\n [_ngcontent-%COMP%]:focus-visible {\n outline: 2px solid var(--prism-primary);\n outline-offset: 2px;\n }"] });
117
+ } }, dependencies: [PrismIconComponent], styles: ["[_nghost-%COMP%] { display: block; flex-shrink: 0; }\n\n .variant-ribbon[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n padding: 0 28px;\n background: var(--%NS%prism-bg);\n border-bottom: 1px solid var(--%NS%prism-border);\n height: 42px;\n }\n\n .variant-ribbon-tabs[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n display: flex;\n align-items: center;\n gap: 2px;\n height: 100%;\n overflow-x: auto;\n scrollbar-width: none;\n }\n .variant-ribbon-tabs[_ngcontent-%COMP%]::-webkit-scrollbar { display: none; }\n\n .v-tab[_ngcontent-%COMP%] {\n position: relative;\n height: 100%;\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 0 14px;\n font-size: 13px;\n font-weight: 500;\n color: var(--%NS%prism-text-muted);\n white-space: nowrap;\n transition: color var(--%NS%dur-fast);\n background: none;\n border: none;\n cursor: pointer;\n font-family: var(--%NS%font-sans);\n }\n .v-tab[_ngcontent-%COMP%]::after {\n content: '';\n position: absolute;\n left: 10px;\n right: 10px;\n bottom: 0;\n height: 2px;\n background: linear-gradient(90deg, var(--%NS%prism-primary-from), var(--%NS%prism-primary-to));\n opacity: 0;\n transition: opacity var(--%NS%dur-fast);\n border-radius: 1px 1px 0 0;\n }\n .v-tab[_ngcontent-%COMP%]:hover { color: var(--%NS%prism-text-2); }\n .v-tab--active[_ngcontent-%COMP%] { color: var(--%NS%prism-text); }\n .v-tab--%NS%active[_ngcontent-%COMP%]::after { opacity: 1; }\n\n .v-dot[_ngcontent-%COMP%] {\n width: 6px;\n height: 6px;\n border-radius: 2px;\n background: var(--%NS%vc, var(--%NS%prism-primary));\n opacity: 0.6;\n }\n .v-tab--active[_ngcontent-%COMP%] .v-dot[_ngcontent-%COMP%] {\n opacity: 1;\n box-shadow: 0 0 6px var(--%NS%vc);\n }\n\n .variant-ribbon-right[_ngcontent-%COMP%] {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n gap: 8px;\n padding-left: 12px;\n margin-left: 12px;\n border-left: 1px solid var(--%NS%prism-border);\n height: 24px;\n }\n\n .tool-btn[_ngcontent-%COMP%] {\n height: 24px;\n width: 24px;\n display: grid;\n place-items: center;\n border-radius: var(--%NS%radius-sm);\n color: var(--%NS%prism-text-muted);\n background: none;\n border: none;\n cursor: pointer;\n transition: all var(--%NS%dur-fast);\n }\n .tool-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n color: var(--%NS%prism-text);\n background: color-mix(in srgb, var(--%NS%prism-primary) 8%, transparent);\n }\n .tool-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.3;\n cursor: default;\n }\n\n [_ngcontent-%COMP%]:focus-visible {\n outline: 2px solid var(--%NS%prism-primary);\n outline-offset: 2px;\n }"] });
118
118
  }
119
119
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(PrismVariantRibbonComponent, [{
120
120
  type: Component,
@@ -79,7 +79,7 @@ export class PrismViewPanelHostComponent {
79
79
  } if (rf & 2) {
80
80
  i0.ɵɵadvance();
81
81
  i0.ɵɵconditional(ctx.resolvedComponent() ? 1 : -1);
82
- } }, dependencies: [NgComponentOutlet], styles: [".prism-view-panel-host[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n overflow: auto;\n background: var(--prism-bg-elevated);\n }"] });
82
+ } }, dependencies: [NgComponentOutlet], styles: [".prism-view-panel-host[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n overflow: auto;\n background: var(--%NS%prism-bg-elevated);\n }"] });
83
83
  }
84
84
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(PrismViewPanelHostComponent, [{
85
85
  type: Component,
@@ -38,7 +38,7 @@ export class PrismViewTabBarComponent {
38
38
  i0.ɵɵclassProp("prism-view-tab-bar__tab--active", ctx.panelService.activeViewId() === "renderer");
39
39
  i0.ɵɵadvance(2);
40
40
  i0.ɵɵrepeater(ctx.viewPanels());
41
- } }, styles: [".prism-view-tab-bar[_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-view-tab-bar__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-view-tab-bar__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-view-tab-bar__tab[_ngcontent-%COMP%]:hover { color: var(--prism-text-2); }\n\n .prism-view-tab-bar__tab--active[_ngcontent-%COMP%] { color: var(--prism-primary); font-weight: 500; }\n\n .prism-view-tab-bar__tab--active[_ngcontent-%COMP%]::after { opacity: 1; }"] });
41
+ } }, styles: [".prism-view-tab-bar[_ngcontent-%COMP%] {\n display: flex;\n border-bottom: 1px solid var(--%NS%prism-border);\n padding: 0 8px;\n flex-shrink: 0;\n background: var(--%NS%prism-bg-elevated);\n }\n\n .prism-view-tab-bar__tab[_ngcontent-%COMP%] {\n padding: 9px 14px;\n font-size: 13px;\n font-family: var(--%NS%prism-font-sans);\n border: none;\n background: none;\n color: var(--%NS%prism-text-muted);\n cursor: pointer;\n position: relative;\n margin-bottom: -1px;\n transition: color 0.12s;\n }\n\n .prism-view-tab-bar__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(--%NS%prism-primary-from), var(--%NS%prism-primary-to));\n opacity: 0;\n transition: opacity 0.12s;\n }\n\n .prism-view-tab-bar__tab[_ngcontent-%COMP%]:hover { color: var(--%NS%prism-text-2); }\n\n .prism-view-tab-bar__tab--active[_ngcontent-%COMP%] { color: var(--%NS%prism-primary); font-weight: 500; }\n\n .prism-view-tab-bar__tab--%NS%active[_ngcontent-%COMP%]::after { opacity: 1; }"] });
42
42
  }
43
43
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(PrismViewTabBarComponent, [{
44
44
  type: Component,
@@ -1,7 +1,21 @@
1
- import type { A11yManifestMeta, A11yReport, A11yThresholds } from '../../app/panels/a11y/a11y.types.js';
1
+ import type { A11yComponentMeta, A11yManifestMeta, A11yReport, A11yThresholds } from '../../app/panels/a11y/a11y.types.js';
2
+ import { deriveA11ySummary } from '../../app/panels/a11y/a11y-summary.js';
3
+ export { deriveA11ySummary };
2
4
  export declare const DEFAULT_A11Y_REPORT_PATH = "a11y-report.json";
3
5
  export declare function loadA11yReport(reportPath: string): A11yReport | null;
4
6
  export declare function readA11yMeta(reportPath: string, thresholdsInput?: Partial<A11yThresholds>): A11yManifestMeta | null;
7
+ /**
8
+ * Every component's entry, from a single read of the report.
9
+ *
10
+ * The plural form exists because {@link readA11yForComponent} re-enters
11
+ * {@link loadA11yReport}, which `statSync`s the file even on a cache hit.
12
+ * Calling it once per scanned component turns a 300-component library into 300
13
+ * redundant syscalls per build, and a watch-mode rebuild repeats them all — so
14
+ * the pipeline reads the report once and looks components up in the result.
15
+ */
16
+ export declare function readA11yForComponents(reportPath: string, thresholds: A11yThresholds): Map<string, A11yComponentMeta>;
17
+ /** The per-component entry of the report, or null when there is none. */
18
+ export declare function readA11yForComponent(reportPath: string, className: string, thresholds: A11yThresholds): A11yComponentMeta | null;
5
19
  export interface ThresholdViolation {
6
20
  metric: 'score' | 'critical' | 'serious' | 'moderate';
7
21
  actual: number;
@@ -1 +1 @@
1
- {"version":3,"file":"a11y-report-reader.d.ts","sourceRoot":"","sources":["../../../src/builder/a11y/a11y-report-reader.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,gBAAgB,EAChB,UAAU,EACV,cAAc,EACf,MAAM,qCAAqC,CAAC;AAG7C,eAAO,MAAM,wBAAwB,qBAAqB,CAAC;AAI3D,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAapE;AAED,wBAAgB,YAAY,CAC1B,UAAU,EAAE,MAAM,EAClB,eAAe,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GACxC,gBAAgB,GAAG,IAAI,CAQzB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,OAAO,GAAG,UAAU,GAAG,SAAS,GAAG,UAAU,CAAC;IACtD,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,gBAAgB,GACrB,kBAAkB,EAAE,CAkCtB;AAED,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C"}
1
+ {"version":3,"file":"a11y-report-reader.d.ts","sourceRoot":"","sources":["../../../src/builder/a11y/a11y-report-reader.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,iBAAiB,EACjB,gBAAgB,EAChB,UAAU,EACV,cAAc,EACf,MAAM,qCAAqC,CAAC;AAE7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAK1E,OAAO,EAAE,iBAAiB,EAAE,CAAC;AAE7B,eAAO,MAAM,wBAAwB,qBAAqB,CAAC;AAI3D,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAapE;AAED,wBAAgB,YAAY,CAC1B,UAAU,EAAE,MAAM,EAClB,eAAe,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GACxC,gBAAgB,GAAG,IAAI,CAQzB;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,cAAc,GACzB,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAchC;AAED,yEAAyE;AACzE,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,cAAc,GACzB,iBAAiB,GAAG,IAAI,CAK1B;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,OAAO,GAAG,UAAU,GAAG,SAAS,GAAG,UAAU,CAAC;IACtD,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,gBAAgB,GACrB,kBAAkB,EAAE,CAkCtB;AAED,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C"}
@@ -1,5 +1,10 @@
1
1
  import { readFileSync, statSync } from 'node:fs';
2
2
  import { resolveA11yThresholds } from '../../app/panels/a11y/a11y-thresholds.js';
3
+ import { deriveA11ySummary } from '../../app/panels/a11y/a11y-summary.js';
4
+ // Re-exported so the builder side keeps one import surface for the a11y
5
+ // report. The derivation itself lives in `app/` because the panel tab grades
6
+ // the live audit with it and cannot reach into `builder/`.
7
+ export { deriveA11ySummary };
3
8
  export const DEFAULT_A11Y_REPORT_PATH = 'a11y-report.json';
4
9
  const cache = new Map();
5
10
  export function loadA11yReport(reportPath) {
@@ -26,6 +31,38 @@ export function readA11yMeta(reportPath, thresholdsInput) {
26
31
  thresholds: resolveA11yThresholds(thresholdsInput),
27
32
  };
28
33
  }
34
+ /**
35
+ * Every component's entry, from a single read of the report.
36
+ *
37
+ * The plural form exists because {@link readA11yForComponent} re-enters
38
+ * {@link loadA11yReport}, which `statSync`s the file even on a cache hit.
39
+ * Calling it once per scanned component turns a 300-component library into 300
40
+ * redundant syscalls per build, and a watch-mode rebuild repeats them all — so
41
+ * the pipeline reads the report once and looks components up in the result.
42
+ */
43
+ export function readA11yForComponents(reportPath, thresholds) {
44
+ const components = loadA11yReport(reportPath)?.components;
45
+ const byClassName = new Map();
46
+ if (!components)
47
+ return byClassName;
48
+ for (const [className, score] of Object.entries(components)) {
49
+ if (!score)
50
+ continue;
51
+ byClassName.set(className, {
52
+ found: true,
53
+ score,
54
+ summary: deriveA11ySummary(score, thresholds),
55
+ });
56
+ }
57
+ return byClassName;
58
+ }
59
+ /** The per-component entry of the report, or null when there is none. */
60
+ export function readA11yForComponent(reportPath, className, thresholds) {
61
+ const score = loadA11yReport(reportPath)?.components?.[className];
62
+ if (!score)
63
+ return null;
64
+ return { found: true, score, summary: deriveA11ySummary(score, thresholds) };
65
+ }
29
66
  export function checkA11yThresholds(meta) {
30
67
  const violations = [];
31
68
  const t = meta.thresholds;
@@ -1 +1 @@
1
- {"version":3,"file":"component.scanner.d.ts","sourceRoot":"","sources":["../../../src/builder/scanner/component.scanner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAwCrE;;GAEG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,EAAE,CAAC,MAAM,EAAE,EACpB,OAAO,EAAE,EAAE,CAAC,WAAW,GACtB,gBAAgB,EAAE,CA8CpB"}
1
+ {"version":3,"file":"component.scanner.d.ts","sourceRoot":"","sources":["../../../src/builder/scanner/component.scanner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAmErE;;GAEG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,EAAE,CAAC,MAAM,EAAE,EACpB,OAAO,EAAE,EAAE,CAAC,WAAW,GACtB,gBAAgB,EAAE,CA8CpB"}
@@ -8,6 +8,29 @@ function isComponentStatus(value) {
8
8
  }
9
9
  import { evaluateExpression, findDecorator, getDecoratorArgument, } from './ast-utils.js';
10
10
  import { extractInputs, extractOutputs } from './input.extractor.js';
11
+ /**
12
+ * Backgrounds that still work but should not be reached for any more.
13
+ *
14
+ * `checker` draws the same checkerboard as `transparent` while browsing, so
15
+ * the canvas cannot tell them apart — but it captures as `--prism-bg-surface`,
16
+ * a *theme* token, which makes a baseline recorded on it depend on the theme
17
+ * the runner's browser started in. Since `transparent` took over as the
18
+ * default, it is the value that looks like transparency and is not.
19
+ *
20
+ * Warned rather than rejected: the value is valid, and dropping it would
21
+ * change what a component renders on — a break wearing a warning's clothes.
22
+ * Scheduled for removal in 23.0.0, the next Angular-aligned major.
23
+ */
24
+ const DEPRECATED_BGS = {
25
+ checker: "use 'transparent' for the same look with a capture that keeps its alpha, or 'light'/'dark' for an absolute colour",
26
+ };
27
+ function warnDeprecatedBg(bg, where) {
28
+ const advice = DEPRECATED_BGS[bg];
29
+ if (!advice)
30
+ return;
31
+ console.warn(`⚠ ng-prism: ${where} declares bg "${bg}", which is deprecated and will ` +
32
+ `be removed in 23.0.0 — ${advice}.`);
33
+ }
11
34
  function isCanvasBg(value) {
12
35
  return (typeof value === 'string' &&
13
36
  CANVAS_BGS.includes(value));
@@ -110,10 +133,10 @@ function extractShowcaseConfig(decorator, className) {
110
133
  if (obj['bg'] !== undefined) {
111
134
  if (isCanvasBg(obj['bg'])) {
112
135
  config.bg = obj['bg'];
136
+ warnDeprecatedBg(obj['bg'], className);
113
137
  }
114
138
  else {
115
- console.warn(`⚠ ng-prism: ${className} declares invalid bg "${String(obj['bg'])}" — ` +
116
- `expected one of: dots, plain, light, dark, checker. Skipping.`);
139
+ console.warn(`⚠ ng-prism: ${className} declares invalid bg "${String(obj['bg'])}" — ` + `expected one of: ${CANVAS_BGS.join(', ')}. Skipping.`);
117
140
  }
118
141
  }
119
142
  if (obj['canvasLayout'] !== undefined) {
@@ -127,9 +150,13 @@ function extractShowcaseConfig(decorator, className) {
127
150
  if (Array.isArray(obj['variants'])) {
128
151
  config.variants = obj['variants'].map((variant) => {
129
152
  const cleaned = { ...variant };
153
+ if (isCanvasBg(variant['bg'])) {
154
+ warnDeprecatedBg(variant['bg'], `${className} variant "${String(variant['name'])}"`);
155
+ }
130
156
  if (variant['bg'] !== undefined && !isCanvasBg(variant['bg'])) {
131
157
  console.warn(`⚠ ng-prism: ${className} variant "${String(variant['name'])}" declares ` +
132
- `invalid bg "${String(variant['bg'])}" — expected one of: dots, plain, light, dark, checker. Skipping.`);
158
+ `invalid bg "${String(variant['bg'])}" — expected one of: ` +
159
+ `${CANVAS_BGS.join(', ')}. Skipping.`);
133
160
  delete cleaned['bg'];
134
161
  }
135
162
  if (variant['canvasLayout'] !== undefined &&
@@ -1 +1 @@
1
- {"version":3,"file":"prism-pipeline.d.ts","sourceRoot":"","sources":["../../../src/builder/shared/prism-pipeline.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAGhE,OAAO,EAAiB,KAAK,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAYpE,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,8FAA8F;IAC9F,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,mGAAmG;IACnG,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,GAAG,SAAS,CAAC;IAC7B,oGAAoG;IACpG,eAAe,EAAE,MAAM,GAAG,SAAS,CAAC;CACrC;AAED,wBAAgB,mBAAmB,IAAI,kBAAkB,CAExD;AAED,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,oBAAoB,EAC7B,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,kBAAkB,GACxB,OAAO,CAAC,mBAAmB,CAAC,CAyE9B"}
1
+ {"version":3,"file":"prism-pipeline.d.ts","sourceRoot":"","sources":["../../../src/builder/shared/prism-pipeline.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAGhE,OAAO,EAAiB,KAAK,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAapE,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,8FAA8F;IAC9F,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,mGAAmG;IACnG,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,GAAG,SAAS,CAAC;IAC7B,oGAAoG;IACpG,eAAe,EAAE,MAAM,GAAG,SAAS,CAAC;CACrC;AAED,wBAAgB,mBAAmB,IAAI,kBAAkB,CAExD;AAED,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,oBAAoB,EAC7B,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,kBAAkB,GACxB,OAAO,CAAC,mBAAmB,CAAC,CAyF9B"}