ngx-dev-toolbar 0.0.2-1 → 0.0.2-2

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 (50) hide show
  1. package/package.json +5 -3
  2. package/project.json +1 -1
  3. package/src/components/button/button.component.scss +36 -0
  4. package/src/components/button/button.component.ts +36 -0
  5. package/src/components/icons/angular-icon.component.ts +35 -0
  6. package/src/components/icons/bug-icon.component.ts +27 -0
  7. package/src/components/icons/code-icon.component.ts +24 -0
  8. package/src/components/icons/database-icon.component.ts +27 -0
  9. package/src/components/icons/gauge-icon.component.ts +27 -0
  10. package/src/components/icons/gear-icon.component.ts +27 -0
  11. package/src/components/icons/git-branch-icon.component.ts +27 -0
  12. package/src/components/icons/icon.component.ts +120 -0
  13. package/src/components/icons/icon.models.ts +20 -0
  14. package/src/components/icons/layout-icon.component.ts +24 -0
  15. package/src/components/icons/lighting-icon.component.ts +24 -0
  16. package/src/components/icons/moon-icon.component.ts +27 -0
  17. package/src/components/icons/network-icon.component.ts +27 -0
  18. package/src/components/icons/puzzle-icon.component.ts +27 -0
  19. package/src/components/icons/refresh-icon.component.ts +27 -0
  20. package/src/components/icons/star-icon.component.ts +27 -0
  21. package/src/components/icons/sun-icon.component.ts +27 -0
  22. package/src/components/icons/terminal-icon.component.ts +27 -0
  23. package/src/components/icons/toggle-left-icon.component.ts +27 -0
  24. package/src/components/icons/users-icon.component.ts +27 -0
  25. package/src/components/input/input.component.ts +66 -0
  26. package/src/components/select/select.component.scss +83 -0
  27. package/src/components/select/select.component.ts +40 -0
  28. package/src/components/tool-button/tool-button.component.scss +67 -0
  29. package/src/components/tool-button/tool-button.component.ts +127 -0
  30. package/src/components/toolbar-tool/toolbar-tool.component.scss +9 -0
  31. package/src/components/toolbar-tool/toolbar-tool.component.ts +120 -0
  32. package/src/components/toolbar-tool/toolbar-tool.models.ts +9 -0
  33. package/src/components/window/window.component.scss +96 -0
  34. package/src/components/window/window.component.ts +79 -0
  35. package/src/components/window/window.models.ts +28 -0
  36. package/src/dev-toolbar-state.service.ts +84 -0
  37. package/src/dev-toolbar.component.scss +21 -0
  38. package/src/dev-toolbar.component.ts +102 -0
  39. package/src/index.ts +3 -1
  40. package/src/styles.scss +361 -0
  41. package/src/tools/feature-flags-tool/feature-flags-tool.component.ts +255 -0
  42. package/src/tools/feature-flags-tool/feature-flags.models.ts +10 -0
  43. package/src/tools/feature-flags-tool/feature-flags.service.ts +110 -0
  44. package/src/tools/index.ts +5 -0
  45. package/src/tools/settings-tool/settings-tool.component.scss +61 -0
  46. package/src/tools/settings-tool/settings-tool.component.ts +76 -0
  47. package/src/tools/settings-tool/settings.models.ts +3 -0
  48. package/src/tools/settings-tool/settings.service.spec.ts +59 -0
  49. package/src/tools/settings-tool/settings.service.ts +21 -0
  50. package/src/utils/storage.service.ts +19 -0
package/package.json CHANGED
@@ -1,12 +1,14 @@
1
1
  {
2
2
  "name": "ngx-dev-toolbar",
3
- "version": "0.0.2-1",
3
+ "version": "0.0.2-2",
4
4
  "peerDependencies": {
5
- "@angular/common": "^18.0.0 || ^19.0.0",
6
5
  "@angular/core": "^18.0.0 || ^19.0.0",
7
6
  "vite": "^5.0.0",
8
7
  "@analogjs/vite-plugin-angular": "~1.10.0",
9
- "@nx/vite": "20.3.0"
8
+ "@nx/vite": "20.3.0",
9
+ "@angular/forms": "^18.0.0 || ^19.0.0",
10
+ "@angular/animations": "^18.0.0 || ^19.0.0",
11
+ "rxjs": "~7.8.0"
10
12
  },
11
13
  "sideEffects": false
12
14
  }
package/project.json CHANGED
@@ -32,6 +32,6 @@
32
32
  "lint": {
33
33
  "executor": "@nx/eslint:lint"
34
34
  }
35
-
35
+
36
36
  }
37
37
  }
@@ -0,0 +1,36 @@
1
+ @use '../../styles' as devtools;
2
+
3
+ .button {
4
+ display: flex;
5
+ padding: var(--devtools-spacing-xs) var(--devtools-spacing-sm);
6
+ border: 1px solid var(--devtools-border-color);
7
+ border-radius: var(--devtools-border-radius);
8
+ background: var(--devtools-background-secondary);
9
+ color: var(--devtools-text-primary);
10
+ cursor: pointer;
11
+ transition: var(--devtools-transition-fast);
12
+
13
+ &:hover {
14
+ background: var(--devtools-background-hover);
15
+ }
16
+
17
+ &:focus {
18
+ outline: none;
19
+ background: var(--devtools-background-hover);
20
+ box-shadow: 0 0 0 2px var(--devtools-focus-ring);
21
+ }
22
+
23
+ &--active {
24
+ background: var(--devtools-primary);
25
+ color: var(--devtools-text-on-primary);
26
+ border-color: var(--devtools-primary);
27
+ }
28
+
29
+ &--icon {
30
+ padding: var(--devtools-spacing-xs);
31
+ }
32
+
33
+ &__label {
34
+ font-size: var(--devtools-font-size-sm);
35
+ }
36
+ }
@@ -0,0 +1,36 @@
1
+ import { ChangeDetectionStrategy, Component, input } from '@angular/core';
2
+ import { DevToolbarIconComponent } from '../icons/icon.component';
3
+ import { IconName } from '../icons/icon.models';
4
+
5
+ @Component({
6
+ selector: 'ndt-button',
7
+ standalone: true,
8
+ imports: [DevToolbarIconComponent],
9
+ template: `
10
+ <button
11
+ class="button"
12
+ [attr.aria-label]="ariaLabel()"
13
+ [type]="type()"
14
+ [class.button--active]="isActive()"
15
+ [class.button--icon]="variant() === 'icon'"
16
+ >
17
+ @if (icon()) {
18
+ <ndt-icon [name]="icon() || 'star'" />
19
+ }
20
+ @if (label()) {
21
+ <span class="button__label">{{ label() }}</span>
22
+ }
23
+ <ng-content />
24
+ </button>
25
+ `,
26
+ styleUrls: ['./button.component.scss'],
27
+ changeDetection: ChangeDetectionStrategy.OnPush,
28
+ })
29
+ export class DevToolbarButtonComponent {
30
+ readonly type = input<'button' | 'submit' | 'reset'>('button');
31
+ readonly variant = input<'default' | 'icon'>('default');
32
+ readonly icon = input<IconName>();
33
+ readonly label = input<string>();
34
+ readonly ariaLabel = input<string>();
35
+ readonly isActive = input<boolean>(false);
36
+ }
@@ -0,0 +1,35 @@
1
+ import { ChangeDetectionStrategy, Component } from '@angular/core';
2
+
3
+ @Component({
4
+ selector: 'ndt-angular-icon',
5
+ standalone: true,
6
+ changeDetection: ChangeDetectionStrategy.OnPush,
7
+ template: `
8
+ <svg width="24" height="24" viewBox="0 0 24 24" fill="none">
9
+ <defs>
10
+ <linearGradient
11
+ id="angular-gradient"
12
+ x1="6"
13
+ x2="18"
14
+ y1="20"
15
+ y2="4"
16
+ gradientUnits="userSpaceOnUse"
17
+ >
18
+ <stop offset="0" stop-color="#E40035" />
19
+ <stop offset=".24" stop-color="#F60A48" />
20
+ <stop offset=".352" stop-color="#F20755" />
21
+ <stop offset=".494" stop-color="#DC087D" />
22
+ <stop offset=".745" stop-color="#9717E7" />
23
+ <stop offset="1" stop-color="#6C00F5" />
24
+ </linearGradient>
25
+ </defs>
26
+ <g fill="url(#angular-gradient)">
27
+ <polygon points="14.1,2.7 20.1,15.7 20.7,5.8" />
28
+ <polygon points="15.6,16.4 8.4,16.4 7.4,18.6 12,21.2 16.6,18.6" />
29
+ <polygon points="9.6,13.5 14.4,13.5 12,7.7" />
30
+ <polygon points="9.9,2.7 3.3,5.8 3.9,15.7" />
31
+ </g>
32
+ </svg>
33
+ `,
34
+ })
35
+ export class AngularIconComponent {}
@@ -0,0 +1,27 @@
1
+ import { ChangeDetectionStrategy, Component, input } from '@angular/core';
2
+
3
+ @Component({
4
+ selector: 'ndt-bug-icon',
5
+ standalone: true,
6
+ changeDetection: ChangeDetectionStrategy.OnPush,
7
+ template: `
8
+ <svg
9
+ [attr.fill]="fill()"
10
+ xmlns="http://www.w3.org/2000/svg"
11
+ width="24"
12
+ height="24"
13
+ viewBox="0 0 256 256"
14
+ >
15
+ <path
16
+ 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"
17
+ opacity="0.2"
18
+ ></path>
19
+ <path
20
+ 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"
21
+ ></path>
22
+ </svg>
23
+ `,
24
+ })
25
+ export class BugIconComponent {
26
+ fill = input<string>('#FFFF');
27
+ }
@@ -0,0 +1,24 @@
1
+ import { ChangeDetectionStrategy, Component, input } from '@angular/core';
2
+
3
+ @Component({
4
+ selector: 'ndt-code-icon',
5
+ standalone: true,
6
+ template: `
7
+ <svg
8
+ [attr.fill]="fill()"
9
+ xmlns="http://www.w3.org/2000/svg"
10
+ width="24"
11
+ height="24"
12
+ viewBox="0 0 256 256"
13
+ >
14
+ <path d="M240,128l-48,40H64L16,128,64,88H192Z" opacity="0.2"></path>
15
+ <path
16
+ 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"
17
+ ></path>
18
+ </svg>
19
+ `,
20
+ changeDetection: ChangeDetectionStrategy.OnPush,
21
+ })
22
+ export class CodeIconComponent {
23
+ fill = input<string>('#FFFF');
24
+ }
@@ -0,0 +1,27 @@
1
+ import { ChangeDetectionStrategy, Component, input } from '@angular/core';
2
+
3
+ @Component({
4
+ selector: 'ndt-database-icon',
5
+ standalone: true,
6
+ changeDetection: ChangeDetectionStrategy.OnPush,
7
+ template: `
8
+ <svg
9
+ [attr.fill]="fill()"
10
+ xmlns="http://www.w3.org/2000/svg"
11
+ width="24"
12
+ height="24"
13
+ viewBox="0 0 256 256"
14
+ >
15
+ <path
16
+ d="M216,80c0,26.51-39.4,48-88,48S40,106.51,40,80s39.4-48,88-48S216,53.49,216,80Z"
17
+ opacity="0.2"
18
+ ></path>
19
+ <path
20
+ 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"
21
+ ></path>
22
+ </svg>
23
+ `,
24
+ })
25
+ export class DatabaseIconComponent {
26
+ fill = input<string>('#FFFF');
27
+ }
@@ -0,0 +1,27 @@
1
+ import { ChangeDetectionStrategy, Component, input } from '@angular/core';
2
+
3
+ @Component({
4
+ selector: 'ndt-gauge-icon',
5
+ standalone: true,
6
+ changeDetection: ChangeDetectionStrategy.OnPush,
7
+ template: `
8
+ <svg
9
+ [attr.fill]="fill()"
10
+ xmlns="http://www.w3.org/2000/svg"
11
+ width="24"
12
+ height="24"
13
+ viewBox="0 0 256 256"
14
+ >
15
+ <path
16
+ 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"
17
+ opacity="0.2"
18
+ ></path>
19
+ <path
20
+ 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"
21
+ ></path>
22
+ </svg>
23
+ `,
24
+ })
25
+ export class GaugeIconComponent {
26
+ fill = input<string>('#FFFF');
27
+ }
@@ -0,0 +1,27 @@
1
+ import { ChangeDetectionStrategy, Component, input } from '@angular/core';
2
+
3
+ @Component({
4
+ selector: 'ndt-gear-icon',
5
+ standalone: true,
6
+ changeDetection: ChangeDetectionStrategy.OnPush,
7
+ template: `
8
+ <svg
9
+ [attr.fill]="fill()"
10
+ xmlns="http://www.w3.org/2000/svg"
11
+ width="24"
12
+ height="24"
13
+ viewBox="0 0 256 256"
14
+ >
15
+ <path
16
+ 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"
17
+ opacity="0.2"
18
+ ></path>
19
+ <path
20
+ 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"
21
+ ></path>
22
+ </svg>
23
+ `,
24
+ })
25
+ export class GearIconComponent {
26
+ fill = input<string>('#FFFF');
27
+ }
@@ -0,0 +1,27 @@
1
+ import { ChangeDetectionStrategy, Component, input } from '@angular/core';
2
+
3
+ @Component({
4
+ selector: 'ndt-git-branch-icon',
5
+ standalone: true,
6
+ changeDetection: ChangeDetectionStrategy.OnPush,
7
+ template: `
8
+ <svg
9
+ [attr.fill]="fill()"
10
+ xmlns="http://www.w3.org/2000/svg"
11
+ width="24"
12
+ height="24"
13
+ viewBox="0 0 256 256"
14
+ >
15
+ <path
16
+ d="M224,64a24,24,0,1,1-24-24A24,24,0,0,1,224,64Z"
17
+ opacity="0.2"
18
+ ></path>
19
+ <path
20
+ 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"
21
+ ></path>
22
+ </svg>
23
+ `,
24
+ })
25
+ export class GitBranchIconComponent {
26
+ fill = input<string>('#FFFF');
27
+ }
@@ -0,0 +1,120 @@
1
+ import {
2
+ ChangeDetectionStrategy,
3
+ Component,
4
+ computed,
5
+ inject,
6
+ input,
7
+ } from '@angular/core';
8
+ import { DevToolbarStateService } from '../../dev-toolbar-state.service';
9
+ import { AngularIconComponent } from './angular-icon.component';
10
+ import { BugIconComponent } from './bug-icon.component';
11
+ import { CodeIconComponent } from './code-icon.component';
12
+ import { DatabaseIconComponent } from './database-icon.component';
13
+ import { GaugeIconComponent } from './gauge-icon.component';
14
+ import { GearIconComponent } from './gear-icon.component';
15
+ import { GitBranchIconComponent } from './git-branch-icon.component';
16
+ import { IconName } from './icon.models';
17
+ import { LayoutIconComponent } from './layout-icon.component';
18
+ import { LightingIconComponent } from './lighting-icon.component';
19
+ import { MoonIconComponent } from './moon-icon.component';
20
+ import { NetworkIconComponent } from './network-icon.component';
21
+ import { PuzzleIconComponent } from './puzzle-icon.component';
22
+ import { RefreshIconComponent } from './refresh-icon.component';
23
+ import { StarIconComponent } from './star-icon.component';
24
+ import { SunIconComponent } from './sun-icon.component';
25
+ import { TerminalIconComponent } from './terminal-icon.component';
26
+ import { ToggleLeftIconComponent } from './toggle-left-icon.component';
27
+ import { UsersIconComponent } from './users-icon.component';
28
+
29
+ @Component({
30
+ selector: 'ndt-icon',
31
+ standalone: true,
32
+ imports: [
33
+ AngularIconComponent,
34
+ BugIconComponent,
35
+ CodeIconComponent,
36
+ DatabaseIconComponent,
37
+ GaugeIconComponent,
38
+ GearIconComponent,
39
+ GitBranchIconComponent,
40
+ LayoutIconComponent,
41
+ LightingIconComponent,
42
+ NetworkIconComponent,
43
+ PuzzleIconComponent,
44
+ RefreshIconComponent,
45
+ StarIconComponent,
46
+ TerminalIconComponent,
47
+ ToggleLeftIconComponent,
48
+ UsersIconComponent,
49
+ SunIconComponent,
50
+ MoonIconComponent,
51
+ ],
52
+ changeDetection: ChangeDetectionStrategy.OnPush,
53
+ template: `
54
+ @switch (name()) {
55
+ @case ('angular') {
56
+ <ndt-angular-icon />
57
+ }
58
+ @case ('bug') {
59
+ <ndt-bug-icon [fill]="fill()" />
60
+ }
61
+ @case ('code') {
62
+ <ndt-code-icon [fill]="fill()" />
63
+ }
64
+ @case ('database') {
65
+ <ndt-database-icon [fill]="fill()" />
66
+ }
67
+ @case ('gauge') {
68
+ <ndt-gauge-icon [fill]="fill()" />
69
+ }
70
+ @case ('gear') {
71
+ <ndt-gear-icon [fill]="fill()" />
72
+ }
73
+ @case ('git-branch') {
74
+ <ndt-git-branch-icon [fill]="fill()" />
75
+ }
76
+ @case ('layout') {
77
+ <ndt-layout-icon [fill]="fill()" />
78
+ }
79
+ @case ('lighting') {
80
+ <ndt-lighting-icon [fill]="fill()" />
81
+ }
82
+ @case ('network') {
83
+ <ndt-network-icon [fill]="fill()" />
84
+ }
85
+ @case ('puzzle') {
86
+ <ndt-puzzle-icon [fill]="fill()" />
87
+ }
88
+ @case ('refresh') {
89
+ <ndt-refresh-icon [fill]="fill()" />
90
+ }
91
+ @case ('star') {
92
+ <ndt-star-icon [fill]="fill()" />
93
+ }
94
+ @case ('terminal') {
95
+ <ndt-terminal-icon [fill]="fill()" />
96
+ }
97
+ @case ('toggle-left') {
98
+ <ndt-toggle-left-icon [fill]="fill()" />
99
+ }
100
+ @case ('user') {
101
+ <ndt-users-icon [fill]="fill()" />
102
+ }
103
+ @case ('sun') {
104
+ <ndt-sun-icon [fill]="fill()" />
105
+ }
106
+ @case ('moon') {
107
+ <ndt-moon-icon [fill]="fill()" />
108
+ }
109
+ }
110
+ `,
111
+ })
112
+ export class DevToolbarIconComponent {
113
+ private readonly stateService = inject(DevToolbarStateService);
114
+
115
+ name = input.required<IconName>();
116
+
117
+ fill = computed(() =>
118
+ this.stateService.theme() === 'dark' ? '#FFFFFF' : '#000000',
119
+ );
120
+ }
@@ -0,0 +1,20 @@
1
+ export type IconName =
2
+ | 'angular'
3
+ | 'bug'
4
+ | 'code'
5
+ | 'database'
6
+ | 'gauge'
7
+ | 'gear'
8
+ | 'git-branch'
9
+ | 'layout'
10
+ | 'lighting'
11
+ | 'moon'
12
+ | 'network'
13
+ | 'puzzle'
14
+ | 'refresh'
15
+ | 'star'
16
+ | 'sun'
17
+ | 'terminal'
18
+ | 'toggle-left'
19
+ | 'user'
20
+ | 'flag';
@@ -0,0 +1,24 @@
1
+ import { ChangeDetectionStrategy, Component, input } from '@angular/core';
2
+
3
+ @Component({
4
+ selector: 'ndt-layout-icon',
5
+ standalone: true,
6
+ changeDetection: ChangeDetectionStrategy.OnPush,
7
+ template: `
8
+ <svg
9
+ [attr.fill]="fill()"
10
+ xmlns="http://www.w3.org/2000/svg"
11
+ width="24"
12
+ height="24"
13
+ viewBox="0 0 256 256"
14
+ >
15
+ <path d="M104,104V208H40a8,8,0,0,1-8-8V104Z" opacity="0.2"></path>
16
+ <path
17
+ 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"
18
+ ></path>
19
+ </svg>
20
+ `,
21
+ })
22
+ export class LayoutIconComponent {
23
+ fill = input<string>('#FFFF');
24
+ }
@@ -0,0 +1,24 @@
1
+ import { ChangeDetectionStrategy, Component, input } from '@angular/core';
2
+
3
+ @Component({
4
+ selector: 'ndt-lighting-icon',
5
+ standalone: true,
6
+ changeDetection: ChangeDetectionStrategy.OnPush,
7
+ template: `
8
+ <svg
9
+ [attr.fill]="fill()"
10
+ xmlns="http://www.w3.org/2000/svg"
11
+ width="24"
12
+ height="24"
13
+ viewBox="0 0 256 256"
14
+ >
15
+ <path d="M96,240l16-80L48,136,160,16,144,96l64,24Z" opacity="0.2"></path>
16
+ <path
17
+ 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"
18
+ ></path>
19
+ </svg>
20
+ `,
21
+ })
22
+ export class LightingIconComponent {
23
+ fill = input<string>('#FFFF');
24
+ }
@@ -0,0 +1,27 @@
1
+ import { ChangeDetectionStrategy, Component, input } from '@angular/core';
2
+
3
+ @Component({
4
+ selector: 'ndt-moon-icon',
5
+ standalone: true,
6
+ changeDetection: ChangeDetectionStrategy.OnPush,
7
+ template: `
8
+ <svg
9
+ [attr.fill]="fill()"
10
+ xmlns="http://www.w3.org/2000/svg"
11
+ width="24"
12
+ height="24"
13
+ viewBox="0 0 256 256"
14
+ >
15
+ <path
16
+ 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"
17
+ opacity="0.2"
18
+ />
19
+ <path
20
+ 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"
21
+ />
22
+ </svg>
23
+ `,
24
+ })
25
+ export class MoonIconComponent {
26
+ fill = input<string>('#FFFF');
27
+ }
@@ -0,0 +1,27 @@
1
+ import { ChangeDetectionStrategy, Component, input } from '@angular/core';
2
+
3
+ @Component({
4
+ selector: 'ndt-network-icon',
5
+ standalone: true,
6
+ changeDetection: ChangeDetectionStrategy.OnPush,
7
+ template: `
8
+ <svg
9
+ [attr.fill]="fill()"
10
+ xmlns="http://www.w3.org/2000/svg"
11
+ width="24"
12
+ height="24"
13
+ viewBox="0 0 256 256"
14
+ >
15
+ <path
16
+ 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"
17
+ opacity="0.2"
18
+ ></path>
19
+ <path
20
+ 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"
21
+ ></path>
22
+ </svg>
23
+ `,
24
+ })
25
+ export class NetworkIconComponent {
26
+ fill = input<string>('#FFFF');
27
+ }
@@ -0,0 +1,27 @@
1
+ import { ChangeDetectionStrategy, Component, input } from '@angular/core';
2
+
3
+ @Component({
4
+ selector: 'ndt-puzzle-icon',
5
+ standalone: true,
6
+ changeDetection: ChangeDetectionStrategy.OnPush,
7
+ template: `
8
+ <svg
9
+ [attr.fill]="fill()"
10
+ xmlns="http://www.w3.org/2000/svg"
11
+ width="24"
12
+ height="24"
13
+ viewBox="0 0 256 256"
14
+ >
15
+ <path
16
+ 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"
17
+ opacity="0.2"
18
+ ></path>
19
+ <path
20
+ 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"
21
+ ></path>
22
+ </svg>
23
+ `,
24
+ })
25
+ export class PuzzleIconComponent {
26
+ fill = input<string>('#FFFF');
27
+ }
@@ -0,0 +1,27 @@
1
+ import { ChangeDetectionStrategy, Component, input } from '@angular/core';
2
+
3
+ @Component({
4
+ selector: 'ndt-refresh-icon',
5
+ standalone: true,
6
+ changeDetection: ChangeDetectionStrategy.OnPush,
7
+ template: `
8
+ <svg
9
+ [attr.fill]="fill()"
10
+ xmlns="http://www.w3.org/2000/svg"
11
+ width="24"
12
+ height="24"
13
+ viewBox="0 0 256 256"
14
+ >
15
+ <path
16
+ d="M216,128a88,88,0,1,1-88-88A88,88,0,0,1,216,128Z"
17
+ opacity="0.2"
18
+ ></path>
19
+ <path
20
+ 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"
21
+ ></path>
22
+ </svg>
23
+ `,
24
+ })
25
+ export class RefreshIconComponent {
26
+ fill = input<string>('#FFFF');
27
+ }
@@ -0,0 +1,27 @@
1
+ import { ChangeDetectionStrategy, Component, input } from '@angular/core';
2
+
3
+ @Component({
4
+ selector: 'ndt-star-icon',
5
+ standalone: true,
6
+ changeDetection: ChangeDetectionStrategy.OnPush,
7
+ template: `
8
+ <svg
9
+ [attr.fill]="fill()"
10
+ xmlns="http://www.w3.org/2000/svg"
11
+ width="24"
12
+ height="24"
13
+ viewBox="0 0 256 256"
14
+ >
15
+ <path
16
+ 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"
17
+ opacity="0.2"
18
+ ></path>
19
+ <path
20
+ 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"
21
+ ></path>
22
+ </svg>
23
+ `,
24
+ })
25
+ export class StarIconComponent {
26
+ fill = input<string>('#FFFF');
27
+ }