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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. package/dist/app/canvas/canvas-bg.styles.d.ts +19 -0
  2. package/dist/app/canvas/canvas-bg.styles.d.ts.map +1 -0
  3. package/dist/app/canvas/canvas-bg.styles.js +58 -0
  4. package/dist/app/canvas/prism-canvas-bg-pill.component.d.ts.map +1 -1
  5. package/dist/app/canvas/prism-canvas-bg-pill.component.js +3 -3
  6. package/dist/app/canvas/prism-canvas-toolbar.component.d.ts +25 -7
  7. package/dist/app/canvas/prism-canvas-toolbar.component.d.ts.map +1 -1
  8. package/dist/app/canvas/prism-canvas-toolbar.component.js +152 -121
  9. package/dist/app/canvas/prism-template-popover.component.d.ts +0 -3
  10. package/dist/app/canvas/prism-template-popover.component.d.ts.map +1 -1
  11. package/dist/app/canvas/prism-template-popover.component.js +43 -59
  12. package/dist/app/component-head/head-metrics.d.ts +41 -0
  13. package/dist/app/component-head/head-metrics.d.ts.map +1 -0
  14. package/dist/app/component-head/head-metrics.js +39 -0
  15. package/dist/app/component-head/prism-component-head.component.d.ts +10 -2
  16. package/dist/app/component-head/prism-component-head.component.d.ts.map +1 -1
  17. package/dist/app/component-head/prism-component-head.component.js +107 -209
  18. package/dist/app/component-head/prism-head-gauge.component.d.ts +23 -0
  19. package/dist/app/component-head/prism-head-gauge.component.d.ts.map +1 -0
  20. package/dist/app/component-head/prism-head-gauge.component.js +123 -0
  21. package/dist/app/component-head/prism-head-info.component.d.ts +23 -0
  22. package/dist/app/component-head/prism-head-info.component.d.ts.map +1 -0
  23. package/dist/app/component-head/prism-head-info.component.js +124 -0
  24. package/dist/app/component-head/prism-stat.component.d.ts +10 -4
  25. package/dist/app/component-head/prism-stat.component.d.ts.map +1 -1
  26. package/dist/app/component-head/prism-stat.component.js +34 -44
  27. package/dist/app/header/prism-header.component.js +2 -2
  28. package/dist/app/icons/icon-registry.d.ts.map +1 -1
  29. package/dist/app/icons/icon-registry.js +2 -0
  30. package/dist/app/index.d.ts +3 -1
  31. package/dist/app/index.d.ts.map +1 -1
  32. package/dist/app/index.js +26 -1
  33. package/dist/app/layout-menu/prism-layout-menu.component.js +2 -2
  34. package/dist/app/overview/overview-panel.d.ts +3 -0
  35. package/dist/app/overview/overview-panel.d.ts.map +1 -0
  36. package/dist/app/overview/overview-panel.js +9 -0
  37. package/dist/app/overview/overview-visibility.d.ts +15 -0
  38. package/dist/app/overview/overview-visibility.d.ts.map +1 -0
  39. package/dist/app/overview/overview-visibility.js +18 -0
  40. package/dist/app/overview/prism-overview-cell.component.d.ts +29 -0
  41. package/dist/app/overview/prism-overview-cell.component.d.ts.map +1 -0
  42. package/dist/app/overview/prism-overview-cell.component.js +136 -0
  43. package/dist/app/overview/prism-overview.component.d.ts +17 -0
  44. package/dist/app/overview/prism-overview.component.d.ts.map +1 -0
  45. package/dist/app/overview/prism-overview.component.js +53 -0
  46. package/dist/app/page-renderer/prism-page-renderer.component.d.ts.map +1 -1
  47. package/dist/app/page-renderer/prism-page-renderer.component.js +3 -3
  48. package/dist/app/panels/a11y/a11y-header-badge.component.d.ts.map +1 -1
  49. package/dist/app/panels/a11y/a11y-header-badge.component.js +21 -30
  50. package/dist/app/panels/builtin-panels.d.ts.map +1 -1
  51. package/dist/app/panels/builtin-panels.js +2 -0
  52. package/dist/app/panels/panel-host/prism-panel-host.component.d.ts.map +1 -1
  53. package/dist/app/panels/panel-host/prism-panel-host.component.js +15 -11
  54. package/dist/app/renderer/prism-renderer.component.d.ts +0 -1
  55. package/dist/app/renderer/prism-renderer.component.d.ts.map +1 -1
  56. package/dist/app/renderer/prism-renderer.component.js +9 -71
  57. package/dist/app/renderer/projectable-content.d.ts +10 -0
  58. package/dist/app/renderer/projectable-content.d.ts.map +1 -0
  59. package/dist/app/renderer/projectable-content.js +60 -0
  60. package/dist/app/services/prism-capture.service.d.ts.map +1 -1
  61. package/dist/app/services/prism-capture.service.js +20 -0
  62. package/dist/app/services/prism-layout.service.d.ts +0 -3
  63. package/dist/app/services/prism-layout.service.d.ts.map +1 -1
  64. package/dist/app/services/prism-layout.service.js +0 -8
  65. package/dist/app/services/prism-panel.service.d.ts +18 -0
  66. package/dist/app/services/prism-panel.service.d.ts.map +1 -1
  67. package/dist/app/services/prism-panel.service.js +28 -0
  68. package/dist/app/shared/prism-metric-badge.component.d.ts +32 -0
  69. package/dist/app/shared/prism-metric-badge.component.d.ts.map +1 -0
  70. package/dist/app/shared/prism-metric-badge.component.js +70 -0
  71. package/dist/app/shell/prism-shell.component.d.ts +0 -1
  72. package/dist/app/shell/prism-shell.component.d.ts.map +1 -1
  73. package/dist/app/shell/prism-shell.component.js +56 -48
  74. package/dist/app/sidebar/navigation-decorations.d.ts +6 -3
  75. package/dist/app/sidebar/navigation-decorations.d.ts.map +1 -1
  76. package/dist/app/sidebar/navigation-decorations.js +7 -4
  77. package/dist/app/sidebar/prism-sidebar.component.d.ts +11 -7
  78. package/dist/app/sidebar/prism-sidebar.component.d.ts.map +1 -1
  79. package/dist/app/sidebar/prism-sidebar.component.js +61 -83
  80. package/dist/app/theme/prism-default-theme.d.ts.map +1 -1
  81. package/dist/app/theme/prism-default-theme.js +44 -4
  82. package/dist/app/variant-ribbon/prism-variant-ribbon.component.d.ts +4 -1
  83. package/dist/app/variant-ribbon/prism-variant-ribbon.component.d.ts.map +1 -1
  84. package/dist/app/variant-ribbon/prism-variant-ribbon.component.js +13 -26
  85. package/dist/app/variant-ribbon/spectrum.d.ts +19 -0
  86. package/dist/app/variant-ribbon/spectrum.d.ts.map +1 -0
  87. package/dist/app/variant-ribbon/spectrum.js +15 -0
  88. package/dist/app/view-tab-bar/next-view-id.d.ts +12 -0
  89. package/dist/app/view-tab-bar/next-view-id.d.ts.map +1 -0
  90. package/dist/app/view-tab-bar/next-view-id.js +16 -0
  91. package/dist/app/view-tab-bar/prism-view-panel-host.component.d.ts +0 -1
  92. package/dist/app/view-tab-bar/prism-view-panel-host.component.d.ts.map +1 -1
  93. package/dist/app/view-tab-bar/prism-view-panel-host.component.js +10 -11
  94. package/dist/app/view-tab-bar/prism-view-tab-bar.component.d.ts +0 -1
  95. package/dist/app/view-tab-bar/prism-view-tab-bar.component.d.ts.map +1 -1
  96. package/dist/app/view-tab-bar/prism-view-tab-bar.component.js +6 -13
  97. package/dist/transformer/cli.js +0 -0
  98. package/package.json +1 -1
  99. package/dist/app/canvas/prism-code-drawer.component.d.ts +0 -14
  100. package/dist/app/canvas/prism-code-drawer.component.d.ts.map +0 -1
  101. package/dist/app/canvas/prism-code-drawer.component.js +0 -116
  102. package/dist/app/component-header/prism-component-header.component.d.ts +0 -8
  103. package/dist/app/component-header/prism-component-header.component.d.ts.map +0 -1
  104. package/dist/app/component-header/prism-component-header.component.js +0 -77
  105. package/dist/cli/audit-a11y/aggregator.d.ts +0 -10
  106. package/dist/cli/audit-a11y/aggregator.d.ts.map +0 -1
  107. package/dist/cli/audit-a11y/aggregator.js +0 -64
  108. package/dist/cli/audit-a11y/auditor.d.ts +0 -14
  109. package/dist/cli/audit-a11y/auditor.d.ts.map +0 -1
  110. package/dist/cli/audit-a11y/auditor.js +0 -104
  111. package/dist/cli/audit-a11y/cli.d.ts +0 -3
  112. package/dist/cli/audit-a11y/cli.d.ts.map +0 -1
  113. package/dist/cli/audit-a11y/cli.js +0 -143
  114. package/dist/cli/audit-a11y/index.d.ts +0 -4
  115. package/dist/cli/audit-a11y/index.d.ts.map +0 -1
  116. package/dist/cli/audit-a11y/index.js +0 -3
  117. package/dist/cli/audit-a11y/static-server.d.ts +0 -11
  118. package/dist/cli/audit-a11y/static-server.d.ts.map +0 -1
  119. package/dist/cli/audit-a11y/static-server.js +0 -61
@@ -7,6 +7,7 @@ import { PrismSearchService } from '../services/prism-search.service.js';
7
7
  import { decorateItem, lifecycleIcon, resolveNavigationDecorations, rollupCategory, } from './navigation-decorations.js';
8
8
  import * as i0 from "@angular/core";
9
9
  const _c0 = ["filterInput"];
10
+ const _c1 = () => [];
10
11
  const _forTrack0 = ($index, $item) => $item.name;
11
12
  function _forTrack1($index, $item) { /* @ts-ignore */
12
13
  return this.itemKey($item); }
@@ -53,9 +54,7 @@ function PrismSidebarComponent_Conditional_8_For_8_Template(rf, ctx) { if (rf &
53
54
  i0.ɵɵattribute("aria-expanded", !ctx_r2.isCollapsed("page:" + cat_r2.name));
54
55
  i0.ɵɵadvance();
55
56
  i0.ɵɵproperty("size", 10);
56
- i0.ɵɵadvance();
57
- i0.ɵɵstyleProp("--%NS%chip", cat_r2.color);
58
- i0.ɵɵadvance();
57
+ i0.ɵɵadvance(2);
59
58
  i0.ɵɵtextInterpolate1(" ", cat_r2.name, " ");
60
59
  i0.ɵɵadvance();
61
60
  i0.ɵɵconditional(!ctx_r2.isCollapsed("page:" + cat_r2.name) ? 5 : -1);
@@ -68,7 +67,7 @@ function PrismSidebarComponent_Conditional_8_Template(rf, ctx) { if (rf & 1) {
68
67
  i0.ɵɵelementStart(5, "span");
69
68
  i0.ɵɵtext(6);
70
69
  i0.ɵɵelementEnd()();
71
- i0.ɵɵrepeaterCreate(7, PrismSidebarComponent_Conditional_8_For_8_Template, 6, 8, "div", 10, _forTrack0);
70
+ i0.ɵɵrepeaterCreate(7, PrismSidebarComponent_Conditional_8_For_8_Template, 6, 6, "div", 10, _forTrack0);
72
71
  i0.ɵɵelementEnd();
73
72
  } if (rf & 2) {
74
73
  const ctx_r2 = i0.ɵɵnextContext();
@@ -79,44 +78,36 @@ function PrismSidebarComponent_Conditional_8_Template(rf, ctx) { if (rf & 1) {
79
78
  i0.ɵɵadvance();
80
79
  i0.ɵɵrepeater(ctx_r2.pageCategories());
81
80
  } }
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);
85
- i0.ɵɵelementEnd();
81
+ function PrismSidebarComponent_For_10_For_7_Conditional_6_Template(rf, ctx) { if (rf & 1) {
82
+ i0.ɵɵtext(0);
86
83
  } if (rf & 2) {
87
84
  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);
85
+ i0.ɵɵtextInterpolate2(" ", cat_r7.rollup.problems, "/", cat_r7.items.length, " ");
93
86
  } }
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);
87
+ function PrismSidebarComponent_For_10_For_7_Conditional_7_Template(rf, ctx) { if (rf & 1) {
88
+ i0.ɵɵtext(0);
89
+ } if (rf & 2) {
90
+ const cat_r7 = i0.ɵɵnextContext().$implicit;
91
+ i0.ɵɵtextInterpolate1(" ", cat_r7.items.length, " ");
92
+ } }
93
+ function PrismSidebarComponent_For_10_For_7_Conditional_8_For_2_For_6_Template(rf, ctx) { if (rf & 1) {
94
+ i0.ɵɵelement(0, "prism-icon", 27);
96
95
  } if (rf & 2) {
97
96
  const mark_r11 = ctx.$implicit;
98
97
  i0.ɵɵclassMap("sb-health sb-health--" + mark_r11.variant);
99
98
  i0.ɵɵproperty("name", mark_r11.icon)("size", 11);
100
99
  } }
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
100
  function PrismSidebarComponent_For_10_For_7_Conditional_8_For_2_Template(rf, ctx) { if (rf & 1) {
111
101
  const _r9 = i0.ɵɵgetCurrentView();
112
102
  i0.ɵɵelementStart(0, "button", 17);
113
103
  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);
104
+ i0.ɵɵelement(1, "prism-icon", 24);
115
105
  i0.ɵɵelementStart(2, "span", 18);
116
106
  i0.ɵɵtext(3);
117
107
  i0.ɵɵelementEnd();
118
- i0.ɵɵconditionalCreate(4, PrismSidebarComponent_For_10_For_7_Conditional_8_For_2_Conditional_4_Template, 3, 0, "span", 27);
119
- i0.ɵɵelementEnd();
108
+ i0.ɵɵelementStart(4, "span", 25);
109
+ i0.ɵɵrepeaterCreate(5, PrismSidebarComponent_For_10_For_7_Conditional_8_For_2_For_6_Template, 1, 4, "prism-icon", 26, _forTrack3);
110
+ i0.ɵɵelementEnd()();
120
111
  } if (rf & 2) {
121
112
  const row_r10 = ctx.$implicit;
122
113
  const ctx_r2 = i0.ɵɵnextContext(4);
@@ -126,12 +117,12 @@ function PrismSidebarComponent_For_10_For_7_Conditional_8_For_2_Template(rf, ctx
126
117
  i0.ɵɵproperty("name", row_r10.icon)("size", 12);
127
118
  i0.ɵɵadvance(2);
128
119
  i0.ɵɵtextInterpolate(ctx_r2.itemLabel(row_r10.item));
129
- i0.ɵɵadvance();
130
- i0.ɵɵconditional(row_r10.decorations ? 4 : -1);
120
+ i0.ɵɵadvance(2);
121
+ i0.ɵɵrepeater(row_r10.decorations?.marks ?? i0.ɵɵpureFunction0(8, _c1));
131
122
  } }
132
123
  function PrismSidebarComponent_For_10_For_7_Conditional_8_Template(rf, ctx) { if (rf & 1) {
133
124
  i0.ɵɵelementStart(0, "div", 15);
134
- i0.ɵɵrepeaterCreate(1, PrismSidebarComponent_For_10_For_7_Conditional_8_For_2_Template, 5, 9, "button", 25, _forTrack2, true);
125
+ i0.ɵɵrepeaterCreate(1, PrismSidebarComponent_For_10_For_7_Conditional_8_For_2_Template, 7, 9, "button", 23, _forTrack2, true);
135
126
  i0.ɵɵelementEnd();
136
127
  } if (rf & 2) {
137
128
  const cat_r7 = i0.ɵɵnextContext().$implicit;
@@ -144,9 +135,8 @@ function PrismSidebarComponent_For_10_For_7_Template(rf, ctx) { if (rf & 1) {
144
135
  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)); });
145
136
  i0.ɵɵelement(2, "prism-icon", 13)(3, "span", 14);
146
137
  i0.ɵɵtext(4);
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);
138
+ i0.ɵɵelementStart(5, "span", 22);
139
+ i0.ɵɵconditionalCreate(6, PrismSidebarComponent_For_10_For_7_Conditional_6_Template, 1, 2)(7, PrismSidebarComponent_For_10_For_7_Conditional_7_Template, 1, 1);
150
140
  i0.ɵɵelementEnd()();
151
141
  i0.ɵɵconditionalCreate(8, PrismSidebarComponent_For_10_For_7_Conditional_8_Template, 3, 0, "div", 15);
152
142
  i0.ɵɵelementEnd();
@@ -159,15 +149,14 @@ function PrismSidebarComponent_For_10_For_7_Template(rf, ctx) { if (rf & 1) {
159
149
  i0.ɵɵattribute("aria-expanded", !ctx_r2.isCollapsed("sec:" + section_r8.name + ":" + cat_r7.name));
160
150
  i0.ɵɵadvance();
161
151
  i0.ɵɵproperty("size", 10);
162
- i0.ɵɵadvance();
163
- i0.ɵɵstyleProp("--%NS%chip", cat_r7.color);
164
- i0.ɵɵadvance();
152
+ i0.ɵɵadvance(2);
165
153
  i0.ɵɵtextInterpolate1(" ", cat_r7.name, " ");
166
154
  i0.ɵɵadvance();
167
- i0.ɵɵconditional(cat_r7.rollup.problems ? 5 : -1);
168
- i0.ɵɵadvance(2);
169
- i0.ɵɵtextInterpolate(cat_r7.items.length);
155
+ i0.ɵɵclassProp("sb-group-count--warn", cat_r7.rollup.variant === "warn")("sb-group-count--danger", cat_r7.rollup.variant === "danger");
156
+ i0.ɵɵattribute("title", cat_r7.rollup.problems ? ctx_r2.rollupTooltip(cat_r7.rollup) : null)("aria-label", cat_r7.rollup.problems ? ctx_r2.rollupTooltip(cat_r7.rollup) : null);
170
157
  i0.ɵɵadvance();
158
+ i0.ɵɵconditional(cat_r7.rollup.problems ? 6 : 7);
159
+ i0.ɵɵadvance(2);
171
160
  i0.ɵɵconditional(!ctx_r2.isCollapsed("sec:" + section_r8.name + ":" + cat_r7.name) ? 8 : -1);
172
161
  } }
173
162
  function PrismSidebarComponent_For_10_Template(rf, ctx) { if (rf & 1) {
@@ -178,7 +167,7 @@ function PrismSidebarComponent_For_10_Template(rf, ctx) { if (rf & 1) {
178
167
  i0.ɵɵelementStart(4, "span");
179
168
  i0.ɵɵtext(5);
180
169
  i0.ɵɵelementEnd()();
181
- i0.ɵɵrepeaterCreate(6, PrismSidebarComponent_For_10_For_7_Template, 9, 10, "div", 10, _forTrack0);
170
+ i0.ɵɵrepeaterCreate(6, PrismSidebarComponent_For_10_For_7_Template, 9, 13, "div", 10, _forTrack0);
182
171
  } if (rf & 2) {
183
172
  const section_r8 = ctx.$implicit;
184
173
  i0.ɵɵadvance(2);
@@ -191,15 +180,6 @@ function PrismSidebarComponent_For_10_Template(rf, ctx) { if (rf & 1) {
191
180
  i0.ɵɵrepeater(section_r8.categories);
192
181
  } }
193
182
  const STORAGE_KEY = 'ng-prism-sidebar-collapsed';
194
- const CATEGORY_COLORS = {
195
- 'Data Display': '#f472b6',
196
- Feedback: '#fbbf24',
197
- Inputs: '#a78bfa',
198
- Layout: '#34d399',
199
- Navigation: '#60a5fa',
200
- Overlay: '#c084fc',
201
- Directives: '#ec4899',
202
- };
203
183
  const SECTION_ICONS = {
204
184
  Components: 'box',
205
185
  Directives: 'zap',
@@ -208,15 +188,6 @@ const DEFAULT_SECTION_ICON = 'box-select';
208
188
  function sectionIcon(name) {
209
189
  return SECTION_ICONS[name] ?? DEFAULT_SECTION_ICON;
210
190
  }
211
- function categoryColor(name) {
212
- if (CATEGORY_COLORS[name])
213
- return CATEGORY_COLORS[name];
214
- let hash = 0;
215
- for (let i = 0; i < name.length; i++)
216
- hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0;
217
- const hue = Math.abs(hash) % 360;
218
- return `hsl(${hue}, 70%, 65%)`;
219
- }
220
191
  export class PrismSidebarComponent {
221
192
  navigationService = inject(PrismNavigationService);
222
193
  searchService = inject(PrismSearchService);
@@ -253,7 +224,6 @@ export class PrismSidebarComponent {
253
224
  }
254
225
  return [...catMap.entries()].map(([name, items]) => ({
255
226
  name,
256
- color: categoryColor(name),
257
227
  items,
258
228
  }));
259
229
  }, /* @ts-ignore */
@@ -263,7 +233,6 @@ export class PrismSidebarComponent {
263
233
  return this.navigationService.sectionTree().map((section) => ({
264
234
  name: section.name,
265
235
  icon: sectionIcon(section.name),
266
- color: categoryColor(section.name),
267
236
  totalCount: section.totalCount,
268
237
  categories: section.categories.map((cat) => {
269
238
  const items = cat.items.map((item) => ({
@@ -273,7 +242,6 @@ export class PrismSidebarComponent {
273
242
  }));
274
243
  return {
275
244
  name: cat.name,
276
- color: categoryColor(cat.name),
277
245
  rollup: rollupCategory(items.map((row) => row.decorations)),
278
246
  items,
279
247
  };
@@ -311,10 +279,17 @@ export class PrismSidebarComponent {
311
279
  : undefined;
312
280
  }
313
281
  /**
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.
282
+ * Accessible name for the roll-up pill, for the deviating case only. The
283
+ * pill otherwise renders a bare number distinguished only by colour — a
284
+ * screen reader would read the group head as "Feedback 3 12" with nothing
285
+ * naming what either number means, and a colour-blind reader can't tell
286
+ * them apart at all.
287
+ *
288
+ * There is deliberately no zero branch: a clean category renders its plain
289
+ * item count and the template leaves both attributes off, because
290
+ * `aria-label` on a descendant feeds the group button's name-from-content
291
+ * and "Buttons 0 components need review" is a claim about a group that has
292
+ * nothing to review.
318
293
  */
319
294
  rollupTooltip(rollup) {
320
295
  const noun = rollup.problems === 1 ? 'component needs' : 'components need';
@@ -370,7 +345,7 @@ export class PrismSidebarComponent {
370
345
  i0.ɵɵqueryAdvance();
371
346
  } }, hostBindings: function PrismSidebarComponent_HostBindings(rf, ctx) { if (rf & 1) {
372
347
  i0.ɵɵlistener("keydown", function PrismSidebarComponent_keydown_HostBindingHandler($event) { return ctx.onGlobalKey($event); }, i0.ɵɵresolveDocument);
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) {
348
+ } }, 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"], [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) {
374
349
  i0.ɵɵelementStart(0, "nav", 1)(1, "div", 2);
375
350
  i0.ɵɵelement(2, "prism-icon", 3);
376
351
  i0.ɵɵelementStart(3, "input", 4, 0);
@@ -392,7 +367,7 @@ export class PrismSidebarComponent {
392
367
  i0.ɵɵconditional(ctx.pageCategories().length > 0 ? 8 : -1);
393
368
  i0.ɵɵadvance();
394
369
  i0.ɵɵrepeater(ctx.componentSections());
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 }"] });
370
+ } }, 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%prism-text-ghost);\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 .sb-group-count--warn[_ngcontent-%COMP%] { color: var(--%NS%prism-mark-attention); }\n .sb-group-count--danger[_ngcontent-%COMP%] { color: var(--%NS%prism-mark-critical); }\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 background: none;\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 background: color-mix(in srgb, var(--%NS%prism-primary) 12%, transparent);\n font-weight: 500;\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 \n\n\n\n\n\n\n .sb-item-health[_ngcontent-%COMP%] {\n width: 40px;\n flex: none;\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: var(--%NS%sp-1);\n overflow: hidden;\n }\n\n \n\n\n\n\n .sb-health[_ngcontent-%COMP%] { fill: none; stroke: currentColor; stroke-width: 2; }\n .sb-health--warn[_ngcontent-%COMP%] {\n color: color-mix(in srgb, var(--%NS%prism-mark-attention) 80%, transparent);\n }\n .sb-health--danger[_ngcontent-%COMP%] { color: var(--%NS%prism-mark-critical); }\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 }"] });
396
371
  }
397
372
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(PrismSidebarComponent, [{
398
373
  type: Component,
@@ -430,7 +405,7 @@ export class PrismSidebarComponent {
430
405
  [attr.aria-expanded]="!isCollapsed('page:' + cat.name)"
431
406
  >
432
407
  <prism-icon name="chevron-down" [size]="10" />
433
- <span class="sb-group-chip" [style.--chip]="cat.color"></span>
408
+ <span class="sb-group-chip"></span>
434
409
  {{ cat.name }}
435
410
  </button>
436
411
  @if (!isCollapsed('page:' + cat.name)) {
@@ -476,19 +451,24 @@ export class PrismSidebarComponent {
476
451
  "
477
452
  >
478
453
  <prism-icon name="chevron-down" [size]="10" />
479
- <span class="sb-group-chip" [style.--chip]="cat.color"></span>
454
+ <span class="sb-group-chip"></span>
480
455
  {{ cat.name }}
481
- @if (cat.rollup.problems) {
482
456
  <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
457
+ class="sb-group-count"
458
+ [class.sb-group-count--warn]="cat.rollup.variant === 'warn'"
459
+ [class.sb-group-count--danger]="cat.rollup.variant === 'danger'"
460
+ [attr.title]="
461
+ cat.rollup.problems ? rollupTooltip(cat.rollup) : null
462
+ "
463
+ [attr.aria-label]="
464
+ cat.rollup.problems ? rollupTooltip(cat.rollup) : null
465
+ "
489
466
  >
490
- }
491
- <span class="sb-group-count">{{ cat.items.length }}</span>
467
+ @if (cat.rollup.problems) { {{ cat.rollup.problems }}/{{
468
+ cat.items.length
469
+ }}
470
+ } @else { {{ cat.items.length }} }
471
+ </span>
492
472
  </button>
493
473
  @if (!isCollapsed('sec:' + section.name + ':' + cat.name)) {
494
474
  <div class="sb-group-body">
@@ -504,9 +484,8 @@ export class PrismSidebarComponent {
504
484
  >
505
485
  <prism-icon [name]="row.icon" [size]="12" class="sb-item-icon" />
506
486
  <span class="sb-item-name">{{ itemLabel(row.item) }}</span>
507
- @if (row.decorations) {
508
487
  <span class="sb-item-health">
509
- @for (mark of row.decorations.marks; track mark.id) {
488
+ @for (mark of row.decorations?.marks ?? []; track mark.id) {
510
489
  <prism-icon
511
490
  [name]="mark.icon"
512
491
  [size]="11"
@@ -514,7 +493,6 @@ export class PrismSidebarComponent {
514
493
  />
515
494
  }
516
495
  </span>
517
- }
518
496
  </button>
519
497
  }
520
498
  </div>
@@ -523,9 +501,9 @@ export class PrismSidebarComponent {
523
501
  } }
524
502
  </div>
525
503
  </nav>
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 "] }]
504
+ `, 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(--prism-text-ghost);\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 .sb-group-count--warn { color: var(--prism-mark-attention); }\n .sb-group-count--danger { color: var(--prism-mark-critical); }\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 background: none;\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 background: color-mix(in srgb, var(--prism-primary) 12%, transparent);\n font-weight: 500;\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 /* Fixed width sized for the three built-in decoration sources (a11y,\n plugin-coverage, plugin-visual-regression) at 11px each plus two\n --sp-1 gaps, with a little headroom. navigationDecorations is an open\n extension point, so a fourth mark from a third-party plugin is\n clipped via overflow: hidden rather than allowed to grow the gutter \u2014\n the point of a fixed-width gutter is that rows never shift\n horizontally as you scan the list. */\n .sb-item-health {\n width: 40px;\n flex: none;\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: var(--sp-1);\n overflow: hidden;\n }\n\n /* Outline, not fill, and full saturation only for danger. The mechanism\n behind these marks is already deviation-driven: decorateItem returns\n null for a clean component and every source bails out at variant === 'ok'.\n What made them read as wallpaper was the drawing: a filled shape at full\n saturation, one per row, in a repo where deviating is the normal case. */\n .sb-health { fill: none; stroke: currentColor; stroke-width: 2; }\n .sb-health--warn {\n color: color-mix(in srgb, var(--prism-mark-attention) 80%, transparent);\n }\n .sb-health--danger { color: var(--prism-mark-critical); }\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 "] }]
527
505
  }], null, { filterInput: [{ type: i0.ViewChild, args: ['filterInput', { isSignal: true }] }], onGlobalKey: [{
528
506
  type: HostListener,
529
507
  args: ['document:keydown', ['$event']]
530
508
  }] }); })();
531
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(PrismSidebarComponent, { className: "PrismSidebarComponent", filePath: "app/sidebar/prism-sidebar.component.ts", lineNumber: 431 }); })();
509
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(PrismSidebarComponent, { className: "PrismSidebarComponent", filePath: "app/sidebar/prism-sidebar.component.ts", lineNumber: 394 }); })();
@@ -1 +1 @@
1
- {"version":3,"file":"prism-default-theme.d.ts","sourceRoot":"","sources":["../../../src/app/theme/prism-default-theme.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAiCnD,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAiCpD,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CA6BpD,CAAC;AAEF,eAAO,MAAM,mBAAmB,wBAAmB,CAAC"}
1
+ {"version":3,"file":"prism-default-theme.d.ts","sourceRoot":"","sources":["../../../src/app/theme/prism-default-theme.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CA0CnD,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CA0CpD,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CA0DpD,CAAC;AAEF,eAAO,MAAM,mBAAmB,wBAAmB,CAAC"}
@@ -7,6 +7,8 @@ export const PRISM_DARK_THEME = {
7
7
  '--prism-bg': '#0d0b1c',
8
8
  '--prism-bg-surface': '#131022',
9
9
  '--prism-bg-elevated': '#1a1535',
10
+ '--prism-stage': '#16122b',
11
+ '--prism-stage-edge': 'rgba(255, 255, 255, 0.10)',
10
12
  '--prism-text': '#ede9f8',
11
13
  '--prism-text-2': '#b0a6c8',
12
14
  '--prism-text-muted': '#8476a2',
@@ -24,6 +26,11 @@ export const PRISM_DARK_THEME = {
24
26
  '--prism-success': '#34d399',
25
27
  '--prism-warn': '#fbbf24',
26
28
  '--prism-danger': '#f87171',
29
+ '--prism-mark-nominal': '#34d399',
30
+ '--prism-mark-attention': '#e8a33d',
31
+ '--prism-mark-critical': '#e5484d',
32
+ '--prism-measure': '#22d3ee',
33
+ '--prism-spectrum': 'linear-gradient(90deg, var(--prism-accent), var(--prism-primary), var(--prism-primary-to))',
27
34
  };
28
35
  export const PRISM_LIGHT_THEME = {
29
36
  '--prism-code-tag': '#be185d',
@@ -34,6 +41,8 @@ export const PRISM_LIGHT_THEME = {
34
41
  '--prism-bg': '#ffffff',
35
42
  '--prism-bg-surface': '#faf9fd',
36
43
  '--prism-bg-elevated': '#ffffff',
44
+ '--prism-stage': '#ffffff',
45
+ '--prism-stage-edge': 'rgba(28, 21, 48, 0.14)',
37
46
  '--prism-text': '#1c1530',
38
47
  '--prism-text-2': '#4d4266',
39
48
  '--prism-text-muted': '#6b5e80',
@@ -48,9 +57,14 @@ export const PRISM_LIGHT_THEME = {
48
57
  '--prism-glow-strong': 'rgba(124, 58, 237, 0.25)',
49
58
  '--prism-input-bg': 'rgba(28, 21, 48, 0.04)',
50
59
  '--prism-dot': 'rgba(124, 58, 237, 0.2)',
51
- '--prism-success': '#059669',
52
- '--prism-warn': '#d97706',
53
- '--prism-danger': '#dc2626',
60
+ '--prism-success': '#047857',
61
+ '--prism-warn': '#8f6b00',
62
+ '--prism-danger': '#951226',
63
+ '--prism-mark-nominal': '#047857',
64
+ '--prism-mark-attention': '#8f6b00',
65
+ '--prism-mark-critical': '#951226',
66
+ '--prism-measure': '#0b93ad',
67
+ '--prism-spectrum': 'linear-gradient(90deg, var(--prism-accent), var(--prism-primary), var(--prism-primary-to))',
54
68
  };
55
69
  export const PRISM_BASE_TOKENS = {
56
70
  '--font-sans': "'Inter', system-ui, sans-serif",
@@ -61,6 +75,13 @@ export const PRISM_BASE_TOKENS = {
61
75
  '--fs-lg': '13.5px',
62
76
  '--fs-xl': '15px',
63
77
  '--fs-2xl': '22px',
78
+ '--sp-1': '2px',
79
+ '--sp-2': '4px',
80
+ '--sp-3': '8px',
81
+ '--sp-4': '12px',
82
+ '--sp-5': '16px',
83
+ '--sp-6': '24px',
84
+ '--sp-7': '40px',
64
85
  '--radius-xs': '3px',
65
86
  '--radius-sm': '5px',
66
87
  '--radius-md': '7px',
@@ -69,10 +90,29 @@ export const PRISM_BASE_TOKENS = {
69
90
  '--dur-fast': '0.12s',
70
91
  '--dur-base': '0.2s',
71
92
  '--dur-slow': '0.3s',
93
+ /**
94
+ * Chrome density. Set on the shell host, so a consuming app can compact or
95
+ * loosen the entire interface from CSS alone:
96
+ *
97
+ * prism-shell { --density: .8 }
98
+ *
99
+ * There is deliberately no signal, service or menu behind this — the whole
100
+ * control surface is the custom property.
101
+ */
102
+ '--density': '1',
103
+ '--band-header': 'calc(40px * var(--density))',
104
+ '--band-head': 'calc(36px * var(--density))',
105
+ '--band-rail': 'calc(28px * var(--density))',
106
+ '--band-tabs': 'calc(34px * var(--density))',
72
107
  '--prism-void-light': '#f7f5fc',
73
108
  '--prism-void-dark': '#07050f',
74
109
  '--prism-text-light': '#ede9f8',
75
- '--prism-header-height': '52px',
110
+ /**
111
+ * Kept as an alias rather than removed: it is exported through
112
+ * PRISM_BASE_TOKENS, so a consuming stylesheet may reference it even though
113
+ * nothing inside this package does.
114
+ */
115
+ '--prism-header-height': 'var(--band-header)',
76
116
  '--prism-font-sans': 'var(--font-sans)',
77
117
  '--prism-font-mono': 'var(--font-mono)',
78
118
  };
@@ -7,7 +7,10 @@ export declare class PrismVariantRibbonComponent {
7
7
  private readonly tabButtons;
8
8
  protected readonly variants: import("@angular/core").Signal<import("../../index.js").Variant<unknown>[]>;
9
9
  constructor();
10
- protected variantColor(name: string, index: number): string;
10
+ protected slot(index: number): {
11
+ i: number;
12
+ n: number;
13
+ };
11
14
  protected prev(): void;
12
15
  protected next(): void;
13
16
  static ɵfac: i0.ɵɵFactoryDeclaration<PrismVariantRibbonComponent, never>;
@@ -1 +1 @@
1
- {"version":3,"file":"prism-variant-ribbon.component.d.ts","sourceRoot":"","sources":["../../../src/app/variant-ribbon/prism-variant-ribbon.component.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;;AAgB7E,qBA8Ja,2BAA2B;IACtC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAkC;IACpE,SAAS,CAAC,QAAQ,CAAC,eAAe,uBAAgC;IAElE,OAAO,CAAC,QAAQ,CAAC,aAAa,CACwB;IACtD,OAAO,CAAC,QAAQ,CAAC,UAAU,CACgC;IAE3D,SAAS,CAAC,QAAQ,CAAC,QAAQ,8EAGxB;;IAsBH,SAAS,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM;IAI3D,SAAS,CAAC,IAAI,IAAI,IAAI;IAKtB,SAAS,CAAC,IAAI,IAAI,IAAI;yCA3CX,2BAA2B;2CAA3B,2BAA2B;CAgDvC"}
1
+ {"version":3,"file":"prism-variant-ribbon.component.d.ts","sourceRoot":"","sources":["../../../src/app/variant-ribbon/prism-variant-ribbon.component.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;;AAG7E,qBAwJa,2BAA2B;IACtC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAkC;IACpE,SAAS,CAAC,QAAQ,CAAC,eAAe,uBAAgC;IAElE,OAAO,CAAC,QAAQ,CAAC,aAAa,CACwB;IACtD,OAAO,CAAC,QAAQ,CAAC,UAAU,CACgC;IAE3D,SAAS,CAAC,QAAQ,CAAC,QAAQ,8EAGxB;;IAsBH,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE;IAIvD,SAAS,CAAC,IAAI,IAAI,IAAI;IAKtB,SAAS,CAAC,IAAI,IAAI,IAAI;yCA3CX,2BAA2B;2CAA3B,2BAA2B;CAgDvC"}
@@ -2,6 +2,7 @@ import { Component, inject, computed, effect, viewChild, viewChildren, ChangeDet
2
2
  import { PrismIconComponent } from '../icons/prism-icon.component.js';
3
3
  import { PrismNavigationService } from '../services/prism-navigation.service.js';
4
4
  import { PrismRendererService } from '../services/prism-renderer.service.js';
5
+ import { spectrumSlot } from './spectrum.js';
5
6
  import * as i0 from "@angular/core";
6
7
  const _c0 = ["tabsContainer"];
7
8
  const _c1 = ["tabButton"];
@@ -10,22 +11,21 @@ function PrismVariantRibbonComponent_Conditional_0_For_4_Template(rf, ctx) { if
10
11
  const _r2 = i0.ɵɵgetCurrentView();
11
12
  i0.ɵɵelementStart(0, "button", 10, 1);
12
13
  i0.ɵɵlistener("click", function PrismVariantRibbonComponent_Conditional_0_For_4_Template_button_click_0_listener() { const ɵ$index_6_r3 = i0.ɵɵrestoreView(_r2).$index; const ctx_r3 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r3.rendererService.selectVariant(ɵ$index_6_r3)); });
13
- i0.ɵɵelement(2, "span", 11);
14
- i0.ɵɵtext(3);
14
+ i0.ɵɵtext(2);
15
15
  i0.ɵɵelementEnd();
16
16
  } if (rf & 2) {
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("--%NS%vc", ctx_r3.variantColor(v_r5.name, ɵ$index_6_r3));
20
+ i0.ɵɵstyleProp("--%NS%i", ctx_r3.slot(ɵ$index_6_r3).i)("--%NS%n", ctx_r3.slot(ɵ$index_6_r3).n);
21
21
  i0.ɵɵclassProp("v-tab--active", ctx_r3.rendererService.activeVariantIndex() === ɵ$index_6_r3);
22
- i0.ɵɵadvance(3);
22
+ i0.ɵɵadvance(2);
23
23
  i0.ɵɵtextInterpolate1(" ", v_r5.name, " ");
24
24
  } }
25
25
  function PrismVariantRibbonComponent_Conditional_0_Template(rf, ctx) { if (rf & 1) {
26
26
  const _r1 = i0.ɵɵgetCurrentView();
27
27
  i0.ɵɵelementStart(0, "nav", 2)(1, "div", 3, 0);
28
- i0.ɵɵrepeaterCreate(3, PrismVariantRibbonComponent_Conditional_0_For_4_Template, 4, 5, "button", 4, _forTrack0);
28
+ i0.ɵɵrepeaterCreate(3, PrismVariantRibbonComponent_Conditional_0_For_4_Template, 3, 7, "button", 4, _forTrack0);
29
29
  i0.ɵɵelementEnd();
30
30
  i0.ɵɵelementStart(5, "div", 5)(6, "button", 6);
31
31
  i0.ɵɵlistener("click", function PrismVariantRibbonComponent_Conditional_0_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r1); const ctx_r3 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r3.prev()); });
@@ -48,19 +48,6 @@ function PrismVariantRibbonComponent_Conditional_0_Template(rf, ctx) { if (rf &
48
48
  i0.ɵɵadvance();
49
49
  i0.ɵɵproperty("size", 14);
50
50
  } }
51
- function variantColor(name, index) {
52
- const palette = [
53
- '#a78bfa',
54
- '#60a5fa',
55
- '#34d399',
56
- '#fbbf24',
57
- '#f472b6',
58
- '#8476a2',
59
- '#ec4899',
60
- '#06b6d4',
61
- ];
62
- return palette[index % palette.length];
63
- }
64
51
  export class PrismVariantRibbonComponent {
65
52
  navigationService = inject(PrismNavigationService);
66
53
  rendererService = inject(PrismRendererService);
@@ -92,8 +79,8 @@ export class PrismVariantRibbonComponent {
92
79
  }
93
80
  });
94
81
  }
95
- variantColor(name, index) {
96
- return variantColor(name, index);
82
+ slot(index) {
83
+ return spectrumSlot(index, this.variants().length);
97
84
  }
98
85
  prev() {
99
86
  const idx = this.rendererService.activeVariantIndex();
@@ -110,11 +97,11 @@ export class PrismVariantRibbonComponent {
110
97
  i0.ɵɵviewQuerySignal(ctx.tabsContainer, _c0, 5)(ctx.tabButtons, _c1, 5);
111
98
  } if (rf & 2) {
112
99
  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", "--%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) {
100
+ } }, decls: 1, vars: 1, consts: [["tabsContainer", ""], ["tabButton", ""], [1, "variant-ribbon"], [1, "variant-ribbon-tabs"], [1, "v-tab", 3, "v-tab--active", "--%NS%i", "--%NS%n"], [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"]], template: function PrismVariantRibbonComponent_Template(rf, ctx) { if (rf & 1) {
114
101
  i0.ɵɵconditionalCreate(0, PrismVariantRibbonComponent_Conditional_0_Template, 10, 4, "nav", 2);
115
102
  } if (rf & 2) {
116
103
  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(--%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 }"] });
104
+ } }, 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 var(--%NS%sp-5);\n background: var(--%NS%prism-bg);\n border-bottom: 1px solid var(--%NS%prism-border);\n height: var(--%NS%band-rail);\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 \n\n\n .v-tab[_ngcontent-%COMP%]::after {\n content: '';\n position: absolute;\n left: var(--%NS%sp-3);\n right: var(--%NS%sp-3);\n bottom: 0;\n height: 2px;\n border-radius: 2px;\n background: var(--%NS%prism-spectrum);\n background-size: calc(var(--%NS%n) * 100%) 100%;\n background-position: calc(var(--%NS%i) / (var(--%NS%n) - 1) * 100%) 0;\n opacity: 0;\n transition: opacity var(--%NS%dur-fast) var(--%NS%ease-default);\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 .v-tab[_ngcontent-%COMP%]:hover::after { opacity: 0.4; }\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
105
  }
119
106
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(PrismVariantRibbonComponent, [{
120
107
  type: Component,
@@ -127,10 +114,10 @@ export class PrismVariantRibbonComponent {
127
114
  #tabButton
128
115
  class="v-tab"
129
116
  [class.v-tab--active]="rendererService.activeVariantIndex() === i"
130
- [style.--vc]="variantColor(v.name, i)"
117
+ [style.--i]="slot(i).i"
118
+ [style.--n]="slot(i).n"
131
119
  (click)="rendererService.selectVariant(i)"
132
120
  >
133
- <span class="v-dot"></span>
134
121
  {{ v.name }}
135
122
  </button>
136
123
  }
@@ -163,6 +150,6 @@ export class PrismVariantRibbonComponent {
163
150
  </div>
164
151
  </nav>
165
152
  }
166
- `, styles: ["\n :host { display: block; flex-shrink: 0; }\n\n .variant-ribbon {\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 {\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::-webkit-scrollbar { display: none; }\n\n .v-tab {\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::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:hover { color: var(--prism-text-2); }\n .v-tab--active { color: var(--prism-text); }\n .v-tab--active::after { opacity: 1; }\n\n .v-dot {\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 .v-dot {\n opacity: 1;\n box-shadow: 0 0 6px var(--vc);\n }\n\n .variant-ribbon-right {\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 {\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:hover:not(:disabled) {\n color: var(--prism-text);\n background: color-mix(in srgb, var(--prism-primary) 8%, transparent);\n }\n .tool-btn:disabled {\n opacity: 0.3;\n cursor: default;\n }\n\n :focus-visible {\n outline: 2px solid var(--prism-primary);\n outline-offset: 2px;\n }\n "] }]
153
+ `, styles: ["\n :host { display: block; flex-shrink: 0; }\n\n .variant-ribbon {\n display: flex;\n align-items: center;\n padding: 0 var(--sp-5);\n background: var(--prism-bg);\n border-bottom: 1px solid var(--prism-border);\n height: var(--band-rail);\n }\n\n .variant-ribbon-tabs {\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::-webkit-scrollbar { display: none; }\n\n .v-tab {\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 /* Colour as position, not assignment: each tab shows the slice of one\n broken spectrum that corresponds to where it sits in the sequence. Nine\n arbitrary hues used to say nothing at all; this says \"you are here\". */\n .v-tab::after {\n content: '';\n position: absolute;\n left: var(--sp-3);\n right: var(--sp-3);\n bottom: 0;\n height: 2px;\n border-radius: 2px;\n background: var(--prism-spectrum);\n background-size: calc(var(--n) * 100%) 100%;\n background-position: calc(var(--i) / (var(--n) - 1) * 100%) 0;\n opacity: 0;\n transition: opacity var(--dur-fast) var(--ease-default);\n }\n .v-tab:hover { color: var(--prism-text-2); }\n .v-tab--active { color: var(--prism-text); }\n .v-tab--active::after { opacity: 1; }\n .v-tab:hover::after { opacity: 0.4; }\n\n .variant-ribbon-right {\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 {\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:hover:not(:disabled) {\n color: var(--prism-text);\n background: color-mix(in srgb, var(--prism-primary) 8%, transparent);\n }\n .tool-btn:disabled {\n opacity: 0.3;\n cursor: default;\n }\n\n :focus-visible {\n outline: 2px solid var(--prism-primary);\n outline-offset: 2px;\n }\n "] }]
167
154
  }], () => [], { tabsContainer: [{ type: i0.ViewChild, args: ['tabsContainer', { isSignal: true }] }], tabButtons: [{ type: i0.ViewChildren, args: ['tabButton', { isSignal: true }] }] }); })();
168
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(PrismVariantRibbonComponent, { className: "PrismVariantRibbonComponent", filePath: "app/variant-ribbon/prism-variant-ribbon.component.ts", lineNumber: 187 }); })();
155
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(PrismVariantRibbonComponent, { className: "PrismVariantRibbonComponent", filePath: "app/variant-ribbon/prism-variant-ribbon.component.ts", lineNumber: 168 }); })();