angular-toolbox 0.0.2 → 0.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.
@@ -1,20 +1,26 @@
1
1
  import { NgModule } from '@angular/core';
2
2
  import { SafeHtmlPipe } from './pipe/safe/safe-html.pipe';
3
+ import { DARK_MODE_CONFIG } from './service/ui/dark-mode.service';
3
4
  import * as i0 from "@angular/core";
4
5
  export class AngularToolboxModule {
5
6
  }
6
7
  AngularToolboxModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: AngularToolboxModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
7
8
  AngularToolboxModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.9", ngImport: i0, type: AngularToolboxModule, declarations: [SafeHtmlPipe], exports: [SafeHtmlPipe] });
8
- AngularToolboxModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: AngularToolboxModule });
9
+ AngularToolboxModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: AngularToolboxModule, providers: [
10
+ { provide: DARK_MODE_CONFIG, useValue: DARK_MODE_CONFIG }
11
+ ] });
9
12
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: AngularToolboxModule, decorators: [{
10
13
  type: NgModule,
11
14
  args: [{
12
15
  declarations: [
13
16
  SafeHtmlPipe
14
17
  ],
18
+ providers: [
19
+ { provide: DARK_MODE_CONFIG, useValue: DARK_MODE_CONFIG }
20
+ ],
15
21
  exports: [
16
22
  SafeHtmlPipe
17
23
  ]
18
24
  }]
19
25
  }] });
20
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci10b29sYm94Lm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItdG9vbGJveC9zcmMvbGliL2FuZ3VsYXItdG9vbGJveC5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7O0FBVTFELE1BQU0sT0FBTyxvQkFBb0I7O2lIQUFwQixvQkFBb0I7a0hBQXBCLG9CQUFvQixpQkFOekIsWUFBWSxhQUdaLFlBQVk7a0hBR1Asb0JBQW9COzJGQUFwQixvQkFBb0I7a0JBUmhDLFFBQVE7bUJBQUM7b0JBQ04sWUFBWSxFQUFFO3dCQUNWLFlBQVk7cUJBQ2Y7b0JBQ0QsT0FBTyxFQUFFO3dCQUNMLFlBQVk7cUJBQ2Y7aUJBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBTYWZlSHRtbFBpcGUgfSBmcm9tICcuL3BpcGUvc2FmZS9zYWZlLWh0bWwucGlwZSc7XHJcblxyXG5ATmdNb2R1bGUoe1xyXG4gICAgZGVjbGFyYXRpb25zOiBbXHJcbiAgICAgICAgU2FmZUh0bWxQaXBlXHJcbiAgICBdLFxyXG4gICAgZXhwb3J0czogW1xyXG4gICAgICAgIFNhZmVIdG1sUGlwZVxyXG4gICAgXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQW5ndWxhclRvb2xib3hNb2R1bGUgeyB9Il19
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci10b29sYm94Lm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItdG9vbGJveC9zcmMvbGliL2FuZ3VsYXItdG9vbGJveC5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7O0FBYWxFLE1BQU0sT0FBTyxvQkFBb0I7O2lIQUFwQixvQkFBb0I7a0hBQXBCLG9CQUFvQixpQkFUekIsWUFBWSxhQU1aLFlBQVk7a0hBR1Asb0JBQW9CLGFBUGxCO1FBQ1AsRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixFQUFFO0tBQzFEOzJGQUtNLG9CQUFvQjtrQkFYaEMsUUFBUTttQkFBQztvQkFDTixZQUFZLEVBQUU7d0JBQ1YsWUFBWTtxQkFDZjtvQkFDRCxTQUFTLEVBQUU7d0JBQ1AsRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixFQUFFO3FCQUMxRDtvQkFDSCxPQUFPLEVBQUU7d0JBQ0wsWUFBWTtxQkFDZjtpQkFDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFNhZmVIdG1sUGlwZSB9IGZyb20gJy4vcGlwZS9zYWZlL3NhZmUtaHRtbC5waXBlJztcclxuaW1wb3J0IHsgREFSS19NT0RFX0NPTkZJRyB9IGZyb20gJy4vc2VydmljZS91aS9kYXJrLW1vZGUuc2VydmljZSc7XHJcblxyXG5ATmdNb2R1bGUoe1xyXG4gICAgZGVjbGFyYXRpb25zOiBbXHJcbiAgICAgICAgU2FmZUh0bWxQaXBlXHJcbiAgICBdLFxyXG4gICAgcHJvdmlkZXJzOiBbXHJcbiAgICAgICAgeyBwcm92aWRlOiBEQVJLX01PREVfQ09ORklHLCB1c2VWYWx1ZTogREFSS19NT0RFX0NPTkZJRyB9XHJcbiAgICAgIF0sXHJcbiAgICBleHBvcnRzOiBbXHJcbiAgICAgICAgU2FmZUh0bWxQaXBlXHJcbiAgICBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBbmd1bGFyVG9vbGJveE1vZHVsZSB7IH0iXX0=
@@ -1,2 +1,3 @@
1
1
  export * from './subscription/subscription.service';
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLXRvb2xib3gvc3JjL2xpYi9zZXJ2aWNlL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMscUNBQXFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL3N1YnNjcmlwdGlvbi9zdWJzY3JpcHRpb24uc2VydmljZSc7Il19
2
+ export * from './ui/dark-mode.service';
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLXRvb2xib3gvc3JjL2xpYi9zZXJ2aWNlL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMscUNBQXFDLENBQUM7QUFDcEQsY0FBYyx3QkFBd0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vc3Vic2NyaXB0aW9uL3N1YnNjcmlwdGlvbi5zZXJ2aWNlJztcclxuZXhwb3J0ICogZnJvbSAnLi91aS9kYXJrLW1vZGUuc2VydmljZSc7Il19
@@ -0,0 +1,156 @@
1
+ import { Inject, Injectable, EventEmitter } from '@angular/core';
2
+ import { DOCUMENT } from '@angular/common';
3
+ import * as i0 from "@angular/core";
4
+ // --> Internal constants
5
+ const STORAGE_KEY = "dark-mode-key";
6
+ const CSS_PROP = "dark-mode";
7
+ const ADD_ACTION = "add";
8
+ const REMOVE_ACTION = "remove";
9
+ /**
10
+ * The default provider for the DarkModeService configuration. You typically define
11
+ * the custom properties in the main NgModule declaration to initialize the app dark mode:
12
+ *
13
+ * @NgModule({
14
+ * ...
15
+ * providers: [
16
+ * { provide: DARK_MODE_CONFIG, useValue: { enableDarkMode: true} }
17
+ * ],
18
+ * ...
19
+ * s);
20
+ */
21
+ export const DARK_MODE_CONFIG = {
22
+ /**
23
+ * Indicates whether the dark mode uses browser settings (true), or not (false).
24
+ * Default value is false.
25
+ */
26
+ darkModeEnbled: false,
27
+ /**
28
+ * Indicates whether the dark mode uses browser settings (true), or not (false).
29
+ * Default value is true.
30
+ */
31
+ detectBrowserSettings: true,
32
+ /**
33
+ * CSS property name used to set the dark mode look and feel.
34
+ * Default value is 'dark-mode'.
35
+ */
36
+ cssProperty: CSS_PROP,
37
+ /**
38
+ * Reference to the key value used to persist the dark mode state to local storage.
39
+ * Default value is 'dark-mode-key'.
40
+ */
41
+ storageKey: STORAGE_KEY
42
+ };
43
+ /**
44
+ * A lightweight service that provides Dark Mode implementation for your Angular application.
45
+ */
46
+ export class DarkModeService {
47
+ /**
48
+ * Creates a new DarkModeService instance.
49
+ * @param _document the reference to the Document singleton.
50
+ * @param config the reference to the DarkModeConfig provider.
51
+ */
52
+ constructor(_document, config) {
53
+ this._document = _document;
54
+ // --> Private properties
55
+ this._darkModeEnbled = false;
56
+ this._cssProperty = CSS_PROP;
57
+ this._storageKey = STORAGE_KEY;
58
+ /**
59
+ * The callback function that is triggered when the dark mode changes.
60
+ * @typeParam EventEmitter<boolean> the value returned by the darkModeEnabled() property.
61
+ */
62
+ this.change = new EventEmitter(true);
63
+ this.initDarkMode(config);
64
+ }
65
+ /**
66
+ * Toogles the dark mode state.
67
+ */
68
+ toggleDarkMode() {
69
+ this._darkModeEnbled ? this.disableDarkMode() : this.enableDarkMode();
70
+ }
71
+ /**
72
+ * Sets the dark mode state to active.
73
+ */
74
+ enableDarkMode() {
75
+ this.setDarkMode(ADD_ACTION);
76
+ this.setStoredDarkMode();
77
+ }
78
+ /**
79
+ * Sets the dark mode state to inactive.
80
+ */
81
+ disableDarkMode() {
82
+ this.setDarkMode(REMOVE_ACTION);
83
+ this.setStoredDarkMode();
84
+ }
85
+ /**
86
+ * Returns a boolean value that indicates the dark mode state is active (true), or not (false).
87
+ * @returns true whether the dark mode state is active; false otherwise.
88
+ */
89
+ darkModeEnabled() {
90
+ return this._darkModeEnbled;
91
+ }
92
+ /**
93
+ * Removes the dark mode information from local storage.
94
+ */
95
+ invalidateStorage() {
96
+ localStorage.removeItem(this._storageKey);
97
+ }
98
+ // --> Private methods
99
+ initDarkMode(config) {
100
+ this._darkModeEnbled = config.darkModeEnbled || false;
101
+ this._cssProperty = config.cssProperty || CSS_PROP;
102
+ this._storageKey = config.storageKey || STORAGE_KEY;
103
+ if (this._darkModeEnbled) {
104
+ this.enableDarkMode();
105
+ }
106
+ else {
107
+ this.initStoredDarkMode();
108
+ }
109
+ if (config.detectBrowserSettings)
110
+ this.initBrowserMode();
111
+ }
112
+ initStoredDarkMode() {
113
+ const result = localStorage.getItem(this._storageKey);
114
+ if (result === "true")
115
+ this.enableDarkMode();
116
+ }
117
+ setStoredDarkMode() {
118
+ const data = String(this._darkModeEnbled);
119
+ localStorage.setItem(this._storageKey, data);
120
+ }
121
+ setDarkMode(action) {
122
+ const classList = this._document.body.classList;
123
+ if (action === ADD_ACTION) {
124
+ classList.add(this._cssProperty);
125
+ this._darkModeEnbled = true;
126
+ }
127
+ else if (action === REMOVE_ACTION) {
128
+ classList.remove(this._cssProperty);
129
+ this._darkModeEnbled = false;
130
+ }
131
+ this.change.emit(this._darkModeEnbled);
132
+ }
133
+ initBrowserMode() {
134
+ if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {
135
+ this.enableDarkMode();
136
+ }
137
+ else {
138
+ this.disableDarkMode();
139
+ }
140
+ }
141
+ }
142
+ DarkModeService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DarkModeService, deps: [{ token: DOCUMENT }, { token: DARK_MODE_CONFIG }], target: i0.ɵɵFactoryTarget.Injectable });
143
+ DarkModeService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DarkModeService, providedIn: 'root' });
144
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DarkModeService, decorators: [{
145
+ type: Injectable,
146
+ args: [{
147
+ providedIn: 'root'
148
+ }]
149
+ }], ctorParameters: function () { return [{ type: Document, decorators: [{
150
+ type: Inject,
151
+ args: [DOCUMENT]
152
+ }] }, { type: undefined, decorators: [{
153
+ type: Inject,
154
+ args: [DARK_MODE_CONFIG]
155
+ }] }]; } });
156
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGFyay1tb2RlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLXRvb2xib3gvc3JjL2xpYi9zZXJ2aWNlL3VpL2RhcmstbW9kZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7O0FBRTNDLHlCQUF5QjtBQUN6QixNQUFNLFdBQVcsR0FBVyxlQUFlLENBQUM7QUFDNUMsTUFBTSxRQUFRLEdBQVcsV0FBVyxDQUFDO0FBQ3JDLE1BQU0sVUFBVSxHQUFXLEtBQUssQ0FBQztBQUNqQyxNQUFNLGFBQWEsR0FBVyxRQUFRLENBQUM7QUE2QnZDOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQW1CO0lBRTVDOzs7T0FHRztJQUNILGNBQWMsRUFBRSxLQUFLO0lBRXJCOzs7T0FHRztJQUNILHFCQUFxQixFQUFFLElBQUk7SUFFM0I7OztPQUdHO0lBQ0gsV0FBVyxFQUFFLFFBQVE7SUFFckI7OztPQUdHO0lBQ0gsVUFBVSxFQUFFLFdBQVc7Q0FDMUIsQ0FBQztBQUtGOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGVBQWU7SUFheEI7Ozs7T0FJRztJQUNILFlBQXNDLFNBQW1CLEVBQTRCLE1BQXNCO1FBQXJFLGNBQVMsR0FBVCxTQUFTLENBQVU7UUFoQnpELHlCQUF5QjtRQUNqQixvQkFBZSxHQUFZLEtBQUssQ0FBQztRQUNqQyxpQkFBWSxHQUFXLFFBQVEsQ0FBQztRQUNoQyxnQkFBVyxHQUFXLFdBQVcsQ0FBQztRQUUxQzs7O1dBR0c7UUFDYSxXQUFNLEdBQTBCLElBQUksWUFBWSxDQUFVLElBQUksQ0FBQyxDQUFDO1FBUTVFLElBQUksQ0FBQyxZQUFZLENBQUMs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MUUsZUFBZSxjQUxaLE1BQU07MkZBS1QsZUFBZTtrQkFOM0IsVUFBVTttQkFBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDckI7OzBCQXNCZ0IsTUFBTTsyQkFBQyxRQUFROzswQkFBZ0MsTUFBTTsyQkFBQyxnQkFBZ0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuXG4vLyAtLT4gSW50ZXJuYWwgY29uc3RhbnRzXG5jb25zdCBTVE9SQUdFX0tFWTogc3RyaW5nID0gXCJkYXJrLW1vZGUta2V5XCI7XG5jb25zdCBDU1NfUFJPUDogc3RyaW5nID0gXCJkYXJrLW1vZGVcIjtcbmNvbnN0IEFERF9BQ1RJT046IHN0cmluZyA9IFwiYWRkXCI7XG5jb25zdCBSRU1PVkVfQUNUSU9OOiBzdHJpbmcgPSBcInJlbW92ZVwiO1xuXG4vKipcbiAqIERlZmluZXMgcHJvcGVydGllcyBmb3IgdGhlIERhcmtNb2RlU2VydmljZSBjb25maWd1cmF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERhcmtNb2RlQ29uZmlnIHtcblxuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBkYXJrIG1vZGUgaXMgYWN0aXZhdGVkIGJ5IGRlZmF1bHQgKHRydWUpLCBvciBub3QgKGZhbHNlKS5cbiAgICAgKi9cbiAgICBkYXJrTW9kZUVuYmxlZD86IGJvb2xlYW47XG4gICAgXG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGRhcmsgbW9kZSB1c2VzIGJyb3dzZXIgc2V0dGluZ3MgKHRydWUpLCBvciBub3QgKGZhbHNlKS5cbiAgICAgKiBXaGVuIHRydWUsIHRoaXMgcHJvcGVydHkgb3ZlcnJpZGVzIHRoZSBkYXJrTW9kZUVuYmxlZCBwcm9wZXJ0eS5cbiAgICAgKi9cbiAgICBkZXRlY3RCcm93c2VyU2V0dGluZ3M/OiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogQ1NTIHByb3BlcnR5IG5hbWUgdXNlZCB0byBzZXQgdGhlIGRhcmsgbW9kZSBsb29rIGFuZCBmZWVsLlxuICAgICAqL1xuICAgIGNzc1Byb3BlcnR5Pzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogUmVmZXJlbmNlIHRvIHRoZSBrZXkgdmFsdWUgdXNlZCB0byBwZXJzaXN0IHRoZSBkYXJrIG1vZGUgc3RhdGUgdG8gbG9jYWwgc3RvcmFnZS5cbiAgICAgKi9cbiAgICBzdG9yYWdlS2V5Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBkZWZhdWx0IHByb3ZpZGVyIGZvciB0aGUgRGFya01vZGVTZXJ2aWNlIGNvbmZpZ3VyYXRpb24uIFlvdSB0eXBpY2FsbHkgZGVmaW5lXG4gKiB0aGUgY3VzdG9tIHByb3BlcnRpZXMgaW4gdGhlIG1haW4gTmdNb2R1bGUgZGVjbGFyYXRpb24gdG8gaW5pdGlhbGl6ZSB0aGUgYXBwIGRhcmsgbW9kZTpcbiAqIFxuICogQE5nTW9kdWxlKHtcbiAqIC4uLlxuICogcHJvdmlkZXJzOiBbXG4gKiAgIHsgcHJvdmlkZTogREFSS19NT0RFX0NPTkZJRywgdXNlVmFsdWU6IHsgZW5hYmxlRGFya01vZGU6IHRydWV9IH1cbiAqIF0sXG4gKiAuLi5cbiAqIHMpO1xuICovXG5leHBvcnQgY29uc3QgREFSS19NT0RFX0NPTkZJRzogRGFya01vZGVDb25maWcgPSB7XG4gICAgXG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGRhcmsgbW9kZSB1c2VzIGJyb3dzZXIgc2V0dGluZ3MgKHRydWUpLCBvciBub3QgKGZhbHNlKS5cbiAgICAgKiBEZWZhdWx0IHZhbHVlIGlzIGZhbHNlLlxuICAgICAqL1xuICAgIGRhcmtNb2RlRW5ibGVkOiBmYWxzZSxcbiAgICBcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZGFyayBtb2RlIHVzZXMgYnJvd3NlciBzZXR0aW5ncyAodHJ1ZSksIG9yIG5vdCAoZmFsc2UpLlxuICAgICAqIERlZmF1bHQgdmFsdWUgaXMgdHJ1ZS5cbiAgICAgKi9cbiAgICBkZXRlY3RCcm93c2VyU2V0dGluZ3M6IHRydWUsXG4gICAgXG4gICAgLyoqXG4gICAgICogQ1NTIHByb3BlcnR5IG5hbWUgdXNlZCB0byBzZXQgdGhlIGRhcmsgbW9kZSBsb29rIGFuZCBmZWVsLlxuICAgICAqIERlZmF1bHQgdmFsdWUgaXMgJ2RhcmstbW9kZScuXG4gICAgICovXG4gICAgY3NzUHJvcGVydHk6IENTU19QUk9QLFxuICAgIFxuICAgIC8qKlxuICAgICAqIFJlZmVyZW5jZSB0byB0aGUga2V5IHZhbHVlIHVzZWQgdG8gcGVyc2lzdCB0aGUgZGFyayBtb2RlIHN0YXRlIHRvIGxvY2FsIHN0b3JhZ2UuXG4gICAgICogRGVmYXVsdCB2YWx1ZSBpcyAnZGFyay1tb2RlLWtleScuXG4gICAgICovXG4gICAgc3RvcmFnZUtleTogU1RPUkFHRV9LRVlcbn07XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG4vKipcbiAqIEEgbGlnaHR3ZWlnaHQgc2VydmljZSB0aGF0IHByb3ZpZGVzIERhcmsgTW9kZSBpbXBsZW1lbnRhdGlvbiBmb3IgeW91ciBBbmd1bGFyIGFwcGxpY2F0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgRGFya01vZGVTZXJ2aWNlIHtcblxuICAgIC8vIC0tPiBQcml2YXRlIHByb3BlcnRpZXNcbiAgICBwcml2YXRlIF9kYXJrTW9kZUVuYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHByaXZhdGUgX2Nzc1Byb3BlcnR5OiBzdHJpbmcgPSBDU1NfUFJPUDtcbiAgICBwcml2YXRlIF9zdG9yYWdlS2V5OiBzdHJpbmcgPSBTVE9SQUdFX0tFWTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGlzIHRyaWdnZXJlZCB3aGVuIHRoZSBkYXJrIG1vZGUgY2hhbmdlcy5cbiAgICAgKiBAdHlwZVBhcmFtIEV2ZW50RW1pdHRlcjxib29sZWFuPiB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhlIGRhcmtNb2RlRW5hYmxlZCgpIHByb3BlcnR5LlxuICAgICAqL1xuICAgIHB1YmxpYyByZWFkb25seSBjaGFuZ2U6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4odHJ1ZSk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IERhcmtNb2RlU2VydmljZSBpbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0gX2RvY3VtZW50IHRoZSByZWZlcmVuY2UgdG8gdGhlIERvY3VtZW50IHNpbmdsZXRvbi5cbiAgICAgKiBAcGFyYW0gY29uZmlnIHRoZSByZWZlcmVuY2UgdG8gdGhlIERhcmtNb2RlQ29uZmlnIHByb3ZpZGVyLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgX2RvY3VtZW50OiBEb2N1bWVudCwgQEluamVjdChEQVJLX01PREVfQ09ORklHKSBjb25maWc6IERhcmtNb2RlQ29uZmlnKSB7XG4gICAgICAgIHRoaXMuaW5pdERhcmtNb2RlKGNvbmZpZyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVG9vZ2xlcyB0aGUgZGFyayBtb2RlIHN0YXRlLlxuICAgICAqL1xuICAgIHB1YmxpYyB0b2dnbGVEYXJrTW9kZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fZGFya01vZGVFbmJsZWQgPyB0aGlzLmRpc2FibGVEYXJrTW9kZSgpIDogdGhpcy5lbmFibGVEYXJrTW9kZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGRhcmsgbW9kZSBzdGF0ZSB0byBhY3RpdmUuXG4gICAgICovXG4gICAgcHVibGljIGVuYWJsZURhcmtNb2RlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNldERhcmtNb2RlKEFERF9BQ1RJT04pO1xuICAgICAgICB0aGlzLnNldFN0b3JlZERhcmtNb2RlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgZGFyayBtb2RlIHN0YXRlIHRvIGluYWN0aXZlLlxuICAgICAqL1xuICAgIHB1YmxpYyBkaXNhYmxlRGFya01vZGUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2V0RGFya01vZGUoUkVNT1ZFX0FDVElPTik7XG4gICAgICAgIHRoaXMuc2V0U3RvcmVkRGFya01vZGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgYm9vbGVhbiB2YWx1ZSB0aGF0IGluZGljYXRlcyB0aGUgZGFyayBtb2RlIHN0YXRlIGlzIGFjdGl2ZSAodHJ1ZSksIG9yIG5vdCAoZmFsc2UpLlxuICAgICAqIEByZXR1cm5zIHRydWUgd2hldGhlciB0aGUgZGFyayBtb2RlIHN0YXRlIGlzIGFjdGl2ZTsgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIHB1YmxpYyBkYXJrTW9kZUVuYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kYXJrTW9kZUVuYmxlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBkYXJrIG1vZGUgaW5mb3JtYXRpb24gZnJvbSBsb2NhbCBzdG9yYWdlLlxuICAgICAqL1xuICAgIHB1YmxpYyBpbnZhbGlkYXRlU3RvcmFnZSgpOiB2b2lkIHtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odGhpcy5fc3RvcmFnZUtleSk7XG4gICAgfVxuXG4gICAgLy8gLS0+IFByaXZhdGUgbWV0aG9kc1xuICAgIHByaXZhdGUgaW5pdERhcmtNb2RlKGNvbmZpZzogRGFya01vZGVDb25maWcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fZGFya01vZGVFbmJsZWQgPSBjb25maWcuZGFya01vZGVFbmJsZWQgfHwgZmFsc2U7XG4gICAgICAgIHRoaXMuX2Nzc1Byb3BlcnR5ID0gY29uZmlnLmNzc1Byb3BlcnR5IHx8IENTU19QUk9QO1xuICAgICAgICB0aGlzLl9zdG9yYWdlS2V5ID0gY29uZmlnLnN0b3JhZ2VLZXkgfHwgU1RPUkFHRV9LRVk7XG4gICAgICAgIGlmICh0aGlzLl9kYXJrTW9kZUVuYmxlZCkge1xuICAgICAgICAgICAgdGhpcy5lbmFibGVEYXJrTW9kZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5pbml0U3RvcmVkRGFya01vZGUoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlnLmRldGVjdEJyb3dzZXJTZXR0aW5ncykgdGhpcy5pbml0QnJvd3Nlck1vZGUoKTtcbiAgICB9XG4gICAgXG4gICAgcHJpdmF0ZSBpbml0U3RvcmVkRGFya01vZGUoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHJlc3VsdDogc3RyaW5nIHwgbnVsbCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuX3N0b3JhZ2VLZXkpO1xuICAgICAgICBpZiAocmVzdWx0ID09PSBcInRydWVcIikgdGhpcy5lbmFibGVEYXJrTW9kZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0U3RvcmVkRGFya01vZGUoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGRhdGE6IHN0cmluZyA9IFN0cmluZyh0aGlzLl9kYXJrTW9kZUVuYmxlZCk7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMuX3N0b3JhZ2VLZXksIGRhdGEpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0RGFya01vZGUoYWN0aW9uOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY2xhc3NMaXN0OiBET01Ub2tlbkxpc3QgPSB0aGlzLl9kb2N1bWVudC5ib2R5LmNsYXNzTGlzdDtcbiAgICAgICAgaWYgKGFjdGlvbiA9PT0gQUREX0FDVElPTikge1xuICAgICAgICAgICAgY2xhc3NMaXN0LmFkZCh0aGlzLl9jc3NQcm9wZXJ0eSk7XG4gICAgICAgICAgICB0aGlzLl9kYXJrTW9kZUVuYmxlZCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uID09PSBSRU1PVkVfQUNUSU9OKSB7XG4gICAgICAgICAgICBjbGFzc0xpc3QucmVtb3ZlKHRoaXMuX2Nzc1Byb3BlcnR5KTtcbiAgICAgICAgICAgIHRoaXMuX2RhcmtNb2RlRW5ibGVkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jaGFuZ2UuZW1pdCh0aGlzLl9kYXJrTW9kZUVuYmxlZCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0QnJvd3Nlck1vZGUoKTogdm9pZCB7XG4gICAgICAgIGlmICh3aW5kb3cubWF0Y2hNZWRpYSAmJiB3aW5kb3cubWF0Y2hNZWRpYSgnKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKScpLm1hdGNoZXMpIHtcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlRGFya01vZGUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZGlzYWJsZURhcmtNb2RlKCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbiJdfQ==
@@ -1,6 +1,7 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Pipe, NgModule, Injectable } from '@angular/core';
2
+ import { Pipe, EventEmitter, Injectable, Inject, NgModule } from '@angular/core';
3
3
  import * as i1 from '@angular/platform-browser';
4
+ import { DOCUMENT } from '@angular/common';
4
5
 
5
6
  class SafeHtmlPipe {
6
7
  constructor(_sanitizer) {
@@ -17,17 +18,177 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
17
18
  args: [{ name: 'safeHtml' }]
18
19
  }], ctorParameters: function () { return [{ type: i1.DomSanitizer }]; } });
19
20
 
21
+ // --> Internal constants
22
+ const STORAGE_KEY = "dark-mode-key";
23
+ const CSS_PROP = "dark-mode";
24
+ const ADD_ACTION = "add";
25
+ const REMOVE_ACTION = "remove";
26
+ /**
27
+ * The default provider for the DarkModeService configuration. You typically define
28
+ * the custom properties in the main NgModule declaration to initialize the app dark mode:
29
+ *
30
+ * @NgModule({
31
+ * ...
32
+ * providers: [
33
+ * { provide: DARK_MODE_CONFIG, useValue: { enableDarkMode: true} }
34
+ * ],
35
+ * ...
36
+ * s);
37
+ */
38
+ const DARK_MODE_CONFIG = {
39
+ /**
40
+ * Indicates whether the dark mode uses browser settings (true), or not (false).
41
+ * Default value is false.
42
+ */
43
+ darkModeEnbled: false,
44
+ /**
45
+ * Indicates whether the dark mode uses browser settings (true), or not (false).
46
+ * Default value is true.
47
+ */
48
+ detectBrowserSettings: true,
49
+ /**
50
+ * CSS property name used to set the dark mode look and feel.
51
+ * Default value is 'dark-mode'.
52
+ */
53
+ cssProperty: CSS_PROP,
54
+ /**
55
+ * Reference to the key value used to persist the dark mode state to local storage.
56
+ * Default value is 'dark-mode-key'.
57
+ */
58
+ storageKey: STORAGE_KEY
59
+ };
60
+ /**
61
+ * A lightweight service that provides Dark Mode implementation for your Angular application.
62
+ */
63
+ class DarkModeService {
64
+ /**
65
+ * Creates a new DarkModeService instance.
66
+ * @param _document the reference to the Document singleton.
67
+ * @param config the reference to the DarkModeConfig provider.
68
+ */
69
+ constructor(_document, config) {
70
+ this._document = _document;
71
+ // --> Private properties
72
+ this._darkModeEnbled = false;
73
+ this._cssProperty = CSS_PROP;
74
+ this._storageKey = STORAGE_KEY;
75
+ /**
76
+ * The callback function that is triggered when the dark mode changes.
77
+ * @typeParam EventEmitter<boolean> the value returned by the darkModeEnabled() property.
78
+ */
79
+ this.change = new EventEmitter(true);
80
+ this.initDarkMode(config);
81
+ }
82
+ /**
83
+ * Toogles the dark mode state.
84
+ */
85
+ toggleDarkMode() {
86
+ this._darkModeEnbled ? this.disableDarkMode() : this.enableDarkMode();
87
+ }
88
+ /**
89
+ * Sets the dark mode state to active.
90
+ */
91
+ enableDarkMode() {
92
+ this.setDarkMode(ADD_ACTION);
93
+ this.setStoredDarkMode();
94
+ }
95
+ /**
96
+ * Sets the dark mode state to inactive.
97
+ */
98
+ disableDarkMode() {
99
+ this.setDarkMode(REMOVE_ACTION);
100
+ this.setStoredDarkMode();
101
+ }
102
+ /**
103
+ * Returns a boolean value that indicates the dark mode state is active (true), or not (false).
104
+ * @returns true whether the dark mode state is active; false otherwise.
105
+ */
106
+ darkModeEnabled() {
107
+ return this._darkModeEnbled;
108
+ }
109
+ /**
110
+ * Removes the dark mode information from local storage.
111
+ */
112
+ invalidateStorage() {
113
+ localStorage.removeItem(this._storageKey);
114
+ }
115
+ // --> Private methods
116
+ initDarkMode(config) {
117
+ this._darkModeEnbled = config.darkModeEnbled || false;
118
+ this._cssProperty = config.cssProperty || CSS_PROP;
119
+ this._storageKey = config.storageKey || STORAGE_KEY;
120
+ if (this._darkModeEnbled) {
121
+ this.enableDarkMode();
122
+ }
123
+ else {
124
+ this.initStoredDarkMode();
125
+ }
126
+ if (config.detectBrowserSettings)
127
+ this.initBrowserMode();
128
+ }
129
+ initStoredDarkMode() {
130
+ const result = localStorage.getItem(this._storageKey);
131
+ if (result === "true")
132
+ this.enableDarkMode();
133
+ }
134
+ setStoredDarkMode() {
135
+ const data = String(this._darkModeEnbled);
136
+ localStorage.setItem(this._storageKey, data);
137
+ }
138
+ setDarkMode(action) {
139
+ const classList = this._document.body.classList;
140
+ if (action === ADD_ACTION) {
141
+ classList.add(this._cssProperty);
142
+ this._darkModeEnbled = true;
143
+ }
144
+ else if (action === REMOVE_ACTION) {
145
+ classList.remove(this._cssProperty);
146
+ this._darkModeEnbled = false;
147
+ }
148
+ this.change.emit(this._darkModeEnbled);
149
+ }
150
+ initBrowserMode() {
151
+ if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {
152
+ this.enableDarkMode();
153
+ }
154
+ else {
155
+ this.disableDarkMode();
156
+ }
157
+ }
158
+ }
159
+ DarkModeService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DarkModeService, deps: [{ token: DOCUMENT }, { token: DARK_MODE_CONFIG }], target: i0.ɵɵFactoryTarget.Injectable });
160
+ DarkModeService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DarkModeService, providedIn: 'root' });
161
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DarkModeService, decorators: [{
162
+ type: Injectable,
163
+ args: [{
164
+ providedIn: 'root'
165
+ }]
166
+ }], ctorParameters: function () {
167
+ return [{ type: Document, decorators: [{
168
+ type: Inject,
169
+ args: [DOCUMENT]
170
+ }] }, { type: undefined, decorators: [{
171
+ type: Inject,
172
+ args: [DARK_MODE_CONFIG]
173
+ }] }];
174
+ } });
175
+
20
176
  class AngularToolboxModule {
21
177
  }
22
178
  AngularToolboxModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: AngularToolboxModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
23
179
  AngularToolboxModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.9", ngImport: i0, type: AngularToolboxModule, declarations: [SafeHtmlPipe], exports: [SafeHtmlPipe] });
24
- AngularToolboxModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: AngularToolboxModule });
180
+ AngularToolboxModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: AngularToolboxModule, providers: [
181
+ { provide: DARK_MODE_CONFIG, useValue: DARK_MODE_CONFIG }
182
+ ] });
25
183
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: AngularToolboxModule, decorators: [{
26
184
  type: NgModule,
27
185
  args: [{
28
186
  declarations: [
29
187
  SafeHtmlPipe
30
188
  ],
189
+ providers: [
190
+ { provide: DARK_MODE_CONFIG, useValue: DARK_MODE_CONFIG }
191
+ ],
31
192
  exports: [
32
193
  SafeHtmlPipe
33
194
  ]
@@ -102,5 +263,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
102
263
  * Generated bundle index. Do not edit.
103
264
  */
104
265
 
105
- export { AngularToolboxModule, SafeHtmlPipe, SubscriptionService };
266
+ export { AngularToolboxModule, DARK_MODE_CONFIG, DarkModeService, SafeHtmlPipe, SubscriptionService };
106
267
  //# sourceMappingURL=angular-toolbox.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"angular-toolbox.mjs","sources":["../../../projects/angular-toolbox/src/lib/pipe/safe/safe-html.pipe.ts","../../../projects/angular-toolbox/src/lib/angular-toolbox.module.ts","../../../projects/angular-toolbox/src/lib/service/subscription/subscription.service.ts","../../../projects/angular-toolbox/src/public-api.ts","../../../projects/angular-toolbox/src/angular-toolbox.ts"],"sourcesContent":["import { DomSanitizer, SafeHtml } from '@angular/platform-browser'\r\nimport { PipeTransform, Pipe } from \"@angular/core\";\r\n\r\n@Pipe({ name: 'safeHtml'})\r\nexport class SafeHtmlPipe implements PipeTransform {\r\n\r\n constructor(private _sanitizer: DomSanitizer) {}\r\n\r\n public transform(value: string): SafeHtml {\r\n return this._sanitizer.bypassSecurityTrustHtml(value);\r\n }\r\n}","import { NgModule } from '@angular/core';\r\nimport { SafeHtmlPipe } from './pipe/safe/safe-html.pipe';\r\n\r\n@NgModule({\r\n declarations: [\r\n SafeHtmlPipe\r\n ],\r\n exports: [\r\n SafeHtmlPipe\r\n ]\r\n})\r\nexport class AngularToolboxModule { }","import { Injectable } from '@angular/core';\nimport { Subscription } from 'rxjs';\n\n@Injectable({\n providedIn: 'root'\n})\n/**\n * A lightweight service that helps to manage unregistration issues of Angular subscriptions.\n */\nexport class SubscriptionService {\n\n /**\n * The internal Subscription instances storage.\n */\n private _subMap: Map<String, Array<Subscription>> = new Map<String, Array<Subscription>>();\n\n /**\n * Stores a new Subscription instance associated with the specified reference.\n * \n * @param ref the reference for which to store a new Subscription instance.\n * @param subscription the Subscription instance to register.\n * @returns a reference to this SubscriptionService instance.\n */\n public register(ref: String, subscription: Subscription): SubscriptionService {\n if (!this._subMap.has(ref)) this._subMap.set(ref, []);\n this._subMap.get(ref)?.push(subscription);\n return this;\n }\n \n /**\n * Unsubscribes and removes all Subscription instances associated with the specified reference.\n * \n * @param ref the reference for which to remove all Subscription instances.\n * @returns true whether the specified reference exists; false otherwise.\n */\n public clearAll(ref: String): boolean {\n let result: boolean = false;\n if (this._subMap.has(ref)) {\n this._subMap.get(ref)?.forEach(subscription => subscription.unsubscribe());\n this._subMap.delete(ref);\n result = true;\n }\n return result;\n }\n\n /**\n * Returns all Subscription instances associated with the specified reference.\n * \n * @param ref the reference for which to remove get Subscription instances.\n * @returns all Subscription instances associated with the specified reference, or whether\n * the specified reference does not exists.\n */\n public get(ref: String): Array<Subscription> | null {\n return this._subMap.get(ref) || null;\n }\n}\n","/*\n * Public API Surface of angular-toolbox\n */\n\nexport * from './lib/angular-toolbox.module';\nexport * from './lib/pipe';\nexport * from './lib/service';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"angular-toolbox.mjs","sources":["../../../projects/angular-toolbox/src/lib/pipe/safe/safe-html.pipe.ts","../../../projects/angular-toolbox/src/lib/service/ui/dark-mode.service.ts","../../../projects/angular-toolbox/src/lib/angular-toolbox.module.ts","../../../projects/angular-toolbox/src/lib/service/subscription/subscription.service.ts","../../../projects/angular-toolbox/src/public-api.ts","../../../projects/angular-toolbox/src/angular-toolbox.ts"],"sourcesContent":["import { DomSanitizer, SafeHtml } from '@angular/platform-browser'\r\nimport { PipeTransform, Pipe } from \"@angular/core\";\r\n\r\n@Pipe({ name: 'safeHtml'})\r\nexport class SafeHtmlPipe implements PipeTransform {\r\n\r\n constructor(private _sanitizer: DomSanitizer) {}\r\n\r\n public transform(value: string): SafeHtml {\r\n return this._sanitizer.bypassSecurityTrustHtml(value);\r\n }\r\n}","import { Inject, Injectable, EventEmitter } from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\n\n// --> Internal constants\nconst STORAGE_KEY: string = \"dark-mode-key\";\nconst CSS_PROP: string = \"dark-mode\";\nconst ADD_ACTION: string = \"add\";\nconst REMOVE_ACTION: string = \"remove\";\n\n/**\n * Defines properties for the DarkModeService configuration.\n */\nexport interface DarkModeConfig {\n\n /**\n * Indicates whether the dark mode is activated by default (true), or not (false).\n */\n darkModeEnbled?: boolean;\n \n /**\n * Indicates whether the dark mode uses browser settings (true), or not (false).\n * When true, this property overrides the darkModeEnbled property.\n */\n detectBrowserSettings?: boolean;\n\n /**\n * CSS property name used to set the dark mode look and feel.\n */\n cssProperty?: string;\n\n /**\n * Reference to the key value used to persist the dark mode state to local storage.\n */\n storageKey?: string;\n}\n\n/**\n * The default provider for the DarkModeService configuration. You typically define\n * the custom properties in the main NgModule declaration to initialize the app dark mode:\n * \n * @NgModule({\n * ...\n * providers: [\n * { provide: DARK_MODE_CONFIG, useValue: { enableDarkMode: true} }\n * ],\n * ...\n * s);\n */\nexport const DARK_MODE_CONFIG: DarkModeConfig = {\n \n /**\n * Indicates whether the dark mode uses browser settings (true), or not (false).\n * Default value is false.\n */\n darkModeEnbled: false,\n \n /**\n * Indicates whether the dark mode uses browser settings (true), or not (false).\n * Default value is true.\n */\n detectBrowserSettings: true,\n \n /**\n * CSS property name used to set the dark mode look and feel.\n * Default value is 'dark-mode'.\n */\n cssProperty: CSS_PROP,\n \n /**\n * Reference to the key value used to persist the dark mode state to local storage.\n * Default value is 'dark-mode-key'.\n */\n storageKey: STORAGE_KEY\n};\n\n@Injectable({\n providedIn: 'root'\n})\n/**\n * A lightweight service that provides Dark Mode implementation for your Angular application.\n */\nexport class DarkModeService {\n\n // --> Private properties\n private _darkModeEnbled: boolean = false;\n private _cssProperty: string = CSS_PROP;\n private _storageKey: string = STORAGE_KEY;\n\n /**\n * The callback function that is triggered when the dark mode changes.\n * @typeParam EventEmitter<boolean> the value returned by the darkModeEnabled() property.\n */\n public readonly change: EventEmitter<boolean> = new EventEmitter<boolean>(true);\n\n /**\n * Creates a new DarkModeService instance.\n * @param _document the reference to the Document singleton.\n * @param config the reference to the DarkModeConfig provider.\n */\n constructor(@Inject(DOCUMENT) private _document: Document, @Inject(DARK_MODE_CONFIG) config: DarkModeConfig) {\n this.initDarkMode(config);\n }\n\n /**\n * Toogles the dark mode state.\n */\n public toggleDarkMode(): void {\n this._darkModeEnbled ? this.disableDarkMode() : this.enableDarkMode();\n }\n\n /**\n * Sets the dark mode state to active.\n */\n public enableDarkMode(): void {\n this.setDarkMode(ADD_ACTION);\n this.setStoredDarkMode();\n }\n\n /**\n * Sets the dark mode state to inactive.\n */\n public disableDarkMode(): void {\n this.setDarkMode(REMOVE_ACTION);\n this.setStoredDarkMode();\n }\n\n /**\n * Returns a boolean value that indicates the dark mode state is active (true), or not (false).\n * @returns true whether the dark mode state is active; false otherwise.\n */\n public darkModeEnabled(): boolean {\n return this._darkModeEnbled;\n }\n\n /**\n * Removes the dark mode information from local storage.\n */\n public invalidateStorage(): void {\n localStorage.removeItem(this._storageKey);\n }\n\n // --> Private methods\n private initDarkMode(config: DarkModeConfig): void {\n this._darkModeEnbled = config.darkModeEnbled || false;\n this._cssProperty = config.cssProperty || CSS_PROP;\n this._storageKey = config.storageKey || STORAGE_KEY;\n if (this._darkModeEnbled) {\n this.enableDarkMode();\n } else {\n this.initStoredDarkMode();\n }\n if (config.detectBrowserSettings) this.initBrowserMode();\n }\n \n private initStoredDarkMode(): void {\n const result: string | null = localStorage.getItem(this._storageKey);\n if (result === \"true\") this.enableDarkMode();\n }\n\n private setStoredDarkMode(): void {\n const data: string = String(this._darkModeEnbled);\n localStorage.setItem(this._storageKey, data);\n }\n\n private setDarkMode(action: string): void {\n const classList: DOMTokenList = this._document.body.classList;\n if (action === ADD_ACTION) {\n classList.add(this._cssProperty);\n this._darkModeEnbled = true;\n } else if (action === REMOVE_ACTION) {\n classList.remove(this._cssProperty);\n this._darkModeEnbled = false;\n }\n this.change.emit(this._darkModeEnbled);\n }\n\n private initBrowserMode(): void {\n if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {\n this.enableDarkMode();\n } else {\n this.disableDarkMode();\n }\n }\n}\n\n","import { NgModule } from '@angular/core';\r\nimport { SafeHtmlPipe } from './pipe/safe/safe-html.pipe';\r\nimport { DARK_MODE_CONFIG } from './service/ui/dark-mode.service';\r\n\r\n@NgModule({\r\n declarations: [\r\n SafeHtmlPipe\r\n ],\r\n providers: [\r\n { provide: DARK_MODE_CONFIG, useValue: DARK_MODE_CONFIG }\r\n ],\r\n exports: [\r\n SafeHtmlPipe\r\n ]\r\n})\r\nexport class AngularToolboxModule { }","import { Injectable } from '@angular/core';\nimport { Subscription } from 'rxjs';\n\n@Injectable({\n providedIn: 'root'\n})\n/**\n * A lightweight service that helps to manage unregistration issues of Angular subscriptions.\n */\nexport class SubscriptionService {\n\n /**\n * The internal Subscription instances storage.\n */\n private _subMap: Map<String, Array<Subscription>> = new Map<String, Array<Subscription>>();\n\n /**\n * Stores a new Subscription instance associated with the specified reference.\n * \n * @param ref the reference for which to store a new Subscription instance.\n * @param subscription the Subscription instance to register.\n * @returns a reference to this SubscriptionService instance.\n */\n public register(ref: String, subscription: Subscription): SubscriptionService {\n if (!this._subMap.has(ref)) this._subMap.set(ref, []);\n this._subMap.get(ref)?.push(subscription);\n return this;\n }\n \n /**\n * Unsubscribes and removes all Subscription instances associated with the specified reference.\n * \n * @param ref the reference for which to remove all Subscription instances.\n * @returns true whether the specified reference exists; false otherwise.\n */\n public clearAll(ref: String): boolean {\n let result: boolean = false;\n if (this._subMap.has(ref)) {\n this._subMap.get(ref)?.forEach(subscription => subscription.unsubscribe());\n this._subMap.delete(ref);\n result = true;\n }\n return result;\n }\n\n /**\n * Returns all Subscription instances associated with the specified reference.\n * \n * @param ref the reference for which to remove get Subscription instances.\n * @returns all Subscription instances associated with the specified reference, or whether\n * the specified reference does not exists.\n */\n public get(ref: String): Array<Subscription> | null {\n return this._subMap.get(ref) || null;\n }\n}\n","/*\n * Public API Surface of angular-toolbox\n */\n\nexport * from './lib/angular-toolbox.module';\nexport * from './lib/pipe';\nexport * from './lib/service';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Pipe, NgModule, Injectable } from '@angular/core';
2
+ import { Pipe, EventEmitter, Injectable, Inject, NgModule } from '@angular/core';
3
3
  import * as i1 from '@angular/platform-browser';
4
+ import { DOCUMENT } from '@angular/common';
4
5
 
5
6
  class SafeHtmlPipe {
6
7
  constructor(_sanitizer) {
@@ -17,17 +18,175 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
17
18
  args: [{ name: 'safeHtml' }]
18
19
  }], ctorParameters: function () { return [{ type: i1.DomSanitizer }]; } });
19
20
 
21
+ // --> Internal constants
22
+ const STORAGE_KEY = "dark-mode-key";
23
+ const CSS_PROP = "dark-mode";
24
+ const ADD_ACTION = "add";
25
+ const REMOVE_ACTION = "remove";
26
+ /**
27
+ * The default provider for the DarkModeService configuration. You typically define
28
+ * the custom properties in the main NgModule declaration to initialize the app dark mode:
29
+ *
30
+ * @NgModule({
31
+ * ...
32
+ * providers: [
33
+ * { provide: DARK_MODE_CONFIG, useValue: { enableDarkMode: true} }
34
+ * ],
35
+ * ...
36
+ * s);
37
+ */
38
+ const DARK_MODE_CONFIG = {
39
+ /**
40
+ * Indicates whether the dark mode uses browser settings (true), or not (false).
41
+ * Default value is false.
42
+ */
43
+ darkModeEnbled: false,
44
+ /**
45
+ * Indicates whether the dark mode uses browser settings (true), or not (false).
46
+ * Default value is true.
47
+ */
48
+ detectBrowserSettings: true,
49
+ /**
50
+ * CSS property name used to set the dark mode look and feel.
51
+ * Default value is 'dark-mode'.
52
+ */
53
+ cssProperty: CSS_PROP,
54
+ /**
55
+ * Reference to the key value used to persist the dark mode state to local storage.
56
+ * Default value is 'dark-mode-key'.
57
+ */
58
+ storageKey: STORAGE_KEY
59
+ };
60
+ /**
61
+ * A lightweight service that provides Dark Mode implementation for your Angular application.
62
+ */
63
+ class DarkModeService {
64
+ /**
65
+ * Creates a new DarkModeService instance.
66
+ * @param _document the reference to the Document singleton.
67
+ * @param config the reference to the DarkModeConfig provider.
68
+ */
69
+ constructor(_document, config) {
70
+ this._document = _document;
71
+ // --> Private properties
72
+ this._darkModeEnbled = false;
73
+ this._cssProperty = CSS_PROP;
74
+ this._storageKey = STORAGE_KEY;
75
+ /**
76
+ * The callback function that is triggered when the dark mode changes.
77
+ * @typeParam EventEmitter<boolean> the value returned by the darkModeEnabled() property.
78
+ */
79
+ this.change = new EventEmitter(true);
80
+ this.initDarkMode(config);
81
+ }
82
+ /**
83
+ * Toogles the dark mode state.
84
+ */
85
+ toggleDarkMode() {
86
+ this._darkModeEnbled ? this.disableDarkMode() : this.enableDarkMode();
87
+ }
88
+ /**
89
+ * Sets the dark mode state to active.
90
+ */
91
+ enableDarkMode() {
92
+ this.setDarkMode(ADD_ACTION);
93
+ this.setStoredDarkMode();
94
+ }
95
+ /**
96
+ * Sets the dark mode state to inactive.
97
+ */
98
+ disableDarkMode() {
99
+ this.setDarkMode(REMOVE_ACTION);
100
+ this.setStoredDarkMode();
101
+ }
102
+ /**
103
+ * Returns a boolean value that indicates the dark mode state is active (true), or not (false).
104
+ * @returns true whether the dark mode state is active; false otherwise.
105
+ */
106
+ darkModeEnabled() {
107
+ return this._darkModeEnbled;
108
+ }
109
+ /**
110
+ * Removes the dark mode information from local storage.
111
+ */
112
+ invalidateStorage() {
113
+ localStorage.removeItem(this._storageKey);
114
+ }
115
+ // --> Private methods
116
+ initDarkMode(config) {
117
+ this._darkModeEnbled = config.darkModeEnbled || false;
118
+ this._cssProperty = config.cssProperty || CSS_PROP;
119
+ this._storageKey = config.storageKey || STORAGE_KEY;
120
+ if (this._darkModeEnbled) {
121
+ this.enableDarkMode();
122
+ }
123
+ else {
124
+ this.initStoredDarkMode();
125
+ }
126
+ if (config.detectBrowserSettings)
127
+ this.initBrowserMode();
128
+ }
129
+ initStoredDarkMode() {
130
+ const result = localStorage.getItem(this._storageKey);
131
+ if (result === "true")
132
+ this.enableDarkMode();
133
+ }
134
+ setStoredDarkMode() {
135
+ const data = String(this._darkModeEnbled);
136
+ localStorage.setItem(this._storageKey, data);
137
+ }
138
+ setDarkMode(action) {
139
+ const classList = this._document.body.classList;
140
+ if (action === ADD_ACTION) {
141
+ classList.add(this._cssProperty);
142
+ this._darkModeEnbled = true;
143
+ }
144
+ else if (action === REMOVE_ACTION) {
145
+ classList.remove(this._cssProperty);
146
+ this._darkModeEnbled = false;
147
+ }
148
+ this.change.emit(this._darkModeEnbled);
149
+ }
150
+ initBrowserMode() {
151
+ if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {
152
+ this.enableDarkMode();
153
+ }
154
+ else {
155
+ this.disableDarkMode();
156
+ }
157
+ }
158
+ }
159
+ DarkModeService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DarkModeService, deps: [{ token: DOCUMENT }, { token: DARK_MODE_CONFIG }], target: i0.ɵɵFactoryTarget.Injectable });
160
+ DarkModeService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DarkModeService, providedIn: 'root' });
161
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DarkModeService, decorators: [{
162
+ type: Injectable,
163
+ args: [{
164
+ providedIn: 'root'
165
+ }]
166
+ }], ctorParameters: function () { return [{ type: Document, decorators: [{
167
+ type: Inject,
168
+ args: [DOCUMENT]
169
+ }] }, { type: undefined, decorators: [{
170
+ type: Inject,
171
+ args: [DARK_MODE_CONFIG]
172
+ }] }]; } });
173
+
20
174
  class AngularToolboxModule {
21
175
  }
22
176
  AngularToolboxModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: AngularToolboxModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
23
177
  AngularToolboxModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.9", ngImport: i0, type: AngularToolboxModule, declarations: [SafeHtmlPipe], exports: [SafeHtmlPipe] });
24
- AngularToolboxModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: AngularToolboxModule });
178
+ AngularToolboxModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: AngularToolboxModule, providers: [
179
+ { provide: DARK_MODE_CONFIG, useValue: DARK_MODE_CONFIG }
180
+ ] });
25
181
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: AngularToolboxModule, decorators: [{
26
182
  type: NgModule,
27
183
  args: [{
28
184
  declarations: [
29
185
  SafeHtmlPipe
30
186
  ],
187
+ providers: [
188
+ { provide: DARK_MODE_CONFIG, useValue: DARK_MODE_CONFIG }
189
+ ],
31
190
  exports: [
32
191
  SafeHtmlPipe
33
192
  ]
@@ -100,5 +259,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
100
259
  * Generated bundle index. Do not edit.
101
260
  */
102
261
 
103
- export { AngularToolboxModule, SafeHtmlPipe, SubscriptionService };
262
+ export { AngularToolboxModule, DARK_MODE_CONFIG, DarkModeService, SafeHtmlPipe, SubscriptionService };
104
263
  //# sourceMappingURL=angular-toolbox.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"angular-toolbox.mjs","sources":["../../../projects/angular-toolbox/src/lib/pipe/safe/safe-html.pipe.ts","../../../projects/angular-toolbox/src/lib/angular-toolbox.module.ts","../../../projects/angular-toolbox/src/lib/service/subscription/subscription.service.ts","../../../projects/angular-toolbox/src/public-api.ts","../../../projects/angular-toolbox/src/angular-toolbox.ts"],"sourcesContent":["import { DomSanitizer, SafeHtml } from '@angular/platform-browser'\r\nimport { PipeTransform, Pipe } from \"@angular/core\";\r\n\r\n@Pipe({ name: 'safeHtml'})\r\nexport class SafeHtmlPipe implements PipeTransform {\r\n\r\n constructor(private _sanitizer: DomSanitizer) {}\r\n\r\n public transform(value: string): SafeHtml {\r\n return this._sanitizer.bypassSecurityTrustHtml(value);\r\n }\r\n}","import { NgModule } from '@angular/core';\r\nimport { SafeHtmlPipe } from './pipe/safe/safe-html.pipe';\r\n\r\n@NgModule({\r\n declarations: [\r\n SafeHtmlPipe\r\n ],\r\n exports: [\r\n SafeHtmlPipe\r\n ]\r\n})\r\nexport class AngularToolboxModule { }","import { Injectable } from '@angular/core';\nimport { Subscription } from 'rxjs';\n\n@Injectable({\n providedIn: 'root'\n})\n/**\n * A lightweight service that helps to manage unregistration issues of Angular subscriptions.\n */\nexport class SubscriptionService {\n\n /**\n * The internal Subscription instances storage.\n */\n private _subMap: Map<String, Array<Subscription>> = new Map<String, Array<Subscription>>();\n\n /**\n * Stores a new Subscription instance associated with the specified reference.\n * \n * @param ref the reference for which to store a new Subscription instance.\n * @param subscription the Subscription instance to register.\n * @returns a reference to this SubscriptionService instance.\n */\n public register(ref: String, subscription: Subscription): SubscriptionService {\n if (!this._subMap.has(ref)) this._subMap.set(ref, []);\n this._subMap.get(ref)?.push(subscription);\n return this;\n }\n \n /**\n * Unsubscribes and removes all Subscription instances associated with the specified reference.\n * \n * @param ref the reference for which to remove all Subscription instances.\n * @returns true whether the specified reference exists; false otherwise.\n */\n public clearAll(ref: String): boolean {\n let result: boolean = false;\n if (this._subMap.has(ref)) {\n this._subMap.get(ref)?.forEach(subscription => subscription.unsubscribe());\n this._subMap.delete(ref);\n result = true;\n }\n return result;\n }\n\n /**\n * Returns all Subscription instances associated with the specified reference.\n * \n * @param ref the reference for which to remove get Subscription instances.\n * @returns all Subscription instances associated with the specified reference, or whether\n * the specified reference does not exists.\n */\n public get(ref: String): Array<Subscription> | null {\n return this._subMap.get(ref) || null;\n }\n}\n","/*\n * Public API Surface of angular-toolbox\n */\n\nexport * from './lib/angular-toolbox.module';\nexport * from './lib/pipe';\nexport * from './lib/service';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"angular-toolbox.mjs","sources":["../../../projects/angular-toolbox/src/lib/pipe/safe/safe-html.pipe.ts","../../../projects/angular-toolbox/src/lib/service/ui/dark-mode.service.ts","../../../projects/angular-toolbox/src/lib/angular-toolbox.module.ts","../../../projects/angular-toolbox/src/lib/service/subscription/subscription.service.ts","../../../projects/angular-toolbox/src/public-api.ts","../../../projects/angular-toolbox/src/angular-toolbox.ts"],"sourcesContent":["import { DomSanitizer, SafeHtml } from '@angular/platform-browser'\r\nimport { PipeTransform, Pipe } from \"@angular/core\";\r\n\r\n@Pipe({ name: 'safeHtml'})\r\nexport class SafeHtmlPipe implements PipeTransform {\r\n\r\n constructor(private _sanitizer: DomSanitizer) {}\r\n\r\n public transform(value: string): SafeHtml {\r\n return this._sanitizer.bypassSecurityTrustHtml(value);\r\n }\r\n}","import { Inject, Injectable, EventEmitter } from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\n\n// --> Internal constants\nconst STORAGE_KEY: string = \"dark-mode-key\";\nconst CSS_PROP: string = \"dark-mode\";\nconst ADD_ACTION: string = \"add\";\nconst REMOVE_ACTION: string = \"remove\";\n\n/**\n * Defines properties for the DarkModeService configuration.\n */\nexport interface DarkModeConfig {\n\n /**\n * Indicates whether the dark mode is activated by default (true), or not (false).\n */\n darkModeEnbled?: boolean;\n \n /**\n * Indicates whether the dark mode uses browser settings (true), or not (false).\n * When true, this property overrides the darkModeEnbled property.\n */\n detectBrowserSettings?: boolean;\n\n /**\n * CSS property name used to set the dark mode look and feel.\n */\n cssProperty?: string;\n\n /**\n * Reference to the key value used to persist the dark mode state to local storage.\n */\n storageKey?: string;\n}\n\n/**\n * The default provider for the DarkModeService configuration. You typically define\n * the custom properties in the main NgModule declaration to initialize the app dark mode:\n * \n * @NgModule({\n * ...\n * providers: [\n * { provide: DARK_MODE_CONFIG, useValue: { enableDarkMode: true} }\n * ],\n * ...\n * s);\n */\nexport const DARK_MODE_CONFIG: DarkModeConfig = {\n \n /**\n * Indicates whether the dark mode uses browser settings (true), or not (false).\n * Default value is false.\n */\n darkModeEnbled: false,\n \n /**\n * Indicates whether the dark mode uses browser settings (true), or not (false).\n * Default value is true.\n */\n detectBrowserSettings: true,\n \n /**\n * CSS property name used to set the dark mode look and feel.\n * Default value is 'dark-mode'.\n */\n cssProperty: CSS_PROP,\n \n /**\n * Reference to the key value used to persist the dark mode state to local storage.\n * Default value is 'dark-mode-key'.\n */\n storageKey: STORAGE_KEY\n};\n\n@Injectable({\n providedIn: 'root'\n})\n/**\n * A lightweight service that provides Dark Mode implementation for your Angular application.\n */\nexport class DarkModeService {\n\n // --> Private properties\n private _darkModeEnbled: boolean = false;\n private _cssProperty: string = CSS_PROP;\n private _storageKey: string = STORAGE_KEY;\n\n /**\n * The callback function that is triggered when the dark mode changes.\n * @typeParam EventEmitter<boolean> the value returned by the darkModeEnabled() property.\n */\n public readonly change: EventEmitter<boolean> = new EventEmitter<boolean>(true);\n\n /**\n * Creates a new DarkModeService instance.\n * @param _document the reference to the Document singleton.\n * @param config the reference to the DarkModeConfig provider.\n */\n constructor(@Inject(DOCUMENT) private _document: Document, @Inject(DARK_MODE_CONFIG) config: DarkModeConfig) {\n this.initDarkMode(config);\n }\n\n /**\n * Toogles the dark mode state.\n */\n public toggleDarkMode(): void {\n this._darkModeEnbled ? this.disableDarkMode() : this.enableDarkMode();\n }\n\n /**\n * Sets the dark mode state to active.\n */\n public enableDarkMode(): void {\n this.setDarkMode(ADD_ACTION);\n this.setStoredDarkMode();\n }\n\n /**\n * Sets the dark mode state to inactive.\n */\n public disableDarkMode(): void {\n this.setDarkMode(REMOVE_ACTION);\n this.setStoredDarkMode();\n }\n\n /**\n * Returns a boolean value that indicates the dark mode state is active (true), or not (false).\n * @returns true whether the dark mode state is active; false otherwise.\n */\n public darkModeEnabled(): boolean {\n return this._darkModeEnbled;\n }\n\n /**\n * Removes the dark mode information from local storage.\n */\n public invalidateStorage(): void {\n localStorage.removeItem(this._storageKey);\n }\n\n // --> Private methods\n private initDarkMode(config: DarkModeConfig): void {\n this._darkModeEnbled = config.darkModeEnbled || false;\n this._cssProperty = config.cssProperty || CSS_PROP;\n this._storageKey = config.storageKey || STORAGE_KEY;\n if (this._darkModeEnbled) {\n this.enableDarkMode();\n } else {\n this.initStoredDarkMode();\n }\n if (config.detectBrowserSettings) this.initBrowserMode();\n }\n \n private initStoredDarkMode(): void {\n const result: string | null = localStorage.getItem(this._storageKey);\n if (result === \"true\") this.enableDarkMode();\n }\n\n private setStoredDarkMode(): void {\n const data: string = String(this._darkModeEnbled);\n localStorage.setItem(this._storageKey, data);\n }\n\n private setDarkMode(action: string): void {\n const classList: DOMTokenList = this._document.body.classList;\n if (action === ADD_ACTION) {\n classList.add(this._cssProperty);\n this._darkModeEnbled = true;\n } else if (action === REMOVE_ACTION) {\n classList.remove(this._cssProperty);\n this._darkModeEnbled = false;\n }\n this.change.emit(this._darkModeEnbled);\n }\n\n private initBrowserMode(): void {\n if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {\n this.enableDarkMode();\n } else {\n this.disableDarkMode();\n }\n }\n}\n\n","import { NgModule } from '@angular/core';\r\nimport { SafeHtmlPipe } from './pipe/safe/safe-html.pipe';\r\nimport { DARK_MODE_CONFIG } from './service/ui/dark-mode.service';\r\n\r\n@NgModule({\r\n declarations: [\r\n SafeHtmlPipe\r\n ],\r\n providers: [\r\n { provide: DARK_MODE_CONFIG, useValue: DARK_MODE_CONFIG }\r\n ],\r\n exports: [\r\n SafeHtmlPipe\r\n ]\r\n})\r\nexport class AngularToolboxModule { }","import { Injectable } from '@angular/core';\nimport { Subscription } from 'rxjs';\n\n@Injectable({\n providedIn: 'root'\n})\n/**\n * A lightweight service that helps to manage unregistration issues of Angular subscriptions.\n */\nexport class SubscriptionService {\n\n /**\n * The internal Subscription instances storage.\n */\n private _subMap: Map<String, Array<Subscription>> = new Map<String, Array<Subscription>>();\n\n /**\n * Stores a new Subscription instance associated with the specified reference.\n * \n * @param ref the reference for which to store a new Subscription instance.\n * @param subscription the Subscription instance to register.\n * @returns a reference to this SubscriptionService instance.\n */\n public register(ref: String, subscription: Subscription): SubscriptionService {\n if (!this._subMap.has(ref)) this._subMap.set(ref, []);\n this._subMap.get(ref)?.push(subscription);\n return this;\n }\n \n /**\n * Unsubscribes and removes all Subscription instances associated with the specified reference.\n * \n * @param ref the reference for which to remove all Subscription instances.\n * @returns true whether the specified reference exists; false otherwise.\n */\n public clearAll(ref: String): boolean {\n let result: boolean = false;\n if (this._subMap.has(ref)) {\n this._subMap.get(ref)?.forEach(subscription => subscription.unsubscribe());\n this._subMap.delete(ref);\n result = true;\n }\n return result;\n }\n\n /**\n * Returns all Subscription instances associated with the specified reference.\n * \n * @param ref the reference for which to remove get Subscription instances.\n * @returns all Subscription instances associated with the specified reference, or whether\n * the specified reference does not exists.\n */\n public get(ref: String): Array<Subscription> | null {\n return this._subMap.get(ref) || null;\n }\n}\n","/*\n * Public API Surface of angular-toolbox\n */\n\nexport * from './lib/angular-toolbox.module';\nexport * from './lib/pipe';\nexport * from './lib/service';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -1 +1,2 @@
1
1
  export * from './subscription/subscription.service';
2
+ export * from './ui/dark-mode.service';
@@ -0,0 +1,82 @@
1
+ import { EventEmitter } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ /**
4
+ * Defines properties for the DarkModeService configuration.
5
+ */
6
+ export interface DarkModeConfig {
7
+ /**
8
+ * Indicates whether the dark mode is activated by default (true), or not (false).
9
+ */
10
+ darkModeEnbled?: boolean;
11
+ /**
12
+ * Indicates whether the dark mode uses browser settings (true), or not (false).
13
+ * When true, this property overrides the darkModeEnbled property.
14
+ */
15
+ detectBrowserSettings?: boolean;
16
+ /**
17
+ * CSS property name used to set the dark mode look and feel.
18
+ */
19
+ cssProperty?: string;
20
+ /**
21
+ * Reference to the key value used to persist the dark mode state to local storage.
22
+ */
23
+ storageKey?: string;
24
+ }
25
+ /**
26
+ * The default provider for the DarkModeService configuration. You typically define
27
+ * the custom properties in the main NgModule declaration to initialize the app dark mode:
28
+ *
29
+ * @NgModule({
30
+ * ...
31
+ * providers: [
32
+ * { provide: DARK_MODE_CONFIG, useValue: { enableDarkMode: true} }
33
+ * ],
34
+ * ...
35
+ * s);
36
+ */
37
+ export declare const DARK_MODE_CONFIG: DarkModeConfig;
38
+ export declare class DarkModeService {
39
+ private _document;
40
+ private _darkModeEnbled;
41
+ private _cssProperty;
42
+ private _storageKey;
43
+ /**
44
+ * The callback function that is triggered when the dark mode changes.
45
+ * @typeParam EventEmitter<boolean> the value returned by the darkModeEnabled() property.
46
+ */
47
+ readonly change: EventEmitter<boolean>;
48
+ /**
49
+ * Creates a new DarkModeService instance.
50
+ * @param _document the reference to the Document singleton.
51
+ * @param config the reference to the DarkModeConfig provider.
52
+ */
53
+ constructor(_document: Document, config: DarkModeConfig);
54
+ /**
55
+ * Toogles the dark mode state.
56
+ */
57
+ toggleDarkMode(): void;
58
+ /**
59
+ * Sets the dark mode state to active.
60
+ */
61
+ enableDarkMode(): void;
62
+ /**
63
+ * Sets the dark mode state to inactive.
64
+ */
65
+ disableDarkMode(): void;
66
+ /**
67
+ * Returns a boolean value that indicates the dark mode state is active (true), or not (false).
68
+ * @returns true whether the dark mode state is active; false otherwise.
69
+ */
70
+ darkModeEnabled(): boolean;
71
+ /**
72
+ * Removes the dark mode information from local storage.
73
+ */
74
+ invalidateStorage(): void;
75
+ private initDarkMode;
76
+ private initStoredDarkMode;
77
+ private setStoredDarkMode;
78
+ private setDarkMode;
79
+ private initBrowserMode;
80
+ static ɵfac: i0.ɵɵFactoryDeclaration<DarkModeService, never>;
81
+ static ɵprov: i0.ɵɵInjectableDeclaration<DarkModeService>;
82
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "angular-toolbox",
3
- "version": "0.0.2",
3
+ "version": "0.0.5",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^15.1.0",
6
6
  "@angular/core": "^15.1.0"