@molecule/app-angular 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +115 -0
- package/dist/i18n-reactive.d.ts +41 -0
- package/dist/i18n-reactive.d.ts.map +1 -0
- package/dist/i18n-reactive.js +46 -0
- package/dist/i18n-reactive.js.map +1 -0
- package/dist/index.d.ts +84 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +84 -0
- package/dist/index.js.map +1 -0
- package/dist/providers.d.ts +96 -0
- package/dist/providers.d.ts.map +1 -0
- package/dist/providers.js +144 -0
- package/dist/providers.js.map +1 -0
- package/dist/services/async-state.service.d.ts +50 -0
- package/dist/services/async-state.service.d.ts.map +1 -0
- package/dist/services/async-state.service.js +109 -0
- package/dist/services/async-state.service.js.map +1 -0
- package/dist/services/auth.service.d.ts +105 -0
- package/dist/services/auth.service.d.ts.map +1 -0
- package/dist/services/auth.service.js +124 -0
- package/dist/services/auth.service.js.map +1 -0
- package/dist/services/capacitor-app.service.d.ts +46 -0
- package/dist/services/capacitor-app.service.d.ts.map +1 -0
- package/dist/services/capacitor-app.service.js +53 -0
- package/dist/services/capacitor-app.service.js.map +1 -0
- package/dist/services/change-password.service.d.ts +37 -0
- package/dist/services/change-password.service.d.ts.map +1 -0
- package/dist/services/change-password.service.js +34 -0
- package/dist/services/change-password.service.js.map +1 -0
- package/dist/services/device.service.d.ts +35 -0
- package/dist/services/device.service.d.ts.map +1 -0
- package/dist/services/device.service.js +29 -0
- package/dist/services/device.service.js.map +1 -0
- package/dist/services/forms.service.d.ts +237 -0
- package/dist/services/forms.service.d.ts.map +1 -0
- package/dist/services/forms.service.js +280 -0
- package/dist/services/forms.service.js.map +1 -0
- package/dist/services/http.service.d.ts +118 -0
- package/dist/services/http.service.d.ts.map +1 -0
- package/dist/services/http.service.js +171 -0
- package/dist/services/http.service.js.map +1 -0
- package/dist/services/i18n.service.d.ts +111 -0
- package/dist/services/i18n.service.d.ts.map +1 -0
- package/dist/services/i18n.service.js +135 -0
- package/dist/services/i18n.service.js.map +1 -0
- package/dist/services/index.d.ts +27 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +27 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/logger.service.d.ts +79 -0
- package/dist/services/logger.service.d.ts.map +1 -0
- package/dist/services/logger.service.js +110 -0
- package/dist/services/logger.service.js.map +1 -0
- package/dist/services/login.service.d.ts +37 -0
- package/dist/services/login.service.d.ts.map +1 -0
- package/dist/services/login.service.js +34 -0
- package/dist/services/login.service.js.map +1 -0
- package/dist/services/oauth.service.d.ts +110 -0
- package/dist/services/oauth.service.d.ts.map +1 -0
- package/dist/services/oauth.service.js +214 -0
- package/dist/services/oauth.service.js.map +1 -0
- package/dist/services/password-reset.service.d.ts +41 -0
- package/dist/services/password-reset.service.d.ts.map +1 -0
- package/dist/services/password-reset.service.js +45 -0
- package/dist/services/password-reset.service.js.map +1 -0
- package/dist/services/platform.service.d.ts +39 -0
- package/dist/services/platform.service.d.ts.map +1 -0
- package/dist/services/platform.service.js +33 -0
- package/dist/services/platform.service.js.map +1 -0
- package/dist/services/promise.service.d.ts +40 -0
- package/dist/services/promise.service.d.ts.map +1 -0
- package/dist/services/promise.service.js +85 -0
- package/dist/services/promise.service.js.map +1 -0
- package/dist/services/push.service.d.ts +45 -0
- package/dist/services/push.service.d.ts.map +1 -0
- package/dist/services/push.service.js +64 -0
- package/dist/services/push.service.js.map +1 -0
- package/dist/services/router.service.d.ts +114 -0
- package/dist/services/router.service.d.ts.map +1 -0
- package/dist/services/router.service.js +142 -0
- package/dist/services/router.service.js.map +1 -0
- package/dist/services/signup.service.d.ts +37 -0
- package/dist/services/signup.service.d.ts.map +1 -0
- package/dist/services/signup.service.js +34 -0
- package/dist/services/signup.service.js.map +1 -0
- package/dist/services/state.service.d.ts +82 -0
- package/dist/services/state.service.d.ts.map +1 -0
- package/dist/services/state.service.js +122 -0
- package/dist/services/state.service.js.map +1 -0
- package/dist/services/storage.service.d.ts +111 -0
- package/dist/services/storage.service.d.ts.map +1 -0
- package/dist/services/storage.service.js +167 -0
- package/dist/services/storage.service.js.map +1 -0
- package/dist/services/theme.service.d.ts +89 -0
- package/dist/services/theme.service.d.ts.map +1 -0
- package/dist/services/theme.service.js +116 -0
- package/dist/services/theme.service.js.map +1 -0
- package/dist/services/version.service.d.ts +44 -0
- package/dist/services/version.service.d.ts.map +1 -0
- package/dist/services/version.service.js +63 -0
- package/dist/services/version.service.js.map +1 -0
- package/dist/tokens.d.ts +47 -0
- package/dist/tokens.d.ts.map +1 -0
- package/dist/tokens.js +39 -0
- package/dist/tokens.js.map +1 -0
- package/dist/types.d.ts +42 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +7 -0
- package/dist/types.js.map +1 -0
- package/package.json +61 -0
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Angular service for state management.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import { type OnDestroy } from '@angular/core';
|
|
7
|
+
import { type Observable } from 'rxjs';
|
|
8
|
+
import type { StateProvider, Store } from '@molecule/app-state';
|
|
9
|
+
import * as i0 from "@angular/core";
|
|
10
|
+
/**
|
|
11
|
+
* Angular service for state management.
|
|
12
|
+
*
|
|
13
|
+
* Wraps molecule state stores and exposes them as RxJS observables.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```typescript
|
|
17
|
+
* @Component({
|
|
18
|
+
* selector: 'app-counter',
|
|
19
|
+
* template: `
|
|
20
|
+
* <div>Count: {{ count$ | async }}</div>
|
|
21
|
+
* <button (click)="increment()">Increment</button>
|
|
22
|
+
* `
|
|
23
|
+
* })
|
|
24
|
+
* export class CounterComponent {
|
|
25
|
+
* count$ = this.stateService.select(counterStore, s => s.count)
|
|
26
|
+
*
|
|
27
|
+
* constructor(private stateService: MoleculeStateService) {}
|
|
28
|
+
*
|
|
29
|
+
* increment() {
|
|
30
|
+
* counterStore.setState(s => ({ count: s.count + 1 }))
|
|
31
|
+
* }
|
|
32
|
+
* }
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export declare class MoleculeStateService implements OnDestroy {
|
|
36
|
+
private provider;
|
|
37
|
+
private subscriptions;
|
|
38
|
+
private subjects;
|
|
39
|
+
constructor(provider: StateProvider);
|
|
40
|
+
/**
|
|
41
|
+
* Get an observable of the full store state.
|
|
42
|
+
*
|
|
43
|
+
* @param store - The store to observe
|
|
44
|
+
* @returns Observable of the store state
|
|
45
|
+
*/
|
|
46
|
+
observe<T>(store: Store<T>): Observable<T>;
|
|
47
|
+
/**
|
|
48
|
+
* Select a piece of state from a store.
|
|
49
|
+
*
|
|
50
|
+
* @param store - The store to select from
|
|
51
|
+
* @param selector - Selector function
|
|
52
|
+
* @returns Observable of the selected state
|
|
53
|
+
*/
|
|
54
|
+
select<T, S>(store: Store<T>, selector: (state: T) => S): Observable<S>;
|
|
55
|
+
/**
|
|
56
|
+
* Get the current snapshot of a store's state.
|
|
57
|
+
*
|
|
58
|
+
* @param store - The store
|
|
59
|
+
* @returns The result.
|
|
60
|
+
*/
|
|
61
|
+
snapshot<T>(store: Store<T>): T;
|
|
62
|
+
/**
|
|
63
|
+
* Update a store's state.
|
|
64
|
+
*
|
|
65
|
+
* @param store - The store to update
|
|
66
|
+
* @param partial - Partial state or updater function
|
|
67
|
+
*/
|
|
68
|
+
update<T>(store: Store<T>, partial: Partial<T> | ((state: T) => Partial<T>)): void;
|
|
69
|
+
/**
|
|
70
|
+
* Gets or creates a BehaviorSubject for the given store.
|
|
71
|
+
* @param store - The data store to observe.
|
|
72
|
+
* @returns The BehaviorSubject tracking the store state.
|
|
73
|
+
*/
|
|
74
|
+
private getOrCreateSubject;
|
|
75
|
+
/**
|
|
76
|
+
* Cleans up all store subscriptions and completes subjects on service destruction.
|
|
77
|
+
*/
|
|
78
|
+
ngOnDestroy(): void;
|
|
79
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<MoleculeStateService, never>;
|
|
80
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<MoleculeStateService>;
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=state.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.service.d.ts","sourceRoot":"","sources":["../../src/services/state.service.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAsB,KAAK,SAAS,EAAE,MAAM,eAAe,CAAA;AAClE,OAAO,EAA8C,KAAK,UAAU,EAAE,MAAM,MAAM,CAAA;AAElF,OAAO,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAA;;AAI/D;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,qBAMa,oBAAqB,YAAW,SAAS;IAIhB,OAAO,CAAC,QAAQ;IAHpD,OAAO,CAAC,aAAa,CAAwC;IAC7D,OAAO,CAAC,QAAQ,CAAsD;gBAE1B,QAAQ,EAAE,aAAa;IAEnE;;;;;OAKG;IACH,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC;IAI1C;;;;;;OAMG;IACH,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC;IAIvE;;;;;OAKG;IACH,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC;IAI/B;;;;;OAKG;IACH,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI;IAIlF;;;;OAIG;IACH,OAAO,CAAC,kBAAkB;IAgB1B;;OAEG;IACH,WAAW,IAAI,IAAI;yCAvER,oBAAoB;6CAApB,oBAAoB;CAgFhC"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Angular service for state management.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import { Inject, Injectable } from '@angular/core';
|
|
7
|
+
import { BehaviorSubject, distinctUntilChanged, map } from 'rxjs';
|
|
8
|
+
import { STATE_PROVIDER } from '../tokens.js';
|
|
9
|
+
import * as i0 from "@angular/core";
|
|
10
|
+
/**
|
|
11
|
+
* Angular service for state management.
|
|
12
|
+
*
|
|
13
|
+
* Wraps molecule state stores and exposes them as RxJS observables.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```typescript
|
|
17
|
+
* @Component({
|
|
18
|
+
* selector: 'app-counter',
|
|
19
|
+
* template: `
|
|
20
|
+
* <div>Count: {{ count$ | async }}</div>
|
|
21
|
+
* <button (click)="increment()">Increment</button>
|
|
22
|
+
* `
|
|
23
|
+
* })
|
|
24
|
+
* export class CounterComponent {
|
|
25
|
+
* count$ = this.stateService.select(counterStore, s => s.count)
|
|
26
|
+
*
|
|
27
|
+
* constructor(private stateService: MoleculeStateService) {}
|
|
28
|
+
*
|
|
29
|
+
* increment() {
|
|
30
|
+
* counterStore.setState(s => ({ count: s.count + 1 }))
|
|
31
|
+
* }
|
|
32
|
+
* }
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
/**
|
|
36
|
+
* Molecule State Service class.
|
|
37
|
+
*/
|
|
38
|
+
export class MoleculeStateService {
|
|
39
|
+
constructor(provider) {
|
|
40
|
+
this.provider = provider;
|
|
41
|
+
this.subscriptions = new Map();
|
|
42
|
+
this.subjects = new Map();
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Get an observable of the full store state.
|
|
46
|
+
*
|
|
47
|
+
* @param store - The store to observe
|
|
48
|
+
* @returns Observable of the store state
|
|
49
|
+
*/
|
|
50
|
+
observe(store) {
|
|
51
|
+
return this.getOrCreateSubject(store).asObservable();
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Select a piece of state from a store.
|
|
55
|
+
*
|
|
56
|
+
* @param store - The store to select from
|
|
57
|
+
* @param selector - Selector function
|
|
58
|
+
* @returns Observable of the selected state
|
|
59
|
+
*/
|
|
60
|
+
select(store, selector) {
|
|
61
|
+
return this.observe(store).pipe(map(selector), distinctUntilChanged());
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Get the current snapshot of a store's state.
|
|
65
|
+
*
|
|
66
|
+
* @param store - The store
|
|
67
|
+
* @returns The result.
|
|
68
|
+
*/
|
|
69
|
+
snapshot(store) {
|
|
70
|
+
return store.getState();
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Update a store's state.
|
|
74
|
+
*
|
|
75
|
+
* @param store - The store to update
|
|
76
|
+
* @param partial - Partial state or updater function
|
|
77
|
+
*/
|
|
78
|
+
update(store, partial) {
|
|
79
|
+
store.setState(partial);
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Gets or creates a BehaviorSubject for the given store.
|
|
83
|
+
* @param store - The data store to observe.
|
|
84
|
+
* @returns The BehaviorSubject tracking the store state.
|
|
85
|
+
*/
|
|
86
|
+
getOrCreateSubject(store) {
|
|
87
|
+
let subject = this.subjects.get(store);
|
|
88
|
+
if (!subject) {
|
|
89
|
+
subject = new BehaviorSubject(store.getState());
|
|
90
|
+
this.subjects.set(store, subject);
|
|
91
|
+
const unsubscribe = store.subscribe(() => {
|
|
92
|
+
subject.next(store.getState());
|
|
93
|
+
});
|
|
94
|
+
this.subscriptions.set(store, unsubscribe);
|
|
95
|
+
}
|
|
96
|
+
return subject;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Cleans up all store subscriptions and completes subjects on service destruction.
|
|
100
|
+
*/
|
|
101
|
+
ngOnDestroy() {
|
|
102
|
+
// Clean up all subscriptions
|
|
103
|
+
this.subscriptions.forEach((unsubscribe) => unsubscribe());
|
|
104
|
+
this.subscriptions.clear();
|
|
105
|
+
// Complete all subjects
|
|
106
|
+
this.subjects.forEach((subject) => subject.complete());
|
|
107
|
+
this.subjects.clear();
|
|
108
|
+
}
|
|
109
|
+
static { this.ɵfac = function MoleculeStateService_Factory(__ngFactoryType__) { /* @ts-ignore */
|
|
110
|
+
return new (__ngFactoryType__ || MoleculeStateService)(i0.ɵɵinject(STATE_PROVIDER)); }; }
|
|
111
|
+
static { this.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: MoleculeStateService, factory: MoleculeStateService.ɵfac, providedIn: 'root' }); }
|
|
112
|
+
}
|
|
113
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MoleculeStateService, [{
|
|
114
|
+
type: Injectable,
|
|
115
|
+
args: [{
|
|
116
|
+
providedIn: 'root',
|
|
117
|
+
}]
|
|
118
|
+
}], () => [{ type: undefined, decorators: [{
|
|
119
|
+
type: Inject,
|
|
120
|
+
args: [STATE_PROVIDER]
|
|
121
|
+
}] }], null); })();
|
|
122
|
+
//# sourceMappingURL=state.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.service.js","sourceRoot":"","sources":["../../src/services/state.service.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAE,UAAU,EAAkB,MAAM,eAAe,CAAA;AAClE,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,GAAG,EAAmB,MAAM,MAAM,CAAA;AAIlF,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;;AAE7C;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAIH;;GAEG;AACH,MAAM,OAAO,oBAAoB;IAI/B,YAA4C,QAAuB;QAAvB,aAAQ,GAAR,QAAQ,CAAe;QAH3D,kBAAa,GAAG,IAAI,GAAG,EAA8B,CAAA;QACrD,aAAQ,GAAG,IAAI,GAAG,EAA4C,CAAA;IAEA,CAAC;IAEvE;;;;;OAKG;IACH,OAAO,CAAI,KAAe;QACxB,OAAO,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,YAAY,EAAmB,CAAA;IACvE,CAAC;IAED;;;;;;OAMG;IACH,MAAM,CAAO,KAAe,EAAE,QAAyB;QACrD,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,oBAAoB,EAAE,CAAC,CAAA;IACxE,CAAC;IAED;;;;;OAKG;IACH,QAAQ,CAAI,KAAe;QACzB,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAA;IACzB,CAAC;IAED;;;;;OAKG;IACH,MAAM,CAAI,KAAe,EAAE,OAAgD;QACzE,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;IACzB,CAAC;IAED;;;;OAIG;IACK,kBAAkB,CAAI,KAAe;QAC3C,IAAI,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAuB,CAAmC,CAAA;QAE1F,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,GAAG,IAAI,eAAe,CAAI,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAA;YAClD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAuB,EAAE,OAAmC,CAAC,CAAA;YAE/E,MAAM,WAAW,GAAG,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;gBACvC,OAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAA;YACjC,CAAC,CAAC,CAAA;YACF,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAuB,EAAE,WAAW,CAAC,CAAA;QAC9D,CAAC;QAED,OAAO,OAAO,CAAA;IAChB,CAAC;IAED;;OAEG;IACH,WAAW;QACT,6BAA6B;QAC7B,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,EAAE,CAAC,CAAA;QAC1D,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAA;QAE1B,wBAAwB;QACxB,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAA;QACtD,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAA;IACvB,CAAC;;qCA/EU,oBAAoB,cAIX,cAAc;uEAJvB,oBAAoB,WAApB,oBAAoB,mBALnB,MAAM;;iFAKP,oBAAoB;cANhC,UAAU;eAAC;gBACV,UAAU,EAAE,MAAM;aACnB;;sBAQc,MAAM;uBAAC,cAAc"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { BehaviorSubject, type Observable } from 'rxjs';
|
|
2
|
+
import type { StorageProvider } from '@molecule/app-storage';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
/**
|
|
5
|
+
* State for a storage value.
|
|
6
|
+
*/
|
|
7
|
+
export interface StorageValueState<T> {
|
|
8
|
+
value: T | undefined;
|
|
9
|
+
loading: boolean;
|
|
10
|
+
error: Error | null;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Angular service for storage.
|
|
14
|
+
*
|
|
15
|
+
* Wraps molecule storage provider and returns RxJS observables.
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```typescript
|
|
19
|
+
* @Component({
|
|
20
|
+
* selector: 'app-settings',
|
|
21
|
+
* template: `
|
|
22
|
+
* <div *ngIf="themeState$ | async as state">
|
|
23
|
+
* <select
|
|
24
|
+
* [value]="state.value"
|
|
25
|
+
* (change)="setTheme($event.target.value)"
|
|
26
|
+
* [disabled]="state.loading"
|
|
27
|
+
* >
|
|
28
|
+
* <option value="light">Light</option>
|
|
29
|
+
* <option value="dark">Dark</option>
|
|
30
|
+
* </select>
|
|
31
|
+
* </div>
|
|
32
|
+
* `
|
|
33
|
+
* })
|
|
34
|
+
* export class SettingsComponent implements OnInit {
|
|
35
|
+
* themeState$ = new BehaviorSubject<StorageValueState<string>>({
|
|
36
|
+
* value: 'light',
|
|
37
|
+
* loading: true,
|
|
38
|
+
* error: null
|
|
39
|
+
* })
|
|
40
|
+
*
|
|
41
|
+
* constructor(private storageService: MoleculeStorageService) {}
|
|
42
|
+
*
|
|
43
|
+
* ngOnInit() {
|
|
44
|
+
* this.storageService.get<string>('theme').subscribe(value => {
|
|
45
|
+
* this.themeState$.next({ value: value ?? 'light', loading: false, error: null })
|
|
46
|
+
* })
|
|
47
|
+
* }
|
|
48
|
+
*
|
|
49
|
+
* setTheme(theme: string) {
|
|
50
|
+
* this.storageService.set('theme', theme).subscribe()
|
|
51
|
+
* }
|
|
52
|
+
* }
|
|
53
|
+
* ```
|
|
54
|
+
*/
|
|
55
|
+
export declare class MoleculeStorageService {
|
|
56
|
+
private provider;
|
|
57
|
+
constructor(provider: StorageProvider);
|
|
58
|
+
/**
|
|
59
|
+
* Get a value from storage.
|
|
60
|
+
*
|
|
61
|
+
* @param key - Storage key
|
|
62
|
+
* @returns Observable of the value
|
|
63
|
+
*/
|
|
64
|
+
get<T>(key: string): Observable<T | null>;
|
|
65
|
+
/**
|
|
66
|
+
* Set a value in storage.
|
|
67
|
+
*
|
|
68
|
+
* @param key - Storage key
|
|
69
|
+
* @param value - Value to store
|
|
70
|
+
* @returns Observable that completes when done
|
|
71
|
+
*/
|
|
72
|
+
set<T>(key: string, value: T): Observable<void>;
|
|
73
|
+
/**
|
|
74
|
+
* Remove a value from storage.
|
|
75
|
+
*
|
|
76
|
+
* @param key - Storage key
|
|
77
|
+
* @returns Observable that completes when done
|
|
78
|
+
*/
|
|
79
|
+
remove(key: string): Observable<void>;
|
|
80
|
+
/**
|
|
81
|
+
* Clear all values from storage.
|
|
82
|
+
*
|
|
83
|
+
* @returns Observable that completes when done
|
|
84
|
+
*/
|
|
85
|
+
clear(): Observable<void>;
|
|
86
|
+
/**
|
|
87
|
+
* Get all keys in storage.
|
|
88
|
+
*
|
|
89
|
+
* @returns Observable of key array
|
|
90
|
+
*/
|
|
91
|
+
keys(): Observable<string[]>;
|
|
92
|
+
/**
|
|
93
|
+
* Create a reactive storage value with auto-loading.
|
|
94
|
+
*
|
|
95
|
+
* @param key - Storage key
|
|
96
|
+
* @param defaultValue - Default value if not found
|
|
97
|
+
* @returns BehaviorSubject that syncs with storage
|
|
98
|
+
*/
|
|
99
|
+
createValue<T>(key: string, defaultValue: T): BehaviorSubject<StorageValueState<T>>;
|
|
100
|
+
/**
|
|
101
|
+
* Update a reactive storage value.
|
|
102
|
+
*
|
|
103
|
+
* @param key - Storage key
|
|
104
|
+
* @param value - New value
|
|
105
|
+
* @param state - State subject to update
|
|
106
|
+
*/
|
|
107
|
+
updateValue<T>(key: string, value: T, state: BehaviorSubject<StorageValueState<T>>): void;
|
|
108
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<MoleculeStorageService, never>;
|
|
109
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<MoleculeStorageService>;
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=storage.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.service.d.ts","sourceRoot":"","sources":["../../src/services/storage.service.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,eAAe,EAAQ,KAAK,UAAU,EAAE,MAAM,MAAM,CAAA;AAE7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;;AAI5D;;GAEG;AACH,MAAM,WAAW,iBAAiB,CAAC,CAAC;IAClC,KAAK,EAAE,CAAC,GAAG,SAAS,CAAA;IACpB,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAA;CACpB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,qBAMa,sBAAsB;IACK,OAAO,CAAC,QAAQ;gBAAR,QAAQ,EAAE,eAAe;IAEvE;;;;;OAKG;IACH,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,UAAU,CAAC,CAAC,GAAG,IAAI,CAAC;IAIzC;;;;;;OAMG;IACH,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC;IAI/C;;;;;OAKG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC;IAIrC;;;;OAIG;IACH,KAAK,IAAI,UAAU,CAAC,IAAI,CAAC;IAIzB;;;;OAIG;IACH,IAAI,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;IAI5B;;;;;;OAMG;IACH,WAAW,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,GAAG,eAAe,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;IA4BnF;;;;;;OAMG;IACH,WAAW,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,eAAe,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI;yCA9F9E,sBAAsB;6CAAtB,sBAAsB;CA0GlC"}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Angular service for storage.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import { Inject, Injectable } from '@angular/core';
|
|
7
|
+
import { BehaviorSubject, from } from 'rxjs';
|
|
8
|
+
import { STORAGE_PROVIDER } from '../tokens.js';
|
|
9
|
+
import * as i0 from "@angular/core";
|
|
10
|
+
/**
|
|
11
|
+
* Angular service for storage.
|
|
12
|
+
*
|
|
13
|
+
* Wraps molecule storage provider and returns RxJS observables.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```typescript
|
|
17
|
+
* @Component({
|
|
18
|
+
* selector: 'app-settings',
|
|
19
|
+
* template: `
|
|
20
|
+
* <div *ngIf="themeState$ | async as state">
|
|
21
|
+
* <select
|
|
22
|
+
* [value]="state.value"
|
|
23
|
+
* (change)="setTheme($event.target.value)"
|
|
24
|
+
* [disabled]="state.loading"
|
|
25
|
+
* >
|
|
26
|
+
* <option value="light">Light</option>
|
|
27
|
+
* <option value="dark">Dark</option>
|
|
28
|
+
* </select>
|
|
29
|
+
* </div>
|
|
30
|
+
* `
|
|
31
|
+
* })
|
|
32
|
+
* export class SettingsComponent implements OnInit {
|
|
33
|
+
* themeState$ = new BehaviorSubject<StorageValueState<string>>({
|
|
34
|
+
* value: 'light',
|
|
35
|
+
* loading: true,
|
|
36
|
+
* error: null
|
|
37
|
+
* })
|
|
38
|
+
*
|
|
39
|
+
* constructor(private storageService: MoleculeStorageService) {}
|
|
40
|
+
*
|
|
41
|
+
* ngOnInit() {
|
|
42
|
+
* this.storageService.get<string>('theme').subscribe(value => {
|
|
43
|
+
* this.themeState$.next({ value: value ?? 'light', loading: false, error: null })
|
|
44
|
+
* })
|
|
45
|
+
* }
|
|
46
|
+
*
|
|
47
|
+
* setTheme(theme: string) {
|
|
48
|
+
* this.storageService.set('theme', theme).subscribe()
|
|
49
|
+
* }
|
|
50
|
+
* }
|
|
51
|
+
* ```
|
|
52
|
+
*/
|
|
53
|
+
/**
|
|
54
|
+
* Molecule Storage Service class.
|
|
55
|
+
*/
|
|
56
|
+
export class MoleculeStorageService {
|
|
57
|
+
constructor(provider) {
|
|
58
|
+
this.provider = provider;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Get a value from storage.
|
|
62
|
+
*
|
|
63
|
+
* @param key - Storage key
|
|
64
|
+
* @returns Observable of the value
|
|
65
|
+
*/
|
|
66
|
+
get(key) {
|
|
67
|
+
return from(this.provider.get(key));
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Set a value in storage.
|
|
71
|
+
*
|
|
72
|
+
* @param key - Storage key
|
|
73
|
+
* @param value - Value to store
|
|
74
|
+
* @returns Observable that completes when done
|
|
75
|
+
*/
|
|
76
|
+
set(key, value) {
|
|
77
|
+
return from(this.provider.set(key, value));
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Remove a value from storage.
|
|
81
|
+
*
|
|
82
|
+
* @param key - Storage key
|
|
83
|
+
* @returns Observable that completes when done
|
|
84
|
+
*/
|
|
85
|
+
remove(key) {
|
|
86
|
+
return from(this.provider.remove(key));
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Clear all values from storage.
|
|
90
|
+
*
|
|
91
|
+
* @returns Observable that completes when done
|
|
92
|
+
*/
|
|
93
|
+
clear() {
|
|
94
|
+
return from(this.provider.clear());
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Get all keys in storage.
|
|
98
|
+
*
|
|
99
|
+
* @returns Observable of key array
|
|
100
|
+
*/
|
|
101
|
+
keys() {
|
|
102
|
+
return from(this.provider.keys());
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Create a reactive storage value with auto-loading.
|
|
106
|
+
*
|
|
107
|
+
* @param key - Storage key
|
|
108
|
+
* @param defaultValue - Default value if not found
|
|
109
|
+
* @returns BehaviorSubject that syncs with storage
|
|
110
|
+
*/
|
|
111
|
+
createValue(key, defaultValue) {
|
|
112
|
+
const state = new BehaviorSubject({
|
|
113
|
+
value: defaultValue,
|
|
114
|
+
loading: true,
|
|
115
|
+
error: null,
|
|
116
|
+
});
|
|
117
|
+
// Load initial value
|
|
118
|
+
this.get(key).subscribe({
|
|
119
|
+
next: (value) => {
|
|
120
|
+
state.next({
|
|
121
|
+
value: value ?? defaultValue,
|
|
122
|
+
loading: false,
|
|
123
|
+
error: null,
|
|
124
|
+
});
|
|
125
|
+
},
|
|
126
|
+
error: (error) => {
|
|
127
|
+
state.next({
|
|
128
|
+
value: defaultValue,
|
|
129
|
+
loading: false,
|
|
130
|
+
error,
|
|
131
|
+
});
|
|
132
|
+
},
|
|
133
|
+
});
|
|
134
|
+
return state;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Update a reactive storage value.
|
|
138
|
+
*
|
|
139
|
+
* @param key - Storage key
|
|
140
|
+
* @param value - New value
|
|
141
|
+
* @param state - State subject to update
|
|
142
|
+
*/
|
|
143
|
+
updateValue(key, value, state) {
|
|
144
|
+
state.next({ ...state.value, loading: true });
|
|
145
|
+
this.set(key, value).subscribe({
|
|
146
|
+
next: () => {
|
|
147
|
+
state.next({ value, loading: false, error: null });
|
|
148
|
+
},
|
|
149
|
+
error: (error) => {
|
|
150
|
+
state.next({ ...state.value, loading: false, error });
|
|
151
|
+
},
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
static { this.ɵfac = function MoleculeStorageService_Factory(__ngFactoryType__) { /* @ts-ignore */
|
|
155
|
+
return new (__ngFactoryType__ || MoleculeStorageService)(i0.ɵɵinject(STORAGE_PROVIDER)); }; }
|
|
156
|
+
static { this.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: MoleculeStorageService, factory: MoleculeStorageService.ɵfac, providedIn: 'root' }); }
|
|
157
|
+
}
|
|
158
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MoleculeStorageService, [{
|
|
159
|
+
type: Injectable,
|
|
160
|
+
args: [{
|
|
161
|
+
providedIn: 'root',
|
|
162
|
+
}]
|
|
163
|
+
}], () => [{ type: undefined, decorators: [{
|
|
164
|
+
type: Inject,
|
|
165
|
+
args: [STORAGE_PROVIDER]
|
|
166
|
+
}] }], null); })();
|
|
167
|
+
//# sourceMappingURL=storage.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.service.js","sourceRoot":"","sources":["../../src/services/storage.service.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAClD,OAAO,EAAE,eAAe,EAAE,IAAI,EAAmB,MAAM,MAAM,CAAA;AAI7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;;AAW/C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AAIH;;GAEG;AACH,MAAM,OAAO,sBAAsB;IACjC,YAA8C,QAAyB;QAAzB,aAAQ,GAAR,QAAQ,CAAiB;IAAG,CAAC;IAE3E;;;;;OAKG;IACH,GAAG,CAAI,GAAW;QAChB,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAI,GAAG,CAAC,CAAC,CAAA;IACxC,CAAC;IAED;;;;;;OAMG;IACH,GAAG,CAAI,GAAW,EAAE,KAAQ;QAC1B,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAA;IAC5C,CAAC;IAED;;;;;OAKG;IACH,MAAM,CAAC,GAAW;QAChB,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;IACxC,CAAC;IAED;;;;OAIG;IACH,KAAK;QACH,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAA;IACpC,CAAC;IAED;;;;OAIG;IACH,IAAI;QACF,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAA;IACnC,CAAC;IAED;;;;;;OAMG;IACH,WAAW,CAAI,GAAW,EAAE,YAAe;QACzC,MAAM,KAAK,GAAG,IAAI,eAAe,CAAuB;YACtD,KAAK,EAAE,YAAY;YACnB,OAAO,EAAE,IAAI;YACb,KAAK,EAAE,IAAI;SACZ,CAAC,CAAA;QAEF,qBAAqB;QACrB,IAAI,CAAC,GAAG,CAAI,GAAG,CAAC,CAAC,SAAS,CAAC;YACzB,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE;gBACd,KAAK,CAAC,IAAI,CAAC;oBACT,KAAK,EAAE,KAAK,IAAI,YAAY;oBAC5B,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,IAAI;iBACZ,CAAC,CAAA;YACJ,CAAC;YACD,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;gBACf,KAAK,CAAC,IAAI,CAAC;oBACT,KAAK,EAAE,YAAY;oBACnB,OAAO,EAAE,KAAK;oBACd,KAAK;iBACN,CAAC,CAAA;YACJ,CAAC;SACF,CAAC,CAAA;QAEF,OAAO,KAAK,CAAA;IACd,CAAC;IAED;;;;;;OAMG;IACH,WAAW,CAAI,GAAW,EAAE,KAAQ,EAAE,KAA4C;QAChF,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;QAE7C,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,SAAS,CAAC;YAC7B,IAAI,EAAE,GAAG,EAAE;gBACT,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;YACpD,CAAC;YACD,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;gBACf,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAA;YACvD,CAAC;SACF,CAAC,CAAA;IACJ,CAAC;;qCAzGU,sBAAsB,cACb,gBAAgB;uEADzB,sBAAsB,WAAtB,sBAAsB,mBALrB,MAAM;;iFAKP,sBAAsB;cANlC,UAAU;eAAC;gBACV,UAAU,EAAE,MAAM;aACnB;;sBAKc,MAAM;uBAAC,gBAAgB"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Angular service for theming.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import { type OnDestroy } from '@angular/core';
|
|
7
|
+
import { type Observable } from 'rxjs';
|
|
8
|
+
import type { Theme, ThemeProvider } from '@molecule/app-theme';
|
|
9
|
+
import * as i0 from "@angular/core";
|
|
10
|
+
/**
|
|
11
|
+
* Angular service for theming.
|
|
12
|
+
*
|
|
13
|
+
* Wraps molecule theme provider and exposes state as RxJS observables.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```typescript
|
|
17
|
+
* @Component({
|
|
18
|
+
* selector: 'app-root',
|
|
19
|
+
* template: `
|
|
20
|
+
* <div [style.background]="(theme$ | async)?.colors.background">
|
|
21
|
+
* <button (click)="toggleTheme()">
|
|
22
|
+
* Theme: {{ themeName$ | async }}
|
|
23
|
+
* </button>
|
|
24
|
+
* </div>
|
|
25
|
+
* `
|
|
26
|
+
* })
|
|
27
|
+
* export class AppComponent {
|
|
28
|
+
* theme$ = this.themeService.theme$
|
|
29
|
+
* themeName$ = this.themeService.themeName$
|
|
30
|
+
*
|
|
31
|
+
* constructor(private themeService: MoleculeThemeService) {}
|
|
32
|
+
*
|
|
33
|
+
* toggleTheme() {
|
|
34
|
+
* this.themeService.toggleTheme()
|
|
35
|
+
* }
|
|
36
|
+
* }
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
39
|
+
export declare class MoleculeThemeService implements OnDestroy {
|
|
40
|
+
private provider;
|
|
41
|
+
private themeSubject;
|
|
42
|
+
private themeNameSubject;
|
|
43
|
+
private unsubscribe;
|
|
44
|
+
/**
|
|
45
|
+
* Observable of the current theme.
|
|
46
|
+
*/
|
|
47
|
+
theme$: Observable<Theme>;
|
|
48
|
+
/**
|
|
49
|
+
* Observable of the current theme name.
|
|
50
|
+
*/
|
|
51
|
+
themeName$: Observable<string>;
|
|
52
|
+
/**
|
|
53
|
+
* Observable of the theme mode (light/dark).
|
|
54
|
+
*/
|
|
55
|
+
mode$: Observable<'light' | 'dark'>;
|
|
56
|
+
constructor(provider: ThemeProvider);
|
|
57
|
+
/**
|
|
58
|
+
* Get the current theme snapshot.
|
|
59
|
+
* @returns The result.
|
|
60
|
+
*/
|
|
61
|
+
get theme(): Theme;
|
|
62
|
+
/**
|
|
63
|
+
* Get the current theme name snapshot.
|
|
64
|
+
* @returns The result.
|
|
65
|
+
*/
|
|
66
|
+
get themeName(): string;
|
|
67
|
+
/**
|
|
68
|
+
* Get available themes.
|
|
69
|
+
* @returns The result.
|
|
70
|
+
*/
|
|
71
|
+
get themes(): Theme[];
|
|
72
|
+
/**
|
|
73
|
+
* Set the current theme.
|
|
74
|
+
*
|
|
75
|
+
* @param name - Theme name
|
|
76
|
+
*/
|
|
77
|
+
setTheme(name: string): void;
|
|
78
|
+
/**
|
|
79
|
+
* Toggle to the next theme.
|
|
80
|
+
*/
|
|
81
|
+
toggleTheme(): void;
|
|
82
|
+
/**
|
|
83
|
+
* Cleans up subscriptions and completes subjects on service destruction.
|
|
84
|
+
*/
|
|
85
|
+
ngOnDestroy(): void;
|
|
86
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<MoleculeThemeService, never>;
|
|
87
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<MoleculeThemeService>;
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=theme.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme.service.d.ts","sourceRoot":"","sources":["../../src/services/theme.service.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAsB,KAAK,SAAS,EAAE,MAAM,eAAe,CAAA;AAClE,OAAO,EAA8C,KAAK,UAAU,EAAE,MAAM,MAAM,CAAA;AAElF,OAAO,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;;AAI/D;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,qBAMa,oBAAqB,YAAW,SAAS;IAoBhB,OAAO,CAAC,QAAQ;IAnBpD,OAAO,CAAC,YAAY,CAAwB;IAC5C,OAAO,CAAC,gBAAgB,CAAyB;IACjD,OAAO,CAAC,WAAW,CAA4B;IAE/C;;OAEG;IACH,MAAM,EAAE,UAAU,CAAC,KAAK,CAAC,CAAA;IAEzB;;OAEG;IACH,UAAU,EAAE,UAAU,CAAC,MAAM,CAAC,CAAA;IAE9B;;OAEG;IACH,KAAK,EAAE,UAAU,CAAC,OAAO,GAAG,MAAM,CAAC,CAAA;gBAES,QAAQ,EAAE,aAAa;IAkBnE;;;OAGG;IACH,IAAI,KAAK,IAAI,KAAK,CAEjB;IAED;;;OAGG;IACH,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED;;;OAGG;IACH,IAAI,MAAM,IAAI,KAAK,EAAE,CAEpB;IAED;;;;OAIG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI5B;;OAEG;IACH,WAAW,IAAI,IAAI;IAQnB;;OAEG;IACH,WAAW,IAAI,IAAI;yCArFR,oBAAoB;6CAApB,oBAAoB;CA0FhC"}
|