UNPKG

@bcodes/ngx-theme-service

Version:

Configurable theme switching service for use with CSS variables

201 lines 15.3 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { DOCUMENT } from '@angular/common'; import { Inject, Injectable, InjectionToken } from '@angular/core'; import { BehaviorSubject, Subject, timer } from 'rxjs'; import { switchMap, takeUntil, tap } from 'rxjs/operators'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; /** * Apply a CSS class to the `<html>` element when switching themes * @record */ export function ThemeTransitionConfig() { } if (false) { /** @type {?} */ ThemeTransitionConfig.prototype.className; /** * remove class after duration in milliseconds * @type {?} */ ThemeTransitionConfig.prototype.duration; } /** * @record */ export function ThemeServiceConfig() { } if (false) { /** @type {?} */ ThemeServiceConfig.prototype.themes; /** * theme that should always be on the target element if using explicit default theme * @type {?|undefined} */ ThemeServiceConfig.prototype.defaultTheme; /** * optional transition configuration * @type {?|undefined} */ ThemeServiceConfig.prototype.transitionConfig; /** * themes applied to <html> by default. Supply CSS selector to change * @type {?|undefined} */ ThemeServiceConfig.prototype.targetElementSelector; } /** @type {?} */ export const THEME_CONFIG = new InjectionToken('ThemeService: Config'); // https://angular.io/guide/angular-compiler-options#strictmetadataemit // @dynamic export class ThemeService { /** * @param {?} config * @param {?} document */ constructor(config, document) { this.config = config; this.document = document; this.stopListening$ = new Subject(); this.selectedTheme = new BehaviorSubject(this.config.defaultTheme || ''); this.selectedTheme$ = this.selectedTheme.asObservable(); this.setupSubscription(); } /** * @param {?} className * @return {?} */ switchTheme(className) { this.selectedTheme.next(className); } /** * @private * @return {?} */ setupSubscription() { /** @type {?} */ const transitionConfig = this.config.transitionConfig; /** @type {?} */ const nonDefaultThemes = this.config.themes.filter((/** * @param {?} c * @return {?} */ c => c !== this.config.defaultTheme)); this.selectedTheme .pipe(tap((/** * @param {?} theme * @return {?} */ theme => { this.removeClasses(nonDefaultThemes); // Conditional literal entries: // https://2ality.com/2017/04/conditional-literal-entries.html /** @type {?} */ const toAdd = [ ...(theme ? [theme] : []), ...(transitionConfig ? [transitionConfig.className] : []), ]; this.addClasses(toAdd); })), transitionConfig ? switchMap((/** * @param {?} value * @return {?} */ value => { return timer(transitionConfig.duration).pipe(tap((/** * @param {?} x * @return {?} */ x => { this.removeClasses([ transitionConfig.className, ]); }))); })) : tap((/** * @param {?} x * @return {?} */ (x) => { })), takeUntil(this.stopListening$)) .subscribe(); } /** * @private * @param {?} arr * @return {?} */ removeClasses(arr) { this.targetElement.classList.remove(...arr); } /** * @private * @param {?} arr * @return {?} */ addClasses(arr) { this.targetElement.classList.add(...arr); } /** * @private * @return {?} */ get targetElement() { /** @type {?} */ let elem; if (this.config.targetElementSelector) { elem = this.document.querySelector(this.config.targetElementSelector); if (!elem) { console.warn(`${this.config.targetElementSelector} not found, defaulting to <html>`); } } if (!elem) { elem = this.document.documentElement; } return elem; } /** * @return {?} */ ngOnDestroy() { this.stopListening$.next(true); } } ThemeService.decorators = [ { type: Injectable, args: [{ providedIn: 'root', },] } ]; /** @nocollapse */ ThemeService.ctorParameters = () => [ { type: undefined, decorators: [{ type: Inject, args: [THEME_CONFIG,] }] }, { type: Document, decorators: [{ type: Inject, args: [DOCUMENT,] }] } ]; /** @nocollapse */ ThemeService.ngInjectableDef = i0.ɵɵdefineInjectable({ factory: function ThemeService_Factory() { return new ThemeService(i0.ɵɵinject(THEME_CONFIG), i0.ɵɵinject(i1.DOCUMENT)); }, token: ThemeService, providedIn: "root" }); if (false) { /** * @type {?} * @private */ ThemeService.prototype.stopListening$; /** * @type {?} * @private */ ThemeService.prototype.selectedTheme; /** @type {?} */ ThemeService.prototype.selectedTheme$; /** * @type {?} * @private */ ThemeService.prototype.config; /** * @type {?} * @private */ ThemeService.prototype.document; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhlbWUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BiY29kZXMvbmd4LXRoZW1lLXNlcnZpY2UvIiwic291cmNlcyI6WyJsaWIvdGhlbWUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUM5RSxPQUFPLEVBQUUsZUFBZSxFQUFjLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDbkUsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7QUFHM0QsMkNBSUM7OztJQUhHLDBDQUEyQjs7Ozs7SUFFM0IseUNBQTBCOzs7OztBQUc5Qix3Q0FRQzs7O0lBUEcsb0NBQXVDOzs7OztJQUV2QywwQ0FBK0I7Ozs7O0lBRS9CLDhDQUFrRDs7Ozs7SUFFbEQsbURBQXdDOzs7QUFHNUMsTUFBTSxPQUFPLFlBQVksR0FBRyxJQUFJLGNBQWMsQ0FDMUMsc0JBQXNCLENBQ3pCOzs7QUFPRCxNQUFNLE9BQU8sWUFBWTs7Ozs7SUFPckIsWUFDa0MsTUFBMEIsRUFDOUIsUUFBa0I7UUFEZCxXQUFNLEdBQU4sTUFBTSxDQUFvQjtRQUM5QixhQUFRLEdBQVIsUUFBUSxDQUFVO1FBUnhDLG1CQUFjLEdBQUcsSUFBSSxPQUFPLEVBQVcsQ0FBQztRQUN4QyxrQkFBYSxHQUE0QixJQUFJLGVBQWUsQ0FDaEUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLElBQUksRUFBRSxDQUNqQyxDQUFDO1FBQ0YsbUJBQWMsR0FBdUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQU1uRSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUM3QixDQUFDOzs7OztJQUVELFdBQVcsQ0FB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QUF1RTs7Ozs7SUFHbkUsOEJBQXdEOzs7OztJQUN4RCxnQ0FBNEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgSW5qZWN0aW9uVG9rZW4sIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIFN1YmplY3QsIHRpbWVyIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IHN3aXRjaE1hcCwgdGFrZVVudGlsLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG4vKiogQXBwbHkgYSBDU1MgY2xhc3MgdG8gdGhlIGA8aHRtbD5gIGVsZW1lbnQgd2hlbiBzd2l0Y2hpbmcgdGhlbWVzICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgVGhlbWVUcmFuc2l0aW9uQ29uZmlnIHtcclxuICAgIHJlYWRvbmx5IGNsYXNzTmFtZTogc3RyaW5nO1xyXG4gICAgLyoqIHJlbW92ZSBjbGFzcyBhZnRlciBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMgKi9cclxuICAgIHJlYWRvbmx5IGR1cmF0aW9uOiBudW1iZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgVGhlbWVTZXJ2aWNlQ29uZmlnIHtcclxuICAgIHJlYWRvbmx5IHRoZW1lczogUmVhZG9ubHlBcnJheTxzdHJpbmc+O1xyXG4gICAgLyoqIHRoZW1lIHRoYXQgc2hvdWxkIGFsd2F5cyBiZSBvbiB0aGUgdGFyZ2V0IGVsZW1lbnQgaWYgdXNpbmcgZXhwbGljaXQgZGVmYXVsdCB0aGVtZSAqL1xyXG4gICAgcmVhZG9ubHkgZGVmYXVsdFRoZW1lPzogc3RyaW5nO1xyXG4gICAgLyoqIG9wdGlvbmFsIHRyYW5zaXRpb24gY29uZmlndXJhdGlvbiAqL1xyXG4gICAgcmVhZG9ubHkgdHJhbnNpdGlvbkNvbmZpZz86IFRoZW1lVHJhbnNpdGlvbkNvbmZpZztcclxuICAgIC8qKiB0aGVtZXMgYXBwbGllZCB0byA8aHRtbD4gYnkgZGVmYXVsdC4gU3VwcGx5IENTUyBzZWxlY3RvciB0byBjaGFuZ2UgKi9cclxuICAgIHJlYWRvbmx5IHRhcmdldEVsZW1lbnRTZWxlY3Rvcj86IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IFRIRU1FX0NPTkZJRyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxUaGVtZVNlcnZpY2VDb25maWc+KFxyXG4gICAgJ1RoZW1lU2VydmljZTogQ29uZmlnJ1xyXG4pO1xyXG5cclxuLy8gaHR0cHM6Ly9hbmd1bGFyLmlvL2d1aWRlL2FuZ3VsYXItY29tcGlsZXItb3B0aW9ucyNzdHJpY3RtZXRhZGF0YWVtaXRcclxuLy8gQGR5bmFtaWNcclxuQEluamVjdGFibGUoe1xyXG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgVGhlbWVTZXJ2aWNlIGltcGxlbWVudHMgT25EZXN0cm95IHtcclxuICAgIHByaXZhdGUgc3RvcExpc3RlbmluZyQgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xyXG4gICAgcHJpdmF0ZSBzZWxlY3RlZFRoZW1lOiBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPiA9IG5ldyBCZWhhdmlvclN1YmplY3QoXHJcbiAgICAgICAgdGhpcy5jb25maWcuZGVmYXVsdFRoZW1lIHx8ICcnXHJcbiAgICApO1xyXG4gICAgc2VsZWN0ZWRUaGVtZSQ6IE9ic2VydmFibGU8c3RyaW5nPiA9IHRoaXMuc2VsZWN0ZWRUaGVtZS5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBASW5qZWN0KFRIRU1FX0NPTkZJRykgcHJpdmF0ZSBjb25maWc6IFRoZW1lU2VydmljZUNvbmZpZyxcclxuICAgICAgICBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIGRvY3VtZW50OiBEb2N1bWVudFxyXG4gICAgKSB7XHJcbiAgICAgICAgdGhpcy5zZXR1cFN1YnNjcmlwdGlvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIHN3aXRjaFRoZW1lKGNsYXNzTmFtZTogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFRoZW1lLm5leHQoY2xhc3NOYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNldHVwU3Vic2NyaXB0aW9uKCkge1xyXG4gICAgICAgIGNvbnN0IHRyYW5zaXRpb25Db25maWcgPSB0aGlzLmNvbmZpZy50cmFuc2l0aW9uQ29uZmlnO1xyXG4gICAgICAgIGNvbnN0IG5vbkRlZmF1bHRUaGVtZXMgPSB0aGlzLmNvbmZpZy50aGVtZXMuZmlsdGVyKFxyXG4gICAgICAgICAgICBjID0+IGMgIT09IHRoaXMuY29uZmlnLmRlZmF1bHRUaGVtZVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUaGVtZVxyXG4gICAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgICAgIHRhcCh0aGVtZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVDbGFzc2VzKG5vbkRlZmF1bHRUaGVtZXMpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIENvbmRpdGlvbmFsIGxpdGVyYWwgZW50cmllczpcclxuICAgICAgICAgICAgICAgICAgICAvLyBodHRwczovLzJhbGl0eS5jb20vMjAxNy8wNC9jb25kaXRpb25hbC1saXRlcmFsLWVudHJpZXMuaHRtbFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRvQWRkID0gW1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi4odGhlbWUgPyBbdGhlbWVdIDogW10pLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi4odHJhbnNpdGlvbkNvbmZpZ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBbdHJhbnNpdGlvbkNvbmZpZy5jbGFzc05hbWVdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFtdKSxcclxuICAgICAgICAgICAgICAgICAgICBdO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkQ2xhc3Nlcyh0b0FkZCk7XHJcbiAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgICAgIHRyYW5zaXRpb25Db25maWdcclxuICAgICAgICAgICAgICAgICAgICA/IHN3aXRjaE1hcCh2YWx1ZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRpbWVyKHRyYW5zaXRpb25Db25maWcuZHVyYXRpb24pLnBpcGUoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcCh4ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlQ2xhc3NlcyhbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbkNvbmZpZy5jbGFzc05hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICA6IHRhcCgoeDogYW55KSA9PiB7fSksXHJcbiAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5zdG9wTGlzdGVuaW5nJClcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSByZW1vdmVDbGFzc2VzKGFycjogc3RyaW5nW10pIHtcclxuICAgICAgICB0aGlzLnRhcmdldEVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSguLi5hcnIpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYWRkQ2xhc3NlcyhhcnI6IHN0cmluZ1tdKSB7XHJcbiAgICAgICAgdGhpcy50YXJnZXRFbGVtZW50LmNsYXNzTGlzdC5hZGQoLi4uYXJyKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldCB0YXJnZXRFbGVtZW50KCk6IEhUTUxFbGVtZW50IHtcclxuICAgICAgICBsZXQgZWxlbTogSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLnRhcmdldEVsZW1lbnRTZWxlY3Rvcikge1xyXG4gICAgICAgICAgICBlbGVtID0gdGhpcy5kb2N1bWVudC5xdWVyeVNlbGVjdG9yKFxyXG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWcudGFyZ2V0RWxlbWVudFNlbGVjdG9yXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIGlmICghZWxlbSkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFxyXG4gICAgICAgICAgICAgICAgICAgIGAke3RoaXMuY29uZmlnLnRhcmdldEVsZW1lbnRTZWxlY3Rvcn0gbm90IGZvdW5kLCBkZWZhdWx0aW5nIHRvIDxodG1sPmBcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFlbGVtKSB7XHJcbiAgICAgICAgICAgIGVsZW0gPSB0aGlzLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGVsZW07XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5zdG9wTGlzdGVuaW5nJC5uZXh0KHRydWUpO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==