@bcodes/ngx-theme-service
Version:
Configurable theme switching service for use with CSS variables
225 lines • 16.4 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
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 var THEME_CONFIG = new InjectionToken('ThemeService: Config');
// https://angular.io/guide/angular-compiler-options#strictmetadataemit
// @dynamic
var ThemeService = /** @class */ (function () {
function ThemeService(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 {?}
*/
ThemeService.prototype.switchTheme = /**
* @param {?} className
* @return {?}
*/
function (className) {
this.selectedTheme.next(className);
};
/**
* @private
* @return {?}
*/
ThemeService.prototype.setupSubscription = /**
* @private
* @return {?}
*/
function () {
var _this = this;
/** @type {?} */
var transitionConfig = this.config.transitionConfig;
/** @type {?} */
var nonDefaultThemes = this.config.themes.filter((/**
* @param {?} c
* @return {?}
*/
function (c) { return c !== _this.config.defaultTheme; }));
this.selectedTheme
.pipe(tap((/**
* @param {?} theme
* @return {?}
*/
function (theme) {
_this.removeClasses(nonDefaultThemes);
// Conditional literal entries:
// https://2ality.com/2017/04/conditional-literal-entries.html
/** @type {?} */
var toAdd = tslib_1.__spread((theme ? [theme] : []), (transitionConfig
? [transitionConfig.className]
: []));
_this.addClasses(toAdd);
})), transitionConfig
? switchMap((/**
* @param {?} value
* @return {?}
*/
function (value) {
return timer(transitionConfig.duration).pipe(tap((/**
* @param {?} x
* @return {?}
*/
function (x) {
_this.removeClasses([
transitionConfig.className,
]);
})));
}))
: tap((/**
* @param {?} x
* @return {?}
*/
function (x) { })), takeUntil(this.stopListening$))
.subscribe();
};
/**
* @private
* @param {?} arr
* @return {?}
*/
ThemeService.prototype.removeClasses = /**
* @private
* @param {?} arr
* @return {?}
*/
function (arr) {
var _a;
(_a = this.targetElement.classList).remove.apply(_a, tslib_1.__spread(arr));
};
/**
* @private
* @param {?} arr
* @return {?}
*/
ThemeService.prototype.addClasses = /**
* @private
* @param {?} arr
* @return {?}
*/
function (arr) {
var _a;
(_a = this.targetElement.classList).add.apply(_a, tslib_1.__spread(arr));
};
Object.defineProperty(ThemeService.prototype, "targetElement", {
get: /**
* @private
* @return {?}
*/
function () {
/** @type {?} */
var 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;
},
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
ThemeService.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
this.stopListening$.next(true);
};
ThemeService.decorators = [
{ type: Injectable, args: [{
providedIn: 'root',
},] }
];
/** @nocollapse */
ThemeService.ctorParameters = function () { return [
{ 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" });
return ThemeService;
}());
export { ThemeService };
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhlbWUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BiY29kZXMvbmd4LXRoZW1lLXNlcnZpY2UvIiwic291cmNlcyI6WyJsaWIvdGhlbWUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFDOUUsT0FBTyxFQUFFLGVBQWUsRUFBYyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ25FLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7O0FBRzNELDJDQUlDOzs7SUFIRywwQ0FBMkI7Ozs7O0lBRTNCLHlDQUEwQjs7Ozs7QUFHOUIsd0NBUUM7OztJQVBHLG9DQUF1Qzs7Ozs7SUFFdkMsMENBQStCOzs7OztJQUUvQiw4Q0FBa0Q7Ozs7O0lBRWxELG1EQUF3Qzs7O0FBRzVDLE1BQU0sS0FBTyxZQUFZLEdBQUcsSUFBSSxjQUFjLENBQzFDLHNCQUFzQixDQUN6Qjs7O0FBSUQ7SUFVSSxzQkFDa0MsTUFBMEIsRUFDOUIsUUFBa0I7UUFEZCxXQUFNLEdBQU4sTUFBTSxDQUFvQjtRQUM5QixhQUFRLEdBQVIsUUFBUSxDQUFVO1FBUnhDLG1CQUFjLEdBQUcsSUFBSSxPQUFPLEVBQVcsQ0FBQztRQUN4QyxrQkFBYSxHQUE0QixJQUFJLGVBQWUsQ0FDaEUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLElBQUksRUFBRSxDQUNqQyxDQUFDO1FBQ0YsbUJBQWMsR0FBdUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQU1uRSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUM3QixDQUFDOzs7OztJQUVELGtDQUFXOzs7O0lBQVgsVUFBWSxTQUFpQjtR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UTs7O3VCQXhDeEI7Q0FrSEMsQUF0RkQsSUFzRkM7U0FuRlksWUFBWTs7Ozs7O0lBQ3JCLHNDQUFnRDs7Ozs7SUFDaEQscUNBRUU7O0lBQ0Ysc0NBQXVFOzs7OztJQUduRSw4QkFBd0Q7Ozs7O0lBQ3hELGdDQUE0QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBJbmplY3Rpb25Ub2tlbiwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgU3ViamVjdCwgdGltZXIgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgc3dpdGNoTWFwLCB0YWtlVW50aWwsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuXHJcbi8qKiBBcHBseSBhIENTUyBjbGFzcyB0byB0aGUgYDxodG1sPmAgZWxlbWVudCB3aGVuIHN3aXRjaGluZyB0aGVtZXMgKi9cclxuZXhwb3J0IGludGVyZmFjZSBUaGVtZVRyYW5zaXRpb25Db25maWcge1xyXG4gICAgcmVhZG9ubHkgY2xhc3NOYW1lOiBzdHJpbmc7XHJcbiAgICAvKiogcmVtb3ZlIGNsYXNzIGFmdGVyIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcyAqL1xyXG4gICAgcmVhZG9ubHkgZHVyYXRpb246IG51bWJlcjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBUaGVtZVNlcnZpY2VDb25maWcge1xyXG4gICAgcmVhZG9ubHkgdGhlbWVzOiBSZWFkb25seUFycmF5PHN0cmluZz47XHJcbiAgICAvKiogdGhlbWUgdGhhdCBzaG91bGQgYWx3YXlzIGJlIG9uIHRoZSB0YXJnZXQgZWxlbWVudCBpZiB1c2luZyBleHBsaWNpdCBkZWZhdWx0IHRoZW1lICovXHJcbiAgICByZWFkb25seSBkZWZhdWx0VGhlbWU/OiBzdHJpbmc7XHJcbiAgICAvKiogb3B0aW9uYWwgdHJhbnNpdGlvbiBjb25maWd1cmF0aW9uICovXHJcbiAgICByZWFkb25seSB0cmFuc2l0aW9uQ29uZmlnPzogVGhlbWVUcmFuc2l0aW9uQ29uZmlnO1xyXG4gICAgLyoqIHRoZW1lcyBhcHBsaWVkIHRvIDxodG1sPiBieSBkZWZhdWx0LiBTdXBwbHkgQ1NTIHNlbGVjdG9yIHRvIGNoYW5nZSAqL1xyXG4gICAgcmVhZG9ubHkgdGFyZ2V0RWxlbWVudFNlbGVjdG9yPzogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgVEhFTUVfQ09ORklHID0gbmV3IEluamVjdGlvblRva2VuPFRoZW1lU2VydmljZUNvbmZpZz4oXHJcbiAgICAnVGhlbWVTZXJ2aWNlOiBDb25maWcnXHJcbik7XHJcblxyXG4vLyBodHRwczovL2FuZ3VsYXIuaW8vZ3VpZGUvYW5ndWxhci1jb21waWxlci1vcHRpb25zI3N0cmljdG1ldGFkYXRhZW1pdFxyXG4vLyBAZHluYW1pY1xyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiAncm9vdCcsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBUaGVtZVNlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xyXG4gICAgcHJpdmF0ZSBzdG9wTGlzdGVuaW5nJCA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XHJcbiAgICBwcml2YXRlIHNlbGVjdGVkVGhlbWU6IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+ID0gbmV3IEJlaGF2aW9yU3ViamVjdChcclxuICAgICAgICB0aGlzLmNvbmZpZy5kZWZhdWx0VGhlbWUgfHwgJydcclxuICAgICk7XHJcbiAgICBzZWxlY3RlZFRoZW1lJDogT2JzZXJ2YWJsZTxzdHJpbmc+ID0gdGhpcy5zZWxlY3RlZFRoZW1lLmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIEBJbmplY3QoVEhFTUVfQ09ORklHKSBwcml2YXRlIGNvbmZpZzogVGhlbWVTZXJ2aWNlQ29uZmlnLFxyXG4gICAgICAgIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgZG9jdW1lbnQ6IERvY3VtZW50XHJcbiAgICApIHtcclxuICAgICAgICB0aGlzLnNldHVwU3Vic2NyaXB0aW9uKCk7XHJcbiAgICB9XHJcblxyXG4gICAgc3dpdGNoVGhlbWUoY2xhc3NOYW1lOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkVGhlbWUubmV4dChjbGFzc05hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2V0dXBTdWJzY3JpcHRpb24oKSB7XHJcbiAgICAgICAgY29uc3QgdHJhbnNpdGlvbkNvbmZpZyA9IHRoaXMuY29uZmlnLnRyYW5zaXRpb25Db25maWc7XHJcbiAgICAgICAgY29uc3Qgbm9uRGVmYXVsdFRoZW1lcyA9IHRoaXMuY29uZmlnLnRoZW1lcy5maWx0ZXIoXHJcbiAgICAgICAgICAgIGMgPT4gYyAhPT0gdGhpcy5jb25maWcuZGVmYXVsdFRoZW1lXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFRoZW1lXHJcbiAgICAgICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgICAgICAgdGFwKHRoZW1lID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUNsYXNzZXMobm9uRGVmYXVsdFRoZW1lcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gQ29uZGl0aW9uYWwgbGl0ZXJhbCBlbnRyaWVzOlxyXG4gICAgICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vMmFsaXR5LmNvbS8yMDE3LzA0L2NvbmRpdGlvbmFsLWxpdGVyYWwtZW50cmllcy5odG1sXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdG9BZGQgPSBbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLih0aGVtZSA/IFt0aGVtZV0gOiBbXSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLih0cmFuc2l0aW9uQ29uZmlnXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFt0cmFuc2l0aW9uQ29uZmlnLmNsYXNzTmFtZV1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogW10pLFxyXG4gICAgICAgICAgICAgICAgICAgIF07XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRDbGFzc2VzKHRvQWRkKTtcclxuICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgdHJhbnNpdGlvbkNvbmZpZ1xyXG4gICAgICAgICAgICAgICAgICAgID8gc3dpdGNoTWFwKHZhbHVlID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGltZXIodHJhbnNpdGlvbkNvbmZpZy5kdXJhdGlvbikucGlwZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFwKHggPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVDbGFzc2VzKFtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uQ29uZmlnLmNsYXNzTmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgIDogdGFwKCh4OiBhbnkpID0+IHt9KSxcclxuICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLnN0b3BMaXN0ZW5pbmckKVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHJlbW92ZUNsYXNzZXMoYXJyOiBzdHJpbmdbXSkge1xyXG4gICAgICAgIHRoaXMudGFyZ2V0RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKC4uLmFycik7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhZGRDbGFzc2VzKGFycjogc3RyaW5nW10pIHtcclxuICAgICAgICB0aGlzLnRhcmdldEVsZW1lbnQuY2xhc3NMaXN0LmFkZCguLi5hcnIpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0IHRhcmdldEVsZW1lbnQoKTogSFRNTEVsZW1lbnQge1xyXG4gICAgICAgIGxldCBlbGVtOiBIVE1MRWxlbWVudDtcclxuICAgICAgICBpZiAodGhpcy5jb25maWcudGFyZ2V0RWxlbWVudFNlbGVjdG9yKSB7XHJcbiAgICAgICAgICAgIGVsZW0gPSB0aGlzLmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy50YXJnZXRFbGVtZW50U2VsZWN0b3JcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgaWYgKCFlbGVtKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgICAgICAgICAgICAgICAgYCR7dGhpcy5jb25maWcudGFyZ2V0RWxlbWVudFNlbGVjdG9yfSBub3QgZm91bmQsIGRlZmF1bHRpbmcgdG8gPGh0bWw+YFxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWVsZW0pIHtcclxuICAgICAgICAgICAgZWxlbSA9IHRoaXMuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZWxlbTtcclxuICAgIH1cclxuXHJcbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnN0b3BMaXN0ZW5pbmckLm5leHQodHJ1ZSk7XHJcbiAgICB9XHJcbn1cclxuIl19