@ng-prism/plugin-visual-regression 22.2.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/README.md +106 -0
  2. package/dist/asset-url.d.ts +14 -0
  3. package/dist/asset-url.d.ts.map +1 -0
  4. package/dist/asset-url.js +25 -0
  5. package/dist/index.browser.d.ts +7 -0
  6. package/dist/index.browser.d.ts.map +1 -0
  7. package/dist/index.browser.js +8 -0
  8. package/dist/index.d.ts +7 -0
  9. package/dist/index.d.ts.map +1 -0
  10. package/dist/index.js +5 -0
  11. package/dist/report-reader.d.ts +18 -0
  12. package/dist/report-reader.d.ts.map +1 -0
  13. package/dist/report-reader.js +55 -0
  14. package/dist/schematics/ng-add/index.d.ts +4 -0
  15. package/dist/schematics/ng-add/index.d.ts.map +1 -0
  16. package/dist/schematics/ng-add/index.js +25 -0
  17. package/dist/schematics/ng-add/schema.d.ts +4 -0
  18. package/dist/schematics/ng-add/schema.d.ts.map +1 -0
  19. package/dist/schematics/ng-add/schema.js +1 -0
  20. package/dist/thresholds.d.ts +16 -0
  21. package/dist/thresholds.d.ts.map +1 -0
  22. package/dist/thresholds.js +20 -0
  23. package/dist/visual-regression-header-badge.component.d.ts +14 -0
  24. package/dist/visual-regression-header-badge.component.d.ts.map +1 -0
  25. package/dist/visual-regression-header-badge.component.js +73 -0
  26. package/dist/visual-regression-panel.component.d.ts +22 -0
  27. package/dist/visual-regression-panel.component.d.ts.map +1 -0
  28. package/dist/visual-regression-panel.component.js +191 -0
  29. package/dist/visual-regression-plugin.browser.d.ts +11 -0
  30. package/dist/visual-regression-plugin.browser.d.ts.map +1 -0
  31. package/dist/visual-regression-plugin.browser.js +34 -0
  32. package/dist/visual-regression-plugin.d.ts +11 -0
  33. package/dist/visual-regression-plugin.d.ts.map +1 -0
  34. package/dist/visual-regression-plugin.js +67 -0
  35. package/dist/visual-regression.types.d.ts +97 -0
  36. package/dist/visual-regression.types.d.ts.map +1 -0
  37. package/dist/visual-regression.types.js +1 -0
  38. package/dist/vrt-bg.d.ts +37 -0
  39. package/dist/vrt-bg.d.ts.map +1 -0
  40. package/dist/vrt-bg.js +53 -0
  41. package/dist/vrt-compare.component.d.ts +70 -0
  42. package/dist/vrt-compare.component.d.ts.map +1 -0
  43. package/dist/vrt-compare.component.js +602 -0
  44. package/dist/vrt-summarize.d.ts +48 -0
  45. package/dist/vrt-summarize.d.ts.map +1 -0
  46. package/dist/vrt-summarize.js +97 -0
  47. package/dist/vrt-summary.component.d.ts +17 -0
  48. package/dist/vrt-summary.component.d.ts.map +1 -0
  49. package/dist/vrt-summary.component.js +67 -0
  50. package/dist/vrt-zoom.d.ts +36 -0
  51. package/dist/vrt-zoom.d.ts.map +1 -0
  52. package/dist/vrt-zoom.js +48 -0
  53. package/package.json +54 -0
  54. package/schematics/collection.json +10 -0
  55. package/schematics/ng-add/schema.json +16 -0
@@ -0,0 +1,191 @@
1
+ import { ChangeDetectionStrategy, Component, computed, input, signal, } from '@angular/core';
2
+ import { VrtCompareComponent } from './vrt-compare.component.js';
3
+ import { VrtSummaryComponent } from './vrt-summary.component.js';
4
+ import { formatPercent, STATUS_LABEL, STATUS_TONE, summarize, } from './vrt-summarize.js';
5
+ import * as i0 from "@angular/core";
6
+ const _forTrack0 = ($index, $item) => $item.key;
7
+ function VisualRegressionPanelComponent_Conditional_0_Conditional_0_For_6_Template(rf, ctx) { if (rf & 1) {
8
+ const _r1 = i0.ɵɵgetCurrentView();
9
+ i0.ɵɵelementStart(0, "li")(1, "button", 8);
10
+ i0.ɵɵlistener("click", function VisualRegressionPanelComponent_Conditional_0_Conditional_0_For_6_Template_button_click_1_listener() { const row_r2 = i0.ɵɵrestoreView(_r1).$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.selectedKey.set(row_r2.key)); });
11
+ i0.ɵɵelementStart(2, "span", 9);
12
+ i0.ɵɵtext(3);
13
+ i0.ɵɵelementEnd();
14
+ i0.ɵɵelementStart(4, "span", 10);
15
+ i0.ɵɵtext(5);
16
+ i0.ɵɵelementEnd();
17
+ i0.ɵɵelementStart(6, "span", 11);
18
+ i0.ɵɵtext(7);
19
+ i0.ɵɵelementEnd()()();
20
+ } if (rf & 2) {
21
+ const row_r2 = ctx.$implicit;
22
+ const ctx_r2 = i0.ɵɵnextContext(3);
23
+ i0.ɵɵadvance();
24
+ i0.ɵɵclassProp("vrt__row--active", row_r2.variant === ctx_r2.selected());
25
+ i0.ɵɵattribute("data-tone", row_r2.tone);
26
+ i0.ɵɵadvance(2);
27
+ i0.ɵɵtextInterpolate(row_r2.label);
28
+ i0.ɵɵadvance(2);
29
+ i0.ɵɵtextInterpolate(row_r2.statusLabel);
30
+ i0.ɵɵadvance(2);
31
+ i0.ɵɵtextInterpolate(row_r2.diffLabel);
32
+ } }
33
+ function VisualRegressionPanelComponent_Conditional_0_Conditional_0_Conditional_8_Template(rf, ctx) { if (rf & 1) {
34
+ i0.ɵɵelement(0, "prism-vrt-compare", 7);
35
+ } if (rf & 2) {
36
+ const ctx_r2 = i0.ɵɵnextContext(3);
37
+ i0.ɵɵproperty("variant", ctx)("assetBaseUrl", ctx_r2.assetBaseUrl());
38
+ } }
39
+ function VisualRegressionPanelComponent_Conditional_0_Conditional_0_Conditional_9_Template(rf, ctx) { if (rf & 1) {
40
+ i0.ɵɵelementStart(0, "p", 0);
41
+ i0.ɵɵtext(1, "Select a variant.");
42
+ i0.ɵɵelementEnd();
43
+ } }
44
+ function VisualRegressionPanelComponent_Conditional_0_Conditional_0_Template(rf, ctx) { if (rf & 1) {
45
+ i0.ɵɵelementStart(0, "div", 1)(1, "div", 2);
46
+ i0.ɵɵelement(2, "prism-vrt-summary", 3);
47
+ i0.ɵɵelementEnd();
48
+ i0.ɵɵelementStart(3, "div", 4)(4, "ul", 5);
49
+ i0.ɵɵrepeaterCreate(5, VisualRegressionPanelComponent_Conditional_0_Conditional_0_For_6_Template, 8, 6, "li", null, _forTrack0);
50
+ i0.ɵɵelementEnd();
51
+ i0.ɵɵelementStart(7, "div", 6);
52
+ i0.ɵɵconditionalCreate(8, VisualRegressionPanelComponent_Conditional_0_Conditional_0_Conditional_8_Template, 1, 2, "prism-vrt-compare", 7)(9, VisualRegressionPanelComponent_Conditional_0_Conditional_0_Conditional_9_Template, 2, 0, "p", 0);
53
+ i0.ɵɵelementEnd()()();
54
+ } if (rf & 2) {
55
+ let tmp_5_0;
56
+ const ctx_r2 = i0.ɵɵnextContext(2);
57
+ i0.ɵɵadvance(2);
58
+ i0.ɵɵproperty("summary", ctx_r2.summary());
59
+ i0.ɵɵadvance(3);
60
+ i0.ɵɵrepeater(ctx_r2.rows());
61
+ i0.ɵɵadvance(3);
62
+ i0.ɵɵconditional((tmp_5_0 = ctx_r2.selected()) ? 8 : 9, tmp_5_0);
63
+ } }
64
+ function VisualRegressionPanelComponent_Conditional_0_Conditional_1_Template(rf, ctx) { if (rf & 1) {
65
+ i0.ɵɵelementStart(0, "div", 0)(1, "b");
66
+ i0.ɵɵtext(2, "No visual regression results for this component.");
67
+ i0.ɵɵelementEnd();
68
+ i0.ɵɵelementStart(3, "span");
69
+ i0.ɵɵtext(4, "Run your screenshot runner and rebuild the styleguide.");
70
+ i0.ɵɵelementEnd()();
71
+ } }
72
+ function VisualRegressionPanelComponent_Conditional_0_Template(rf, ctx) { if (rf & 1) {
73
+ i0.ɵɵconditionalCreate(0, VisualRegressionPanelComponent_Conditional_0_Conditional_0_Template, 10, 2, "div", 1)(1, VisualRegressionPanelComponent_Conditional_0_Conditional_1_Template, 5, 0, "div", 0);
74
+ } if (rf & 2) {
75
+ i0.ɵɵconditional(ctx.found ? 0 : 1);
76
+ } }
77
+ function VisualRegressionPanelComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
78
+ i0.ɵɵelementStart(0, "div", 0)(1, "b");
79
+ i0.ɵɵtext(2, "No visual regression report loaded.");
80
+ i0.ɵɵelementEnd();
81
+ i0.ɵɵelementStart(3, "span");
82
+ i0.ɵɵtext(4, "Check the plugin's ");
83
+ i0.ɵɵelementStart(5, "code");
84
+ i0.ɵɵtext(6, "reportPath");
85
+ i0.ɵɵelementEnd();
86
+ i0.ɵɵtext(7, ".");
87
+ i0.ɵɵelementEnd()();
88
+ } }
89
+ export class VisualRegressionPanelComponent {
90
+ activeComponent = input(null, /* @ts-ignore */
91
+ ...(ngDevMode ? [{ debugName: "activeComponent" }] : /* istanbul ignore next */ []));
92
+ selectedKey = signal(null, /* @ts-ignore */
93
+ ...(ngDevMode ? [{ debugName: "selectedKey" }] : /* istanbul ignore next */ []));
94
+ meta = computed(() => {
95
+ const comp = this.activeComponent();
96
+ return (comp?.meta?.showcaseConfig?.meta?.['visualRegression'] ?? null);
97
+ }, /* @ts-ignore */
98
+ ...(ngDevMode ? [{ debugName: "meta" }] : /* istanbul ignore next */ []));
99
+ assetBaseUrl = computed(() => this.meta()?.assetBaseUrl ?? '', /* @ts-ignore */
100
+ ...(ngDevMode ? [{ debugName: "assetBaseUrl" }] : /* istanbul ignore next */ []));
101
+ variants = computed(() => this.meta()?.variants ?? [], /* @ts-ignore */
102
+ ...(ngDevMode ? [{ debugName: "variants" }] : /* istanbul ignore next */ []));
103
+ summary = computed(() => summarize(this.variants()), /* @ts-ignore */
104
+ ...(ngDevMode ? [{ debugName: "summary" }] : /* istanbul ignore next */ []));
105
+ rows = computed(() => this.variants().map((variant) => ({
106
+ key: `${variant.className}:${variant.variantIndex}`,
107
+ variant,
108
+ label: variant.variantName ??
109
+ variant.title ??
110
+ `Variant ${variant.variantIndex}`,
111
+ statusLabel: STATUS_LABEL[variant.status] ?? variant.status,
112
+ tone: STATUS_TONE[variant.status] ?? 'muted',
113
+ diffLabel: formatDiff(variant),
114
+ })), /* @ts-ignore */
115
+ ...(ngDevMode ? [{ debugName: "rows" }] : /* istanbul ignore next */ []));
116
+ selected = computed(() => {
117
+ const rows = this.rows();
118
+ if (!rows.length)
119
+ return null;
120
+ const key = this.selectedKey();
121
+ // Default to the first variant that actually changed — that is what someone
122
+ // opening this panel came to look at.
123
+ return (rows.find((r) => r.key === key)?.variant ??
124
+ rows.find((r) => r.variant.status === 'changed')?.variant ??
125
+ rows[0].variant);
126
+ }, /* @ts-ignore */
127
+ ...(ngDevMode ? [{ debugName: "selected" }] : /* istanbul ignore next */ []));
128
+ static ɵfac = function VisualRegressionPanelComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || VisualRegressionPanelComponent)(); };
129
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: VisualRegressionPanelComponent, selectors: [["prism-visual-regression-panel"]], inputs: { activeComponent: [1, "activeComponent"] }, decls: 2, vars: 1, consts: [[1, "vrt__empty"], [1, "vrt"], [1, "vrt__summary"], [3, "summary"], [1, "vrt__split"], [1, "vrt__list"], [1, "vrt__viewer"], [3, "variant", "assetBaseUrl"], ["type", "button", 1, "vrt__row", 3, "click"], [1, "vrt__name"], [1, "vrt__status"], [1, "vrt__diff"]], template: function VisualRegressionPanelComponent_Template(rf, ctx) { if (rf & 1) {
130
+ i0.ɵɵconditionalCreate(0, VisualRegressionPanelComponent_Conditional_0_Template, 2, 1)(1, VisualRegressionPanelComponent_Conditional_1_Template, 8, 0, "div", 0);
131
+ } if (rf & 2) {
132
+ let tmp_0_0;
133
+ i0.ɵɵconditional((tmp_0_0 = ctx.meta()) ? 0 : 1, tmp_0_0);
134
+ } }, dependencies: [VrtCompareComponent, VrtSummaryComponent], styles: ["[_nghost-%COMP%] {\n display: block;\n height: 100%;\n overflow: auto;\n font-size: var(--fs-md);\n color: var(--prism-text);\n }\n\n .vrt[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n min-height: 100%;\n }\n\n .vrt__summary[_ngcontent-%COMP%] { padding: 14px 16px 0; }\n\n .vrt__split[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: minmax(200px, 250px) 1fr;\n flex: 1;\n min-height: 0;\n padding-top: 14px;\n }\n\n .vrt__list[_ngcontent-%COMP%] {\n margin: 0;\n padding: 0 4px 14px 16px;\n list-style: none;\n display: flex;\n flex-direction: column;\n gap: 6px;\n min-width: 0;\n }\n\n \n\n .vrt__row[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: 1fr auto;\n grid-template-areas: 'name diff' 'status diff';\n align-items: center;\n gap: 0 10px;\n width: 100%;\n padding: 8px 11px;\n background: var(--prism-bg-surface);\n border: 1px solid var(--prism-border);\n border-left: 3px solid var(--tone-color, var(--prism-border-strong));\n border-radius: var(--radius-md);\n color: inherit;\n font: inherit;\n text-align: left;\n cursor: pointer;\n transition: border-color var(--dur-fast), background var(--dur-fast);\n }\n .vrt__row[_ngcontent-%COMP%]:hover { border-color: var(--prism-border-strong); }\n .vrt__row[_ngcontent-%COMP%]:hover { border-left-color: var(--tone-color, var(--prism-border-strong)); }\n .vrt__row--active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--prism-primary) 10%, var(--prism-bg-surface));\n border-color: color-mix(in srgb, var(--prism-primary) 40%, transparent);\n border-left-color: var(--tone-color, var(--prism-primary));\n }\n\n .vrt__name[_ngcontent-%COMP%] {\n grid-area: name;\n font-weight: 600;\n font-size: var(--fs-md);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .vrt__status[_ngcontent-%COMP%] {\n grid-area: status;\n justify-self: start;\n margin-top: 3px;\n font-family: var(--font-mono);\n font-size: 9.5px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n padding: 2px 6px;\n border-radius: var(--radius-xs);\n background: color-mix(in srgb, var(--tone-color) 15%, transparent);\n color: var(--tone-color);\n }\n\n .vrt__diff[_ngcontent-%COMP%] {\n grid-area: diff;\n font-family: var(--font-mono);\n font-size: var(--fs-sm);\n color: var(--prism-text-muted);\n white-space: nowrap;\n }\n\n [data-tone='success'][_ngcontent-%COMP%] { --tone-color: var(--prism-success); }\n [data-tone='danger'][_ngcontent-%COMP%] { --tone-color: var(--prism-danger); }\n [data-tone='warn'][_ngcontent-%COMP%] { --tone-color: var(--prism-warn); }\n [data-tone='neutral'][_ngcontent-%COMP%] { --tone-color: var(--prism-primary); }\n [data-tone='muted'][_ngcontent-%COMP%] { --tone-color: var(--prism-text-muted); }\n\n .vrt__viewer[_ngcontent-%COMP%] {\n min-width: 0;\n min-height: 0;\n border-left: 1px solid var(--prism-border);\n }\n\n .vrt__empty[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 4px;\n min-height: 140px;\n padding: 24px;\n text-align: center;\n font-size: var(--fs-md);\n }\n .vrt__empty[_ngcontent-%COMP%] b[_ngcontent-%COMP%] { font-weight: 600; color: var(--prism-text-2); }\n .vrt__empty[_ngcontent-%COMP%] span[_ngcontent-%COMP%] { color: var(--prism-text-muted); }\n .vrt__empty[_ngcontent-%COMP%] code[_ngcontent-%COMP%] {\n font-family: var(--font-mono);\n font-size: var(--fs-sm);\n padding: 1px 5px;\n border-radius: var(--radius-xs);\n background: var(--prism-input-bg);\n }\n\n @media (max-width: 860px) {\n .vrt__split[_ngcontent-%COMP%] { grid-template-columns: 1fr; }\n .vrt__list[_ngcontent-%COMP%] { padding-right: 16px; }\n .vrt__viewer[_ngcontent-%COMP%] { border-left: none; border-top: 1px solid var(--prism-border); }\n }"] });
135
+ }
136
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(VisualRegressionPanelComponent, [{
137
+ type: Component,
138
+ args: [{ selector: 'prism-visual-regression-panel', standalone: true, imports: [VrtCompareComponent, VrtSummaryComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: `
139
+ @if (meta(); as m) { @if (m.found) {
140
+ <div class="vrt">
141
+ <div class="vrt__summary">
142
+ <prism-vrt-summary [summary]="summary()" />
143
+ </div>
144
+
145
+ <div class="vrt__split">
146
+ <ul class="vrt__list">
147
+ @for (row of rows(); track row.key) {
148
+ <li>
149
+ <button
150
+ type="button"
151
+ class="vrt__row"
152
+ [attr.data-tone]="row.tone"
153
+ [class.vrt__row--active]="row.variant === selected()"
154
+ (click)="selectedKey.set(row.key)"
155
+ >
156
+ <span class="vrt__name">{{ row.label }}</span>
157
+ <span class="vrt__status">{{ row.statusLabel }}</span>
158
+ <span class="vrt__diff">{{ row.diffLabel }}</span>
159
+ </button>
160
+ </li>
161
+ }
162
+ </ul>
163
+
164
+ <div class="vrt__viewer">
165
+ @if (selected(); as v) {
166
+ <prism-vrt-compare [variant]="v" [assetBaseUrl]="assetBaseUrl()" />
167
+ } @else {
168
+ <p class="vrt__empty">Select a variant.</p>
169
+ }
170
+ </div>
171
+ </div>
172
+ </div>
173
+ } @else {
174
+ <div class="vrt__empty">
175
+ <b>No visual regression results for this component.</b>
176
+ <span>Run your screenshot runner and rebuild the styleguide.</span>
177
+ </div>
178
+ } } @else {
179
+ <div class="vrt__empty">
180
+ <b>No visual regression report loaded.</b>
181
+ <span>Check the plugin's <code>reportPath</code>.</span>
182
+ </div>
183
+ }
184
+ `, styles: ["\n :host {\n display: block;\n height: 100%;\n overflow: auto;\n font-size: var(--fs-md);\n color: var(--prism-text);\n }\n\n .vrt {\n display: flex;\n flex-direction: column;\n min-height: 100%;\n }\n\n .vrt__summary { padding: 14px 16px 0; }\n\n .vrt__split {\n display: grid;\n grid-template-columns: minmax(200px, 250px) 1fr;\n flex: 1;\n min-height: 0;\n padding-top: 14px;\n }\n\n .vrt__list {\n margin: 0;\n padding: 0 4px 14px 16px;\n list-style: none;\n display: flex;\n flex-direction: column;\n gap: 6px;\n min-width: 0;\n }\n\n /* Same card-with-severity-edge as the a11y violations list, so the two\n panels read as one product. */\n .vrt__row {\n display: grid;\n grid-template-columns: 1fr auto;\n grid-template-areas: 'name diff' 'status diff';\n align-items: center;\n gap: 0 10px;\n width: 100%;\n padding: 8px 11px;\n background: var(--prism-bg-surface);\n border: 1px solid var(--prism-border);\n border-left: 3px solid var(--tone-color, var(--prism-border-strong));\n border-radius: var(--radius-md);\n color: inherit;\n font: inherit;\n text-align: left;\n cursor: pointer;\n transition: border-color var(--dur-fast), background var(--dur-fast);\n }\n .vrt__row:hover { border-color: var(--prism-border-strong); }\n .vrt__row:hover { border-left-color: var(--tone-color, var(--prism-border-strong)); }\n .vrt__row--active {\n background: color-mix(in srgb, var(--prism-primary) 10%, var(--prism-bg-surface));\n border-color: color-mix(in srgb, var(--prism-primary) 40%, transparent);\n border-left-color: var(--tone-color, var(--prism-primary));\n }\n\n .vrt__name {\n grid-area: name;\n font-weight: 600;\n font-size: var(--fs-md);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .vrt__status {\n grid-area: status;\n justify-self: start;\n margin-top: 3px;\n font-family: var(--font-mono);\n font-size: 9.5px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n padding: 2px 6px;\n border-radius: var(--radius-xs);\n background: color-mix(in srgb, var(--tone-color) 15%, transparent);\n color: var(--tone-color);\n }\n\n .vrt__diff {\n grid-area: diff;\n font-family: var(--font-mono);\n font-size: var(--fs-sm);\n color: var(--prism-text-muted);\n white-space: nowrap;\n }\n\n [data-tone='success'] { --tone-color: var(--prism-success); }\n [data-tone='danger'] { --tone-color: var(--prism-danger); }\n [data-tone='warn'] { --tone-color: var(--prism-warn); }\n [data-tone='neutral'] { --tone-color: var(--prism-primary); }\n [data-tone='muted'] { --tone-color: var(--prism-text-muted); }\n\n .vrt__viewer {\n min-width: 0;\n min-height: 0;\n border-left: 1px solid var(--prism-border);\n }\n\n .vrt__empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 4px;\n min-height: 140px;\n padding: 24px;\n text-align: center;\n font-size: var(--fs-md);\n }\n .vrt__empty b { font-weight: 600; color: var(--prism-text-2); }\n .vrt__empty span { color: var(--prism-text-muted); }\n .vrt__empty code {\n font-family: var(--font-mono);\n font-size: var(--fs-sm);\n padding: 1px 5px;\n border-radius: var(--radius-xs);\n background: var(--prism-input-bg);\n }\n\n @media (max-width: 860px) {\n .vrt__split { grid-template-columns: 1fr; }\n .vrt__list { padding-right: 16px; }\n .vrt__viewer { border-left: none; border-top: 1px solid var(--prism-border); }\n }\n "] }]
185
+ }], null, { activeComponent: [{ type: i0.Input, args: [{ isSignal: true, alias: "activeComponent", required: false }] }] }); })();
186
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(VisualRegressionPanelComponent, { className: "VisualRegressionPanelComponent", filePath: "visual-regression-panel.component.ts", lineNumber: 208 }); })();
187
+ function formatDiff(variant) {
188
+ if (variant.diffRatio === undefined)
189
+ return '—';
190
+ return formatPercent(variant.diffRatio);
191
+ }
@@ -0,0 +1,11 @@
1
+ import type { NgPrismPlugin } from '@ng-prism/core/plugin';
2
+ import type { VisualRegressionPluginOptions } from './visual-regression.types.js';
3
+ /**
4
+ * Browser-safe twin of {@link visualRegressionPlugin}.
5
+ *
6
+ * The config is loaded in Node.js by the builder *and* in the browser by the
7
+ * Prism app. Only the runtime contributions survive here — the build-time hooks
8
+ * read the report from disk and must not be reachable from a browser bundle.
9
+ */
10
+ export declare function visualRegressionPlugin(_options?: VisualRegressionPluginOptions): NgPrismPlugin;
11
+ //# sourceMappingURL=visual-regression-plugin.browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"visual-regression-plugin.browser.d.ts","sourceRoot":"","sources":["../src/visual-regression-plugin.browser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAoB,MAAM,uBAAuB,CAAC;AAC7E,OAAO,KAAK,EACV,6BAA6B,EAE9B,MAAM,8BAA8B,CAAC;AAStC;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,CAAC,EAAE,6BAA6B,GACvC,aAAa,CA4Bf"}
@@ -0,0 +1,34 @@
1
+ function hasResults(component) {
2
+ const meta = component.meta?.showcaseConfig?.meta?.['visualRegression'];
3
+ return Boolean(meta?.found && meta.variants.length > 0);
4
+ }
5
+ /**
6
+ * Browser-safe twin of {@link visualRegressionPlugin}.
7
+ *
8
+ * The config is loaded in Node.js by the builder *and* in the browser by the
9
+ * Prism app. Only the runtime contributions survive here — the build-time hooks
10
+ * read the report from disk and must not be reachable from a browser bundle.
11
+ */
12
+ export function visualRegressionPlugin(_options) {
13
+ return {
14
+ name: '@ng-prism/plugin-visual-regression',
15
+ panels: [
16
+ {
17
+ id: 'visual-regression',
18
+ label: 'Visual Regression',
19
+ icon: 'camera',
20
+ position: 'bottom',
21
+ isVisible: hasResults,
22
+ loadComponent: () => import('./visual-regression-panel.component.js').then((m) => m.VisualRegressionPanelComponent),
23
+ },
24
+ ],
25
+ headerWidgets: [
26
+ {
27
+ id: 'visual-regression-total',
28
+ placement: 'end',
29
+ order: -10,
30
+ loadComponent: () => import('./visual-regression-header-badge.component.js').then((m) => m.VisualRegressionHeaderBadgeComponent),
31
+ },
32
+ ],
33
+ };
34
+ }
@@ -0,0 +1,11 @@
1
+ import type { NgPrismPlugin } from '@ng-prism/core/plugin';
2
+ import type { VisualRegressionPluginOptions } from './visual-regression.types.js';
3
+ /**
4
+ * Renders a visual regression report produced by an external runner.
5
+ *
6
+ * The plugin performs no image comparison of its own — that belongs to the
7
+ * runner, which owns the baselines and the pinned container. See
8
+ * `docs/guide/visual-regression.md`.
9
+ */
10
+ export declare function visualRegressionPlugin(options?: VisualRegressionPluginOptions): NgPrismPlugin;
11
+ //# sourceMappingURL=visual-regression-plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"visual-regression-plugin.d.ts","sourceRoot":"","sources":["../src/visual-regression-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAoB,MAAM,uBAAuB,CAAC;AAC7E,OAAO,KAAK,EACV,6BAA6B,EAE9B,MAAM,8BAA8B,CAAC;AAatC;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,CAAC,EAAE,6BAA6B,GACtC,aAAa,CAqEf"}
@@ -0,0 +1,67 @@
1
+ import { resolveVrtThresholds } from './thresholds.js';
2
+ const DEFAULT_REPORT_PATH = 'vrt-report.json';
3
+ /** True when the plugin recorded at least one result for this component. */
4
+ function hasResults(component) {
5
+ const meta = component.meta?.showcaseConfig?.meta?.['visualRegression'];
6
+ return Boolean(meta?.found && meta.variants.length > 0);
7
+ }
8
+ /**
9
+ * Renders a visual regression report produced by an external runner.
10
+ *
11
+ * The plugin performs no image comparison of its own — that belongs to the
12
+ * runner, which owns the baselines and the pinned container. See
13
+ * `docs/guide/visual-regression.md`.
14
+ */
15
+ export function visualRegressionPlugin(options) {
16
+ const reportPath = options?.reportPath ?? DEFAULT_REPORT_PATH;
17
+ const assetBaseUrl = options?.assetBaseUrl ?? '';
18
+ const thresholds = resolveVrtThresholds(options?.thresholds);
19
+ return {
20
+ name: '@ng-prism/plugin-visual-regression',
21
+ async onComponentScanned(component) {
22
+ const { readVariantsForComponent } = await import('./report-reader.js');
23
+ const variants = readVariantsForComponent(reportPath, component.className);
24
+ const meta = {
25
+ found: variants.length > 0,
26
+ variants,
27
+ assetBaseUrl,
28
+ };
29
+ return {
30
+ ...component,
31
+ showcaseConfig: {
32
+ ...component.showcaseConfig,
33
+ meta: { ...component.showcaseConfig.meta, visualRegression: meta },
34
+ },
35
+ };
36
+ },
37
+ async onManifestReady(manifest) {
38
+ const { readTotals } = await import('./report-reader.js');
39
+ const total = readTotals(reportPath);
40
+ return {
41
+ ...manifest,
42
+ meta: {
43
+ ...manifest.meta,
44
+ visualRegression: { found: total !== null, total, thresholds },
45
+ },
46
+ };
47
+ },
48
+ panels: [
49
+ {
50
+ id: 'visual-regression',
51
+ label: 'Visual Regression',
52
+ icon: 'camera',
53
+ position: 'bottom',
54
+ isVisible: hasResults,
55
+ loadComponent: () => import('./visual-regression-panel.component.js').then((m) => m.VisualRegressionPanelComponent),
56
+ },
57
+ ],
58
+ headerWidgets: [
59
+ {
60
+ id: 'visual-regression-total',
61
+ placement: 'end',
62
+ order: -10,
63
+ loadComponent: () => import('./visual-regression-header-badge.component.js').then((m) => m.VisualRegressionHeaderBadgeComponent),
64
+ },
65
+ ],
66
+ };
67
+ }
@@ -0,0 +1,97 @@
1
+ import type { CanvasBg } from '@ng-prism/core/plugin';
2
+ /**
3
+ * Outcome of comparing one rendered variant against its baseline.
4
+ *
5
+ * `new` and `excluded` are deliberately not failures. A variant with no
6
+ * baseline has nothing to regress against, and an excluded one was never
7
+ * captured — a runner that does not fail its build on either must not be
8
+ * contradicted by the UI.
9
+ *
10
+ * `excluded` exists because some variants cannot be captured meaningfully: a
11
+ * tooltip that only renders on hover would be screenshotted as its trigger. A
12
+ * runner reports them instead of dropping them silently, so the list of skipped
13
+ * variants stays visible rather than quietly shrinking coverage.
14
+ */
15
+ export type VrtStatus = 'unchanged' | 'changed' | 'size-mismatch' | 'new' | 'excluded';
16
+ export interface VrtVariantResult {
17
+ className: string;
18
+ title?: string;
19
+ variantName?: string;
20
+ variantIndex: number;
21
+ status: VrtStatus;
22
+ width?: number;
23
+ height?: number;
24
+ diffPixels?: number;
25
+ totalPixels?: number;
26
+ /** Changed pixels as a fraction of the total, e.g. `0.5` for 50%. */
27
+ diffRatio?: number;
28
+ baselinePath?: string;
29
+ /** The image captured on this run. Optional — the panel degrades without it. */
30
+ currentPath?: string;
31
+ diffPath?: string;
32
+ /**
33
+ * The canvas background this run captured on — `DiscoveryVariant.bg` from
34
+ * `__PRISM_MANIFEST__`, which the runner already read to drive the app.
35
+ *
36
+ * Recording it makes the report self-describing: a stored baseline no longer
37
+ * silently forgets which surface it was judged against.
38
+ */
39
+ bg?: CanvasBg;
40
+ /**
41
+ * The background the *stored baseline* was captured on, when the runner
42
+ * tracks it alongside the baseline image.
43
+ *
44
+ * The one thing that turns an unexplained 100% diff into a named cause: a
45
+ * variant whose `bg` moved is compared against a baseline on the old
46
+ * surface, so every pixel differs while the component is untouched. `bg`
47
+ * alone cannot show that — it only describes the current run.
48
+ */
49
+ baselineBg?: CanvasBg;
50
+ /** Why a variant was excluded. Runners are expected to justify each one. */
51
+ reason?: string;
52
+ }
53
+ export interface VrtTotals {
54
+ auditedVariants: number;
55
+ auditedComponents: number;
56
+ unchanged: number;
57
+ changed: number;
58
+ sizeMismatch: number;
59
+ new: number;
60
+ /** Optional — older runners and runners without an exclusion list omit it. */
61
+ excluded?: number;
62
+ maxDiffRatio: number;
63
+ /** Percent of comparable variants that are unchanged. */
64
+ score: number;
65
+ }
66
+ /** The JSON document an external runner writes. */
67
+ export interface VrtReport {
68
+ total: VrtTotals;
69
+ byVariant: VrtVariantResult[];
70
+ }
71
+ export interface VrtThresholds {
72
+ /** Minimum score before the header badge stops being green. */
73
+ score: number;
74
+ }
75
+ export interface VisualRegressionPluginOptions {
76
+ /** Path to the report JSON, relative to the workspace root. */
77
+ reportPath?: string;
78
+ /**
79
+ * Prefix applied to the image paths recorded in the report so they resolve
80
+ * against the served styleguide. No layout is assumed.
81
+ */
82
+ assetBaseUrl?: string;
83
+ thresholds?: number | Partial<VrtThresholds>;
84
+ }
85
+ /** Shape stored under `showcaseConfig.meta.visualRegression`. */
86
+ export interface VrtComponentMeta {
87
+ found: boolean;
88
+ variants: VrtVariantResult[];
89
+ assetBaseUrl: string;
90
+ }
91
+ /** Shape stored under `manifest.meta.visualRegression`. */
92
+ export interface VrtManifestMeta {
93
+ found: boolean;
94
+ total: VrtTotals | null;
95
+ thresholds: VrtThresholds;
96
+ }
97
+ //# sourceMappingURL=visual-regression.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"visual-regression.types.d.ts","sourceRoot":"","sources":["../src/visual-regression.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEtD;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,SAAS,GACjB,WAAW,GACX,SAAS,GACT,eAAe,GACf,KAAK,GACL,UAAU,CAAC;AAEf,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,SAAS,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qEAAqE;IACrE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gFAAgF;IAChF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;;OAMG;IACH,EAAE,CAAC,EAAE,QAAQ,CAAC;IACd;;;;;;;;OAQG;IACH,UAAU,CAAC,EAAE,QAAQ,CAAC;IACtB,4EAA4E;IAC5E,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,SAAS;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,yDAAyD;IACzD,KAAK,EAAE,MAAM,CAAC;CACf;AAED,mDAAmD;AACnD,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,SAAS,CAAC;IACjB,SAAS,EAAE,gBAAgB,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,aAAa;IAC5B,+DAA+D;IAC/D,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,6BAA6B;IAC5C,+DAA+D;IAC/D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;CAC9C;AAED,iEAAiE;AACjE,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,2DAA2D;AAC3D,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,SAAS,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,aAAa,CAAC;CAC3B"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,37 @@
1
+ import type { CanvasBg } from '@ng-prism/core/plugin';
2
+ import type { VrtVariantResult } from './visual-regression.types.js';
3
+ /**
4
+ * Background declarations for the box that holds a capture.
5
+ *
6
+ * The captures themselves are opaque, so this is mostly invisible — except
7
+ * under a diff mask, where the unchanged pixels a comparator leaves
8
+ * transparent let it through. There the surface decides whether a diff reads
9
+ * as a diff or as a chequered mess.
10
+ *
11
+ * Only `light` and `dark` produce a colour. `dots`, `plain` and `checker` all
12
+ * paint `--prism-bg-surface`, a *theme* token, and the panel cannot know which
13
+ * theme the runner's browser ran in — so those keep the checkerboard, which
14
+ * reads as "transparent" rather than as a guess painted as fact. For `checker`
15
+ * that is also the literal rendering, and since it is what an undeclared
16
+ * variant resolves to, an undeclared capture frames itself correctly. Same for
17
+ * a report that recorded no background at all.
18
+ */
19
+ export declare function shotSurfaceStyle(bg: CanvasBg | undefined): Record<string, string>;
20
+ /**
21
+ * The background move between the baseline and this run, or `null`.
22
+ *
23
+ * A variant whose declared `bg` changed compares a capture on one surface
24
+ * against a baseline on another, which is a 100%-different image with an
25
+ * innocent component in it. Naming the move is the difference between a
26
+ * reviewer re-recording a baseline and a reviewer hunting a regression that
27
+ * was never there.
28
+ *
29
+ * Needs both values, and only the runner can supply them: `bg` is what this
30
+ * run captured on, `baselineBg` what the stored baseline was captured on.
31
+ * Runners that do not track the second simply get no note.
32
+ */
33
+ export declare function bgChange(variant: VrtVariantResult): {
34
+ from: CanvasBg;
35
+ to: CanvasBg;
36
+ } | null;
37
+ //# sourceMappingURL=vrt-bg.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vrt-bg.d.ts","sourceRoot":"","sources":["../src/vrt-bg.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAerE;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,gBAAgB,CAC9B,EAAE,EAAE,QAAQ,GAAG,SAAS,GACvB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAIxB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,QAAQ,CACtB,OAAO,EAAE,gBAAgB,GACxB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,EAAE,EAAE,QAAQ,CAAA;CAAE,GAAG,IAAI,CAIzC"}
package/dist/vrt-bg.js ADDED
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Colours the two theme-independent backgrounds resolve to.
3
+ *
4
+ * Mirrors what the canvas paints in capture mode, tokens included, so the
5
+ * frame around a capture is the same colour as the capture's own edge.
6
+ * `--prism-void-light` and `--prism-void-dark` are absolute in both themes;
7
+ * the literals are the tokens' own fallbacks.
8
+ */
9
+ const SURFACE = {
10
+ light: 'var(--prism-void-light, #f7f5fc)',
11
+ dark: 'var(--prism-void-dark, #07050f)',
12
+ };
13
+ /**
14
+ * Background declarations for the box that holds a capture.
15
+ *
16
+ * The captures themselves are opaque, so this is mostly invisible — except
17
+ * under a diff mask, where the unchanged pixels a comparator leaves
18
+ * transparent let it through. There the surface decides whether a diff reads
19
+ * as a diff or as a chequered mess.
20
+ *
21
+ * Only `light` and `dark` produce a colour. `dots`, `plain` and `checker` all
22
+ * paint `--prism-bg-surface`, a *theme* token, and the panel cannot know which
23
+ * theme the runner's browser ran in — so those keep the checkerboard, which
24
+ * reads as "transparent" rather than as a guess painted as fact. For `checker`
25
+ * that is also the literal rendering, and since it is what an undeclared
26
+ * variant resolves to, an undeclared capture frames itself correctly. Same for
27
+ * a report that recorded no background at all.
28
+ */
29
+ export function shotSurfaceStyle(bg) {
30
+ const surface = bg ? SURFACE[bg] : undefined;
31
+ if (!surface)
32
+ return {};
33
+ return { 'background-color': surface, 'background-image': 'none' };
34
+ }
35
+ /**
36
+ * The background move between the baseline and this run, or `null`.
37
+ *
38
+ * A variant whose declared `bg` changed compares a capture on one surface
39
+ * against a baseline on another, which is a 100%-different image with an
40
+ * innocent component in it. Naming the move is the difference between a
41
+ * reviewer re-recording a baseline and a reviewer hunting a regression that
42
+ * was never there.
43
+ *
44
+ * Needs both values, and only the runner can supply them: `bg` is what this
45
+ * run captured on, `baselineBg` what the stored baseline was captured on.
46
+ * Runners that do not track the second simply get no note.
47
+ */
48
+ export function bgChange(variant) {
49
+ const { baselineBg, bg } = variant;
50
+ if (!baselineBg || !bg || baselineBg === bg)
51
+ return null;
52
+ return { from: baselineBg, to: bg };
53
+ }
@@ -0,0 +1,70 @@
1
+ import { type Zoom } from './vrt-zoom.js';
2
+ import type { VrtVariantResult } from './visual-regression.types.js';
3
+ import * as i0 from "@angular/core";
4
+ type CompareMode = 'wipe' | 'side-by-side' | 'diff';
5
+ /**
6
+ * The comparison stage: toolbar, zoom, and the three ways to look at a variant.
7
+ *
8
+ * Owns its own URL resolution and mode state so the panel shell stays a shell.
9
+ * Everything it needs is in the one variant it is handed.
10
+ */
11
+ export declare class VrtCompareComponent {
12
+ readonly variant: import("@angular/core").InputSignal<VrtVariantResult>;
13
+ readonly assetBaseUrl: import("@angular/core").InputSignal<string>;
14
+ protected readonly requestedMode: import("@angular/core").WritableSignal<CompareMode | null>;
15
+ protected readonly zoom: import("@angular/core").WritableSignal<Zoom>;
16
+ protected readonly wipe: import("@angular/core").WritableSignal<number>;
17
+ protected readonly MODE_LABEL: Record<CompareMode, string>;
18
+ protected readonly ZOOMS: readonly Zoom[];
19
+ private readonly baselineUrl;
20
+ private readonly currentUrl;
21
+ protected readonly diffUrl: import("@angular/core").Signal<string | undefined>;
22
+ /**
23
+ * The two images to compare.
24
+ *
25
+ * `currentPath` is optional in the report, so the right-hand side falls back
26
+ * to the diff mask. Below that the viewer degrades to a single image.
27
+ */
28
+ protected readonly images: import("@angular/core").Signal<{
29
+ left: string;
30
+ leftLabel: string;
31
+ right: string;
32
+ rightLabel: string;
33
+ } | null>;
34
+ /**
35
+ * The surface each capture sits on; see {@link shotSurfaceStyle}.
36
+ *
37
+ * The baseline falls back to this run's background: when it did not move the
38
+ * two are the same, and when it did, `baselineBg` is what records the move.
39
+ */
40
+ protected readonly currentSurface: import("@angular/core").Signal<Record<string, string>>;
41
+ protected readonly baselineSurface: import("@angular/core").Signal<Record<string, string>>;
42
+ /** A background move between baseline and this run; see {@link bgChange}. */
43
+ protected readonly bgMove: import("@angular/core").Signal<{
44
+ from: import("@ng-prism/core/plugin").CanvasBg;
45
+ to: import("@ng-prism/core/plugin").CanvasBg;
46
+ } | null>;
47
+ protected readonly singleImage: import("@angular/core").Signal<{
48
+ src: string;
49
+ surface: Record<string, string>;
50
+ label: string;
51
+ title: string;
52
+ note: string;
53
+ } | null>;
54
+ protected readonly availableModes: import("@angular/core").Signal<CompareMode[]>;
55
+ protected readonly activeMode: import("@angular/core").Signal<CompareMode>;
56
+ /** Fixed zoom steps need a natural width to multiply; `fit` does not. */
57
+ protected readonly canZoom: import("@angular/core").Signal<boolean>;
58
+ /**
59
+ * An excluded variant has no modes, no measurements and nothing to zoom, so
60
+ * the bar would render as a bare rule above the note explaining why.
61
+ */
62
+ protected readonly showToolbar: import("@angular/core").Signal<boolean>;
63
+ /** Width declarations for the frame; see {@link frameWidthStyle}. */
64
+ protected readonly frameStyle: import("@angular/core").Signal<Record<string, string>>;
65
+ protected percent(ratio: number): string;
66
+ static ɵfac: i0.ɵɵFactoryDeclaration<VrtCompareComponent, never>;
67
+ static ɵcmp: i0.ɵɵComponentDeclaration<VrtCompareComponent, "prism-vrt-compare", never, { "variant": { "alias": "variant"; "required": true; "isSignal": true; }; "assetBaseUrl": { "alias": "assetBaseUrl"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
68
+ }
69
+ export {};
70
+ //# sourceMappingURL=vrt-compare.component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vrt-compare.component.d.ts","sourceRoot":"","sources":["../src/vrt-compare.component.ts"],"names":[],"mappings":"AAUA,OAAO,EAA0B,KAAK,IAAI,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;;AAErE,KAAK,WAAW,GAAG,MAAM,GAAG,cAAc,GAAG,MAAM,CAAC;AAQpD;;;;;GAKG;AACH,qBAkZa,mBAAmB;IAC9B,QAAQ,CAAC,OAAO,wDAAsC;IACtD,QAAQ,CAAC,YAAY,8CAAa;IAElC,SAAS,CAAC,QAAQ,CAAC,aAAa,6DAAoC;IACpE,SAAS,CAAC,QAAQ,CAAC,IAAI,+CAAuB;IAC9C,SAAS,CAAC,QAAQ,CAAC,IAAI,iDAAc;IAErC,SAAS,CAAC,QAAQ,CAAC,UAAU,8BAAc;IAC3C,SAAS,CAAC,QAAQ,CAAC,KAAK,kBAAS;IAEjC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAE1B;IACF,OAAO,CAAC,QAAQ,CAAC,UAAU,CAEzB;IACF,SAAS,CAAC,QAAQ,CAAC,OAAO,qDAExB;IAEF;;;;;OAKG;IACH,SAAS,CAAC,QAAQ,CAAC,MAAM;;;;;cAUtB;IAEH;;;;;OAKG;IACH,SAAS,CAAC,QAAQ,CAAC,cAAc,yDAE/B;IAEF,SAAS,CAAC,QAAQ,CAAC,eAAe,yDAEhC;IAEF,6EAA6E;IAC7E,SAAS,CAAC,QAAQ,CAAC,MAAM;;;cAA4C;IAErE,SAAS,CAAC,QAAQ,CAAC,WAAW;;;;;;cAe3B;IAEH,SAAS,CAAC,QAAQ,CAAC,cAAc,gDAgB9B;IAEH,SAAS,CAAC,QAAQ,CAAC,UAAU,8CAM1B;IAEH,yEAAyE;IACzE,SAAS,CAAC,QAAQ,CAAC,OAAO,0CAExB;IAEF;;;OAGG;IACH,SAAS,CAAC,QAAQ,CAAC,WAAW,0CAQ3B;IAEH,qEAAqE;IACrE,SAAS,CAAC,QAAQ,CAAC,UAAU,yDAG1B;IAEH,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;yCA5H7B,mBAAmB;2CAAnB,mBAAmB;CA+H/B"}