ngx-dev-toolbar 1.0.3 → 1.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (145) hide show
  1. package/components/button/button.component.d.ts +12 -0
  2. package/components/card/card.component.d.ts +8 -0
  3. package/components/clickable-card/clickable-card.component.d.ts +11 -0
  4. package/components/icons/angular-icon.component.d.ts +5 -0
  5. package/components/icons/bolt-icon.component.d.ts +6 -0
  6. package/components/icons/bug-icon.component.d.ts +6 -0
  7. package/components/icons/code-icon.component.d.ts +6 -0
  8. package/components/icons/database-icon.component.d.ts +6 -0
  9. package/components/icons/discord-icon.component.d.ts +6 -0
  10. package/components/icons/docs-icon.component.d.ts +6 -0
  11. package/components/icons/export-icon.component.d.ts +6 -0
  12. package/components/icons/filter-icon.component.d.ts +6 -0
  13. package/components/icons/gauge-icon.component.d.ts +6 -0
  14. package/components/icons/gear-icon.component.d.ts +6 -0
  15. package/components/icons/git-branch-icon.component.d.ts +6 -0
  16. package/components/icons/icon.component.d.ts +9 -0
  17. package/components/icons/icon.models.d.ts +1 -0
  18. package/components/icons/import-icon.component.d.ts +6 -0
  19. package/components/icons/layout-icon.component.d.ts +6 -0
  20. package/components/icons/lightbulb-icon.component.d.ts +6 -0
  21. package/components/icons/lighting-icon.component.d.ts +6 -0
  22. package/components/icons/lock-icon.component.d.ts +6 -0
  23. package/components/icons/moon-icon.component.d.ts +6 -0
  24. package/components/icons/network-icon.component.d.ts +6 -0
  25. package/components/icons/puzzle-icon.component.d.ts +6 -0
  26. package/components/icons/refresh-icon.component.d.ts +6 -0
  27. package/components/icons/star-icon.component.d.ts +6 -0
  28. package/components/icons/sun-icon.component.d.ts +6 -0
  29. package/components/icons/terminal-icon.component.d.ts +6 -0
  30. package/components/icons/toggle-left-icon.component.d.ts +6 -0
  31. package/components/icons/translate-icon.component.d.ts +6 -0
  32. package/components/icons/trash-icon.component.d.ts +6 -0
  33. package/components/icons/users-icon.component.d.ts +6 -0
  34. package/components/input/input.component.d.ts +10 -0
  35. package/components/link-button/link-button.component.d.ts +8 -0
  36. package/components/select/select.component.d.ts +25 -0
  37. package/components/tool-button/tool-button.component.d.ts +23 -0
  38. package/components/toolbar-tool/toolbar-tool.component.d.ts +30 -0
  39. package/components/toolbar-tool/toolbar-tool.models.d.ts +25 -0
  40. package/components/window/window.component.d.ts +16 -0
  41. package/dev-toolbar-state.service.d.ts +21 -0
  42. package/dev-toolbar.component.d.ts +18 -0
  43. package/fesm2022/ngx-dev-toolbar.mjs +4570 -0
  44. package/fesm2022/ngx-dev-toolbar.mjs.map +1 -0
  45. package/index.d.ts +19 -0
  46. package/models/dev-tools.interface.d.ts +17 -0
  47. package/package.json +31 -8
  48. package/tools/app-features-tool/app-features-internal.service.d.ts +102 -0
  49. package/tools/app-features-tool/app-features-tool.component.d.ts +61 -0
  50. package/tools/app-features-tool/app-features.models.d.ts +109 -0
  51. package/tools/app-features-tool/app-features.service.d.ts +151 -0
  52. package/tools/feature-flags-tool/feature-flags-internal.service.d.ts +21 -0
  53. package/tools/feature-flags-tool/feature-flags-tool.component.d.ts +27 -0
  54. package/tools/feature-flags-tool/feature-flags.models.d.ts +9 -0
  55. package/tools/feature-flags-tool/feature-flags.service.d.ts +19 -0
  56. package/tools/home-tool/home-tool.component.d.ts +38 -0
  57. package/{src/tools/home-tool/settings.models.ts → tools/home-tool/settings.models.d.ts} +1 -1
  58. package/tools/home-tool/settings.service.d.ts +10 -0
  59. package/tools/language-tool/language-internal.service.d.ts +19 -0
  60. package/tools/language-tool/language-tool.component.d.ts +14 -0
  61. package/tools/language-tool/language.models.d.ts +4 -0
  62. package/tools/language-tool/language.service.d.ts +19 -0
  63. package/tools/network-mocker-tool/network-mocker-tool.component.d.ts +23 -0
  64. package/tools/network-mocker-tool/network-mocker.models.d.ts +16 -0
  65. package/tools/network-mocker-tool/network-mocker.service.d.ts +16 -0
  66. package/tools/permissions-tool/permissions-internal.service.d.ts +34 -0
  67. package/tools/permissions-tool/permissions-tool.component.d.ts +27 -0
  68. package/tools/permissions-tool/permissions.models.d.ts +34 -0
  69. package/tools/permissions-tool/permissions.service.d.ts +87 -0
  70. package/utils/storage.service.d.ts +18 -0
  71. package/eslint.config.cjs +0 -47
  72. package/ng-package.json +0 -7
  73. package/project.json +0 -37
  74. package/src/components/button/button.component.scss +0 -49
  75. package/src/components/button/button.component.ts +0 -36
  76. package/src/components/card/card.component.scss +0 -18
  77. package/src/components/card/card.component.ts +0 -30
  78. package/src/components/clickable-card/clickable-card.component.scss +0 -39
  79. package/src/components/clickable-card/clickable-card.component.ts +0 -34
  80. package/src/components/icons/angular-icon.component.ts +0 -35
  81. package/src/components/icons/bug-icon.component.ts +0 -23
  82. package/src/components/icons/code-icon.component.ts +0 -24
  83. package/src/components/icons/database-icon.component.ts +0 -27
  84. package/src/components/icons/discord-icon.component.ts +0 -23
  85. package/src/components/icons/docs-icon.component.ts +0 -23
  86. package/src/components/icons/export-icon.component.ts +0 -23
  87. package/src/components/icons/gauge-icon.component.ts +0 -27
  88. package/src/components/icons/gear-icon.component.ts +0 -27
  89. package/src/components/icons/git-branch-icon.component.ts +0 -27
  90. package/src/components/icons/icon.component.ts +0 -129
  91. package/src/components/icons/icon.models.ts +0 -27
  92. package/src/components/icons/import-icon.component.ts +0 -23
  93. package/src/components/icons/layout-icon.component.ts +0 -24
  94. package/src/components/icons/lightbulb-icon.component.ts +0 -23
  95. package/src/components/icons/lighting-icon.component.ts +0 -24
  96. package/src/components/icons/moon-icon.component.ts +0 -27
  97. package/src/components/icons/network-icon.component.ts +0 -27
  98. package/src/components/icons/puzzle-icon.component.ts +0 -27
  99. package/src/components/icons/refresh-icon.component.ts +0 -27
  100. package/src/components/icons/star-icon.component.ts +0 -27
  101. package/src/components/icons/sun-icon.component.ts +0 -27
  102. package/src/components/icons/terminal-icon.component.ts +0 -27
  103. package/src/components/icons/toggle-left-icon.component.ts +0 -27
  104. package/src/components/icons/translate-icon.component.ts +0 -23
  105. package/src/components/icons/trash-icon.component.ts +0 -23
  106. package/src/components/icons/users-icon.component.ts +0 -27
  107. package/src/components/input/input.component.ts +0 -67
  108. package/src/components/link-button/link-button.component.scss +0 -36
  109. package/src/components/link-button/link-button.component.ts +0 -29
  110. package/src/components/select/select.component.scss +0 -162
  111. package/src/components/select/select.component.ts +0 -127
  112. package/src/components/tool-button/tool-button.component.scss +0 -67
  113. package/src/components/tool-button/tool-button.component.ts +0 -126
  114. package/src/components/toolbar-tool/toolbar-tool.component.scss +0 -9
  115. package/src/components/toolbar-tool/toolbar-tool.component.ts +0 -169
  116. package/src/components/toolbar-tool/toolbar-tool.models.ts +0 -33
  117. package/src/components/window/window.component.scss +0 -95
  118. package/src/components/window/window.component.ts +0 -69
  119. package/src/dev-toolbar-state.service.ts +0 -89
  120. package/src/dev-toolbar.component.scss +0 -22
  121. package/src/dev-toolbar.component.ts +0 -105
  122. package/src/index.ts +0 -10
  123. package/src/models/dev-tools.interface.ts +0 -19
  124. package/src/styles.scss +0 -342
  125. package/src/test-setup.ts +0 -12
  126. package/src/tools/feature-flags-tool/feature-flags-internal.service.ts +0 -96
  127. package/src/tools/feature-flags-tool/feature-flags-tool.component.ts +0 -261
  128. package/src/tools/feature-flags-tool/feature-flags.models.ts +0 -10
  129. package/src/tools/feature-flags-tool/feature-flags.service.ts +0 -28
  130. package/src/tools/home-tool/home-tool.component.scss +0 -67
  131. package/src/tools/home-tool/home-tool.component.ts +0 -197
  132. package/src/tools/home-tool/settings.service.spec.ts +0 -59
  133. package/src/tools/home-tool/settings.service.ts +0 -21
  134. package/src/tools/language-tool/language-internal.service.ts +0 -51
  135. package/src/tools/language-tool/language-tool.component.scss +0 -7
  136. package/src/tools/language-tool/language-tool.component.ts +0 -71
  137. package/src/tools/language-tool/language.models.ts +0 -4
  138. package/src/tools/language-tool/language.service.ts +0 -26
  139. package/src/utils/storage.service.spec.ts +0 -179
  140. package/src/utils/storage.service.ts +0 -80
  141. package/tsconfig.json +0 -28
  142. package/tsconfig.lib.json +0 -28
  143. package/tsconfig.lib.prod.json +0 -9
  144. package/tsconfig.spec.json +0 -29
  145. package/vite.config.mts +0 -27
@@ -0,0 +1,4570 @@
1
+ import * as i0 from '@angular/core';
2
+ import { signal, computed, Injectable, Component, ChangeDetectionStrategy, input, inject, ElementRef, output, ViewChild, ContentChild, model, DestroyRef, isDevMode } from '@angular/core';
3
+ import { trigger, state, style, transition, animate } from '@angular/animations';
4
+ import * as i1 from '@angular/cdk/overlay';
5
+ import { CdkConnectedOverlay, OverlayModule } from '@angular/cdk/overlay';
6
+ import { toSignal, takeUntilDestroyed } from '@angular/core/rxjs-interop';
7
+ import { BehaviorSubject, combineLatest, map, firstValueFrom, fromEvent } from 'rxjs';
8
+ import { filter, throttleTime } from 'rxjs/operators';
9
+ import * as i1$1 from '@angular/forms';
10
+ import { FormsModule } from '@angular/forms';
11
+ import * as i2 from '@angular/cdk/menu';
12
+ import { CdkMenuModule } from '@angular/cdk/menu';
13
+ import { CommonModule } from '@angular/common';
14
+
15
+ class DevToolbarStateService {
16
+ constructor() {
17
+ // Initial state
18
+ this.state = signal({
19
+ isHidden: true,
20
+ activeToolId: null,
21
+ delay: 3000,
22
+ error: null,
23
+ theme: 'dark',
24
+ });
25
+ // Selectors
26
+ this.isVisible = computed(() => !this.state().isHidden || this.hasActiveTool());
27
+ this.isDarkTheme = computed(() => this.state().theme === 'dark');
28
+ this.activeToolId = computed(() => this.state().activeToolId);
29
+ this.hasActiveTool = computed(() => this.state().activeToolId !== null);
30
+ this.error = computed(() => this.state().error);
31
+ this.theme = computed(() => this.state().theme);
32
+ /**
33
+ * The delay to hide the toolbar
34
+ */
35
+ this.delay = computed(() => this.state().delay);
36
+ }
37
+ // State updates
38
+ setVisibility(isVisible) {
39
+ if (isVisible) {
40
+ this.state.update((state) => ({
41
+ ...state,
42
+ isHidden: false,
43
+ }));
44
+ }
45
+ else {
46
+ if (this.activeToolId() === null) {
47
+ setTimeout(() => {
48
+ this.state.update((state) => ({
49
+ ...state,
50
+ isHidden: true,
51
+ }));
52
+ }, this.state().delay);
53
+ }
54
+ }
55
+ }
56
+ setTheme(theme) {
57
+ this.state.update((state) => ({
58
+ ...state,
59
+ theme,
60
+ }));
61
+ }
62
+ setActiveTool(toolId) {
63
+ this.state.update((state) => ({
64
+ ...state,
65
+ activeToolId: toolId,
66
+ }));
67
+ if (toolId === null) {
68
+ this.setVisibility(false);
69
+ }
70
+ else {
71
+ this.setVisibility(true);
72
+ }
73
+ }
74
+ // Public actions
75
+ toggleTool(toolId) {
76
+ const currentToolId = this.activeToolId();
77
+ this.setActiveTool(currentToolId === toolId ? null : toolId);
78
+ }
79
+ toggleVisibility() {
80
+ this.state.update((state) => ({
81
+ ...state,
82
+ isHidden: !state.isHidden,
83
+ }));
84
+ }
85
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: DevToolbarStateService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
86
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: DevToolbarStateService, providedIn: 'root' }); }
87
+ }
88
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: DevToolbarStateService, decorators: [{
89
+ type: Injectable,
90
+ args: [{
91
+ providedIn: 'root',
92
+ }]
93
+ }] });
94
+
95
+ class AngularIconComponent {
96
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: AngularIconComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
97
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.0.5", type: AngularIconComponent, isStandalone: true, selector: "ndt-angular-icon", ngImport: i0, template: `
98
+ <svg width="24" height="24" viewBox="0 0 24 24" fill="none">
99
+ <defs>
100
+ <linearGradient
101
+ id="angular-gradient"
102
+ x1="6"
103
+ x2="18"
104
+ y1="20"
105
+ y2="4"
106
+ gradientUnits="userSpaceOnUse"
107
+ >
108
+ <stop offset="0" stop-color="#E40035" />
109
+ <stop offset=".24" stop-color="#F60A48" />
110
+ <stop offset=".352" stop-color="#F20755" />
111
+ <stop offset=".494" stop-color="#DC087D" />
112
+ <stop offset=".745" stop-color="#9717E7" />
113
+ <stop offset="1" stop-color="#6C00F5" />
114
+ </linearGradient>
115
+ </defs>
116
+ <g fill="url(#angular-gradient)">
117
+ <polygon points="14.1,2.7 20.1,15.7 20.7,5.8" />
118
+ <polygon points="15.6,16.4 8.4,16.4 7.4,18.6 12,21.2 16.6,18.6" />
119
+ <polygon points="9.6,13.5 14.4,13.5 12,7.7" />
120
+ <polygon points="9.9,2.7 3.3,5.8 3.9,15.7" />
121
+ </g>
122
+ </svg>
123
+ `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
124
+ }
125
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: AngularIconComponent, decorators: [{
126
+ type: Component,
127
+ args: [{
128
+ selector: 'ndt-angular-icon',
129
+ standalone: true,
130
+ changeDetection: ChangeDetectionStrategy.OnPush,
131
+ template: `
132
+ <svg width="24" height="24" viewBox="0 0 24 24" fill="none">
133
+ <defs>
134
+ <linearGradient
135
+ id="angular-gradient"
136
+ x1="6"
137
+ x2="18"
138
+ y1="20"
139
+ y2="4"
140
+ gradientUnits="userSpaceOnUse"
141
+ >
142
+ <stop offset="0" stop-color="#E40035" />
143
+ <stop offset=".24" stop-color="#F60A48" />
144
+ <stop offset=".352" stop-color="#F20755" />
145
+ <stop offset=".494" stop-color="#DC087D" />
146
+ <stop offset=".745" stop-color="#9717E7" />
147
+ <stop offset="1" stop-color="#6C00F5" />
148
+ </linearGradient>
149
+ </defs>
150
+ <g fill="url(#angular-gradient)">
151
+ <polygon points="14.1,2.7 20.1,15.7 20.7,5.8" />
152
+ <polygon points="15.6,16.4 8.4,16.4 7.4,18.6 12,21.2 16.6,18.6" />
153
+ <polygon points="9.6,13.5 14.4,13.5 12,7.7" />
154
+ <polygon points="9.9,2.7 3.3,5.8 3.9,15.7" />
155
+ </g>
156
+ </svg>
157
+ `,
158
+ }]
159
+ }] });
160
+
161
+ class BoltIconComponent {
162
+ constructor() {
163
+ this.fill = input('#FFFF');
164
+ }
165
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: BoltIconComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
166
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.0.5", type: BoltIconComponent, isStandalone: true, selector: "ndt-bolt-icon", inputs: { fill: { classPropertyName: "fill", publicName: "fill", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
167
+ <svg
168
+ [attr.fill]="fill()"
169
+ xmlns="http://www.w3.org/2000/svg"
170
+ width="24"
171
+ height="24"
172
+ viewBox="0 0 256 256"
173
+ >
174
+ <path
175
+ d="M160,16,144,96H208l-96,144,16-80H64Z"
176
+ opacity="0.2"
177
+ ></path>
178
+ <path
179
+ d="M215.79,118.17a8,8,0,0,0-5-5.66L153.18,90.9l14.66-73.33a8,8,0,0,0-13.69-7l-112,120a8,8,0,0,0,3,13l57.63,21.61L88.16,238.43a8,8,0,0,0,13.69,7l112-120A8,8,0,0,0,215.79,118.17ZM109.37,214l10.47-52.38a8,8,0,0,0-5-9.06L62,132.71l84.62-90.66L136.16,94.43a8,8,0,0,0,5,9.06l52.8,19.8Z"
180
+ ></path>
181
+ </svg>
182
+ `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
183
+ }
184
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: BoltIconComponent, decorators: [{
185
+ type: Component,
186
+ args: [{
187
+ selector: 'ndt-bolt-icon',
188
+ standalone: true,
189
+ changeDetection: ChangeDetectionStrategy.OnPush,
190
+ template: `
191
+ <svg
192
+ [attr.fill]="fill()"
193
+ xmlns="http://www.w3.org/2000/svg"
194
+ width="24"
195
+ height="24"
196
+ viewBox="0 0 256 256"
197
+ >
198
+ <path
199
+ d="M160,16,144,96H208l-96,144,16-80H64Z"
200
+ opacity="0.2"
201
+ ></path>
202
+ <path
203
+ d="M215.79,118.17a8,8,0,0,0-5-5.66L153.18,90.9l14.66-73.33a8,8,0,0,0-13.69-7l-112,120a8,8,0,0,0,3,13l57.63,21.61L88.16,238.43a8,8,0,0,0,13.69,7l112-120A8,8,0,0,0,215.79,118.17ZM109.37,214l10.47-52.38a8,8,0,0,0-5-9.06L62,132.71l84.62-90.66L136.16,94.43a8,8,0,0,0,5,9.06l52.8,19.8Z"
204
+ ></path>
205
+ </svg>
206
+ `,
207
+ }]
208
+ }] });
209
+
210
+ class BugIconComponent {
211
+ constructor() {
212
+ this.fill = input('#FFFF');
213
+ }
214
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: BugIconComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
215
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.0.5", type: BugIconComponent, isStandalone: true, selector: "ndt-bug-icon", inputs: { fill: { classPropertyName: "fill", publicName: "fill", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
216
+ <svg
217
+ [attr.fill]="fill()"
218
+ xmlns="http://www.w3.org/2000/svg"
219
+ width="24"
220
+ height="24"
221
+ viewBox="0 0 256 256"
222
+ >
223
+ <path
224
+ d="M140,88a16,16,0,1,1,16,16A16,16,0,0,1,140,88ZM100,72a16,16,0,1,0,16,16A16,16,0,0,0,100,72Zm120,72a91.84,91.84,0,0,1-2.34,20.64L236.81,173a12,12,0,0,1-9.62,22l-18-7.85a92,92,0,0,1-162.46,0l-18,7.85a12,12,0,1,1-9.62-22l19.15-8.36A91.84,91.84,0,0,1,36,144v-4H16a12,12,0,0,1,0-24H36v-4a91.84,91.84,0,0,1,2.34-20.64L19.19,83a12,12,0,0,1,9.62-22l18,7.85a92,92,0,0,1,162.46,0l18-7.85a12,12,0,1,1,9.62,22l-19.15,8.36A91.84,91.84,0,0,1,220,112v4h20a12,12,0,0,1,0,24H220ZM60,116H196v-4a68,68,0,0,0-136,0Zm56,94.92V140H60v4A68.1,68.1,0,0,0,116,210.92ZM196,144v-4H140v70.92A68.1,68.1,0,0,0,196,144Z"
225
+ ></path>
226
+ </svg>
227
+ `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
228
+ }
229
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: BugIconComponent, decorators: [{
230
+ type: Component,
231
+ args: [{
232
+ selector: 'ndt-bug-icon',
233
+ standalone: true,
234
+ changeDetection: ChangeDetectionStrategy.OnPush,
235
+ template: `
236
+ <svg
237
+ [attr.fill]="fill()"
238
+ xmlns="http://www.w3.org/2000/svg"
239
+ width="24"
240
+ height="24"
241
+ viewBox="0 0 256 256"
242
+ >
243
+ <path
244
+ d="M140,88a16,16,0,1,1,16,16A16,16,0,0,1,140,88ZM100,72a16,16,0,1,0,16,16A16,16,0,0,0,100,72Zm120,72a91.84,91.84,0,0,1-2.34,20.64L236.81,173a12,12,0,0,1-9.62,22l-18-7.85a92,92,0,0,1-162.46,0l-18,7.85a12,12,0,1,1-9.62-22l19.15-8.36A91.84,91.84,0,0,1,36,144v-4H16a12,12,0,0,1,0-24H36v-4a91.84,91.84,0,0,1,2.34-20.64L19.19,83a12,12,0,0,1,9.62-22l18,7.85a92,92,0,0,1,162.46,0l18-7.85a12,12,0,1,1,9.62,22l-19.15,8.36A91.84,91.84,0,0,1,220,112v4h20a12,12,0,0,1,0,24H220ZM60,116H196v-4a68,68,0,0,0-136,0Zm56,94.92V140H60v4A68.1,68.1,0,0,0,116,210.92ZM196,144v-4H140v70.92A68.1,68.1,0,0,0,196,144Z"
245
+ ></path>
246
+ </svg>
247
+ `,
248
+ }]
249
+ }] });
250
+
251
+ class CodeIconComponent {
252
+ constructor() {
253
+ this.fill = input('#FFFF');
254
+ }
255
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: CodeIconComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
256
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.0.5", type: CodeIconComponent, isStandalone: true, selector: "ndt-code-icon", inputs: { fill: { classPropertyName: "fill", publicName: "fill", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
257
+ <svg
258
+ [attr.fill]="fill()"
259
+ xmlns="http://www.w3.org/2000/svg"
260
+ width="24"
261
+ height="24"
262
+ viewBox="0 0 256 256"
263
+ >
264
+ <path d="M240,128l-48,40H64L16,128,64,88H192Z" opacity="0.2"></path>
265
+ <path
266
+ d="M69.12,94.15,28.5,128l40.62,33.85a8,8,0,1,1-10.24,12.29l-48-40a8,8,0,0,1,0-12.29l48-40a8,8,0,0,1,10.24,12.3Zm176,27.7-48-40a8,8,0,1,0-10.24,12.3L227.5,128l-40.62,33.85a8,8,0,1,0,10.24,12.29l48-40a8,8,0,0,0,0-12.29ZM162.73,32.48a8,8,0,0,0-10.25,4.79l-64,176a8,8,0,0,0,4.79,10.26A8.14,8.14,0,0,0,96,224a8,8,0,0,0,7.52-5.27l64-176A8,8,0,0,0,162.73,32.48Z"
267
+ ></path>
268
+ </svg>
269
+ `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
270
+ }
271
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: CodeIconComponent, decorators: [{
272
+ type: Component,
273
+ args: [{
274
+ selector: 'ndt-code-icon',
275
+ standalone: true,
276
+ template: `
277
+ <svg
278
+ [attr.fill]="fill()"
279
+ xmlns="http://www.w3.org/2000/svg"
280
+ width="24"
281
+ height="24"
282
+ viewBox="0 0 256 256"
283
+ >
284
+ <path d="M240,128l-48,40H64L16,128,64,88H192Z" opacity="0.2"></path>
285
+ <path
286
+ d="M69.12,94.15,28.5,128l40.62,33.85a8,8,0,1,1-10.24,12.29l-48-40a8,8,0,0,1,0-12.29l48-40a8,8,0,0,1,10.24,12.3Zm176,27.7-48-40a8,8,0,1,0-10.24,12.3L227.5,128l-40.62,33.85a8,8,0,1,0,10.24,12.29l48-40a8,8,0,0,0,0-12.29ZM162.73,32.48a8,8,0,0,0-10.25,4.79l-64,176a8,8,0,0,0,4.79,10.26A8.14,8.14,0,0,0,96,224a8,8,0,0,0,7.52-5.27l64-176A8,8,0,0,0,162.73,32.48Z"
287
+ ></path>
288
+ </svg>
289
+ `,
290
+ changeDetection: ChangeDetectionStrategy.OnPush,
291
+ }]
292
+ }] });
293
+
294
+ class DatabaseIconComponent {
295
+ constructor() {
296
+ this.fill = input('#FFFF');
297
+ }
298
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: DatabaseIconComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
299
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.0.5", type: DatabaseIconComponent, isStandalone: true, selector: "ndt-database-icon", inputs: { fill: { classPropertyName: "fill", publicName: "fill", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
300
+ <svg
301
+ [attr.fill]="fill()"
302
+ xmlns="http://www.w3.org/2000/svg"
303
+ width="24"
304
+ height="24"
305
+ viewBox="0 0 256 256"
306
+ >
307
+ <path
308
+ d="M216,80c0,26.51-39.4,48-88,48S40,106.51,40,80s39.4-48,88-48S216,53.49,216,80Z"
309
+ opacity="0.2"
310
+ ></path>
311
+ <path
312
+ d="M128,24C74.17,24,32,48.6,32,80v96c0,31.4,42.17,56,96,56s96-24.6,96-56V80C224,48.6,181.83,24,128,24Zm80,104c0,9.62-7.88,19.43-21.61,26.92C170.93,163.35,150.19,168,128,168s-42.93-4.65-58.39-13.08C55.88,147.43,48,137.62,48,128V111.36c17.06,15,46.23,24.64,80,24.64s62.94-9.68,80-24.64ZM69.61,53.08C85.07,44.65,105.81,40,128,40s42.93,4.65,58.39,13.08C200.12,60.57,208,70.38,208,80s-7.88,19.43-21.61,26.92C170.93,115.35,150.19,120,128,120s-42.93-4.65-58.39-13.08C55.88,99.43,48,89.62,48,80S55.88,60.57,69.61,53.08ZM186.39,202.92C170.93,211.35,150.19,216,128,216s-42.93-4.65-58.39-13.08C55.88,195.43,48,185.62,48,176V159.36c17.06,15,46.23,24.64,80,24.64s62.94-9.68,80-24.64V176C208,185.62,200.12,195.43,186.39,202.92Z"
313
+ ></path>
314
+ </svg>
315
+ `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
316
+ }
317
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: DatabaseIconComponent, decorators: [{
318
+ type: Component,
319
+ args: [{
320
+ selector: 'ndt-database-icon',
321
+ standalone: true,
322
+ changeDetection: ChangeDetectionStrategy.OnPush,
323
+ template: `
324
+ <svg
325
+ [attr.fill]="fill()"
326
+ xmlns="http://www.w3.org/2000/svg"
327
+ width="24"
328
+ height="24"
329
+ viewBox="0 0 256 256"
330
+ >
331
+ <path
332
+ d="M216,80c0,26.51-39.4,48-88,48S40,106.51,40,80s39.4-48,88-48S216,53.49,216,80Z"
333
+ opacity="0.2"
334
+ ></path>
335
+ <path
336
+ d="M128,24C74.17,24,32,48.6,32,80v96c0,31.4,42.17,56,96,56s96-24.6,96-56V80C224,48.6,181.83,24,128,24Zm80,104c0,9.62-7.88,19.43-21.61,26.92C170.93,163.35,150.19,168,128,168s-42.93-4.65-58.39-13.08C55.88,147.43,48,137.62,48,128V111.36c17.06,15,46.23,24.64,80,24.64s62.94-9.68,80-24.64ZM69.61,53.08C85.07,44.65,105.81,40,128,40s42.93,4.65,58.39,13.08C200.12,60.57,208,70.38,208,80s-7.88,19.43-21.61,26.92C170.93,115.35,150.19,120,128,120s-42.93-4.65-58.39-13.08C55.88,99.43,48,89.62,48,80S55.88,60.57,69.61,53.08ZM186.39,202.92C170.93,211.35,150.19,216,128,216s-42.93-4.65-58.39-13.08C55.88,195.43,48,185.62,48,176V159.36c17.06,15,46.23,24.64,80,24.64s62.94-9.68,80-24.64V176C208,185.62,200.12,195.43,186.39,202.92Z"
337
+ ></path>
338
+ </svg>
339
+ `,
340
+ }]
341
+ }] });
342
+
343
+ class DiscordIconComponent {
344
+ constructor() {
345
+ this.fill = input('#000000');
346
+ }
347
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: DiscordIconComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
348
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.0.5", type: DiscordIconComponent, isStandalone: true, selector: "ndt-discord-icon", inputs: { fill: { classPropertyName: "fill", publicName: "fill", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
349
+ <svg
350
+ [attr.fill]="fill()"
351
+ xmlns="http://www.w3.org/2000/svg"
352
+ width="24"
353
+ height="24"
354
+ viewBox="0 0 256 256"
355
+ >
356
+ <path
357
+ d="M104,140a12,12,0,1,1-12-12A12,12,0,0,1,104,140Zm60-12a12,12,0,1,0,12,12A12,12,0,0,0,164,128Zm74.45,64.9-67,29.71a16.17,16.17,0,0,1-21.71-9.1l-8.11-22q-6.72.45-13.63.46t-13.63-.46l-8.11,22a16.18,16.18,0,0,1-21.71,9.1l-67-29.71a15.93,15.93,0,0,1-9.06-18.51L38,58A16.07,16.07,0,0,1,51,46.14l36.06-5.93a16.22,16.22,0,0,1,18.26,11.88l3.26,12.84Q118.11,64,128,64t19.4.93l3.26-12.84a16.21,16.21,0,0,1,18.26-11.88L205,46.14A16.07,16.07,0,0,1,218,58l29.53,116.38A15.93,15.93,0,0,1,238.45,192.9ZM232,178.28,202.47,62s0,0-.08,0L166.33,56a.17.17,0,0,0-.17,0l-2.83,11.14c5,.94,10,2.06,14.83,3.42A8,8,0,0,1,176,86.31a8.09,8.09,0,0,1-2.16-.3A172.25,172.25,0,0,0,128,80a172.25,172.25,0,0,0-45.84,6,8,8,0,1,1-4.32-15.4c4.82-1.36,9.78-2.48,14.82-3.42L89.83,56s0,0-.12,0h0L53.61,61.93a.17.17,0,0,0-.09,0L24,178.33,91,208a.23.23,0,0,0,.22,0L98,189.72a173.2,173.2,0,0,1-20.14-4.32A8,8,0,0,1,82.16,170,171.85,171.85,0,0,0,128,176a171.85,171.85,0,0,0,45.84-6,8,8,0,0,1,4.32,15.41A173.2,173.2,0,0,1,158,189.72L164.75,208a.22.22,0,0,0,.21,0Z"
358
+ ></path>
359
+ </svg>
360
+ `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
361
+ }
362
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: DiscordIconComponent, decorators: [{
363
+ type: Component,
364
+ args: [{
365
+ selector: 'ndt-discord-icon',
366
+ standalone: true,
367
+ changeDetection: ChangeDetectionStrategy.OnPush,
368
+ template: `
369
+ <svg
370
+ [attr.fill]="fill()"
371
+ xmlns="http://www.w3.org/2000/svg"
372
+ width="24"
373
+ height="24"
374
+ viewBox="0 0 256 256"
375
+ >
376
+ <path
377
+ d="M104,140a12,12,0,1,1-12-12A12,12,0,0,1,104,140Zm60-12a12,12,0,1,0,12,12A12,12,0,0,0,164,128Zm74.45,64.9-67,29.71a16.17,16.17,0,0,1-21.71-9.1l-8.11-22q-6.72.45-13.63.46t-13.63-.46l-8.11,22a16.18,16.18,0,0,1-21.71,9.1l-67-29.71a15.93,15.93,0,0,1-9.06-18.51L38,58A16.07,16.07,0,0,1,51,46.14l36.06-5.93a16.22,16.22,0,0,1,18.26,11.88l3.26,12.84Q118.11,64,128,64t19.4.93l3.26-12.84a16.21,16.21,0,0,1,18.26-11.88L205,46.14A16.07,16.07,0,0,1,218,58l29.53,116.38A15.93,15.93,0,0,1,238.45,192.9ZM232,178.28,202.47,62s0,0-.08,0L166.33,56a.17.17,0,0,0-.17,0l-2.83,11.14c5,.94,10,2.06,14.83,3.42A8,8,0,0,1,176,86.31a8.09,8.09,0,0,1-2.16-.3A172.25,172.25,0,0,0,128,80a172.25,172.25,0,0,0-45.84,6,8,8,0,1,1-4.32-15.4c4.82-1.36,9.78-2.48,14.82-3.42L89.83,56s0,0-.12,0h0L53.61,61.93a.17.17,0,0,0-.09,0L24,178.33,91,208a.23.23,0,0,0,.22,0L98,189.72a173.2,173.2,0,0,1-20.14-4.32A8,8,0,0,1,82.16,170,171.85,171.85,0,0,0,128,176a171.85,171.85,0,0,0,45.84-6,8,8,0,0,1,4.32,15.41A173.2,173.2,0,0,1,158,189.72L164.75,208a.22.22,0,0,0,.21,0Z"
378
+ ></path>
379
+ </svg>
380
+ `,
381
+ }]
382
+ }] });
383
+
384
+ class DocsIconComponent {
385
+ constructor() {
386
+ this.fill = input('#FFFF');
387
+ }
388
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: DocsIconComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
389
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.0.5", type: DocsIconComponent, isStandalone: true, selector: "ndt-docs-icon", inputs: { fill: { classPropertyName: "fill", publicName: "fill", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
390
+ <svg
391
+ [attr.fill]="fill()"
392
+ xmlns="http://www.w3.org/2000/svg"
393
+ width="24"
394
+ height="24"
395
+ viewBox="0 0 256 256"
396
+ >
397
+ <path
398
+ d="M213.66,66.34l-40-40A8,8,0,0,0,168,24H88A16,16,0,0,0,72,40V56H56A16,16,0,0,0,40,72V216a16,16,0,0,0,16,16H168a16,16,0,0,0,16-16V200h16a16,16,0,0,0,16-16V72A8,8,0,0,0,213.66,66.34ZM168,216H56V72h76.69L168,107.31v84.53c0,.06,0,.11,0,.16s0,.1,0,.16V216Zm32-32H184V104a8,8,0,0,0-2.34-5.66l-40-40A8,8,0,0,0,136,56H88V40h76.69L200,75.31Zm-56-32a8,8,0,0,1-8,8H88a8,8,0,0,1,0-16h48A8,8,0,0,1,144,152Zm0,32a8,8,0,0,1-8,8H88a8,8,0,0,1,0-16h48A8,8,0,0,1,144,184Z"
399
+ ></path>
400
+ </svg>
401
+ `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
402
+ }
403
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: DocsIconComponent, decorators: [{
404
+ type: Component,
405
+ args: [{
406
+ selector: 'ndt-docs-icon',
407
+ standalone: true,
408
+ changeDetection: ChangeDetectionStrategy.OnPush,
409
+ template: `
410
+ <svg
411
+ [attr.fill]="fill()"
412
+ xmlns="http://www.w3.org/2000/svg"
413
+ width="24"
414
+ height="24"
415
+ viewBox="0 0 256 256"
416
+ >
417
+ <path
418
+ d="M213.66,66.34l-40-40A8,8,0,0,0,168,24H88A16,16,0,0,0,72,40V56H56A16,16,0,0,0,40,72V216a16,16,0,0,0,16,16H168a16,16,0,0,0,16-16V200h16a16,16,0,0,0,16-16V72A8,8,0,0,0,213.66,66.34ZM168,216H56V72h76.69L168,107.31v84.53c0,.06,0,.11,0,.16s0,.1,0,.16V216Zm32-32H184V104a8,8,0,0,0-2.34-5.66l-40-40A8,8,0,0,0,136,56H88V40h76.69L200,75.31Zm-56-32a8,8,0,0,1-8,8H88a8,8,0,0,1,0-16h48A8,8,0,0,1,144,152Zm0,32a8,8,0,0,1-8,8H88a8,8,0,0,1,0-16h48A8,8,0,0,1,144,184Z"
419
+ ></path>
420
+ </svg>
421
+ `,
422
+ }]
423
+ }] });
424
+
425
+ class ExportIconComponent {
426
+ constructor() {
427
+ this.fill = input('#FFFF');
428
+ }
429
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: ExportIconComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
430
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.0.5", type: ExportIconComponent, isStandalone: true, selector: "ndt-export-icon", inputs: { fill: { classPropertyName: "fill", publicName: "fill", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
431
+ <svg
432
+ [attr.fill]="fill()"
433
+ xmlns="http://www.w3.org/2000/svg"
434
+ width="24"
435
+ height="24"
436
+ viewBox="0 0 256 256"
437
+ >
438
+ <path
439
+ d="M216,112v96a16,16,0,0,1-16,16H56a16,16,0,0,1-16-16V112A16,16,0,0,1,56,96H80a8,8,0,0,1,0,16H56v96H200V112H176a8,8,0,0,1,0-16h24A16,16,0,0,1,216,112ZM93.66,69.66,120,43.31V136a8,8,0,0,0,16,0V43.31l26.34,26.35a8,8,0,0,0,11.32-11.32l-40-40a8,8,0,0,0-11.32,0l-40,40A8,8,0,0,0,93.66,69.66Z"
440
+ ></path>
441
+ </svg>
442
+ `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
443
+ }
444
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: ExportIconComponent, decorators: [{
445
+ type: Component,
446
+ args: [{
447
+ selector: 'ndt-export-icon',
448
+ standalone: true,
449
+ changeDetection: ChangeDetectionStrategy.OnPush,
450
+ template: `
451
+ <svg
452
+ [attr.fill]="fill()"
453
+ xmlns="http://www.w3.org/2000/svg"
454
+ width="24"
455
+ height="24"
456
+ viewBox="0 0 256 256"
457
+ >
458
+ <path
459
+ d="M216,112v96a16,16,0,0,1-16,16H56a16,16,0,0,1-16-16V112A16,16,0,0,1,56,96H80a8,8,0,0,1,0,16H56v96H200V112H176a8,8,0,0,1,0-16h24A16,16,0,0,1,216,112ZM93.66,69.66,120,43.31V136a8,8,0,0,0,16,0V43.31l26.34,26.35a8,8,0,0,0,11.32-11.32l-40-40a8,8,0,0,0-11.32,0l-40,40A8,8,0,0,0,93.66,69.66Z"
460
+ ></path>
461
+ </svg>
462
+ `,
463
+ }]
464
+ }] });
465
+
466
+ class FilterIconComponent {
467
+ constructor() {
468
+ this.fill = input('#FFFF');
469
+ }
470
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: FilterIconComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
471
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.0.5", type: FilterIconComponent, isStandalone: true, selector: "ndt-filter-icon", inputs: { fill: { classPropertyName: "fill", publicName: "fill", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
472
+ <svg
473
+ [attr.fill]="fill()"
474
+ xmlns="http://www.w3.org/2000/svg"
475
+ width="24"
476
+ height="24"
477
+ viewBox="0 0 256 256"
478
+ >
479
+ <path
480
+ d="M227.81,66.76l-.08.09L160,139.17v55.49A8,8,0,0,1,156.94,201l-32,21.33A8,8,0,0,1,112,216V139.17L44.27,66.85l-.08-.09A16,16,0,0,1,56,40H200a16,16,0,0,1,11.84,26.76Z"
481
+ opacity="0.2"
482
+ ></path>
483
+ <path
484
+ d="M230.6,49.53A23.94,23.94,0,0,0,200,32H56A24,24,0,0,0,38.15,65.67L104,139.37V216a8,8,0,0,0,11.58,7.16l32-16A8,8,0,0,0,152,200V139.37l65.85-73.7A23.93,23.93,0,0,0,230.6,49.53ZM203.36,54.86a8,8,0,0,1,.07,9.12L136,139.17V196.58l-16,8V139.17L52.57,64A8,8,0,0,1,56,48H200A8,8,0,0,1,203.36,54.86Z"
485
+ ></path>
486
+ </svg>
487
+ `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
488
+ }
489
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: FilterIconComponent, decorators: [{
490
+ type: Component,
491
+ args: [{
492
+ selector: 'ndt-filter-icon',
493
+ standalone: true,
494
+ changeDetection: ChangeDetectionStrategy.OnPush,
495
+ template: `
496
+ <svg
497
+ [attr.fill]="fill()"
498
+ xmlns="http://www.w3.org/2000/svg"
499
+ width="24"
500
+ height="24"
501
+ viewBox="0 0 256 256"
502
+ >
503
+ <path
504
+ d="M227.81,66.76l-.08.09L160,139.17v55.49A8,8,0,0,1,156.94,201l-32,21.33A8,8,0,0,1,112,216V139.17L44.27,66.85l-.08-.09A16,16,0,0,1,56,40H200a16,16,0,0,1,11.84,26.76Z"
505
+ opacity="0.2"
506
+ ></path>
507
+ <path
508
+ d="M230.6,49.53A23.94,23.94,0,0,0,200,32H56A24,24,0,0,0,38.15,65.67L104,139.37V216a8,8,0,0,0,11.58,7.16l32-16A8,8,0,0,0,152,200V139.37l65.85-73.7A23.93,23.93,0,0,0,230.6,49.53ZM203.36,54.86a8,8,0,0,1,.07,9.12L136,139.17V196.58l-16,8V139.17L52.57,64A8,8,0,0,1,56,48H200A8,8,0,0,1,203.36,54.86Z"
509
+ ></path>
510
+ </svg>
511
+ `,
512
+ }]
513
+ }] });
514
+
515
+ class GaugeIconComponent {
516
+ constructor() {
517
+ this.fill = input('#FFFF');
518
+ }
519
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: GaugeIconComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
520
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.0.5", type: GaugeIconComponent, isStandalone: true, selector: "ndt-gauge-icon", inputs: { fill: { classPropertyName: "fill", publicName: "fill", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
521
+ <svg
522
+ [attr.fill]="fill()"
523
+ xmlns="http://www.w3.org/2000/svg"
524
+ width="24"
525
+ height="24"
526
+ viewBox="0 0 256 256"
527
+ >
528
+ <path
529
+ d="M232,152a103.93,103.93,0,0,1-5.9,34.63,8,8,0,0,1-7.57,5.37H37.46a8.05,8.05,0,0,1-7.57-5.41A104.06,104.06,0,0,1,24,151.19C24.44,94,71.73,47.49,129,48A104,104,0,0,1,232,152Z"
530
+ opacity="0.2"
531
+ ></path>
532
+ <path
533
+ d="M114.34,154.34l96-96a8,8,0,0,1,11.32,11.32l-96,96a8,8,0,0,1-11.32-11.32ZM128,88a63.9,63.9,0,0,1,20.44,3.33,8,8,0,1,0,5.11-15.16A80,80,0,0,0,48.49,160.88,8,8,0,0,0,56.43,168c.29,0,.59,0,.89-.05a8,8,0,0,0,7.07-8.83A64.92,64.92,0,0,1,64,152,64.07,64.07,0,0,1,128,88Zm99.74,13a8,8,0,0,0-14.24,7.3,96.27,96.27,0,0,1,5,75.71l-181.1-.07A96.24,96.24,0,0,1,128,56h.88a95,95,0,0,1,42.82,10.5A8,8,0,1,0,179,52.27,110.8,110.8,0,0,0,129,40h-1A112.05,112.05,0,0,0,22.35,189.25,16.07,16.07,0,0,0,37.46,200H218.53a16,16,0,0,0,15.11-10.71,112.35,112.35,0,0,0-5.9-88.3Z"
534
+ ></path>
535
+ </svg>
536
+ `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
537
+ }
538
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: GaugeIconComponent, decorators: [{
539
+ type: Component,
540
+ args: [{
541
+ selector: 'ndt-gauge-icon',
542
+ standalone: true,
543
+ changeDetection: ChangeDetectionStrategy.OnPush,
544
+ template: `
545
+ <svg
546
+ [attr.fill]="fill()"
547
+ xmlns="http://www.w3.org/2000/svg"
548
+ width="24"
549
+ height="24"
550
+ viewBox="0 0 256 256"
551
+ >
552
+ <path
553
+ d="M232,152a103.93,103.93,0,0,1-5.9,34.63,8,8,0,0,1-7.57,5.37H37.46a8.05,8.05,0,0,1-7.57-5.41A104.06,104.06,0,0,1,24,151.19C24.44,94,71.73,47.49,129,48A104,104,0,0,1,232,152Z"
554
+ opacity="0.2"
555
+ ></path>
556
+ <path
557
+ d="M114.34,154.34l96-96a8,8,0,0,1,11.32,11.32l-96,96a8,8,0,0,1-11.32-11.32ZM128,88a63.9,63.9,0,0,1,20.44,3.33,8,8,0,1,0,5.11-15.16A80,80,0,0,0,48.49,160.88,8,8,0,0,0,56.43,168c.29,0,.59,0,.89-.05a8,8,0,0,0,7.07-8.83A64.92,64.92,0,0,1,64,152,64.07,64.07,0,0,1,128,88Zm99.74,13a8,8,0,0,0-14.24,7.3,96.27,96.27,0,0,1,5,75.71l-181.1-.07A96.24,96.24,0,0,1,128,56h.88a95,95,0,0,1,42.82,10.5A8,8,0,1,0,179,52.27,110.8,110.8,0,0,0,129,40h-1A112.05,112.05,0,0,0,22.35,189.25,16.07,16.07,0,0,0,37.46,200H218.53a16,16,0,0,0,15.11-10.71,112.35,112.35,0,0,0-5.9-88.3Z"
558
+ ></path>
559
+ </svg>
560
+ `,
561
+ }]
562
+ }] });
563
+
564
+ class GearIconComponent {
565
+ constructor() {
566
+ this.fill = input('#FFFF');
567
+ }
568
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: GearIconComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
569
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.0.5", type: GearIconComponent, isStandalone: true, selector: "ndt-gear-icon", inputs: { fill: { classPropertyName: "fill", publicName: "fill", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
570
+ <svg
571
+ [attr.fill]="fill()"
572
+ xmlns="http://www.w3.org/2000/svg"
573
+ width="24"
574
+ height="24"
575
+ viewBox="0 0 256 256"
576
+ >
577
+ <path
578
+ d="M207.86,123.18l16.78-21a99.14,99.14,0,0,0-10.07-24.29l-26.7-3a81,81,0,0,0-6.81-6.81l-3-26.71a99.43,99.43,0,0,0-24.3-10l-21,16.77a81.59,81.59,0,0,0-9.64,0l-21-16.78A99.14,99.14,0,0,0,77.91,41.43l-3,26.7a81,81,0,0,0-6.81,6.81l-26.71,3a99.43,99.43,0,0,0-10,24.3l16.77,21a81.59,81.59,0,0,0,0,9.64l-16.78,21a99.14,99.14,0,0,0,10.07,24.29l26.7,3a81,81,0,0,0,6.81,6.81l3,26.71a99.43,99.43,0,0,0,24.3,10l21-16.77a81.59,81.59,0,0,0,9.64,0l21,16.78a99.14,99.14,0,0,0,24.29-10.07l3-26.7a81,81,0,0,0,6.81-6.81l26.71-3a99.43,99.43,0,0,0,10-24.3l-16.77-21A81.59,81.59,0,0,0,207.86,123.18ZM128,168a40,40,0,1,1,40-40A40,40,0,0,1,128,168Z"
579
+ opacity="0.2"
580
+ ></path>
581
+ <path
582
+ d="M128,80a48,48,0,1,0,48,48A48.05,48.05,0,0,0,128,80Zm0,80a32,32,0,1,1,32-32A32,32,0,0,1,128,160Zm88-29.84q.06-2.16,0-4.32l14.92-18.64a8,8,0,0,0,1.48-7.06,107.6,107.6,0,0,0-10.88-26.25,8,8,0,0,0-6-3.93l-23.72-2.64q-1.48-1.56-3-3L186,40.54a8,8,0,0,0-3.94-6,107.29,107.29,0,0,0-26.25-10.86,8,8,0,0,0-7.06,1.48L130.16,40Q128,40,125.84,40L107.2,25.11a8,8,0,0,0-7.06-1.48A107.6,107.6,0,0,0,73.89,34.51a8,8,0,0,0-3.93,6L67.32,64.27q-1.56,1.49-3,3L40.54,70a8,8,0,0,0-6,3.94,107.71,107.71,0,0,0-10.87,26.25,8,8,0,0,0,1.49,7.06L40,125.84Q40,128,40,130.16L25.11,148.8a8,8,0,0,0-1.48,7.06,107.6,107.6,0,0,0,10.88,26.25,8,8,0,0,0,6,3.93l23.72,2.64q1.49,1.56,3,3L70,215.46a8,8,0,0,0,3.94,6,107.71,107.71,0,0,0,26.25,10.87,8,8,0,0,0,7.06-1.49L125.84,216q2.16.06,4.32,0l18.64,14.92a8,8,0,0,0,7.06,1.48,107.21,107.21,0,0,0,26.25-10.88,8,8,0,0,0,3.93-6l2.64-23.72q1.56-1.48,3-3L215.46,186a8,8,0,0,0,6-3.94,107.71,107.71,0,0,0,10.87-26.25,8,8,0,0,0-1.49-7.06Zm-16.1-6.5a73.93,73.93,0,0,1,0,8.68,8,8,0,0,0,1.74,5.48l14.19,17.73a91.57,91.57,0,0,1-6.23,15L187,173.11a8,8,0,0,0-5.1,2.64,74.11,74.11,0,0,1-6.14,6.14,8,8,0,0,0-2.64,5.1l-2.51,22.58a91.32,91.32,0,0,1-15,6.23l-17.74-14.19a8,8,0,0,0-5-1.75h-.48a73.93,73.93,0,0,1-8.68,0,8.06,8.06,0,0,0-5.48,1.74L100.45,215.8a91.57,91.57,0,0,1-15-6.23L82.89,187a8,8,0,0,0-2.64-5.1,74.11,74.11,0,0,1-6.14-6.14,8,8,0,0,0-5.1-2.64L46.43,170.6a91.32,91.32,0,0,1-6.23-15l14.19-17.74a8,8,0,0,0,1.74-5.48,73.93,73.93,0,0,1,0-8.68,8,8,0,0,0-1.74-5.48L40.2,100.45a91.57,91.57,0,0,1,6.23-15L69,82.89a8,8,0,0,0,5.1-2.64,74.11,74.11,0,0,1,6.14-6.14A8,8,0,0,0,82.89,69L85.4,46.43a91.32,91.32,0,0,1,15-6.23l17.74,14.19a8,8,0,0,0,5.48,1.74,73.93,73.93,0,0,1,8.68,0,8.06,8.06,0,0,0,5.48-1.74L155.55,40.2a91.57,91.57,0,0,1,15,6.23L173.11,69a8,8,0,0,0,2.64,5.1,74.11,74.11,0,0,1,6.14,6.14,8,8,0,0,0,5.1,2.64l22.58,2.51a91.32,91.32,0,0,1,6.23,15l-14.19,17.74A8,8,0,0,0,199.87,123.66Z"
583
+ ></path>
584
+ </svg>
585
+ `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
586
+ }
587
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: GearIconComponent, decorators: [{
588
+ type: Component,
589
+ args: [{
590
+ selector: 'ndt-gear-icon',
591
+ standalone: true,
592
+ changeDetection: ChangeDetectionStrategy.OnPush,
593
+ template: `
594
+ <svg
595
+ [attr.fill]="fill()"
596
+ xmlns="http://www.w3.org/2000/svg"
597
+ width="24"
598
+ height="24"
599
+ viewBox="0 0 256 256"
600
+ >
601
+ <path
602
+ d="M207.86,123.18l16.78-21a99.14,99.14,0,0,0-10.07-24.29l-26.7-3a81,81,0,0,0-6.81-6.81l-3-26.71a99.43,99.43,0,0,0-24.3-10l-21,16.77a81.59,81.59,0,0,0-9.64,0l-21-16.78A99.14,99.14,0,0,0,77.91,41.43l-3,26.7a81,81,0,0,0-6.81,6.81l-26.71,3a99.43,99.43,0,0,0-10,24.3l16.77,21a81.59,81.59,0,0,0,0,9.64l-16.78,21a99.14,99.14,0,0,0,10.07,24.29l26.7,3a81,81,0,0,0,6.81,6.81l3,26.71a99.43,99.43,0,0,0,24.3,10l21-16.77a81.59,81.59,0,0,0,9.64,0l21,16.78a99.14,99.14,0,0,0,24.29-10.07l3-26.7a81,81,0,0,0,6.81-6.81l26.71-3a99.43,99.43,0,0,0,10-24.3l-16.77-21A81.59,81.59,0,0,0,207.86,123.18ZM128,168a40,40,0,1,1,40-40A40,40,0,0,1,128,168Z"
603
+ opacity="0.2"
604
+ ></path>
605
+ <path
606
+ d="M128,80a48,48,0,1,0,48,48A48.05,48.05,0,0,0,128,80Zm0,80a32,32,0,1,1,32-32A32,32,0,0,1,128,160Zm88-29.84q.06-2.16,0-4.32l14.92-18.64a8,8,0,0,0,1.48-7.06,107.6,107.6,0,0,0-10.88-26.25,8,8,0,0,0-6-3.93l-23.72-2.64q-1.48-1.56-3-3L186,40.54a8,8,0,0,0-3.94-6,107.29,107.29,0,0,0-26.25-10.86,8,8,0,0,0-7.06,1.48L130.16,40Q128,40,125.84,40L107.2,25.11a8,8,0,0,0-7.06-1.48A107.6,107.6,0,0,0,73.89,34.51a8,8,0,0,0-3.93,6L67.32,64.27q-1.56,1.49-3,3L40.54,70a8,8,0,0,0-6,3.94,107.71,107.71,0,0,0-10.87,26.25,8,8,0,0,0,1.49,7.06L40,125.84Q40,128,40,130.16L25.11,148.8a8,8,0,0,0-1.48,7.06,107.6,107.6,0,0,0,10.88,26.25,8,8,0,0,0,6,3.93l23.72,2.64q1.49,1.56,3,3L70,215.46a8,8,0,0,0,3.94,6,107.71,107.71,0,0,0,26.25,10.87,8,8,0,0,0,7.06-1.49L125.84,216q2.16.06,4.32,0l18.64,14.92a8,8,0,0,0,7.06,1.48,107.21,107.21,0,0,0,26.25-10.88,8,8,0,0,0,3.93-6l2.64-23.72q1.56-1.48,3-3L215.46,186a8,8,0,0,0,6-3.94,107.71,107.71,0,0,0,10.87-26.25,8,8,0,0,0-1.49-7.06Zm-16.1-6.5a73.93,73.93,0,0,1,0,8.68,8,8,0,0,0,1.74,5.48l14.19,17.73a91.57,91.57,0,0,1-6.23,15L187,173.11a8,8,0,0,0-5.1,2.64,74.11,74.11,0,0,1-6.14,6.14,8,8,0,0,0-2.64,5.1l-2.51,22.58a91.32,91.32,0,0,1-15,6.23l-17.74-14.19a8,8,0,0,0-5-1.75h-.48a73.93,73.93,0,0,1-8.68,0,8.06,8.06,0,0,0-5.48,1.74L100.45,215.8a91.57,91.57,0,0,1-15-6.23L82.89,187a8,8,0,0,0-2.64-5.1,74.11,74.11,0,0,1-6.14-6.14,8,8,0,0,0-5.1-2.64L46.43,170.6a91.32,91.32,0,0,1-6.23-15l14.19-17.74a8,8,0,0,0,1.74-5.48,73.93,73.93,0,0,1,0-8.68,8,8,0,0,0-1.74-5.48L40.2,100.45a91.57,91.57,0,0,1,6.23-15L69,82.89a8,8,0,0,0,5.1-2.64,74.11,74.11,0,0,1,6.14-6.14A8,8,0,0,0,82.89,69L85.4,46.43a91.32,91.32,0,0,1,15-6.23l17.74,14.19a8,8,0,0,0,5.48,1.74,73.93,73.93,0,0,1,8.68,0,8.06,8.06,0,0,0,5.48-1.74L155.55,40.2a91.57,91.57,0,0,1,15,6.23L173.11,69a8,8,0,0,0,2.64,5.1,74.11,74.11,0,0,1,6.14,6.14,8,8,0,0,0,5.1,2.64l22.58,2.51a91.32,91.32,0,0,1,6.23,15l-14.19,17.74A8,8,0,0,0,199.87,123.66Z"
607
+ ></path>
608
+ </svg>
609
+ `,
610
+ }]
611
+ }] });
612
+
613
+ class GitBranchIconComponent {
614
+ constructor() {
615
+ this.fill = input('#FFFF');
616
+ }
617
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: GitBranchIconComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
618
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.0.5", type: GitBranchIconComponent, isStandalone: true, selector: "ndt-git-branch-icon", inputs: { fill: { classPropertyName: "fill", publicName: "fill", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
619
+ <svg
620
+ [attr.fill]="fill()"
621
+ xmlns="http://www.w3.org/2000/svg"
622
+ width="24"
623
+ height="24"
624
+ viewBox="0 0 256 256"
625
+ >
626
+ <path
627
+ d="M224,64a24,24,0,1,1-24-24A24,24,0,0,1,224,64Z"
628
+ opacity="0.2"
629
+ ></path>
630
+ <path
631
+ d="M232,64a32,32,0,1,0-40,31v17a8,8,0,0,1-8,8H96a23.84,23.84,0,0,0-8,1.38V95a32,32,0,1,0-16,0v66a32,32,0,1,0,16,0V144a8,8,0,0,1,8-8h88a24,24,0,0,0,24-24V95A32.06,32.06,0,0,0,232,64ZM64,64A16,16,0,1,1,80,80,16,16,0,0,1,64,64ZM96,192a16,16,0,1,1-16-16A16,16,0,0,1,96,192ZM200,80a16,16,0,1,1,16-16A16,16,0,0,1,200,80Z"
632
+ ></path>
633
+ </svg>
634
+ `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
635
+ }
636
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: GitBranchIconComponent, decorators: [{
637
+ type: Component,
638
+ args: [{
639
+ selector: 'ndt-git-branch-icon',
640
+ standalone: true,
641
+ changeDetection: ChangeDetectionStrategy.OnPush,
642
+ template: `
643
+ <svg
644
+ [attr.fill]="fill()"
645
+ xmlns="http://www.w3.org/2000/svg"
646
+ width="24"
647
+ height="24"
648
+ viewBox="0 0 256 256"
649
+ >
650
+ <path
651
+ d="M224,64a24,24,0,1,1-24-24A24,24,0,0,1,224,64Z"
652
+ opacity="0.2"
653
+ ></path>
654
+ <path
655
+ d="M232,64a32,32,0,1,0-40,31v17a8,8,0,0,1-8,8H96a23.84,23.84,0,0,0-8,1.38V95a32,32,0,1,0-16,0v66a32,32,0,1,0,16,0V144a8,8,0,0,1,8-8h88a24,24,0,0,0,24-24V95A32.06,32.06,0,0,0,232,64ZM64,64A16,16,0,1,1,80,80,16,16,0,0,1,64,64ZM96,192a16,16,0,1,1-16-16A16,16,0,0,1,96,192ZM200,80a16,16,0,1,1,16-16A16,16,0,0,1,200,80Z"
656
+ ></path>
657
+ </svg>
658
+ `,
659
+ }]
660
+ }] });
661
+
662
+ class ImportIconComponent {
663
+ constructor() {
664
+ this.fill = input('#FFFF');
665
+ }
666
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: ImportIconComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
667
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.0.5", type: ImportIconComponent, isStandalone: true, selector: "ndt-import-icon", inputs: { fill: { classPropertyName: "fill", publicName: "fill", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
668
+ <svg
669
+ [attr.fill]="fill()"
670
+ xmlns="http://www.w3.org/2000/svg"
671
+ width="24"
672
+ height="24"
673
+ viewBox="0 0 256 256"
674
+ >
675
+ <path
676
+ d="M224,144v64a8,8,0,0,1-8,8H40a8,8,0,0,1-8-8V144a8,8,0,0,1,16,0v56H208V144a8,8,0,0,1,16,0Zm-101.66,5.66a8,8,0,0,0,11.32,0l40-40a8,8,0,0,0-11.32-11.32L136,124.69V32a8,8,0,0,0-16,0v92.69L93.66,98.34a8,8,0,0,0-11.32,11.32Z"
677
+ ></path>
678
+ </svg>
679
+ `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
680
+ }
681
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: ImportIconComponent, decorators: [{
682
+ type: Component,
683
+ args: [{
684
+ selector: 'ndt-import-icon',
685
+ standalone: true,
686
+ changeDetection: ChangeDetectionStrategy.OnPush,
687
+ template: `
688
+ <svg
689
+ [attr.fill]="fill()"
690
+ xmlns="http://www.w3.org/2000/svg"
691
+ width="24"
692
+ height="24"
693
+ viewBox="0 0 256 256"
694
+ >
695
+ <path
696
+ d="M224,144v64a8,8,0,0,1-8,8H40a8,8,0,0,1-8-8V144a8,8,0,0,1,16,0v56H208V144a8,8,0,0,1,16,0Zm-101.66,5.66a8,8,0,0,0,11.32,0l40-40a8,8,0,0,0-11.32-11.32L136,124.69V32a8,8,0,0,0-16,0v92.69L93.66,98.34a8,8,0,0,0-11.32,11.32Z"
697
+ ></path>
698
+ </svg>
699
+ `,
700
+ }]
701
+ }] });
702
+
703
+ class LayoutIconComponent {
704
+ constructor() {
705
+ this.fill = input('#FFFF');
706
+ }
707
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: LayoutIconComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
708
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.0.5", type: LayoutIconComponent, isStandalone: true, selector: "ndt-layout-icon", inputs: { fill: { classPropertyName: "fill", publicName: "fill", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
709
+ <svg
710
+ [attr.fill]="fill()"
711
+ xmlns="http://www.w3.org/2000/svg"
712
+ width="24"
713
+ height="24"
714
+ viewBox="0 0 256 256"
715
+ >
716
+ <path d="M104,104V208H40a8,8,0,0,1-8-8V104Z" opacity="0.2"></path>
717
+ <path
718
+ d="M216,40H40A16,16,0,0,0,24,56V200a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40Zm0,16V96H40V56ZM40,112H96v88H40Zm176,88H112V112H216v88Z"
719
+ ></path>
720
+ </svg>
721
+ `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
722
+ }
723
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: LayoutIconComponent, decorators: [{
724
+ type: Component,
725
+ args: [{
726
+ selector: 'ndt-layout-icon',
727
+ standalone: true,
728
+ changeDetection: ChangeDetectionStrategy.OnPush,
729
+ template: `
730
+ <svg
731
+ [attr.fill]="fill()"
732
+ xmlns="http://www.w3.org/2000/svg"
733
+ width="24"
734
+ height="24"
735
+ viewBox="0 0 256 256"
736
+ >
737
+ <path d="M104,104V208H40a8,8,0,0,1-8-8V104Z" opacity="0.2"></path>
738
+ <path
739
+ d="M216,40H40A16,16,0,0,0,24,56V200a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A16,16,0,0,0,216,40Zm0,16V96H40V56ZM40,112H96v88H40Zm176,88H112V112H216v88Z"
740
+ ></path>
741
+ </svg>
742
+ `,
743
+ }]
744
+ }] });
745
+
746
+ class LightbulbIconComponent {
747
+ constructor() {
748
+ this.fill = input('#FFFF');
749
+ }
750
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: LightbulbIconComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
751
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.0.5", type: LightbulbIconComponent, isStandalone: true, selector: "ndt-lightbulb-icon", inputs: { fill: { classPropertyName: "fill", publicName: "fill", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
752
+ <svg
753
+ [attr.fill]="fill()"
754
+ xmlns="http://www.w3.org/2000/svg"
755
+ width="24"
756
+ height="24"
757
+ viewBox="0 0 256 256"
758
+ >
759
+ <path
760
+ d="M176,232a8,8,0,0,1-8,8H88a8,8,0,0,1,0-16h80A8,8,0,0,1,176,232Zm40-128a87.55,87.55,0,0,1-33.64,69.21A16.24,16.24,0,0,0,176,186v6a16,16,0,0,1-16,16H96a16,16,0,0,1-16-16v-6a16,16,0,0,0-6.23-12.66A87.59,87.59,0,0,1,40,104.49C39.74,56.83,78.26,17.14,125.88,16A88,88,0,0,1,216,104Zm-16,0a72,72,0,0,0-73.74-72c-39,.92-70.47,33.39-70.26,72.39a71.65,71.65,0,0,0,27.64,56.3A32,32,0,0,1,96,186v6h64v-6a32.15,32.15,0,0,1,12.47-25.35A71.65,71.65,0,0,0,200,104Zm-16.11-9.34a57.6,57.6,0,0,0-46.56-46.55,8,8,0,0,0-2.66,15.78c16.57,2.79,30.63,16.85,33.44,33.45A8,8,0,0,0,176,104a9,9,0,0,0,1.35-.11A8,8,0,0,0,183.89,94.66Z"
761
+ ></path>
762
+ </svg>
763
+ `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
764
+ }
765
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: LightbulbIconComponent, decorators: [{
766
+ type: Component,
767
+ args: [{
768
+ selector: 'ndt-lightbulb-icon',
769
+ standalone: true,
770
+ changeDetection: ChangeDetectionStrategy.OnPush,
771
+ template: `
772
+ <svg
773
+ [attr.fill]="fill()"
774
+ xmlns="http://www.w3.org/2000/svg"
775
+ width="24"
776
+ height="24"
777
+ viewBox="0 0 256 256"
778
+ >
779
+ <path
780
+ d="M176,232a8,8,0,0,1-8,8H88a8,8,0,0,1,0-16h80A8,8,0,0,1,176,232Zm40-128a87.55,87.55,0,0,1-33.64,69.21A16.24,16.24,0,0,0,176,186v6a16,16,0,0,1-16,16H96a16,16,0,0,1-16-16v-6a16,16,0,0,0-6.23-12.66A87.59,87.59,0,0,1,40,104.49C39.74,56.83,78.26,17.14,125.88,16A88,88,0,0,1,216,104Zm-16,0a72,72,0,0,0-73.74-72c-39,.92-70.47,33.39-70.26,72.39a71.65,71.65,0,0,0,27.64,56.3A32,32,0,0,1,96,186v6h64v-6a32.15,32.15,0,0,1,12.47-25.35A71.65,71.65,0,0,0,200,104Zm-16.11-9.34a57.6,57.6,0,0,0-46.56-46.55,8,8,0,0,0-2.66,15.78c16.57,2.79,30.63,16.85,33.44,33.45A8,8,0,0,0,176,104a9,9,0,0,0,1.35-.11A8,8,0,0,0,183.89,94.66Z"
781
+ ></path>
782
+ </svg>
783
+ `,
784
+ }]
785
+ }] });
786
+
787
+ class LightingIconComponent {
788
+ constructor() {
789
+ this.fill = input('#FFFF');
790
+ }
791
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: LightingIconComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
792
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.0.5", type: LightingIconComponent, isStandalone: true, selector: "ndt-lighting-icon", inputs: { fill: { classPropertyName: "fill", publicName: "fill", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
793
+ <svg
794
+ [attr.fill]="fill()"
795
+ xmlns="http://www.w3.org/2000/svg"
796
+ width="24"
797
+ height="24"
798
+ viewBox="0 0 256 256"
799
+ >
800
+ <path d="M96,240l16-80L48,136,160,16,144,96l64,24Z" opacity="0.2"></path>
801
+ <path
802
+ d="M215.79,118.17a8,8,0,0,0-5-5.66L153.18,90.9l14.66-73.33a8,8,0,0,0-13.69-7l-112,120a8,8,0,0,0,3,13l57.63,21.61L88.16,238.43a8,8,0,0,0,13.69,7l112-120A8,8,0,0,0,215.79,118.17ZM109.37,214l10.47-52.38a8,8,0,0,0-5-9.06L62,132.71l84.62-90.66L136.16,94.43a8,8,0,0,0,5,9.06l52.8,19.8Z"
803
+ ></path>
804
+ </svg>
805
+ `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
806
+ }
807
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: LightingIconComponent, decorators: [{
808
+ type: Component,
809
+ args: [{
810
+ selector: 'ndt-lighting-icon',
811
+ standalone: true,
812
+ changeDetection: ChangeDetectionStrategy.OnPush,
813
+ template: `
814
+ <svg
815
+ [attr.fill]="fill()"
816
+ xmlns="http://www.w3.org/2000/svg"
817
+ width="24"
818
+ height="24"
819
+ viewBox="0 0 256 256"
820
+ >
821
+ <path d="M96,240l16-80L48,136,160,16,144,96l64,24Z" opacity="0.2"></path>
822
+ <path
823
+ d="M215.79,118.17a8,8,0,0,0-5-5.66L153.18,90.9l14.66-73.33a8,8,0,0,0-13.69-7l-112,120a8,8,0,0,0,3,13l57.63,21.61L88.16,238.43a8,8,0,0,0,13.69,7l112-120A8,8,0,0,0,215.79,118.17ZM109.37,214l10.47-52.38a8,8,0,0,0-5-9.06L62,132.71l84.62-90.66L136.16,94.43a8,8,0,0,0,5,9.06l52.8,19.8Z"
824
+ ></path>
825
+ </svg>
826
+ `,
827
+ }]
828
+ }] });
829
+
830
+ class LockIconComponent {
831
+ constructor() {
832
+ this.fill = input('#FFFF');
833
+ }
834
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: LockIconComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
835
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.0.5", type: LockIconComponent, isStandalone: true, selector: "ndt-lock-icon", inputs: { fill: { classPropertyName: "fill", publicName: "fill", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
836
+ <svg
837
+ [attr.fill]="fill()"
838
+ xmlns="http://www.w3.org/2000/svg"
839
+ width="24"
840
+ height="24"
841
+ viewBox="0 0 256 256"
842
+ >
843
+ <path
844
+ d="M208,80H176V56a48,48,0,0,0-96,0V80H48A16,16,0,0,0,32,96V208a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V96A16,16,0,0,0,208,80ZM96,56a32,32,0,0,1,64,0V80H96ZM208,208H48V96H208V208Zm-68-56a12,12,0,1,1-12-12A12,12,0,0,1,140,152Z"
845
+ ></path>
846
+ </svg>
847
+ `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
848
+ }
849
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: LockIconComponent, decorators: [{
850
+ type: Component,
851
+ args: [{
852
+ selector: 'ndt-lock-icon',
853
+ standalone: true,
854
+ changeDetection: ChangeDetectionStrategy.OnPush,
855
+ template: `
856
+ <svg
857
+ [attr.fill]="fill()"
858
+ xmlns="http://www.w3.org/2000/svg"
859
+ width="24"
860
+ height="24"
861
+ viewBox="0 0 256 256"
862
+ >
863
+ <path
864
+ d="M208,80H176V56a48,48,0,0,0-96,0V80H48A16,16,0,0,0,32,96V208a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V96A16,16,0,0,0,208,80ZM96,56a32,32,0,0,1,64,0V80H96ZM208,208H48V96H208V208Zm-68-56a12,12,0,1,1-12-12A12,12,0,0,1,140,152Z"
865
+ ></path>
866
+ </svg>
867
+ `,
868
+ }]
869
+ }] });
870
+
871
+ class MoonIconComponent {
872
+ constructor() {
873
+ this.fill = input('#FFFF');
874
+ }
875
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: MoonIconComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
876
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.0.5", type: MoonIconComponent, isStandalone: true, selector: "ndt-moon-icon", inputs: { fill: { classPropertyName: "fill", publicName: "fill", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
877
+ <svg
878
+ [attr.fill]="fill()"
879
+ xmlns="http://www.w3.org/2000/svg"
880
+ width="24"
881
+ height="24"
882
+ viewBox="0 0 256 256"
883
+ >
884
+ <path
885
+ d="M224.3,150.3a8.1,8.1,0,0,0-7.8-5.7l-2.2.4A84,84,0,0,1,111,41.6a5.7,5.7,0,0,0,.3-1.8A7.9,7.9,0,0,0,109,33a8.1,8.1,0,0,0-8.1-1.1A104,104,0,1,0,225.4,156.9,8.1,8.1,0,0,0,224.3,150.3Z"
886
+ opacity="0.2"
887
+ />
888
+ <path
889
+ d="M233.5,137.3a12.1,12.1,0,0,0-11.8-8.6,7.9,7.9,0,0,0-1.3.1,80,80,0,0,1-98.2-98.2,12,12,0,0,0-15.6-14A104.2,104.2,0,0,0,32,120c0,57.4,46.6,104,104,104A104.2,104.2,0,0,0,239.4,149.6,12,12,0,0,0,233.5,137.3ZM136,208A88,88,0,0,1,48,120a87.6,87.6,0,0,1,64.8-84.7,96,96,0,0,0,111.9,112A87.6,87.6,0,0,1,136,208Z"
890
+ />
891
+ </svg>
892
+ `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
893
+ }
894
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: MoonIconComponent, decorators: [{
895
+ type: Component,
896
+ args: [{
897
+ selector: 'ndt-moon-icon',
898
+ standalone: true,
899
+ changeDetection: ChangeDetectionStrategy.OnPush,
900
+ template: `
901
+ <svg
902
+ [attr.fill]="fill()"
903
+ xmlns="http://www.w3.org/2000/svg"
904
+ width="24"
905
+ height="24"
906
+ viewBox="0 0 256 256"
907
+ >
908
+ <path
909
+ d="M224.3,150.3a8.1,8.1,0,0,0-7.8-5.7l-2.2.4A84,84,0,0,1,111,41.6a5.7,5.7,0,0,0,.3-1.8A7.9,7.9,0,0,0,109,33a8.1,8.1,0,0,0-8.1-1.1A104,104,0,1,0,225.4,156.9,8.1,8.1,0,0,0,224.3,150.3Z"
910
+ opacity="0.2"
911
+ />
912
+ <path
913
+ d="M233.5,137.3a12.1,12.1,0,0,0-11.8-8.6,7.9,7.9,0,0,0-1.3.1,80,80,0,0,1-98.2-98.2,12,12,0,0,0-15.6-14A104.2,104.2,0,0,0,32,120c0,57.4,46.6,104,104,104A104.2,104.2,0,0,0,239.4,149.6,12,12,0,0,0,233.5,137.3ZM136,208A88,88,0,0,1,48,120a87.6,87.6,0,0,1,64.8-84.7,96,96,0,0,0,111.9,112A87.6,87.6,0,0,1,136,208Z"
914
+ />
915
+ </svg>
916
+ `,
917
+ }]
918
+ }] });
919
+
920
+ class NetworkIconComponent {
921
+ constructor() {
922
+ this.fill = input('#FFFF');
923
+ }
924
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: NetworkIconComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
925
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.0.5", type: NetworkIconComponent, isStandalone: true, selector: "ndt-network-icon", inputs: { fill: { classPropertyName: "fill", publicName: "fill", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
926
+ <svg
927
+ [attr.fill]="fill()"
928
+ xmlns="http://www.w3.org/2000/svg"
929
+ width="24"
930
+ height="24"
931
+ viewBox="0 0 256 256"
932
+ >
933
+ <path
934
+ d="M152,40V72a8,8,0,0,1-8,8H112a8,8,0,0,1-8-8V40a8,8,0,0,1,8-8h32A8,8,0,0,1,152,40ZM80,168H48a8,8,0,0,0-8,8v32a8,8,0,0,0,8,8H80a8,8,0,0,0,8-8V176A8,8,0,0,0,80,168Zm128,0H176a8,8,0,0,0-8,8v32a8,8,0,0,0,8,8h32a8,8,0,0,0,8-8V176A8,8,0,0,0,208,168Z"
935
+ opacity="0.2"
936
+ ></path>
937
+ <path
938
+ d="M232,112H136V88h8a16,16,0,0,0,16-16V40a16,16,0,0,0-16-16H112A16,16,0,0,0,96,40V72a16,16,0,0,0,16,16h8v24H24a8,8,0,0,0,0,16H56v32H48a16,16,0,0,0-16,16v32a16,16,0,0,0,16,16H80a16,16,0,0,0,16-16V176a16,16,0,0,0-16-16H72V128H184v32h-8a16,16,0,0,0-16,16v32a16,16,0,0,0,16,16h32a16,16,0,0,0,16-16V176a16,16,0,0,0-16-16h-8V128h32a8,8,0,0,0,0-16ZM112,40h32V72H112ZM80,208H48V176H80Zm128,0H176V176h32Z"
939
+ ></path>
940
+ </svg>
941
+ `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
942
+ }
943
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: NetworkIconComponent, decorators: [{
944
+ type: Component,
945
+ args: [{
946
+ selector: 'ndt-network-icon',
947
+ standalone: true,
948
+ changeDetection: ChangeDetectionStrategy.OnPush,
949
+ template: `
950
+ <svg
951
+ [attr.fill]="fill()"
952
+ xmlns="http://www.w3.org/2000/svg"
953
+ width="24"
954
+ height="24"
955
+ viewBox="0 0 256 256"
956
+ >
957
+ <path
958
+ d="M152,40V72a8,8,0,0,1-8,8H112a8,8,0,0,1-8-8V40a8,8,0,0,1,8-8h32A8,8,0,0,1,152,40ZM80,168H48a8,8,0,0,0-8,8v32a8,8,0,0,0,8,8H80a8,8,0,0,0,8-8V176A8,8,0,0,0,80,168Zm128,0H176a8,8,0,0,0-8,8v32a8,8,0,0,0,8,8h32a8,8,0,0,0,8-8V176A8,8,0,0,0,208,168Z"
959
+ opacity="0.2"
960
+ ></path>
961
+ <path
962
+ d="M232,112H136V88h8a16,16,0,0,0,16-16V40a16,16,0,0,0-16-16H112A16,16,0,0,0,96,40V72a16,16,0,0,0,16,16h8v24H24a8,8,0,0,0,0,16H56v32H48a16,16,0,0,0-16,16v32a16,16,0,0,0,16,16H80a16,16,0,0,0,16-16V176a16,16,0,0,0-16-16H72V128H184v32h-8a16,16,0,0,0-16,16v32a16,16,0,0,0,16,16h32a16,16,0,0,0,16-16V176a16,16,0,0,0-16-16h-8V128h32a8,8,0,0,0,0-16ZM112,40h32V72H112ZM80,208H48V176H80Zm128,0H176V176h32Z"
963
+ ></path>
964
+ </svg>
965
+ `,
966
+ }]
967
+ }] });
968
+
969
+ class PuzzleIconComponent {
970
+ constructor() {
971
+ this.fill = input('#FFFF');
972
+ }
973
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: PuzzleIconComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
974
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.0.5", type: PuzzleIconComponent, isStandalone: true, selector: "ndt-puzzle-icon", inputs: { fill: { classPropertyName: "fill", publicName: "fill", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
975
+ <svg
976
+ [attr.fill]="fill()"
977
+ xmlns="http://www.w3.org/2000/svg"
978
+ width="24"
979
+ height="24"
980
+ viewBox="0 0 256 256"
981
+ >
982
+ <path
983
+ d="M204,168a28,28,0,0,0,12-2.69V208a8,8,0,0,1-8,8H64a8,8,0,0,1-8-8V165.31a28,28,0,1,1,0-50.62V72a8,8,0,0,1,8-8h46.69a28,28,0,1,1,50.61,0H208a8,8,0,0,1,8,8v42.69A28,28,0,1,0,204,168Z"
984
+ opacity="0.2"
985
+ ></path>
986
+ <path
987
+ d="M220.27,158.54a8,8,0,0,0-7.7-.46,20,20,0,1,1,0-36.16A8,8,0,0,0,224,114.69V72a16,16,0,0,0-16-16H171.78a35.36,35.36,0,0,0,.22-4,36.15,36.15,0,0,0-11.36-26.25,36,36,0,0,0-60.55,23.63,36.56,36.56,0,0,0,.14,6.62H64A16,16,0,0,0,48,72v32.22a35.36,35.36,0,0,0-4-.22,36.12,36.12,0,0,0-26.24,11.36,35.7,35.7,0,0,0-9.69,27,36.08,36.08,0,0,0,33.31,33.6,36.56,36.56,0,0,0,6.62-.14V208a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V165.31A8,8,0,0,0,220.27,158.54ZM208,208H64V165.31a8,8,0,0,0-11.43-7.23,20,20,0,1,1,0-36.16A8,8,0,0,0,64,114.69V72h46.69a8,8,0,0,0,7.23-11.43,20,20,0,1,1,36.16,0A8,8,0,0,0,161.31,72H208v32.23a35.68,35.68,0,0,0-6.62-.14A36,36,0,0,0,204,176a35.36,35.36,0,0,0,4-.22Z"
988
+ ></path>
989
+ </svg>
990
+ `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
991
+ }
992
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: PuzzleIconComponent, decorators: [{
993
+ type: Component,
994
+ args: [{
995
+ selector: 'ndt-puzzle-icon',
996
+ standalone: true,
997
+ changeDetection: ChangeDetectionStrategy.OnPush,
998
+ template: `
999
+ <svg
1000
+ [attr.fill]="fill()"
1001
+ xmlns="http://www.w3.org/2000/svg"
1002
+ width="24"
1003
+ height="24"
1004
+ viewBox="0 0 256 256"
1005
+ >
1006
+ <path
1007
+ d="M204,168a28,28,0,0,0,12-2.69V208a8,8,0,0,1-8,8H64a8,8,0,0,1-8-8V165.31a28,28,0,1,1,0-50.62V72a8,8,0,0,1,8-8h46.69a28,28,0,1,1,50.61,0H208a8,8,0,0,1,8,8v42.69A28,28,0,1,0,204,168Z"
1008
+ opacity="0.2"
1009
+ ></path>
1010
+ <path
1011
+ d="M220.27,158.54a8,8,0,0,0-7.7-.46,20,20,0,1,1,0-36.16A8,8,0,0,0,224,114.69V72a16,16,0,0,0-16-16H171.78a35.36,35.36,0,0,0,.22-4,36.15,36.15,0,0,0-11.36-26.25,36,36,0,0,0-60.55,23.63,36.56,36.56,0,0,0,.14,6.62H64A16,16,0,0,0,48,72v32.22a35.36,35.36,0,0,0-4-.22,36.12,36.12,0,0,0-26.24,11.36,35.7,35.7,0,0,0-9.69,27,36.08,36.08,0,0,0,33.31,33.6,36.56,36.56,0,0,0,6.62-.14V208a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V165.31A8,8,0,0,0,220.27,158.54ZM208,208H64V165.31a8,8,0,0,0-11.43-7.23,20,20,0,1,1,0-36.16A8,8,0,0,0,64,114.69V72h46.69a8,8,0,0,0,7.23-11.43,20,20,0,1,1,36.16,0A8,8,0,0,0,161.31,72H208v32.23a35.68,35.68,0,0,0-6.62-.14A36,36,0,0,0,204,176a35.36,35.36,0,0,0,4-.22Z"
1012
+ ></path>
1013
+ </svg>
1014
+ `,
1015
+ }]
1016
+ }] });
1017
+
1018
+ class RefreshIconComponent {
1019
+ constructor() {
1020
+ this.fill = input('#FFFF');
1021
+ }
1022
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: RefreshIconComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1023
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.0.5", type: RefreshIconComponent, isStandalone: true, selector: "ndt-refresh-icon", inputs: { fill: { classPropertyName: "fill", publicName: "fill", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
1024
+ <svg
1025
+ [attr.fill]="fill()"
1026
+ xmlns="http://www.w3.org/2000/svg"
1027
+ width="24"
1028
+ height="24"
1029
+ viewBox="0 0 256 256"
1030
+ >
1031
+ <path
1032
+ d="M216,128a88,88,0,1,1-88-88A88,88,0,0,1,216,128Z"
1033
+ opacity="0.2"
1034
+ ></path>
1035
+ <path
1036
+ d="M224,48V96a8,8,0,0,1-8,8H168a8,8,0,0,1,0-16h28.69L182.06,73.37a79.56,79.56,0,0,0-56.13-23.43h-.45A79.52,79.52,0,0,0,69.59,72.71,8,8,0,0,1,58.41,61.27a96,96,0,0,1,135,.79L208,76.69V48a8,8,0,0,1,16,0ZM186.41,183.29a80,80,0,0,1-112.47-.66L59.31,168H88a8,8,0,0,0,0-16H40a8,8,0,0,0-8,8v48a8,8,0,0,0,16,0V179.31l14.63,14.63A95.43,95.43,0,0,0,130,222.06h.53a95.36,95.36,0,0,0,67.07-27.33,8,8,0,0,0-11.18-11.44Z"
1037
+ ></path>
1038
+ </svg>
1039
+ `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1040
+ }
1041
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: RefreshIconComponent, decorators: [{
1042
+ type: Component,
1043
+ args: [{
1044
+ selector: 'ndt-refresh-icon',
1045
+ standalone: true,
1046
+ changeDetection: ChangeDetectionStrategy.OnPush,
1047
+ template: `
1048
+ <svg
1049
+ [attr.fill]="fill()"
1050
+ xmlns="http://www.w3.org/2000/svg"
1051
+ width="24"
1052
+ height="24"
1053
+ viewBox="0 0 256 256"
1054
+ >
1055
+ <path
1056
+ d="M216,128a88,88,0,1,1-88-88A88,88,0,0,1,216,128Z"
1057
+ opacity="0.2"
1058
+ ></path>
1059
+ <path
1060
+ d="M224,48V96a8,8,0,0,1-8,8H168a8,8,0,0,1,0-16h28.69L182.06,73.37a79.56,79.56,0,0,0-56.13-23.43h-.45A79.52,79.52,0,0,0,69.59,72.71,8,8,0,0,1,58.41,61.27a96,96,0,0,1,135,.79L208,76.69V48a8,8,0,0,1,16,0ZM186.41,183.29a80,80,0,0,1-112.47-.66L59.31,168H88a8,8,0,0,0,0-16H40a8,8,0,0,0-8,8v48a8,8,0,0,0,16,0V179.31l14.63,14.63A95.43,95.43,0,0,0,130,222.06h.53a95.36,95.36,0,0,0,67.07-27.33,8,8,0,0,0-11.18-11.44Z"
1061
+ ></path>
1062
+ </svg>
1063
+ `,
1064
+ }]
1065
+ }] });
1066
+
1067
+ class StarIconComponent {
1068
+ constructor() {
1069
+ this.fill = input('#FFFF');
1070
+ }
1071
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: StarIconComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1072
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.0.5", type: StarIconComponent, isStandalone: true, selector: "ndt-star-icon", inputs: { fill: { classPropertyName: "fill", publicName: "fill", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
1073
+ <svg
1074
+ [attr.fill]="fill()"
1075
+ xmlns="http://www.w3.org/2000/svg"
1076
+ width="24"
1077
+ height="24"
1078
+ viewBox="0 0 256 256"
1079
+ >
1080
+ <path
1081
+ d="M229.06,108.79l-48.7,42,14.88,62.79a8.4,8.4,0,0,1-12.52,9.17L128,189.09,73.28,222.74a8.4,8.4,0,0,1-12.52-9.17l14.88-62.79-48.7-42A8.46,8.46,0,0,1,31.73,94L95.64,88.8l24.62-59.6a8.36,8.36,0,0,1,15.48,0l24.62,59.6L224.27,94A8.46,8.46,0,0,1,229.06,108.79Z"
1082
+ opacity="0.2"
1083
+ ></path>
1084
+ <path
1085
+ d="M239.18,97.26A16.38,16.38,0,0,0,224.92,86l-59-4.76L143.14,26.15a16.36,16.36,0,0,0-30.27,0L90.11,81.23,31.08,86a16.46,16.46,0,0,0-9.37,28.86l45,38.83L53,211.75a16.38,16.38,0,0,0,24.5,17.82L128,198.49l50.53,31.08A16.4,16.4,0,0,0,203,211.75l-13.76-58.07,45-38.83A16.43,16.43,0,0,0,239.18,97.26Zm-15.34,5.47-48.7,42a8,8,0,0,0-2.56,7.91l14.88,62.8a.37.37,0,0,1-.17.48c-.18.14-.23.11-.38,0l-54.72-33.65a8,8,0,0,0-8.38,0L69.09,215.94c-.15.09-.19.12-.38,0a.37.37,0,0,1-.17-.48l14.88-62.8a8,8,0,0,0-2.56-7.91l-48.7-42c-.12-.1-.23-.19-.13-.5s.18-.27.33-.29l63.92-5.16A8,8,0,0,0,103,91.86l24.62-59.61c.08-.17.11-.25.35-.25s.27.08.35.25L153,91.86a8,8,0,0,0,6.75,4.92l63.92,5.16c.15,0,.24,0,.33.29S224,102.63,223.84,102.73Z"
1086
+ ></path>
1087
+ </svg>
1088
+ `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1089
+ }
1090
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: StarIconComponent, decorators: [{
1091
+ type: Component,
1092
+ args: [{
1093
+ selector: 'ndt-star-icon',
1094
+ standalone: true,
1095
+ changeDetection: ChangeDetectionStrategy.OnPush,
1096
+ template: `
1097
+ <svg
1098
+ [attr.fill]="fill()"
1099
+ xmlns="http://www.w3.org/2000/svg"
1100
+ width="24"
1101
+ height="24"
1102
+ viewBox="0 0 256 256"
1103
+ >
1104
+ <path
1105
+ d="M229.06,108.79l-48.7,42,14.88,62.79a8.4,8.4,0,0,1-12.52,9.17L128,189.09,73.28,222.74a8.4,8.4,0,0,1-12.52-9.17l14.88-62.79-48.7-42A8.46,8.46,0,0,1,31.73,94L95.64,88.8l24.62-59.6a8.36,8.36,0,0,1,15.48,0l24.62,59.6L224.27,94A8.46,8.46,0,0,1,229.06,108.79Z"
1106
+ opacity="0.2"
1107
+ ></path>
1108
+ <path
1109
+ d="M239.18,97.26A16.38,16.38,0,0,0,224.92,86l-59-4.76L143.14,26.15a16.36,16.36,0,0,0-30.27,0L90.11,81.23,31.08,86a16.46,16.46,0,0,0-9.37,28.86l45,38.83L53,211.75a16.38,16.38,0,0,0,24.5,17.82L128,198.49l50.53,31.08A16.4,16.4,0,0,0,203,211.75l-13.76-58.07,45-38.83A16.43,16.43,0,0,0,239.18,97.26Zm-15.34,5.47-48.7,42a8,8,0,0,0-2.56,7.91l14.88,62.8a.37.37,0,0,1-.17.48c-.18.14-.23.11-.38,0l-54.72-33.65a8,8,0,0,0-8.38,0L69.09,215.94c-.15.09-.19.12-.38,0a.37.37,0,0,1-.17-.48l14.88-62.8a8,8,0,0,0-2.56-7.91l-48.7-42c-.12-.1-.23-.19-.13-.5s.18-.27.33-.29l63.92-5.16A8,8,0,0,0,103,91.86l24.62-59.61c.08-.17.11-.25.35-.25s.27.08.35.25L153,91.86a8,8,0,0,0,6.75,4.92l63.92,5.16c.15,0,.24,0,.33.29S224,102.63,223.84,102.73Z"
1110
+ ></path>
1111
+ </svg>
1112
+ `,
1113
+ }]
1114
+ }] });
1115
+
1116
+ class SunIconComponent {
1117
+ constructor() {
1118
+ this.fill = input('#FFFF');
1119
+ }
1120
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: SunIconComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1121
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.0.5", type: SunIconComponent, isStandalone: true, selector: "ndt-sun-icon", inputs: { fill: { classPropertyName: "fill", publicName: "fill", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
1122
+ <svg
1123
+ [attr.fill]="fill()"
1124
+ xmlns="http://www.w3.org/2000/svg"
1125
+ width="24"
1126
+ height="24"
1127
+ viewBox="0 0 256 256"
1128
+ >
1129
+ <path
1130
+ d="M128,60a68,68,0,1,0,68,68A68.07,68.07,0,0,0,128,60Z"
1131
+ opacity="0.2"
1132
+ />
1133
+ <path
1134
+ d="M128,44a8,8,0,0,0,8-8V16a8,8,0,0,0-16,0V36A8,8,0,0,0,128,44ZM57.31,68.69a8,8,0,0,0,11.32-11.32L54.63,43.37A8,8,0,0,0,43.31,54.69ZM44,128a8,8,0,0,0-8-8H16a8,8,0,0,0,0,16H36A8,8,0,0,0,44,128Zm24.63,59.31-14,14a8,8,0,0,0,11.32,11.32l14-14a8,8,0,0,0-11.32-11.32ZM128,212a8,8,0,0,0-8,8v20a8,8,0,0,0,16,0V220A8,8,0,0,0,128,212Zm70.69-24.69a8,8,0,0,0-11.32,11.32l14,14a8,8,0,0,0,11.32-11.32ZM240,120H220a8,8,0,0,0,0,16h20a8,8,0,0,0,0-16Zm-24.69-62.63-14,14a8,8,0,0,0,11.32,11.32l14-14a8,8,0,0,0-11.32-11.32ZM128,76a52,52,0,1,0,52,52A52.06,52.06,0,0,0,128,76Zm0,88a36,36,0,1,1,36-36A36,36,0,0,1,128,164Z"
1135
+ />
1136
+ </svg>
1137
+ `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1138
+ }
1139
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: SunIconComponent, decorators: [{
1140
+ type: Component,
1141
+ args: [{
1142
+ selector: 'ndt-sun-icon',
1143
+ standalone: true,
1144
+ changeDetection: ChangeDetectionStrategy.OnPush,
1145
+ template: `
1146
+ <svg
1147
+ [attr.fill]="fill()"
1148
+ xmlns="http://www.w3.org/2000/svg"
1149
+ width="24"
1150
+ height="24"
1151
+ viewBox="0 0 256 256"
1152
+ >
1153
+ <path
1154
+ d="M128,60a68,68,0,1,0,68,68A68.07,68.07,0,0,0,128,60Z"
1155
+ opacity="0.2"
1156
+ />
1157
+ <path
1158
+ d="M128,44a8,8,0,0,0,8-8V16a8,8,0,0,0-16,0V36A8,8,0,0,0,128,44ZM57.31,68.69a8,8,0,0,0,11.32-11.32L54.63,43.37A8,8,0,0,0,43.31,54.69ZM44,128a8,8,0,0,0-8-8H16a8,8,0,0,0,0,16H36A8,8,0,0,0,44,128Zm24.63,59.31-14,14a8,8,0,0,0,11.32,11.32l14-14a8,8,0,0,0-11.32-11.32ZM128,212a8,8,0,0,0-8,8v20a8,8,0,0,0,16,0V220A8,8,0,0,0,128,212Zm70.69-24.69a8,8,0,0,0-11.32,11.32l14,14a8,8,0,0,0,11.32-11.32ZM240,120H220a8,8,0,0,0,0,16h20a8,8,0,0,0,0-16Zm-24.69-62.63-14,14a8,8,0,0,0,11.32,11.32l14-14a8,8,0,0,0-11.32-11.32ZM128,76a52,52,0,1,0,52,52A52.06,52.06,0,0,0,128,76Zm0,88a36,36,0,1,1,36-36A36,36,0,0,1,128,164Z"
1159
+ />
1160
+ </svg>
1161
+ `,
1162
+ }]
1163
+ }] });
1164
+
1165
+ class TerminalIconComponent {
1166
+ constructor() {
1167
+ this.fill = input('#FFFF');
1168
+ }
1169
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: TerminalIconComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1170
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.0.5", type: TerminalIconComponent, isStandalone: true, selector: "ndt-terminal-icon", inputs: { fill: { classPropertyName: "fill", publicName: "fill", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
1171
+ <svg
1172
+ [attr.fill]="fill()"
1173
+ xmlns="http://www.w3.org/2000/svg"
1174
+ width="24"
1175
+ height="24"
1176
+ viewBox="0 0 256 256"
1177
+ >
1178
+ <path
1179
+ d="M224,56V200a8,8,0,0,1-8,8H40a8,8,0,0,1-8-8V56a8,8,0,0,1,8-8H216A8,8,0,0,1,224,56Z"
1180
+ opacity="0.2"
1181
+ ></path>
1182
+ <path
1183
+ d="M128,128a8,8,0,0,1-3,6.25l-40,32a8,8,0,1,1-10-12.5L107.19,128,75,102.25a8,8,0,1,1,10-12.5l40,32A8,8,0,0,1,128,128Zm48,24H136a8,8,0,0,0,0,16h40a8,8,0,0,0,0-16Zm56-96V200a16,16,0,0,1-16,16H40a16,16,0,0,1-16-16V56A16,16,0,0,1,40,40H216A16,16,0,0,1,232,56ZM216,200V56H40V200H216Z"
1184
+ ></path>
1185
+ </svg>
1186
+ `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1187
+ }
1188
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: TerminalIconComponent, decorators: [{
1189
+ type: Component,
1190
+ args: [{
1191
+ selector: 'ndt-terminal-icon',
1192
+ standalone: true,
1193
+ changeDetection: ChangeDetectionStrategy.OnPush,
1194
+ template: `
1195
+ <svg
1196
+ [attr.fill]="fill()"
1197
+ xmlns="http://www.w3.org/2000/svg"
1198
+ width="24"
1199
+ height="24"
1200
+ viewBox="0 0 256 256"
1201
+ >
1202
+ <path
1203
+ d="M224,56V200a8,8,0,0,1-8,8H40a8,8,0,0,1-8-8V56a8,8,0,0,1,8-8H216A8,8,0,0,1,224,56Z"
1204
+ opacity="0.2"
1205
+ ></path>
1206
+ <path
1207
+ d="M128,128a8,8,0,0,1-3,6.25l-40,32a8,8,0,1,1-10-12.5L107.19,128,75,102.25a8,8,0,1,1,10-12.5l40,32A8,8,0,0,1,128,128Zm48,24H136a8,8,0,0,0,0,16h40a8,8,0,0,0,0-16Zm56-96V200a16,16,0,0,1-16,16H40a16,16,0,0,1-16-16V56A16,16,0,0,1,40,40H216A16,16,0,0,1,232,56ZM216,200V56H40V200H216Z"
1208
+ ></path>
1209
+ </svg>
1210
+ `,
1211
+ }]
1212
+ }] });
1213
+
1214
+ class ToggleLeftIconComponent {
1215
+ constructor() {
1216
+ this.fill = input('#FFFF');
1217
+ }
1218
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: ToggleLeftIconComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1219
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.0.5", type: ToggleLeftIconComponent, isStandalone: true, selector: "ndt-toggle-left-icon", inputs: { fill: { classPropertyName: "fill", publicName: "fill", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
1220
+ <svg
1221
+ [attr.fill]="fill()"
1222
+ xmlns="http://www.w3.org/2000/svg"
1223
+ width="24"
1224
+ height="24"
1225
+ viewBox="0 0 256 256"
1226
+ >
1227
+ <path
1228
+ d="M112,128A32,32,0,1,1,80,96,32,32,0,0,1,112,128Z"
1229
+ opacity="0.2"
1230
+ ></path>
1231
+ <path
1232
+ d="M176,56H80a72,72,0,0,0,0,144h96a72,72,0,0,0,0-144Zm0,128H80A56,56,0,0,1,80,72h96a56,56,0,0,1,0,112ZM80,88a40,40,0,1,0,40,40A40,40,0,0,0,80,88Zm0,64a24,24,0,1,1,24-24A24,24,0,0,1,80,152Z"
1233
+ ></path>
1234
+ </svg>
1235
+ `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1236
+ }
1237
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: ToggleLeftIconComponent, decorators: [{
1238
+ type: Component,
1239
+ args: [{
1240
+ selector: 'ndt-toggle-left-icon',
1241
+ standalone: true,
1242
+ changeDetection: ChangeDetectionStrategy.OnPush,
1243
+ template: `
1244
+ <svg
1245
+ [attr.fill]="fill()"
1246
+ xmlns="http://www.w3.org/2000/svg"
1247
+ width="24"
1248
+ height="24"
1249
+ viewBox="0 0 256 256"
1250
+ >
1251
+ <path
1252
+ d="M112,128A32,32,0,1,1,80,96,32,32,0,0,1,112,128Z"
1253
+ opacity="0.2"
1254
+ ></path>
1255
+ <path
1256
+ d="M176,56H80a72,72,0,0,0,0,144h96a72,72,0,0,0,0-144Zm0,128H80A56,56,0,0,1,80,72h96a56,56,0,0,1,0,112ZM80,88a40,40,0,1,0,40,40A40,40,0,0,0,80,88Zm0,64a24,24,0,1,1,24-24A24,24,0,0,1,80,152Z"
1257
+ ></path>
1258
+ </svg>
1259
+ `,
1260
+ }]
1261
+ }] });
1262
+
1263
+ class TranslateIconComponent {
1264
+ constructor() {
1265
+ this.fill = input('#FFFF');
1266
+ }
1267
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: TranslateIconComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1268
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.0.5", type: TranslateIconComponent, isStandalone: true, selector: "ndt-translate-icon", inputs: { fill: { classPropertyName: "fill", publicName: "fill", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
1269
+ <svg
1270
+ [attr.fill]="fill()"
1271
+ xmlns="http://www.w3.org/2000/svg"
1272
+ width="24"
1273
+ height="24"
1274
+ viewBox="0 0 256 256"
1275
+ >
1276
+ <path
1277
+ d="M250.73,210.63l-56-112a12,12,0,0,0-21.46,0l-20.52,41A84.2,84.2,0,0,1,114,126.22,107.48,107.48,0,0,0,139.33,68H160a12,12,0,0,0,0-24H108V32a12,12,0,0,0-24,0V44H32a12,12,0,0,0,0,24h83.13A83.69,83.69,0,0,1,96,110.35,84,84,0,0,1,83.6,91a12,12,0,1,0-21.81,10A107.55,107.55,0,0,0,78,126.24,83.54,83.54,0,0,1,32,140a12,12,0,0,0,0,24,107.47,107.47,0,0,0,64-21.07,108.4,108.4,0,0,0,45.39,19.44l-24.13,48.26a12,12,0,1,0,21.46,10.73L151.41,196h65.17l12.68,25.36a12,12,0,1,0,21.47-10.73ZM163.41,172,184,130.83,204.58,172Z"
1278
+ ></path>
1279
+ </svg>
1280
+ `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1281
+ }
1282
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: TranslateIconComponent, decorators: [{
1283
+ type: Component,
1284
+ args: [{
1285
+ selector: 'ndt-translate-icon',
1286
+ standalone: true,
1287
+ changeDetection: ChangeDetectionStrategy.OnPush,
1288
+ template: `
1289
+ <svg
1290
+ [attr.fill]="fill()"
1291
+ xmlns="http://www.w3.org/2000/svg"
1292
+ width="24"
1293
+ height="24"
1294
+ viewBox="0 0 256 256"
1295
+ >
1296
+ <path
1297
+ d="M250.73,210.63l-56-112a12,12,0,0,0-21.46,0l-20.52,41A84.2,84.2,0,0,1,114,126.22,107.48,107.48,0,0,0,139.33,68H160a12,12,0,0,0,0-24H108V32a12,12,0,0,0-24,0V44H32a12,12,0,0,0,0,24h83.13A83.69,83.69,0,0,1,96,110.35,84,84,0,0,1,83.6,91a12,12,0,1,0-21.81,10A107.55,107.55,0,0,0,78,126.24,83.54,83.54,0,0,1,32,140a12,12,0,0,0,0,24,107.47,107.47,0,0,0,64-21.07,108.4,108.4,0,0,0,45.39,19.44l-24.13,48.26a12,12,0,1,0,21.46,10.73L151.41,196h65.17l12.68,25.36a12,12,0,1,0,21.47-10.73ZM163.41,172,184,130.83,204.58,172Z"
1298
+ ></path>
1299
+ </svg>
1300
+ `,
1301
+ }]
1302
+ }] });
1303
+
1304
+ class TrashIconComponent {
1305
+ constructor() {
1306
+ this.fill = input('#FFFF');
1307
+ }
1308
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: TrashIconComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1309
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.0.5", type: TrashIconComponent, isStandalone: true, selector: "ndt-trash-icon", inputs: { fill: { classPropertyName: "fill", publicName: "fill", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
1310
+ <svg
1311
+ [attr.fill]="fill()"
1312
+ xmlns="http://www.w3.org/2000/svg"
1313
+ width="24"
1314
+ height="24"
1315
+ viewBox="0 0 256 256"
1316
+ >
1317
+ <path
1318
+ d="M216,48H176V40a24,24,0,0,0-24-24H104A24,24,0,0,0,80,40v8H40a8,8,0,0,0,0,16h8V208a16,16,0,0,0,16,16H192a16,16,0,0,0,16-16V64h8a8,8,0,0,0,0-16ZM96,40a8,8,0,0,1,8-8h48a8,8,0,0,1,8,8v8H96Zm96,168H64V64H192ZM112,104v64a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Zm48,0v64a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Z"
1319
+ ></path>
1320
+ </svg>
1321
+ `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1322
+ }
1323
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: TrashIconComponent, decorators: [{
1324
+ type: Component,
1325
+ args: [{
1326
+ selector: 'ndt-trash-icon',
1327
+ standalone: true,
1328
+ changeDetection: ChangeDetectionStrategy.OnPush,
1329
+ template: `
1330
+ <svg
1331
+ [attr.fill]="fill()"
1332
+ xmlns="http://www.w3.org/2000/svg"
1333
+ width="24"
1334
+ height="24"
1335
+ viewBox="0 0 256 256"
1336
+ >
1337
+ <path
1338
+ d="M216,48H176V40a24,24,0,0,0-24-24H104A24,24,0,0,0,80,40v8H40a8,8,0,0,0,0,16h8V208a16,16,0,0,0,16,16H192a16,16,0,0,0,16-16V64h8a8,8,0,0,0,0-16ZM96,40a8,8,0,0,1,8-8h48a8,8,0,0,1,8,8v8H96Zm96,168H64V64H192ZM112,104v64a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Zm48,0v64a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Z"
1339
+ ></path>
1340
+ </svg>
1341
+ `,
1342
+ }]
1343
+ }] });
1344
+
1345
+ class UsersIconComponent {
1346
+ constructor() {
1347
+ this.fill = input('#FFFF');
1348
+ }
1349
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: UsersIconComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1350
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.0.5", type: UsersIconComponent, isStandalone: true, selector: "ndt-users-icon", inputs: { fill: { classPropertyName: "fill", publicName: "fill", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
1351
+ <svg
1352
+ [attr.fill]="fill()"
1353
+ xmlns="http://www.w3.org/2000/svg"
1354
+ width="24"
1355
+ height="24"
1356
+ viewBox="0 0 256 256"
1357
+ >
1358
+ <path
1359
+ d="M224,128a95.76,95.76,0,0,1-31.8,71.37A72,72,0,0,0,128,160a40,40,0,1,0-40-40,40,40,0,0,0,40,40,72,72,0,0,0-64.2,39.37h0A96,96,0,1,1,224,128Z"
1360
+ opacity="0.2"
1361
+ ></path>
1362
+ <path
1363
+ d="M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24ZM74.08,197.5a64,64,0,0,1,107.84,0,87.83,87.83,0,0,1-107.84,0ZM96,120a32,32,0,1,1,32,32A32,32,0,0,1,96,120Zm97.76,66.41a79.66,79.66,0,0,0-36.06-28.75,48,48,0,1,0-59.4,0,79.66,79.66,0,0,0-36.06,28.75,88,88,0,1,1,131.52,0Z"
1364
+ ></path>
1365
+ </svg>
1366
+ `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1367
+ }
1368
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: UsersIconComponent, decorators: [{
1369
+ type: Component,
1370
+ args: [{
1371
+ selector: 'ndt-users-icon',
1372
+ standalone: true,
1373
+ changeDetection: ChangeDetectionStrategy.OnPush,
1374
+ template: `
1375
+ <svg
1376
+ [attr.fill]="fill()"
1377
+ xmlns="http://www.w3.org/2000/svg"
1378
+ width="24"
1379
+ height="24"
1380
+ viewBox="0 0 256 256"
1381
+ >
1382
+ <path
1383
+ d="M224,128a95.76,95.76,0,0,1-31.8,71.37A72,72,0,0,0,128,160a40,40,0,1,0-40-40,40,40,0,0,0,40,40,72,72,0,0,0-64.2,39.37h0A96,96,0,1,1,224,128Z"
1384
+ opacity="0.2"
1385
+ ></path>
1386
+ <path
1387
+ d="M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24ZM74.08,197.5a64,64,0,0,1,107.84,0,87.83,87.83,0,0,1-107.84,0ZM96,120a32,32,0,1,1,32,32A32,32,0,0,1,96,120Zm97.76,66.41a79.66,79.66,0,0,0-36.06-28.75,48,48,0,1,0-59.4,0,79.66,79.66,0,0,0-36.06,28.75,88,88,0,1,1,131.52,0Z"
1388
+ ></path>
1389
+ </svg>
1390
+ `,
1391
+ }]
1392
+ }] });
1393
+
1394
+ class DevToolbarIconComponent {
1395
+ constructor() {
1396
+ this.stateService = inject(DevToolbarStateService);
1397
+ this.name = input.required();
1398
+ this.fill = computed(() => this.stateService.theme() === 'dark' ? '#FFFFFF' : '#000000');
1399
+ }
1400
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: DevToolbarIconComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1401
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.5", type: DevToolbarIconComponent, isStandalone: true, selector: "ndt-icon", inputs: { name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: `
1402
+ @switch (name()) { @case ('angular') {
1403
+ <ndt-angular-icon />
1404
+ } @case ('bolt') {
1405
+ <ndt-bolt-icon [fill]="fill()" />
1406
+ } @case ('bug') {
1407
+ <ndt-bug-icon [fill]="fill()" />
1408
+ } @case ('code') {
1409
+ <ndt-code-icon [fill]="fill()" />
1410
+ } @case ('database') {
1411
+ <ndt-database-icon [fill]="fill()" />
1412
+ } @case ('docs') {
1413
+ <ndt-docs-icon [fill]="fill()" />
1414
+ } @case ('export') {
1415
+ <ndt-export-icon [fill]="fill()" />
1416
+ } @case ('filter') {
1417
+ <ndt-filter-icon [fill]="fill()" />
1418
+ } @case ('gauge') {
1419
+ <ndt-gauge-icon [fill]="fill()" />
1420
+ } @case ('gear') {
1421
+ <ndt-gear-icon [fill]="fill()" />
1422
+ } @case ('git-branch') {
1423
+ <ndt-git-branch-icon [fill]="fill()" />
1424
+ } @case ('import') {
1425
+ <ndt-import-icon [fill]="fill()" />
1426
+ } @case ('layout') {
1427
+ <ndt-layout-icon [fill]="fill()" />
1428
+ } @case ('lighting') {
1429
+ <ndt-lighting-icon [fill]="fill()" />
1430
+ } @case ('lightbulb') {
1431
+ <ndt-lightbulb-icon [fill]="fill()" />
1432
+ } @case ('lock') {
1433
+ <ndt-lock-icon [fill]="fill()" />
1434
+ } @case ('network') {
1435
+ <ndt-network-icon [fill]="fill()" />
1436
+ } @case ('puzzle') {
1437
+ <ndt-puzzle-icon [fill]="fill()" />
1438
+ } @case ('refresh') {
1439
+ <ndt-refresh-icon [fill]="fill()" />
1440
+ } @case ('star') {
1441
+ <ndt-star-icon [fill]="fill()" />
1442
+ } @case ('terminal') {
1443
+ <ndt-terminal-icon [fill]="fill()" />
1444
+ } @case ('toggle-left') {
1445
+ <ndt-toggle-left-icon [fill]="fill()" />
1446
+ } @case ('user') {
1447
+ <ndt-users-icon [fill]="fill()" />
1448
+ } @case ('sun') {
1449
+ <ndt-sun-icon [fill]="fill()" />
1450
+ } @case ('moon') {
1451
+ <ndt-moon-icon [fill]="fill()" />
1452
+ } @case ('translate') {
1453
+ <ndt-translate-icon [fill]="fill()" />
1454
+ } @case ('discord') {
1455
+ <ndt-discord-icon [fill]="fill()" />
1456
+ } @case ('trash') {
1457
+ <ndt-trash-icon [fill]="fill()" />
1458
+ } }
1459
+ `, isInline: true, dependencies: [{ kind: "component", type: AngularIconComponent, selector: "ndt-angular-icon" }, { kind: "component", type: BoltIconComponent, selector: "ndt-bolt-icon", inputs: ["fill"] }, { kind: "component", type: BugIconComponent, selector: "ndt-bug-icon", inputs: ["fill"] }, { kind: "component", type: CodeIconComponent, selector: "ndt-code-icon", inputs: ["fill"] }, { kind: "component", type: DatabaseIconComponent, selector: "ndt-database-icon", inputs: ["fill"] }, { kind: "component", type: DocsIconComponent, selector: "ndt-docs-icon", inputs: ["fill"] }, { kind: "component", type: DiscordIconComponent, selector: "ndt-discord-icon", inputs: ["fill"] }, { kind: "component", type: ExportIconComponent, selector: "ndt-export-icon", inputs: ["fill"] }, { kind: "component", type: FilterIconComponent, selector: "ndt-filter-icon", inputs: ["fill"] }, { kind: "component", type: GaugeIconComponent, selector: "ndt-gauge-icon", inputs: ["fill"] }, { kind: "component", type: GearIconComponent, selector: "ndt-gear-icon", inputs: ["fill"] }, { kind: "component", type: GitBranchIconComponent, selector: "ndt-git-branch-icon", inputs: ["fill"] }, { kind: "component", type: ImportIconComponent, selector: "ndt-import-icon", inputs: ["fill"] }, { kind: "component", type: LayoutIconComponent, selector: "ndt-layout-icon", inputs: ["fill"] }, { kind: "component", type: LightbulbIconComponent, selector: "ndt-lightbulb-icon", inputs: ["fill"] }, { kind: "component", type: LightingIconComponent, selector: "ndt-lighting-icon", inputs: ["fill"] }, { kind: "component", type: LockIconComponent, selector: "ndt-lock-icon", inputs: ["fill"] }, { kind: "component", type: NetworkIconComponent, selector: "ndt-network-icon", inputs: ["fill"] }, { kind: "component", type: PuzzleIconComponent, selector: "ndt-puzzle-icon", inputs: ["fill"] }, { kind: "component", type: RefreshIconComponent, selector: "ndt-refresh-icon", inputs: ["fill"] }, { kind: "component", type: StarIconComponent, selector: "ndt-star-icon", inputs: ["fill"] }, { kind: "component", type: TerminalIconComponent, selector: "ndt-terminal-icon", inputs: ["fill"] }, { kind: "component", type: ToggleLeftIconComponent, selector: "ndt-toggle-left-icon", inputs: ["fill"] }, { kind: "component", type: UsersIconComponent, selector: "ndt-users-icon", inputs: ["fill"] }, { kind: "component", type: SunIconComponent, selector: "ndt-sun-icon", inputs: ["fill"] }, { kind: "component", type: MoonIconComponent, selector: "ndt-moon-icon", inputs: ["fill"] }, { kind: "component", type: TranslateIconComponent, selector: "ndt-translate-icon", inputs: ["fill"] }, { kind: "component", type: TrashIconComponent, selector: "ndt-trash-icon", inputs: ["fill"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1460
+ }
1461
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: DevToolbarIconComponent, decorators: [{
1462
+ type: Component,
1463
+ args: [{
1464
+ selector: 'ndt-icon',
1465
+ standalone: true,
1466
+ imports: [
1467
+ AngularIconComponent,
1468
+ BoltIconComponent,
1469
+ BugIconComponent,
1470
+ CodeIconComponent,
1471
+ DatabaseIconComponent,
1472
+ DocsIconComponent,
1473
+ DiscordIconComponent,
1474
+ ExportIconComponent,
1475
+ FilterIconComponent,
1476
+ GaugeIconComponent,
1477
+ GearIconComponent,
1478
+ GitBranchIconComponent,
1479
+ ImportIconComponent,
1480
+ LayoutIconComponent,
1481
+ LightbulbIconComponent,
1482
+ LightingIconComponent,
1483
+ LockIconComponent,
1484
+ NetworkIconComponent,
1485
+ PuzzleIconComponent,
1486
+ RefreshIconComponent,
1487
+ StarIconComponent,
1488
+ TerminalIconComponent,
1489
+ ToggleLeftIconComponent,
1490
+ UsersIconComponent,
1491
+ SunIconComponent,
1492
+ MoonIconComponent,
1493
+ TranslateIconComponent,
1494
+ TrashIconComponent,
1495
+ ],
1496
+ changeDetection: ChangeDetectionStrategy.OnPush,
1497
+ template: `
1498
+ @switch (name()) { @case ('angular') {
1499
+ <ndt-angular-icon />
1500
+ } @case ('bolt') {
1501
+ <ndt-bolt-icon [fill]="fill()" />
1502
+ } @case ('bug') {
1503
+ <ndt-bug-icon [fill]="fill()" />
1504
+ } @case ('code') {
1505
+ <ndt-code-icon [fill]="fill()" />
1506
+ } @case ('database') {
1507
+ <ndt-database-icon [fill]="fill()" />
1508
+ } @case ('docs') {
1509
+ <ndt-docs-icon [fill]="fill()" />
1510
+ } @case ('export') {
1511
+ <ndt-export-icon [fill]="fill()" />
1512
+ } @case ('filter') {
1513
+ <ndt-filter-icon [fill]="fill()" />
1514
+ } @case ('gauge') {
1515
+ <ndt-gauge-icon [fill]="fill()" />
1516
+ } @case ('gear') {
1517
+ <ndt-gear-icon [fill]="fill()" />
1518
+ } @case ('git-branch') {
1519
+ <ndt-git-branch-icon [fill]="fill()" />
1520
+ } @case ('import') {
1521
+ <ndt-import-icon [fill]="fill()" />
1522
+ } @case ('layout') {
1523
+ <ndt-layout-icon [fill]="fill()" />
1524
+ } @case ('lighting') {
1525
+ <ndt-lighting-icon [fill]="fill()" />
1526
+ } @case ('lightbulb') {
1527
+ <ndt-lightbulb-icon [fill]="fill()" />
1528
+ } @case ('lock') {
1529
+ <ndt-lock-icon [fill]="fill()" />
1530
+ } @case ('network') {
1531
+ <ndt-network-icon [fill]="fill()" />
1532
+ } @case ('puzzle') {
1533
+ <ndt-puzzle-icon [fill]="fill()" />
1534
+ } @case ('refresh') {
1535
+ <ndt-refresh-icon [fill]="fill()" />
1536
+ } @case ('star') {
1537
+ <ndt-star-icon [fill]="fill()" />
1538
+ } @case ('terminal') {
1539
+ <ndt-terminal-icon [fill]="fill()" />
1540
+ } @case ('toggle-left') {
1541
+ <ndt-toggle-left-icon [fill]="fill()" />
1542
+ } @case ('user') {
1543
+ <ndt-users-icon [fill]="fill()" />
1544
+ } @case ('sun') {
1545
+ <ndt-sun-icon [fill]="fill()" />
1546
+ } @case ('moon') {
1547
+ <ndt-moon-icon [fill]="fill()" />
1548
+ } @case ('translate') {
1549
+ <ndt-translate-icon [fill]="fill()" />
1550
+ } @case ('discord') {
1551
+ <ndt-discord-icon [fill]="fill()" />
1552
+ } @case ('trash') {
1553
+ <ndt-trash-icon [fill]="fill()" />
1554
+ } }
1555
+ `,
1556
+ }]
1557
+ }] });
1558
+
1559
+ class DevToolbarToolButtonComponent {
1560
+ constructor() {
1561
+ // Injects
1562
+ this.state = inject(DevToolbarStateService);
1563
+ this.elementRef = inject(ElementRef);
1564
+ // Inputs
1565
+ this.title = input.required();
1566
+ this.toolId = input.required();
1567
+ // Outputs
1568
+ this.open = output();
1569
+ // Signals
1570
+ this.isActive = computed(() => this.state.activeToolId() === this.toolId());
1571
+ this.isToolbarVisible = this.state.isVisible;
1572
+ this.isFocused = signal(false);
1573
+ this.tooltip = computed(() => this.elementRef.nativeElement.parentElement?.getAttribute('data-tooltip') ?? '');
1574
+ this.isTooltipVisible = computed(() => this.tooltip() && !this.isActive());
1575
+ // Properties
1576
+ this.tooltipState = false;
1577
+ this.hideDelay = 3000;
1578
+ }
1579
+ // Public methods
1580
+ onClick() {
1581
+ this.isFocused.set(false);
1582
+ this.open.emit();
1583
+ }
1584
+ onMouseEnter() {
1585
+ this.tooltipState = true;
1586
+ }
1587
+ onMouseLeave() {
1588
+ this.tooltipState = false;
1589
+ }
1590
+ onEscape() {
1591
+ this.isFocused.set(false);
1592
+ }
1593
+ onFocus() {
1594
+ this.isFocused.set(true);
1595
+ }
1596
+ onBlur() {
1597
+ this.isFocused.set(false);
1598
+ }
1599
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: DevToolbarToolButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1600
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.5", type: DevToolbarToolButtonComponent, isStandalone: true, selector: "ndt-tool-button", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: true, transformFunction: null }, toolId: { classPropertyName: "toolId", publicName: "toolId", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { open: "open" }, ngImport: i0, template: `
1601
+ <button
1602
+ class="tool-button"
1603
+ [class.tool-button--active]="isActive()"
1604
+ [class.tool-button--focus]="isFocused()"
1605
+ (mouseenter)="onMouseEnter()"
1606
+ (focusin)="onFocus()"
1607
+ (focusout)="onBlur()"
1608
+ (mouseleave)="onMouseLeave()"
1609
+ (keydown.escape)="onEscape()"
1610
+ >
1611
+ @if (isTooltipVisible()) {
1612
+ <span
1613
+ class="tooltip"
1614
+ [@tooltipAnimation]="tooltipState ? 'visible' : 'hidden'"
1615
+ >
1616
+ {{ tooltip() }}
1617
+ </span>
1618
+ }
1619
+ <ng-content />
1620
+ </button>
1621
+ `, isInline: true, styles: [".dev-toolbar{--ndt-border-radius-small: 4px;--ndt-border-radius-medium: 8px;--ndt-border-radius-large: 12px;--ndt-transition-default: all .2s ease-out;--ndt-transition-smooth: all .2s ease-in-out;--ndt-bg-primary: rgb(255, 255, 255);--ndt-bg-gradient: linear-gradient(180deg, rgb(243, 244, 246) 0%, rgba(243, 244, 246, .88) 100%);--ndt-text-primary: rgb(17, 24, 39);--ndt-text-secondary: rgb(55, 65, 81);--ndt-text-muted: rgb(107, 114, 128);--ndt-border-primary: #e5e7eb;--ndt-border-subtle: rgba(17, 24, 39, .1);--ndt-hover-bg: rgba(17, 24, 39, .05);--ndt-hover-danger: rgb(239, 68, 68);--ndt-shadow-toolbar: 0 2px 8px rgba(156, 163, 175, .2);--ndt-shadow-tooltip: 0 0 0 1px rgba(17, 24, 39, .05), 0 4px 8px rgba(107, 114, 128, .15), 0 2px 4px rgba(107, 114, 128, .1);--ndt-shadow-window: 0px 0px 0px 0px rgba(156, 163, 175, .1), 0px 1px 2px 0px rgba(156, 163, 175, .12), 0px 4px 4px 0px rgba(156, 163, 175, .1), 0px 10px 6px 0px rgba(156, 163, 175, .08), 0px 17px 7px 0px rgba(156, 163, 175, .05), 0px 26px 7px 0px rgba(156, 163, 175, .02);--ndt-spacing-xs: 4px;--ndt-spacing-sm: 8px;--ndt-spacing-md: 16px;--ndt-window-padding: 24px;--ndt-font-size-xs: .75rem;--ndt-font-size-sm: .875rem;--ndt-font-size-md: 1rem;--ndt-font-size-lg: 1.25rem;--ndt-font-size-xl: 2rem;--ndt-background-secondary: var(--ndt-bg-primary);--ndt-background-hover: var(--ndt-hover-bg);--ndt-primary: #df30d4;--ndt-primary-rgb: 223, 48, 212;--ndt-text-on-primary: rgb(255, 255, 255);--ndt-border-color: var(--ndt-border-primary);--ndt-note-background: rgb(219, 234, 254);--ndt-note-border: rgba(37, 99, 235, .2);--ndt-warning-background: rgb(254, 249, 195);--ndt-warning-border: rgba(202, 138, 4, .2);--ndt-error-background: rgb(254, 226, 226);--ndt-error-border: rgba(220, 38, 38, .2)}.dev-toolbar[data-theme=dark]{--ndt-bg-primary: rgb(17, 24, 39);--ndt-bg-gradient: linear-gradient(180deg, rgb(19, 21, 26) 0%, rgba(19, 21, 26, .88) 100%);--ndt-text-primary: rgb(255, 255, 255);--ndt-text-secondary: rgb(229, 231, 235);--ndt-text-muted: rgb(156, 163, 175);--ndt-border-primary: #343841;--ndt-border-subtle: rgba(255, 255, 255, .1);--ndt-hover-bg: rgba(255, 255, 255, .12);--ndt-hover-danger: rgb(220, 38, 38);--ndt-shadow-toolbar: 0 2px 8px rgba(19, 21, 26, .3);--ndt-shadow-tooltip: 0 0 0 1px rgba(255, 255, 255, .1), 0 4px 8px rgba(0, 0, 0, .4), 0 2px 4px rgba(0, 0, 0, .3);--ndt-shadow-window: 0px 0px 0px 0px rgba(19, 21, 26, .3), 0px 1px 2px 0px rgba(19, 21, 26, .29), 0px 4px 4px 0px rgba(19, 21, 26, .26), 0px 10px 6px 0px rgba(19, 21, 26, .15), 0px 17px 7px 0px rgba(19, 21, 26, .04), 0px 26px 7px 0px rgba(19, 21, 26, .01);--ndt-note-background: rgba(37, 99, 235, .15);--ndt-note-border: rgba(37, 99, 235, .3);--ndt-warning-background: rgba(202, 138, 4, .15);--ndt-warning-border: rgba(202, 138, 4, .3);--ndt-error-background: rgba(220, 38, 38, .15);--ndt-error-border: rgba(220, 38, 38, .3)}.dev-toolbar h1,.dev-toolbar h2,.dev-toolbar h3,.dev-toolbar h4,.dev-toolbar h5{font-weight:600;color:var(--ndt-text-primary);margin:0}.dev-toolbar h1{font-size:var(--ndt-font-size-xl)}.dev-toolbar h2{font-size:var(--ndt-font-size-lg)}.dev-toolbar h3{font-size:var(--ndt-font-size-md)}.dev-toolbar h4{font-size:var(--ndt-font-size-sm)}.dev-toolbar h5{font-size:var(--ndt-font-size-xs)}.dev-toolbar hr{border:1px solid var(--ndt-border-subtle);margin:1em 0}.dev-toolbar p{line-height:1.5em;margin:0}.tool-button{display:flex;justify-content:center;align-items:center;width:44px;height:40px;border:0;background:transparent;color:var(--ndt-text-primary);transition:var(--ndt-transition-default);cursor:pointer;opacity:.5;position:relative}.tool-button--active,.tool-button:hover{background:var(--ndt-hover-bg);opacity:1}.tool-button ::ng-deep svg{width:24px;height:24px;display:block;margin:auto}.tool-button__badge{position:absolute;top:-.25rem;right:-.25rem;background-color:var(--ndt-hover-danger);color:var(--ndt-text-primary);border-radius:var(--ndt-border-radius-full);min-width:1rem;height:1rem;font-size:.75rem;display:flex;align-items:center;justify-content:center;padding:.125rem}.tooltip{position:absolute;bottom:calc(100% + 1.2rem);left:50%;transform:translate(-50%);background:var(--ndt-bg-primary);color:var(--ndt-text-primary);padding:.5rem .75rem;border-radius:var(--ndt-border-radius-medium);font-size:.75rem;white-space:nowrap;pointer-events:none;z-index:1000;box-shadow:var(--ndt-shadow-tooltip)}\n"], animations: [
1622
+ trigger('tooltipAnimation', [
1623
+ state('hidden', style({
1624
+ opacity: 0,
1625
+ transform: 'translateX(-50%) translateY(1rem)',
1626
+ })),
1627
+ state('visible', style({
1628
+ opacity: 1,
1629
+ transform: 'translateX(-50%) translateY(0)',
1630
+ })),
1631
+ transition('hidden => visible', [animate('200ms ease-out')]),
1632
+ transition('visible => hidden', [animate('150ms ease-in')]),
1633
+ ]),
1634
+ ], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1635
+ }
1636
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: DevToolbarToolButtonComponent, decorators: [{
1637
+ type: Component,
1638
+ args: [{ selector: 'ndt-tool-button', standalone: true, template: `
1639
+ <button
1640
+ class="tool-button"
1641
+ [class.tool-button--active]="isActive()"
1642
+ [class.tool-button--focus]="isFocused()"
1643
+ (mouseenter)="onMouseEnter()"
1644
+ (focusin)="onFocus()"
1645
+ (focusout)="onBlur()"
1646
+ (mouseleave)="onMouseLeave()"
1647
+ (keydown.escape)="onEscape()"
1648
+ >
1649
+ @if (isTooltipVisible()) {
1650
+ <span
1651
+ class="tooltip"
1652
+ [@tooltipAnimation]="tooltipState ? 'visible' : 'hidden'"
1653
+ >
1654
+ {{ tooltip() }}
1655
+ </span>
1656
+ }
1657
+ <ng-content />
1658
+ </button>
1659
+ `, animations: [
1660
+ trigger('tooltipAnimation', [
1661
+ state('hidden', style({
1662
+ opacity: 0,
1663
+ transform: 'translateX(-50%) translateY(1rem)',
1664
+ })),
1665
+ state('visible', style({
1666
+ opacity: 1,
1667
+ transform: 'translateX(-50%) translateY(0)',
1668
+ })),
1669
+ transition('hidden => visible', [animate('200ms ease-out')]),
1670
+ transition('visible => hidden', [animate('150ms ease-in')]),
1671
+ ]),
1672
+ ], changeDetection: ChangeDetectionStrategy.OnPush, styles: [".dev-toolbar{--ndt-border-radius-small: 4px;--ndt-border-radius-medium: 8px;--ndt-border-radius-large: 12px;--ndt-transition-default: all .2s ease-out;--ndt-transition-smooth: all .2s ease-in-out;--ndt-bg-primary: rgb(255, 255, 255);--ndt-bg-gradient: linear-gradient(180deg, rgb(243, 244, 246) 0%, rgba(243, 244, 246, .88) 100%);--ndt-text-primary: rgb(17, 24, 39);--ndt-text-secondary: rgb(55, 65, 81);--ndt-text-muted: rgb(107, 114, 128);--ndt-border-primary: #e5e7eb;--ndt-border-subtle: rgba(17, 24, 39, .1);--ndt-hover-bg: rgba(17, 24, 39, .05);--ndt-hover-danger: rgb(239, 68, 68);--ndt-shadow-toolbar: 0 2px 8px rgba(156, 163, 175, .2);--ndt-shadow-tooltip: 0 0 0 1px rgba(17, 24, 39, .05), 0 4px 8px rgba(107, 114, 128, .15), 0 2px 4px rgba(107, 114, 128, .1);--ndt-shadow-window: 0px 0px 0px 0px rgba(156, 163, 175, .1), 0px 1px 2px 0px rgba(156, 163, 175, .12), 0px 4px 4px 0px rgba(156, 163, 175, .1), 0px 10px 6px 0px rgba(156, 163, 175, .08), 0px 17px 7px 0px rgba(156, 163, 175, .05), 0px 26px 7px 0px rgba(156, 163, 175, .02);--ndt-spacing-xs: 4px;--ndt-spacing-sm: 8px;--ndt-spacing-md: 16px;--ndt-window-padding: 24px;--ndt-font-size-xs: .75rem;--ndt-font-size-sm: .875rem;--ndt-font-size-md: 1rem;--ndt-font-size-lg: 1.25rem;--ndt-font-size-xl: 2rem;--ndt-background-secondary: var(--ndt-bg-primary);--ndt-background-hover: var(--ndt-hover-bg);--ndt-primary: #df30d4;--ndt-primary-rgb: 223, 48, 212;--ndt-text-on-primary: rgb(255, 255, 255);--ndt-border-color: var(--ndt-border-primary);--ndt-note-background: rgb(219, 234, 254);--ndt-note-border: rgba(37, 99, 235, .2);--ndt-warning-background: rgb(254, 249, 195);--ndt-warning-border: rgba(202, 138, 4, .2);--ndt-error-background: rgb(254, 226, 226);--ndt-error-border: rgba(220, 38, 38, .2)}.dev-toolbar[data-theme=dark]{--ndt-bg-primary: rgb(17, 24, 39);--ndt-bg-gradient: linear-gradient(180deg, rgb(19, 21, 26) 0%, rgba(19, 21, 26, .88) 100%);--ndt-text-primary: rgb(255, 255, 255);--ndt-text-secondary: rgb(229, 231, 235);--ndt-text-muted: rgb(156, 163, 175);--ndt-border-primary: #343841;--ndt-border-subtle: rgba(255, 255, 255, .1);--ndt-hover-bg: rgba(255, 255, 255, .12);--ndt-hover-danger: rgb(220, 38, 38);--ndt-shadow-toolbar: 0 2px 8px rgba(19, 21, 26, .3);--ndt-shadow-tooltip: 0 0 0 1px rgba(255, 255, 255, .1), 0 4px 8px rgba(0, 0, 0, .4), 0 2px 4px rgba(0, 0, 0, .3);--ndt-shadow-window: 0px 0px 0px 0px rgba(19, 21, 26, .3), 0px 1px 2px 0px rgba(19, 21, 26, .29), 0px 4px 4px 0px rgba(19, 21, 26, .26), 0px 10px 6px 0px rgba(19, 21, 26, .15), 0px 17px 7px 0px rgba(19, 21, 26, .04), 0px 26px 7px 0px rgba(19, 21, 26, .01);--ndt-note-background: rgba(37, 99, 235, .15);--ndt-note-border: rgba(37, 99, 235, .3);--ndt-warning-background: rgba(202, 138, 4, .15);--ndt-warning-border: rgba(202, 138, 4, .3);--ndt-error-background: rgba(220, 38, 38, .15);--ndt-error-border: rgba(220, 38, 38, .3)}.dev-toolbar h1,.dev-toolbar h2,.dev-toolbar h3,.dev-toolbar h4,.dev-toolbar h5{font-weight:600;color:var(--ndt-text-primary);margin:0}.dev-toolbar h1{font-size:var(--ndt-font-size-xl)}.dev-toolbar h2{font-size:var(--ndt-font-size-lg)}.dev-toolbar h3{font-size:var(--ndt-font-size-md)}.dev-toolbar h4{font-size:var(--ndt-font-size-sm)}.dev-toolbar h5{font-size:var(--ndt-font-size-xs)}.dev-toolbar hr{border:1px solid var(--ndt-border-subtle);margin:1em 0}.dev-toolbar p{line-height:1.5em;margin:0}.tool-button{display:flex;justify-content:center;align-items:center;width:44px;height:40px;border:0;background:transparent;color:var(--ndt-text-primary);transition:var(--ndt-transition-default);cursor:pointer;opacity:.5;position:relative}.tool-button--active,.tool-button:hover{background:var(--ndt-hover-bg);opacity:1}.tool-button ::ng-deep svg{width:24px;height:24px;display:block;margin:auto}.tool-button__badge{position:absolute;top:-.25rem;right:-.25rem;background-color:var(--ndt-hover-danger);color:var(--ndt-text-primary);border-radius:var(--ndt-border-radius-full);min-width:1rem;height:1rem;font-size:.75rem;display:flex;align-items:center;justify-content:center;padding:.125rem}.tooltip{position:absolute;bottom:calc(100% + 1.2rem);left:50%;transform:translate(-50%);background:var(--ndt-bg-primary);color:var(--ndt-text-primary);padding:.5rem .75rem;border-radius:var(--ndt-border-radius-medium);font-size:.75rem;white-space:nowrap;pointer-events:none;z-index:1000;box-shadow:var(--ndt-shadow-tooltip)}\n"] }]
1673
+ }] });
1674
+
1675
+ class DevToolbarWindowComponent {
1676
+ constructor() {
1677
+ this.devToolbarStateService = inject(DevToolbarStateService);
1678
+ this.config = input.required();
1679
+ this.close = output();
1680
+ this.maximize = output();
1681
+ this.minimize = output();
1682
+ this.theme = computed(() => this.devToolbarStateService.theme());
1683
+ }
1684
+ onClose() {
1685
+ this.close.emit();
1686
+ }
1687
+ onMaximize() {
1688
+ this.maximize.emit();
1689
+ }
1690
+ onMinimize() {
1691
+ this.minimize.emit();
1692
+ }
1693
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: DevToolbarWindowComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1694
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.5", type: DevToolbarWindowComponent, isStandalone: true, selector: "ndt-window", inputs: { config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { close: "close", maximize: "maximize", minimize: "minimize" }, ngImport: i0, template: `
1695
+ <div class="window dev-toolbar" [attr.data-theme]="theme()">
1696
+ <div class="header">
1697
+ <div class="header__content">
1698
+ <div class="header__title">
1699
+ <h1>{{ config().title }}</h1>
1700
+ @if (config().isBeta) {
1701
+ <span class="beta-tag">BETA</span>
1702
+ }
1703
+ </div>
1704
+ <p class="header__description">{{ config().description }}</p>
1705
+ </div>
1706
+ <div class="header__controls">
1707
+ @if (config().isMinimizable) {
1708
+ <button aria-label="Minimize" class="control" (click)="onMinimize()">
1709
+
1710
+ </button>
1711
+ } @if (config().isMaximizable) {
1712
+ <button aria-label="Maximize" class="control" (click)="onMaximize()">
1713
+
1714
+ </button>
1715
+ } @if (config().isClosable) {
1716
+ <button
1717
+ aria-label="Close"
1718
+ class="control control--close"
1719
+ (click)="onClose()"
1720
+ >
1721
+ ×
1722
+ </button>
1723
+ }
1724
+ </div>
1725
+ </div>
1726
+
1727
+ <div class="divider"></div>
1728
+ <div class="content">
1729
+ <ng-content></ng-content>
1730
+ </div>
1731
+ </div>
1732
+ `, isInline: true, styles: [".dev-toolbar{--ndt-border-radius-small: 4px;--ndt-border-radius-medium: 8px;--ndt-border-radius-large: 12px;--ndt-transition-default: all .2s ease-out;--ndt-transition-smooth: all .2s ease-in-out;--ndt-bg-primary: rgb(255, 255, 255);--ndt-bg-gradient: linear-gradient(180deg, rgb(243, 244, 246) 0%, rgba(243, 244, 246, .88) 100%);--ndt-text-primary: rgb(17, 24, 39);--ndt-text-secondary: rgb(55, 65, 81);--ndt-text-muted: rgb(107, 114, 128);--ndt-border-primary: #e5e7eb;--ndt-border-subtle: rgba(17, 24, 39, .1);--ndt-hover-bg: rgba(17, 24, 39, .05);--ndt-hover-danger: rgb(239, 68, 68);--ndt-shadow-toolbar: 0 2px 8px rgba(156, 163, 175, .2);--ndt-shadow-tooltip: 0 0 0 1px rgba(17, 24, 39, .05), 0 4px 8px rgba(107, 114, 128, .15), 0 2px 4px rgba(107, 114, 128, .1);--ndt-shadow-window: 0px 0px 0px 0px rgba(156, 163, 175, .1), 0px 1px 2px 0px rgba(156, 163, 175, .12), 0px 4px 4px 0px rgba(156, 163, 175, .1), 0px 10px 6px 0px rgba(156, 163, 175, .08), 0px 17px 7px 0px rgba(156, 163, 175, .05), 0px 26px 7px 0px rgba(156, 163, 175, .02);--ndt-spacing-xs: 4px;--ndt-spacing-sm: 8px;--ndt-spacing-md: 16px;--ndt-window-padding: 24px;--ndt-font-size-xs: .75rem;--ndt-font-size-sm: .875rem;--ndt-font-size-md: 1rem;--ndt-font-size-lg: 1.25rem;--ndt-font-size-xl: 2rem;--ndt-background-secondary: var(--ndt-bg-primary);--ndt-background-hover: var(--ndt-hover-bg);--ndt-primary: #df30d4;--ndt-primary-rgb: 223, 48, 212;--ndt-text-on-primary: rgb(255, 255, 255);--ndt-border-color: var(--ndt-border-primary);--ndt-note-background: rgb(219, 234, 254);--ndt-note-border: rgba(37, 99, 235, .2);--ndt-warning-background: rgb(254, 249, 195);--ndt-warning-border: rgba(202, 138, 4, .2);--ndt-error-background: rgb(254, 226, 226);--ndt-error-border: rgba(220, 38, 38, .2)}.dev-toolbar[data-theme=dark]{--ndt-bg-primary: rgb(17, 24, 39);--ndt-bg-gradient: linear-gradient(180deg, rgb(19, 21, 26) 0%, rgba(19, 21, 26, .88) 100%);--ndt-text-primary: rgb(255, 255, 255);--ndt-text-secondary: rgb(229, 231, 235);--ndt-text-muted: rgb(156, 163, 175);--ndt-border-primary: #343841;--ndt-border-subtle: rgba(255, 255, 255, .1);--ndt-hover-bg: rgba(255, 255, 255, .12);--ndt-hover-danger: rgb(220, 38, 38);--ndt-shadow-toolbar: 0 2px 8px rgba(19, 21, 26, .3);--ndt-shadow-tooltip: 0 0 0 1px rgba(255, 255, 255, .1), 0 4px 8px rgba(0, 0, 0, .4), 0 2px 4px rgba(0, 0, 0, .3);--ndt-shadow-window: 0px 0px 0px 0px rgba(19, 21, 26, .3), 0px 1px 2px 0px rgba(19, 21, 26, .29), 0px 4px 4px 0px rgba(19, 21, 26, .26), 0px 10px 6px 0px rgba(19, 21, 26, .15), 0px 17px 7px 0px rgba(19, 21, 26, .04), 0px 26px 7px 0px rgba(19, 21, 26, .01);--ndt-note-background: rgba(37, 99, 235, .15);--ndt-note-border: rgba(37, 99, 235, .3);--ndt-warning-background: rgba(202, 138, 4, .15);--ndt-warning-border: rgba(202, 138, 4, .3);--ndt-error-background: rgba(220, 38, 38, .15);--ndt-error-border: rgba(220, 38, 38, .3)}.dev-toolbar h1,.dev-toolbar h2,.dev-toolbar h3,.dev-toolbar h4,.dev-toolbar h5{font-weight:600;color:var(--ndt-text-primary);margin:0}.dev-toolbar h1{font-size:var(--ndt-font-size-xl)}.dev-toolbar h2{font-size:var(--ndt-font-size-lg)}.dev-toolbar h3{font-size:var(--ndt-font-size-md)}.dev-toolbar h4{font-size:var(--ndt-font-size-sm)}.dev-toolbar h5{font-size:var(--ndt-font-size-xs)}.dev-toolbar hr{border:1px solid var(--ndt-border-subtle);margin:1em 0}.dev-toolbar p{line-height:1.5em;margin:0}:host{display:block;width:100%}.window{box-sizing:border-box;display:flex;flex-direction:column;width:100%;height:100%;background:var(--ndt-bg-primary);border:1px solid var(--ndt-border-primary);border-radius:var(--ndt-border-radius-large);padding:var(--ndt-window-padding);font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",Segoe UI Symbol,\"Noto Color Emoji\";color:var(--ndt-text-secondary);z-index:999999999;box-shadow:var(--ndt-shadow-window)}.header{display:flex;flex-direction:row;justify-content:space-between;align-items:flex-start}.header__title{display:flex;align-items:center;gap:var(--ndt-spacing-sm)}.header__title .beta-tag{font-size:var(--ndt-font-size-xxs, .65rem);background:var(--ndt-purple, #8b5cf6);color:var(--ndt-text-on-primary);padding:1px 4px;margin-left:var(--ndt-spacing-xs);border-radius:var(--ndt-border-radius-small);font-weight:500;text-transform:uppercase;letter-spacing:.5px}.header__description{font-size:var(--ndt-font-size-sm);color:var(--ndt-text-muted);word-wrap:break-word;overflow-wrap:break-word;max-width:100%}.header__content{display:flex;flex-direction:column}.header__controls{display:flex;gap:var(--ndt-spacing-sm)}.content{flex:1;overflow:auto}.divider{height:1px;background-color:var(--ndt-border-primary);margin-bottom:var(--ndt-spacing-md);margin-top:var(--ndt-spacing-md)}.control{background:none;border:none;color:var(--ndt-text-secondary);cursor:pointer;padding:var(--ndt-spacing-xs) var(--ndt-spacing-sm);border-radius:var(--ndt-border-radius-small);font-size:var(--ndt-font-size-md);line-height:1;transition:var(--ndt-transition-smooth)}.control:hover{background:var(--ndt-hover-bg);color:var(--ndt-text-primary)}.control--close:hover{background:var(--ndt-hover-danger)}\n"] }); }
1733
+ }
1734
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: DevToolbarWindowComponent, decorators: [{
1735
+ type: Component,
1736
+ args: [{ selector: 'ndt-window', standalone: true, template: `
1737
+ <div class="window dev-toolbar" [attr.data-theme]="theme()">
1738
+ <div class="header">
1739
+ <div class="header__content">
1740
+ <div class="header__title">
1741
+ <h1>{{ config().title }}</h1>
1742
+ @if (config().isBeta) {
1743
+ <span class="beta-tag">BETA</span>
1744
+ }
1745
+ </div>
1746
+ <p class="header__description">{{ config().description }}</p>
1747
+ </div>
1748
+ <div class="header__controls">
1749
+ @if (config().isMinimizable) {
1750
+ <button aria-label="Minimize" class="control" (click)="onMinimize()">
1751
+
1752
+ </button>
1753
+ } @if (config().isMaximizable) {
1754
+ <button aria-label="Maximize" class="control" (click)="onMaximize()">
1755
+
1756
+ </button>
1757
+ } @if (config().isClosable) {
1758
+ <button
1759
+ aria-label="Close"
1760
+ class="control control--close"
1761
+ (click)="onClose()"
1762
+ >
1763
+ ×
1764
+ </button>
1765
+ }
1766
+ </div>
1767
+ </div>
1768
+
1769
+ <div class="divider"></div>
1770
+ <div class="content">
1771
+ <ng-content></ng-content>
1772
+ </div>
1773
+ </div>
1774
+ `, styles: [".dev-toolbar{--ndt-border-radius-small: 4px;--ndt-border-radius-medium: 8px;--ndt-border-radius-large: 12px;--ndt-transition-default: all .2s ease-out;--ndt-transition-smooth: all .2s ease-in-out;--ndt-bg-primary: rgb(255, 255, 255);--ndt-bg-gradient: linear-gradient(180deg, rgb(243, 244, 246) 0%, rgba(243, 244, 246, .88) 100%);--ndt-text-primary: rgb(17, 24, 39);--ndt-text-secondary: rgb(55, 65, 81);--ndt-text-muted: rgb(107, 114, 128);--ndt-border-primary: #e5e7eb;--ndt-border-subtle: rgba(17, 24, 39, .1);--ndt-hover-bg: rgba(17, 24, 39, .05);--ndt-hover-danger: rgb(239, 68, 68);--ndt-shadow-toolbar: 0 2px 8px rgba(156, 163, 175, .2);--ndt-shadow-tooltip: 0 0 0 1px rgba(17, 24, 39, .05), 0 4px 8px rgba(107, 114, 128, .15), 0 2px 4px rgba(107, 114, 128, .1);--ndt-shadow-window: 0px 0px 0px 0px rgba(156, 163, 175, .1), 0px 1px 2px 0px rgba(156, 163, 175, .12), 0px 4px 4px 0px rgba(156, 163, 175, .1), 0px 10px 6px 0px rgba(156, 163, 175, .08), 0px 17px 7px 0px rgba(156, 163, 175, .05), 0px 26px 7px 0px rgba(156, 163, 175, .02);--ndt-spacing-xs: 4px;--ndt-spacing-sm: 8px;--ndt-spacing-md: 16px;--ndt-window-padding: 24px;--ndt-font-size-xs: .75rem;--ndt-font-size-sm: .875rem;--ndt-font-size-md: 1rem;--ndt-font-size-lg: 1.25rem;--ndt-font-size-xl: 2rem;--ndt-background-secondary: var(--ndt-bg-primary);--ndt-background-hover: var(--ndt-hover-bg);--ndt-primary: #df30d4;--ndt-primary-rgb: 223, 48, 212;--ndt-text-on-primary: rgb(255, 255, 255);--ndt-border-color: var(--ndt-border-primary);--ndt-note-background: rgb(219, 234, 254);--ndt-note-border: rgba(37, 99, 235, .2);--ndt-warning-background: rgb(254, 249, 195);--ndt-warning-border: rgba(202, 138, 4, .2);--ndt-error-background: rgb(254, 226, 226);--ndt-error-border: rgba(220, 38, 38, .2)}.dev-toolbar[data-theme=dark]{--ndt-bg-primary: rgb(17, 24, 39);--ndt-bg-gradient: linear-gradient(180deg, rgb(19, 21, 26) 0%, rgba(19, 21, 26, .88) 100%);--ndt-text-primary: rgb(255, 255, 255);--ndt-text-secondary: rgb(229, 231, 235);--ndt-text-muted: rgb(156, 163, 175);--ndt-border-primary: #343841;--ndt-border-subtle: rgba(255, 255, 255, .1);--ndt-hover-bg: rgba(255, 255, 255, .12);--ndt-hover-danger: rgb(220, 38, 38);--ndt-shadow-toolbar: 0 2px 8px rgba(19, 21, 26, .3);--ndt-shadow-tooltip: 0 0 0 1px rgba(255, 255, 255, .1), 0 4px 8px rgba(0, 0, 0, .4), 0 2px 4px rgba(0, 0, 0, .3);--ndt-shadow-window: 0px 0px 0px 0px rgba(19, 21, 26, .3), 0px 1px 2px 0px rgba(19, 21, 26, .29), 0px 4px 4px 0px rgba(19, 21, 26, .26), 0px 10px 6px 0px rgba(19, 21, 26, .15), 0px 17px 7px 0px rgba(19, 21, 26, .04), 0px 26px 7px 0px rgba(19, 21, 26, .01);--ndt-note-background: rgba(37, 99, 235, .15);--ndt-note-border: rgba(37, 99, 235, .3);--ndt-warning-background: rgba(202, 138, 4, .15);--ndt-warning-border: rgba(202, 138, 4, .3);--ndt-error-background: rgba(220, 38, 38, .15);--ndt-error-border: rgba(220, 38, 38, .3)}.dev-toolbar h1,.dev-toolbar h2,.dev-toolbar h3,.dev-toolbar h4,.dev-toolbar h5{font-weight:600;color:var(--ndt-text-primary);margin:0}.dev-toolbar h1{font-size:var(--ndt-font-size-xl)}.dev-toolbar h2{font-size:var(--ndt-font-size-lg)}.dev-toolbar h3{font-size:var(--ndt-font-size-md)}.dev-toolbar h4{font-size:var(--ndt-font-size-sm)}.dev-toolbar h5{font-size:var(--ndt-font-size-xs)}.dev-toolbar hr{border:1px solid var(--ndt-border-subtle);margin:1em 0}.dev-toolbar p{line-height:1.5em;margin:0}:host{display:block;width:100%}.window{box-sizing:border-box;display:flex;flex-direction:column;width:100%;height:100%;background:var(--ndt-bg-primary);border:1px solid var(--ndt-border-primary);border-radius:var(--ndt-border-radius-large);padding:var(--ndt-window-padding);font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\",Segoe UI Symbol,\"Noto Color Emoji\";color:var(--ndt-text-secondary);z-index:999999999;box-shadow:var(--ndt-shadow-window)}.header{display:flex;flex-direction:row;justify-content:space-between;align-items:flex-start}.header__title{display:flex;align-items:center;gap:var(--ndt-spacing-sm)}.header__title .beta-tag{font-size:var(--ndt-font-size-xxs, .65rem);background:var(--ndt-purple, #8b5cf6);color:var(--ndt-text-on-primary);padding:1px 4px;margin-left:var(--ndt-spacing-xs);border-radius:var(--ndt-border-radius-small);font-weight:500;text-transform:uppercase;letter-spacing:.5px}.header__description{font-size:var(--ndt-font-size-sm);color:var(--ndt-text-muted);word-wrap:break-word;overflow-wrap:break-word;max-width:100%}.header__content{display:flex;flex-direction:column}.header__controls{display:flex;gap:var(--ndt-spacing-sm)}.content{flex:1;overflow:auto}.divider{height:1px;background-color:var(--ndt-border-primary);margin-bottom:var(--ndt-spacing-md);margin-top:var(--ndt-spacing-md)}.control{background:none;border:none;color:var(--ndt-text-secondary);cursor:pointer;padding:var(--ndt-spacing-xs) var(--ndt-spacing-sm);border-radius:var(--ndt-border-radius-small);font-size:var(--ndt-font-size-md);line-height:1;transition:var(--ndt-transition-smooth)}.control:hover{background:var(--ndt-hover-bg);color:var(--ndt-text-primary)}.control--close:hover{background:var(--ndt-hover-danger)}\n"] }]
1775
+ }] });
1776
+
1777
+ class DevToolbarToolComponent {
1778
+ constructor() {
1779
+ this.state = inject(DevToolbarStateService);
1780
+ this.options = input.required();
1781
+ this.icon = input.required();
1782
+ this.title = input.required();
1783
+ this.isActive = computed(() => this.state.activeToolId() === this.options().id);
1784
+ this.height = computed(() => {
1785
+ switch (this.options().size) {
1786
+ case 'small':
1787
+ return 320;
1788
+ case 'medium':
1789
+ return 480;
1790
+ case 'tall':
1791
+ return 620;
1792
+ case 'large':
1793
+ return 620;
1794
+ default:
1795
+ return 480;
1796
+ }
1797
+ });
1798
+ this.width = computed(() => {
1799
+ switch (this.options().size) {
1800
+ case 'small':
1801
+ return 320;
1802
+ case 'medium':
1803
+ return 480;
1804
+ case 'tall':
1805
+ return 480;
1806
+ case 'large':
1807
+ return 620;
1808
+ default:
1809
+ return 400;
1810
+ }
1811
+ });
1812
+ this.positions = computed(() => {
1813
+ const triggerXPosition = this.getButtonContainerXPosition();
1814
+ const windowCenter = window.innerWidth / 2;
1815
+ const offsetX = windowCenter - triggerXPosition - 22;
1816
+ return [
1817
+ {
1818
+ originX: 'center',
1819
+ originY: 'center',
1820
+ overlayX: 'center',
1821
+ overlayY: 'center',
1822
+ offsetY: -(Math.ceil(this.height() / 2) + 36),
1823
+ offsetX,
1824
+ },
1825
+ ];
1826
+ });
1827
+ }
1828
+ onOpen() {
1829
+ this.state.setActiveTool(this.options().id);
1830
+ }
1831
+ onClose() {
1832
+ this.state.setActiveTool(null);
1833
+ }
1834
+ getButtonContainerXPosition() {
1835
+ const buttonContainerRect = this.buttonContainer?.nativeElement?.getBoundingClientRect();
1836
+ return buttonContainerRect?.left ?? 0;
1837
+ }
1838
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: DevToolbarToolComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1839
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.5", type: DevToolbarToolComponent, isStandalone: true, selector: "ndt-toolbar-tool", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: true, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: true, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: true, transformFunction: null } }, queries: [{ propertyName: "buttonComponent", first: true, predicate: DevToolbarToolButtonComponent, descendants: true }], viewQueries: [{ propertyName: "buttonContainer", first: true, predicate: ["buttonContainer"], descendants: true }], ngImport: i0, template: `
1840
+ <div #trigger="cdkOverlayOrigin" class="dev-toolbar-tool" cdkOverlayOrigin>
1841
+ <div
1842
+ class="dev-toolbar-tool__icon"
1843
+ (click)="onOpen()"
1844
+ (keydown.enter)="onOpen()"
1845
+ (keydown.space)="onOpen()"
1846
+ tabindex="0"
1847
+ >
1848
+ <div #buttonContainer [attr.data-tooltip]="title()">
1849
+ @if (icon()) {
1850
+ <ndt-tool-button [title]="title()" [toolId]="options().id">
1851
+ <ndt-icon [name]="icon()" />
1852
+ </ndt-tool-button>
1853
+ } @else {
1854
+ <ng-content select="ndt-tool-button"></ng-content>
1855
+ }
1856
+ </div>
1857
+ </div>
1858
+
1859
+ @if (isActive()) {
1860
+ <ng-template
1861
+ #contentTemplate
1862
+ [cdkConnectedOverlayOrigin]="trigger"
1863
+ [cdkConnectedOverlayOpen]="isActive()"
1864
+ [cdkConnectedOverlayPositions]="positions()"
1865
+ [cdkConnectedOverlayWidth]="width()"
1866
+ [cdkConnectedOverlayHeight]="height()"
1867
+ cdkConnectedOverlay
1868
+ >
1869
+ <ndt-window [@slideAnimation] [config]="options()" (close)="onClose()">
1870
+ <ng-content />
1871
+ </ndt-window>
1872
+ </ng-template>
1873
+ }
1874
+ </div>
1875
+ `, isInline: true, styles: [".dev-toolbar{--ndt-border-radius-small: 4px;--ndt-border-radius-medium: 8px;--ndt-border-radius-large: 12px;--ndt-transition-default: all .2s ease-out;--ndt-transition-smooth: all .2s ease-in-out;--ndt-bg-primary: rgb(255, 255, 255);--ndt-bg-gradient: linear-gradient(180deg, rgb(243, 244, 246) 0%, rgba(243, 244, 246, .88) 100%);--ndt-text-primary: rgb(17, 24, 39);--ndt-text-secondary: rgb(55, 65, 81);--ndt-text-muted: rgb(107, 114, 128);--ndt-border-primary: #e5e7eb;--ndt-border-subtle: rgba(17, 24, 39, .1);--ndt-hover-bg: rgba(17, 24, 39, .05);--ndt-hover-danger: rgb(239, 68, 68);--ndt-shadow-toolbar: 0 2px 8px rgba(156, 163, 175, .2);--ndt-shadow-tooltip: 0 0 0 1px rgba(17, 24, 39, .05), 0 4px 8px rgba(107, 114, 128, .15), 0 2px 4px rgba(107, 114, 128, .1);--ndt-shadow-window: 0px 0px 0px 0px rgba(156, 163, 175, .1), 0px 1px 2px 0px rgba(156, 163, 175, .12), 0px 4px 4px 0px rgba(156, 163, 175, .1), 0px 10px 6px 0px rgba(156, 163, 175, .08), 0px 17px 7px 0px rgba(156, 163, 175, .05), 0px 26px 7px 0px rgba(156, 163, 175, .02);--ndt-spacing-xs: 4px;--ndt-spacing-sm: 8px;--ndt-spacing-md: 16px;--ndt-window-padding: 24px;--ndt-font-size-xs: .75rem;--ndt-font-size-sm: .875rem;--ndt-font-size-md: 1rem;--ndt-font-size-lg: 1.25rem;--ndt-font-size-xl: 2rem;--ndt-background-secondary: var(--ndt-bg-primary);--ndt-background-hover: var(--ndt-hover-bg);--ndt-primary: #df30d4;--ndt-primary-rgb: 223, 48, 212;--ndt-text-on-primary: rgb(255, 255, 255);--ndt-border-color: var(--ndt-border-primary);--ndt-note-background: rgb(219, 234, 254);--ndt-note-border: rgba(37, 99, 235, .2);--ndt-warning-background: rgb(254, 249, 195);--ndt-warning-border: rgba(202, 138, 4, .2);--ndt-error-background: rgb(254, 226, 226);--ndt-error-border: rgba(220, 38, 38, .2)}.dev-toolbar[data-theme=dark]{--ndt-bg-primary: rgb(17, 24, 39);--ndt-bg-gradient: linear-gradient(180deg, rgb(19, 21, 26) 0%, rgba(19, 21, 26, .88) 100%);--ndt-text-primary: rgb(255, 255, 255);--ndt-text-secondary: rgb(229, 231, 235);--ndt-text-muted: rgb(156, 163, 175);--ndt-border-primary: #343841;--ndt-border-subtle: rgba(255, 255, 255, .1);--ndt-hover-bg: rgba(255, 255, 255, .12);--ndt-hover-danger: rgb(220, 38, 38);--ndt-shadow-toolbar: 0 2px 8px rgba(19, 21, 26, .3);--ndt-shadow-tooltip: 0 0 0 1px rgba(255, 255, 255, .1), 0 4px 8px rgba(0, 0, 0, .4), 0 2px 4px rgba(0, 0, 0, .3);--ndt-shadow-window: 0px 0px 0px 0px rgba(19, 21, 26, .3), 0px 1px 2px 0px rgba(19, 21, 26, .29), 0px 4px 4px 0px rgba(19, 21, 26, .26), 0px 10px 6px 0px rgba(19, 21, 26, .15), 0px 17px 7px 0px rgba(19, 21, 26, .04), 0px 26px 7px 0px rgba(19, 21, 26, .01);--ndt-note-background: rgba(37, 99, 235, .15);--ndt-note-border: rgba(37, 99, 235, .3);--ndt-warning-background: rgba(202, 138, 4, .15);--ndt-warning-border: rgba(202, 138, 4, .3);--ndt-error-background: rgba(220, 38, 38, .15);--ndt-error-border: rgba(220, 38, 38, .3)}.dev-toolbar h1,.dev-toolbar h2,.dev-toolbar h3,.dev-toolbar h4,.dev-toolbar h5{font-weight:600;color:var(--ndt-text-primary);margin:0}.dev-toolbar h1{font-size:var(--ndt-font-size-xl)}.dev-toolbar h2{font-size:var(--ndt-font-size-lg)}.dev-toolbar h3{font-size:var(--ndt-font-size-md)}.dev-toolbar h4{font-size:var(--ndt-font-size-sm)}.dev-toolbar h5{font-size:var(--ndt-font-size-xs)}.dev-toolbar hr{border:1px solid var(--ndt-border-subtle);margin:1em 0}.dev-toolbar p{line-height:1.5em;margin:0}.tool{position:relative}.trigger{cursor:pointer}\n"], dependencies: [{ kind: "directive", type: CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i1.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "component", type: DevToolbarWindowComponent, selector: "ndt-window", inputs: ["config"], outputs: ["close", "maximize", "minimize"] }, { kind: "component", type: DevToolbarToolButtonComponent, selector: "ndt-tool-button", inputs: ["title", "toolId"], outputs: ["open"] }, { kind: "component", type: DevToolbarIconComponent, selector: "ndt-icon", inputs: ["name"] }], animations: [
1876
+ trigger('slideAnimation', [
1877
+ transition(':enter', [
1878
+ style({
1879
+ transform: 'translateY(20px)',
1880
+ opacity: 0,
1881
+ }),
1882
+ animate('400ms cubic-bezier(0.4, 0, 0.2, 1)', style({
1883
+ transform: 'translateY(0)',
1884
+ opacity: 1,
1885
+ })),
1886
+ ]),
1887
+ transition(':leave', [
1888
+ style({
1889
+ transform: 'translateY(0)',
1890
+ opacity: 1,
1891
+ }),
1892
+ animate('400ms cubic-bezier(0.4, 0, 0.2, 1)', style({
1893
+ transform: 'translateY(20px)',
1894
+ opacity: 0,
1895
+ })),
1896
+ ]),
1897
+ ]),
1898
+ ], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1899
+ }
1900
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: DevToolbarToolComponent, decorators: [{
1901
+ type: Component,
1902
+ args: [{ selector: 'ndt-toolbar-tool', standalone: true, imports: [
1903
+ CdkConnectedOverlay,
1904
+ OverlayModule,
1905
+ DevToolbarWindowComponent,
1906
+ DevToolbarToolButtonComponent,
1907
+ DevToolbarIconComponent,
1908
+ ], template: `
1909
+ <div #trigger="cdkOverlayOrigin" class="dev-toolbar-tool" cdkOverlayOrigin>
1910
+ <div
1911
+ class="dev-toolbar-tool__icon"
1912
+ (click)="onOpen()"
1913
+ (keydown.enter)="onOpen()"
1914
+ (keydown.space)="onOpen()"
1915
+ tabindex="0"
1916
+ >
1917
+ <div #buttonContainer [attr.data-tooltip]="title()">
1918
+ @if (icon()) {
1919
+ <ndt-tool-button [title]="title()" [toolId]="options().id">
1920
+ <ndt-icon [name]="icon()" />
1921
+ </ndt-tool-button>
1922
+ } @else {
1923
+ <ng-content select="ndt-tool-button"></ng-content>
1924
+ }
1925
+ </div>
1926
+ </div>
1927
+
1928
+ @if (isActive()) {
1929
+ <ng-template
1930
+ #contentTemplate
1931
+ [cdkConnectedOverlayOrigin]="trigger"
1932
+ [cdkConnectedOverlayOpen]="isActive()"
1933
+ [cdkConnectedOverlayPositions]="positions()"
1934
+ [cdkConnectedOverlayWidth]="width()"
1935
+ [cdkConnectedOverlayHeight]="height()"
1936
+ cdkConnectedOverlay
1937
+ >
1938
+ <ndt-window [@slideAnimation] [config]="options()" (close)="onClose()">
1939
+ <ng-content />
1940
+ </ndt-window>
1941
+ </ng-template>
1942
+ }
1943
+ </div>
1944
+ `, changeDetection: ChangeDetectionStrategy.OnPush, animations: [
1945
+ trigger('slideAnimation', [
1946
+ transition(':enter', [
1947
+ style({
1948
+ transform: 'translateY(20px)',
1949
+ opacity: 0,
1950
+ }),
1951
+ animate('400ms cubic-bezier(0.4, 0, 0.2, 1)', style({
1952
+ transform: 'translateY(0)',
1953
+ opacity: 1,
1954
+ })),
1955
+ ]),
1956
+ transition(':leave', [
1957
+ style({
1958
+ transform: 'translateY(0)',
1959
+ opacity: 1,
1960
+ }),
1961
+ animate('400ms cubic-bezier(0.4, 0, 0.2, 1)', style({
1962
+ transform: 'translateY(20px)',
1963
+ opacity: 0,
1964
+ })),
1965
+ ]),
1966
+ ]),
1967
+ ], styles: [".dev-toolbar{--ndt-border-radius-small: 4px;--ndt-border-radius-medium: 8px;--ndt-border-radius-large: 12px;--ndt-transition-default: all .2s ease-out;--ndt-transition-smooth: all .2s ease-in-out;--ndt-bg-primary: rgb(255, 255, 255);--ndt-bg-gradient: linear-gradient(180deg, rgb(243, 244, 246) 0%, rgba(243, 244, 246, .88) 100%);--ndt-text-primary: rgb(17, 24, 39);--ndt-text-secondary: rgb(55, 65, 81);--ndt-text-muted: rgb(107, 114, 128);--ndt-border-primary: #e5e7eb;--ndt-border-subtle: rgba(17, 24, 39, .1);--ndt-hover-bg: rgba(17, 24, 39, .05);--ndt-hover-danger: rgb(239, 68, 68);--ndt-shadow-toolbar: 0 2px 8px rgba(156, 163, 175, .2);--ndt-shadow-tooltip: 0 0 0 1px rgba(17, 24, 39, .05), 0 4px 8px rgba(107, 114, 128, .15), 0 2px 4px rgba(107, 114, 128, .1);--ndt-shadow-window: 0px 0px 0px 0px rgba(156, 163, 175, .1), 0px 1px 2px 0px rgba(156, 163, 175, .12), 0px 4px 4px 0px rgba(156, 163, 175, .1), 0px 10px 6px 0px rgba(156, 163, 175, .08), 0px 17px 7px 0px rgba(156, 163, 175, .05), 0px 26px 7px 0px rgba(156, 163, 175, .02);--ndt-spacing-xs: 4px;--ndt-spacing-sm: 8px;--ndt-spacing-md: 16px;--ndt-window-padding: 24px;--ndt-font-size-xs: .75rem;--ndt-font-size-sm: .875rem;--ndt-font-size-md: 1rem;--ndt-font-size-lg: 1.25rem;--ndt-font-size-xl: 2rem;--ndt-background-secondary: var(--ndt-bg-primary);--ndt-background-hover: var(--ndt-hover-bg);--ndt-primary: #df30d4;--ndt-primary-rgb: 223, 48, 212;--ndt-text-on-primary: rgb(255, 255, 255);--ndt-border-color: var(--ndt-border-primary);--ndt-note-background: rgb(219, 234, 254);--ndt-note-border: rgba(37, 99, 235, .2);--ndt-warning-background: rgb(254, 249, 195);--ndt-warning-border: rgba(202, 138, 4, .2);--ndt-error-background: rgb(254, 226, 226);--ndt-error-border: rgba(220, 38, 38, .2)}.dev-toolbar[data-theme=dark]{--ndt-bg-primary: rgb(17, 24, 39);--ndt-bg-gradient: linear-gradient(180deg, rgb(19, 21, 26) 0%, rgba(19, 21, 26, .88) 100%);--ndt-text-primary: rgb(255, 255, 255);--ndt-text-secondary: rgb(229, 231, 235);--ndt-text-muted: rgb(156, 163, 175);--ndt-border-primary: #343841;--ndt-border-subtle: rgba(255, 255, 255, .1);--ndt-hover-bg: rgba(255, 255, 255, .12);--ndt-hover-danger: rgb(220, 38, 38);--ndt-shadow-toolbar: 0 2px 8px rgba(19, 21, 26, .3);--ndt-shadow-tooltip: 0 0 0 1px rgba(255, 255, 255, .1), 0 4px 8px rgba(0, 0, 0, .4), 0 2px 4px rgba(0, 0, 0, .3);--ndt-shadow-window: 0px 0px 0px 0px rgba(19, 21, 26, .3), 0px 1px 2px 0px rgba(19, 21, 26, .29), 0px 4px 4px 0px rgba(19, 21, 26, .26), 0px 10px 6px 0px rgba(19, 21, 26, .15), 0px 17px 7px 0px rgba(19, 21, 26, .04), 0px 26px 7px 0px rgba(19, 21, 26, .01);--ndt-note-background: rgba(37, 99, 235, .15);--ndt-note-border: rgba(37, 99, 235, .3);--ndt-warning-background: rgba(202, 138, 4, .15);--ndt-warning-border: rgba(202, 138, 4, .3);--ndt-error-background: rgba(220, 38, 38, .15);--ndt-error-border: rgba(220, 38, 38, .3)}.dev-toolbar h1,.dev-toolbar h2,.dev-toolbar h3,.dev-toolbar h4,.dev-toolbar h5{font-weight:600;color:var(--ndt-text-primary);margin:0}.dev-toolbar h1{font-size:var(--ndt-font-size-xl)}.dev-toolbar h2{font-size:var(--ndt-font-size-lg)}.dev-toolbar h3{font-size:var(--ndt-font-size-md)}.dev-toolbar h4{font-size:var(--ndt-font-size-sm)}.dev-toolbar h5{font-size:var(--ndt-font-size-xs)}.dev-toolbar hr{border:1px solid var(--ndt-border-subtle);margin:1em 0}.dev-toolbar p{line-height:1.5em;margin:0}.tool{position:relative}.trigger{cursor:pointer}\n"] }]
1968
+ }], propDecorators: { buttonContainer: [{
1969
+ type: ViewChild,
1970
+ args: ['buttonContainer']
1971
+ }], buttonComponent: [{
1972
+ type: ContentChild,
1973
+ args: [DevToolbarToolButtonComponent]
1974
+ }] } });
1975
+
1976
+ class DevToolbarInputComponent {
1977
+ constructor() {
1978
+ this.value = model.required();
1979
+ this.type = input('text');
1980
+ this.placeholder = input('');
1981
+ this.ariaLabel = input('');
1982
+ this.inputClass = input('input');
1983
+ }
1984
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: DevToolbarInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1985
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.0.5", type: DevToolbarInputComponent, isStandalone: true, selector: "ndt-input", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: true, transformFunction: null }, type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, inputClass: { classPropertyName: "inputClass", publicName: "inputClass", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange" }, ngImport: i0, template: `
1986
+ <input
1987
+ [attr.aria-label]="ariaLabel()"
1988
+ [type]="type()"
1989
+ [class]="inputClass()"
1990
+ [ngModel]="value()"
1991
+ [placeholder]="placeholder()"
1992
+ (ngModelChange)="value.set($event)"
1993
+ />
1994
+ `, isInline: true, styles: [":host{display:block}.input{width:100%;padding:var(--ndt-spacing-sm) var(--ndt-spacing-md);border:1px solid var(--ndt-border-primary);border-radius:var(--ndt-border-radius-small);background-color:var(--ndt-bg-primary);color:var(--ndt-text-primary);font-size:var(--ndt-font-size-sm);transition:var(--ndt-transition-default);box-sizing:border-box}.input::placeholder{color:var(--ndt-text-muted)}.input:focus{outline:none;border-color:var(--ndt-primary);box-shadow:0 0 0 2px rgba(var(--ndt-primary-rgb),.2)}.input:disabled{background-color:var(--ndt-bg-secondary);cursor:not-allowed;color:var(--ndt-text-muted)}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1995
+ }
1996
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: DevToolbarInputComponent, decorators: [{
1997
+ type: Component,
1998
+ args: [{ selector: 'ndt-input', standalone: true, imports: [FormsModule], template: `
1999
+ <input
2000
+ [attr.aria-label]="ariaLabel()"
2001
+ [type]="type()"
2002
+ [class]="inputClass()"
2003
+ [ngModel]="value()"
2004
+ [placeholder]="placeholder()"
2005
+ (ngModelChange)="value.set($event)"
2006
+ />
2007
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block}.input{width:100%;padding:var(--ndt-spacing-sm) var(--ndt-spacing-md);border:1px solid var(--ndt-border-primary);border-radius:var(--ndt-border-radius-small);background-color:var(--ndt-bg-primary);color:var(--ndt-text-primary);font-size:var(--ndt-font-size-sm);transition:var(--ndt-transition-default);box-sizing:border-box}.input::placeholder{color:var(--ndt-text-muted)}.input:focus{outline:none;border-color:var(--ndt-primary);box-shadow:0 0 0 2px rgba(var(--ndt-primary-rgb),.2)}.input:disabled{background-color:var(--ndt-bg-secondary);cursor:not-allowed;color:var(--ndt-text-muted)}\n"] }]
2008
+ }] });
2009
+
2010
+ class DevToolbarSelectComponent {
2011
+ constructor() {
2012
+ this.devToolbarStateService = inject(DevToolbarStateService);
2013
+ this.value = model();
2014
+ this.options = input.required();
2015
+ this.ariaLabel = input('');
2016
+ this.label = input('');
2017
+ this.size = input('medium');
2018
+ this.theme = computed(() => this.devToolbarStateService.theme());
2019
+ this.selectMenuId = `select-menu-${Math.random()
2020
+ .toString(36)
2021
+ .slice(2, 11)}`;
2022
+ this.isOpen = signal(false);
2023
+ this.selectedLabel = computed(() => {
2024
+ const selected = this.options()?.find((opt) => opt.value === this.value());
2025
+ return selected?.label ?? '';
2026
+ });
2027
+ this.positions = [
2028
+ {
2029
+ originX: 'end',
2030
+ originY: 'bottom',
2031
+ overlayX: 'end',
2032
+ overlayY: 'top',
2033
+ offsetY: 4,
2034
+ },
2035
+ {
2036
+ originX: 'end',
2037
+ originY: 'top',
2038
+ overlayX: 'end',
2039
+ overlayY: 'bottom',
2040
+ offsetY: -4,
2041
+ },
2042
+ ];
2043
+ }
2044
+ toggle() {
2045
+ this.isOpen.update((v) => !v);
2046
+ }
2047
+ close() {
2048
+ this.isOpen.set(false);
2049
+ }
2050
+ selectOption(option) {
2051
+ this.value.set(option.value);
2052
+ this.close();
2053
+ }
2054
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: DevToolbarSelectComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2055
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.5", type: DevToolbarSelectComponent, isStandalone: true, selector: "ndt-select", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: true, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange" }, ngImport: i0, template: `
2056
+ <div
2057
+ class="dev-toolbar select"
2058
+ [class.small]="size() === 'small'"
2059
+ [class.open]="isOpen()"
2060
+ [attr.aria-label]="ariaLabel()"
2061
+ [attr.aria-expanded]="isOpen()"
2062
+ [attr.aria-controls]="selectMenuId"
2063
+ [attr.data-theme]="theme()"
2064
+ cdkOverlayOrigin
2065
+ #trigger="cdkOverlayOrigin"
2066
+ (click)="toggle()"
2067
+ (keydown.enter)="toggle()"
2068
+ (keydown.space)="toggle()"
2069
+ tabindex="0"
2070
+ role="combobox"
2071
+ >
2072
+ <span class="select__value">{{ selectedLabel() }}</span>
2073
+ <span class="select__arrow" aria-hidden="true"></span>
2074
+ </div>
2075
+
2076
+ <ng-template
2077
+ cdkConnectedOverlay
2078
+ [cdkConnectedOverlayOrigin]="trigger"
2079
+ [cdkConnectedOverlayOpen]="isOpen()"
2080
+ [cdkConnectedOverlayPositions]="positions"
2081
+ (overlayOutsideClick)="close()"
2082
+ >
2083
+ <div
2084
+ [id]="selectMenuId"
2085
+ class="dev-toolbar select-menu"
2086
+ cdkMenu
2087
+ role="listbox"
2088
+ [attr.data-theme]="theme()"
2089
+ >
2090
+ @for (option of options(); track option.value) {
2091
+ <button
2092
+ class="select-menu-item"
2093
+ [class.selected]="option.value === value()"
2094
+ [attr.aria-selected]="option.value === value()"
2095
+ cdkMenuItem
2096
+ type="button"
2097
+ (click)="selectOption(option)"
2098
+ >
2099
+ {{ option.label }}
2100
+ </button>
2101
+ }
2102
+ </div>
2103
+ </ng-template>
2104
+ `, isInline: true, styles: [".dev-toolbar{--ndt-border-radius-small: 4px;--ndt-border-radius-medium: 8px;--ndt-border-radius-large: 12px;--ndt-transition-default: all .2s ease-out;--ndt-transition-smooth: all .2s ease-in-out;--ndt-bg-primary: rgb(255, 255, 255);--ndt-bg-gradient: linear-gradient(180deg, rgb(243, 244, 246) 0%, rgba(243, 244, 246, .88) 100%);--ndt-text-primary: rgb(17, 24, 39);--ndt-text-secondary: rgb(55, 65, 81);--ndt-text-muted: rgb(107, 114, 128);--ndt-border-primary: #e5e7eb;--ndt-border-subtle: rgba(17, 24, 39, .1);--ndt-hover-bg: rgba(17, 24, 39, .05);--ndt-hover-danger: rgb(239, 68, 68);--ndt-shadow-toolbar: 0 2px 8px rgba(156, 163, 175, .2);--ndt-shadow-tooltip: 0 0 0 1px rgba(17, 24, 39, .05), 0 4px 8px rgba(107, 114, 128, .15), 0 2px 4px rgba(107, 114, 128, .1);--ndt-shadow-window: 0px 0px 0px 0px rgba(156, 163, 175, .1), 0px 1px 2px 0px rgba(156, 163, 175, .12), 0px 4px 4px 0px rgba(156, 163, 175, .1), 0px 10px 6px 0px rgba(156, 163, 175, .08), 0px 17px 7px 0px rgba(156, 163, 175, .05), 0px 26px 7px 0px rgba(156, 163, 175, .02);--ndt-spacing-xs: 4px;--ndt-spacing-sm: 8px;--ndt-spacing-md: 16px;--ndt-window-padding: 24px;--ndt-font-size-xs: .75rem;--ndt-font-size-sm: .875rem;--ndt-font-size-md: 1rem;--ndt-font-size-lg: 1.25rem;--ndt-font-size-xl: 2rem;--ndt-background-secondary: var(--ndt-bg-primary);--ndt-background-hover: var(--ndt-hover-bg);--ndt-primary: #df30d4;--ndt-primary-rgb: 223, 48, 212;--ndt-text-on-primary: rgb(255, 255, 255);--ndt-border-color: var(--ndt-border-primary);--ndt-note-background: rgb(219, 234, 254);--ndt-note-border: rgba(37, 99, 235, .2);--ndt-warning-background: rgb(254, 249, 195);--ndt-warning-border: rgba(202, 138, 4, .2);--ndt-error-background: rgb(254, 226, 226);--ndt-error-border: rgba(220, 38, 38, .2)}.dev-toolbar[data-theme=dark]{--ndt-bg-primary: rgb(17, 24, 39);--ndt-bg-gradient: linear-gradient(180deg, rgb(19, 21, 26) 0%, rgba(19, 21, 26, .88) 100%);--ndt-text-primary: rgb(255, 255, 255);--ndt-text-secondary: rgb(229, 231, 235);--ndt-text-muted: rgb(156, 163, 175);--ndt-border-primary: #343841;--ndt-border-subtle: rgba(255, 255, 255, .1);--ndt-hover-bg: rgba(255, 255, 255, .12);--ndt-hover-danger: rgb(220, 38, 38);--ndt-shadow-toolbar: 0 2px 8px rgba(19, 21, 26, .3);--ndt-shadow-tooltip: 0 0 0 1px rgba(255, 255, 255, .1), 0 4px 8px rgba(0, 0, 0, .4), 0 2px 4px rgba(0, 0, 0, .3);--ndt-shadow-window: 0px 0px 0px 0px rgba(19, 21, 26, .3), 0px 1px 2px 0px rgba(19, 21, 26, .29), 0px 4px 4px 0px rgba(19, 21, 26, .26), 0px 10px 6px 0px rgba(19, 21, 26, .15), 0px 17px 7px 0px rgba(19, 21, 26, .04), 0px 26px 7px 0px rgba(19, 21, 26, .01);--ndt-note-background: rgba(37, 99, 235, .15);--ndt-note-border: rgba(37, 99, 235, .3);--ndt-warning-background: rgba(202, 138, 4, .15);--ndt-warning-border: rgba(202, 138, 4, .3);--ndt-error-background: rgba(220, 38, 38, .15);--ndt-error-border: rgba(220, 38, 38, .3)}.dev-toolbar h1,.dev-toolbar h2,.dev-toolbar h3,.dev-toolbar h4,.dev-toolbar h5{font-weight:600;color:var(--ndt-text-primary);margin:0}.dev-toolbar h1{font-size:var(--ndt-font-size-xl)}.dev-toolbar h2{font-size:var(--ndt-font-size-lg)}.dev-toolbar h3{font-size:var(--ndt-font-size-md)}.dev-toolbar h4{font-size:var(--ndt-font-size-sm)}.dev-toolbar h5{font-size:var(--ndt-font-size-xs)}.dev-toolbar hr{border:1px solid var(--ndt-border-subtle);margin:1em 0}.dev-toolbar p{line-height:1.5em;margin:0}.select{position:relative;width:100%;min-width:120px;display:flex;align-items:center;justify-content:space-between;padding:var(--ndt-spacing-sm) var(--ndt-spacing-md);border:1px solid var(--ndt-border-primary);border-radius:var(--ndt-border-radius-small);background-color:var(--ndt-bg-primary);color:var(--ndt-text-primary);font-size:var(--ndt-font-size-sm);cursor:pointer;-webkit-user-select:none;user-select:none;transition:var(--ndt-transition-default);outline:none;height:32px;box-sizing:border-box}.select:hover{background-color:var(--ndt-hover-bg);border-color:var(--ndt-primary)}.select:focus-visible{outline:none;border-color:var(--ndt-primary);box-shadow:0 0 0 2px rgba(var(--ndt-primary-rgb),.2)}.select.small{padding:var(--ndt-spacing-xs) var(--ndt-spacing-sm);font-size:var(--ndt-font-size-sm);height:24px}.select.open{border-color:var(--ndt-primary);box-shadow:0 0 0 2px rgba(var(--ndt-primary-rgb),.2)}.select.open .select__arrow{transform:rotate(180deg)}.select__value{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;line-height:1;margin-right:var(--ndt-spacing-sm);min-width:0}.select__arrow{width:16px;height:16px;flex-shrink:0;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:center;background-size:contain;transition:transform .2s ease;opacity:.9}.select-menu{display:inline-flex;flex-direction:column;min-width:180px;background-color:var(--ndt-bg-primary);padding:var(--ndt-spacing-xs) 0;border:1px solid var(--ndt-border-primary);border-radius:var(--ndt-border-radius-small);box-shadow:var(--ndt-shadow-window);color:var(--ndt-text-primary);max-height:min(400px,70vh);overflow-y:auto;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px)}.select-menu::-webkit-scrollbar{width:8px;height:8px}.select-menu::-webkit-scrollbar-track{background:transparent}.select-menu::-webkit-scrollbar-thumb{background-color:var(--ndt-border-primary);border-radius:4px;border:2px solid var(--ndt-bg-primary)}.select-menu-item{background-color:transparent;cursor:pointer;border:none;color:inherit;-webkit-user-select:none;user-select:none;min-width:64px;line-height:36px;padding:0 var(--ndt-spacing-md);display:flex;align-items:center;flex-direction:row;flex:1;font-size:var(--ndt-font-size-sm);font-family:inherit;position:relative;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.select-menu-item:hover{background-color:var(--ndt-hover-bg)}.select-menu-item:active{background-color:rgba(var(--ndt-primary-rgb),.15)}.select-menu-item.selected{color:var(--ndt-primary);background-color:rgba(var(--ndt-primary-rgb),.1);font-weight:500}.select-menu-item.selected:hover{background-color:rgba(var(--ndt-primary-rgb),.15)}.select-menu-item.selected:before{content:\"\";position:absolute;left:0;top:8px;width:3px;height:calc(100% - 16px);background-color:var(--ndt-primary);border-radius:2px}.select-menu-item:focus-visible{outline:none;background-color:var(--ndt-hover-bg)}.select-overlay{-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i1.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i1.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "ngmodule", type: CdkMenuModule }, { kind: "directive", type: i2.CdkMenu, selector: "[cdkMenu]", outputs: ["closed"], exportAs: ["cdkMenu"] }, { kind: "directive", type: i2.CdkMenuItem, selector: "[cdkMenuItem]", inputs: ["cdkMenuItemDisabled", "cdkMenuitemTypeaheadLabel"], outputs: ["cdkMenuItemTriggered"], exportAs: ["cdkMenuItem"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
2105
+ }
2106
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: DevToolbarSelectComponent, decorators: [{
2107
+ type: Component,
2108
+ args: [{ selector: 'ndt-select', standalone: true, imports: [CommonModule, FormsModule, OverlayModule, CdkMenuModule], template: `
2109
+ <div
2110
+ class="dev-toolbar select"
2111
+ [class.small]="size() === 'small'"
2112
+ [class.open]="isOpen()"
2113
+ [attr.aria-label]="ariaLabel()"
2114
+ [attr.aria-expanded]="isOpen()"
2115
+ [attr.aria-controls]="selectMenuId"
2116
+ [attr.data-theme]="theme()"
2117
+ cdkOverlayOrigin
2118
+ #trigger="cdkOverlayOrigin"
2119
+ (click)="toggle()"
2120
+ (keydown.enter)="toggle()"
2121
+ (keydown.space)="toggle()"
2122
+ tabindex="0"
2123
+ role="combobox"
2124
+ >
2125
+ <span class="select__value">{{ selectedLabel() }}</span>
2126
+ <span class="select__arrow" aria-hidden="true"></span>
2127
+ </div>
2128
+
2129
+ <ng-template
2130
+ cdkConnectedOverlay
2131
+ [cdkConnectedOverlayOrigin]="trigger"
2132
+ [cdkConnectedOverlayOpen]="isOpen()"
2133
+ [cdkConnectedOverlayPositions]="positions"
2134
+ (overlayOutsideClick)="close()"
2135
+ >
2136
+ <div
2137
+ [id]="selectMenuId"
2138
+ class="dev-toolbar select-menu"
2139
+ cdkMenu
2140
+ role="listbox"
2141
+ [attr.data-theme]="theme()"
2142
+ >
2143
+ @for (option of options(); track option.value) {
2144
+ <button
2145
+ class="select-menu-item"
2146
+ [class.selected]="option.value === value()"
2147
+ [attr.aria-selected]="option.value === value()"
2148
+ cdkMenuItem
2149
+ type="button"
2150
+ (click)="selectOption(option)"
2151
+ >
2152
+ {{ option.label }}
2153
+ </button>
2154
+ }
2155
+ </div>
2156
+ </ng-template>
2157
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".dev-toolbar{--ndt-border-radius-small: 4px;--ndt-border-radius-medium: 8px;--ndt-border-radius-large: 12px;--ndt-transition-default: all .2s ease-out;--ndt-transition-smooth: all .2s ease-in-out;--ndt-bg-primary: rgb(255, 255, 255);--ndt-bg-gradient: linear-gradient(180deg, rgb(243, 244, 246) 0%, rgba(243, 244, 246, .88) 100%);--ndt-text-primary: rgb(17, 24, 39);--ndt-text-secondary: rgb(55, 65, 81);--ndt-text-muted: rgb(107, 114, 128);--ndt-border-primary: #e5e7eb;--ndt-border-subtle: rgba(17, 24, 39, .1);--ndt-hover-bg: rgba(17, 24, 39, .05);--ndt-hover-danger: rgb(239, 68, 68);--ndt-shadow-toolbar: 0 2px 8px rgba(156, 163, 175, .2);--ndt-shadow-tooltip: 0 0 0 1px rgba(17, 24, 39, .05), 0 4px 8px rgba(107, 114, 128, .15), 0 2px 4px rgba(107, 114, 128, .1);--ndt-shadow-window: 0px 0px 0px 0px rgba(156, 163, 175, .1), 0px 1px 2px 0px rgba(156, 163, 175, .12), 0px 4px 4px 0px rgba(156, 163, 175, .1), 0px 10px 6px 0px rgba(156, 163, 175, .08), 0px 17px 7px 0px rgba(156, 163, 175, .05), 0px 26px 7px 0px rgba(156, 163, 175, .02);--ndt-spacing-xs: 4px;--ndt-spacing-sm: 8px;--ndt-spacing-md: 16px;--ndt-window-padding: 24px;--ndt-font-size-xs: .75rem;--ndt-font-size-sm: .875rem;--ndt-font-size-md: 1rem;--ndt-font-size-lg: 1.25rem;--ndt-font-size-xl: 2rem;--ndt-background-secondary: var(--ndt-bg-primary);--ndt-background-hover: var(--ndt-hover-bg);--ndt-primary: #df30d4;--ndt-primary-rgb: 223, 48, 212;--ndt-text-on-primary: rgb(255, 255, 255);--ndt-border-color: var(--ndt-border-primary);--ndt-note-background: rgb(219, 234, 254);--ndt-note-border: rgba(37, 99, 235, .2);--ndt-warning-background: rgb(254, 249, 195);--ndt-warning-border: rgba(202, 138, 4, .2);--ndt-error-background: rgb(254, 226, 226);--ndt-error-border: rgba(220, 38, 38, .2)}.dev-toolbar[data-theme=dark]{--ndt-bg-primary: rgb(17, 24, 39);--ndt-bg-gradient: linear-gradient(180deg, rgb(19, 21, 26) 0%, rgba(19, 21, 26, .88) 100%);--ndt-text-primary: rgb(255, 255, 255);--ndt-text-secondary: rgb(229, 231, 235);--ndt-text-muted: rgb(156, 163, 175);--ndt-border-primary: #343841;--ndt-border-subtle: rgba(255, 255, 255, .1);--ndt-hover-bg: rgba(255, 255, 255, .12);--ndt-hover-danger: rgb(220, 38, 38);--ndt-shadow-toolbar: 0 2px 8px rgba(19, 21, 26, .3);--ndt-shadow-tooltip: 0 0 0 1px rgba(255, 255, 255, .1), 0 4px 8px rgba(0, 0, 0, .4), 0 2px 4px rgba(0, 0, 0, .3);--ndt-shadow-window: 0px 0px 0px 0px rgba(19, 21, 26, .3), 0px 1px 2px 0px rgba(19, 21, 26, .29), 0px 4px 4px 0px rgba(19, 21, 26, .26), 0px 10px 6px 0px rgba(19, 21, 26, .15), 0px 17px 7px 0px rgba(19, 21, 26, .04), 0px 26px 7px 0px rgba(19, 21, 26, .01);--ndt-note-background: rgba(37, 99, 235, .15);--ndt-note-border: rgba(37, 99, 235, .3);--ndt-warning-background: rgba(202, 138, 4, .15);--ndt-warning-border: rgba(202, 138, 4, .3);--ndt-error-background: rgba(220, 38, 38, .15);--ndt-error-border: rgba(220, 38, 38, .3)}.dev-toolbar h1,.dev-toolbar h2,.dev-toolbar h3,.dev-toolbar h4,.dev-toolbar h5{font-weight:600;color:var(--ndt-text-primary);margin:0}.dev-toolbar h1{font-size:var(--ndt-font-size-xl)}.dev-toolbar h2{font-size:var(--ndt-font-size-lg)}.dev-toolbar h3{font-size:var(--ndt-font-size-md)}.dev-toolbar h4{font-size:var(--ndt-font-size-sm)}.dev-toolbar h5{font-size:var(--ndt-font-size-xs)}.dev-toolbar hr{border:1px solid var(--ndt-border-subtle);margin:1em 0}.dev-toolbar p{line-height:1.5em;margin:0}.select{position:relative;width:100%;min-width:120px;display:flex;align-items:center;justify-content:space-between;padding:var(--ndt-spacing-sm) var(--ndt-spacing-md);border:1px solid var(--ndt-border-primary);border-radius:var(--ndt-border-radius-small);background-color:var(--ndt-bg-primary);color:var(--ndt-text-primary);font-size:var(--ndt-font-size-sm);cursor:pointer;-webkit-user-select:none;user-select:none;transition:var(--ndt-transition-default);outline:none;height:32px;box-sizing:border-box}.select:hover{background-color:var(--ndt-hover-bg);border-color:var(--ndt-primary)}.select:focus-visible{outline:none;border-color:var(--ndt-primary);box-shadow:0 0 0 2px rgba(var(--ndt-primary-rgb),.2)}.select.small{padding:var(--ndt-spacing-xs) var(--ndt-spacing-sm);font-size:var(--ndt-font-size-sm);height:24px}.select.open{border-color:var(--ndt-primary);box-shadow:0 0 0 2px rgba(var(--ndt-primary-rgb),.2)}.select.open .select__arrow{transform:rotate(180deg)}.select__value{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;line-height:1;margin-right:var(--ndt-spacing-sm);min-width:0}.select__arrow{width:16px;height:16px;flex-shrink:0;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:center;background-size:contain;transition:transform .2s ease;opacity:.9}.select-menu{display:inline-flex;flex-direction:column;min-width:180px;background-color:var(--ndt-bg-primary);padding:var(--ndt-spacing-xs) 0;border:1px solid var(--ndt-border-primary);border-radius:var(--ndt-border-radius-small);box-shadow:var(--ndt-shadow-window);color:var(--ndt-text-primary);max-height:min(400px,70vh);overflow-y:auto;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px)}.select-menu::-webkit-scrollbar{width:8px;height:8px}.select-menu::-webkit-scrollbar-track{background:transparent}.select-menu::-webkit-scrollbar-thumb{background-color:var(--ndt-border-primary);border-radius:4px;border:2px solid var(--ndt-bg-primary)}.select-menu-item{background-color:transparent;cursor:pointer;border:none;color:inherit;-webkit-user-select:none;user-select:none;min-width:64px;line-height:36px;padding:0 var(--ndt-spacing-md);display:flex;align-items:center;flex-direction:row;flex:1;font-size:var(--ndt-font-size-sm);font-family:inherit;position:relative;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.select-menu-item:hover{background-color:var(--ndt-hover-bg)}.select-menu-item:active{background-color:rgba(var(--ndt-primary-rgb),.15)}.select-menu-item.selected{color:var(--ndt-primary);background-color:rgba(var(--ndt-primary-rgb),.1);font-weight:500}.select-menu-item.selected:hover{background-color:rgba(var(--ndt-primary-rgb),.15)}.select-menu-item.selected:before{content:\"\";position:absolute;left:0;top:8px;width:3px;height:calc(100% - 16px);background-color:var(--ndt-primary);border-radius:2px}.select-menu-item:focus-visible{outline:none;background-color:var(--ndt-hover-bg)}.select-overlay{-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px)}\n"] }]
2158
+ }] });
2159
+
2160
+ class DevToolsStorageService {
2161
+ constructor() {
2162
+ this.PREFIX = 'AngularDevTools.';
2163
+ this.TOOLS_KEY = `${this.PREFIX}keys`;
2164
+ this.SETTINGS_KEY = `${this.PREFIX}settings`;
2165
+ }
2166
+ set(key, value) {
2167
+ const toolKey = this.getToolKey(key);
2168
+ this.addToolKey(toolKey);
2169
+ localStorage.setItem(toolKey, JSON.stringify(value));
2170
+ }
2171
+ get(key) {
2172
+ const toolKey = this.getToolKey(key);
2173
+ const item = localStorage.getItem(toolKey);
2174
+ return item ? JSON.parse(item) : null;
2175
+ }
2176
+ remove(key) {
2177
+ const toolKey = this.getToolKey(key);
2178
+ localStorage.removeItem(toolKey);
2179
+ this.removeToolKey(toolKey);
2180
+ }
2181
+ getAllSettings() {
2182
+ const settings = {};
2183
+ const keys = this.getToolKeys();
2184
+ keys.forEach((key) => {
2185
+ const value = this.get(key);
2186
+ if (value !== null) {
2187
+ settings[key] = value;
2188
+ }
2189
+ });
2190
+ return settings;
2191
+ }
2192
+ setAllSettings(settings) {
2193
+ Object.entries(settings).forEach(([key, value]) => {
2194
+ this.set(key, value);
2195
+ });
2196
+ }
2197
+ clearAllSettings() {
2198
+ const keys = this.getToolKeys();
2199
+ keys.forEach((key) => {
2200
+ this.remove(key);
2201
+ });
2202
+ }
2203
+ getToolKeys() {
2204
+ return JSON.parse(localStorage.getItem(this.TOOLS_KEY) ?? '[]');
2205
+ }
2206
+ addToolKey(key) {
2207
+ const currentKeys = this.getToolKeys();
2208
+ if (currentKeys.includes(key)) {
2209
+ return;
2210
+ }
2211
+ currentKeys.push(key);
2212
+ localStorage.setItem(this.TOOLS_KEY, JSON.stringify(currentKeys));
2213
+ }
2214
+ removeToolKey(key) {
2215
+ const currentKeys = this.getToolKeys();
2216
+ const index = currentKeys.indexOf(key);
2217
+ if (index !== -1) {
2218
+ currentKeys.splice(index, 1);
2219
+ }
2220
+ localStorage.setItem(this.TOOLS_KEY, JSON.stringify(currentKeys));
2221
+ }
2222
+ getToolKey(key) {
2223
+ return key.includes(this.PREFIX) ? key : this.PREFIX + key;
2224
+ }
2225
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: DevToolsStorageService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
2226
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: DevToolsStorageService, providedIn: 'root' }); }
2227
+ }
2228
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: DevToolsStorageService, decorators: [{
2229
+ type: Injectable,
2230
+ args: [{ providedIn: 'root' }]
2231
+ }] });
2232
+
2233
+ /**
2234
+ * Internal service for managing app features state and forced overrides.
2235
+ *
2236
+ * This service handles:
2237
+ * - Feature configuration storage
2238
+ * - Forced feature state management
2239
+ * - localStorage persistence
2240
+ * - State validation and cleanup
2241
+ *
2242
+ * @internal This service is for internal toolbar use only. Consumers should use DevToolbarAppFeaturesService.
2243
+ */
2244
+ class DevToolbarInternalAppFeaturesService {
2245
+ constructor() {
2246
+ this.STORAGE_KEY = 'app-features';
2247
+ this.storageService = inject(DevToolsStorageService);
2248
+ this.appFeaturesSubject = new BehaviorSubject([]);
2249
+ this.forcedFeaturesSubject = new BehaviorSubject({
2250
+ enabled: [],
2251
+ disabled: [],
2252
+ });
2253
+ this.forcedFeatures$ = this.forcedFeaturesSubject.asObservable();
2254
+ /**
2255
+ * Observable stream of all features with merged forced state
2256
+ */
2257
+ this.features$ = combineLatest([
2258
+ this.appFeaturesSubject.asObservable(),
2259
+ this.forcedFeatures$,
2260
+ ]).pipe(map(([appFeatures, forcedState]) => this.mergeForcedState(appFeatures, forcedState)));
2261
+ /**
2262
+ * Signal containing current features with merged forced state
2263
+ */
2264
+ this.features = toSignal(this.features$, { initialValue: [] });
2265
+ this.loadForcedFeatures();
2266
+ }
2267
+ /**
2268
+ * Set available app features for the application.
2269
+ * Validates features, trims whitespace, and triggers validation of forced state.
2270
+ *
2271
+ * @param features - Array of app features to configure
2272
+ * @throws Error if duplicate feature IDs or empty IDs are detected
2273
+ */
2274
+ setAppFeatures(features) {
2275
+ // Validate for empty IDs
2276
+ const emptyIdFeature = features.find((f) => !f.id || f.id.trim() === '');
2277
+ if (emptyIdFeature) {
2278
+ throw new Error('Feature ID cannot be empty');
2279
+ }
2280
+ // Validate for duplicate IDs
2281
+ const ids = features.map((f) => f.id);
2282
+ const duplicateIds = ids.filter((id, index) => ids.indexOf(id) !== index);
2283
+ if (duplicateIds.length > 0) {
2284
+ throw new Error(`Duplicate feature IDs detected: ${duplicateIds.join(', ')}`);
2285
+ }
2286
+ // Trim whitespace from names and warn about empty names
2287
+ const processedFeatures = features.map((feature) => {
2288
+ const trimmedName = feature.name.trim();
2289
+ if (!trimmedName) {
2290
+ console.warn(`Feature '${feature.id}' has empty name`);
2291
+ }
2292
+ return {
2293
+ ...feature,
2294
+ name: trimmedName || feature.name,
2295
+ };
2296
+ });
2297
+ this.appFeaturesSubject.next(processedFeatures);
2298
+ this.validateAndCleanForcedState();
2299
+ }
2300
+ /**
2301
+ * Get observable stream of app features (natural state, no forced state merged)
2302
+ */
2303
+ getAppFeatures() {
2304
+ return this.appFeaturesSubject.asObservable();
2305
+ }
2306
+ /**
2307
+ * Get observable stream of features that have forced overrides
2308
+ */
2309
+ getForcedFeatures() {
2310
+ return this.features$.pipe(map((features) => features.filter((feature) => feature.isForced)));
2311
+ }
2312
+ /**
2313
+ * Force a feature to enabled or disabled state.
2314
+ * Persists the forced state to localStorage.
2315
+ *
2316
+ * @param featureId - ID of the feature to force
2317
+ * @param isEnabled - Whether to force feature to enabled (true) or disabled (false)
2318
+ */
2319
+ setFeature(featureId, isEnabled) {
2320
+ const { enabled, disabled } = this.forcedFeaturesSubject.value;
2321
+ // Remove feature from both arrays
2322
+ const newEnabled = enabled.filter((id) => id !== featureId);
2323
+ const newDisabled = disabled.filter((id) => id !== featureId);
2324
+ // Add to appropriate array
2325
+ if (isEnabled) {
2326
+ newEnabled.push(featureId);
2327
+ }
2328
+ else {
2329
+ newDisabled.push(featureId);
2330
+ }
2331
+ const newState = { enabled: newEnabled, disabled: newDisabled };
2332
+ this.forcedFeaturesSubject.next(newState);
2333
+ this.saveForcedFeatures(newState);
2334
+ }
2335
+ /**
2336
+ * Remove forced override for a feature, returning it to natural state.
2337
+ * Persists the change to localStorage.
2338
+ *
2339
+ * @param featureId - ID of the feature to unforce
2340
+ */
2341
+ removeFeatureOverride(featureId) {
2342
+ const { enabled, disabled } = this.forcedFeaturesSubject.value;
2343
+ const newState = {
2344
+ enabled: enabled.filter((id) => id !== featureId),
2345
+ disabled: disabled.filter((id) => id !== featureId),
2346
+ };
2347
+ this.forcedFeaturesSubject.next(newState);
2348
+ this.saveForcedFeatures(newState);
2349
+ }
2350
+ /**
2351
+ * Apply a preset forced state (for preset integration).
2352
+ * Validates and cleans invalid feature IDs before applying.
2353
+ *
2354
+ * @param state - Forced features state from preset
2355
+ */
2356
+ applyForcedState(state) {
2357
+ const configuredFeatureIds = this.appFeaturesSubject.value.map((f) => f.id);
2358
+ // Validate and filter to only valid IDs
2359
+ const validEnabled = state.enabled.filter((id) => configuredFeatureIds.includes(id));
2360
+ const validDisabled = state.disabled.filter((id) => configuredFeatureIds.includes(id));
2361
+ const invalidIds = [
2362
+ ...state.enabled.filter((id) => !configuredFeatureIds.includes(id)),
2363
+ ...state.disabled.filter((id) => !configuredFeatureIds.includes(id)),
2364
+ ];
2365
+ if (invalidIds.length > 0) {
2366
+ console.warn(`Preset contains invalid feature IDs (ignored): ${invalidIds.join(', ')}`);
2367
+ }
2368
+ const cleanedState = { enabled: validEnabled, disabled: validDisabled };
2369
+ this.forcedFeaturesSubject.next(cleanedState);
2370
+ this.saveForcedFeatures(cleanedState);
2371
+ }
2372
+ /**
2373
+ * Get current forced state as a snapshot (defensive copy).
2374
+ * Useful for preset exports and debugging.
2375
+ *
2376
+ * @returns Current forced features state
2377
+ */
2378
+ getCurrentForcedState() {
2379
+ const state = this.forcedFeaturesSubject.value;
2380
+ return {
2381
+ enabled: [...state.enabled],
2382
+ disabled: [...state.disabled],
2383
+ };
2384
+ }
2385
+ /**
2386
+ * Merge natural app features with forced state.
2387
+ *
2388
+ * @param appFeatures - Natural feature configuration
2389
+ * @param forcedState - Forced overrides from localStorage/toolbar
2390
+ * @returns Features with merged forced state
2391
+ */
2392
+ mergeForcedState(appFeatures, forcedState) {
2393
+ return appFeatures.map((feature) => {
2394
+ const isInEnabled = forcedState.enabled.includes(feature.id);
2395
+ const isInDisabled = forcedState.disabled.includes(feature.id);
2396
+ const isForced = isInEnabled || isInDisabled;
2397
+ return {
2398
+ ...feature,
2399
+ isEnabled: isInEnabled ? true : isInDisabled ? false : feature.isEnabled,
2400
+ isForced,
2401
+ };
2402
+ });
2403
+ }
2404
+ /**
2405
+ * Load forced features state from localStorage on initialization.
2406
+ * Handles missing or corrupted data gracefully.
2407
+ */
2408
+ loadForcedFeatures() {
2409
+ try {
2410
+ const savedState = this.storageService.get(this.STORAGE_KEY);
2411
+ if (savedState) {
2412
+ this.forcedFeaturesSubject.next(savedState);
2413
+ }
2414
+ }
2415
+ catch (error) {
2416
+ console.error('Failed to load forced app features from localStorage:', error);
2417
+ // Use default empty state on error
2418
+ }
2419
+ }
2420
+ /**
2421
+ * Persist forced features state to localStorage.
2422
+ * Handles quota exceeded errors gracefully.
2423
+ *
2424
+ * @param state - Forced state to persist
2425
+ */
2426
+ saveForcedFeatures(state) {
2427
+ try {
2428
+ this.storageService.set(this.STORAGE_KEY, state);
2429
+ }
2430
+ catch (error) {
2431
+ console.error('Failed to persist app features to localStorage:', error);
2432
+ // Continue execution - state is still valid in memory for current session
2433
+ }
2434
+ }
2435
+ /**
2436
+ * Validate forced feature IDs against configured features and clean up invalid ones.
2437
+ * Called after setAppFeatures() to ensure forced state references valid features.
2438
+ */
2439
+ validateAndCleanForcedState() {
2440
+ const configuredFeatureIds = this.appFeaturesSubject.value.map((f) => f.id);
2441
+ const currentForcedState = this.forcedFeaturesSubject.value;
2442
+ const validEnabled = currentForcedState.enabled.filter((id) => configuredFeatureIds.includes(id));
2443
+ const validDisabled = currentForcedState.disabled.filter((id) => configuredFeatureIds.includes(id));
2444
+ const removedIds = [
2445
+ ...currentForcedState.enabled.filter((id) => !configuredFeatureIds.includes(id)),
2446
+ ...currentForcedState.disabled.filter((id) => !configuredFeatureIds.includes(id)),
2447
+ ];
2448
+ if (removedIds.length > 0) {
2449
+ console.warn(`Removed invalid feature IDs from forced state: ${removedIds.join(', ')}`);
2450
+ const cleanedState = { enabled: validEnabled, disabled: validDisabled };
2451
+ this.forcedFeaturesSubject.next(cleanedState);
2452
+ this.saveForcedFeatures(cleanedState);
2453
+ }
2454
+ }
2455
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: DevToolbarInternalAppFeaturesService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
2456
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: DevToolbarInternalAppFeaturesService, providedIn: 'root' }); }
2457
+ }
2458
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: DevToolbarInternalAppFeaturesService, decorators: [{
2459
+ type: Injectable,
2460
+ args: [{ providedIn: 'root' }]
2461
+ }], ctorParameters: () => [] });
2462
+
2463
+ /**
2464
+ * Component for managing app features in the dev toolbar.
2465
+ *
2466
+ * Provides UI for:
2467
+ * - Searching features by name and description
2468
+ * - Filtering features by state (all/forced/enabled/disabled)
2469
+ * - Forcing features to enabled/disabled state via 3-state dropdown
2470
+ * - Viewing feature descriptions and current state
2471
+ *
2472
+ * @example
2473
+ * ```html
2474
+ * <ndt-app-features-tool />
2475
+ * ```
2476
+ */
2477
+ class DevToolbarAppFeaturesToolComponent {
2478
+ constructor() {
2479
+ // Injects
2480
+ this.appFeaturesService = inject(DevToolbarInternalAppFeaturesService);
2481
+ // Signals
2482
+ this.activeFilter = signal('all');
2483
+ this.searchQuery = signal('');
2484
+ this.features = this.appFeaturesService.features;
2485
+ this.hasNoFeatures = computed(() => this.features().length === 0);
2486
+ this.filteredFeatures = computed(() => {
2487
+ return this.features().filter((feature) => {
2488
+ const searchTerm = this.searchQuery().toLowerCase();
2489
+ const featureName = feature.name.toLowerCase();
2490
+ const featureDescription = feature.description?.toLowerCase() ?? '';
2491
+ const matchesSearch = !this.searchQuery() ||
2492
+ featureName.includes(searchTerm) ||
2493
+ featureDescription.includes(searchTerm);
2494
+ const matchesFilter = this.activeFilter() === 'all' ||
2495
+ (this.activeFilter() === 'forced' && feature.isForced) ||
2496
+ (this.activeFilter() === 'enabled' && feature.isEnabled) ||
2497
+ (this.activeFilter() === 'disabled' && !feature.isEnabled);
2498
+ return matchesSearch && matchesFilter;
2499
+ });
2500
+ });
2501
+ this.hasNoFilteredFeatures = computed(() => this.filteredFeatures().length === 0);
2502
+ // Other properties
2503
+ this.options = {
2504
+ title: 'App Features',
2505
+ description: 'Override product features to test different tiers and configurations',
2506
+ isClosable: true,
2507
+ size: 'tall',
2508
+ id: 'ndt-app-features',
2509
+ };
2510
+ this.filterOptions = [
2511
+ { value: 'all', label: 'All Features' },
2512
+ { value: 'forced', label: 'Forced' },
2513
+ { value: 'enabled', label: 'Enabled' },
2514
+ { value: 'disabled', label: 'Disabled' },
2515
+ ];
2516
+ this.featureValueOptions = [
2517
+ { value: '', label: 'Not Forced' },
2518
+ { value: 'off', label: 'Disabled' },
2519
+ { value: 'on', label: 'Enabled' },
2520
+ ];
2521
+ }
2522
+ // Public methods
2523
+ /**
2524
+ * Handle filter dropdown change.
2525
+ * Updates the active filter to show all/forced/enabled/disabled features.
2526
+ */
2527
+ onFilterChange(value) {
2528
+ const filter = this.filterOptions.find((f) => f.value === value);
2529
+ if (filter) {
2530
+ this.activeFilter.set(filter.value);
2531
+ }
2532
+ }
2533
+ /**
2534
+ * Handle feature value change from 3-state dropdown.
2535
+ * - 'not-forced' (empty string): Remove forced override
2536
+ * - 'on': Force feature to enabled
2537
+ * - 'off': Force feature to disabled
2538
+ */
2539
+ onFeatureChange(featureId, value) {
2540
+ switch (value) {
2541
+ case '':
2542
+ this.appFeaturesService.removeFeatureOverride(featureId);
2543
+ break;
2544
+ case 'on':
2545
+ this.appFeaturesService.setFeature(featureId, true);
2546
+ break;
2547
+ case 'off':
2548
+ this.appFeaturesService.setFeature(featureId, false);
2549
+ break;
2550
+ }
2551
+ }
2552
+ /**
2553
+ * Handle search input change.
2554
+ * Updates the search query to filter features by name/description.
2555
+ */
2556
+ onSearchChange(query) {
2557
+ this.searchQuery.set(query);
2558
+ }
2559
+ // Protected methods
2560
+ /**
2561
+ * Get the dropdown value for a feature's current state.
2562
+ * - Returns empty string if not forced (natural state)
2563
+ * - Returns 'on' if forced to enabled
2564
+ * - Returns 'off' if forced to disabled
2565
+ */
2566
+ getFeatureValue(feature) {
2567
+ if (!feature.isForced)
2568
+ return '';
2569
+ return feature.isEnabled ? 'on' : 'off';
2570
+ }
2571
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: DevToolbarAppFeaturesToolComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2572
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.5", type: DevToolbarAppFeaturesToolComponent, isStandalone: true, selector: "ndt-app-features-tool", ngImport: i0, template: `
2573
+ <ndt-toolbar-tool
2574
+ [options]="options"
2575
+ title="App Features"
2576
+ icon="puzzle"
2577
+ >
2578
+ <div class="container">
2579
+ <div class="header">
2580
+ <ndt-input
2581
+ [value]="searchQuery()"
2582
+ (valueChange)="onSearchChange($event)"
2583
+ placeholder="Search features..."
2584
+ />
2585
+ <div class="filter-wrapper">
2586
+ <ndt-icon name="filter" class="filter-icon" />
2587
+ <ndt-select
2588
+ [value]="activeFilter()"
2589
+ [options]="filterOptions"
2590
+ [size]="'medium'"
2591
+ (valueChange)="onFilterChange($event)"
2592
+ />
2593
+ </div>
2594
+ </div>
2595
+
2596
+ @if (hasNoFeatures()) {
2597
+ <div class="empty">
2598
+ <p>No app features found</p>
2599
+ <small>Call setAvailableOptions() to configure features</small>
2600
+ </div>
2601
+ } @else if (hasNoFilteredFeatures()) {
2602
+ <div class="empty">
2603
+ <p>No features match your filter</p>
2604
+ </div>
2605
+ } @else {
2606
+ <div class="feature-list">
2607
+ @for (feature of filteredFeatures(); track feature.id) {
2608
+ <div class="feature">
2609
+ <div class="info">
2610
+ <h3>{{ feature.name }}</h3>
2611
+ @if (feature.description) {
2612
+ <p>{{ feature.description }}</p>
2613
+ }
2614
+ </div>
2615
+
2616
+ <ndt-select
2617
+ [value]="getFeatureValue(feature)"
2618
+ [options]="featureValueOptions"
2619
+ [ariaLabel]="'Set value for ' + feature.name"
2620
+ (valueChange)="onFeatureChange(feature.id, $event ?? '')"
2621
+ size="small"
2622
+ />
2623
+ </div>
2624
+ }
2625
+ </div>
2626
+ }
2627
+ </div>
2628
+ </ndt-toolbar-tool>
2629
+ `, isInline: true, styles: [".container{display:flex;flex-direction:column;height:100%}.header{flex-shrink:0;display:flex;gap:var(--ndt-spacing-sm);margin-bottom:var(--ndt-spacing-md)}.header ndt-input{flex:.65}.header .filter-wrapper{flex:.35;display:flex;align-items:center;gap:var(--ndt-spacing-xs)}.header .filter-wrapper .filter-icon{width:18px;height:18px;flex-shrink:0;opacity:.6}.header .filter-wrapper ndt-select{flex:1}.empty{display:flex;flex-direction:column;gap:var(--ndt-spacing-md);flex:1;min-height:0;justify-content:center;align-items:center;border:1px solid var(--ndt-warning-border);border-radius:var(--ndt-border-radius-medium);padding:var(--ndt-spacing-md);background:var(--ndt-warning-background);color:var(--ndt-text-muted)}.empty p{margin:0;font-size:var(--ndt-font-size-md)}.empty small{font-size:var(--ndt-font-size-xs);opacity:.8}.feature-list{display:flex;flex-direction:column;gap:var(--ndt-spacing-md);flex:1;min-height:0;overflow-y:auto;padding-right:var(--ndt-spacing-sm);scrollbar-width:thin;scrollbar-color:var(--ndt-border-primary) var(--ndt-background-secondary)}.feature-list::-webkit-scrollbar{width:8px}.feature-list::-webkit-scrollbar-track{background:var(--ndt-background-secondary);border-radius:4px}.feature-list::-webkit-scrollbar-thumb{background:var(--ndt-border-primary);border-radius:4px}:is():hover{background:var(--ndt-hover-bg)}.feature{display:flex;flex-direction:row;gap:var(--ndt-spacing-sm);background:var(--ndt-background-secondary);padding:var(--ndt-spacing-md);border-radius:var(--ndt-border-radius-medium)}.feature .info{flex:0 0 65%}.feature .info h3{margin:0;font-size:var(--ndt-font-size-md);color:var(--ndt-text-primary)}.feature .info p{margin:var(--ndt-spacing-xs) 0 0 0;font-size:var(--ndt-font-size-xs);color:var(--ndt-text-muted)}.feature ndt-select{flex:0 0 35%}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "component", type: DevToolbarToolComponent, selector: "ndt-toolbar-tool", inputs: ["options", "icon", "title"] }, { kind: "component", type: DevToolbarInputComponent, selector: "ndt-input", inputs: ["value", "type", "placeholder", "ariaLabel", "inputClass"], outputs: ["valueChange"] }, { kind: "component", type: DevToolbarSelectComponent, selector: "ndt-select", inputs: ["value", "options", "ariaLabel", "label", "size"], outputs: ["valueChange"] }, { kind: "component", type: DevToolbarIconComponent, selector: "ndt-icon", inputs: ["name"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
2630
+ }
2631
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: DevToolbarAppFeaturesToolComponent, decorators: [{
2632
+ type: Component,
2633
+ args: [{ selector: 'ndt-app-features-tool', standalone: true, imports: [
2634
+ FormsModule,
2635
+ DevToolbarToolComponent,
2636
+ DevToolbarInputComponent,
2637
+ DevToolbarSelectComponent,
2638
+ DevToolbarIconComponent,
2639
+ ], template: `
2640
+ <ndt-toolbar-tool
2641
+ [options]="options"
2642
+ title="App Features"
2643
+ icon="puzzle"
2644
+ >
2645
+ <div class="container">
2646
+ <div class="header">
2647
+ <ndt-input
2648
+ [value]="searchQuery()"
2649
+ (valueChange)="onSearchChange($event)"
2650
+ placeholder="Search features..."
2651
+ />
2652
+ <div class="filter-wrapper">
2653
+ <ndt-icon name="filter" class="filter-icon" />
2654
+ <ndt-select
2655
+ [value]="activeFilter()"
2656
+ [options]="filterOptions"
2657
+ [size]="'medium'"
2658
+ (valueChange)="onFilterChange($event)"
2659
+ />
2660
+ </div>
2661
+ </div>
2662
+
2663
+ @if (hasNoFeatures()) {
2664
+ <div class="empty">
2665
+ <p>No app features found</p>
2666
+ <small>Call setAvailableOptions() to configure features</small>
2667
+ </div>
2668
+ } @else if (hasNoFilteredFeatures()) {
2669
+ <div class="empty">
2670
+ <p>No features match your filter</p>
2671
+ </div>
2672
+ } @else {
2673
+ <div class="feature-list">
2674
+ @for (feature of filteredFeatures(); track feature.id) {
2675
+ <div class="feature">
2676
+ <div class="info">
2677
+ <h3>{{ feature.name }}</h3>
2678
+ @if (feature.description) {
2679
+ <p>{{ feature.description }}</p>
2680
+ }
2681
+ </div>
2682
+
2683
+ <ndt-select
2684
+ [value]="getFeatureValue(feature)"
2685
+ [options]="featureValueOptions"
2686
+ [ariaLabel]="'Set value for ' + feature.name"
2687
+ (valueChange)="onFeatureChange(feature.id, $event ?? '')"
2688
+ size="small"
2689
+ />
2690
+ </div>
2691
+ }
2692
+ </div>
2693
+ }
2694
+ </div>
2695
+ </ndt-toolbar-tool>
2696
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".container{display:flex;flex-direction:column;height:100%}.header{flex-shrink:0;display:flex;gap:var(--ndt-spacing-sm);margin-bottom:var(--ndt-spacing-md)}.header ndt-input{flex:.65}.header .filter-wrapper{flex:.35;display:flex;align-items:center;gap:var(--ndt-spacing-xs)}.header .filter-wrapper .filter-icon{width:18px;height:18px;flex-shrink:0;opacity:.6}.header .filter-wrapper ndt-select{flex:1}.empty{display:flex;flex-direction:column;gap:var(--ndt-spacing-md);flex:1;min-height:0;justify-content:center;align-items:center;border:1px solid var(--ndt-warning-border);border-radius:var(--ndt-border-radius-medium);padding:var(--ndt-spacing-md);background:var(--ndt-warning-background);color:var(--ndt-text-muted)}.empty p{margin:0;font-size:var(--ndt-font-size-md)}.empty small{font-size:var(--ndt-font-size-xs);opacity:.8}.feature-list{display:flex;flex-direction:column;gap:var(--ndt-spacing-md);flex:1;min-height:0;overflow-y:auto;padding-right:var(--ndt-spacing-sm);scrollbar-width:thin;scrollbar-color:var(--ndt-border-primary) var(--ndt-background-secondary)}.feature-list::-webkit-scrollbar{width:8px}.feature-list::-webkit-scrollbar-track{background:var(--ndt-background-secondary);border-radius:4px}.feature-list::-webkit-scrollbar-thumb{background:var(--ndt-border-primary);border-radius:4px}:is():hover{background:var(--ndt-hover-bg)}.feature{display:flex;flex-direction:row;gap:var(--ndt-spacing-sm);background:var(--ndt-background-secondary);padding:var(--ndt-spacing-md);border-radius:var(--ndt-border-radius-medium)}.feature .info{flex:0 0 65%}.feature .info h3{margin:0;font-size:var(--ndt-font-size-md);color:var(--ndt-text-primary)}.feature .info p{margin:var(--ndt-spacing-xs) 0 0 0;font-size:var(--ndt-font-size-xs);color:var(--ndt-text-muted)}.feature ndt-select{flex:0 0 35%}\n"] }]
2697
+ }] });
2698
+
2699
+ class DevToolbarInternalFeatureFlagService {
2700
+ constructor() {
2701
+ this.STORAGE_KEY = 'feature-flags';
2702
+ this.storageService = inject(DevToolsStorageService);
2703
+ this.appFlags$ = new BehaviorSubject([]);
2704
+ this.forcedFlagsSubject = new BehaviorSubject({
2705
+ enabled: [],
2706
+ disabled: [],
2707
+ });
2708
+ this.forcedFlags$ = this.forcedFlagsSubject.asObservable();
2709
+ this.flags$ = combineLatest([
2710
+ this.appFlags$,
2711
+ this.forcedFlags$,
2712
+ ]).pipe(map(([appFlags, { enabled, disabled }]) => {
2713
+ return appFlags.map((flag) => ({
2714
+ ...flag,
2715
+ isForced: enabled.includes(flag.id) || disabled.includes(flag.id),
2716
+ isEnabled: enabled.includes(flag.id),
2717
+ }));
2718
+ }));
2719
+ this.flags = toSignal(this.flags$, { initialValue: [] });
2720
+ this.loadForcedFlags();
2721
+ }
2722
+ setAppFlags(flags) {
2723
+ this.appFlags$.next(flags);
2724
+ }
2725
+ getAppFlags() {
2726
+ return this.appFlags$.asObservable();
2727
+ }
2728
+ getForcedFlags() {
2729
+ return this.flags$.pipe(map((flags) => flags.filter((flag) => flag.isForced)));
2730
+ }
2731
+ setFlag(flagId, isEnabled) {
2732
+ const { enabled, disabled } = this.forcedFlagsSubject.value;
2733
+ const newEnabled = enabled.filter((id) => id !== flagId);
2734
+ const newDisabled = disabled.filter((id) => id !== flagId);
2735
+ if (isEnabled) {
2736
+ newEnabled.push(flagId);
2737
+ }
2738
+ else {
2739
+ newDisabled.push(flagId);
2740
+ }
2741
+ const newState = { enabled: newEnabled, disabled: newDisabled };
2742
+ this.forcedFlagsSubject.next(newState);
2743
+ this.storageService.set(this.STORAGE_KEY, newState);
2744
+ }
2745
+ removeFlagOverride(flagId) {
2746
+ const { enabled, disabled } = this.forcedFlagsSubject.value;
2747
+ const newState = {
2748
+ enabled: enabled.filter((id) => id !== flagId),
2749
+ disabled: disabled.filter((id) => id !== flagId),
2750
+ };
2751
+ this.forcedFlagsSubject.next(newState);
2752
+ this.storageService.set(this.STORAGE_KEY, newState);
2753
+ }
2754
+ loadForcedFlags() {
2755
+ const savedFlags = this.storageService.get(this.STORAGE_KEY);
2756
+ if (savedFlags) {
2757
+ this.forcedFlagsSubject.next(savedFlags);
2758
+ }
2759
+ }
2760
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: DevToolbarInternalFeatureFlagService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
2761
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: DevToolbarInternalFeatureFlagService, providedIn: 'root' }); }
2762
+ }
2763
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: DevToolbarInternalFeatureFlagService, decorators: [{
2764
+ type: Injectable,
2765
+ args: [{ providedIn: 'root' }]
2766
+ }], ctorParameters: () => [] });
2767
+
2768
+ class DevToolbarFeatureFlagsToolComponent {
2769
+ constructor() {
2770
+ // Injects
2771
+ this.featureFlags = inject(DevToolbarInternalFeatureFlagService);
2772
+ // Signals
2773
+ this.activeFilter = signal('all');
2774
+ this.searchQuery = signal('');
2775
+ this.flags = this.featureFlags.flags;
2776
+ this.hasNoFlags = computed(() => this.flags().length === 0);
2777
+ this.filteredFlags = computed(() => {
2778
+ return this.flags().filter((flag) => {
2779
+ const searchTerm = this.searchQuery().toLowerCase();
2780
+ const flagName = flag.name.toLowerCase();
2781
+ const flagDescription = flag.description?.toLowerCase() ?? '';
2782
+ const matchesSearch = !this.searchQuery() ||
2783
+ flagName.toLowerCase().includes(searchTerm.toLowerCase()) ||
2784
+ flagDescription.toLowerCase().includes(searchTerm.toLowerCase());
2785
+ const matchesFilter = this.activeFilter() === 'all' ||
2786
+ (this.activeFilter() === 'forced' && flag.isForced) ||
2787
+ (this.activeFilter() === 'enabled' && flag.isEnabled) ||
2788
+ (this.activeFilter() === 'disabled' && !flag.isEnabled);
2789
+ return matchesSearch && matchesFilter;
2790
+ });
2791
+ });
2792
+ this.hasNoFilteredFlags = computed(() => this.filteredFlags().length === 0);
2793
+ // Other properties
2794
+ this.options = {
2795
+ title: 'Feature Flags',
2796
+ description: 'Manage the feature flags for your current session',
2797
+ isClosable: true,
2798
+ size: 'tall',
2799
+ id: 'ndt-feature-flags',
2800
+ isBeta: true,
2801
+ };
2802
+ this.filterOptions = [
2803
+ { value: 'all', label: 'All Flags' },
2804
+ { value: 'forced', label: 'Forced' },
2805
+ { value: 'enabled', label: 'Enabled' },
2806
+ { value: 'disabled', label: 'Disabled' },
2807
+ ];
2808
+ this.flagValueOptions = [
2809
+ { value: 'not-forced', label: 'Not Forced' },
2810
+ { value: 'off', label: 'Forced Off' },
2811
+ { value: 'on', label: 'Forced On' },
2812
+ ];
2813
+ }
2814
+ // Public methods
2815
+ onFilterChange(value) {
2816
+ const filter = this.filterOptions.find((f) => f.value === value);
2817
+ if (filter) {
2818
+ this.activeFilter.set(filter.value);
2819
+ }
2820
+ }
2821
+ onFlagChange(flagId, value) {
2822
+ switch (value) {
2823
+ case 'not-forced':
2824
+ this.featureFlags.removeFlagOverride(flagId);
2825
+ break;
2826
+ case 'on':
2827
+ this.featureFlags.setFlag(flagId, true);
2828
+ break;
2829
+ case 'off':
2830
+ this.featureFlags.setFlag(flagId, false);
2831
+ break;
2832
+ }
2833
+ }
2834
+ onSearchChange(query) {
2835
+ this.searchQuery.set(query);
2836
+ }
2837
+ // Protected methods
2838
+ getFlagValue(flag) {
2839
+ if (!flag.isForced)
2840
+ return '';
2841
+ return flag.isEnabled ? 'on' : 'off';
2842
+ }
2843
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: DevToolbarFeatureFlagsToolComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2844
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.5", type: DevToolbarFeatureFlagsToolComponent, isStandalone: true, selector: "ndt-feature-flags-tool", ngImport: i0, template: `
2845
+ <ndt-toolbar-tool
2846
+ [options]="options"
2847
+ title="Feature Flags"
2848
+ icon="toggle-left"
2849
+ >
2850
+ <div class="container">
2851
+ <div class="header">
2852
+ <ndt-input
2853
+ [value]="searchQuery()"
2854
+ (valueChange)="onSearchChange($event)"
2855
+ placeholder="Search..."
2856
+ />
2857
+ <div class="filter-wrapper">
2858
+ <ndt-icon name="filter" class="filter-icon" />
2859
+ <ndt-select
2860
+ [value]="activeFilter()"
2861
+ [options]="filterOptions"
2862
+ [size]="'medium'"
2863
+ (valueChange)="onFilterChange($event)"
2864
+ />
2865
+ </div>
2866
+ </div>
2867
+
2868
+ @if (hasNoFlags()) {
2869
+ <div class="empty">
2870
+ <p>No flags found</p>
2871
+ </div>
2872
+ } @else if (hasNoFilteredFlags()) {
2873
+ <div class="empty">
2874
+ <p>No flags found matching your filter</p>
2875
+ </div>
2876
+ } @else {
2877
+ <div class="flag-list">
2878
+ @for (flag of filteredFlags(); track flag.id) {
2879
+ <div class="flag">
2880
+ <div class="info">
2881
+ <h3>{{ flag.name }}</h3>
2882
+ <p>{{ flag?.description }}</p>
2883
+ </div>
2884
+
2885
+ <ndt-select
2886
+ [value]="getFlagValue(flag)"
2887
+ [options]="flagValueOptions"
2888
+ [ariaLabel]="'Set value for ' + flag.name"
2889
+ (valueChange)="onFlagChange(flag.id, $event ?? '')"
2890
+ size="small"
2891
+ />
2892
+ </div>
2893
+ }
2894
+ </div>
2895
+ }
2896
+ </div>
2897
+ </ndt-toolbar-tool>
2898
+ `, isInline: true, styles: [".container{display:flex;flex-direction:column;height:100%}.header{flex-shrink:0;display:flex;gap:var(--ndt-spacing-sm);margin-bottom:var(--ndt-spacing-md)}.header ndt-input{flex:.65}.header .filter-wrapper{flex:.35;display:flex;align-items:center;gap:var(--ndt-spacing-xs)}.header .filter-wrapper .filter-icon{width:18px;height:18px;flex-shrink:0;opacity:.6}.header .filter-wrapper ndt-select{flex:1}.empty{display:flex;flex-direction:column;gap:var(--ndt-spacing-md);flex:1;min-height:0;justify-content:center;align-items:center;border:1px solid var(--ndt-warning-border);border-radius:var(--ndt-border-radius-medium);padding:var(--ndt-spacing-md);background:var(--ndt-warning-background);color:var(--ndt-text-muted)}.flag-list{display:flex;flex-direction:column;gap:var(--ndt-spacing-md);flex:1;min-height:0;overflow-y:auto;padding-right:var(--ndt-spacing-sm);scrollbar-width:thin;scrollbar-color:var(--ndt-border-primary) var(--ndt-background-secondary)}.flag-list::-webkit-scrollbar{width:8px}.flag-list::-webkit-scrollbar-track{background:var(--ndt-background-secondary);border-radius:4px}.flag-list::-webkit-scrollbar-thumb{background:var(--ndt-border-primary);border-radius:4px}:is():hover{background:var(--ndt-hover-bg)}.flag{display:flex;flex-direction:row;gap:var(--ndt-spacing-sm);background:var(--ndt-background-secondary)}.flag .info{flex:0 0 65%}.flag .info h3{margin:0;font-size:var(--ndt-font-size-md);color:var(--ndt-text-primary)}.flag .info p{font-size:var(--ndt-font-size-xs);color:var(--ndt-text-muted)}.flag ndt-select{flex:0 0 35%}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "component", type: DevToolbarToolComponent, selector: "ndt-toolbar-tool", inputs: ["options", "icon", "title"] }, { kind: "component", type: DevToolbarInputComponent, selector: "ndt-input", inputs: ["value", "type", "placeholder", "ariaLabel", "inputClass"], outputs: ["valueChange"] }, { kind: "component", type: DevToolbarSelectComponent, selector: "ndt-select", inputs: ["value", "options", "ariaLabel", "label", "size"], outputs: ["valueChange"] }, { kind: "component", type: DevToolbarIconComponent, selector: "ndt-icon", inputs: ["name"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
2899
+ }
2900
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: DevToolbarFeatureFlagsToolComponent, decorators: [{
2901
+ type: Component,
2902
+ args: [{ selector: 'ndt-feature-flags-tool', standalone: true, imports: [
2903
+ FormsModule,
2904
+ DevToolbarToolComponent,
2905
+ DevToolbarInputComponent,
2906
+ DevToolbarSelectComponent,
2907
+ DevToolbarIconComponent,
2908
+ ], template: `
2909
+ <ndt-toolbar-tool
2910
+ [options]="options"
2911
+ title="Feature Flags"
2912
+ icon="toggle-left"
2913
+ >
2914
+ <div class="container">
2915
+ <div class="header">
2916
+ <ndt-input
2917
+ [value]="searchQuery()"
2918
+ (valueChange)="onSearchChange($event)"
2919
+ placeholder="Search..."
2920
+ />
2921
+ <div class="filter-wrapper">
2922
+ <ndt-icon name="filter" class="filter-icon" />
2923
+ <ndt-select
2924
+ [value]="activeFilter()"
2925
+ [options]="filterOptions"
2926
+ [size]="'medium'"
2927
+ (valueChange)="onFilterChange($event)"
2928
+ />
2929
+ </div>
2930
+ </div>
2931
+
2932
+ @if (hasNoFlags()) {
2933
+ <div class="empty">
2934
+ <p>No flags found</p>
2935
+ </div>
2936
+ } @else if (hasNoFilteredFlags()) {
2937
+ <div class="empty">
2938
+ <p>No flags found matching your filter</p>
2939
+ </div>
2940
+ } @else {
2941
+ <div class="flag-list">
2942
+ @for (flag of filteredFlags(); track flag.id) {
2943
+ <div class="flag">
2944
+ <div class="info">
2945
+ <h3>{{ flag.name }}</h3>
2946
+ <p>{{ flag?.description }}</p>
2947
+ </div>
2948
+
2949
+ <ndt-select
2950
+ [value]="getFlagValue(flag)"
2951
+ [options]="flagValueOptions"
2952
+ [ariaLabel]="'Set value for ' + flag.name"
2953
+ (valueChange)="onFlagChange(flag.id, $event ?? '')"
2954
+ size="small"
2955
+ />
2956
+ </div>
2957
+ }
2958
+ </div>
2959
+ }
2960
+ </div>
2961
+ </ndt-toolbar-tool>
2962
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".container{display:flex;flex-direction:column;height:100%}.header{flex-shrink:0;display:flex;gap:var(--ndt-spacing-sm);margin-bottom:var(--ndt-spacing-md)}.header ndt-input{flex:.65}.header .filter-wrapper{flex:.35;display:flex;align-items:center;gap:var(--ndt-spacing-xs)}.header .filter-wrapper .filter-icon{width:18px;height:18px;flex-shrink:0;opacity:.6}.header .filter-wrapper ndt-select{flex:1}.empty{display:flex;flex-direction:column;gap:var(--ndt-spacing-md);flex:1;min-height:0;justify-content:center;align-items:center;border:1px solid var(--ndt-warning-border);border-radius:var(--ndt-border-radius-medium);padding:var(--ndt-spacing-md);background:var(--ndt-warning-background);color:var(--ndt-text-muted)}.flag-list{display:flex;flex-direction:column;gap:var(--ndt-spacing-md);flex:1;min-height:0;overflow-y:auto;padding-right:var(--ndt-spacing-sm);scrollbar-width:thin;scrollbar-color:var(--ndt-border-primary) var(--ndt-background-secondary)}.flag-list::-webkit-scrollbar{width:8px}.flag-list::-webkit-scrollbar-track{background:var(--ndt-background-secondary);border-radius:4px}.flag-list::-webkit-scrollbar-thumb{background:var(--ndt-border-primary);border-radius:4px}:is():hover{background:var(--ndt-hover-bg)}.flag{display:flex;flex-direction:row;gap:var(--ndt-spacing-sm);background:var(--ndt-background-secondary)}.flag .info{flex:0 0 65%}.flag .info h3{margin:0;font-size:var(--ndt-font-size-md);color:var(--ndt-text-primary)}.flag .info p{font-size:var(--ndt-font-size-xs);color:var(--ndt-text-muted)}.flag ndt-select{flex:0 0 35%}\n"] }]
2963
+ }] });
2964
+
2965
+ class DevToolbarButtonComponent {
2966
+ constructor() {
2967
+ this.type = input('button');
2968
+ this.variant = input('default');
2969
+ this.icon = input();
2970
+ this.label = input();
2971
+ this.ariaLabel = input();
2972
+ this.isActive = input(false);
2973
+ }
2974
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: DevToolbarButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2975
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.5", type: DevToolbarButtonComponent, isStandalone: true, selector: "ndt-button", inputs: { type: { classPropertyName: "type", publicName: "type", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, isActive: { classPropertyName: "isActive", publicName: "isActive", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
2976
+ <button
2977
+ class="button"
2978
+ [attr.aria-label]="ariaLabel()"
2979
+ [type]="type()"
2980
+ [class.button--active]="isActive()"
2981
+ [class.button--icon]="variant() === 'icon'"
2982
+ >
2983
+ @if (icon()) {
2984
+ <ndt-icon [name]="icon() || 'star'" />
2985
+ }
2986
+ @if (label()) {
2987
+ <span class="button__label">{{ label() }}</span>
2988
+ }
2989
+ <ng-content />
2990
+ </button>
2991
+ `, isInline: true, styles: [".dev-toolbar{--ndt-border-radius-small: 4px;--ndt-border-radius-medium: 8px;--ndt-border-radius-large: 12px;--ndt-transition-default: all .2s ease-out;--ndt-transition-smooth: all .2s ease-in-out;--ndt-bg-primary: rgb(255, 255, 255);--ndt-bg-gradient: linear-gradient(180deg, rgb(243, 244, 246) 0%, rgba(243, 244, 246, .88) 100%);--ndt-text-primary: rgb(17, 24, 39);--ndt-text-secondary: rgb(55, 65, 81);--ndt-text-muted: rgb(107, 114, 128);--ndt-border-primary: #e5e7eb;--ndt-border-subtle: rgba(17, 24, 39, .1);--ndt-hover-bg: rgba(17, 24, 39, .05);--ndt-hover-danger: rgb(239, 68, 68);--ndt-shadow-toolbar: 0 2px 8px rgba(156, 163, 175, .2);--ndt-shadow-tooltip: 0 0 0 1px rgba(17, 24, 39, .05), 0 4px 8px rgba(107, 114, 128, .15), 0 2px 4px rgba(107, 114, 128, .1);--ndt-shadow-window: 0px 0px 0px 0px rgba(156, 163, 175, .1), 0px 1px 2px 0px rgba(156, 163, 175, .12), 0px 4px 4px 0px rgba(156, 163, 175, .1), 0px 10px 6px 0px rgba(156, 163, 175, .08), 0px 17px 7px 0px rgba(156, 163, 175, .05), 0px 26px 7px 0px rgba(156, 163, 175, .02);--ndt-spacing-xs: 4px;--ndt-spacing-sm: 8px;--ndt-spacing-md: 16px;--ndt-window-padding: 24px;--ndt-font-size-xs: .75rem;--ndt-font-size-sm: .875rem;--ndt-font-size-md: 1rem;--ndt-font-size-lg: 1.25rem;--ndt-font-size-xl: 2rem;--ndt-background-secondary: var(--ndt-bg-primary);--ndt-background-hover: var(--ndt-hover-bg);--ndt-primary: #df30d4;--ndt-primary-rgb: 223, 48, 212;--ndt-text-on-primary: rgb(255, 255, 255);--ndt-border-color: var(--ndt-border-primary);--ndt-note-background: rgb(219, 234, 254);--ndt-note-border: rgba(37, 99, 235, .2);--ndt-warning-background: rgb(254, 249, 195);--ndt-warning-border: rgba(202, 138, 4, .2);--ndt-error-background: rgb(254, 226, 226);--ndt-error-border: rgba(220, 38, 38, .2)}.dev-toolbar[data-theme=dark]{--ndt-bg-primary: rgb(17, 24, 39);--ndt-bg-gradient: linear-gradient(180deg, rgb(19, 21, 26) 0%, rgba(19, 21, 26, .88) 100%);--ndt-text-primary: rgb(255, 255, 255);--ndt-text-secondary: rgb(229, 231, 235);--ndt-text-muted: rgb(156, 163, 175);--ndt-border-primary: #343841;--ndt-border-subtle: rgba(255, 255, 255, .1);--ndt-hover-bg: rgba(255, 255, 255, .12);--ndt-hover-danger: rgb(220, 38, 38);--ndt-shadow-toolbar: 0 2px 8px rgba(19, 21, 26, .3);--ndt-shadow-tooltip: 0 0 0 1px rgba(255, 255, 255, .1), 0 4px 8px rgba(0, 0, 0, .4), 0 2px 4px rgba(0, 0, 0, .3);--ndt-shadow-window: 0px 0px 0px 0px rgba(19, 21, 26, .3), 0px 1px 2px 0px rgba(19, 21, 26, .29), 0px 4px 4px 0px rgba(19, 21, 26, .26), 0px 10px 6px 0px rgba(19, 21, 26, .15), 0px 17px 7px 0px rgba(19, 21, 26, .04), 0px 26px 7px 0px rgba(19, 21, 26, .01);--ndt-note-background: rgba(37, 99, 235, .15);--ndt-note-border: rgba(37, 99, 235, .3);--ndt-warning-background: rgba(202, 138, 4, .15);--ndt-warning-border: rgba(202, 138, 4, .3);--ndt-error-background: rgba(220, 38, 38, .15);--ndt-error-border: rgba(220, 38, 38, .3)}.dev-toolbar h1,.dev-toolbar h2,.dev-toolbar h3,.dev-toolbar h4,.dev-toolbar h5{font-weight:600;color:var(--ndt-text-primary);margin:0}.dev-toolbar h1{font-size:var(--ndt-font-size-xl)}.dev-toolbar h2{font-size:var(--ndt-font-size-lg)}.dev-toolbar h3{font-size:var(--ndt-font-size-md)}.dev-toolbar h4{font-size:var(--ndt-font-size-sm)}.dev-toolbar h5{font-size:var(--ndt-font-size-xs)}.dev-toolbar hr{border:1px solid var(--ndt-border-subtle);margin:1em 0}.dev-toolbar p{line-height:1.5em;margin:0}.button{display:inline-flex;align-items:center;gap:var(--ndt-spacing-xs);padding:var(--ndt-spacing-xs) var(--ndt-spacing-sm);border:1px solid var(--ndt-border-primary);border-radius:var(--ndt-border-radius-medium);background:var(--ndt-bg-primary);color:var(--ndt-text-primary);cursor:pointer;transition:var(--ndt-transition-default);outline:none;font-family:inherit}.button:hover{background:var(--ndt-hover-bg);border-color:var(--ndt-primary)}.button:focus-visible{outline:none;background:var(--ndt-hover-bg);box-shadow:0 0 0 2px rgba(var(--ndt-primary-rgb),.2)}.button.primary{background:var(--ndt-primary);color:var(--ndt-text-on-primary);border-color:var(--ndt-primary)}.button.primary:hover{background:var(--ndt-primary);border-color:var(--ndt-primary)}.button.icon-only{padding:var(--ndt-spacing-xs);width:32px;height:32px;justify-content:center}.button.small{font-size:var(--ndt-font-size-sm)}\n"], dependencies: [{ kind: "component", type: DevToolbarIconComponent, selector: "ndt-icon", inputs: ["name"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
2992
+ }
2993
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: DevToolbarButtonComponent, decorators: [{
2994
+ type: Component,
2995
+ args: [{ selector: 'ndt-button', standalone: true, imports: [DevToolbarIconComponent], template: `
2996
+ <button
2997
+ class="button"
2998
+ [attr.aria-label]="ariaLabel()"
2999
+ [type]="type()"
3000
+ [class.button--active]="isActive()"
3001
+ [class.button--icon]="variant() === 'icon'"
3002
+ >
3003
+ @if (icon()) {
3004
+ <ndt-icon [name]="icon() || 'star'" />
3005
+ }
3006
+ @if (label()) {
3007
+ <span class="button__label">{{ label() }}</span>
3008
+ }
3009
+ <ng-content />
3010
+ </button>
3011
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".dev-toolbar{--ndt-border-radius-small: 4px;--ndt-border-radius-medium: 8px;--ndt-border-radius-large: 12px;--ndt-transition-default: all .2s ease-out;--ndt-transition-smooth: all .2s ease-in-out;--ndt-bg-primary: rgb(255, 255, 255);--ndt-bg-gradient: linear-gradient(180deg, rgb(243, 244, 246) 0%, rgba(243, 244, 246, .88) 100%);--ndt-text-primary: rgb(17, 24, 39);--ndt-text-secondary: rgb(55, 65, 81);--ndt-text-muted: rgb(107, 114, 128);--ndt-border-primary: #e5e7eb;--ndt-border-subtle: rgba(17, 24, 39, .1);--ndt-hover-bg: rgba(17, 24, 39, .05);--ndt-hover-danger: rgb(239, 68, 68);--ndt-shadow-toolbar: 0 2px 8px rgba(156, 163, 175, .2);--ndt-shadow-tooltip: 0 0 0 1px rgba(17, 24, 39, .05), 0 4px 8px rgba(107, 114, 128, .15), 0 2px 4px rgba(107, 114, 128, .1);--ndt-shadow-window: 0px 0px 0px 0px rgba(156, 163, 175, .1), 0px 1px 2px 0px rgba(156, 163, 175, .12), 0px 4px 4px 0px rgba(156, 163, 175, .1), 0px 10px 6px 0px rgba(156, 163, 175, .08), 0px 17px 7px 0px rgba(156, 163, 175, .05), 0px 26px 7px 0px rgba(156, 163, 175, .02);--ndt-spacing-xs: 4px;--ndt-spacing-sm: 8px;--ndt-spacing-md: 16px;--ndt-window-padding: 24px;--ndt-font-size-xs: .75rem;--ndt-font-size-sm: .875rem;--ndt-font-size-md: 1rem;--ndt-font-size-lg: 1.25rem;--ndt-font-size-xl: 2rem;--ndt-background-secondary: var(--ndt-bg-primary);--ndt-background-hover: var(--ndt-hover-bg);--ndt-primary: #df30d4;--ndt-primary-rgb: 223, 48, 212;--ndt-text-on-primary: rgb(255, 255, 255);--ndt-border-color: var(--ndt-border-primary);--ndt-note-background: rgb(219, 234, 254);--ndt-note-border: rgba(37, 99, 235, .2);--ndt-warning-background: rgb(254, 249, 195);--ndt-warning-border: rgba(202, 138, 4, .2);--ndt-error-background: rgb(254, 226, 226);--ndt-error-border: rgba(220, 38, 38, .2)}.dev-toolbar[data-theme=dark]{--ndt-bg-primary: rgb(17, 24, 39);--ndt-bg-gradient: linear-gradient(180deg, rgb(19, 21, 26) 0%, rgba(19, 21, 26, .88) 100%);--ndt-text-primary: rgb(255, 255, 255);--ndt-text-secondary: rgb(229, 231, 235);--ndt-text-muted: rgb(156, 163, 175);--ndt-border-primary: #343841;--ndt-border-subtle: rgba(255, 255, 255, .1);--ndt-hover-bg: rgba(255, 255, 255, .12);--ndt-hover-danger: rgb(220, 38, 38);--ndt-shadow-toolbar: 0 2px 8px rgba(19, 21, 26, .3);--ndt-shadow-tooltip: 0 0 0 1px rgba(255, 255, 255, .1), 0 4px 8px rgba(0, 0, 0, .4), 0 2px 4px rgba(0, 0, 0, .3);--ndt-shadow-window: 0px 0px 0px 0px rgba(19, 21, 26, .3), 0px 1px 2px 0px rgba(19, 21, 26, .29), 0px 4px 4px 0px rgba(19, 21, 26, .26), 0px 10px 6px 0px rgba(19, 21, 26, .15), 0px 17px 7px 0px rgba(19, 21, 26, .04), 0px 26px 7px 0px rgba(19, 21, 26, .01);--ndt-note-background: rgba(37, 99, 235, .15);--ndt-note-border: rgba(37, 99, 235, .3);--ndt-warning-background: rgba(202, 138, 4, .15);--ndt-warning-border: rgba(202, 138, 4, .3);--ndt-error-background: rgba(220, 38, 38, .15);--ndt-error-border: rgba(220, 38, 38, .3)}.dev-toolbar h1,.dev-toolbar h2,.dev-toolbar h3,.dev-toolbar h4,.dev-toolbar h5{font-weight:600;color:var(--ndt-text-primary);margin:0}.dev-toolbar h1{font-size:var(--ndt-font-size-xl)}.dev-toolbar h2{font-size:var(--ndt-font-size-lg)}.dev-toolbar h3{font-size:var(--ndt-font-size-md)}.dev-toolbar h4{font-size:var(--ndt-font-size-sm)}.dev-toolbar h5{font-size:var(--ndt-font-size-xs)}.dev-toolbar hr{border:1px solid var(--ndt-border-subtle);margin:1em 0}.dev-toolbar p{line-height:1.5em;margin:0}.button{display:inline-flex;align-items:center;gap:var(--ndt-spacing-xs);padding:var(--ndt-spacing-xs) var(--ndt-spacing-sm);border:1px solid var(--ndt-border-primary);border-radius:var(--ndt-border-radius-medium);background:var(--ndt-bg-primary);color:var(--ndt-text-primary);cursor:pointer;transition:var(--ndt-transition-default);outline:none;font-family:inherit}.button:hover{background:var(--ndt-hover-bg);border-color:var(--ndt-primary)}.button:focus-visible{outline:none;background:var(--ndt-hover-bg);box-shadow:0 0 0 2px rgba(var(--ndt-primary-rgb),.2)}.button.primary{background:var(--ndt-primary);color:var(--ndt-text-on-primary);border-color:var(--ndt-primary)}.button.primary:hover{background:var(--ndt-primary);border-color:var(--ndt-primary)}.button.icon-only{padding:var(--ndt-spacing-xs);width:32px;height:32px;justify-content:center}.button.small{font-size:var(--ndt-font-size-sm)}\n"] }]
3012
+ }] });
3013
+
3014
+ class DevToolbarCardComponent {
3015
+ constructor() {
3016
+ this.click = signal(undefined);
3017
+ this.isHovered = signal(false);
3018
+ }
3019
+ onClick() {
3020
+ this.click.set();
3021
+ }
3022
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: DevToolbarCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
3023
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.0.5", type: DevToolbarCardComponent, isStandalone: true, selector: "ndt-card", ngImport: i0, template: `
3024
+ <div
3025
+ class="card"
3026
+ role="button"
3027
+ tabindex="0"
3028
+ (click)="onClick()"
3029
+ (keydown.enter)="onClick()"
3030
+ (keydown.space)="onClick()"
3031
+ [class.card--hover]="isHovered()"
3032
+ (mouseenter)="isHovered.set(true)"
3033
+ (mouseleave)="isHovered.set(false)"
3034
+ >
3035
+ <ng-content></ng-content>
3036
+ </div>
3037
+ `, isInline: true, styles: [".card{background:var(--ndt-bg-primary);border-radius:var(--ndt-border-radius-large);padding:var(--ndt-spacing-md);cursor:pointer;transition:var(--ndt-transition-default);border:1px solid var(--ndt-border-subtle);position:relative;flex:1;height:120px;display:flex}.card:hover{background:var(--ndt-hover-bg);border-color:var(--ndt-primary);box-shadow:0 0 0 1px rgba(var(--ndt-primary-rgb),.3)}\n"] }); }
3038
+ }
3039
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: DevToolbarCardComponent, decorators: [{
3040
+ type: Component,
3041
+ args: [{ selector: 'ndt-card', standalone: true, template: `
3042
+ <div
3043
+ class="card"
3044
+ role="button"
3045
+ tabindex="0"
3046
+ (click)="onClick()"
3047
+ (keydown.enter)="onClick()"
3048
+ (keydown.space)="onClick()"
3049
+ [class.card--hover]="isHovered()"
3050
+ (mouseenter)="isHovered.set(true)"
3051
+ (mouseleave)="isHovered.set(false)"
3052
+ >
3053
+ <ng-content></ng-content>
3054
+ </div>
3055
+ `, styles: [".card{background:var(--ndt-bg-primary);border-radius:var(--ndt-border-radius-large);padding:var(--ndt-spacing-md);cursor:pointer;transition:var(--ndt-transition-default);border:1px solid var(--ndt-border-subtle);position:relative;flex:1;height:120px;display:flex}.card:hover{background:var(--ndt-hover-bg);border-color:var(--ndt-primary);box-shadow:0 0 0 1px rgba(var(--ndt-primary-rgb),.3)}\n"] }]
3056
+ }] });
3057
+
3058
+ class DevToolbarClickableCardComponent {
3059
+ constructor() {
3060
+ this.icon = input.required();
3061
+ this.title = input.required();
3062
+ this.subtitle = input.required();
3063
+ this.click = signal(undefined);
3064
+ }
3065
+ onClick() {
3066
+ this.click.set();
3067
+ }
3068
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: DevToolbarClickableCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
3069
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.0.5", type: DevToolbarClickableCardComponent, isStandalone: true, selector: "ndt-clickable-card", inputs: { icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: true, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: true, transformFunction: null }, subtitle: { classPropertyName: "subtitle", publicName: "subtitle", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: `
3070
+ <ndt-card (clicked)="onClick()">
3071
+ <div class="clickable-card">
3072
+ <div class="clickable-card__icon">
3073
+ <ndt-icon [name]="icon()" />
3074
+ </div>
3075
+ <div class="clickable-card__content">
3076
+ <div class="clickable-card__title">{{ title() }}</div>
3077
+ <div class="clickable-card__subtitle">{{ subtitle() }}</div>
3078
+ </div>
3079
+ </div>
3080
+ </ndt-card>
3081
+ `, isInline: true, styles: [".clickable-card{display:flex;flex-direction:column;gap:var(--ndt-spacing-sm);height:100%}.clickable-card__icon{display:flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:var(--ndt-border-radius-medium);background:var(--ndt-hover-bg);color:var(--ndt-text-primary)}.clickable-card__content{display:flex;flex-direction:column;gap:var(--ndt-spacing-xs)}.clickable-card__title{color:var(--ndt-text-primary);font-size:var(--ndt-font-size-sm);font-weight:500}.clickable-card__subtitle{color:var(--ndt-text-muted);font-size:var(--ndt-font-size-xs);line-height:1.4;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}\n"], dependencies: [{ kind: "component", type: DevToolbarCardComponent, selector: "ndt-card" }, { kind: "component", type: DevToolbarIconComponent, selector: "ndt-icon", inputs: ["name"] }] }); }
3082
+ }
3083
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: DevToolbarClickableCardComponent, decorators: [{
3084
+ type: Component,
3085
+ args: [{ selector: 'ndt-clickable-card', standalone: true, imports: [DevToolbarCardComponent, DevToolbarIconComponent], template: `
3086
+ <ndt-card (clicked)="onClick()">
3087
+ <div class="clickable-card">
3088
+ <div class="clickable-card__icon">
3089
+ <ndt-icon [name]="icon()" />
3090
+ </div>
3091
+ <div class="clickable-card__content">
3092
+ <div class="clickable-card__title">{{ title() }}</div>
3093
+ <div class="clickable-card__subtitle">{{ subtitle() }}</div>
3094
+ </div>
3095
+ </div>
3096
+ </ndt-card>
3097
+ `, styles: [".clickable-card{display:flex;flex-direction:column;gap:var(--ndt-spacing-sm);height:100%}.clickable-card__icon{display:flex;align-items:center;justify-content:center;width:32px;height:32px;border-radius:var(--ndt-border-radius-medium);background:var(--ndt-hover-bg);color:var(--ndt-text-primary)}.clickable-card__content{display:flex;flex-direction:column;gap:var(--ndt-spacing-xs)}.clickable-card__title{color:var(--ndt-text-primary);font-size:var(--ndt-font-size-sm);font-weight:500}.clickable-card__subtitle{color:var(--ndt-text-muted);font-size:var(--ndt-font-size-xs);line-height:1.4;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}\n"] }]
3098
+ }] });
3099
+
3100
+ class DevToolbarLinkButtonComponent {
3101
+ constructor() {
3102
+ this.url = input.required();
3103
+ this.icon = input.required();
3104
+ }
3105
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: DevToolbarLinkButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
3106
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.0.5", type: DevToolbarLinkButtonComponent, isStandalone: true, selector: "ndt-link-button", inputs: { url: { classPropertyName: "url", publicName: "url", isSignal: true, isRequired: true, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: `
3107
+ <a
3108
+ [href]="url()"
3109
+ target="_blank"
3110
+ rel="noopener noreferrer"
3111
+ class="link-button"
3112
+ >
3113
+ <div class="link-button__icon">
3114
+ <ndt-icon [name]="icon()" />
3115
+ </div>
3116
+ <span class="link-button__text">
3117
+ <ng-content></ng-content>
3118
+ </span>
3119
+ </a>
3120
+ `, isInline: true, styles: [".link-button{display:flex;flex-direction:column;align-items:center;gap:var(--ndt-spacing-xs);text-decoration:none;color:var(--ndt-text-muted);transition:var(--ndt-transition-default)}.link-button:hover{color:var(--ndt-text-primary)}.link-button:hover .link-button__icon{outline:2px solid var(--ndt-primary);outline-offset:2px;box-shadow:0 0 8px var(--ndt-primary)}.link-button__icon{display:flex;align-items:center;justify-content:center;width:40px;height:40px;border-radius:var(--ndt-border-radius-medium);background:var(--ndt-hover-bg);transition:all .2s ease-in-out}.link-button__text{font-size:var(--ndt-font-size-xs);text-align:center;white-space:nowrap}\n"], dependencies: [{ kind: "component", type: DevToolbarIconComponent, selector: "ndt-icon", inputs: ["name"] }] }); }
3121
+ }
3122
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: DevToolbarLinkButtonComponent, decorators: [{
3123
+ type: Component,
3124
+ args: [{ selector: 'ndt-link-button', standalone: true, imports: [DevToolbarIconComponent], template: `
3125
+ <a
3126
+ [href]="url()"
3127
+ target="_blank"
3128
+ rel="noopener noreferrer"
3129
+ class="link-button"
3130
+ >
3131
+ <div class="link-button__icon">
3132
+ <ndt-icon [name]="icon()" />
3133
+ </div>
3134
+ <span class="link-button__text">
3135
+ <ng-content></ng-content>
3136
+ </span>
3137
+ </a>
3138
+ `, styles: [".link-button{display:flex;flex-direction:column;align-items:center;gap:var(--ndt-spacing-xs);text-decoration:none;color:var(--ndt-text-muted);transition:var(--ndt-transition-default)}.link-button:hover{color:var(--ndt-text-primary)}.link-button:hover .link-button__icon{outline:2px solid var(--ndt-primary);outline-offset:2px;box-shadow:0 0 8px var(--ndt-primary)}.link-button__icon{display:flex;align-items:center;justify-content:center;width:40px;height:40px;border-radius:var(--ndt-border-radius-medium);background:var(--ndt-hover-bg);transition:all .2s ease-in-out}.link-button__text{font-size:var(--ndt-font-size-xs);text-align:center;white-space:nowrap}\n"] }]
3139
+ }] });
3140
+
3141
+ class SettingsService {
3142
+ constructor() {
3143
+ this.STORAGE_KEY = 'settings';
3144
+ this.storageService = inject(DevToolsStorageService);
3145
+ }
3146
+ getSettings() {
3147
+ return (this.storageService.get(this.STORAGE_KEY) || {
3148
+ isDarkMode: false,
3149
+ });
3150
+ }
3151
+ setSettings(settings) {
3152
+ this.storageService.set(this.STORAGE_KEY, settings);
3153
+ }
3154
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: SettingsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
3155
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: SettingsService, providedIn: 'root' }); }
3156
+ }
3157
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: SettingsService, decorators: [{
3158
+ type: Injectable,
3159
+ args: [{ providedIn: 'root' }]
3160
+ }] });
3161
+
3162
+ class DevToolbarHomeToolComponent {
3163
+ constructor() {
3164
+ this.state = inject(DevToolbarStateService);
3165
+ this.settingsService = inject(SettingsService);
3166
+ this.storageService = inject(DevToolsStorageService);
3167
+ this.badge = input();
3168
+ this.title = `Angular Dev Toolbar`;
3169
+ this.options = {
3170
+ title: this.title,
3171
+ isClosable: true,
3172
+ id: 'ndt-home',
3173
+ size: 'medium',
3174
+ description: '',
3175
+ isBeta: true,
3176
+ };
3177
+ this.links = [
3178
+ {
3179
+ icon: 'bug',
3180
+ url: 'https://github.com/alfredoperez/ngx-dev-toolbar/issues',
3181
+ label: 'Bug report',
3182
+ },
3183
+ {
3184
+ icon: 'lightbulb',
3185
+ url: 'https://github.com/alfredoperez/ngx-dev-toolbar/discussions',
3186
+ label: 'Suggestions',
3187
+ },
3188
+ {
3189
+ icon: 'docs',
3190
+ url: 'https://alfredoperez.github.io/ngx-dev-toolbar/',
3191
+ label: 'Docs',
3192
+ },
3193
+ {
3194
+ icon: 'star',
3195
+ url: 'https://github.com/alfredoperez/ngx-dev-toolbar',
3196
+ label: 'Star on GitHub',
3197
+ },
3198
+ {
3199
+ icon: 'discord',
3200
+ url: 'https://discord.com/invite/angular',
3201
+ label: 'Community',
3202
+ },
3203
+ ];
3204
+ }
3205
+ onToggleTheme() {
3206
+ const newTheme = this.state.isDarkTheme() ? 'light' : 'dark';
3207
+ this.settingsService.setSettings({ isDarkMode: newTheme === 'dark' });
3208
+ this.state.setTheme(newTheme);
3209
+ }
3210
+ onExportSettings() {
3211
+ const settings = this.storageService.getAllSettings();
3212
+ const blob = new Blob([JSON.stringify(settings, null, 2)], {
3213
+ type: 'application/json',
3214
+ });
3215
+ const url = URL.createObjectURL(blob);
3216
+ const link = document.createElement('a');
3217
+ const timestamp = new Date().toISOString().split('T')[0];
3218
+ link.href = url;
3219
+ link.download = `ngx-dev-toolbar-settings-${timestamp}.json`;
3220
+ document.body.appendChild(link);
3221
+ link.click();
3222
+ document.body.removeChild(link);
3223
+ URL.revokeObjectURL(url);
3224
+ }
3225
+ onImportSettings() {
3226
+ const input = document.createElement('input');
3227
+ input.type = 'file';
3228
+ input.accept = 'application/json';
3229
+ input.onchange = (event) => {
3230
+ const file = event.target.files?.[0];
3231
+ if (file) {
3232
+ const reader = new FileReader();
3233
+ reader.onload = (e) => {
3234
+ try {
3235
+ const settings = JSON.parse(e.target?.result);
3236
+ this.storageService.setAllSettings(settings);
3237
+ window.location.reload();
3238
+ }
3239
+ catch (error) {
3240
+ console.error('Error importing settings:', error);
3241
+ }
3242
+ };
3243
+ reader.readAsText(file);
3244
+ }
3245
+ };
3246
+ input.click();
3247
+ }
3248
+ onResetSettings() {
3249
+ this.storageService.clearAllSettings();
3250
+ window.location.reload();
3251
+ }
3252
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: DevToolbarHomeToolComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
3253
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.5", type: DevToolbarHomeToolComponent, isStandalone: true, selector: "ndt-home-tool", inputs: { badge: { classPropertyName: "badge", publicName: "badge", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
3254
+ <ndt-toolbar-tool [options]="options" title="Home" icon="angular">
3255
+ <section class="settings">
3256
+ <div class="instruction">
3257
+ <div class="instruction__label">
3258
+ <span class="instruction__label-text">Theme</span>
3259
+ <span class="instruction__label-description">
3260
+ Switch between light and dark mode
3261
+ </span>
3262
+ </div>
3263
+ <div class="instruction__control">
3264
+ <div class="instruction__control-button">
3265
+ <ndt-button
3266
+ [isActive]="true"
3267
+ (click)="onToggleTheme()"
3268
+ variant="icon"
3269
+ [ariaLabel]="
3270
+ state.isDarkTheme()
3271
+ ? 'Switch to light theme'
3272
+ : 'Switch to dark theme'
3273
+ "
3274
+ [icon]="state.isDarkTheme() ? 'sun' : 'moon'"
3275
+ />
3276
+ </div>
3277
+ </div>
3278
+ </div>
3279
+
3280
+ <div class="settings-container">
3281
+ <div class="instruction">
3282
+ <div class="instruction__label">
3283
+ <span class="instruction__label-text">Reset Settings</span>
3284
+ <span class="instruction__label-description">
3285
+ Reset all settings to their default values
3286
+ </span>
3287
+ </div>
3288
+ <div class="instruction__control">
3289
+ <div class="instruction__control-button">
3290
+ <ndt-button
3291
+ variant="icon"
3292
+ icon="trash"
3293
+ ariaLabel="Reset all settings"
3294
+ (click)="onResetSettings()"
3295
+ />
3296
+ </div>
3297
+ </div>
3298
+ </div>
3299
+ <div class="settings-actions">
3300
+ <ndt-clickable-card
3301
+ icon="export"
3302
+ title="Export Settings"
3303
+ subtitle="Export the current settings to share with other devs or use in your tests"
3304
+ (click)="onExportSettings()"
3305
+ />
3306
+ <ndt-clickable-card
3307
+ icon="import"
3308
+ title="Import Settings"
3309
+ subtitle="Import settings to reproduce a scenario"
3310
+ (click)="onImportSettings()"
3311
+ />
3312
+ </div>
3313
+ </div>
3314
+
3315
+ <div class="footer-links">
3316
+ @for (link of links; track link.url) {
3317
+ <ndt-link-button [icon]="link.icon" [url]="link.url">
3318
+ {{ link.label }}
3319
+ </ndt-link-button>
3320
+ }
3321
+ </div>
3322
+ </section>
3323
+ </ndt-toolbar-tool>
3324
+ `, isInline: true, styles: [".dev-toolbar{--ndt-border-radius-small: 4px;--ndt-border-radius-medium: 8px;--ndt-border-radius-large: 12px;--ndt-transition-default: all .2s ease-out;--ndt-transition-smooth: all .2s ease-in-out;--ndt-bg-primary: rgb(255, 255, 255);--ndt-bg-gradient: linear-gradient(180deg, rgb(243, 244, 246) 0%, rgba(243, 244, 246, .88) 100%);--ndt-text-primary: rgb(17, 24, 39);--ndt-text-secondary: rgb(55, 65, 81);--ndt-text-muted: rgb(107, 114, 128);--ndt-border-primary: #e5e7eb;--ndt-border-subtle: rgba(17, 24, 39, .1);--ndt-hover-bg: rgba(17, 24, 39, .05);--ndt-hover-danger: rgb(239, 68, 68);--ndt-shadow-toolbar: 0 2px 8px rgba(156, 163, 175, .2);--ndt-shadow-tooltip: 0 0 0 1px rgba(17, 24, 39, .05), 0 4px 8px rgba(107, 114, 128, .15), 0 2px 4px rgba(107, 114, 128, .1);--ndt-shadow-window: 0px 0px 0px 0px rgba(156, 163, 175, .1), 0px 1px 2px 0px rgba(156, 163, 175, .12), 0px 4px 4px 0px rgba(156, 163, 175, .1), 0px 10px 6px 0px rgba(156, 163, 175, .08), 0px 17px 7px 0px rgba(156, 163, 175, .05), 0px 26px 7px 0px rgba(156, 163, 175, .02);--ndt-spacing-xs: 4px;--ndt-spacing-sm: 8px;--ndt-spacing-md: 16px;--ndt-window-padding: 24px;--ndt-font-size-xs: .75rem;--ndt-font-size-sm: .875rem;--ndt-font-size-md: 1rem;--ndt-font-size-lg: 1.25rem;--ndt-font-size-xl: 2rem;--ndt-background-secondary: var(--ndt-bg-primary);--ndt-background-hover: var(--ndt-hover-bg);--ndt-primary: #df30d4;--ndt-primary-rgb: 223, 48, 212;--ndt-text-on-primary: rgb(255, 255, 255);--ndt-border-color: var(--ndt-border-primary);--ndt-note-background: rgb(219, 234, 254);--ndt-note-border: rgba(37, 99, 235, .2);--ndt-warning-background: rgb(254, 249, 195);--ndt-warning-border: rgba(202, 138, 4, .2);--ndt-error-background: rgb(254, 226, 226);--ndt-error-border: rgba(220, 38, 38, .2)}.dev-toolbar[data-theme=dark]{--ndt-bg-primary: rgb(17, 24, 39);--ndt-bg-gradient: linear-gradient(180deg, rgb(19, 21, 26) 0%, rgba(19, 21, 26, .88) 100%);--ndt-text-primary: rgb(255, 255, 255);--ndt-text-secondary: rgb(229, 231, 235);--ndt-text-muted: rgb(156, 163, 175);--ndt-border-primary: #343841;--ndt-border-subtle: rgba(255, 255, 255, .1);--ndt-hover-bg: rgba(255, 255, 255, .12);--ndt-hover-danger: rgb(220, 38, 38);--ndt-shadow-toolbar: 0 2px 8px rgba(19, 21, 26, .3);--ndt-shadow-tooltip: 0 0 0 1px rgba(255, 255, 255, .1), 0 4px 8px rgba(0, 0, 0, .4), 0 2px 4px rgba(0, 0, 0, .3);--ndt-shadow-window: 0px 0px 0px 0px rgba(19, 21, 26, .3), 0px 1px 2px 0px rgba(19, 21, 26, .29), 0px 4px 4px 0px rgba(19, 21, 26, .26), 0px 10px 6px 0px rgba(19, 21, 26, .15), 0px 17px 7px 0px rgba(19, 21, 26, .04), 0px 26px 7px 0px rgba(19, 21, 26, .01);--ndt-note-background: rgba(37, 99, 235, .15);--ndt-note-border: rgba(37, 99, 235, .3);--ndt-warning-background: rgba(202, 138, 4, .15);--ndt-warning-border: rgba(202, 138, 4, .3);--ndt-error-background: rgba(220, 38, 38, .15);--ndt-error-border: rgba(220, 38, 38, .3)}.dev-toolbar h1,.dev-toolbar h2,.dev-toolbar h3,.dev-toolbar h4,.dev-toolbar h5{font-weight:600;color:var(--ndt-text-primary);margin:0}.dev-toolbar h1{font-size:var(--ndt-font-size-xl)}.dev-toolbar h2{font-size:var(--ndt-font-size-lg)}.dev-toolbar h3{font-size:var(--ndt-font-size-md)}.dev-toolbar h4{font-size:var(--ndt-font-size-sm)}.dev-toolbar h5{font-size:var(--ndt-font-size-xs)}.dev-toolbar hr{border:1px solid var(--ndt-border-subtle);margin:1em 0}.dev-toolbar p{line-height:1.5em;margin:0}.settings{display:flex;flex-direction:column;justify-content:space-between;min-height:100%}.instruction{display:flex;justify-content:space-between;align-items:flex-start;gap:var(--ndt-spacing-md)}.instruction__label{display:flex;flex-direction:column;gap:var(--ndt-spacing-xs)}.instruction__label-text{color:var(--ndt-text-primary);font-size:var(--ndt-font-size-sm);font-weight:500}.instruction__label-description{color:var(--ndt-text-muted);font-size:var(--ndt-font-size-xs)}.instruction__control{flex:1}.instruction__control-button{display:flex;gap:var(--ndt-spacing-xs);justify-content:flex-end}.settings-container{display:flex;flex-direction:column}.settings-container .settings-actions{display:flex;gap:var(--ndt-spacing-md);padding-block:var(--ndt-spacing-md)}.settings-container .settings-actions>*{width:50%;min-width:0}.footer-links{border-top:1px solid var(--ndt-border-subtle);padding-top:1em;display:flex;flex-direction:row;justify-content:space-between;gap:var(--ndt-spacing-lg)}\n"], dependencies: [{ kind: "component", type: DevToolbarToolComponent, selector: "ndt-toolbar-tool", inputs: ["options", "icon", "title"] }, { kind: "ngmodule", type: FormsModule }, { kind: "component", type: DevToolbarButtonComponent, selector: "ndt-button", inputs: ["type", "variant", "icon", "label", "ariaLabel", "isActive"] }, { kind: "component", type: DevToolbarClickableCardComponent, selector: "ndt-clickable-card", inputs: ["icon", "title", "subtitle"] }, { kind: "component", type: DevToolbarLinkButtonComponent, selector: "ndt-link-button", inputs: ["url", "icon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
3325
+ }
3326
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: DevToolbarHomeToolComponent, decorators: [{
3327
+ type: Component,
3328
+ args: [{ selector: 'ndt-home-tool', standalone: true, imports: [
3329
+ DevToolbarToolComponent,
3330
+ FormsModule,
3331
+ DevToolbarButtonComponent,
3332
+ DevToolbarClickableCardComponent,
3333
+ DevToolbarLinkButtonComponent,
3334
+ ], template: `
3335
+ <ndt-toolbar-tool [options]="options" title="Home" icon="angular">
3336
+ <section class="settings">
3337
+ <div class="instruction">
3338
+ <div class="instruction__label">
3339
+ <span class="instruction__label-text">Theme</span>
3340
+ <span class="instruction__label-description">
3341
+ Switch between light and dark mode
3342
+ </span>
3343
+ </div>
3344
+ <div class="instruction__control">
3345
+ <div class="instruction__control-button">
3346
+ <ndt-button
3347
+ [isActive]="true"
3348
+ (click)="onToggleTheme()"
3349
+ variant="icon"
3350
+ [ariaLabel]="
3351
+ state.isDarkTheme()
3352
+ ? 'Switch to light theme'
3353
+ : 'Switch to dark theme'
3354
+ "
3355
+ [icon]="state.isDarkTheme() ? 'sun' : 'moon'"
3356
+ />
3357
+ </div>
3358
+ </div>
3359
+ </div>
3360
+
3361
+ <div class="settings-container">
3362
+ <div class="instruction">
3363
+ <div class="instruction__label">
3364
+ <span class="instruction__label-text">Reset Settings</span>
3365
+ <span class="instruction__label-description">
3366
+ Reset all settings to their default values
3367
+ </span>
3368
+ </div>
3369
+ <div class="instruction__control">
3370
+ <div class="instruction__control-button">
3371
+ <ndt-button
3372
+ variant="icon"
3373
+ icon="trash"
3374
+ ariaLabel="Reset all settings"
3375
+ (click)="onResetSettings()"
3376
+ />
3377
+ </div>
3378
+ </div>
3379
+ </div>
3380
+ <div class="settings-actions">
3381
+ <ndt-clickable-card
3382
+ icon="export"
3383
+ title="Export Settings"
3384
+ subtitle="Export the current settings to share with other devs or use in your tests"
3385
+ (click)="onExportSettings()"
3386
+ />
3387
+ <ndt-clickable-card
3388
+ icon="import"
3389
+ title="Import Settings"
3390
+ subtitle="Import settings to reproduce a scenario"
3391
+ (click)="onImportSettings()"
3392
+ />
3393
+ </div>
3394
+ </div>
3395
+
3396
+ <div class="footer-links">
3397
+ @for (link of links; track link.url) {
3398
+ <ndt-link-button [icon]="link.icon" [url]="link.url">
3399
+ {{ link.label }}
3400
+ </ndt-link-button>
3401
+ }
3402
+ </div>
3403
+ </section>
3404
+ </ndt-toolbar-tool>
3405
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".dev-toolbar{--ndt-border-radius-small: 4px;--ndt-border-radius-medium: 8px;--ndt-border-radius-large: 12px;--ndt-transition-default: all .2s ease-out;--ndt-transition-smooth: all .2s ease-in-out;--ndt-bg-primary: rgb(255, 255, 255);--ndt-bg-gradient: linear-gradient(180deg, rgb(243, 244, 246) 0%, rgba(243, 244, 246, .88) 100%);--ndt-text-primary: rgb(17, 24, 39);--ndt-text-secondary: rgb(55, 65, 81);--ndt-text-muted: rgb(107, 114, 128);--ndt-border-primary: #e5e7eb;--ndt-border-subtle: rgba(17, 24, 39, .1);--ndt-hover-bg: rgba(17, 24, 39, .05);--ndt-hover-danger: rgb(239, 68, 68);--ndt-shadow-toolbar: 0 2px 8px rgba(156, 163, 175, .2);--ndt-shadow-tooltip: 0 0 0 1px rgba(17, 24, 39, .05), 0 4px 8px rgba(107, 114, 128, .15), 0 2px 4px rgba(107, 114, 128, .1);--ndt-shadow-window: 0px 0px 0px 0px rgba(156, 163, 175, .1), 0px 1px 2px 0px rgba(156, 163, 175, .12), 0px 4px 4px 0px rgba(156, 163, 175, .1), 0px 10px 6px 0px rgba(156, 163, 175, .08), 0px 17px 7px 0px rgba(156, 163, 175, .05), 0px 26px 7px 0px rgba(156, 163, 175, .02);--ndt-spacing-xs: 4px;--ndt-spacing-sm: 8px;--ndt-spacing-md: 16px;--ndt-window-padding: 24px;--ndt-font-size-xs: .75rem;--ndt-font-size-sm: .875rem;--ndt-font-size-md: 1rem;--ndt-font-size-lg: 1.25rem;--ndt-font-size-xl: 2rem;--ndt-background-secondary: var(--ndt-bg-primary);--ndt-background-hover: var(--ndt-hover-bg);--ndt-primary: #df30d4;--ndt-primary-rgb: 223, 48, 212;--ndt-text-on-primary: rgb(255, 255, 255);--ndt-border-color: var(--ndt-border-primary);--ndt-note-background: rgb(219, 234, 254);--ndt-note-border: rgba(37, 99, 235, .2);--ndt-warning-background: rgb(254, 249, 195);--ndt-warning-border: rgba(202, 138, 4, .2);--ndt-error-background: rgb(254, 226, 226);--ndt-error-border: rgba(220, 38, 38, .2)}.dev-toolbar[data-theme=dark]{--ndt-bg-primary: rgb(17, 24, 39);--ndt-bg-gradient: linear-gradient(180deg, rgb(19, 21, 26) 0%, rgba(19, 21, 26, .88) 100%);--ndt-text-primary: rgb(255, 255, 255);--ndt-text-secondary: rgb(229, 231, 235);--ndt-text-muted: rgb(156, 163, 175);--ndt-border-primary: #343841;--ndt-border-subtle: rgba(255, 255, 255, .1);--ndt-hover-bg: rgba(255, 255, 255, .12);--ndt-hover-danger: rgb(220, 38, 38);--ndt-shadow-toolbar: 0 2px 8px rgba(19, 21, 26, .3);--ndt-shadow-tooltip: 0 0 0 1px rgba(255, 255, 255, .1), 0 4px 8px rgba(0, 0, 0, .4), 0 2px 4px rgba(0, 0, 0, .3);--ndt-shadow-window: 0px 0px 0px 0px rgba(19, 21, 26, .3), 0px 1px 2px 0px rgba(19, 21, 26, .29), 0px 4px 4px 0px rgba(19, 21, 26, .26), 0px 10px 6px 0px rgba(19, 21, 26, .15), 0px 17px 7px 0px rgba(19, 21, 26, .04), 0px 26px 7px 0px rgba(19, 21, 26, .01);--ndt-note-background: rgba(37, 99, 235, .15);--ndt-note-border: rgba(37, 99, 235, .3);--ndt-warning-background: rgba(202, 138, 4, .15);--ndt-warning-border: rgba(202, 138, 4, .3);--ndt-error-background: rgba(220, 38, 38, .15);--ndt-error-border: rgba(220, 38, 38, .3)}.dev-toolbar h1,.dev-toolbar h2,.dev-toolbar h3,.dev-toolbar h4,.dev-toolbar h5{font-weight:600;color:var(--ndt-text-primary);margin:0}.dev-toolbar h1{font-size:var(--ndt-font-size-xl)}.dev-toolbar h2{font-size:var(--ndt-font-size-lg)}.dev-toolbar h3{font-size:var(--ndt-font-size-md)}.dev-toolbar h4{font-size:var(--ndt-font-size-sm)}.dev-toolbar h5{font-size:var(--ndt-font-size-xs)}.dev-toolbar hr{border:1px solid var(--ndt-border-subtle);margin:1em 0}.dev-toolbar p{line-height:1.5em;margin:0}.settings{display:flex;flex-direction:column;justify-content:space-between;min-height:100%}.instruction{display:flex;justify-content:space-between;align-items:flex-start;gap:var(--ndt-spacing-md)}.instruction__label{display:flex;flex-direction:column;gap:var(--ndt-spacing-xs)}.instruction__label-text{color:var(--ndt-text-primary);font-size:var(--ndt-font-size-sm);font-weight:500}.instruction__label-description{color:var(--ndt-text-muted);font-size:var(--ndt-font-size-xs)}.instruction__control{flex:1}.instruction__control-button{display:flex;gap:var(--ndt-spacing-xs);justify-content:flex-end}.settings-container{display:flex;flex-direction:column}.settings-container .settings-actions{display:flex;gap:var(--ndt-spacing-md);padding-block:var(--ndt-spacing-md)}.settings-container .settings-actions>*{width:50%;min-width:0}.footer-links{border-top:1px solid var(--ndt-border-subtle);padding-top:1em;display:flex;flex-direction:row;justify-content:space-between;gap:var(--ndt-spacing-lg)}\n"] }]
3406
+ }] });
3407
+
3408
+ class DevToolbarInternalLanguageService {
3409
+ constructor() {
3410
+ this.STORAGE_KEY = 'language';
3411
+ this.storageService = inject(DevToolsStorageService);
3412
+ this.languages$ = new BehaviorSubject([]);
3413
+ this.forcedLanguage$ = new BehaviorSubject(null);
3414
+ this.languages = toSignal(this.languages$, { initialValue: [] });
3415
+ this.loadForcedLanguage();
3416
+ }
3417
+ setAppLanguages(languages) {
3418
+ this.languages$.next(languages);
3419
+ }
3420
+ getAppLanguages() {
3421
+ return this.languages$.asObservable();
3422
+ }
3423
+ setForcedLanguage(language) {
3424
+ this.forcedLanguage$.next(language);
3425
+ this.storageService.set(this.STORAGE_KEY, language);
3426
+ }
3427
+ getForcedLanguage() {
3428
+ return this.forcedLanguage$.pipe(map((language) => (language ? [language] : [])));
3429
+ }
3430
+ removeForcedLanguage() {
3431
+ this.forcedLanguage$.next(null);
3432
+ this.storageService.remove(this.STORAGE_KEY);
3433
+ }
3434
+ loadForcedLanguage() {
3435
+ const savedLanguage = this.storageService.get(this.STORAGE_KEY);
3436
+ if (savedLanguage) {
3437
+ this.forcedLanguage$.next(savedLanguage);
3438
+ }
3439
+ }
3440
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: DevToolbarInternalLanguageService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
3441
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: DevToolbarInternalLanguageService, providedIn: 'root' }); }
3442
+ }
3443
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: DevToolbarInternalLanguageService, decorators: [{
3444
+ type: Injectable,
3445
+ args: [{ providedIn: 'root' }]
3446
+ }], ctorParameters: () => [] });
3447
+
3448
+ class DevToolbarLanguageToolComponent {
3449
+ constructor() {
3450
+ this.languageService = inject(DevToolbarInternalLanguageService);
3451
+ this.options = {
3452
+ title: 'Languages',
3453
+ description: 'Set the language for your current session',
3454
+ size: 'small',
3455
+ id: 'ndt-language',
3456
+ isBeta: true,
3457
+ isClosable: true,
3458
+ };
3459
+ this.activeLanguage = signal('not-forced');
3460
+ this.languageOptions = toSignal(this.languageService.getAppLanguages().pipe(map((languages) => [
3461
+ { value: 'not-forced', label: 'Not Forced' },
3462
+ ...languages.map(({ id: value, name: label }) => ({
3463
+ value,
3464
+ label,
3465
+ })),
3466
+ ])), { initialValue: [] });
3467
+ }
3468
+ async onLanguageChange(language) {
3469
+ if (language === 'not-forced' || !language) {
3470
+ this.languageService.removeForcedLanguage();
3471
+ return;
3472
+ }
3473
+ const languages = await firstValueFrom(this.languageService.getAppLanguages());
3474
+ const selectedLanguage = languages.find(({ id }) => id === language);
3475
+ if (selectedLanguage) {
3476
+ this.languageService.setForcedLanguage(selectedLanguage);
3477
+ }
3478
+ }
3479
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: DevToolbarLanguageToolComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
3480
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.0.5", type: DevToolbarLanguageToolComponent, isStandalone: true, selector: "ndt-language-tool", ngImport: i0, template: `
3481
+ <ndt-toolbar-tool title="Languages" icon="translate" [options]="options">
3482
+ <div class="language-select">
3483
+ <label for="language-select">Language</label>
3484
+ <ndt-select
3485
+ id="language-select"
3486
+ [value]="activeLanguage()"
3487
+ [options]="languageOptions()"
3488
+ [size]="'medium'"
3489
+ (valueChange)="onLanguageChange($event ?? '')"
3490
+ />
3491
+ </div>
3492
+ </ndt-toolbar-tool>
3493
+ `, isInline: true, styles: [".language-select{display:flex;flex-direction:row;gap:.5rem;align-items:center;justify-content:space-between}\n"], dependencies: [{ kind: "component", type: DevToolbarToolComponent, selector: "ndt-toolbar-tool", inputs: ["options", "icon", "title"] }, { kind: "component", type: DevToolbarSelectComponent, selector: "ndt-select", inputs: ["value", "options", "ariaLabel", "label", "size"], outputs: ["valueChange"] }] }); }
3494
+ }
3495
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: DevToolbarLanguageToolComponent, decorators: [{
3496
+ type: Component,
3497
+ args: [{ selector: 'ndt-language-tool', standalone: true, imports: [DevToolbarToolComponent, DevToolbarSelectComponent], template: `
3498
+ <ndt-toolbar-tool title="Languages" icon="translate" [options]="options">
3499
+ <div class="language-select">
3500
+ <label for="language-select">Language</label>
3501
+ <ndt-select
3502
+ id="language-select"
3503
+ [value]="activeLanguage()"
3504
+ [options]="languageOptions()"
3505
+ [size]="'medium'"
3506
+ (valueChange)="onLanguageChange($event ?? '')"
3507
+ />
3508
+ </div>
3509
+ </ndt-toolbar-tool>
3510
+ `, styles: [".language-select{display:flex;flex-direction:row;gap:.5rem;align-items:center;justify-content:space-between}\n"] }]
3511
+ }] });
3512
+
3513
+ class DevToolbarNetworkMockerService {
3514
+ constructor() {
3515
+ this.mockRequests = signal([]);
3516
+ this.isMockingEnabled = signal(false);
3517
+ }
3518
+ getMockRequests() {
3519
+ return this.mockRequests.asReadonly();
3520
+ }
3521
+ getIsMockingEnabled() {
3522
+ return this.isMockingEnabled.asReadonly();
3523
+ }
3524
+ addMockRequest(config) {
3525
+ const mockRequest = {
3526
+ id: crypto.randomUUID(),
3527
+ url: config.url,
3528
+ method: config.method,
3529
+ status: config.status || 200,
3530
+ response: config.response || {},
3531
+ isActive: true,
3532
+ createdAt: new Date(),
3533
+ };
3534
+ this.mockRequests.update((requests) => [mockRequest, ...requests]);
3535
+ }
3536
+ removeMockRequest(id) {
3537
+ this.mockRequests.update((requests) => requests.filter((request) => request.id !== id));
3538
+ }
3539
+ toggleMockRequest(id) {
3540
+ this.mockRequests.update((requests) => requests.map((request) => request.id === id
3541
+ ? { ...request, isActive: !request.isActive }
3542
+ : request));
3543
+ }
3544
+ enableMocking() {
3545
+ this.isMockingEnabled.set(true);
3546
+ console.log('Network mocking enabled');
3547
+ }
3548
+ disableMocking() {
3549
+ this.isMockingEnabled.set(false);
3550
+ console.log('Network mocking disabled');
3551
+ }
3552
+ clearAllMocks() {
3553
+ this.mockRequests.set([]);
3554
+ this.isMockingEnabled.set(false);
3555
+ }
3556
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: DevToolbarNetworkMockerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
3557
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: DevToolbarNetworkMockerService, providedIn: 'root' }); }
3558
+ }
3559
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: DevToolbarNetworkMockerService, decorators: [{
3560
+ type: Injectable,
3561
+ args: [{
3562
+ providedIn: 'root',
3563
+ }]
3564
+ }] });
3565
+
3566
+ class DevToolbarNetworkMockerToolComponent {
3567
+ constructor() {
3568
+ // Injects
3569
+ this.networkMockerService = inject(DevToolbarNetworkMockerService);
3570
+ // Signals
3571
+ this.newMockUrl = signal('');
3572
+ this.newMockMethod = signal('GET');
3573
+ this.newMockStatus = signal('200');
3574
+ this.newMockResponse = signal('');
3575
+ // Computed values
3576
+ this.mockRequests = this.networkMockerService.getMockRequests();
3577
+ this.isMockingEnabled = this.networkMockerService.getIsMockingEnabled();
3578
+ this.hasNoMocks = computed(() => this.mockRequests().length === 0);
3579
+ // Window options
3580
+ this.options = {
3581
+ title: 'Network Mocker',
3582
+ description: 'Intercept and mock HTTP requests for testing and development',
3583
+ isClosable: true,
3584
+ size: 'tall',
3585
+ id: 'ndt-network-mocker',
3586
+ isBeta: true,
3587
+ };
3588
+ // Other properties
3589
+ this.httpMethods = [
3590
+ { value: 'GET', label: 'GET' },
3591
+ { value: 'POST', label: 'POST' },
3592
+ { value: 'PUT', label: 'PUT' },
3593
+ { value: 'DELETE', label: 'DELETE' },
3594
+ { value: 'PATCH', label: 'PATCH' },
3595
+ ];
3596
+ }
3597
+ // Public methods
3598
+ onAddMock() {
3599
+ const url = this.newMockUrl().trim();
3600
+ if (!url)
3601
+ return;
3602
+ const config = {
3603
+ url,
3604
+ method: this.newMockMethod(),
3605
+ status: parseInt(this.newMockStatus()) || 200,
3606
+ response: this.newMockResponse()
3607
+ ? JSON.parse(this.newMockResponse())
3608
+ : {},
3609
+ };
3610
+ this.networkMockerService.addMockRequest(config);
3611
+ // Reset form
3612
+ this.newMockUrl.set('');
3613
+ this.newMockMethod.set('GET');
3614
+ this.newMockStatus.set('200');
3615
+ this.newMockResponse.set('');
3616
+ }
3617
+ onToggleMocking() {
3618
+ if (this.isMockingEnabled()) {
3619
+ this.networkMockerService.disableMocking();
3620
+ }
3621
+ else {
3622
+ this.networkMockerService.enableMocking();
3623
+ }
3624
+ }
3625
+ onToggleMock(mockId) {
3626
+ this.networkMockerService.toggleMockRequest(mockId);
3627
+ }
3628
+ onRemoveMock(mockId) {
3629
+ this.networkMockerService.removeMockRequest(mockId);
3630
+ }
3631
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: DevToolbarNetworkMockerToolComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
3632
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.5", type: DevToolbarNetworkMockerToolComponent, isStandalone: true, selector: "ndt-network-mocker-tool", ngImport: i0, template: `
3633
+ <ndt-toolbar-tool [options]="options" title="Network Mocker" icon="network">
3634
+ <div class="container">
3635
+ <div class="header">
3636
+ <h3>Mock Network Requests</h3>
3637
+ <p>Intercept and mock HTTP requests for testing and development.</p>
3638
+ </div>
3639
+
3640
+ <div class="form">
3641
+ <div class="form-row">
3642
+ <ndt-input
3643
+ [(value)]="newMockUrl"
3644
+ placeholder="Enter URL pattern (e.g., /api/users/*)"
3645
+ ariaLabel="Mock URL"
3646
+ />
3647
+ <ndt-select
3648
+ [(value)]="newMockMethod"
3649
+ [options]="httpMethods"
3650
+ size="small"
3651
+ ariaLabel="HTTP Method"
3652
+ />
3653
+ </div>
3654
+
3655
+ <div class="form-row">
3656
+ <ndt-input
3657
+ [(value)]="newMockStatus"
3658
+ placeholder="Status code (default: 200)"
3659
+ type="number"
3660
+ ariaLabel="Status Code"
3661
+ />
3662
+ <ndt-input
3663
+ [(value)]="newMockResponse"
3664
+ placeholder="Response JSON (optional)"
3665
+ ariaLabel="Response JSON"
3666
+ />
3667
+ </div>
3668
+
3669
+ <div class="actions">
3670
+ <ndt-button label="Add Mock" icon="import" (click)="onAddMock()" />
3671
+ <ndt-button
3672
+ [label]="
3673
+ isMockingEnabled() ? 'Disable Mocking' : 'Enable Mocking'
3674
+ "
3675
+ [icon]="isMockingEnabled() ? 'trash' : 'network'"
3676
+ (click)="onToggleMocking()"
3677
+ />
3678
+ </div>
3679
+ </div>
3680
+
3681
+ @if (hasNoMocks()) {
3682
+ <div class="empty">
3683
+ <p>No mock requests configured. Add your first mock above.</p>
3684
+ </div>
3685
+ } @else {
3686
+ <div class="mocks-list">
3687
+ <h4>Configured Mocks</h4>
3688
+ @for (mock of mockRequests(); track mock.id) {
3689
+ <div class="mock-item">
3690
+ <div class="mock-info">
3691
+ <div class="mock-method">{{ mock.method }}</div>
3692
+ <div class="mock-url">{{ mock.url }}</div>
3693
+ <div class="mock-status">{{ mock.status }}</div>
3694
+ </div>
3695
+ <div class="mock-actions">
3696
+ <ndt-button
3697
+ variant="icon"
3698
+ [icon]="mock.isActive ? 'star' : 'moon'"
3699
+ [ariaLabel]="mock.isActive ? 'Disable mock' : 'Enable mock'"
3700
+ (click)="onToggleMock(mock.id)"
3701
+ />
3702
+ <ndt-button
3703
+ variant="icon"
3704
+ icon="trash"
3705
+ ariaLabel="Remove mock"
3706
+ (click)="onRemoveMock(mock.id)"
3707
+ />
3708
+ </div>
3709
+ </div>
3710
+ }
3711
+ </div>
3712
+ } @if (isMockingEnabled()) {
3713
+ <div class="status">
3714
+ <p>✅ Network mocking is active</p>
3715
+ </div>
3716
+ }
3717
+ </div>
3718
+ </ndt-toolbar-tool>
3719
+ `, isInline: true, styles: [".container{display:flex;flex-direction:column;height:100%;gap:var(--ndt-spacing-md);padding:var(--ndt-spacing-md)}.header{text-align:center;flex-shrink:0}.header h3{margin:0 0 var(--ndt-spacing-sm) 0;font-size:var(--ndt-font-size-lg);color:var(--ndt-text-primary);font-weight:600}.header p{margin:0;font-size:var(--ndt-font-size-sm);color:var(--ndt-text-muted)}.form{display:flex;flex-direction:column;gap:var(--ndt-spacing-sm);flex-shrink:0;padding:var(--ndt-spacing-md);background:var(--ndt-background-secondary);border:1px solid var(--ndt-border-primary);border-radius:var(--ndt-border-radius-medium)}.form-row{display:flex;gap:var(--ndt-spacing-sm)}.form-row ndt-input{flex:1}.form-row ndt-select{flex:0 0 120px}.actions{display:flex;gap:var(--ndt-spacing-sm);margin-top:var(--ndt-spacing-sm)}.empty{display:flex;align-items:center;justify-content:center;flex:1;color:var(--ndt-text-muted);text-align:center;font-size:var(--ndt-font-size-sm)}.mocks-list{display:flex;flex-direction:column;gap:var(--ndt-spacing-sm);flex:1;min-height:0;overflow-y:auto}.mocks-list h4{margin:0 0 var(--ndt-spacing-sm) 0;font-size:var(--ndt-font-size-md);color:var(--ndt-text-primary);font-weight:600}.mocks-list::-webkit-scrollbar{width:8px}.mocks-list::-webkit-scrollbar-track{background:var(--ndt-background-secondary);border-radius:4px}.mocks-list::-webkit-scrollbar-thumb{background:var(--ndt-border-primary);border-radius:4px}:is():hover{background:var(--ndt-hover-bg)}.mock-item{display:flex;align-items:center;gap:var(--ndt-spacing-sm);padding:var(--ndt-spacing-sm);background:var(--ndt-background-secondary);border:1px solid var(--ndt-border-primary);border-radius:var(--ndt-border-radius-small)}.mock-item .mock-info{flex:1;display:flex;align-items:center;gap:var(--ndt-spacing-sm)}.mock-item .mock-method{font-weight:600;font-size:var(--ndt-font-size-xs);color:var(--ndt-primary);background:var(--ndt-primary-background);padding:2px 6px;border-radius:var(--ndt-border-radius-small);min-width:40px;text-align:center}.mock-item .mock-url{flex:1;font-size:var(--ndt-font-size-sm);color:var(--ndt-text-primary);font-family:monospace}.mock-item .mock-status{font-size:var(--ndt-font-size-xs);color:var(--ndt-text-muted);min-width:30px;text-align:center}.mock-item .mock-actions{display:flex;gap:var(--ndt-spacing-xs)}.status{text-align:center;padding:var(--ndt-spacing-sm) var(--ndt-spacing-md);background:var(--ndt-success-background);border:1px solid var(--ndt-success-border);border-radius:var(--ndt-border-radius-small);color:var(--ndt-success-text);font-size:var(--ndt-font-size-sm);flex-shrink:0}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "component", type: DevToolbarToolComponent, selector: "ndt-toolbar-tool", inputs: ["options", "icon", "title"] }, { kind: "component", type: DevToolbarButtonComponent, selector: "ndt-button", inputs: ["type", "variant", "icon", "label", "ariaLabel", "isActive"] }, { kind: "component", type: DevToolbarInputComponent, selector: "ndt-input", inputs: ["value", "type", "placeholder", "ariaLabel", "inputClass"], outputs: ["valueChange"] }, { kind: "component", type: DevToolbarSelectComponent, selector: "ndt-select", inputs: ["value", "options", "ariaLabel", "label", "size"], outputs: ["valueChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
3720
+ }
3721
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: DevToolbarNetworkMockerToolComponent, decorators: [{
3722
+ type: Component,
3723
+ args: [{ selector: 'ndt-network-mocker-tool', standalone: true, imports: [
3724
+ FormsModule,
3725
+ DevToolbarToolComponent,
3726
+ DevToolbarButtonComponent,
3727
+ DevToolbarInputComponent,
3728
+ DevToolbarSelectComponent,
3729
+ ], template: `
3730
+ <ndt-toolbar-tool [options]="options" title="Network Mocker" icon="network">
3731
+ <div class="container">
3732
+ <div class="header">
3733
+ <h3>Mock Network Requests</h3>
3734
+ <p>Intercept and mock HTTP requests for testing and development.</p>
3735
+ </div>
3736
+
3737
+ <div class="form">
3738
+ <div class="form-row">
3739
+ <ndt-input
3740
+ [(value)]="newMockUrl"
3741
+ placeholder="Enter URL pattern (e.g., /api/users/*)"
3742
+ ariaLabel="Mock URL"
3743
+ />
3744
+ <ndt-select
3745
+ [(value)]="newMockMethod"
3746
+ [options]="httpMethods"
3747
+ size="small"
3748
+ ariaLabel="HTTP Method"
3749
+ />
3750
+ </div>
3751
+
3752
+ <div class="form-row">
3753
+ <ndt-input
3754
+ [(value)]="newMockStatus"
3755
+ placeholder="Status code (default: 200)"
3756
+ type="number"
3757
+ ariaLabel="Status Code"
3758
+ />
3759
+ <ndt-input
3760
+ [(value)]="newMockResponse"
3761
+ placeholder="Response JSON (optional)"
3762
+ ariaLabel="Response JSON"
3763
+ />
3764
+ </div>
3765
+
3766
+ <div class="actions">
3767
+ <ndt-button label="Add Mock" icon="import" (click)="onAddMock()" />
3768
+ <ndt-button
3769
+ [label]="
3770
+ isMockingEnabled() ? 'Disable Mocking' : 'Enable Mocking'
3771
+ "
3772
+ [icon]="isMockingEnabled() ? 'trash' : 'network'"
3773
+ (click)="onToggleMocking()"
3774
+ />
3775
+ </div>
3776
+ </div>
3777
+
3778
+ @if (hasNoMocks()) {
3779
+ <div class="empty">
3780
+ <p>No mock requests configured. Add your first mock above.</p>
3781
+ </div>
3782
+ } @else {
3783
+ <div class="mocks-list">
3784
+ <h4>Configured Mocks</h4>
3785
+ @for (mock of mockRequests(); track mock.id) {
3786
+ <div class="mock-item">
3787
+ <div class="mock-info">
3788
+ <div class="mock-method">{{ mock.method }}</div>
3789
+ <div class="mock-url">{{ mock.url }}</div>
3790
+ <div class="mock-status">{{ mock.status }}</div>
3791
+ </div>
3792
+ <div class="mock-actions">
3793
+ <ndt-button
3794
+ variant="icon"
3795
+ [icon]="mock.isActive ? 'star' : 'moon'"
3796
+ [ariaLabel]="mock.isActive ? 'Disable mock' : 'Enable mock'"
3797
+ (click)="onToggleMock(mock.id)"
3798
+ />
3799
+ <ndt-button
3800
+ variant="icon"
3801
+ icon="trash"
3802
+ ariaLabel="Remove mock"
3803
+ (click)="onRemoveMock(mock.id)"
3804
+ />
3805
+ </div>
3806
+ </div>
3807
+ }
3808
+ </div>
3809
+ } @if (isMockingEnabled()) {
3810
+ <div class="status">
3811
+ <p>✅ Network mocking is active</p>
3812
+ </div>
3813
+ }
3814
+ </div>
3815
+ </ndt-toolbar-tool>
3816
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".container{display:flex;flex-direction:column;height:100%;gap:var(--ndt-spacing-md);padding:var(--ndt-spacing-md)}.header{text-align:center;flex-shrink:0}.header h3{margin:0 0 var(--ndt-spacing-sm) 0;font-size:var(--ndt-font-size-lg);color:var(--ndt-text-primary);font-weight:600}.header p{margin:0;font-size:var(--ndt-font-size-sm);color:var(--ndt-text-muted)}.form{display:flex;flex-direction:column;gap:var(--ndt-spacing-sm);flex-shrink:0;padding:var(--ndt-spacing-md);background:var(--ndt-background-secondary);border:1px solid var(--ndt-border-primary);border-radius:var(--ndt-border-radius-medium)}.form-row{display:flex;gap:var(--ndt-spacing-sm)}.form-row ndt-input{flex:1}.form-row ndt-select{flex:0 0 120px}.actions{display:flex;gap:var(--ndt-spacing-sm);margin-top:var(--ndt-spacing-sm)}.empty{display:flex;align-items:center;justify-content:center;flex:1;color:var(--ndt-text-muted);text-align:center;font-size:var(--ndt-font-size-sm)}.mocks-list{display:flex;flex-direction:column;gap:var(--ndt-spacing-sm);flex:1;min-height:0;overflow-y:auto}.mocks-list h4{margin:0 0 var(--ndt-spacing-sm) 0;font-size:var(--ndt-font-size-md);color:var(--ndt-text-primary);font-weight:600}.mocks-list::-webkit-scrollbar{width:8px}.mocks-list::-webkit-scrollbar-track{background:var(--ndt-background-secondary);border-radius:4px}.mocks-list::-webkit-scrollbar-thumb{background:var(--ndt-border-primary);border-radius:4px}:is():hover{background:var(--ndt-hover-bg)}.mock-item{display:flex;align-items:center;gap:var(--ndt-spacing-sm);padding:var(--ndt-spacing-sm);background:var(--ndt-background-secondary);border:1px solid var(--ndt-border-primary);border-radius:var(--ndt-border-radius-small)}.mock-item .mock-info{flex:1;display:flex;align-items:center;gap:var(--ndt-spacing-sm)}.mock-item .mock-method{font-weight:600;font-size:var(--ndt-font-size-xs);color:var(--ndt-primary);background:var(--ndt-primary-background);padding:2px 6px;border-radius:var(--ndt-border-radius-small);min-width:40px;text-align:center}.mock-item .mock-url{flex:1;font-size:var(--ndt-font-size-sm);color:var(--ndt-text-primary);font-family:monospace}.mock-item .mock-status{font-size:var(--ndt-font-size-xs);color:var(--ndt-text-muted);min-width:30px;text-align:center}.mock-item .mock-actions{display:flex;gap:var(--ndt-spacing-xs)}.status{text-align:center;padding:var(--ndt-spacing-sm) var(--ndt-spacing-md);background:var(--ndt-success-background);border:1px solid var(--ndt-success-border);border-radius:var(--ndt-border-radius-small);color:var(--ndt-success-text);font-size:var(--ndt-font-size-sm);flex-shrink:0}\n"] }]
3817
+ }] });
3818
+
3819
+ class DevToolbarInternalPermissionsService {
3820
+ constructor() {
3821
+ this.STORAGE_KEY = 'permissions';
3822
+ this.storageService = inject(DevToolsStorageService);
3823
+ this.appPermissions$ = new BehaviorSubject([]);
3824
+ this.forcedStateSubject = new BehaviorSubject({
3825
+ granted: [],
3826
+ denied: [],
3827
+ });
3828
+ this.forcedState$ = this.forcedStateSubject.asObservable();
3829
+ this.permissions$ = combineLatest([
3830
+ this.appPermissions$,
3831
+ this.forcedState$,
3832
+ ]).pipe(map(([appPermissions, { granted, denied }]) => {
3833
+ return appPermissions.map((permission) => ({
3834
+ ...permission,
3835
+ isForced: granted.includes(permission.id) || denied.includes(permission.id),
3836
+ isGranted: granted.includes(permission.id)
3837
+ ? true
3838
+ : denied.includes(permission.id)
3839
+ ? false
3840
+ : permission.isGranted,
3841
+ }));
3842
+ }));
3843
+ this.permissions = toSignal(this.permissions$, { initialValue: [] });
3844
+ this.loadForcedState();
3845
+ }
3846
+ setAppPermissions(permissions) {
3847
+ this.appPermissions$.next(permissions);
3848
+ this.validateAndCleanForcedState(permissions);
3849
+ }
3850
+ setPermission(id, granted) {
3851
+ const { granted: grantedIds, denied: deniedIds } = this.forcedStateSubject.value;
3852
+ const newGranted = grantedIds.filter((permId) => permId !== id);
3853
+ const newDenied = deniedIds.filter((permId) => permId !== id);
3854
+ if (granted) {
3855
+ newGranted.push(id);
3856
+ }
3857
+ else {
3858
+ newDenied.push(id);
3859
+ }
3860
+ const newState = { granted: newGranted, denied: newDenied };
3861
+ this.forcedStateSubject.next(newState);
3862
+ this.storageService.set(this.STORAGE_KEY, newState);
3863
+ }
3864
+ removePermissionOverride(id) {
3865
+ const { granted, denied } = this.forcedStateSubject.value;
3866
+ const newState = {
3867
+ granted: granted.filter((permId) => permId !== id),
3868
+ denied: denied.filter((permId) => permId !== id),
3869
+ };
3870
+ this.forcedStateSubject.next(newState);
3871
+ this.storageService.set(this.STORAGE_KEY, newState);
3872
+ }
3873
+ getForcedPermissions() {
3874
+ return this.permissions$.pipe(map((permissions) => permissions.filter((permission) => permission.isForced)));
3875
+ }
3876
+ /**
3877
+ * Apply a preset permissions state, replacing the current forced state.
3878
+ * Useful for automated testing or restoring saved configurations.
3879
+ * @param state The preset forced permissions state to apply
3880
+ */
3881
+ applyPresetPermissions(state) {
3882
+ this.forcedStateSubject.next(state);
3883
+ this.storageService.set(this.STORAGE_KEY, state);
3884
+ }
3885
+ /**
3886
+ * Get the current forced permissions state.
3887
+ * Returns a deep copy to prevent external mutations.
3888
+ * @returns Current forced permissions state
3889
+ */
3890
+ getCurrentForcedState() {
3891
+ const currentState = this.forcedStateSubject.value;
3892
+ return {
3893
+ granted: [...currentState.granted],
3894
+ denied: [...currentState.denied],
3895
+ };
3896
+ }
3897
+ loadForcedState() {
3898
+ try {
3899
+ const savedState = this.storageService.get(this.STORAGE_KEY);
3900
+ if (savedState && this.isValidForcedState(savedState)) {
3901
+ this.forcedStateSubject.next(savedState);
3902
+ }
3903
+ }
3904
+ catch (error) {
3905
+ console.warn('Error loading forced permissions state from localStorage:', error);
3906
+ }
3907
+ }
3908
+ isValidForcedState(state) {
3909
+ return (state &&
3910
+ typeof state === 'object' &&
3911
+ Array.isArray(state.granted) &&
3912
+ Array.isArray(state.denied));
3913
+ }
3914
+ validateAndCleanForcedState(permissions) {
3915
+ const currentState = this.forcedStateSubject.value;
3916
+ const validIds = new Set(permissions.map((p) => p.id));
3917
+ const cleanedGranted = currentState.granted.filter((id) => validIds.has(id));
3918
+ const cleanedDenied = currentState.denied.filter((id) => validIds.has(id));
3919
+ const hasInvalidIds = cleanedGranted.length !== currentState.granted.length ||
3920
+ cleanedDenied.length !== currentState.denied.length;
3921
+ if (hasInvalidIds) {
3922
+ const cleanedState = {
3923
+ granted: cleanedGranted,
3924
+ denied: cleanedDenied,
3925
+ };
3926
+ this.forcedStateSubject.next(cleanedState);
3927
+ this.storageService.set(this.STORAGE_KEY, cleanedState);
3928
+ const invalidIds = [
3929
+ ...currentState.granted.filter((id) => !validIds.has(id)),
3930
+ ...currentState.denied.filter((id) => !validIds.has(id)),
3931
+ ];
3932
+ if (invalidIds.length > 0) {
3933
+ console.warn('Removed invalid permission IDs from forced state:', invalidIds);
3934
+ }
3935
+ }
3936
+ }
3937
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: DevToolbarInternalPermissionsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
3938
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: DevToolbarInternalPermissionsService, providedIn: 'root' }); }
3939
+ }
3940
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: DevToolbarInternalPermissionsService, decorators: [{
3941
+ type: Injectable,
3942
+ args: [{ providedIn: 'root' }]
3943
+ }], ctorParameters: () => [] });
3944
+
3945
+ class DevToolbarPermissionsToolComponent {
3946
+ constructor() {
3947
+ // Injects
3948
+ this.permissionsService = inject(DevToolbarInternalPermissionsService);
3949
+ // Signals
3950
+ this.activeFilter = signal('all');
3951
+ this.searchQuery = signal('');
3952
+ this.permissions = this.permissionsService.permissions;
3953
+ this.hasNoPermissions = computed(() => this.permissions().length === 0);
3954
+ this.filteredPermissions = computed(() => {
3955
+ return this.permissions().filter((permission) => {
3956
+ const searchTerm = this.searchQuery().toLowerCase();
3957
+ const permissionName = permission.name.toLowerCase();
3958
+ const permissionDescription = permission.description?.toLowerCase() ?? '';
3959
+ const matchesSearch = !this.searchQuery() ||
3960
+ permissionName.includes(searchTerm) ||
3961
+ permissionDescription.includes(searchTerm);
3962
+ const matchesFilter = this.activeFilter() === 'all' ||
3963
+ (this.activeFilter() === 'forced' && permission.isForced) ||
3964
+ (this.activeFilter() === 'granted' && permission.isGranted) ||
3965
+ (this.activeFilter() === 'denied' && !permission.isGranted);
3966
+ return matchesSearch && matchesFilter;
3967
+ });
3968
+ });
3969
+ this.hasNoFilteredPermissions = computed(() => this.filteredPermissions().length === 0);
3970
+ // Other properties
3971
+ this.options = {
3972
+ title: 'Permissions',
3973
+ description: 'Manage permission overrides for your current session',
3974
+ isClosable: true,
3975
+ size: 'tall',
3976
+ id: 'ndt-permissions',
3977
+ isBeta: true,
3978
+ };
3979
+ this.filterOptions = [
3980
+ { value: 'all', label: 'All Permissions' },
3981
+ { value: 'forced', label: 'Forced' },
3982
+ { value: 'granted', label: 'Granted' },
3983
+ { value: 'denied', label: 'Denied' },
3984
+ ];
3985
+ this.permissionValueOptions = [
3986
+ { value: 'not-forced', label: 'Not Forced' },
3987
+ { value: 'denied', label: 'Forced Denied' },
3988
+ { value: 'granted', label: 'Forced Granted' },
3989
+ ];
3990
+ }
3991
+ // Public methods
3992
+ onFilterChange(value) {
3993
+ const filter = this.filterOptions.find((f) => f.value === value);
3994
+ if (filter) {
3995
+ this.activeFilter.set(filter.value);
3996
+ }
3997
+ }
3998
+ onPermissionChange(id, value) {
3999
+ switch (value) {
4000
+ case 'not-forced':
4001
+ this.permissionsService.removePermissionOverride(id);
4002
+ break;
4003
+ case 'granted':
4004
+ this.permissionsService.setPermission(id, true);
4005
+ break;
4006
+ case 'denied':
4007
+ this.permissionsService.setPermission(id, false);
4008
+ break;
4009
+ }
4010
+ }
4011
+ onSearchChange(query) {
4012
+ this.searchQuery.set(query);
4013
+ }
4014
+ // Protected methods
4015
+ getPermissionValue(permission) {
4016
+ if (!permission.isForced)
4017
+ return '';
4018
+ return permission.isGranted ? 'granted' : 'denied';
4019
+ }
4020
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: DevToolbarPermissionsToolComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
4021
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.5", type: DevToolbarPermissionsToolComponent, isStandalone: true, selector: "ndt-permissions-tool", ngImport: i0, template: `
4022
+ <ndt-toolbar-tool
4023
+ [options]="options"
4024
+ title="Permissions"
4025
+ icon="lock"
4026
+ >
4027
+ <div class="container">
4028
+ <div class="header">
4029
+ <ndt-input
4030
+ [value]="searchQuery()"
4031
+ (valueChange)="onSearchChange($event)"
4032
+ placeholder="Search permissions..."
4033
+ [ariaLabel]="'Search permissions'"
4034
+ />
4035
+ <div class="filter-wrapper">
4036
+ <ndt-icon name="filter" class="filter-icon" />
4037
+ <ndt-select
4038
+ [value]="activeFilter()"
4039
+ [options]="filterOptions"
4040
+ [size]="'medium'"
4041
+ (valueChange)="onFilterChange($event)"
4042
+ [ariaLabel]="'Filter permissions by state'"
4043
+ />
4044
+ </div>
4045
+ </div>
4046
+
4047
+ @if (hasNoPermissions()) {
4048
+ <div class="empty">
4049
+ <p>No permissions found</p>
4050
+ <p class="hint">Call setAvailableOptions() to configure permissions</p>
4051
+ </div>
4052
+ } @else if (hasNoFilteredPermissions()) {
4053
+ <div class="empty">
4054
+ <p>No permissions match your filter</p>
4055
+ </div>
4056
+ } @else {
4057
+ <div class="permission-list">
4058
+ @for (permission of filteredPermissions(); track permission.id) {
4059
+ <div class="permission">
4060
+ <div class="info">
4061
+ <h3>{{ permission.name }}</h3>
4062
+ <p>{{ permission?.description }}</p>
4063
+ </div>
4064
+
4065
+ <ndt-select
4066
+ [value]="getPermissionValue(permission)"
4067
+ [options]="permissionValueOptions"
4068
+ [ariaLabel]="'Override state for ' + permission.name"
4069
+ (valueChange)="onPermissionChange(permission.id, $event ?? '')"
4070
+ size="small"
4071
+ />
4072
+ </div>
4073
+ }
4074
+ </div>
4075
+ }
4076
+ </div>
4077
+ </ndt-toolbar-tool>
4078
+ `, isInline: true, styles: [".container{display:flex;flex-direction:column;height:100%}.header{flex-shrink:0;display:flex;gap:var(--ndt-spacing-sm);margin-bottom:var(--ndt-spacing-md)}.header ndt-input{flex:.65}.header .filter-wrapper{flex:.35;display:flex;align-items:center;gap:var(--ndt-spacing-xs)}.header .filter-wrapper .filter-icon{width:18px;height:18px;flex-shrink:0;opacity:.6}.header .filter-wrapper ndt-select{flex:1}.empty{display:flex;flex-direction:column;gap:var(--ndt-spacing-md);flex:1;min-height:0;justify-content:center;align-items:center;border:1px solid var(--ndt-warning-border);border-radius:var(--ndt-border-radius-medium);padding:var(--ndt-spacing-md);background:var(--ndt-warning-background);color:var(--ndt-text-muted)}.empty p{margin:0}.empty .hint{font-size:var(--ndt-font-size-xs)}.permission-list{display:flex;flex-direction:column;gap:var(--ndt-spacing-md);flex:1;min-height:0;overflow-y:auto;padding-right:var(--ndt-spacing-sm);scrollbar-width:thin;scrollbar-color:var(--ndt-border-primary) var(--ndt-background-secondary)}.permission-list::-webkit-scrollbar{width:8px}.permission-list::-webkit-scrollbar-track{background:var(--ndt-background-secondary);border-radius:4px}.permission-list::-webkit-scrollbar-thumb{background:var(--ndt-border-primary);border-radius:4px}:is():hover{background:var(--ndt-hover-bg)}.permission{display:flex;flex-direction:row;gap:var(--ndt-spacing-sm);background:var(--ndt-background-secondary)}.permission .info{flex:0 0 65%}.permission .info h3{margin:0;font-size:var(--ndt-font-size-md);color:var(--ndt-text-primary)}.permission .info p{font-size:var(--ndt-font-size-xs);color:var(--ndt-text-muted)}.permission ndt-select{flex:0 0 35%}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "component", type: DevToolbarToolComponent, selector: "ndt-toolbar-tool", inputs: ["options", "icon", "title"] }, { kind: "component", type: DevToolbarInputComponent, selector: "ndt-input", inputs: ["value", "type", "placeholder", "ariaLabel", "inputClass"], outputs: ["valueChange"] }, { kind: "component", type: DevToolbarSelectComponent, selector: "ndt-select", inputs: ["value", "options", "ariaLabel", "label", "size"], outputs: ["valueChange"] }, { kind: "component", type: DevToolbarIconComponent, selector: "ndt-icon", inputs: ["name"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
4079
+ }
4080
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: DevToolbarPermissionsToolComponent, decorators: [{
4081
+ type: Component,
4082
+ args: [{ selector: 'ndt-permissions-tool', standalone: true, imports: [
4083
+ FormsModule,
4084
+ DevToolbarToolComponent,
4085
+ DevToolbarInputComponent,
4086
+ DevToolbarSelectComponent,
4087
+ DevToolbarIconComponent,
4088
+ ], template: `
4089
+ <ndt-toolbar-tool
4090
+ [options]="options"
4091
+ title="Permissions"
4092
+ icon="lock"
4093
+ >
4094
+ <div class="container">
4095
+ <div class="header">
4096
+ <ndt-input
4097
+ [value]="searchQuery()"
4098
+ (valueChange)="onSearchChange($event)"
4099
+ placeholder="Search permissions..."
4100
+ [ariaLabel]="'Search permissions'"
4101
+ />
4102
+ <div class="filter-wrapper">
4103
+ <ndt-icon name="filter" class="filter-icon" />
4104
+ <ndt-select
4105
+ [value]="activeFilter()"
4106
+ [options]="filterOptions"
4107
+ [size]="'medium'"
4108
+ (valueChange)="onFilterChange($event)"
4109
+ [ariaLabel]="'Filter permissions by state'"
4110
+ />
4111
+ </div>
4112
+ </div>
4113
+
4114
+ @if (hasNoPermissions()) {
4115
+ <div class="empty">
4116
+ <p>No permissions found</p>
4117
+ <p class="hint">Call setAvailableOptions() to configure permissions</p>
4118
+ </div>
4119
+ } @else if (hasNoFilteredPermissions()) {
4120
+ <div class="empty">
4121
+ <p>No permissions match your filter</p>
4122
+ </div>
4123
+ } @else {
4124
+ <div class="permission-list">
4125
+ @for (permission of filteredPermissions(); track permission.id) {
4126
+ <div class="permission">
4127
+ <div class="info">
4128
+ <h3>{{ permission.name }}</h3>
4129
+ <p>{{ permission?.description }}</p>
4130
+ </div>
4131
+
4132
+ <ndt-select
4133
+ [value]="getPermissionValue(permission)"
4134
+ [options]="permissionValueOptions"
4135
+ [ariaLabel]="'Override state for ' + permission.name"
4136
+ (valueChange)="onPermissionChange(permission.id, $event ?? '')"
4137
+ size="small"
4138
+ />
4139
+ </div>
4140
+ }
4141
+ </div>
4142
+ }
4143
+ </div>
4144
+ </ndt-toolbar-tool>
4145
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".container{display:flex;flex-direction:column;height:100%}.header{flex-shrink:0;display:flex;gap:var(--ndt-spacing-sm);margin-bottom:var(--ndt-spacing-md)}.header ndt-input{flex:.65}.header .filter-wrapper{flex:.35;display:flex;align-items:center;gap:var(--ndt-spacing-xs)}.header .filter-wrapper .filter-icon{width:18px;height:18px;flex-shrink:0;opacity:.6}.header .filter-wrapper ndt-select{flex:1}.empty{display:flex;flex-direction:column;gap:var(--ndt-spacing-md);flex:1;min-height:0;justify-content:center;align-items:center;border:1px solid var(--ndt-warning-border);border-radius:var(--ndt-border-radius-medium);padding:var(--ndt-spacing-md);background:var(--ndt-warning-background);color:var(--ndt-text-muted)}.empty p{margin:0}.empty .hint{font-size:var(--ndt-font-size-xs)}.permission-list{display:flex;flex-direction:column;gap:var(--ndt-spacing-md);flex:1;min-height:0;overflow-y:auto;padding-right:var(--ndt-spacing-sm);scrollbar-width:thin;scrollbar-color:var(--ndt-border-primary) var(--ndt-background-secondary)}.permission-list::-webkit-scrollbar{width:8px}.permission-list::-webkit-scrollbar-track{background:var(--ndt-background-secondary);border-radius:4px}.permission-list::-webkit-scrollbar-thumb{background:var(--ndt-border-primary);border-radius:4px}:is():hover{background:var(--ndt-hover-bg)}.permission{display:flex;flex-direction:row;gap:var(--ndt-spacing-sm);background:var(--ndt-background-secondary)}.permission .info{flex:0 0 65%}.permission .info h3{margin:0;font-size:var(--ndt-font-size-md);color:var(--ndt-text-primary)}.permission .info p{font-size:var(--ndt-font-size-xs);color:var(--ndt-text-muted)}.permission ndt-select{flex:0 0 35%}\n"] }]
4146
+ }] });
4147
+
4148
+ class DevToolbarComponent {
4149
+ constructor() {
4150
+ this.state = inject(DevToolbarStateService);
4151
+ this.destroyRef = inject(DestroyRef);
4152
+ this.settingsService = inject(SettingsService);
4153
+ this.isDevMode = isDevMode();
4154
+ this.keyboardShortcut = fromEvent(window, 'keydown')
4155
+ .pipe(filter((event) => event.ctrlKey && event.shiftKey && event.key === 'D'), takeUntilDestroyed(this.destroyRef))
4156
+ .subscribe(() => this.toggleDevTools());
4157
+ this.mouseLeave = fromEvent(document, 'mouseleave')
4158
+ .pipe(throttleTime(3000), takeUntilDestroyed(this.destroyRef))
4159
+ .subscribe(() => this.onMouseLeave());
4160
+ }
4161
+ ngOnInit() {
4162
+ const settings = this.settingsService.getSettings();
4163
+ this.state.setTheme(settings.isDarkMode ? 'dark' : 'light');
4164
+ }
4165
+ onMouseEnter() {
4166
+ this.state.setVisibility(true);
4167
+ }
4168
+ onMouseLeave() {
4169
+ setTimeout(() => this.state.setVisibility(false), this.state.delay());
4170
+ }
4171
+ toggleDevTools() {
4172
+ this.state.setVisibility(!this.state.isVisible());
4173
+ }
4174
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: DevToolbarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
4175
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.5", type: DevToolbarComponent, isStandalone: true, selector: "ndt-toolbar", ngImport: i0, template: `
4176
+ @if (isDevMode) {
4177
+ <div
4178
+ aria-label="Developer tools"
4179
+ role="toolbar"
4180
+ class="dev-toolbar"
4181
+ [@toolbarState]="state.isVisible() ? 'visible' : 'hidden'"
4182
+ [attr.data-theme]="state.theme()"
4183
+ [class.dev-toolbar--active]="state.isVisible()"
4184
+ (mouseenter)="onMouseEnter()"
4185
+ >
4186
+ <ndt-home-tool />
4187
+ <ndt-language-tool />
4188
+ <ndt-feature-flags-tool />
4189
+ <ndt-app-features-tool />
4190
+ <ndt-permissions-tool />
4191
+ <ndt-network-mocker-tool />
4192
+ <ng-content />
4193
+ </div>
4194
+ }
4195
+ `, isInline: true, styles: [".dev-toolbar{--ndt-border-radius-small: 4px;--ndt-border-radius-medium: 8px;--ndt-border-radius-large: 12px;--ndt-transition-default: all .2s ease-out;--ndt-transition-smooth: all .2s ease-in-out;--ndt-bg-primary: rgb(255, 255, 255);--ndt-bg-gradient: linear-gradient(180deg, rgb(243, 244, 246) 0%, rgba(243, 244, 246, .88) 100%);--ndt-text-primary: rgb(17, 24, 39);--ndt-text-secondary: rgb(55, 65, 81);--ndt-text-muted: rgb(107, 114, 128);--ndt-border-primary: #e5e7eb;--ndt-border-subtle: rgba(17, 24, 39, .1);--ndt-hover-bg: rgba(17, 24, 39, .05);--ndt-hover-danger: rgb(239, 68, 68);--ndt-shadow-toolbar: 0 2px 8px rgba(156, 163, 175, .2);--ndt-shadow-tooltip: 0 0 0 1px rgba(17, 24, 39, .05), 0 4px 8px rgba(107, 114, 128, .15), 0 2px 4px rgba(107, 114, 128, .1);--ndt-shadow-window: 0px 0px 0px 0px rgba(156, 163, 175, .1), 0px 1px 2px 0px rgba(156, 163, 175, .12), 0px 4px 4px 0px rgba(156, 163, 175, .1), 0px 10px 6px 0px rgba(156, 163, 175, .08), 0px 17px 7px 0px rgba(156, 163, 175, .05), 0px 26px 7px 0px rgba(156, 163, 175, .02);--ndt-spacing-xs: 4px;--ndt-spacing-sm: 8px;--ndt-spacing-md: 16px;--ndt-window-padding: 24px;--ndt-font-size-xs: .75rem;--ndt-font-size-sm: .875rem;--ndt-font-size-md: 1rem;--ndt-font-size-lg: 1.25rem;--ndt-font-size-xl: 2rem;--ndt-background-secondary: var(--ndt-bg-primary);--ndt-background-hover: var(--ndt-hover-bg);--ndt-primary: #df30d4;--ndt-primary-rgb: 223, 48, 212;--ndt-text-on-primary: rgb(255, 255, 255);--ndt-border-color: var(--ndt-border-primary);--ndt-note-background: rgb(219, 234, 254);--ndt-note-border: rgba(37, 99, 235, .2);--ndt-warning-background: rgb(254, 249, 195);--ndt-warning-border: rgba(202, 138, 4, .2);--ndt-error-background: rgb(254, 226, 226);--ndt-error-border: rgba(220, 38, 38, .2)}.dev-toolbar[data-theme=dark]{--ndt-bg-primary: rgb(17, 24, 39);--ndt-bg-gradient: linear-gradient(180deg, rgb(19, 21, 26) 0%, rgba(19, 21, 26, .88) 100%);--ndt-text-primary: rgb(255, 255, 255);--ndt-text-secondary: rgb(229, 231, 235);--ndt-text-muted: rgb(156, 163, 175);--ndt-border-primary: #343841;--ndt-border-subtle: rgba(255, 255, 255, .1);--ndt-hover-bg: rgba(255, 255, 255, .12);--ndt-hover-danger: rgb(220, 38, 38);--ndt-shadow-toolbar: 0 2px 8px rgba(19, 21, 26, .3);--ndt-shadow-tooltip: 0 0 0 1px rgba(255, 255, 255, .1), 0 4px 8px rgba(0, 0, 0, .4), 0 2px 4px rgba(0, 0, 0, .3);--ndt-shadow-window: 0px 0px 0px 0px rgba(19, 21, 26, .3), 0px 1px 2px 0px rgba(19, 21, 26, .29), 0px 4px 4px 0px rgba(19, 21, 26, .26), 0px 10px 6px 0px rgba(19, 21, 26, .15), 0px 17px 7px 0px rgba(19, 21, 26, .04), 0px 26px 7px 0px rgba(19, 21, 26, .01);--ndt-note-background: rgba(37, 99, 235, .15);--ndt-note-border: rgba(37, 99, 235, .3);--ndt-warning-background: rgba(202, 138, 4, .15);--ndt-warning-border: rgba(202, 138, 4, .3);--ndt-error-background: rgba(220, 38, 38, .15);--ndt-error-border: rgba(220, 38, 38, .3)}.dev-toolbar h1,.dev-toolbar h2,.dev-toolbar h3,.dev-toolbar h4,.dev-toolbar h5{font-weight:600;color:var(--ndt-text-primary);margin:0}.dev-toolbar h1{font-size:var(--ndt-font-size-xl)}.dev-toolbar h2{font-size:var(--ndt-font-size-lg)}.dev-toolbar h3{font-size:var(--ndt-font-size-md)}.dev-toolbar h4{font-size:var(--ndt-font-size-sm)}.dev-toolbar h5{font-size:var(--ndt-font-size-xs)}.dev-toolbar hr{border:1px solid var(--ndt-border-subtle);margin:1em 0}.dev-toolbar p{line-height:1.5em;margin:0}.dev-toolbar{position:fixed;bottom:0;left:50%;z-index:999999;transform:translate(-50%);display:flex;pointer-events:auto;background:var(--ndt-bg-primary);border:1px solid var(--ndt-border-primary);border-radius:9999px;box-shadow:var(--ndt-shadow-toolbar);height:40px;overflow:hidden}.dev-toolbar--active{opacity:1}\n"], dependencies: [{ kind: "component", type: DevToolbarHomeToolComponent, selector: "ndt-home-tool", inputs: ["badge"] }, { kind: "component", type: DevToolbarLanguageToolComponent, selector: "ndt-language-tool" }, { kind: "component", type: DevToolbarFeatureFlagsToolComponent, selector: "ndt-feature-flags-tool" }, { kind: "component", type: DevToolbarAppFeaturesToolComponent, selector: "ndt-app-features-tool" }, { kind: "component", type: DevToolbarNetworkMockerToolComponent, selector: "ndt-network-mocker-tool" }, { kind: "component", type: DevToolbarPermissionsToolComponent, selector: "ndt-permissions-tool" }], animations: [
4196
+ trigger('toolbarState', [
4197
+ state('hidden', style({
4198
+ transform: 'translate(-50%, calc(100% + -1.2rem))',
4199
+ })),
4200
+ state('visible', style({
4201
+ transform: 'translate(-50%, -1rem)',
4202
+ })),
4203
+ transition('hidden <=> visible', [
4204
+ animate('300ms cubic-bezier(0.4, 0, 0.2, 1)'),
4205
+ ]),
4206
+ ]),
4207
+ ] }); }
4208
+ }
4209
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: DevToolbarComponent, decorators: [{
4210
+ type: Component,
4211
+ args: [{ standalone: true, selector: 'ndt-toolbar', imports: [
4212
+ DevToolbarHomeToolComponent,
4213
+ DevToolbarLanguageToolComponent,
4214
+ DevToolbarFeatureFlagsToolComponent,
4215
+ DevToolbarAppFeaturesToolComponent,
4216
+ DevToolbarNetworkMockerToolComponent,
4217
+ DevToolbarPermissionsToolComponent,
4218
+ ], template: `
4219
+ @if (isDevMode) {
4220
+ <div
4221
+ aria-label="Developer tools"
4222
+ role="toolbar"
4223
+ class="dev-toolbar"
4224
+ [@toolbarState]="state.isVisible() ? 'visible' : 'hidden'"
4225
+ [attr.data-theme]="state.theme()"
4226
+ [class.dev-toolbar--active]="state.isVisible()"
4227
+ (mouseenter)="onMouseEnter()"
4228
+ >
4229
+ <ndt-home-tool />
4230
+ <ndt-language-tool />
4231
+ <ndt-feature-flags-tool />
4232
+ <ndt-app-features-tool />
4233
+ <ndt-permissions-tool />
4234
+ <ndt-network-mocker-tool />
4235
+ <ng-content />
4236
+ </div>
4237
+ }
4238
+ `, animations: [
4239
+ trigger('toolbarState', [
4240
+ state('hidden', style({
4241
+ transform: 'translate(-50%, calc(100% + -1.2rem))',
4242
+ })),
4243
+ state('visible', style({
4244
+ transform: 'translate(-50%, -1rem)',
4245
+ })),
4246
+ transition('hidden <=> visible', [
4247
+ animate('300ms cubic-bezier(0.4, 0, 0.2, 1)'),
4248
+ ]),
4249
+ ]),
4250
+ ], styles: [".dev-toolbar{--ndt-border-radius-small: 4px;--ndt-border-radius-medium: 8px;--ndt-border-radius-large: 12px;--ndt-transition-default: all .2s ease-out;--ndt-transition-smooth: all .2s ease-in-out;--ndt-bg-primary: rgb(255, 255, 255);--ndt-bg-gradient: linear-gradient(180deg, rgb(243, 244, 246) 0%, rgba(243, 244, 246, .88) 100%);--ndt-text-primary: rgb(17, 24, 39);--ndt-text-secondary: rgb(55, 65, 81);--ndt-text-muted: rgb(107, 114, 128);--ndt-border-primary: #e5e7eb;--ndt-border-subtle: rgba(17, 24, 39, .1);--ndt-hover-bg: rgba(17, 24, 39, .05);--ndt-hover-danger: rgb(239, 68, 68);--ndt-shadow-toolbar: 0 2px 8px rgba(156, 163, 175, .2);--ndt-shadow-tooltip: 0 0 0 1px rgba(17, 24, 39, .05), 0 4px 8px rgba(107, 114, 128, .15), 0 2px 4px rgba(107, 114, 128, .1);--ndt-shadow-window: 0px 0px 0px 0px rgba(156, 163, 175, .1), 0px 1px 2px 0px rgba(156, 163, 175, .12), 0px 4px 4px 0px rgba(156, 163, 175, .1), 0px 10px 6px 0px rgba(156, 163, 175, .08), 0px 17px 7px 0px rgba(156, 163, 175, .05), 0px 26px 7px 0px rgba(156, 163, 175, .02);--ndt-spacing-xs: 4px;--ndt-spacing-sm: 8px;--ndt-spacing-md: 16px;--ndt-window-padding: 24px;--ndt-font-size-xs: .75rem;--ndt-font-size-sm: .875rem;--ndt-font-size-md: 1rem;--ndt-font-size-lg: 1.25rem;--ndt-font-size-xl: 2rem;--ndt-background-secondary: var(--ndt-bg-primary);--ndt-background-hover: var(--ndt-hover-bg);--ndt-primary: #df30d4;--ndt-primary-rgb: 223, 48, 212;--ndt-text-on-primary: rgb(255, 255, 255);--ndt-border-color: var(--ndt-border-primary);--ndt-note-background: rgb(219, 234, 254);--ndt-note-border: rgba(37, 99, 235, .2);--ndt-warning-background: rgb(254, 249, 195);--ndt-warning-border: rgba(202, 138, 4, .2);--ndt-error-background: rgb(254, 226, 226);--ndt-error-border: rgba(220, 38, 38, .2)}.dev-toolbar[data-theme=dark]{--ndt-bg-primary: rgb(17, 24, 39);--ndt-bg-gradient: linear-gradient(180deg, rgb(19, 21, 26) 0%, rgba(19, 21, 26, .88) 100%);--ndt-text-primary: rgb(255, 255, 255);--ndt-text-secondary: rgb(229, 231, 235);--ndt-text-muted: rgb(156, 163, 175);--ndt-border-primary: #343841;--ndt-border-subtle: rgba(255, 255, 255, .1);--ndt-hover-bg: rgba(255, 255, 255, .12);--ndt-hover-danger: rgb(220, 38, 38);--ndt-shadow-toolbar: 0 2px 8px rgba(19, 21, 26, .3);--ndt-shadow-tooltip: 0 0 0 1px rgba(255, 255, 255, .1), 0 4px 8px rgba(0, 0, 0, .4), 0 2px 4px rgba(0, 0, 0, .3);--ndt-shadow-window: 0px 0px 0px 0px rgba(19, 21, 26, .3), 0px 1px 2px 0px rgba(19, 21, 26, .29), 0px 4px 4px 0px rgba(19, 21, 26, .26), 0px 10px 6px 0px rgba(19, 21, 26, .15), 0px 17px 7px 0px rgba(19, 21, 26, .04), 0px 26px 7px 0px rgba(19, 21, 26, .01);--ndt-note-background: rgba(37, 99, 235, .15);--ndt-note-border: rgba(37, 99, 235, .3);--ndt-warning-background: rgba(202, 138, 4, .15);--ndt-warning-border: rgba(202, 138, 4, .3);--ndt-error-background: rgba(220, 38, 38, .15);--ndt-error-border: rgba(220, 38, 38, .3)}.dev-toolbar h1,.dev-toolbar h2,.dev-toolbar h3,.dev-toolbar h4,.dev-toolbar h5{font-weight:600;color:var(--ndt-text-primary);margin:0}.dev-toolbar h1{font-size:var(--ndt-font-size-xl)}.dev-toolbar h2{font-size:var(--ndt-font-size-lg)}.dev-toolbar h3{font-size:var(--ndt-font-size-md)}.dev-toolbar h4{font-size:var(--ndt-font-size-sm)}.dev-toolbar h5{font-size:var(--ndt-font-size-xs)}.dev-toolbar hr{border:1px solid var(--ndt-border-subtle);margin:1em 0}.dev-toolbar p{line-height:1.5em;margin:0}.dev-toolbar{position:fixed;bottom:0;left:50%;z-index:999999;transform:translate(-50%);display:flex;pointer-events:auto;background:var(--ndt-bg-primary);border:1px solid var(--ndt-border-primary);border-radius:9999px;box-shadow:var(--ndt-shadow-toolbar);height:40px;overflow:hidden}.dev-toolbar--active{opacity:1}\n"] }]
4251
+ }] });
4252
+
4253
+ class DevToolbarFeatureFlagService {
4254
+ constructor() {
4255
+ this.internalService = inject(DevToolbarInternalFeatureFlagService);
4256
+ }
4257
+ /**
4258
+ * Sets the available flags that will be displayed in the tool on the dev toolbar
4259
+ * @param flags The flags to be displayed
4260
+ */
4261
+ setAvailableOptions(flags) {
4262
+ this.internalService.setAppFlags(flags);
4263
+ }
4264
+ /**
4265
+ * Gets the flags that were forced/modified through the tool on the dev toolbar
4266
+ * @returns Observable of forced flags array
4267
+ */
4268
+ getForcedValues() {
4269
+ return this.internalService.getForcedFlags();
4270
+ }
4271
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: DevToolbarFeatureFlagService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
4272
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: DevToolbarFeatureFlagService, providedIn: 'root' }); }
4273
+ }
4274
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: DevToolbarFeatureFlagService, decorators: [{
4275
+ type: Injectable,
4276
+ args: [{ providedIn: 'root' }]
4277
+ }] });
4278
+
4279
+ class DevToolbarLanguageService {
4280
+ constructor() {
4281
+ this.internalService = inject(DevToolbarInternalLanguageService);
4282
+ }
4283
+ /**
4284
+ * Sets the available languages that will be displayed in the tool on the dev toolbar
4285
+ * @param languages The languages to be displayed
4286
+ */
4287
+ setAvailableOptions(languages) {
4288
+ this.internalService.setAppLanguages(languages);
4289
+ }
4290
+ /**
4291
+ * Gets the languages that were forced/modified through the tool on the dev toolbar
4292
+ * @returns Observable of forced languages array
4293
+ */
4294
+ getForcedValues() {
4295
+ return this.internalService.getForcedLanguage();
4296
+ }
4297
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: DevToolbarLanguageService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
4298
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: DevToolbarLanguageService, providedIn: 'root' }); }
4299
+ }
4300
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: DevToolbarLanguageService, decorators: [{
4301
+ type: Injectable,
4302
+ args: [{ providedIn: 'root' }]
4303
+ }] });
4304
+
4305
+ /**
4306
+ * Public service for managing app features in the dev toolbar.
4307
+ *
4308
+ * This service implements the DevToolsService interface and provides methods for:
4309
+ * - Configuring available product features
4310
+ * - Retrieving forced feature overrides
4311
+ * - Applying preset feature configurations
4312
+ * - Exporting current forced state for presets
4313
+ *
4314
+ * @example
4315
+ * ```typescript
4316
+ * import { DevToolbarAppFeaturesService } from 'ngx-dev-toolbar';
4317
+ *
4318
+ * @Component({...})
4319
+ * export class AppComponent implements OnInit {
4320
+ * private appFeaturesService = inject(DevToolbarAppFeaturesService);
4321
+ *
4322
+ * ngOnInit() {
4323
+ * // Configure available features based on current tier
4324
+ * const features: DevToolbarAppFeature[] = [
4325
+ * { id: 'analytics', name: 'Analytics Dashboard', isEnabled: true, isForced: false },
4326
+ * { id: 'multi-user', name: 'Multi-User Support', isEnabled: false, isForced: false }
4327
+ * ];
4328
+ * this.appFeaturesService.setAvailableOptions(features);
4329
+ *
4330
+ * // Subscribe to forced overrides
4331
+ * this.appFeaturesService.getForcedValues().subscribe(forcedFeatures => {
4332
+ * forcedFeatures.forEach(feature => {
4333
+ * // Apply forced feature state to application logic
4334
+ * this.applyFeatureState(feature.id, feature.isEnabled);
4335
+ * });
4336
+ * });
4337
+ * }
4338
+ * }
4339
+ * ```
4340
+ */
4341
+ class DevToolbarAppFeaturesService {
4342
+ constructor() {
4343
+ this.internalService = inject(DevToolbarInternalAppFeaturesService);
4344
+ }
4345
+ /**
4346
+ * Set available app features for the application.
4347
+ *
4348
+ * Configures the list of product features that can be toggled in the dev toolbar.
4349
+ * Features should represent product-level capabilities like license tiers,
4350
+ * deployment configurations, or environment flags.
4351
+ *
4352
+ * @param features - Array of app features to display in the toolbar
4353
+ * @throws Error if duplicate feature IDs or empty IDs are detected
4354
+ *
4355
+ * @example
4356
+ * ```typescript
4357
+ * const features: DevToolbarAppFeature[] = [
4358
+ * {
4359
+ * id: 'advanced-analytics',
4360
+ * name: 'Advanced Analytics Dashboard',
4361
+ * description: 'Access premium reporting and data visualization',
4362
+ * isEnabled: false, // Not available in current tier
4363
+ * isForced: false
4364
+ * },
4365
+ * {
4366
+ * id: 'multi-user-support',
4367
+ * name: 'Multi-User Collaboration',
4368
+ * description: 'Enable team features and user management',
4369
+ * isEnabled: true, // Available in current tier
4370
+ * isForced: false
4371
+ * }
4372
+ * ];
4373
+ * this.appFeaturesService.setAvailableOptions(features);
4374
+ * ```
4375
+ */
4376
+ setAvailableOptions(features) {
4377
+ this.internalService.setAppFeatures(features);
4378
+ }
4379
+ /**
4380
+ * Get observable stream of features that have forced overrides.
4381
+ *
4382
+ * Emits an array of features that have been forced via the dev toolbar.
4383
+ * Only features with `isForced = true` are included in the emissions.
4384
+ * Use this to react to feature override changes and update application behavior.
4385
+ *
4386
+ * @returns Observable that emits array of forced features whenever state changes
4387
+ *
4388
+ * @example
4389
+ * ```typescript
4390
+ * this.appFeaturesService.getForcedValues()
4391
+ * .pipe(takeUntilDestroyed())
4392
+ * .subscribe(forcedFeatures => {
4393
+ * forcedFeatures.forEach(feature => {
4394
+ * if (feature.isEnabled) {
4395
+ * this.enableFeature(feature.id);
4396
+ * } else {
4397
+ * this.disableFeature(feature.id);
4398
+ * }
4399
+ * });
4400
+ * });
4401
+ * ```
4402
+ */
4403
+ getForcedValues() {
4404
+ return this.internalService.getForcedFeatures();
4405
+ }
4406
+ /**
4407
+ * Apply a preset feature configuration (for preset tool integration).
4408
+ *
4409
+ * Accepts a forced features state object and applies it to the current configuration.
4410
+ * Invalid feature IDs (not in configured features) are filtered out with a warning.
4411
+ *
4412
+ * @param state - Forced features state containing enabled/disabled arrays
4413
+ *
4414
+ * @example
4415
+ * ```typescript
4416
+ * // Apply "Enterprise Tier" preset
4417
+ * const enterprisePreset: ForcedAppFeaturesState = {
4418
+ * enabled: ['analytics', 'multi-user', 'white-label', 'sso'],
4419
+ * disabled: []
4420
+ * };
4421
+ * this.appFeaturesService.applyPresetFeatures(enterprisePreset);
4422
+ *
4423
+ * // Apply "Basic Tier" preset
4424
+ * const basicPreset: ForcedAppFeaturesState = {
4425
+ * enabled: [],
4426
+ * disabled: ['analytics', 'multi-user', 'white-label', 'sso']
4427
+ * };
4428
+ * this.appFeaturesService.applyPresetFeatures(basicPreset);
4429
+ * ```
4430
+ */
4431
+ applyPresetFeatures(state) {
4432
+ this.internalService.applyForcedState(state);
4433
+ }
4434
+ /**
4435
+ * Get current forced feature state as a snapshot (for preset export).
4436
+ *
4437
+ * Returns the current forced features state with enabled/disabled arrays.
4438
+ * Useful for exporting toolbar state to save as a preset or for debugging.
4439
+ * Returns a defensive copy - mutations will not affect internal state.
4440
+ *
4441
+ * @returns Current forced features state
4442
+ *
4443
+ * @example
4444
+ * ```typescript
4445
+ * // Export current toolbar state to save as preset
4446
+ * const currentState = this.appFeaturesService.getCurrentForcedState();
4447
+ * this.presetsService.savePreset('my-config', {
4448
+ * appFeatures: currentState,
4449
+ * // ... other tool states
4450
+ * });
4451
+ *
4452
+ * console.log(currentState);
4453
+ * // { enabled: ['analytics'], disabled: ['white-label'] }
4454
+ * ```
4455
+ */
4456
+ getCurrentForcedState() {
4457
+ return this.internalService.getCurrentForcedState();
4458
+ }
4459
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: DevToolbarAppFeaturesService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
4460
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: DevToolbarAppFeaturesService, providedIn: 'root' }); }
4461
+ }
4462
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: DevToolbarAppFeaturesService, decorators: [{
4463
+ type: Injectable,
4464
+ args: [{ providedIn: 'root' }]
4465
+ }] });
4466
+
4467
+ /**
4468
+ * Public service for integrating the Permissions Tool with your application.
4469
+ * Use this service to:
4470
+ * 1. Register your application's permissions with setAvailableOptions()
4471
+ * 2. Listen for toolbar permission overrides with getForcedValues()
4472
+ * 3. Apply preset permission states for testing with applyPreset()
4473
+ *
4474
+ * @example
4475
+ * ```typescript
4476
+ * constructor(private permissionsService: DevToolbarPermissionsService) {
4477
+ * // Register permissions
4478
+ * this.permissionsService.setAvailableOptions([
4479
+ * { id: 'can-edit', name: 'Can Edit', isGranted: false, isForced: false }
4480
+ * ]);
4481
+ *
4482
+ * // Listen for overrides
4483
+ * this.permissionsService.getForcedValues().subscribe(forcedPermissions => {
4484
+ * // Update your app's permission state
4485
+ * });
4486
+ * }
4487
+ * ```
4488
+ */
4489
+ class DevToolbarPermissionsService {
4490
+ constructor() {
4491
+ this.internalService = inject(DevToolbarInternalPermissionsService);
4492
+ }
4493
+ /**
4494
+ * Sets the available permissions that will be displayed in the toolbar tool.
4495
+ * Call this in your app initialization to register permissions.
4496
+ *
4497
+ * @param permissions Array of permissions to display in the toolbar
4498
+ *
4499
+ * @example
4500
+ * ```typescript
4501
+ * this.permissionsService.setAvailableOptions([
4502
+ * {
4503
+ * id: 'can-edit-posts',
4504
+ * name: 'Edit Posts',
4505
+ * description: 'Can edit blog posts',
4506
+ * isGranted: false,
4507
+ * isForced: false
4508
+ * }
4509
+ * ]);
4510
+ * ```
4511
+ */
4512
+ setAvailableOptions(permissions) {
4513
+ this.internalService.setAppPermissions(permissions);
4514
+ }
4515
+ /**
4516
+ * Gets an observable of permissions that were forced/overridden through the toolbar.
4517
+ * Subscribe to this to update your application's permission state.
4518
+ *
4519
+ * @returns Observable emitting array of forced permissions whenever changes occur
4520
+ *
4521
+ * @example
4522
+ * ```typescript
4523
+ * this.permissionsService.getForcedValues().subscribe(forcedPermissions => {
4524
+ * forcedPermissions.forEach(permission => {
4525
+ * this.updatePermission(permission.id, permission.isGranted);
4526
+ * });
4527
+ * });
4528
+ * ```
4529
+ */
4530
+ getForcedValues() {
4531
+ return this.internalService.getForcedPermissions();
4532
+ }
4533
+ /**
4534
+ * Apply a preset permission state. Useful for automated testing scenarios.
4535
+ *
4536
+ * @param state The forced permissions state to apply
4537
+ *
4538
+ * @example
4539
+ * ```typescript
4540
+ * this.permissionsService.applyPreset({
4541
+ * granted: ['can-edit-posts'],
4542
+ * denied: ['can-delete-posts']
4543
+ * });
4544
+ * ```
4545
+ */
4546
+ applyPreset(state) {
4547
+ this.internalService.applyPresetPermissions(state);
4548
+ }
4549
+ /**
4550
+ * Get the current forced permission state.
4551
+ *
4552
+ * @returns Current forced permissions state
4553
+ */
4554
+ getCurrentState() {
4555
+ return this.internalService.getCurrentForcedState();
4556
+ }
4557
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: DevToolbarPermissionsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
4558
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: DevToolbarPermissionsService, providedIn: 'root' }); }
4559
+ }
4560
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: DevToolbarPermissionsService, decorators: [{
4561
+ type: Injectable,
4562
+ args: [{ providedIn: 'root' }]
4563
+ }] });
4564
+
4565
+ /**
4566
+ * Generated bundle index. Do not edit.
4567
+ */
4568
+
4569
+ export { DevToolbarAppFeaturesService, DevToolbarAppFeaturesToolComponent, DevToolbarComponent, DevToolbarFeatureFlagService, DevToolbarIconComponent, DevToolbarLanguageService, DevToolbarNetworkMockerService, DevToolbarNetworkMockerToolComponent, DevToolbarPermissionsService, DevToolbarPermissionsToolComponent, DevToolbarToolComponent };
4570
+ //# sourceMappingURL=ngx-dev-toolbar.mjs.map