@lithiumjs/ngx-material-theming
Version:
Dynamic and customizable Angular Material theming made easy.
1 lines • 20 kB
Source Map (JSON)
{"version":3,"file":"lithiumjs-ngx-material-theming.mjs","sources":["../../src/directives/theme-container.directive.ts","../../src/module.ts","../../src/helpers/theme-loader.ts","../../src/helpers/theme-creator.ts","../../src/lithiumjs-ngx-material-theming.ts"],"sourcesContent":["import { Directive, Input, Optional, SkipSelf, ChangeDetectorRef, forwardRef, Inject } from \"@angular/core\";\nimport { AutoPush, OnInit, OnDestroy, createDirectiveState, stateTokenFor, DirectiveStateRef } from \"@lithiumjs/angular\";\nimport { combineLatest, Observable } from \"rxjs\";\nimport { filter } from \"rxjs/operators\"; \nimport { OverlayContainer } from \"@angular/cdk/overlay\";\n\nexport const DEFAULT_THEME_NAME = \"default\";\n\nconst STATE_PROVIDER = createDirectiveState(forwardRef(() => ThemeContainer));\n\n@Directive({\n standalone: false,\n selector: \"li-theme-container\",\n providers: [STATE_PROVIDER],\n host: {\n '[attr.li-theme]': 'theme',\n '[attr.active]': 'active'\n }\n})\nexport class ThemeContainer {\n\n public readonly theme$ = this.stateRef.get(\"theme\");\n public readonly active$ = this.stateRef.get(\"active\");\n public readonly manageOverlay$ = this.stateRef.get(\"manageOverlay\");\n\n @OnInit()\n private readonly onInit$!: Observable<void>;\n\n @OnDestroy()\n private readonly onDestroy$!: Observable<void>;\n\n @Input()\n public theme = DEFAULT_THEME_NAME;\n\n @Input()\n public active = true;\n\n @Input()\n public manageOverlay = true;\n\n constructor(\n overlayContainer: OverlayContainer,\n cdRef: ChangeDetectorRef,\n @SkipSelf() @Optional() parentThemeContainer: ThemeContainer,\n @Inject(stateTokenFor(STATE_PROVIDER)) private readonly stateRef: DirectiveStateRef<ThemeContainer>\n ) {\n let wasManagingOverlay = false;\n\n AutoPush.enable(this, cdRef);\n\n // Manage the overlay automatically if this is the root theme container and `manageOverlay` hasn't been defined\n this.onInit$.pipe(\n filter(() => this.manageOverlay === undefined)\n ).subscribe(() => this.manageOverlay = !parentThemeContainer && !overlayContainer.getContainerElement().getAttribute(\"li-theme\"));\n\n // Remove the `theme` overlay attribute if this container is being destroyed and is still managing it\n this.onDestroy$.pipe(\n filter(() => this.manageOverlay && this.active)\n ).subscribe(() => overlayContainer.getContainerElement().removeAttribute(\"li-theme\"));\n\n // Update the overlay if the state changes and we're managing the overlay\n combineLatest(stateRef.getAll(\"active\", \"theme\", \"manageOverlay\")).subscribe(([active, theme, manageOverlay]) => {\n const overlay = overlayContainer.getContainerElement();\n if (manageOverlay && active) {\n overlay.setAttribute(\"li-theme\", theme);\n wasManagingOverlay = true;\n } else if (wasManagingOverlay) {\n overlay.removeAttribute(\"li-theme\");\n wasManagingOverlay = false;\n }\n });\n }\n}","import { NgModule } from \"@angular/core\";\nimport { CommonModule } from \"@angular/common\";\nimport { ThemeContainer } from \"./directives/theme-container.directive\";\n\n@NgModule({\n imports: [\n CommonModule\n ],\n declarations: [\n ThemeContainer\n ],\n exports: [\n ThemeContainer\n ]\n})\nexport class NgxMaterialThemingModule {}\n","// @dynamic\nexport class ThemeLoader {\n\n private static readonly THEME_NAME_PARSER = /\\[li-theme=\"([^\\]\\s]+)\"\\]/;\n\n /**\n * @description Loads the given compiled theme in for use.\n * @param compiledThemeData The pre-compiled theme data.\n * @param labelElement [Optional] If `true`, will attach a `data-theme-name` attribute to the `<style>` element set to the theme's name.\n */\n public static loadCompiled(compiledThemeData: string, labelElement?: boolean): HTMLElement {\n const element = document.createElement(\"style\");\n element.type = \"text/css\";\n\n if (labelElement === undefined ? true : labelElement) {\n const nameParse = this.THEME_NAME_PARSER.exec(compiledThemeData);\n if (nameParse && nameParse.length > 1) {\n element.setAttribute(\"data-theme-name\", \"\" + nameParse?.[1]);\n }\n }\n\n element.innerHTML = compiledThemeData;\n\n this.getHeadElement().appendChild(element);\n return element;\n }\n\n /**\n * @description Unloads the given compiled theme from the DOM.\n * @param name The name of the theme to unload.\n */\n public static unloadCompiled(name: string): void {\n const head = this.getHeadElement();\n\n head.querySelectorAll(`style[data-theme-name=${name}]`)\n .forEach(style => head.removeChild(style));\n }\n\n private static getHeadElement(): HTMLElement {\n const heads = document.getElementsByTagName(\"head\");\n if (!heads || heads.length === 0) {\n const head = document.createElement(\"head\");\n document.appendChild(head);\n return head;\n } else {\n return heads[0];\n }\n }\n}\n","import { ThemeLoader } from \"./theme-loader\";\n\nexport type PaletteOffset = keyof ThemeCreator.PaletteBase;\n\n/**\n * @param name The name that will be used to reference the new theme.\n * @param templateData The CSS theme template that will be used to create the final theme data.\n * @param primaryPalette The primary color palette.\n * @param accentPalette The accent color palette.\n * @param warnPalette The warn color palette.\n */\nexport interface TemplateThemeCreationOptions {\n name: string;\n templateData: string;\n primaryPalette: ThemeCreator.Palette;\n accentPalette: ThemeCreator.Palette;\n warnPalette: ThemeCreator.Palette;\n templateOptions?: Partial<ThemeTemplateOptions>;\n}\n\nexport interface ThemeTemplateOptions {\n nameMatcher: string | RegExp;\n primaryHexMatcher: string | RegExp;\n primaryRgbaMatcher: string | RegExp;\n accentHexMatcher: string | RegExp;\n accentRgbaMatcher: string | RegExp;\n warnHexMatcher: string | RegExp;\n warnRgbaMatcher: string | RegExp;\n primaryContrastHexMatcher: string | RegExp;\n primaryContrastRgbaMatcher: string | RegExp;\n accentContrastHexMatcher: string | RegExp;\n accentContrastRgbaMatcher: string | RegExp;\n warnContrastHexMatcher: string | RegExp;\n warnContrastRgbaMatcher: string | RegExp;\n}\n\nexport namespace ThemeTemplateOptions {\n\n export const defaultValues: Readonly<ThemeTemplateOptions> = {\n nameMatcher: /%theme-name%/g,\n primaryHexMatcher: /#a099(\\d{2})/g,\n primaryRgbaMatcher: /rgba\\s?\\(\\s?160\\s?,\\s?153\\s?,\\s?(\\d+)\\s?,\\s?([\\d.]+)\\s?\\)/g,\n accentHexMatcher: /#b099(\\d{2})/g,\n accentRgbaMatcher: /rgba\\s?\\(\\s?176\\s?,\\s?153\\s?,\\s?(\\d+)\\s?,\\s?([\\d.]+)\\s?\\)/g,\n warnHexMatcher: /#c099(\\d{2})/g,\n warnRgbaMatcher: /rgba\\s?\\(\\s?192\\s?,\\s?153\\s?,\\s?(\\d+)\\s?,\\s?([\\d.]+)\\s?\\)/g,\n primaryContrastHexMatcher: /#ac99(\\d{2})/g,\n primaryContrastRgbaMatcher: /rgba\\s?\\(\\s?172\\s?,\\s?153\\s?,\\s?(\\d+)\\s?,\\s?([\\d.]+)\\s?\\)/g,\n accentContrastHexMatcher: /#bc99(\\d{2})/g,\n accentContrastRgbaMatcher: /rgba\\s?\\(\\s?188\\s?,\\s?153\\s?,\\s?(\\d+)\\s?,\\s?([\\d.]+)\\s?\\)/g,\n warnContrastHexMatcher: /#cc99(\\d{2})/g,\n warnContrastRgbaMatcher: /rgba\\s?\\(\\s?204\\s?,\\s?153\\s?,\\s?(\\d+)\\s?,\\s?([\\d.]+)\\s?\\)/g\n };\n}\n\nexport class ThemeCreator {\n /**\n * @description Creates a new theme from the given template theme CSS and theme palettes and loads it for use with the given name.\n * @param options The options to use to create the new theme.\n * @return The compiled theme CSS.\n */\n public static createFromTemplate(options: TemplateThemeCreationOptions): string {\n // Generate the theme data from the given template data:\n let themeData = options.templateData;\n let templateOptions = Object.assign({}, ThemeTemplateOptions.defaultValues, options.templateOptions || {});\n\n themeData = themeData.replace(templateOptions.nameMatcher, options.name);\n\n themeData = this.substituteThemeHex(themeData, templateOptions.primaryHexMatcher, options.primaryPalette);\n themeData = this.substituteThemeHex(themeData, templateOptions.accentHexMatcher, options.accentPalette);\n themeData = this.substituteThemeHex(themeData, templateOptions.warnHexMatcher, options.warnPalette);\n\n themeData = this.substituteThemeRgba(themeData, templateOptions.primaryRgbaMatcher, options.primaryPalette);\n themeData = this.substituteThemeRgba(themeData, templateOptions.accentRgbaMatcher, options.accentPalette);\n themeData = this.substituteThemeRgba(themeData, templateOptions.warnRgbaMatcher, options.warnPalette);\n\n themeData = this.substituteThemeHex(themeData, templateOptions.primaryContrastHexMatcher, options.primaryPalette.contrast);\n themeData = this.substituteThemeHex(themeData, templateOptions.accentContrastHexMatcher, options.accentPalette.contrast);\n themeData = this.substituteThemeHex(themeData, templateOptions.warnContrastHexMatcher, options.warnPalette.contrast);\n\n themeData = this.substituteThemeRgba(themeData, templateOptions.primaryContrastRgbaMatcher, options.primaryPalette.contrast);\n themeData = this.substituteThemeRgba(themeData, templateOptions.accentContrastRgbaMatcher, options.accentPalette.contrast);\n themeData = this.substituteThemeRgba(themeData, templateOptions.warnContrastRgbaMatcher, options.warnPalette.contrast);\n\n const themeElement = ThemeLoader.loadCompiled(themeData);\n\n // Store the color info for external programmatic use\n themeElement.setAttribute(\"data-color-primary\", options.primaryPalette[500]);\n themeElement.setAttribute(\"data-color-accent\", options.accentPalette[500]);\n themeElement.setAttribute(\"data-color-warn\", options.warnPalette[500]);\n\n return themeData;\n }\n\n private static substituteThemeHex(themeData: string, matcher: string | RegExp, palette: ThemeCreator.PaletteBase): string {\n return themeData.replace(matcher, (_match, $1) => palette[this.hexOffset($1)]);\n }\n\n private static substituteThemeRgba(themeData: string, matcher: string | RegExp, palette: ThemeCreator.PaletteBase): string {\n return themeData.replace(matcher, (_match, $1, $2) => {\n return `rgba(${palette[this.rgbaOffset($1)]},${this.rgbaAlpha($2)})`;\n });\n }\n\n /** @description Compute the palette offset from an associated hex color regex match. */\n private static hexOffset(match: string): PaletteOffset {\n match = match.toLowerCase();\n return String(Number.parseInt(`${match}${match.startsWith(\"a\") ? \"00\" : \"0\"}`)) as PaletteOffset;\n }\n\n /** @description Compute the palette offset from an associated rgba color regex match. */\n private static rgbaOffset(match: string): PaletteOffset {\n const decOffset = Number.parseInt(match);\n\n return this.hexOffset(decOffset.toString(16));\n }\n\n /** @description Compute the alpha channel from an associated rgba alpha regex match. */\n private static rgbaAlpha(match: string): number {\n return Number.parseFloat(match);\n }\n}\n\nexport namespace ThemeCreator {\n\n export interface PaletteBase {\n \"50\": string,\n \"100\": string,\n \"200\": string,\n \"300\": string,\n \"400\": string,\n \"500\": string,\n \"600\": string,\n \"700\": string,\n \"800\": string,\n \"900\": string,\n \"A100\": string,\n \"A200\": string,\n \"A400\": string,\n \"A700\": string\n }\n\n export interface Palette extends PaletteBase {\n contrast: PaletteBase;\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './api';\n"],"names":[],"mappings":"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"}