@ng-prism/core 21.4.5 → 21.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. package/dist/app/canvas/prism-canvas-rulers.component.d.ts +16 -0
  2. package/dist/app/canvas/prism-canvas-rulers.component.d.ts.map +1 -0
  3. package/dist/app/canvas/prism-canvas-rulers.component.js +177 -0
  4. package/dist/app/canvas/prism-canvas-toolbar.component.d.ts +14 -0
  5. package/dist/app/canvas/prism-canvas-toolbar.component.d.ts.map +1 -0
  6. package/dist/app/canvas/prism-canvas-toolbar.component.js +144 -0
  7. package/dist/app/canvas/prism-code-drawer.component.d.ts +12 -0
  8. package/dist/app/canvas/prism-code-drawer.component.d.ts.map +1 -0
  9. package/dist/app/canvas/prism-code-drawer.component.js +114 -0
  10. package/dist/app/component-head/prism-component-head.component.d.ts +15 -0
  11. package/dist/app/component-head/prism-component-head.component.d.ts.map +1 -0
  12. package/dist/app/component-head/prism-component-head.component.js +207 -0
  13. package/dist/app/component-head/prism-stat.component.d.ts +10 -0
  14. package/dist/app/component-head/prism-stat.component.d.ts.map +1 -0
  15. package/dist/app/component-head/prism-stat.component.js +52 -0
  16. package/dist/app/controls/boolean-control.component.d.ts.map +1 -1
  17. package/dist/app/controls/boolean-control.component.js +16 -44
  18. package/dist/app/controls/json-control.component.d.ts.map +1 -1
  19. package/dist/app/controls/json-control.component.js +33 -54
  20. package/dist/app/controls/number-control.component.d.ts.map +1 -1
  21. package/dist/app/controls/number-control.component.js +18 -35
  22. package/dist/app/controls/string-control.component.d.ts.map +1 -1
  23. package/dist/app/controls/string-control.component.js +14 -41
  24. package/dist/app/controls/union-control.component.d.ts.map +1 -1
  25. package/dist/app/controls/union-control.component.js +26 -50
  26. package/dist/app/directives/prism-resizer.directive.d.ts +14 -0
  27. package/dist/app/directives/prism-resizer.directive.d.ts.map +1 -0
  28. package/dist/app/directives/prism-resizer.directive.js +71 -0
  29. package/dist/app/header/prism-header.component.d.ts +3 -0
  30. package/dist/app/header/prism-header.component.d.ts.map +1 -1
  31. package/dist/app/header/prism-header.component.js +91 -215
  32. package/dist/app/icons/prism-icon.component.d.ts +10 -0
  33. package/dist/app/icons/prism-icon.component.d.ts.map +1 -0
  34. package/dist/app/icons/prism-icon.component.js +64 -0
  35. package/dist/app/index.d.ts +4 -3
  36. package/dist/app/index.d.ts.map +1 -1
  37. package/dist/app/index.js +4 -3
  38. package/dist/app/layout-menu/prism-layout-menu.component.d.ts.map +1 -1
  39. package/dist/app/layout-menu/prism-layout-menu.component.js +63 -69
  40. package/dist/app/panels/a11y/a11y-core.plugin.d.ts.map +1 -1
  41. package/dist/app/panels/a11y/a11y-core.plugin.js +1 -0
  42. package/dist/app/panels/a11y/a11y-keyboard.component.d.ts.map +1 -1
  43. package/dist/app/panels/a11y/a11y-keyboard.component.js +61 -100
  44. package/dist/app/panels/a11y/a11y-overlay-host.component.d.ts +4 -0
  45. package/dist/app/panels/a11y/a11y-overlay-host.component.d.ts.map +1 -1
  46. package/dist/app/panels/a11y/a11y-overlay-host.component.js +87 -11
  47. package/dist/app/panels/a11y/a11y-panel.component.d.ts +0 -2
  48. package/dist/app/panels/a11y/a11y-panel.component.d.ts.map +1 -1
  49. package/dist/app/panels/a11y/a11y-panel.component.js +70 -85
  50. package/dist/app/panels/a11y/a11y-score.component.d.ts +2 -1
  51. package/dist/app/panels/a11y/a11y-score.component.d.ts.map +1 -1
  52. package/dist/app/panels/a11y/a11y-score.component.js +55 -49
  53. package/dist/app/panels/a11y/a11y-sr.component.d.ts +1 -9
  54. package/dist/app/panels/a11y/a11y-sr.component.d.ts.map +1 -1
  55. package/dist/app/panels/a11y/a11y-sr.component.js +60 -208
  56. package/dist/app/panels/a11y/a11y-tree.component.d.ts +2 -4
  57. package/dist/app/panels/a11y/a11y-tree.component.d.ts.map +1 -1
  58. package/dist/app/panels/a11y/a11y-tree.component.js +92 -137
  59. package/dist/app/panels/a11y/a11y-violations.component.d.ts +2 -6
  60. package/dist/app/panels/a11y/a11y-violations.component.d.ts.map +1 -1
  61. package/dist/app/panels/a11y/a11y-violations.component.js +126 -373
  62. package/dist/app/panels/controls/controls-plugin.d.ts.map +1 -1
  63. package/dist/app/panels/controls/controls-plugin.js +1 -0
  64. package/dist/app/panels/controls/prism-controls-panel.component.d.ts.map +1 -1
  65. package/dist/app/panels/controls/prism-controls-panel.component.js +96 -88
  66. package/dist/app/panels/events/events-plugin.d.ts.map +1 -1
  67. package/dist/app/panels/events/events-plugin.js +1 -0
  68. package/dist/app/panels/events/prism-events-panel.component.d.ts +1 -0
  69. package/dist/app/panels/events/prism-events-panel.component.d.ts.map +1 -1
  70. package/dist/app/panels/events/prism-events-panel.component.js +44 -46
  71. package/dist/app/panels/panel-host/prism-panel-host.component.d.ts +7 -2
  72. package/dist/app/panels/panel-host/prism-panel-host.component.d.ts.map +1 -1
  73. package/dist/app/panels/panel-host/prism-panel-host.component.js +102 -42
  74. package/dist/app/renderer/prism-renderer.component.d.ts +5 -6
  75. package/dist/app/renderer/prism-renderer.component.d.ts.map +1 -1
  76. package/dist/app/renderer/prism-renderer.component.js +84 -150
  77. package/dist/app/services/prism-canvas.service.d.ts +18 -0
  78. package/dist/app/services/prism-canvas.service.d.ts.map +1 -0
  79. package/dist/app/services/prism-canvas.service.js +63 -0
  80. package/dist/app/services/prism-theme.service.d.ts +13 -1
  81. package/dist/app/services/prism-theme.service.d.ts.map +1 -1
  82. package/dist/app/services/prism-theme.service.js +56 -9
  83. package/dist/app/shell/prism-shell.component.d.ts +1 -2
  84. package/dist/app/shell/prism-shell.component.d.ts.map +1 -1
  85. package/dist/app/shell/prism-shell.component.js +189 -178
  86. package/dist/app/sidebar/prism-sidebar.component.d.ts +16 -10
  87. package/dist/app/sidebar/prism-sidebar.component.d.ts.map +1 -1
  88. package/dist/app/sidebar/prism-sidebar.component.js +318 -204
  89. package/dist/app/theme/prism-default-theme.d.ts +1 -0
  90. package/dist/app/theme/prism-default-theme.d.ts.map +1 -1
  91. package/dist/app/theme/prism-default-theme.js +53 -34
  92. package/dist/app/variant-ribbon/prism-variant-ribbon.component.d.ts +13 -0
  93. package/dist/app/variant-ribbon/prism-variant-ribbon.component.d.ts.map +1 -0
  94. package/dist/app/variant-ribbon/prism-variant-ribbon.component.js +134 -0
  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 +15 -11
  97. package/dist/decorator/showcase.decorator.d.ts +1 -3
  98. package/dist/decorator/showcase.decorator.d.ts.map +1 -1
  99. package/dist/decorator/showcase.decorator.js +2 -6
  100. package/dist/plugin/plugin.types.d.ts +1 -0
  101. package/dist/plugin/plugin.types.d.ts.map +1 -1
  102. package/package.json +1 -1
@@ -1,94 +1,48 @@
1
- import { Component, computed, DestroyRef, effect, ElementRef, inject, Injector, signal, untracked, viewChild, ViewContainerRef, } from '@angular/core';
1
+ import { Component, ChangeDetectionStrategy, computed, DestroyRef, effect, ElementRef, inject, Injector, signal, untracked, viewChild, ViewContainerRef, } from '@angular/core';
2
2
  import { NgComponentOutlet } from '@angular/common';
3
- import { Highlight } from 'ngx-highlightjs';
4
3
  import { PrismManifestService } from '../services/prism-manifest.service.js';
5
4
  import { BUILTIN_PANELS } from '../panels/builtin-panels.js';
6
- import { A11yPerspectiveService } from '../panels/a11y/a11y-perspective.service.js';
7
5
  import { PRISM_RENDERER_HOOKS } from '../tokens/prism-tokens.js';
8
6
  import { PrismEventLogService } from '../services/prism-event-log.service.js';
9
7
  import { PrismNavigationService } from '../services/prism-navigation.service.js';
10
8
  import { PrismPanelService } from '../services/prism-panel.service.js';
11
9
  import { PrismPluginService } from '../services/prism-plugin.service.js';
12
10
  import { PrismRendererService } from '../services/prism-renderer.service.js';
13
- import { generateSnippet } from './snippet-generator.js';
11
+ import { PrismCanvasService } from '../services/prism-canvas.service.js';
12
+ import { PrismCanvasRulersComponent } from '../canvas/prism-canvas-rulers.component.js';
14
13
  import * as i0 from "@angular/core";
15
14
  const _c0 = ["outlet"];
16
- const _forTrack0 = ($index, $item) => $item.name;
17
- function PrismRendererComponent_Conditional_1_Conditional_0_For_2_Template(rf, ctx) { if (rf & 1) {
18
- const _r1 = i0.ɵɵgetCurrentView();
19
- i0.ɵɵelementStart(0, "button", 7);
20
- i0.ɵɵlistener("click", function PrismRendererComponent_Conditional_1_Conditional_0_For_2_Template_button_click_0_listener() { const ɵ$index_7_r2 = i0.ɵɵrestoreView(_r1).$index; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.rendererService.selectVariant(ɵ$index_7_r2)); });
21
- i0.ɵɵtext(1);
22
- i0.ɵɵelementEnd();
23
- } if (rf & 2) {
24
- const variant_r4 = ctx.$implicit;
25
- const ɵ$index_7_r2 = ctx.$index;
26
- const ctx_r2 = i0.ɵɵnextContext(3);
27
- i0.ɵɵclassProp("prism-renderer__variant--active", ctx_r2.rendererService.activeVariantIndex() === ɵ$index_7_r2);
28
- i0.ɵɵadvance();
29
- i0.ɵɵtextInterpolate1(" ", variant_r4.name, " ");
30
- } }
31
- function PrismRendererComponent_Conditional_1_Conditional_0_Template(rf, ctx) { if (rf & 1) {
32
- i0.ɵɵelementStart(0, "div", 5);
33
- i0.ɵɵrepeaterCreate(1, PrismRendererComponent_Conditional_1_Conditional_0_For_2_Template, 2, 3, "button", 6, _forTrack0);
34
- i0.ɵɵelementEnd();
35
- } if (rf & 2) {
36
- const comp_r5 = i0.ɵɵnextContext();
37
- i0.ɵɵadvance();
38
- i0.ɵɵrepeater(comp_r5.meta.showcaseConfig.variants);
39
- } }
40
- function PrismRendererComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
41
- i0.ɵɵconditionalCreate(0, PrismRendererComponent_Conditional_1_Conditional_0_Template, 3, 0, "div", 5);
42
- } if (rf & 2) {
43
- const comp_r5 = ctx;
44
- i0.ɵɵconditional((comp_r5.meta.showcaseConfig.variants == null ? null : comp_r5.meta.showcaseConfig.variants.length) ? 0 : -1);
45
- } }
46
- function PrismRendererComponent_Conditional_5_ng_container_0_Template(rf, ctx) { if (rf & 1) {
15
+ function PrismRendererComponent_Conditional_9_ng_container_0_Template(rf, ctx) { if (rf & 1) {
47
16
  i0.ɵɵelementContainer(0);
48
17
  } }
49
- function PrismRendererComponent_Conditional_5_Template(rf, ctx) { if (rf & 1) {
50
- i0.ɵɵtemplate(0, PrismRendererComponent_Conditional_5_ng_container_0_Template, 1, 0, "ng-container", 8);
18
+ function PrismRendererComponent_Conditional_9_Template(rf, ctx) { if (rf & 1) {
19
+ i0.ɵɵtemplate(0, PrismRendererComponent_Conditional_9_ng_container_0_Template, 1, 0, "ng-container", 6);
51
20
  } if (rf & 2) {
52
- const ctx_r2 = i0.ɵɵnextContext();
53
- i0.ɵɵproperty("ngComponentOutlet", ctx_r2.activeOverlay())("ngComponentOutletInputs", ctx_r2.overlayInputs)("ngComponentOutletInjector", ctx_r2.overlayInjector());
54
- } }
55
- function PrismRendererComponent_Conditional_6_Template(rf, ctx) { if (rf & 1) {
56
- const _r6 = i0.ɵɵgetCurrentView();
57
- i0.ɵɵelementStart(0, "div", 3)(1, "button", 9);
58
- i0.ɵɵlistener("click", function PrismRendererComponent_Conditional_6_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r6); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.codeVisible.set(!ctx_r2.codeVisible())); });
59
- i0.ɵɵtext(2, " </> Code ");
60
- i0.ɵɵelementEnd()();
61
- } if (rf & 2) {
62
- const ctx_r2 = i0.ɵɵnextContext();
63
- i0.ɵɵadvance();
64
- i0.ɵɵclassProp("prism-renderer__code-button--active", ctx_r2.codeVisible());
65
- } }
66
- function PrismRendererComponent_Conditional_7_Template(rf, ctx) { if (rf & 1) {
67
- i0.ɵɵelementStart(0, "div", 4)(1, "pre");
68
- i0.ɵɵelement(2, "code", 10);
69
- i0.ɵɵelementEnd()();
70
- } if (rf & 2) {
71
- const ctx_r2 = i0.ɵɵnextContext();
72
- i0.ɵɵadvance(2);
73
- i0.ɵɵproperty("highlight", ctx_r2.snippet());
21
+ const ctx_r0 = i0.ɵɵnextContext();
22
+ i0.ɵɵproperty("ngComponentOutlet", ctx_r0.activeOverlay())("ngComponentOutletInputs", ctx_r0.overlayInputs)("ngComponentOutletInjector", ctx_r0.overlayInjector());
74
23
  } }
75
24
  export class PrismRendererComponent {
25
+ Math = Math;
76
26
  navigationService = inject(PrismNavigationService);
77
27
  rendererService = inject(PrismRendererService);
78
- perspectiveService = inject(A11yPerspectiveService);
28
+ canvasService = inject(PrismCanvasService);
79
29
  eventLogService = inject(PrismEventLogService);
80
30
  manifestService = inject(PrismManifestService);
81
31
  injector = inject(Injector);
82
32
  destroyRef = inject(DestroyRef);
83
33
  host = inject((ElementRef));
84
- rendererHooks = inject(PRISM_RENDERER_HOOKS, { optional: true });
85
- outlet = viewChild.required('outlet', { read: ViewContainerRef });
34
+ rendererHooks = inject(PRISM_RENDERER_HOOKS, {
35
+ optional: true,
36
+ });
37
+ panelService = inject(PrismPanelService);
38
+ pluginService = inject(PrismPluginService);
39
+ outlet = viewChild.required('outlet', {
40
+ read: ViewContainerRef,
41
+ });
86
42
  componentRef = null;
87
43
  outputSubscriptions = [];
88
44
  lastProjectedContent = undefined;
89
45
  isRenderPage = false;
90
- panelService = inject(PrismPanelService);
91
- pluginService = inject(PrismPluginService);
92
46
  overlayCache = new Map();
93
47
  activeOverlay = signal(null, ...(ngDevMode ? [{ debugName: "activeOverlay" }] : []));
94
48
  overlayInputs = { rendererService: this.rendererService };
@@ -96,18 +50,6 @@ export class PrismRendererComponent {
96
50
  const panelInjector = this.panelService.activePanelInjector();
97
51
  return panelInjector ?? this.injector;
98
52
  }, ...(ngDevMode ? [{ debugName: "overlayInjector" }] : []));
99
- codeVisible = signal(false, ...(ngDevMode ? [{ debugName: "codeVisible" }] : []));
100
- snippet = computed(() => {
101
- const comp = this.navigationService.activeComponent();
102
- if (!comp)
103
- return '';
104
- const variant = comp.meta.showcaseConfig.variants?.[this.rendererService.activeVariantIndex()];
105
- const explicitKeys = variant?.inputs ? new Set(Object.keys(variant.inputs)) : undefined;
106
- const directiveOptions = comp.meta.componentMeta.isDirective
107
- ? { host: comp.meta.showcaseConfig.host }
108
- : undefined;
109
- return generateSnippet(comp.meta.componentMeta.selector, comp.meta.inputs, this.rendererService.inputValues(), explicitKeys, this.rendererService.activeContent(), directiveOptions);
110
- }, ...(ngDevMode ? [{ debugName: "snippet" }] : []));
111
53
  constructor() {
112
54
  effect(() => {
113
55
  const comp = this.navigationService.activeComponent();
@@ -115,7 +57,6 @@ export class PrismRendererComponent {
115
57
  return;
116
58
  untracked(() => {
117
59
  this.host.nativeElement.scrollTop = 0;
118
- this.codeVisible.set(false);
119
60
  this.rendererService.reconcileForComponent(comp);
120
61
  this.createComponent(comp);
121
62
  });
@@ -152,7 +93,10 @@ export class PrismRendererComponent {
152
93
  });
153
94
  effect(() => {
154
95
  const panelId = this.panelService.activePanelId();
155
- const allPanels = [...BUILTIN_PANELS, ...this.pluginService.panels()];
96
+ const allPanels = [
97
+ ...BUILTIN_PANELS,
98
+ ...this.pluginService.panels(),
99
+ ];
156
100
  const panel = allPanels.find((p) => p.id === panelId) ?? null;
157
101
  if (!panel) {
158
102
  this.activeOverlay.set(null);
@@ -169,9 +113,9 @@ export class PrismRendererComponent {
169
113
  return;
170
114
  }
171
115
  this.activeOverlay.set(null);
172
- panel.loadOverlayComponent().then((comp) => {
173
- this.overlayCache.set(panel.id, comp);
174
- this.activeOverlay.set(comp);
116
+ panel.loadOverlayComponent().then((c) => {
117
+ this.overlayCache.set(panel.id, c);
118
+ this.activeOverlay.set(c);
175
119
  });
176
120
  return;
177
121
  }
@@ -183,14 +127,18 @@ export class PrismRendererComponent {
183
127
  this.cleanup();
184
128
  const renderPageTitle = comp.meta.showcaseConfig.renderPage;
185
129
  if (renderPageTitle) {
186
- const page = this.manifestService.manifest().pages?.find((p) => p.type === 'component' && p.title === renderPageTitle);
130
+ const page = this.manifestService
131
+ .manifest()
132
+ .pages?.find((p) => p.type === 'component' && p.title === renderPageTitle);
187
133
  if (page) {
188
134
  this.isRenderPage = true;
189
135
  const injector = Injector.create({
190
136
  providers: comp.meta.showcaseConfig.providers ?? [],
191
137
  parent: this.injector,
192
138
  });
193
- this.componentRef = this.outlet().createComponent(page.component, { injector });
139
+ this.componentRef = this.outlet().createComponent(page.component, {
140
+ injector,
141
+ });
194
142
  this.componentRef.changeDetectorRef.detectChanges();
195
143
  this.rendererService.renderedElement.set(this.componentRef.location.nativeElement);
196
144
  return;
@@ -208,12 +156,15 @@ export class PrismRendererComponent {
208
156
  const content = this.rendererService.activeContent();
209
157
  this.lastProjectedContent = content;
210
158
  const projectableNodes = content ? parseContentToNodes(content) : undefined;
211
- this.componentRef = this.outlet().createComponent(comp.type, { injector, projectableNodes });
159
+ this.componentRef = this.outlet().createComponent(comp.type, {
160
+ injector,
161
+ projectableNodes,
162
+ });
212
163
  for (const output of comp.meta.outputs) {
213
164
  const emitter = this.componentRef.instance[output.name];
214
- if (emitter && typeof emitter.subscribe === 'function') {
215
- const sub = emitter
216
- .subscribe((v) => this.eventLogService.log(output.name, v));
165
+ if (emitter &&
166
+ typeof emitter.subscribe === 'function') {
167
+ const sub = emitter.subscribe((v) => this.eventLogService.log(output.name, v));
217
168
  this.outputSubscriptions.push(sub);
218
169
  }
219
170
  }
@@ -250,84 +201,67 @@ export class PrismRendererComponent {
250
201
  i0.ɵɵviewQuerySignal(ctx.outlet, _c0, 5, ViewContainerRef);
251
202
  } if (rf & 2) {
252
203
  i0.ɵɵqueryAdvance();
253
- } }, decls: 8, vars: 6, consts: [["outlet", ""], [1, "prism-renderer"], [1, "prism-renderer__canvas"], [1, "prism-renderer__code-bar"], [1, "prism-renderer__code"], [1, "prism-renderer__toolbar"], [1, "prism-renderer__variant", 3, "prism-renderer__variant--active"], [1, "prism-renderer__variant", 3, "click"], [4, "ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector"], [1, "prism-renderer__code-button", 3, "click"], ["language", "xml", 3, "highlight"]], template: function PrismRendererComponent_Template(rf, ctx) { if (rf & 1) {
254
- i0.ɵɵelementStart(0, "div", 1);
255
- i0.ɵɵconditionalCreate(1, PrismRendererComponent_Conditional_1_Template, 1, 1);
256
- i0.ɵɵelementStart(2, "div", 2);
257
- i0.ɵɵelementContainer(3, null, 0);
258
- i0.ɵɵconditionalCreate(5, PrismRendererComponent_Conditional_5_Template, 1, 3, "ng-container");
259
- i0.ɵɵelementEnd();
260
- i0.ɵɵconditionalCreate(6, PrismRendererComponent_Conditional_6_Template, 3, 2, "div", 3);
261
- i0.ɵɵconditionalCreate(7, PrismRendererComponent_Conditional_7_Template, 3, 1, "div", 4);
262
- i0.ɵɵelementEnd();
204
+ } }, decls: 10, vars: 7, consts: [["outlet", ""], [1, "prism-canvas-stage"], [1, "canvas-badges"], [1, "c-badge"], [1, "stage-crosshair"], [1, "demo-wrap"], [4, "ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector"]], template: function PrismRendererComponent_Template(rf, ctx) { if (rf & 1) {
205
+ i0.ɵɵelementStart(0, "div", 1)(1, "div", 2)(2, "span", 3);
206
+ i0.ɵɵtext(3);
207
+ i0.ɵɵelementEnd()();
208
+ i0.ɵɵelement(4, "div", 4)(5, "prism-canvas-rulers");
209
+ i0.ɵɵelementStart(6, "div", 5);
210
+ i0.ɵɵelementContainer(7, null, 0);
211
+ i0.ɵɵconditionalCreate(9, PrismRendererComponent_Conditional_9_Template, 1, 3, "ng-container");
212
+ i0.ɵɵelementEnd()();
263
213
  } if (rf & 2) {
264
- let tmp_1_0;
265
- i0.ɵɵadvance();
266
- i0.ɵɵconditional((tmp_1_0 = ctx.navigationService.activeComponent()) ? 1 : -1, tmp_1_0);
267
- i0.ɵɵadvance();
268
- i0.ɵɵclassProp("prism-renderer__canvas--sr", ctx.perspectiveService.mode() === "screen-reader");
214
+ i0.ɵɵattribute("data-bg", ctx.canvasService.bg());
269
215
  i0.ɵɵadvance(3);
270
- i0.ɵɵconditional(ctx.activeOverlay() ? 5 : -1);
216
+ i0.ɵɵtextInterpolate1("", ctx.Math.round(ctx.canvasService.zoom() * 100), "%");
271
217
  i0.ɵɵadvance();
272
- i0.ɵɵconditional(ctx.snippet() ? 6 : -1);
273
- i0.ɵɵadvance();
274
- i0.ɵɵconditional(ctx.codeVisible() ? 7 : -1);
275
- } }, dependencies: [Highlight, NgComponentOutlet], styles: [".prism-renderer[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-height: 0;\n }\n\n .prism-renderer__toolbar[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n padding: 0 8px;\n border-bottom: 1px solid var(--prism-border);\n flex-shrink: 0;\n background: var(--prism-bg-elevated);\n }\n .prism-renderer__variant[_ngcontent-%COMP%] {\n padding: 8px 14px;\n font-size: 13px;\n font-family: var(--prism-font-sans);\n border: none;\n background: none;\n color: var(--prism-text-muted);\n cursor: pointer;\n position: relative;\n margin-bottom: -1px;\n transition: color 0.12s;\n }\n .prism-renderer__variant[_ngcontent-%COMP%]::after {\n content: '';\n position: absolute;\n bottom: 0; left: 0; right: 0;\n height: 2px;\n background: linear-gradient(90deg, var(--prism-primary-from), var(--prism-primary-to));\n opacity: 0;\n transition: opacity 0.12s;\n }\n .prism-renderer__variant[_ngcontent-%COMP%]:hover { color: var(--prism-text); }\n .prism-renderer__variant--active[_ngcontent-%COMP%] { color: var(--prism-primary); }\n .prism-renderer__variant--active[_ngcontent-%COMP%]::after { opacity: 1; }\n\n .prism-renderer__canvas[_ngcontent-%COMP%] {\n position: relative;\n flex: 1;\n padding: 48px 40px;\n overflow: auto;\n background-color: var(--prism-bg-surface);\n background-image: radial-gradient(\n circle,\n color-mix(in srgb, var(--prism-primary) 15%, transparent) 1px,\n transparent 1px\n );\n background-size: 20px 20px;\n display: flex;\n align-items: flex-start;\n justify-content: center;\n transition: filter 0.2s;\n }\n .prism-renderer__canvas--sr[_ngcontent-%COMP%] {\n filter: brightness(0.82) saturate(0.7);\n }\n\n .prism-renderer__code-bar[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n padding: 0 12px;\n border-top: 1px solid var(--prism-border);\n flex-shrink: 0;\n background: var(--prism-bg-elevated);\n }\n .prism-renderer__code-button[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 5px;\n padding: 6px 8px;\n font-size: 11.5px;\n font-family: var(--prism-font-mono, monospace);\n border: none;\n background: none;\n color: var(--prism-text-muted);\n cursor: pointer;\n position: relative;\n transition: color 0.12s;\n margin-bottom: -1px;\n }\n .prism-renderer__code-button[_ngcontent-%COMP%]::after {\n content: '';\n position: absolute;\n bottom: 0; left: 4px; right: 4px;\n height: 2px;\n background: linear-gradient(90deg, var(--prism-primary-from), var(--prism-primary-to));\n opacity: 0;\n transition: opacity 0.12s;\n }\n .prism-renderer__code-button[_ngcontent-%COMP%]:hover { color: var(--prism-text-2); }\n .prism-renderer__code-button--active[_ngcontent-%COMP%] { color: var(--prism-primary); }\n .prism-renderer__code-button--active[_ngcontent-%COMP%]::after { opacity: 1; }\n\n .prism-renderer__code[_ngcontent-%COMP%] {\n border-top: 1px solid var(--prism-border);\n overflow: auto;\n flex-shrink: 0;\n max-height: 240px;\n background: var(--prism-void);\n }\n .prism-renderer__code[_ngcontent-%COMP%] pre[_ngcontent-%COMP%] {\n margin: 0;\n padding: 20px 24px;\n font-size: 12.5px;\n line-height: 1.65;\n font-family: var(--prism-font-mono);\n }\n .prism-renderer__code[_ngcontent-%COMP%] code[_ngcontent-%COMP%] { font-family: inherit; }\n [_nghost-%COMP%] .prism-renderer__code .hljs {\n background: transparent;\n color: var(--prism-text-2);\n }\n [_nghost-%COMP%] .prism-renderer__code .hljs-tag { color: var(--prism-text-muted); }\n [_nghost-%COMP%] .prism-renderer__code .hljs-name { color: var(--prism-primary); }\n [_nghost-%COMP%] .prism-renderer__code .hljs-attr { color: #93c5fd; }\n [_nghost-%COMP%] .prism-renderer__code .hljs-string { color: #7dd3fc; }"] });
218
+ i0.ɵɵclassProp("visible", ctx.canvasService.guides());
219
+ i0.ɵɵadvance(2);
220
+ i0.ɵɵstyleProp("--zoom", ctx.canvasService.zoom());
221
+ i0.ɵɵadvance(3);
222
+ i0.ɵɵconditional(ctx.activeOverlay() ? 9 : -1);
223
+ } }, dependencies: [PrismCanvasRulersComponent, NgComponentOutlet], styles: ["[_nghost-%COMP%] { display: block; min-height: 0; flex: 1; }\n\n .prism-canvas-stage[_ngcontent-%COMP%] {\n position: relative;\n overflow: auto;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 32px;\n min-height: 200px;\n height: 100%;\n background-color: var(--prism-bg-surface);\n background-image: radial-gradient(circle, var(--prism-dot) 1px, transparent 1px);\n background-size: 20px 20px;\n transition: filter var(--dur-base);\n }\n\n .prism-canvas-stage[data-bg=\"plain\"][_ngcontent-%COMP%] {\n background-image: none;\n }\n .prism-canvas-stage[data-bg=\"light\"][_ngcontent-%COMP%] {\n background-color: #f7f5fc;\n background-image: radial-gradient(circle, rgba(124, 58, 237, 0.15) 1px, transparent 1px);\n }\n .prism-canvas-stage[data-bg=\"dark\"][_ngcontent-%COMP%] {\n background-color: #07050f;\n background-image: radial-gradient(circle, rgba(167, 139, 250, 0.18) 1px, transparent 1px);\n }\n .prism-canvas-stage[data-bg=\"checker\"][_ngcontent-%COMP%] {\n background-image:\n linear-gradient(45deg, var(--prism-border) 25%, transparent 25%),\n linear-gradient(-45deg, var(--prism-border) 25%, transparent 25%),\n linear-gradient(45deg, transparent 75%, var(--prism-border) 75%),\n linear-gradient(-45deg, transparent 75%, var(--prism-border) 75%);\n background-size: 16px 16px;\n background-position: 0 0, 0 8px, 8px -8px, -8px 0;\n }\n\n .stage-crosshair[_ngcontent-%COMP%] {\n position: absolute;\n inset: 0;\n pointer-events: none;\n opacity: 0;\n transition: opacity var(--dur-base);\n }\n .stage-crosshair.visible[_ngcontent-%COMP%] { opacity: 1; }\n .stage-crosshair[_ngcontent-%COMP%]::before, \n .stage-crosshair[_ngcontent-%COMP%]::after {\n content: '';\n position: absolute;\n background: color-mix(in srgb, var(--prism-primary) 20%, transparent);\n }\n .stage-crosshair[_ngcontent-%COMP%]::before { left: 0; right: 0; top: 50%; height: 1px; }\n .stage-crosshair[_ngcontent-%COMP%]::after { top: 0; bottom: 0; left: 50%; width: 1px; }\n\n .canvas-badges[_ngcontent-%COMP%] {\n position: absolute;\n top: 12px;\n left: 20px;\n display: flex;\n gap: 6px;\n pointer-events: none;\n }\n .c-badge[_ngcontent-%COMP%] {\n font-family: var(--font-mono);\n font-size: var(--fs-xs);\n padding: 3px 7px;\n border-radius: 4px;\n background: color-mix(in srgb, var(--prism-bg-elevated) 90%, transparent);\n border: 1px solid var(--prism-border);\n color: var(--prism-text-muted);\n backdrop-filter: blur(8px);\n }\n\n .demo-wrap[_ngcontent-%COMP%] {\n position: relative;\n transform: scale(var(--zoom, 1));\n transition: transform 0.18s;\n }"], changeDetection: 0 });
276
224
  }
277
225
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(PrismRendererComponent, [{
278
226
  type: Component,
279
- args: [{ selector: 'prism-renderer', standalone: true, imports: [Highlight, NgComponentOutlet], template: `
280
- <div class="prism-renderer">
281
- @if (navigationService.activeComponent(); as comp) {
282
- @if (comp.meta.showcaseConfig.variants?.length) {
283
- <div class="prism-renderer__toolbar">
284
- @for (variant of comp.meta.showcaseConfig.variants!; track variant.name; let i = $index) {
285
- <button
286
- class="prism-renderer__variant"
287
- [class.prism-renderer__variant--active]="rendererService.activeVariantIndex() === i"
288
- (click)="rendererService.selectVariant(i)"
289
- >
290
- {{ variant.name }}
291
- </button>
292
- }
293
- </div>
294
- }
295
- }
296
- <div class="prism-renderer__canvas" [class.prism-renderer__canvas--sr]="perspectiveService.mode() === 'screen-reader'">
227
+ args: [{ selector: 'prism-renderer', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [PrismCanvasRulersComponent, NgComponentOutlet], template: `
228
+ <div class="prism-canvas-stage" [attr.data-bg]="canvasService.bg()">
229
+ <div class="canvas-badges">
230
+ <span class="c-badge"
231
+ >{{ Math.round(canvasService.zoom() * 100) }}%</span
232
+ >
233
+ </div>
234
+ <div
235
+ class="stage-crosshair"
236
+ [class.visible]="canvasService.guides()"
237
+ ></div>
238
+ <prism-canvas-rulers />
239
+
240
+ <div class="demo-wrap" [style.--zoom]="canvasService.zoom()">
297
241
  <ng-container #outlet />
298
242
  @if (activeOverlay()) {
299
- <ng-container
300
- *ngComponentOutlet="activeOverlay()!;
301
- inputs: overlayInputs;
302
- injector: overlayInjector()"
303
- />
243
+ <ng-container
244
+ *ngComponentOutlet="
245
+ activeOverlay()!;
246
+ inputs: overlayInputs;
247
+ injector: overlayInjector()
248
+ "
249
+ />
304
250
  }
305
251
  </div>
306
- @if (snippet()) {
307
- <div class="prism-renderer__code-bar">
308
- <button
309
- class="prism-renderer__code-button"
310
- [class.prism-renderer__code-button--active]="codeVisible()"
311
- (click)="codeVisible.set(!codeVisible())"
312
- >
313
- &lt;/&gt; Code
314
- </button>
315
- </div>
316
- }
317
- @if (codeVisible()) {
318
- <div class="prism-renderer__code">
319
- <pre><code [highlight]="snippet()" language="xml"></code></pre>
320
- </div>
321
- }
322
252
  </div>
323
- `, styles: ["\n .prism-renderer {\n display: flex;\n flex-direction: column;\n flex: 1;\n min-height: 0;\n }\n\n .prism-renderer__toolbar {\n display: flex;\n align-items: center;\n padding: 0 8px;\n border-bottom: 1px solid var(--prism-border);\n flex-shrink: 0;\n background: var(--prism-bg-elevated);\n }\n .prism-renderer__variant {\n padding: 8px 14px;\n font-size: 13px;\n font-family: var(--prism-font-sans);\n border: none;\n background: none;\n color: var(--prism-text-muted);\n cursor: pointer;\n position: relative;\n margin-bottom: -1px;\n transition: color 0.12s;\n }\n .prism-renderer__variant::after {\n content: '';\n position: absolute;\n bottom: 0; left: 0; right: 0;\n height: 2px;\n background: linear-gradient(90deg, var(--prism-primary-from), var(--prism-primary-to));\n opacity: 0;\n transition: opacity 0.12s;\n }\n .prism-renderer__variant:hover { color: var(--prism-text); }\n .prism-renderer__variant--active { color: var(--prism-primary); }\n .prism-renderer__variant--active::after { opacity: 1; }\n\n .prism-renderer__canvas {\n position: relative;\n flex: 1;\n padding: 48px 40px;\n overflow: auto;\n background-color: var(--prism-bg-surface);\n background-image: radial-gradient(\n circle,\n color-mix(in srgb, var(--prism-primary) 15%, transparent) 1px,\n transparent 1px\n );\n background-size: 20px 20px;\n display: flex;\n align-items: flex-start;\n justify-content: center;\n transition: filter 0.2s;\n }\n .prism-renderer__canvas--sr {\n filter: brightness(0.82) saturate(0.7);\n }\n\n .prism-renderer__code-bar {\n display: flex;\n align-items: center;\n padding: 0 12px;\n border-top: 1px solid var(--prism-border);\n flex-shrink: 0;\n background: var(--prism-bg-elevated);\n }\n .prism-renderer__code-button {\n display: flex;\n align-items: center;\n gap: 5px;\n padding: 6px 8px;\n font-size: 11.5px;\n font-family: var(--prism-font-mono, monospace);\n border: none;\n background: none;\n color: var(--prism-text-muted);\n cursor: pointer;\n position: relative;\n transition: color 0.12s;\n margin-bottom: -1px;\n }\n .prism-renderer__code-button::after {\n content: '';\n position: absolute;\n bottom: 0; left: 4px; right: 4px;\n height: 2px;\n background: linear-gradient(90deg, var(--prism-primary-from), var(--prism-primary-to));\n opacity: 0;\n transition: opacity 0.12s;\n }\n .prism-renderer__code-button:hover { color: var(--prism-text-2); }\n .prism-renderer__code-button--active { color: var(--prism-primary); }\n .prism-renderer__code-button--active::after { opacity: 1; }\n\n .prism-renderer__code {\n border-top: 1px solid var(--prism-border);\n overflow: auto;\n flex-shrink: 0;\n max-height: 240px;\n background: var(--prism-void);\n }\n .prism-renderer__code pre {\n margin: 0;\n padding: 20px 24px;\n font-size: 12.5px;\n line-height: 1.65;\n font-family: var(--prism-font-mono);\n }\n .prism-renderer__code code { font-family: inherit; }\n :host ::ng-deep .prism-renderer__code .hljs {\n background: transparent;\n color: var(--prism-text-2);\n }\n :host ::ng-deep .prism-renderer__code .hljs-tag { color: var(--prism-text-muted); }\n :host ::ng-deep .prism-renderer__code .hljs-name { color: var(--prism-primary); }\n :host ::ng-deep .prism-renderer__code .hljs-attr { color: #93c5fd; }\n :host ::ng-deep .prism-renderer__code .hljs-string { color: #7dd3fc; }\n "] }]
324
- }], () => [], { outlet: [{ type: i0.ViewChild, args: ['outlet', { ...{ read: ViewContainerRef }, isSignal: true }] }] }); })();
325
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(PrismRendererComponent, { className: "PrismRendererComponent", filePath: "app/renderer/prism-renderer.component.ts", lineNumber: 204 }); })();
253
+ `, styles: ["\n :host { display: block; min-height: 0; flex: 1; }\n\n .prism-canvas-stage {\n position: relative;\n overflow: auto;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 32px;\n min-height: 200px;\n height: 100%;\n background-color: var(--prism-bg-surface);\n background-image: radial-gradient(circle, var(--prism-dot) 1px, transparent 1px);\n background-size: 20px 20px;\n transition: filter var(--dur-base);\n }\n\n .prism-canvas-stage[data-bg=\"plain\"] {\n background-image: none;\n }\n .prism-canvas-stage[data-bg=\"light\"] {\n background-color: #f7f5fc;\n background-image: radial-gradient(circle, rgba(124, 58, 237, 0.15) 1px, transparent 1px);\n }\n .prism-canvas-stage[data-bg=\"dark\"] {\n background-color: #07050f;\n background-image: radial-gradient(circle, rgba(167, 139, 250, 0.18) 1px, transparent 1px);\n }\n .prism-canvas-stage[data-bg=\"checker\"] {\n background-image:\n linear-gradient(45deg, var(--prism-border) 25%, transparent 25%),\n linear-gradient(-45deg, var(--prism-border) 25%, transparent 25%),\n linear-gradient(45deg, transparent 75%, var(--prism-border) 75%),\n linear-gradient(-45deg, transparent 75%, var(--prism-border) 75%);\n background-size: 16px 16px;\n background-position: 0 0, 0 8px, 8px -8px, -8px 0;\n }\n\n .stage-crosshair {\n position: absolute;\n inset: 0;\n pointer-events: none;\n opacity: 0;\n transition: opacity var(--dur-base);\n }\n .stage-crosshair.visible { opacity: 1; }\n .stage-crosshair::before,\n .stage-crosshair::after {\n content: '';\n position: absolute;\n background: color-mix(in srgb, var(--prism-primary) 20%, transparent);\n }\n .stage-crosshair::before { left: 0; right: 0; top: 50%; height: 1px; }\n .stage-crosshair::after { top: 0; bottom: 0; left: 50%; width: 1px; }\n\n .canvas-badges {\n position: absolute;\n top: 12px;\n left: 20px;\n display: flex;\n gap: 6px;\n pointer-events: none;\n }\n .c-badge {\n font-family: var(--font-mono);\n font-size: var(--fs-xs);\n padding: 3px 7px;\n border-radius: 4px;\n background: color-mix(in srgb, var(--prism-bg-elevated) 90%, transparent);\n border: 1px solid var(--prism-border);\n color: var(--prism-text-muted);\n backdrop-filter: blur(8px);\n }\n\n .demo-wrap {\n position: relative;\n transform: scale(var(--zoom, 1));\n transition: transform 0.18s;\n }\n\n "] }]
254
+ }], () => [], { outlet: [{ type: i0.ViewChild, args: ['outlet', { ...{
255
+ read: ViewContainerRef,
256
+ }, isSignal: true }] }] }); })();
257
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(PrismRendererComponent, { className: "PrismRendererComponent", filePath: "app/renderer/prism-renderer.component.ts", lineNumber: 150 }); })();
326
258
  function parseContentToNodes(content) {
327
259
  if (typeof content === 'string') {
328
260
  return [htmlToNodes(content)];
329
261
  }
330
- const defaultNodes = content['default'] ? htmlToNodes(content['default']) : [];
262
+ const defaultNodes = content['default']
263
+ ? htmlToNodes(content['default'])
264
+ : [];
331
265
  const result = [defaultNodes];
332
266
  for (const [selector, html] of Object.entries(content)) {
333
267
  if (selector === 'default')
@@ -0,0 +1,18 @@
1
+ import * as i0 from "@angular/core";
2
+ export type CanvasBg = 'dots' | 'plain' | 'light' | 'dark' | 'checker';
3
+ export declare class PrismCanvasService {
4
+ readonly bg: import("@angular/core").WritableSignal<CanvasBg>;
5
+ readonly zoom: import("@angular/core").WritableSignal<number>;
6
+ readonly guides: import("@angular/core").WritableSignal<boolean>;
7
+ readonly rulers: import("@angular/core").WritableSignal<boolean>;
8
+ constructor();
9
+ setBg(bg: CanvasBg): void;
10
+ setZoom(z: number): void;
11
+ toggleGuides(): void;
12
+ toggleRulers(): void;
13
+ private loadFromStorage;
14
+ private save;
15
+ static ɵfac: i0.ɵɵFactoryDeclaration<PrismCanvasService, never>;
16
+ static ɵprov: i0.ɵɵInjectableDeclaration<PrismCanvasService>;
17
+ }
18
+ //# sourceMappingURL=prism-canvas.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prism-canvas.service.d.ts","sourceRoot":"","sources":["../../../src/app/services/prism-canvas.service.ts"],"names":[],"mappings":";AAEA,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;AAIvE,qBACa,kBAAkB;IAC7B,QAAQ,CAAC,EAAE,mDAA4B;IACvC,QAAQ,CAAC,IAAI,iDAAa;IAC1B,QAAQ,CAAC,MAAM,kDAAiB;IAChC,QAAQ,CAAC,MAAM,kDAAiB;;IAMhC,KAAK,CAAC,EAAE,EAAE,QAAQ,GAAG,IAAI;IAKzB,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAKxB,YAAY,IAAI,IAAI;IAKpB,YAAY,IAAI,IAAI;IAKpB,OAAO,CAAC,eAAe;IAkBvB,OAAO,CAAC,IAAI;yCAhDD,kBAAkB;6CAAlB,kBAAkB;CA6D9B"}
@@ -0,0 +1,63 @@
1
+ import { Injectable, signal } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ const STORAGE_KEY = 'ng-prism-canvas';
4
+ export class PrismCanvasService {
5
+ bg = signal('dots', ...(ngDevMode ? [{ debugName: "bg" }] : []));
6
+ zoom = signal(1, ...(ngDevMode ? [{ debugName: "zoom" }] : []));
7
+ guides = signal(false, ...(ngDevMode ? [{ debugName: "guides" }] : []));
8
+ rulers = signal(false, ...(ngDevMode ? [{ debugName: "rulers" }] : []));
9
+ constructor() {
10
+ this.loadFromStorage();
11
+ }
12
+ setBg(bg) {
13
+ this.bg.set(bg);
14
+ this.save();
15
+ }
16
+ setZoom(z) {
17
+ this.zoom.set(z);
18
+ this.save();
19
+ }
20
+ toggleGuides() {
21
+ this.guides.update((v) => !v);
22
+ this.save();
23
+ }
24
+ toggleRulers() {
25
+ this.rulers.update((v) => !v);
26
+ this.save();
27
+ }
28
+ loadFromStorage() {
29
+ try {
30
+ const raw = localStorage.getItem(STORAGE_KEY);
31
+ if (!raw)
32
+ return;
33
+ const d = JSON.parse(raw);
34
+ if (['dots', 'plain', 'light', 'dark', 'checker'].includes(d['bg'])) {
35
+ this.bg.set(d['bg']);
36
+ }
37
+ if (typeof d['zoom'] === 'number')
38
+ this.zoom.set(d['zoom']);
39
+ if (typeof d['guides'] === 'boolean')
40
+ this.guides.set(d['guides']);
41
+ if (typeof d['rulers'] === 'boolean')
42
+ this.rulers.set(d['rulers']);
43
+ }
44
+ catch { }
45
+ }
46
+ save() {
47
+ try {
48
+ localStorage.setItem(STORAGE_KEY, JSON.stringify({
49
+ bg: this.bg(),
50
+ zoom: this.zoom(),
51
+ guides: this.guides(),
52
+ rulers: this.rulers(),
53
+ }));
54
+ }
55
+ catch { }
56
+ }
57
+ static ɵfac = function PrismCanvasService_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || PrismCanvasService)(); };
58
+ static ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: PrismCanvasService, factory: PrismCanvasService.ɵfac, providedIn: 'root' });
59
+ }
60
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(PrismCanvasService, [{
61
+ type: Injectable,
62
+ args: [{ providedIn: 'root' }]
63
+ }], () => [], null); })();
@@ -1,8 +1,20 @@
1
1
  import * as i0 from "@angular/core";
2
2
  export declare class PrismThemeService {
3
- readonly isDark: import("@angular/core").WritableSignal<boolean>;
3
+ readonly theme: import("@angular/core").WritableSignal<"dark" | "light">;
4
+ readonly isDark: import("@angular/core").Signal<boolean>;
5
+ private configOverrides;
6
+ private darkOverrides;
7
+ private lightOverrides;
4
8
  constructor();
5
9
  toggle(): void;
10
+ applyConfigOverrides(config: {
11
+ theme?: Record<string, string>;
12
+ darkTheme?: Record<string, string>;
13
+ lightTheme?: Record<string, string>;
14
+ }): void;
15
+ private applyTokens;
16
+ private applyFavicon;
17
+ private readStoredTheme;
6
18
  static ɵfac: i0.ɵɵFactoryDeclaration<PrismThemeService, never>;
7
19
  static ɵprov: i0.ɵɵInjectableDeclaration<PrismThemeService>;
8
20
  }
@@ -1 +1 @@
1
- {"version":3,"file":"prism-theme.service.d.ts","sourceRoot":"","sources":["../../../src/app/services/prism-theme.service.ts"],"names":[],"mappings":";AAIA,qBACa,iBAAiB;IAC5B,QAAQ,CAAC,MAAM,kDAAgB;;IAQ/B,MAAM,IAAI,IAAI;yCATH,iBAAiB;6CAAjB,iBAAiB;CAa7B"}
1
+ {"version":3,"file":"prism-theme.service.d.ts","sourceRoot":"","sources":["../../../src/app/services/prism-theme.service.ts"],"names":[],"mappings":";AAUA,qBACa,iBAAiB;IAC5B,QAAQ,CAAC,KAAK,2DAAoD;IAClE,QAAQ,CAAC,MAAM,0CAA2C;IAE1D,OAAO,CAAC,eAAe,CAA8B;IACrD,OAAO,CAAC,aAAa,CAA8B;IACnD,OAAO,CAAC,cAAc,CAA8B;;IAYpD,MAAM,IAAI,IAAI;IAId,oBAAoB,CAAC,MAAM,EAAE;QAC3B,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC/B,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACnC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACrC,GAAG,IAAI;IAOR,OAAO,CAAC,WAAW;IAiBnB,OAAO,CAAC,YAAY;IAapB,OAAO,CAAC,eAAe;yCA/DZ,iBAAiB;6CAAjB,iBAAiB;CAsE7B"}
@@ -1,18 +1,65 @@
1
- import { Injectable, signal } from '@angular/core';
1
+ import { Injectable, signal, computed, effect } from '@angular/core';
2
+ import { PRISM_DARK_THEME, PRISM_LIGHT_THEME, PRISM_BASE_TOKENS, } from '../theme/prism-default-theme.js';
2
3
  import * as i0 from "@angular/core";
3
4
  const STORAGE_KEY = 'ng-prism-theme';
5
+ const FAVICON_DATA_URI = `data:image/x-icon;base64,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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAA////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAQAAgAAAAAABAADAAAAAAAMAAMAAAAAAAwAA4AAAAAAHAADgAAAAAAcAAPAAAAAADwAA8AAAAAAPAAD4AAAAAB8AAPwAAAAAPwAA/AAAAAA/AAD+AAAAAH8AAP4AAAAAfwAA/wAAAAD/AAD/AAAAAP8AAP+AAAAB/wAA/8AAAAP/AAD/wAAAA/8AAP/gAAAH/wAA/+AAAAf/AAD/8AAAD/8AAP/wAAAP/wAA//gAAB//AAD//AAAP/8AAP/8AAA//wAA//4AAH//AAD//gAAf/8AAP//AAD//wAA//8AAP//AAD//4AB//8AAP//wAP//wAA///AA///AAD//+AH//8AAP//4Af//wAA///wD///AAD///AP//8AAP//+B///wAA///8P///AAD///w///8AAP///n///wAA////////AAD///////8AACgAAAAgAAAAQAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGYzzAWAAKoGgACqBoAAqgaAAKoGgACqBoAAqgaAAKoGgACqBqoA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`;
4
6
  export class PrismThemeService {
5
- isDark = signal(true, ...(ngDevMode ? [{ debugName: "isDark" }] : []));
7
+ theme = signal(this.readStoredTheme(), ...(ngDevMode ? [{ debugName: "theme" }] : []));
8
+ isDark = computed(() => this.theme() === 'dark', ...(ngDevMode ? [{ debugName: "isDark" }] : []));
9
+ configOverrides = {};
10
+ darkOverrides = {};
11
+ lightOverrides = {};
6
12
  constructor() {
7
- const stored = localStorage.getItem(STORAGE_KEY);
8
- if (stored === 'light')
9
- this.isDark.set(false);
10
- else if (stored === 'dark')
11
- this.isDark.set(true);
13
+ this.applyFavicon();
14
+ effect(() => {
15
+ const t = this.theme();
16
+ document.documentElement.dataset['theme'] = t;
17
+ localStorage.setItem(STORAGE_KEY, t);
18
+ this.applyTokens();
19
+ });
12
20
  }
13
21
  toggle() {
14
- this.isDark.update((v) => !v);
15
- localStorage.setItem(STORAGE_KEY, this.isDark() ? 'dark' : 'light');
22
+ this.theme.update((t) => (t === 'dark' ? 'light' : 'dark'));
23
+ }
24
+ applyConfigOverrides(config) {
25
+ this.configOverrides = config.theme ?? {};
26
+ this.darkOverrides = config.darkTheme ?? {};
27
+ this.lightOverrides = config.lightTheme ?? {};
28
+ this.applyTokens();
29
+ }
30
+ applyTokens() {
31
+ const isDark = this.isDark();
32
+ const base = isDark ? PRISM_DARK_THEME : PRISM_LIGHT_THEME;
33
+ const specific = isDark ? this.darkOverrides : this.lightOverrides;
34
+ const merged = {
35
+ ...PRISM_BASE_TOKENS,
36
+ ...base,
37
+ ...specific,
38
+ ...this.configOverrides,
39
+ };
40
+ const style = document.documentElement.style;
41
+ for (const [key, value] of Object.entries(merged)) {
42
+ style.setProperty(key, value);
43
+ }
44
+ }
45
+ applyFavicon() {
46
+ let link = document.querySelector('link[rel="icon"]');
47
+ if (!link) {
48
+ link = document.createElement('link');
49
+ link.rel = 'icon';
50
+ document.head.appendChild(link);
51
+ }
52
+ link.type = 'image/svg+xml';
53
+ link.href = FAVICON_DATA_URI;
54
+ }
55
+ readStoredTheme() {
56
+ try {
57
+ const stored = localStorage.getItem(STORAGE_KEY);
58
+ if (stored === 'light')
59
+ return 'light';
60
+ }
61
+ catch { }
62
+ return 'dark';
16
63
  }
17
64
  static ɵfac = function PrismThemeService_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || PrismThemeService)(); };
18
65
  static ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: PrismThemeService, factory: PrismThemeService.ɵfac, providedIn: 'root' });