@bcodes/ngx-theme-service
Version:
Configurable theme switching service for use with CSS variables
201 lines • 15.3 kB
JavaScript
/**
* @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==