@meshmakers/octo-ui 3.4.170 → 3.4.190

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.
@@ -105,10 +105,10 @@ class CreateBrandingDtoGQL extends i1.Mutation {
105
105
  constructor(apollo) {
106
106
  super(apollo);
107
107
  }
108
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: CreateBrandingDtoGQL, deps: [{ token: i1.Apollo }], target: i0.ɵɵFactoryTarget.Injectable });
109
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: CreateBrandingDtoGQL, providedIn: 'root' });
108
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: CreateBrandingDtoGQL, deps: [{ token: i1.Apollo }], target: i0.ɵɵFactoryTarget.Injectable });
109
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: CreateBrandingDtoGQL, providedIn: 'root' });
110
110
  }
111
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: CreateBrandingDtoGQL, decorators: [{
111
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: CreateBrandingDtoGQL, decorators: [{
112
112
  type: Injectable,
113
113
  args: [{
114
114
  providedIn: 'root'
@@ -171,10 +171,10 @@ class GetBrandingDtoGQL extends i1.Query {
171
171
  constructor(apollo) {
172
172
  super(apollo);
173
173
  }
174
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: GetBrandingDtoGQL, deps: [{ token: i1.Apollo }], target: i0.ɵɵFactoryTarget.Injectable });
175
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: GetBrandingDtoGQL, providedIn: 'root' });
174
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: GetBrandingDtoGQL, deps: [{ token: i1.Apollo }], target: i0.ɵɵFactoryTarget.Injectable });
175
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: GetBrandingDtoGQL, providedIn: 'root' });
176
176
  }
177
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: GetBrandingDtoGQL, decorators: [{
177
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: GetBrandingDtoGQL, decorators: [{
178
178
  type: Injectable,
179
179
  args: [{
180
180
  providedIn: 'root'
@@ -233,10 +233,10 @@ class UpdateBrandingDtoGQL extends i1.Mutation {
233
233
  constructor(apollo) {
234
234
  super(apollo);
235
235
  }
236
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: UpdateBrandingDtoGQL, deps: [{ token: i1.Apollo }], target: i0.ɵɵFactoryTarget.Injectable });
237
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: UpdateBrandingDtoGQL, providedIn: 'root' });
236
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: UpdateBrandingDtoGQL, deps: [{ token: i1.Apollo }], target: i0.ɵɵFactoryTarget.Injectable });
237
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: UpdateBrandingDtoGQL, providedIn: 'root' });
238
238
  }
239
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: UpdateBrandingDtoGQL, decorators: [{
239
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: UpdateBrandingDtoGQL, decorators: [{
240
240
  type: Injectable,
241
241
  args: [{
242
242
  providedIn: 'root'
@@ -254,7 +254,8 @@ class BrandingDataSource {
254
254
  createBrandingGQL = inject(CreateBrandingDtoGQL);
255
255
  updateBrandingGQL = inject(UpdateBrandingDtoGQL);
256
256
  defaults = inject(OCTO_BRANDING_DEFAULTS);
257
- state = signal({ ...this.defaults }, ...(ngDevMode ? [{ debugName: "state" }] : /* istanbul ignore next */ []));
257
+ state = signal({ ...this.defaults }, /* @ts-ignore */
258
+ ...(ngDevMode ? [{ debugName: "state" }] : /* istanbul ignore next */ []));
258
259
  branding = this.state.asReadonly();
259
260
  async load() {
260
261
  // `no-cache` (not `network-only`): Apollo's `InMemoryCache` normalizes
@@ -469,10 +470,10 @@ class BrandingDataSource {
469
470
  const buffer = await file.arrayBuffer();
470
471
  return Array.from(new Uint8Array(buffer));
471
472
  }
472
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: BrandingDataSource, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
473
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: BrandingDataSource, providedIn: 'root' });
473
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: BrandingDataSource, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
474
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: BrandingDataSource, providedIn: 'root' });
474
475
  }
475
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: BrandingDataSource, decorators: [{
476
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: BrandingDataSource, decorators: [{
476
477
  type: Injectable,
477
478
  args: [{ providedIn: 'root' }]
478
479
  }] });
@@ -547,10 +548,10 @@ class AppTitleService extends TitleStrategy {
547
548
  }
548
549
  return breadcrumb;
549
550
  }
550
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: AppTitleService, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
551
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: AppTitleService, providedIn: 'root' });
551
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: AppTitleService, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
552
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: AppTitleService, providedIn: 'root' });
552
553
  }
553
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: AppTitleService, decorators: [{
554
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: AppTitleService, decorators: [{
554
555
  type: Injectable,
555
556
  args: [{ providedIn: 'root' }]
556
557
  }] });
@@ -614,7 +615,8 @@ function provideOctoBranding(config) {
614
615
  class ThemeService {
615
616
  document = inject(DOCUMENT);
616
617
  renderer;
617
- isDarkSignal = signal(false, ...(ngDevMode ? [{ debugName: "isDarkSignal" }] : /* istanbul ignore next */ []));
618
+ isDarkSignal = signal(false, /* @ts-ignore */
619
+ ...(ngDevMode ? [{ debugName: "isDarkSignal" }] : /* istanbul ignore next */ []));
618
620
  isDark = this.isDarkSignal.asReadonly();
619
621
  constructor() {
620
622
  this.renderer = inject(RendererFactory2).createRenderer(null, null);
@@ -653,10 +655,10 @@ class ThemeService {
653
655
  return (this.document.defaultView?.matchMedia?.('(prefers-color-scheme: dark)')
654
656
  .matches ?? false);
655
657
  }
656
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: ThemeService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
657
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: ThemeService, providedIn: 'root' });
658
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: ThemeService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
659
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: ThemeService, providedIn: 'root' });
658
660
  }
659
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: ThemeService, decorators: [{
661
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: ThemeService, decorators: [{
660
662
  type: Injectable,
661
663
  args: [{ providedIn: 'root' }]
662
664
  }], ctorParameters: () => [] });
@@ -668,18 +670,21 @@ const DEFAULT_THEME_SWITCHER_MESSAGES = {
668
670
  };
669
671
 
670
672
  class ThemeSwitcherComponent {
671
- messages = input(DEFAULT_THEME_SWITCHER_MESSAGES, ...(ngDevMode ? [{ debugName: "messages" }] : /* istanbul ignore next */ []));
673
+ messages = input(DEFAULT_THEME_SWITCHER_MESSAGES, /* @ts-ignore */
674
+ ...(ngDevMode ? [{ debugName: "messages" }] : /* istanbul ignore next */ []));
672
675
  themeService = inject(ThemeService);
673
676
  branding = inject(BrandingDataSource);
674
677
  isDark = this.themeService.isDark;
675
- available = computed(() => this.branding.branding().darkTheme !== null, ...(ngDevMode ? [{ debugName: "available" }] : /* istanbul ignore next */ []));
678
+ available = computed(() => this.branding.branding().darkTheme !== null, /* @ts-ignore */
679
+ ...(ngDevMode ? [{ debugName: "available" }] : /* istanbul ignore next */ []));
676
680
  ariaLabel = computed(() => {
677
681
  if (!this.available())
678
682
  return this.messages().unavailable;
679
683
  return this.isDark()
680
684
  ? this.messages().toggleToLight
681
685
  : this.messages().toggleToDark;
682
- }, ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
686
+ }, /* @ts-ignore */
687
+ ...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
683
688
  lightIcon = lightbulbOutlineIcon;
684
689
  darkIcon = brightnessContrastIcon;
685
690
  onToggle() {
@@ -687,10 +692,10 @@ class ThemeSwitcherComponent {
687
692
  return;
688
693
  this.themeService.setDark(!this.isDark());
689
694
  }
690
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: ThemeSwitcherComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
691
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.17", type: ThemeSwitcherComponent, isStandalone: true, selector: "mm-theme-switcher", inputs: { messages: { classPropertyName: "messages", publicName: "messages", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<button\n type=\"button\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-pressed]=\"isDark()\"\n [disabled]=\"!available()\"\n (click)=\"onToggle()\"\n>\n <kendo-svg-icon [icon]=\"isDark() ? lightIcon : darkIcon\" />\n</button>\n", styles: [":host{display:inline-flex}button{appearance:none;background:transparent;border:0;padding:var(--kendo-spacing-2);cursor:pointer;color:inherit}button[disabled]{cursor:not-allowed;opacity:.5}button:focus-visible{outline:2px solid currentColor;outline-offset:2px}\n"], dependencies: [{ kind: "ngmodule", type: SVGIconModule }, { kind: "component", type: i1$1.SVGIconComponent, selector: "kendo-svg-icon, kendo-svgicon", inputs: ["icon"], exportAs: ["kendoSVGIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
695
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: ThemeSwitcherComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
696
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.2", type: ThemeSwitcherComponent, isStandalone: true, selector: "mm-theme-switcher", inputs: { messages: { classPropertyName: "messages", publicName: "messages", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<button\n type=\"button\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-pressed]=\"isDark()\"\n [disabled]=\"!available()\"\n (click)=\"onToggle()\"\n>\n <kendo-svg-icon [icon]=\"isDark() ? lightIcon : darkIcon\" />\n</button>\n", styles: [":host{display:inline-flex}button{appearance:none;background:transparent;border:0;padding:var(--kendo-spacing-2);cursor:pointer;color:inherit}button[disabled]{cursor:not-allowed;opacity:.5}button:focus-visible{outline:2px solid currentColor;outline-offset:2px}\n"], dependencies: [{ kind: "ngmodule", type: SVGIconModule }, { kind: "component", type: i1$1.SVGIconComponent, selector: "kendo-svg-icon, kendo-svgicon", inputs: ["icon", "variant"], exportAs: ["kendoSVGIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
692
697
  }
693
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: ThemeSwitcherComponent, decorators: [{
698
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: ThemeSwitcherComponent, decorators: [{
694
699
  type: Component,
695
700
  args: [{ selector: 'mm-theme-switcher', standalone: true, imports: [SVGIconModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<button\n type=\"button\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-pressed]=\"isDark()\"\n [disabled]=\"!available()\"\n (click)=\"onToggle()\"\n>\n <kendo-svg-icon [icon]=\"isDark() ? lightIcon : darkIcon\" />\n</button>\n", styles: [":host{display:inline-flex}button{appearance:none;background:transparent;border:0;padding:var(--kendo-spacing-2);cursor:pointer;color:inherit}button[disabled]{cursor:not-allowed;opacity:.5}button:focus-visible{outline:2px solid currentColor;outline-offset:2px}\n"] }]
696
701
  }], propDecorators: { messages: [{ type: i0.Input, args: [{ isSignal: true, alias: "messages", required: false }] }] } });
@@ -983,10 +988,10 @@ class BrandingApplicationService {
983
988
  const brightness = (rgb.r * 299 + rgb.g * 587 + rgb.b * 114) / 1000;
984
989
  return brightness > 128 ? '#000000' : '#ffffff';
985
990
  }
986
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: BrandingApplicationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
987
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: BrandingApplicationService, providedIn: 'root' });
991
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: BrandingApplicationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
992
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: BrandingApplicationService, providedIn: 'root' });
988
993
  }
989
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: BrandingApplicationService, decorators: [{
994
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: BrandingApplicationService, decorators: [{
990
995
  type: Injectable,
991
996
  args: [{ providedIn: 'root' }]
992
997
  }], ctorParameters: () => [] });
@@ -995,7 +1000,8 @@ function createBrandingStub(overrides) {
995
1000
  const branding = signal({
996
1001
  ...NEUTRAL_BRANDING_DEFAULTS,
997
1002
  ...(overrides ?? {}),
998
- }, ...(ngDevMode ? [{ debugName: "branding" }] : /* istanbul ignore next */ []));
1003
+ }, /* @ts-ignore */
1004
+ ...(ngDevMode ? [{ debugName: "branding" }] : /* istanbul ignore next */ []));
999
1005
  return {
1000
1006
  branding,
1001
1007
  load: () => Promise.resolve(),
@@ -1 +1 @@
1
- {"version":3,"file":"meshmakers-octo-ui-branding.mjs","sources":["../../../../projects/meshmakers/octo-ui/branding/src/branding.tokens.ts","../../../../projects/meshmakers/octo-ui/branding/src/graphQL/createBranding.ts","../../../../projects/meshmakers/octo-ui/branding/src/graphQL/getBranding.ts","../../../../projects/meshmakers/octo-ui/branding/src/graphQL/updateBranding.ts","../../../../projects/meshmakers/octo-ui/branding/src/services/branding-data-source.service.ts","../../../../projects/meshmakers/octo-ui/branding/src/services/app-title.service.ts","../../../../projects/meshmakers/octo-ui/branding/src/branding.config.ts","../../../../projects/meshmakers/octo-ui/branding/src/branding.model.ts","../../../../projects/meshmakers/octo-ui/branding/src/services/theme.service.ts","../../../../projects/meshmakers/octo-ui/branding/src/components/mm-theme-switcher/theme-switcher.messages.ts","../../../../projects/meshmakers/octo-ui/branding/src/components/mm-theme-switcher/theme-switcher.component.ts","../../../../projects/meshmakers/octo-ui/branding/src/components/mm-theme-switcher/theme-switcher.component.html","../../../../projects/meshmakers/octo-ui/branding/src/services/branding-application.service.ts","../../../../projects/meshmakers/octo-ui/branding/src/testing/branding-stub.ts","../../../../projects/meshmakers/octo-ui/branding/src/public-api.ts","../../../../projects/meshmakers/octo-ui/branding/src/meshmakers-octo-ui-branding.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport { BrandingData } from './models/branding.models';\nimport { ThemePalette } from './models/theme.models';\n\n/**\n * Bundled fallback URLs used when the tenant did not upload a logo / favicon.\n * Any field omitted means the corresponding component renders nothing (text-only\n * header, no <link rel=\"icon\">, etc.) instead of breaking with a 404.\n */\nexport interface OctoBrandingFallbackAssets {\n headerLogo?: string;\n footerLogo?: string;\n favicon?: string;\n}\n\nexport const OCTO_BRANDING_DEFAULTS = new InjectionToken<BrandingData>(\n 'OCTO_BRANDING_DEFAULTS',\n);\n\nexport const OCTO_BRANDING_FALLBACK_ASSETS = new InjectionToken<OctoBrandingFallbackAssets>(\n 'OCTO_BRANDING_FALLBACK_ASSETS',\n);\n\n// Library defaults carry the Meshmakers brand mint (#65ceaf) as primary so\n// an app that opts into `provideOctoBranding` but never persists a\n// `SystemUIBranding` record renders with the publisher's identity rather\n// than vanilla Kendo. Mint is also non-aggressive in mixed contexts (no\n// alarm/error semantics like Kendo's tomato default), so tenant overrides\n// almost always read as an intentional rebrand rather than a workaround.\n// Apps override per-tenant via Settings page; the override completely\n// replaces these baselines.\nconst NEUTRAL_LIGHT_THEME: ThemePalette = {\n primaryColor: '#65ceaf',\n secondaryColor: '#5ac4be',\n tertiaryColor: '#0b5c92',\n neutralColor: '#6c757d',\n backgroundColor: '#ffffff',\n headerGradient: { startColor: '#ffffff', endColor: '#f8f9fa' },\n footerGradient: { startColor: '#65ceaf', endColor: '#5ac4be' },\n};\n\nconst NEUTRAL_DARK_THEME: ThemePalette = {\n primaryColor: '#65ceaf',\n secondaryColor: '#5ac4be',\n tertiaryColor: '#4a8eef',\n neutralColor: '#94a3b8',\n backgroundColor: '#1a1d20',\n headerGradient: { startColor: '#1a1d20', endColor: '#2b2f33' },\n footerGradient: { startColor: '#65ceaf', endColor: '#5ac4be' },\n};\n\n/**\n * Library-shipped neutral fallback. Apps that don't supply their own defaults\n * see a working but visually-neutral baseline (\"configure me\"), not a crash.\n */\nexport const NEUTRAL_BRANDING_DEFAULTS: BrandingData = {\n rtId: null,\n appName: 'App',\n appTitle: 'App',\n headerLogoUrl: null,\n footerLogoUrl: null,\n faviconUrl: null,\n lightTheme: NEUTRAL_LIGHT_THEME,\n darkTheme: NEUTRAL_DARK_THEME,\n};\n\nexport const NEUTRAL_FALLBACK_ASSETS: OctoBrandingFallbackAssets = {};\n","import * as Types from './globalTypes';\n\nimport { gql } from 'apollo-angular';\nimport { Injectable } from '@angular/core';\nimport * as Apollo from 'apollo-angular';\nexport type CreateBrandingMutationVariablesDto = Types.Exact<{\n branding: Types.SystemUiBrandingInputDto;\n}>;\n\n\nexport type CreateBrandingMutationDto = { __typename?: 'OctoMutation', runtime?: { __typename?: 'Runtime', systemUIBrandings?: { __typename?: 'SystemUIBrandingMutations', create?: Array<{ __typename?: 'SystemUIBranding', rtId: any, rtWellKnownName?: string | null, appName?: string | null, appTitle?: string | null, headerLogo?: Array<any | null> | null, footerLogo?: Array<any | null> | null, favicon?: Array<any | null> | null, lightTheme?: { __typename?: 'SystemUIThemePalette', primaryColor?: string | null, secondaryColor?: string | null, tertiaryColor?: string | null, neutralColor?: string | null, backgroundColor?: string | null, headerGradient?: { __typename?: 'SystemUIThemeGradient', startColor: string, endColor: string } | null, footerGradient?: { __typename?: 'SystemUIThemeGradient', startColor: string, endColor: string } | null } | null, darkTheme?: { __typename?: 'SystemUIThemePalette', primaryColor?: string | null, secondaryColor?: string | null, tertiaryColor?: string | null, neutralColor?: string | null, backgroundColor?: string | null, headerGradient?: { __typename?: 'SystemUIThemeGradient', startColor: string, endColor: string } | null, footerGradient?: { __typename?: 'SystemUIThemeGradient', startColor: string, endColor: string } | null } | null } | null> | null } | null } | null };\n\nexport const CreateBrandingDocumentDto = gql`\n mutation createBranding($branding: SystemUIBrandingInput!) {\n runtime {\n systemUIBrandings {\n create(entities: [$branding]) {\n rtId\n rtWellKnownName\n appName\n appTitle\n headerLogo\n footerLogo\n favicon\n lightTheme {\n primaryColor\n secondaryColor\n tertiaryColor\n neutralColor\n backgroundColor\n headerGradient {\n startColor\n endColor\n }\n footerGradient {\n startColor\n endColor\n }\n }\n darkTheme {\n primaryColor\n secondaryColor\n tertiaryColor\n neutralColor\n backgroundColor\n headerGradient {\n startColor\n endColor\n }\n footerGradient {\n startColor\n endColor\n }\n }\n }\n }\n }\n}\n `;\n\n @Injectable({\n providedIn: 'root'\n })\n export class CreateBrandingDtoGQL extends Apollo.Mutation<CreateBrandingMutationDto, CreateBrandingMutationVariablesDto> {\n document = CreateBrandingDocumentDto;\n \n constructor(apollo: Apollo.Apollo) {\n super(apollo);\n }\n }","import * as Types from './globalTypes';\n\nimport { gql } from 'apollo-angular';\nimport { Injectable } from '@angular/core';\nimport * as Apollo from 'apollo-angular';\nexport type GetBrandingQueryVariablesDto = Types.Exact<{ [key: string]: never; }>;\n\n\nexport type GetBrandingQueryDto = { __typename?: 'OctoQuery', runtime?: { __typename?: 'RuntimeModelQuery', systemUIBranding?: { __typename?: 'SystemUIBrandingConnection', totalCount?: number | null, items?: Array<{ __typename?: 'SystemUIBranding', rtId: any, rtWellKnownName?: string | null, appName?: string | null, appTitle?: string | null, headerLogo?: Array<any | null> | null, footerLogo?: Array<any | null> | null, favicon?: Array<any | null> | null, lightTheme?: { __typename?: 'SystemUIThemePalette', primaryColor?: string | null, secondaryColor?: string | null, tertiaryColor?: string | null, neutralColor?: string | null, backgroundColor?: string | null, headerGradient?: { __typename?: 'SystemUIThemeGradient', startColor: string, endColor: string } | null, footerGradient?: { __typename?: 'SystemUIThemeGradient', startColor: string, endColor: string } | null } | null, darkTheme?: { __typename?: 'SystemUIThemePalette', primaryColor?: string | null, secondaryColor?: string | null, tertiaryColor?: string | null, neutralColor?: string | null, backgroundColor?: string | null, headerGradient?: { __typename?: 'SystemUIThemeGradient', startColor: string, endColor: string } | null, footerGradient?: { __typename?: 'SystemUIThemeGradient', startColor: string, endColor: string } | null } | null } | null> | null } | null } | null };\n\nexport const GetBrandingDocumentDto = gql`\n query getBranding {\n runtime {\n systemUIBranding(\n first: 1\n fieldFilter: [{attributePath: \"rtWellKnownName\", operator: EQUALS, comparisonValue: \"Branding\"}]\n ) {\n totalCount\n items {\n rtId\n rtWellKnownName\n appName\n appTitle\n headerLogo\n footerLogo\n favicon\n lightTheme {\n primaryColor\n secondaryColor\n tertiaryColor\n neutralColor\n backgroundColor\n headerGradient {\n startColor\n endColor\n }\n footerGradient {\n startColor\n endColor\n }\n }\n darkTheme {\n primaryColor\n secondaryColor\n tertiaryColor\n neutralColor\n backgroundColor\n headerGradient {\n startColor\n endColor\n }\n footerGradient {\n startColor\n endColor\n }\n }\n }\n }\n }\n}\n `;\n\n @Injectable({\n providedIn: 'root'\n })\n export class GetBrandingDtoGQL extends Apollo.Query<GetBrandingQueryDto, GetBrandingQueryVariablesDto> {\n document = GetBrandingDocumentDto;\n \n constructor(apollo: Apollo.Apollo) {\n super(apollo);\n }\n }","import * as Types from './globalTypes';\n\nimport { gql } from 'apollo-angular';\nimport { Injectable } from '@angular/core';\nimport * as Apollo from 'apollo-angular';\nexport type UpdateBrandingMutationVariablesDto = Types.Exact<{\n branding: Types.SystemUiBrandingInputUpdateDto;\n}>;\n\n\nexport type UpdateBrandingMutationDto = { __typename?: 'OctoMutation', runtime?: { __typename?: 'Runtime', systemUIBrandings?: { __typename?: 'SystemUIBrandingMutations', update?: Array<{ __typename?: 'SystemUIBranding', rtId: any, rtWellKnownName?: string | null, appName?: string | null, appTitle?: string | null, headerLogo?: Array<any | null> | null, footerLogo?: Array<any | null> | null, favicon?: Array<any | null> | null, lightTheme?: { __typename?: 'SystemUIThemePalette', primaryColor?: string | null, secondaryColor?: string | null, tertiaryColor?: string | null, neutralColor?: string | null, backgroundColor?: string | null, headerGradient?: { __typename?: 'SystemUIThemeGradient', startColor: string, endColor: string } | null, footerGradient?: { __typename?: 'SystemUIThemeGradient', startColor: string, endColor: string } | null } | null, darkTheme?: { __typename?: 'SystemUIThemePalette', primaryColor?: string | null, secondaryColor?: string | null, tertiaryColor?: string | null, neutralColor?: string | null, backgroundColor?: string | null, headerGradient?: { __typename?: 'SystemUIThemeGradient', startColor: string, endColor: string } | null, footerGradient?: { __typename?: 'SystemUIThemeGradient', startColor: string, endColor: string } | null } | null } | null> | null } | null } | null };\n\nexport const UpdateBrandingDocumentDto = gql`\n mutation updateBranding($branding: SystemUIBrandingInputUpdate!) {\n runtime {\n systemUIBrandings {\n update(entities: [$branding]) {\n rtId\n rtWellKnownName\n appName\n appTitle\n headerLogo\n footerLogo\n favicon\n lightTheme {\n primaryColor\n secondaryColor\n tertiaryColor\n neutralColor\n backgroundColor\n headerGradient {\n startColor\n endColor\n }\n footerGradient {\n startColor\n endColor\n }\n }\n darkTheme {\n primaryColor\n secondaryColor\n tertiaryColor\n neutralColor\n backgroundColor\n headerGradient {\n startColor\n endColor\n }\n footerGradient {\n startColor\n endColor\n }\n }\n }\n }\n }\n}\n `;\n\n @Injectable({\n providedIn: 'root'\n })\n export class UpdateBrandingDtoGQL extends Apollo.Mutation<UpdateBrandingMutationDto, UpdateBrandingMutationVariablesDto> {\n document = UpdateBrandingDocumentDto;\n \n constructor(apollo: Apollo.Apollo) {\n super(apollo);\n }\n }","import { inject, Injectable, signal } from '@angular/core';\nimport { firstValueFrom } from 'rxjs';\nimport {\n CreateBrandingDtoGQL,\n CreateBrandingMutationDto,\n} from '../graphQL/createBranding';\nimport {\n GetBrandingDtoGQL,\n GetBrandingQueryDto,\n} from '../graphQL/getBranding';\nimport {\n SystemUiBrandingInputDto,\n SystemUiThemePaletteInputDto,\n} from '../graphQL/globalTypes';\nimport {\n UpdateBrandingDtoGQL,\n UpdateBrandingMutationDto,\n} from '../graphQL/updateBranding';\nimport { OCTO_BRANDING_DEFAULTS } from '../branding.tokens';\nimport { BrandingData, BrandingUpdate } from '../models/branding.models';\nimport { ThemePalette } from '../models/theme.models';\n\nconst WELL_KNOWN_NAME = 'Branding';\n\ntype QueryItem = NonNullable<\n NonNullable<\n NonNullable<\n NonNullable<GetBrandingQueryDto['runtime']>['systemUIBranding']\n >['items']\n >[number]\n>;\n\ntype CreateItem = NonNullable<\n NonNullable<\n NonNullable<\n NonNullable<CreateBrandingMutationDto['runtime']>['systemUIBrandings']\n >['create']\n >[number]\n>;\n\ntype UpdateItem = NonNullable<\n NonNullable<\n NonNullable<\n NonNullable<UpdateBrandingMutationDto['runtime']>['systemUIBrandings']\n >['update']\n >[number]\n>;\n\n/** Shared structural shape across get/create/update — identical selection sets. */\ntype ServerBranding = QueryItem & CreateItem & UpdateItem;\n\ntype ServerPalette = NonNullable<QueryItem['lightTheme']>;\n\n/**\n * Per-tenant branding. Source of truth is the `SystemUIBranding`\n * CK runtime entity (one record per tenant, `rtWellKnownName = 'Branding'`).\n * Loaded via GraphQL, mirrored into a signal for consumers.\n */\n@Injectable({ providedIn: 'root' })\nexport class BrandingDataSource {\n private readonly getBrandingGQL = inject(GetBrandingDtoGQL);\n private readonly createBrandingGQL = inject(CreateBrandingDtoGQL);\n private readonly updateBrandingGQL = inject(UpdateBrandingDtoGQL);\n\n private readonly defaults = inject(OCTO_BRANDING_DEFAULTS);\n\n private readonly state = signal<BrandingData>({ ...this.defaults });\n readonly branding = this.state.asReadonly();\n\n async load(): Promise<void> {\n // `no-cache` (not `network-only`): Apollo's `InMemoryCache` normalizes\n // entities by `rtId`, but the singleton `RuntimeModelQuery` type has no\n // id — cache writes for `runtime.systemUIBranding`\n // clobber sibling fields (e.g. `runtime.basicTree` used by plant\n // hierarchy + /location). `no-cache` fetches from network AND skips\n // writing to cache, so /location keeps its hierarchy cache intact.\n const result = await firstValueFrom(\n this.getBrandingGQL.fetch({ fetchPolicy: 'no-cache' }),\n );\n const item =\n result.data?.runtime?.systemUIBranding?.items?.[0];\n if (!item) {\n this.state.set({ ...this.defaults });\n return;\n }\n this.state.set(await this.mapFromServer(item));\n }\n\n async save(update: BrandingUpdate): Promise<BrandingData> {\n const current = this.state();\n const input = await this.buildInput(update);\n const saved = current.rtId\n ? await this.runUpdate(current.rtId, input)\n : await this.runCreate(input);\n const mapped = await this.mapFromServer(saved);\n this.state.set(mapped);\n return mapped;\n }\n\n async resetToDefaults(): Promise<void> {\n await this.save({\n appName: this.defaults.appName,\n appTitle: this.defaults.appTitle,\n headerLogoFile: null,\n footerLogoFile: null,\n faviconFile: null,\n lightTheme: this.defaults.lightTheme,\n darkTheme: this.defaults.darkTheme,\n });\n }\n\n private async buildInput(\n update: BrandingUpdate,\n ): Promise<SystemUiBrandingInputDto> {\n const [headerLogo, footerLogo, favicon] = await Promise.all([\n this.prepareBinary(update.headerLogoFile),\n this.prepareBinary(update.footerLogoFile),\n this.prepareBinary(update.faviconFile),\n ]);\n\n const input: SystemUiBrandingInputDto = {\n rtWellKnownName: WELL_KNOWN_NAME,\n appName: update.appName,\n appTitle: update.appTitle,\n lightTheme: this.paletteToInput(update.lightTheme),\n darkTheme: update.darkTheme ? this.paletteToInput(update.darkTheme) : null,\n };\n\n // Tri-state: set the field only on replace (bytes) or clear (null);\n // omit when undefined so the server keeps the current blob.\n if (headerLogo !== undefined) input.headerLogo = headerLogo;\n if (footerLogo !== undefined) input.footerLogo = footerLogo;\n if (favicon !== undefined) input.favicon = favicon;\n\n return input;\n }\n\n private async runCreate(\n input: SystemUiBrandingInputDto,\n ): Promise<ServerBranding> {\n const result = await firstValueFrom(\n this.createBrandingGQL.mutate({\n variables: { branding: input },\n fetchPolicy: 'no-cache',\n }),\n );\n const item =\n result.data?.runtime?.systemUIBrandings?.create?.[0];\n if (!item) {\n throw new Error('createBranding returned no entity');\n }\n return item;\n }\n\n private async runUpdate(\n rtId: string,\n input: SystemUiBrandingInputDto,\n ): Promise<ServerBranding> {\n const result = await firstValueFrom(\n this.updateBrandingGQL.mutate({\n variables: { branding: { rtId, item: input } },\n fetchPolicy: 'no-cache',\n }),\n );\n const item =\n result.data?.runtime?.systemUIBrandings?.update?.[0];\n if (!item) {\n throw new Error('updateBranding returned no entity');\n }\n return item;\n }\n\n private paletteToInput(\n palette: ThemePalette,\n ): SystemUiThemePaletteInputDto {\n return {\n primaryColor: palette.primaryColor,\n secondaryColor: palette.secondaryColor,\n tertiaryColor: palette.tertiaryColor,\n neutralColor: palette.neutralColor,\n backgroundColor: palette.backgroundColor,\n headerGradient: {\n startColor: palette.headerGradient.startColor,\n endColor: palette.headerGradient.endColor,\n },\n footerGradient: {\n startColor: palette.footerGradient.startColor,\n endColor: palette.footerGradient.endColor,\n },\n };\n }\n\n private async mapFromServer(item: ServerBranding): Promise<BrandingData> {\n // `Binary` attribute in the ckType surfaces as GraphQL `[Byte]` (raw byte\n // array scalar). Client converts to a data URL locally for <img src>.\n // No second HTTP round-trip like the `BinaryLinked`/`LargeBinaryInfo`\n // pattern (which would return a downloadUri to fetch).\n const [headerLogoUrl, footerLogoUrl, faviconUrl] = await Promise.all([\n this.bytesToDataUrl(item.headerLogo),\n this.bytesToDataUrl(item.footerLogo),\n this.bytesToDataUrl(item.favicon),\n ]);\n\n return {\n rtId: item.rtId,\n appName: item.appName ?? this.defaults.appName,\n appTitle: item.appTitle ?? this.defaults.appTitle,\n headerLogoUrl: headerLogoUrl,\n footerLogoUrl: footerLogoUrl,\n faviconUrl: faviconUrl,\n lightTheme:\n this.paletteFromServer(item.lightTheme, this.defaults.lightTheme) ??\n this.defaults.lightTheme,\n darkTheme: this.paletteFromServer(\n item.darkTheme,\n this.defaults.darkTheme ?? this.defaults.lightTheme,\n ),\n };\n }\n\n // Defaults are passed in so light/dark palettes fall back to their own\n // defaults instead of always using lightTheme defaults (matters when only\n // partial dark palette comes from server).\n private paletteFromServer(\n palette: ServerPalette | null | undefined,\n defaults: ThemePalette,\n ): ThemePalette | null {\n if (!palette) return null;\n const { headerGradient, footerGradient } = palette;\n return {\n primaryColor: palette.primaryColor ?? defaults.primaryColor,\n secondaryColor: palette.secondaryColor ?? defaults.secondaryColor,\n tertiaryColor: palette.tertiaryColor ?? defaults.tertiaryColor,\n neutralColor: palette.neutralColor ?? defaults.neutralColor,\n backgroundColor: palette.backgroundColor ?? defaults.backgroundColor,\n headerGradient: headerGradient\n ? { startColor: headerGradient.startColor, endColor: headerGradient.endColor }\n : defaults.headerGradient,\n footerGradient: footerGradient\n ? { startColor: footerGradient.startColor, endColor: footerGradient.endColor }\n : defaults.footerGradient,\n };\n }\n\n /**\n * Convert a byte array from a GraphQL `[Byte]` field into a data URL.\n * Returns null for null/undefined/empty input. MIME type is detected from\n * the first few bytes (magic numbers) so <img src> works without a\n * server-provided content-type.\n */\n private async bytesToDataUrl(\n bytes: readonly (number | null)[] | null | undefined,\n ): Promise<string | null> {\n if (!bytes || bytes.length === 0) return null;\n // Codegen types `[Byte]` entries as `number | null`; strip nulls.\n const clean = bytes.filter((b): b is number => typeof b === 'number');\n if (clean.length === 0) return null;\n const uint8 = new Uint8Array(clean);\n const mime = this.detectImageMime(uint8) ?? 'application/octet-stream';\n try {\n return await this.blobToDataUrl(new Blob([uint8], { type: mime }));\n } catch (error) {\n console.warn('[BrandingDataSource] Failed to decode image bytes', error);\n return null;\n }\n }\n\n private detectImageMime(bytes: Uint8Array): string | null {\n if (bytes.length >= 8 && bytes[0] === 0x89 && bytes[1] === 0x50 && bytes[2] === 0x4e && bytes[3] === 0x47) return 'image/png';\n if (bytes.length >= 3 && bytes[0] === 0xff && bytes[1] === 0xd8 && bytes[2] === 0xff) return 'image/jpeg';\n if (bytes.length >= 6 && bytes[0] === 0x47 && bytes[1] === 0x49 && bytes[2] === 0x46) return 'image/gif';\n if (bytes.length >= 12 && bytes[0] === 0x52 && bytes[1] === 0x49 && bytes[2] === 0x46 && bytes[3] === 0x46 && bytes[8] === 0x57 && bytes[9] === 0x45 && bytes[10] === 0x42 && bytes[11] === 0x50) return 'image/webp';\n if (bytes.length >= 4 && bytes[0] === 0x00 && bytes[1] === 0x00 && bytes[2] === 0x01 && bytes[3] === 0x00) return 'image/vnd.microsoft.icon';\n if (bytes.length >= 5 && bytes[0] === 0x3c && bytes[1] === 0x3f && bytes[2] === 0x78 && bytes[3] === 0x6d && bytes[4] === 0x6c) return 'image/svg+xml';\n // UTF-8 BOM-less SVG starts with '<svg'\n if (bytes.length >= 4 && bytes[0] === 0x3c && bytes[1] === 0x73 && bytes[2] === 0x76 && bytes[3] === 0x67) return 'image/svg+xml';\n return null;\n }\n\n private blobToDataUrl(blob: Blob): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = (): void => {\n const result = reader.result;\n if (typeof result === 'string') {\n resolve(result);\n } else {\n reject(new Error('FileReader returned non-string result'));\n }\n };\n reader.onerror = (): void =>\n reject(reader.error ?? new Error('FileReader failed'));\n reader.readAsDataURL(blob);\n });\n }\n\n /**\n * Three-value binary resolution for save():\n * - `null` → caller wants the asset cleared; forward null to the server.\n * - `undefined` → caller left the slot untouched; omit the field so the\n * server keeps the existing blob.\n * - `File` → caller uploaded a new asset; serialize to byte array.\n */\n private async prepareBinary(\n file: File | null | undefined,\n ): Promise<number[] | null | undefined> {\n if (file === null) return null;\n if (file === undefined) return undefined;\n const buffer = await file.arrayBuffer();\n return Array.from(new Uint8Array(buffer));\n }\n}\n","import {\n effect,\n inject,\n Injectable,\n InjectionToken,\n Injector,\n} from '@angular/core';\nimport { Title } from '@angular/platform-browser';\nimport {\n ActivatedRouteSnapshot,\n RouterStateSnapshot,\n TitleStrategy,\n} from '@angular/router';\nimport { BrandingDataSource } from './branding-data-source.service';\n\n/**\n * Optional function the host supplies to translate a breadcrumb key from\n * `route.data['breadcrumb']` into a localized string. The library has no i18n\n * dependency; without a translator the breadcrumb key is rendered verbatim.\n */\nexport type OctoTitleTranslator = (key: string) => string;\n\nexport const OCTO_TITLE_TRANSLATOR = new InjectionToken<OctoTitleTranslator>(\n 'OCTO_TITLE_TRANSLATOR',\n);\n\n/**\n * `TitleStrategy` that composes `<branding.appTitle> | <route.breadcrumb>`\n * into `document.title` on every navigation, and re-applies on\n * `BrandingDataSource.branding()` changes (e.g. after Settings save).\n *\n * Wire as the application's `TitleStrategy`:\n * ```ts\n * { provide: TitleStrategy, useExisting: AppTitleService }\n * ```\n *\n * Optional translation of the breadcrumb key is supplied through\n * {@link OCTO_TITLE_TRANSLATOR}; without it the key from `route.data` is used\n * as-is.\n *\n * `BrandingDataSource` is resolved lazily via `injector.get()` rather than\n * field-injected. The router constructs `TitleStrategy` eagerly during\n * `APP_INITIALIZER`, before the host's tenant config has loaded. A direct\n * field-inject of `BrandingDataSource` here would chain into Apollo's\n * factory, which reads `tenantId` while it is still `undefined` and bakes\n * `/tenants/undefined/GraphQL` into the request URI. Lazy resolution defers\n * the chain to the first navigation, by which time config is loaded.\n */\n@Injectable({ providedIn: 'root' })\nexport class AppTitleService extends TitleStrategy {\n private readonly title = inject(Title);\n private readonly translator = inject(OCTO_TITLE_TRANSLATOR, {\n optional: true,\n });\n private readonly injector = inject(Injector);\n\n private lastRouterState?: RouterStateSnapshot;\n private brandingEffectInitialized = false;\n\n override updateTitle(routerState: RouterStateSnapshot): void {\n this.lastRouterState = routerState;\n this.applyTitle();\n this.ensureBrandingSubscription();\n }\n\n private ensureBrandingSubscription(): void {\n if (this.brandingEffectInitialized) return;\n this.brandingEffectInitialized = true;\n effect(() => this.applyTitle(), { injector: this.injector });\n }\n\n private applyTitle(): void {\n if (!this.lastRouterState) return;\n const data = this.injector.get(BrandingDataSource).branding();\n const baseTitle = data.appTitle || data.appName;\n const breadcrumbKey = this.getDeepestBreadcrumb(this.lastRouterState.root);\n if (breadcrumbKey) {\n const resolved = this.translator\n ? this.translator(breadcrumbKey)\n : breadcrumbKey;\n this.title.setTitle(`${baseTitle} | ${resolved}`);\n } else {\n this.title.setTitle(baseTitle);\n }\n }\n\n private getDeepestBreadcrumb(\n route: ActivatedRouteSnapshot,\n ): string | undefined {\n let breadcrumb: string | undefined =\n typeof route.data['breadcrumb'] === 'string'\n ? route.data['breadcrumb']\n : undefined;\n for (const child of route.children) {\n const childBreadcrumb = this.getDeepestBreadcrumb(child);\n if (childBreadcrumb) {\n breadcrumb = childBreadcrumb;\n }\n }\n return breadcrumb;\n }\n}\n","import {\n EnvironmentProviders,\n makeEnvironmentProviders,\n Provider,\n} from '@angular/core';\nimport { TitleStrategy } from '@angular/router';\nimport { BrandingData } from './models/branding.models';\nimport {\n NEUTRAL_BRANDING_DEFAULTS,\n NEUTRAL_FALLBACK_ASSETS,\n OCTO_BRANDING_DEFAULTS,\n OCTO_BRANDING_FALLBACK_ASSETS,\n OctoBrandingFallbackAssets,\n} from './branding.tokens';\nimport { AppTitleService } from './services/app-title.service';\n\nexport interface OctoBrandingConfig {\n /** Caller-supplied defaults; merged shallowly over `NEUTRAL_BRANDING_DEFAULTS`. */\n defaults?: Partial<BrandingData>;\n /** Bundled URLs used when the tenant has not uploaded a logo / favicon. */\n fallbackAssets?: OctoBrandingFallbackAssets;\n /**\n * When `true` (default) the library binds {@link AppTitleService} as the\n * application's `TitleStrategy`, so `document.title` automatically reflects\n * `<branding.appTitle> | <route.breadcrumb>` on every navigation. Set to\n * `false` if the host already provides its own `TitleStrategy`.\n */\n registerTitleStrategy?: boolean;\n}\n\n/**\n * Registers branding tokens, defaults, fallback assets, and (by default) the\n * `TitleStrategy` that drives `document.title` from the branding signal.\n *\n * Does **not** load the tenant's branding record. Loading must happen after\n * authentication is settled (Apollo's URI bakes in the tenant ID at the time\n * the first request fires; loading too early targets\n * `/tenants/undefined/GraphQL`). The host shell typically does:\n *\n * ```ts\n * inject(BrandingApplicationService); // start the apply effect\n * effect(() => {\n * if (this.auth.isAuthenticated()) {\n * this.brandingDataSource.load();\n * }\n * });\n * ```\n *\n * `BrandingApplicationService` is `providedIn: 'root'`, so the host only has\n * to inject it once to activate the apply effect.\n */\nexport function provideOctoBranding(\n config?: OctoBrandingConfig,\n): EnvironmentProviders {\n const merged: BrandingData = {\n ...NEUTRAL_BRANDING_DEFAULTS,\n ...(config?.defaults ?? {}),\n lightTheme: {\n ...NEUTRAL_BRANDING_DEFAULTS.lightTheme,\n ...(config?.defaults?.lightTheme ?? {}),\n },\n darkTheme:\n config?.defaults?.darkTheme === null\n ? null\n : {\n ...(NEUTRAL_BRANDING_DEFAULTS.darkTheme ??\n NEUTRAL_BRANDING_DEFAULTS.lightTheme),\n ...(config?.defaults?.darkTheme ?? {}),\n },\n };\n\n const providers: Provider[] = [\n { provide: OCTO_BRANDING_DEFAULTS, useValue: merged },\n {\n provide: OCTO_BRANDING_FALLBACK_ASSETS,\n useValue: config?.fallbackAssets ?? NEUTRAL_FALLBACK_ASSETS,\n },\n ];\n\n if (config?.registerTitleStrategy !== false) {\n providers.push({ provide: TitleStrategy, useExisting: AppTitleService });\n }\n\n return makeEnvironmentProviders(providers);\n}\n","/** Convenience barrel re-exporting branding model interfaces from ./models/. */\nexport * from './models/theme.models';\nexport * from './models/branding.models';\nexport * from './models/brand-display';\n","import {\n DOCUMENT,\n inject,\n Injectable,\n Renderer2,\n RendererFactory2,\n signal,\n} from '@angular/core';\n\n/**\n * Light/dark mode toggle backed by `localStorage` + `<html data-theme=\"...\">`.\n * Pure mode toggle; palette generation lives in `BrandingApplicationService`.\n */\n@Injectable({ providedIn: 'root' })\nexport class ThemeService {\n private readonly document = inject(DOCUMENT);\n private readonly renderer: Renderer2;\n private readonly isDarkSignal = signal(false);\n\n readonly isDark = this.isDarkSignal.asReadonly();\n\n constructor() {\n this.renderer = inject(RendererFactory2).createRenderer(null, null);\n this.isDarkSignal.set(this.getInitialThemeIsDark());\n this.applyTheme();\n }\n\n toggleTheme(): void {\n this.setDark(!this.isDarkSignal());\n }\n\n setDark(isDark: boolean): void {\n this.isDarkSignal.set(isDark);\n try {\n this.document.defaultView?.localStorage.setItem(\n 'theme',\n isDark ? 'dark' : 'light',\n );\n } catch {\n // localStorage may be unavailable (private mode, SSR) — degrade silently.\n }\n this.applyTheme();\n }\n\n private applyTheme(): void {\n const html = this.document.documentElement;\n this.renderer.setAttribute(\n html,\n 'data-theme',\n this.isDarkSignal() ? 'dark' : 'light',\n );\n }\n\n private getInitialThemeIsDark(): boolean {\n let stored: string | null = null;\n try {\n stored = this.document.defaultView?.localStorage.getItem('theme') ?? null;\n } catch {\n stored = null;\n }\n if (stored === 'dark') return true;\n if (stored === 'light') return false;\n return (\n this.document.defaultView?.matchMedia?.('(prefers-color-scheme: dark)')\n .matches ?? false\n );\n }\n}\n","export interface ThemeSwitcherMessages {\n toggleToDark: string;\n toggleToLight: string;\n /** Aria label when the tenant disabled dark mode (switcher is locked). */\n unavailable: string;\n}\n\nexport const DEFAULT_THEME_SWITCHER_MESSAGES: ThemeSwitcherMessages = {\n toggleToDark: 'Switch to dark mode',\n toggleToLight: 'Switch to light mode',\n unavailable: 'Theme switching is unavailable for this tenant',\n};\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n} from '@angular/core';\nimport { SVGIconModule } from '@progress/kendo-angular-icons';\nimport {\n brightnessContrastIcon,\n lightbulbOutlineIcon,\n} from '@progress/kendo-svg-icons';\nimport { BrandingDataSource } from '../../services/branding-data-source.service';\nimport { ThemeService } from '../../services/theme.service';\nimport {\n DEFAULT_THEME_SWITCHER_MESSAGES,\n ThemeSwitcherMessages,\n} from './theme-switcher.messages';\n\n@Component({\n selector: 'mm-theme-switcher',\n standalone: true,\n imports: [SVGIconModule],\n templateUrl: './theme-switcher.component.html',\n styleUrl: './theme-switcher.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ThemeSwitcherComponent {\n readonly messages = input<ThemeSwitcherMessages>(\n DEFAULT_THEME_SWITCHER_MESSAGES,\n );\n\n private readonly themeService = inject(ThemeService);\n private readonly branding = inject(BrandingDataSource);\n\n protected readonly isDark = this.themeService.isDark;\n protected readonly available = computed(\n () => this.branding.branding().darkTheme !== null,\n );\n protected readonly ariaLabel = computed(() => {\n if (!this.available()) return this.messages().unavailable;\n return this.isDark()\n ? this.messages().toggleToLight\n : this.messages().toggleToDark;\n });\n\n protected readonly lightIcon = lightbulbOutlineIcon;\n protected readonly darkIcon = brightnessContrastIcon;\n\n protected onToggle(): void {\n if (!this.available()) return;\n this.themeService.setDark(!this.isDark());\n }\n}\n","<button\n type=\"button\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-pressed]=\"isDark()\"\n [disabled]=\"!available()\"\n (click)=\"onToggle()\"\n>\n <kendo-svg-icon [icon]=\"isDark() ? lightIcon : darkIcon\" />\n</button>\n","import { DOCUMENT, effect, inject, Injectable } from '@angular/core';\nimport {\n OCTO_BRANDING_FALLBACK_ASSETS,\n OctoBrandingFallbackAssets,\n} from '../branding.tokens';\nimport { BrandingData } from '../models/branding.models';\nimport { ThemePalette } from '../models/theme.models';\nimport { BrandingDataSource } from './branding-data-source.service';\nimport { ThemeService } from './theme.service';\n\ntype ColorPaletteShades = Record<number, string>;\n\n/**\n * Writes tenant branding (Kendo color vars, gradients, favicon, document\n * title) inline on <html>. An effect re-applies the correct palette when\n * either the theme mode or the branding data changes, so mode toggles after\n * a save don't leave stale inline values behind.\n */\n@Injectable({ providedIn: 'root' })\nexport class BrandingApplicationService {\n private document = inject(DOCUMENT);\n private themeService = inject(ThemeService);\n private brandingDataSource = inject(BrandingDataSource);\n private fallbackAssets = inject(OCTO_BRANDING_FALLBACK_ASSETS, {\n optional: true,\n }) as OctoBrandingFallbackAssets | null;\n\n // Cleared before every apply so unset palette fields fall through to the\n // static layer-2 brand-default instead of sticking from a prior save.\n private static readonly BRANDED_VARS: readonly string[] = [\n ...['primary', 'secondary', 'tertiary'].flatMap((c) => [\n `--kendo-color-${c}`,\n `--kendo-color-${c}-hover`,\n `--kendo-color-${c}-active`,\n `--kendo-color-on-${c}`,\n `--kendo-color-${c}-subtle`,\n `--kendo-color-${c}-subtle-hover`,\n `--kendo-color-${c}-subtle-active`,\n `--kendo-color-${c}-emphasis`,\n `--kendo-color-${c}-on-subtle`,\n `--kendo-color-${c}-on-surface`,\n ]),\n '--kendo-color-base',\n '--kendo-color-base-hover',\n '--kendo-color-base-active',\n '--kendo-color-on-base',\n '--kendo-color-base-subtle',\n '--kendo-color-base-subtle-hover',\n '--kendo-color-base-subtle-active',\n '--kendo-color-base-emphasis',\n '--kendo-color-base-on-subtle',\n '--kendo-color-subtle',\n '--kendo-color-border',\n '--kendo-color-border-alt',\n '--kendo-color-app-surface',\n '--kendo-color-on-app-surface',\n '--app-header-gradient-start',\n '--app-header-gradient-end',\n '--app-header-text',\n '--app-footer-gradient-start',\n '--app-footer-gradient-end',\n '--app-footer-text',\n ];\n\n constructor() {\n effect(() => {\n const isDark = this.themeService.isDark();\n const data = this.brandingDataSource.branding();\n\n // Tenant disabled dark-theme override (single-theme app) — force light\n // mode. Without this guard a stale 'dark' in localStorage (or system\n // prefers-color-scheme) carries over and we'd render light palette\n // values into html[data-theme='dark']: surface ladder collapses to\n // white and text becomes unreadable. ThemeSwitcherComponent also\n // disables the toggle when darkTheme is null so the user can't\n // re-enter this state interactively.\n if (data.darkTheme === null && isDark) {\n this.themeService.setDark(false);\n return;\n }\n\n const palette = isDark ? data.darkTheme! : data.lightTheme;\n this.apply(data, palette);\n });\n }\n\n apply(data: BrandingData, palette: ThemePalette): void {\n this.clearInlineBrandingVars();\n this.applyThemeColors(palette);\n this.applyFavicon(data.faviconUrl);\n // document.title is owned by AppTitleService (TitleStrategy) — it composes\n // `${branding().appName} | ${routeBreadcrumb}` per navigation. Setting\n // title here would race AppTitleService and overwrite the route portion\n // (e.g. /settings would flicker from \"TecLink | Settings\" to just \"TecLink\"\n // when branding finishes loading). The tab updates on next navigation\n // after a tenant edits appName/appTitle in Settings — acceptable trade-off.\n }\n\n applyThemeColors(palette: ThemePalette): void {\n const root = this.document.documentElement;\n\n if (palette.primaryColor) {\n this.applyColorPalette(root, 'primary', palette.primaryColor);\n }\n if (palette.secondaryColor) {\n this.applyColorPalette(root, 'secondary', palette.secondaryColor);\n }\n if (palette.tertiaryColor) {\n this.applyColorPalette(root, 'tertiary', palette.tertiaryColor);\n }\n if (palette.neutralColor) {\n this.applyNeutralColors(root, palette.neutralColor);\n }\n\n this.setIf(root, '--app-header-gradient-start', palette.headerGradient.startColor);\n this.setIf(root, '--app-header-gradient-end', palette.headerGradient.endColor);\n if (palette.headerGradient.startColor) {\n root.style.setProperty(\n '--app-header-text',\n this.getContrastColor(palette.headerGradient.startColor),\n );\n }\n this.setIf(root, '--app-footer-gradient-start', palette.footerGradient.startColor);\n this.setIf(root, '--app-footer-gradient-end', palette.footerGradient.endColor);\n if (palette.footerGradient.startColor) {\n root.style.setProperty(\n '--app-footer-text',\n this.getContrastColor(palette.footerGradient.startColor),\n );\n }\n\n if (palette.backgroundColor) {\n // Only write the root surface — --kendo-color-surface / -surface-alt /\n // -base / -border are aliased in styles.scss to --color-surface-* shades\n // that derive from --color-surface (= app-surface) via mode-aware\n // color-mix. Writing them directly here would collapse the shade ladder\n // (all surfaces flat = same colour → transparent-looking components).\n root.style.setProperty('--kendo-color-app-surface', palette.backgroundColor);\n // Contrast text on the surface — without this, a dark backgroundColor in\n // light mode (or vice versa) renders text against an inverted surface\n // and becomes unreadable. --color-on-surface in styles.scss aliases this.\n root.style.setProperty(\n '--kendo-color-on-app-surface',\n this.getContrastColor(palette.backgroundColor),\n );\n }\n }\n\n applyFavicon(faviconUrl: string | null): void {\n const href = faviconUrl ?? this.fallbackAssets?.favicon;\n if (!href) return;\n\n let link = this.document.querySelector<HTMLLinkElement>(\n \"link[rel~='icon']\",\n );\n if (!link) {\n link = this.document.createElement('link');\n link.rel = 'icon';\n this.document.head.appendChild(link);\n }\n link.href = href;\n }\n\n private clearInlineBrandingVars(): void {\n const root = this.document.documentElement;\n for (const name of BrandingApplicationService.BRANDED_VARS) {\n root.style.removeProperty(name);\n }\n }\n\n private setIf(\n root: HTMLElement,\n name: string,\n value: string | null | undefined,\n ): void {\n if (value) root.style.setProperty(name, value);\n }\n\n private applyColorPalette(\n root: HTMLElement,\n colorName: string,\n baseColor: string,\n ): void {\n const palette = this.generatePalette(baseColor);\n\n root.style.setProperty(`--kendo-color-${colorName}`, palette[40]);\n root.style.setProperty(`--kendo-color-${colorName}-hover`, palette[50]);\n root.style.setProperty(`--kendo-color-${colorName}-active`, palette[60]);\n root.style.setProperty(\n `--kendo-color-on-${colorName}`,\n this.getContrastColor(palette[40]),\n );\n root.style.setProperty(`--kendo-color-${colorName}-subtle`, palette[90]);\n root.style.setProperty(\n `--kendo-color-${colorName}-subtle-hover`,\n palette[80],\n );\n root.style.setProperty(\n `--kendo-color-${colorName}-subtle-active`,\n palette[70],\n );\n root.style.setProperty(`--kendo-color-${colorName}-emphasis`, palette[70]);\n root.style.setProperty(\n `--kendo-color-${colorName}-on-subtle`,\n palette[20],\n );\n root.style.setProperty(\n `--kendo-color-${colorName}-on-surface`,\n palette[40],\n );\n }\n\n private applyNeutralColors(root: HTMLElement, baseColor: string): void {\n const palette = this.generatePalette(baseColor);\n\n root.style.setProperty('--kendo-color-base', palette[95]);\n root.style.setProperty('--kendo-color-base-hover', palette[90]);\n root.style.setProperty('--kendo-color-base-active', palette[80]);\n root.style.setProperty('--kendo-color-on-base', palette[20]);\n root.style.setProperty('--kendo-color-base-subtle', palette[90]);\n root.style.setProperty('--kendo-color-base-subtle-hover', palette[80]);\n root.style.setProperty('--kendo-color-base-subtle-active', palette[70]);\n root.style.setProperty('--kendo-color-base-emphasis', palette[70]);\n root.style.setProperty('--kendo-color-base-on-subtle', palette[20]);\n root.style.setProperty('--kendo-color-subtle', palette[40]);\n root.style.setProperty('--kendo-color-border', palette[80]);\n root.style.setProperty('--kendo-color-border-alt', palette[70]);\n }\n\n // ---------------------------------------------------------------------------\n // Palette generation (ported from energy-community theme.service.ts)\n // ---------------------------------------------------------------------------\n generatePalette(baseColor: string): ColorPaletteShades {\n const rgb = this.hexToRgb(baseColor);\n const hsl = this.rgbToHsl(rgb.r, rgb.g, rgb.b);\n\n const palette: ColorPaletteShades = {\n 0: '#000000',\n 100: '#ffffff',\n };\n\n palette[40] = baseColor;\n\n const baseL = hsl.l;\n const baseS = hsl.s;\n const baseH = hsl.h;\n\n const lighten = (amount: number): number => Math.min(1, baseL + amount);\n const darken = (amount: number): number => Math.max(0, baseL - amount);\n\n palette[50] = this.hslToHex(baseH, Math.min(1, baseS * 1.15), darken(0.12));\n palette[60] = this.hslToHex(baseH, Math.min(1, baseS * 1.08), darken(0.08));\n palette[70] = this.hslToHex(baseH, Math.max(0.25, baseS * 0.85), lighten(0.08));\n palette[80] = this.hslToHex(baseH, Math.max(0.15, baseS * 0.6), lighten(0.22));\n palette[90] = this.hslToHex(baseH, Math.max(0.08, baseS * 0.35), lighten(0.38));\n palette[95] = this.hslToHex(baseH, Math.max(0.04, baseS * 0.2), lighten(0.43));\n palette[98] = this.hslToHex(baseH, Math.max(0.02, baseS * 0.12), lighten(0.46));\n palette[99] = this.hslToHex(baseH, Math.max(0.01, baseS * 0.08), lighten(0.47));\n\n palette[10] = this.hslToHex(baseH, Math.min(1, baseS * 1.4), darken(0.72));\n palette[20] = this.hslToHex(baseH, Math.min(1, baseS * 1.25), darken(0.62));\n palette[25] = this.hslToHex(baseH, Math.min(1, baseS * 1.2), darken(0.57));\n palette[30] = this.hslToHex(baseH, Math.min(1, baseS * 1.15), darken(0.52));\n palette[35] = this.hslToHex(baseH, Math.min(1, baseS * 1.1), darken(0.42));\n\n return palette;\n }\n\n private hexToRgb(color: string): { r: number; g: number; b: number } {\n const hexResult = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(color);\n if (hexResult) {\n return {\n r: parseInt(hexResult[1], 16),\n g: parseInt(hexResult[2], 16),\n b: parseInt(hexResult[3], 16),\n };\n }\n const rgbResult = /rgba?\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)/.exec(color);\n if (rgbResult) {\n return {\n r: parseInt(rgbResult[1], 10),\n g: parseInt(rgbResult[2], 10),\n b: parseInt(rgbResult[3], 10),\n };\n }\n return { r: 0, g: 0, b: 0 };\n }\n\n private rgbToHsl(\n r: number,\n g: number,\n b: number,\n ): { h: number; s: number; l: number } {\n const rn = r / 255;\n const gn = g / 255;\n const bn = b / 255;\n\n const max = Math.max(rn, gn, bn);\n const min = Math.min(rn, gn, bn);\n let h = 0;\n let s = 0;\n const l = (max + min) / 2;\n\n if (max !== min) {\n const d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n\n switch (max) {\n case rn:\n h = ((gn - bn) / d + (gn < bn ? 6 : 0)) / 6;\n break;\n case gn:\n h = ((bn - rn) / d + 2) / 6;\n break;\n case bn:\n h = ((rn - gn) / d + 4) / 6;\n break;\n }\n }\n\n return { h, s, l };\n }\n\n private hslToHex(h: number, s: number, l: number): string {\n let r: number;\n let g: number;\n let b: number;\n\n if (s === 0) {\n r = l;\n g = l;\n b = l;\n } else {\n const hue2rgb = (p: number, q: number, t: number): number => {\n let tn = t;\n if (tn < 0) tn += 1;\n if (tn > 1) tn -= 1;\n if (tn < 1 / 6) return p + (q - p) * 6 * tn;\n if (tn < 1 / 2) return q;\n if (tn < 2 / 3) return p + (q - p) * (2 / 3 - tn) * 6;\n return p;\n };\n\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n r = hue2rgb(p, q, h + 1 / 3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1 / 3);\n }\n\n return this.rgbToHex(\n Math.round(r * 255),\n Math.round(g * 255),\n Math.round(b * 255),\n );\n }\n\n private rgbToHex(r: number, g: number, b: number): string {\n return (\n '#' +\n [r, g, b]\n .map((x) => {\n const hex = Math.round(x).toString(16);\n return hex.length === 1 ? '0' + hex : hex;\n })\n .join('')\n );\n }\n\n private getContrastColor(hex: string): string {\n const rgb = this.hexToRgb(hex);\n const brightness = (rgb.r * 299 + rgb.g * 587 + rgb.b * 114) / 1000;\n return brightness > 128 ? '#000000' : '#ffffff';\n }\n}\n","import { Provider, signal, WritableSignal } from '@angular/core';\nimport { NEUTRAL_BRANDING_DEFAULTS } from '../branding.tokens';\nimport { BrandingData, BrandingUpdate } from '../models/branding.models';\nimport { BrandingDataSource } from '../services/branding-data-source.service';\n\n/**\n * Framework-agnostic stub matching the runtime shape of `BrandingDataSource`.\n * The async methods are plain functions; consumers wrap them in their own\n * spy primitive (`jasmine.createSpy`, `jest.fn`, `vi.fn`) when they need\n * call assertions. Casting `branding` back to `WritableSignal` lets specs\n * drive state changes.\n */\nexport interface BrandingDataSourceStub {\n branding: WritableSignal<BrandingData>;\n load: () => Promise<void>;\n save: (u: BrandingUpdate) => Promise<BrandingData>;\n resetToDefaults: () => Promise<void>;\n}\n\nexport function createBrandingStub(\n overrides?: Partial<BrandingData>,\n): BrandingDataSourceStub {\n const branding = signal<BrandingData>({\n ...NEUTRAL_BRANDING_DEFAULTS,\n ...(overrides ?? {}),\n });\n return {\n branding,\n load: () => Promise.resolve(),\n save: () => Promise.resolve(branding()),\n resetToDefaults: () => Promise.resolve(),\n };\n}\n\n/** Convenience: returns a Provider that injects the stub as BrandingDataSource. */\nexport function provideBrandingTesting(\n stub: BrandingDataSourceStub = createBrandingStub(),\n): Provider {\n return { provide: BrandingDataSource, useValue: stub };\n}\n","// Public API of the branding feature folder. Re-exported by\n// octo-ui/src/public-api.ts to expose under @meshmakers/octo-ui.\n//\n// Note: the heavy admin-only `SettingsPageComponent` (a.k.a.\n// `mm-branding-settings`) and `BRANDING_ROUTES` live in the dedicated\n// secondary entry point `@meshmakers/octo-ui/branding-settings` so apps that\n// only need the lightweight branding pieces (logo, theme switcher, services)\n// don't pull in form/Kendo modules they don't use.\n\n// Configuration & tokens\nexport * from './branding.config';\nexport * from './branding.tokens';\n\n// Models (via barrel)\nexport * from './branding.model';\n\n// Components\n//\n// Note: there is no `<mm-brand-logo>` component. Hosts render the logo inline\n// with `<img [src]=\"branding.branding().headerLogoUrl ?? '/your-fallback.svg'\">`\n// after injecting `BrandingDataSource`. See `BRANDING_USAGE.md` for the\n// recommended snippet.\nexport * from './components/mm-theme-switcher/theme-switcher.component';\nexport * from './components/mm-theme-switcher/theme-switcher.messages';\n\n// Services\nexport * from './services/branding-data-source.service';\nexport * from './services/theme.service';\nexport * from './services/branding-application.service';\nexport * from './services/app-title.service';\n\n// Test utilities\nexport * from './testing/branding-stub';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["Apollo","i1"],"mappings":"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"}
1
+ {"version":3,"file":"meshmakers-octo-ui-branding.mjs","sources":["../../../../projects/meshmakers/octo-ui/branding/src/branding.tokens.ts","../../../../projects/meshmakers/octo-ui/branding/src/graphQL/createBranding.ts","../../../../projects/meshmakers/octo-ui/branding/src/graphQL/getBranding.ts","../../../../projects/meshmakers/octo-ui/branding/src/graphQL/updateBranding.ts","../../../../projects/meshmakers/octo-ui/branding/src/services/branding-data-source.service.ts","../../../../projects/meshmakers/octo-ui/branding/src/services/app-title.service.ts","../../../../projects/meshmakers/octo-ui/branding/src/branding.config.ts","../../../../projects/meshmakers/octo-ui/branding/src/branding.model.ts","../../../../projects/meshmakers/octo-ui/branding/src/services/theme.service.ts","../../../../projects/meshmakers/octo-ui/branding/src/components/mm-theme-switcher/theme-switcher.messages.ts","../../../../projects/meshmakers/octo-ui/branding/src/components/mm-theme-switcher/theme-switcher.component.ts","../../../../projects/meshmakers/octo-ui/branding/src/components/mm-theme-switcher/theme-switcher.component.html","../../../../projects/meshmakers/octo-ui/branding/src/services/branding-application.service.ts","../../../../projects/meshmakers/octo-ui/branding/src/testing/branding-stub.ts","../../../../projects/meshmakers/octo-ui/branding/src/public-api.ts","../../../../projects/meshmakers/octo-ui/branding/src/meshmakers-octo-ui-branding.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport { BrandingData } from './models/branding.models';\nimport { ThemePalette } from './models/theme.models';\n\n/**\n * Bundled fallback URLs used when the tenant did not upload a logo / favicon.\n * Any field omitted means the corresponding component renders nothing (text-only\n * header, no <link rel=\"icon\">, etc.) instead of breaking with a 404.\n */\nexport interface OctoBrandingFallbackAssets {\n headerLogo?: string;\n footerLogo?: string;\n favicon?: string;\n}\n\nexport const OCTO_BRANDING_DEFAULTS = new InjectionToken<BrandingData>(\n 'OCTO_BRANDING_DEFAULTS',\n);\n\nexport const OCTO_BRANDING_FALLBACK_ASSETS = new InjectionToken<OctoBrandingFallbackAssets>(\n 'OCTO_BRANDING_FALLBACK_ASSETS',\n);\n\n// Library defaults carry the Meshmakers brand mint (#65ceaf) as primary so\n// an app that opts into `provideOctoBranding` but never persists a\n// `SystemUIBranding` record renders with the publisher's identity rather\n// than vanilla Kendo. Mint is also non-aggressive in mixed contexts (no\n// alarm/error semantics like Kendo's tomato default), so tenant overrides\n// almost always read as an intentional rebrand rather than a workaround.\n// Apps override per-tenant via Settings page; the override completely\n// replaces these baselines.\nconst NEUTRAL_LIGHT_THEME: ThemePalette = {\n primaryColor: '#65ceaf',\n secondaryColor: '#5ac4be',\n tertiaryColor: '#0b5c92',\n neutralColor: '#6c757d',\n backgroundColor: '#ffffff',\n headerGradient: { startColor: '#ffffff', endColor: '#f8f9fa' },\n footerGradient: { startColor: '#65ceaf', endColor: '#5ac4be' },\n};\n\nconst NEUTRAL_DARK_THEME: ThemePalette = {\n primaryColor: '#65ceaf',\n secondaryColor: '#5ac4be',\n tertiaryColor: '#4a8eef',\n neutralColor: '#94a3b8',\n backgroundColor: '#1a1d20',\n headerGradient: { startColor: '#1a1d20', endColor: '#2b2f33' },\n footerGradient: { startColor: '#65ceaf', endColor: '#5ac4be' },\n};\n\n/**\n * Library-shipped neutral fallback. Apps that don't supply their own defaults\n * see a working but visually-neutral baseline (\"configure me\"), not a crash.\n */\nexport const NEUTRAL_BRANDING_DEFAULTS: BrandingData = {\n rtId: null,\n appName: 'App',\n appTitle: 'App',\n headerLogoUrl: null,\n footerLogoUrl: null,\n faviconUrl: null,\n lightTheme: NEUTRAL_LIGHT_THEME,\n darkTheme: NEUTRAL_DARK_THEME,\n};\n\nexport const NEUTRAL_FALLBACK_ASSETS: OctoBrandingFallbackAssets = {};\n","import * as Types from './globalTypes';\n\nimport { gql } from 'apollo-angular';\nimport { Injectable } from '@angular/core';\nimport * as Apollo from 'apollo-angular';\nexport type CreateBrandingMutationVariablesDto = Types.Exact<{\n branding: Types.SystemUiBrandingInputDto;\n}>;\n\n\nexport type CreateBrandingMutationDto = { __typename?: 'OctoMutation', runtime?: { __typename?: 'Runtime', systemUIBrandings?: { __typename?: 'SystemUIBrandingMutations', create?: Array<{ __typename?: 'SystemUIBranding', rtId: any, rtWellKnownName?: string | null, appName?: string | null, appTitle?: string | null, headerLogo?: Array<any | null> | null, footerLogo?: Array<any | null> | null, favicon?: Array<any | null> | null, lightTheme?: { __typename?: 'SystemUIThemePalette', primaryColor?: string | null, secondaryColor?: string | null, tertiaryColor?: string | null, neutralColor?: string | null, backgroundColor?: string | null, headerGradient?: { __typename?: 'SystemUIThemeGradient', startColor: string, endColor: string } | null, footerGradient?: { __typename?: 'SystemUIThemeGradient', startColor: string, endColor: string } | null } | null, darkTheme?: { __typename?: 'SystemUIThemePalette', primaryColor?: string | null, secondaryColor?: string | null, tertiaryColor?: string | null, neutralColor?: string | null, backgroundColor?: string | null, headerGradient?: { __typename?: 'SystemUIThemeGradient', startColor: string, endColor: string } | null, footerGradient?: { __typename?: 'SystemUIThemeGradient', startColor: string, endColor: string } | null } | null } | null> | null } | null } | null };\n\nexport const CreateBrandingDocumentDto = gql`\n mutation createBranding($branding: SystemUIBrandingInput!) {\n runtime {\n systemUIBrandings {\n create(entities: [$branding]) {\n rtId\n rtWellKnownName\n appName\n appTitle\n headerLogo\n footerLogo\n favicon\n lightTheme {\n primaryColor\n secondaryColor\n tertiaryColor\n neutralColor\n backgroundColor\n headerGradient {\n startColor\n endColor\n }\n footerGradient {\n startColor\n endColor\n }\n }\n darkTheme {\n primaryColor\n secondaryColor\n tertiaryColor\n neutralColor\n backgroundColor\n headerGradient {\n startColor\n endColor\n }\n footerGradient {\n startColor\n endColor\n }\n }\n }\n }\n }\n}\n `;\n\n @Injectable({\n providedIn: 'root'\n })\n export class CreateBrandingDtoGQL extends Apollo.Mutation<CreateBrandingMutationDto, CreateBrandingMutationVariablesDto> {\n document = CreateBrandingDocumentDto;\n \n constructor(apollo: Apollo.Apollo) {\n super(apollo);\n }\n }","import * as Types from './globalTypes';\n\nimport { gql } from 'apollo-angular';\nimport { Injectable } from '@angular/core';\nimport * as Apollo from 'apollo-angular';\nexport type GetBrandingQueryVariablesDto = Types.Exact<{ [key: string]: never; }>;\n\n\nexport type GetBrandingQueryDto = { __typename?: 'OctoQuery', runtime?: { __typename?: 'RuntimeModelQuery', systemUIBranding?: { __typename?: 'SystemUIBrandingConnection', totalCount?: number | null, items?: Array<{ __typename?: 'SystemUIBranding', rtId: any, rtWellKnownName?: string | null, appName?: string | null, appTitle?: string | null, headerLogo?: Array<any | null> | null, footerLogo?: Array<any | null> | null, favicon?: Array<any | null> | null, lightTheme?: { __typename?: 'SystemUIThemePalette', primaryColor?: string | null, secondaryColor?: string | null, tertiaryColor?: string | null, neutralColor?: string | null, backgroundColor?: string | null, headerGradient?: { __typename?: 'SystemUIThemeGradient', startColor: string, endColor: string } | null, footerGradient?: { __typename?: 'SystemUIThemeGradient', startColor: string, endColor: string } | null } | null, darkTheme?: { __typename?: 'SystemUIThemePalette', primaryColor?: string | null, secondaryColor?: string | null, tertiaryColor?: string | null, neutralColor?: string | null, backgroundColor?: string | null, headerGradient?: { __typename?: 'SystemUIThemeGradient', startColor: string, endColor: string } | null, footerGradient?: { __typename?: 'SystemUIThemeGradient', startColor: string, endColor: string } | null } | null } | null> | null } | null } | null };\n\nexport const GetBrandingDocumentDto = gql`\n query getBranding {\n runtime {\n systemUIBranding(\n first: 1\n fieldFilter: [{attributePath: \"rtWellKnownName\", operator: EQUALS, comparisonValue: \"Branding\"}]\n ) {\n totalCount\n items {\n rtId\n rtWellKnownName\n appName\n appTitle\n headerLogo\n footerLogo\n favicon\n lightTheme {\n primaryColor\n secondaryColor\n tertiaryColor\n neutralColor\n backgroundColor\n headerGradient {\n startColor\n endColor\n }\n footerGradient {\n startColor\n endColor\n }\n }\n darkTheme {\n primaryColor\n secondaryColor\n tertiaryColor\n neutralColor\n backgroundColor\n headerGradient {\n startColor\n endColor\n }\n footerGradient {\n startColor\n endColor\n }\n }\n }\n }\n }\n}\n `;\n\n @Injectable({\n providedIn: 'root'\n })\n export class GetBrandingDtoGQL extends Apollo.Query<GetBrandingQueryDto, GetBrandingQueryVariablesDto> {\n document = GetBrandingDocumentDto;\n \n constructor(apollo: Apollo.Apollo) {\n super(apollo);\n }\n }","import * as Types from './globalTypes';\n\nimport { gql } from 'apollo-angular';\nimport { Injectable } from '@angular/core';\nimport * as Apollo from 'apollo-angular';\nexport type UpdateBrandingMutationVariablesDto = Types.Exact<{\n branding: Types.SystemUiBrandingInputUpdateDto;\n}>;\n\n\nexport type UpdateBrandingMutationDto = { __typename?: 'OctoMutation', runtime?: { __typename?: 'Runtime', systemUIBrandings?: { __typename?: 'SystemUIBrandingMutations', update?: Array<{ __typename?: 'SystemUIBranding', rtId: any, rtWellKnownName?: string | null, appName?: string | null, appTitle?: string | null, headerLogo?: Array<any | null> | null, footerLogo?: Array<any | null> | null, favicon?: Array<any | null> | null, lightTheme?: { __typename?: 'SystemUIThemePalette', primaryColor?: string | null, secondaryColor?: string | null, tertiaryColor?: string | null, neutralColor?: string | null, backgroundColor?: string | null, headerGradient?: { __typename?: 'SystemUIThemeGradient', startColor: string, endColor: string } | null, footerGradient?: { __typename?: 'SystemUIThemeGradient', startColor: string, endColor: string } | null } | null, darkTheme?: { __typename?: 'SystemUIThemePalette', primaryColor?: string | null, secondaryColor?: string | null, tertiaryColor?: string | null, neutralColor?: string | null, backgroundColor?: string | null, headerGradient?: { __typename?: 'SystemUIThemeGradient', startColor: string, endColor: string } | null, footerGradient?: { __typename?: 'SystemUIThemeGradient', startColor: string, endColor: string } | null } | null } | null> | null } | null } | null };\n\nexport const UpdateBrandingDocumentDto = gql`\n mutation updateBranding($branding: SystemUIBrandingInputUpdate!) {\n runtime {\n systemUIBrandings {\n update(entities: [$branding]) {\n rtId\n rtWellKnownName\n appName\n appTitle\n headerLogo\n footerLogo\n favicon\n lightTheme {\n primaryColor\n secondaryColor\n tertiaryColor\n neutralColor\n backgroundColor\n headerGradient {\n startColor\n endColor\n }\n footerGradient {\n startColor\n endColor\n }\n }\n darkTheme {\n primaryColor\n secondaryColor\n tertiaryColor\n neutralColor\n backgroundColor\n headerGradient {\n startColor\n endColor\n }\n footerGradient {\n startColor\n endColor\n }\n }\n }\n }\n }\n}\n `;\n\n @Injectable({\n providedIn: 'root'\n })\n export class UpdateBrandingDtoGQL extends Apollo.Mutation<UpdateBrandingMutationDto, UpdateBrandingMutationVariablesDto> {\n document = UpdateBrandingDocumentDto;\n \n constructor(apollo: Apollo.Apollo) {\n super(apollo);\n }\n }","import { inject, Injectable, signal } from '@angular/core';\nimport { firstValueFrom } from 'rxjs';\nimport {\n CreateBrandingDtoGQL,\n CreateBrandingMutationDto,\n} from '../graphQL/createBranding';\nimport {\n GetBrandingDtoGQL,\n GetBrandingQueryDto,\n} from '../graphQL/getBranding';\nimport {\n SystemUiBrandingInputDto,\n SystemUiThemePaletteInputDto,\n} from '../graphQL/globalTypes';\nimport {\n UpdateBrandingDtoGQL,\n UpdateBrandingMutationDto,\n} from '../graphQL/updateBranding';\nimport { OCTO_BRANDING_DEFAULTS } from '../branding.tokens';\nimport { BrandingData, BrandingUpdate } from '../models/branding.models';\nimport { ThemePalette } from '../models/theme.models';\n\nconst WELL_KNOWN_NAME = 'Branding';\n\ntype QueryItem = NonNullable<\n NonNullable<\n NonNullable<\n NonNullable<GetBrandingQueryDto['runtime']>['systemUIBranding']\n >['items']\n >[number]\n>;\n\ntype CreateItem = NonNullable<\n NonNullable<\n NonNullable<\n NonNullable<CreateBrandingMutationDto['runtime']>['systemUIBrandings']\n >['create']\n >[number]\n>;\n\ntype UpdateItem = NonNullable<\n NonNullable<\n NonNullable<\n NonNullable<UpdateBrandingMutationDto['runtime']>['systemUIBrandings']\n >['update']\n >[number]\n>;\n\n/** Shared structural shape across get/create/update — identical selection sets. */\ntype ServerBranding = QueryItem & CreateItem & UpdateItem;\n\ntype ServerPalette = NonNullable<QueryItem['lightTheme']>;\n\n/**\n * Per-tenant branding. Source of truth is the `SystemUIBranding`\n * CK runtime entity (one record per tenant, `rtWellKnownName = 'Branding'`).\n * Loaded via GraphQL, mirrored into a signal for consumers.\n */\n@Injectable({ providedIn: 'root' })\nexport class BrandingDataSource {\n private readonly getBrandingGQL = inject(GetBrandingDtoGQL);\n private readonly createBrandingGQL = inject(CreateBrandingDtoGQL);\n private readonly updateBrandingGQL = inject(UpdateBrandingDtoGQL);\n\n private readonly defaults = inject(OCTO_BRANDING_DEFAULTS);\n\n private readonly state = signal<BrandingData>({ ...this.defaults });\n readonly branding = this.state.asReadonly();\n\n async load(): Promise<void> {\n // `no-cache` (not `network-only`): Apollo's `InMemoryCache` normalizes\n // entities by `rtId`, but the singleton `RuntimeModelQuery` type has no\n // id — cache writes for `runtime.systemUIBranding`\n // clobber sibling fields (e.g. `runtime.basicTree` used by plant\n // hierarchy + /location). `no-cache` fetches from network AND skips\n // writing to cache, so /location keeps its hierarchy cache intact.\n const result = await firstValueFrom(\n this.getBrandingGQL.fetch({ fetchPolicy: 'no-cache' }),\n );\n const item =\n result.data?.runtime?.systemUIBranding?.items?.[0];\n if (!item) {\n this.state.set({ ...this.defaults });\n return;\n }\n this.state.set(await this.mapFromServer(item));\n }\n\n async save(update: BrandingUpdate): Promise<BrandingData> {\n const current = this.state();\n const input = await this.buildInput(update);\n const saved = current.rtId\n ? await this.runUpdate(current.rtId, input)\n : await this.runCreate(input);\n const mapped = await this.mapFromServer(saved);\n this.state.set(mapped);\n return mapped;\n }\n\n async resetToDefaults(): Promise<void> {\n await this.save({\n appName: this.defaults.appName,\n appTitle: this.defaults.appTitle,\n headerLogoFile: null,\n footerLogoFile: null,\n faviconFile: null,\n lightTheme: this.defaults.lightTheme,\n darkTheme: this.defaults.darkTheme,\n });\n }\n\n private async buildInput(\n update: BrandingUpdate,\n ): Promise<SystemUiBrandingInputDto> {\n const [headerLogo, footerLogo, favicon] = await Promise.all([\n this.prepareBinary(update.headerLogoFile),\n this.prepareBinary(update.footerLogoFile),\n this.prepareBinary(update.faviconFile),\n ]);\n\n const input: SystemUiBrandingInputDto = {\n rtWellKnownName: WELL_KNOWN_NAME,\n appName: update.appName,\n appTitle: update.appTitle,\n lightTheme: this.paletteToInput(update.lightTheme),\n darkTheme: update.darkTheme ? this.paletteToInput(update.darkTheme) : null,\n };\n\n // Tri-state: set the field only on replace (bytes) or clear (null);\n // omit when undefined so the server keeps the current blob.\n if (headerLogo !== undefined) input.headerLogo = headerLogo;\n if (footerLogo !== undefined) input.footerLogo = footerLogo;\n if (favicon !== undefined) input.favicon = favicon;\n\n return input;\n }\n\n private async runCreate(\n input: SystemUiBrandingInputDto,\n ): Promise<ServerBranding> {\n const result = await firstValueFrom(\n this.createBrandingGQL.mutate({\n variables: { branding: input },\n fetchPolicy: 'no-cache',\n }),\n );\n const item =\n result.data?.runtime?.systemUIBrandings?.create?.[0];\n if (!item) {\n throw new Error('createBranding returned no entity');\n }\n return item;\n }\n\n private async runUpdate(\n rtId: string,\n input: SystemUiBrandingInputDto,\n ): Promise<ServerBranding> {\n const result = await firstValueFrom(\n this.updateBrandingGQL.mutate({\n variables: { branding: { rtId, item: input } },\n fetchPolicy: 'no-cache',\n }),\n );\n const item =\n result.data?.runtime?.systemUIBrandings?.update?.[0];\n if (!item) {\n throw new Error('updateBranding returned no entity');\n }\n return item;\n }\n\n private paletteToInput(\n palette: ThemePalette,\n ): SystemUiThemePaletteInputDto {\n return {\n primaryColor: palette.primaryColor,\n secondaryColor: palette.secondaryColor,\n tertiaryColor: palette.tertiaryColor,\n neutralColor: palette.neutralColor,\n backgroundColor: palette.backgroundColor,\n headerGradient: {\n startColor: palette.headerGradient.startColor,\n endColor: palette.headerGradient.endColor,\n },\n footerGradient: {\n startColor: palette.footerGradient.startColor,\n endColor: palette.footerGradient.endColor,\n },\n };\n }\n\n private async mapFromServer(item: ServerBranding): Promise<BrandingData> {\n // `Binary` attribute in the ckType surfaces as GraphQL `[Byte]` (raw byte\n // array scalar). Client converts to a data URL locally for <img src>.\n // No second HTTP round-trip like the `BinaryLinked`/`LargeBinaryInfo`\n // pattern (which would return a downloadUri to fetch).\n const [headerLogoUrl, footerLogoUrl, faviconUrl] = await Promise.all([\n this.bytesToDataUrl(item.headerLogo),\n this.bytesToDataUrl(item.footerLogo),\n this.bytesToDataUrl(item.favicon),\n ]);\n\n return {\n rtId: item.rtId,\n appName: item.appName ?? this.defaults.appName,\n appTitle: item.appTitle ?? this.defaults.appTitle,\n headerLogoUrl: headerLogoUrl,\n footerLogoUrl: footerLogoUrl,\n faviconUrl: faviconUrl,\n lightTheme:\n this.paletteFromServer(item.lightTheme, this.defaults.lightTheme) ??\n this.defaults.lightTheme,\n darkTheme: this.paletteFromServer(\n item.darkTheme,\n this.defaults.darkTheme ?? this.defaults.lightTheme,\n ),\n };\n }\n\n // Defaults are passed in so light/dark palettes fall back to their own\n // defaults instead of always using lightTheme defaults (matters when only\n // partial dark palette comes from server).\n private paletteFromServer(\n palette: ServerPalette | null | undefined,\n defaults: ThemePalette,\n ): ThemePalette | null {\n if (!palette) return null;\n const { headerGradient, footerGradient } = palette;\n return {\n primaryColor: palette.primaryColor ?? defaults.primaryColor,\n secondaryColor: palette.secondaryColor ?? defaults.secondaryColor,\n tertiaryColor: palette.tertiaryColor ?? defaults.tertiaryColor,\n neutralColor: palette.neutralColor ?? defaults.neutralColor,\n backgroundColor: palette.backgroundColor ?? defaults.backgroundColor,\n headerGradient: headerGradient\n ? { startColor: headerGradient.startColor, endColor: headerGradient.endColor }\n : defaults.headerGradient,\n footerGradient: footerGradient\n ? { startColor: footerGradient.startColor, endColor: footerGradient.endColor }\n : defaults.footerGradient,\n };\n }\n\n /**\n * Convert a byte array from a GraphQL `[Byte]` field into a data URL.\n * Returns null for null/undefined/empty input. MIME type is detected from\n * the first few bytes (magic numbers) so <img src> works without a\n * server-provided content-type.\n */\n private async bytesToDataUrl(\n bytes: readonly (number | null)[] | null | undefined,\n ): Promise<string | null> {\n if (!bytes || bytes.length === 0) return null;\n // Codegen types `[Byte]` entries as `number | null`; strip nulls.\n const clean = bytes.filter((b): b is number => typeof b === 'number');\n if (clean.length === 0) return null;\n const uint8 = new Uint8Array(clean);\n const mime = this.detectImageMime(uint8) ?? 'application/octet-stream';\n try {\n return await this.blobToDataUrl(new Blob([uint8], { type: mime }));\n } catch (error) {\n console.warn('[BrandingDataSource] Failed to decode image bytes', error);\n return null;\n }\n }\n\n private detectImageMime(bytes: Uint8Array): string | null {\n if (bytes.length >= 8 && bytes[0] === 0x89 && bytes[1] === 0x50 && bytes[2] === 0x4e && bytes[3] === 0x47) return 'image/png';\n if (bytes.length >= 3 && bytes[0] === 0xff && bytes[1] === 0xd8 && bytes[2] === 0xff) return 'image/jpeg';\n if (bytes.length >= 6 && bytes[0] === 0x47 && bytes[1] === 0x49 && bytes[2] === 0x46) return 'image/gif';\n if (bytes.length >= 12 && bytes[0] === 0x52 && bytes[1] === 0x49 && bytes[2] === 0x46 && bytes[3] === 0x46 && bytes[8] === 0x57 && bytes[9] === 0x45 && bytes[10] === 0x42 && bytes[11] === 0x50) return 'image/webp';\n if (bytes.length >= 4 && bytes[0] === 0x00 && bytes[1] === 0x00 && bytes[2] === 0x01 && bytes[3] === 0x00) return 'image/vnd.microsoft.icon';\n if (bytes.length >= 5 && bytes[0] === 0x3c && bytes[1] === 0x3f && bytes[2] === 0x78 && bytes[3] === 0x6d && bytes[4] === 0x6c) return 'image/svg+xml';\n // UTF-8 BOM-less SVG starts with '<svg'\n if (bytes.length >= 4 && bytes[0] === 0x3c && bytes[1] === 0x73 && bytes[2] === 0x76 && bytes[3] === 0x67) return 'image/svg+xml';\n return null;\n }\n\n private blobToDataUrl(blob: Blob): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = (): void => {\n const result = reader.result;\n if (typeof result === 'string') {\n resolve(result);\n } else {\n reject(new Error('FileReader returned non-string result'));\n }\n };\n reader.onerror = (): void =>\n reject(reader.error ?? new Error('FileReader failed'));\n reader.readAsDataURL(blob);\n });\n }\n\n /**\n * Three-value binary resolution for save():\n * - `null` → caller wants the asset cleared; forward null to the server.\n * - `undefined` → caller left the slot untouched; omit the field so the\n * server keeps the existing blob.\n * - `File` → caller uploaded a new asset; serialize to byte array.\n */\n private async prepareBinary(\n file: File | null | undefined,\n ): Promise<number[] | null | undefined> {\n if (file === null) return null;\n if (file === undefined) return undefined;\n const buffer = await file.arrayBuffer();\n return Array.from(new Uint8Array(buffer));\n }\n}\n","import {\n effect,\n inject,\n Injectable,\n InjectionToken,\n Injector,\n} from '@angular/core';\nimport { Title } from '@angular/platform-browser';\nimport {\n ActivatedRouteSnapshot,\n RouterStateSnapshot,\n TitleStrategy,\n} from '@angular/router';\nimport { BrandingDataSource } from './branding-data-source.service';\n\n/**\n * Optional function the host supplies to translate a breadcrumb key from\n * `route.data['breadcrumb']` into a localized string. The library has no i18n\n * dependency; without a translator the breadcrumb key is rendered verbatim.\n */\nexport type OctoTitleTranslator = (key: string) => string;\n\nexport const OCTO_TITLE_TRANSLATOR = new InjectionToken<OctoTitleTranslator>(\n 'OCTO_TITLE_TRANSLATOR',\n);\n\n/**\n * `TitleStrategy` that composes `<branding.appTitle> | <route.breadcrumb>`\n * into `document.title` on every navigation, and re-applies on\n * `BrandingDataSource.branding()` changes (e.g. after Settings save).\n *\n * Wire as the application's `TitleStrategy`:\n * ```ts\n * { provide: TitleStrategy, useExisting: AppTitleService }\n * ```\n *\n * Optional translation of the breadcrumb key is supplied through\n * {@link OCTO_TITLE_TRANSLATOR}; without it the key from `route.data` is used\n * as-is.\n *\n * `BrandingDataSource` is resolved lazily via `injector.get()` rather than\n * field-injected. The router constructs `TitleStrategy` eagerly during\n * `APP_INITIALIZER`, before the host's tenant config has loaded. A direct\n * field-inject of `BrandingDataSource` here would chain into Apollo's\n * factory, which reads `tenantId` while it is still `undefined` and bakes\n * `/tenants/undefined/GraphQL` into the request URI. Lazy resolution defers\n * the chain to the first navigation, by which time config is loaded.\n */\n@Injectable({ providedIn: 'root' })\nexport class AppTitleService extends TitleStrategy {\n private readonly title = inject(Title);\n private readonly translator = inject(OCTO_TITLE_TRANSLATOR, {\n optional: true,\n });\n private readonly injector = inject(Injector);\n\n private lastRouterState?: RouterStateSnapshot;\n private brandingEffectInitialized = false;\n\n override updateTitle(routerState: RouterStateSnapshot): void {\n this.lastRouterState = routerState;\n this.applyTitle();\n this.ensureBrandingSubscription();\n }\n\n private ensureBrandingSubscription(): void {\n if (this.brandingEffectInitialized) return;\n this.brandingEffectInitialized = true;\n effect(() => this.applyTitle(), { injector: this.injector });\n }\n\n private applyTitle(): void {\n if (!this.lastRouterState) return;\n const data = this.injector.get(BrandingDataSource).branding();\n const baseTitle = data.appTitle || data.appName;\n const breadcrumbKey = this.getDeepestBreadcrumb(this.lastRouterState.root);\n if (breadcrumbKey) {\n const resolved = this.translator\n ? this.translator(breadcrumbKey)\n : breadcrumbKey;\n this.title.setTitle(`${baseTitle} | ${resolved}`);\n } else {\n this.title.setTitle(baseTitle);\n }\n }\n\n private getDeepestBreadcrumb(\n route: ActivatedRouteSnapshot,\n ): string | undefined {\n let breadcrumb: string | undefined =\n typeof route.data['breadcrumb'] === 'string'\n ? route.data['breadcrumb']\n : undefined;\n for (const child of route.children) {\n const childBreadcrumb = this.getDeepestBreadcrumb(child);\n if (childBreadcrumb) {\n breadcrumb = childBreadcrumb;\n }\n }\n return breadcrumb;\n }\n}\n","import {\n EnvironmentProviders,\n makeEnvironmentProviders,\n Provider,\n} from '@angular/core';\nimport { TitleStrategy } from '@angular/router';\nimport { BrandingData } from './models/branding.models';\nimport {\n NEUTRAL_BRANDING_DEFAULTS,\n NEUTRAL_FALLBACK_ASSETS,\n OCTO_BRANDING_DEFAULTS,\n OCTO_BRANDING_FALLBACK_ASSETS,\n OctoBrandingFallbackAssets,\n} from './branding.tokens';\nimport { AppTitleService } from './services/app-title.service';\n\nexport interface OctoBrandingConfig {\n /** Caller-supplied defaults; merged shallowly over `NEUTRAL_BRANDING_DEFAULTS`. */\n defaults?: Partial<BrandingData>;\n /** Bundled URLs used when the tenant has not uploaded a logo / favicon. */\n fallbackAssets?: OctoBrandingFallbackAssets;\n /**\n * When `true` (default) the library binds {@link AppTitleService} as the\n * application's `TitleStrategy`, so `document.title` automatically reflects\n * `<branding.appTitle> | <route.breadcrumb>` on every navigation. Set to\n * `false` if the host already provides its own `TitleStrategy`.\n */\n registerTitleStrategy?: boolean;\n}\n\n/**\n * Registers branding tokens, defaults, fallback assets, and (by default) the\n * `TitleStrategy` that drives `document.title` from the branding signal.\n *\n * Does **not** load the tenant's branding record. Loading must happen after\n * authentication is settled (Apollo's URI bakes in the tenant ID at the time\n * the first request fires; loading too early targets\n * `/tenants/undefined/GraphQL`). The host shell typically does:\n *\n * ```ts\n * inject(BrandingApplicationService); // start the apply effect\n * effect(() => {\n * if (this.auth.isAuthenticated()) {\n * this.brandingDataSource.load();\n * }\n * });\n * ```\n *\n * `BrandingApplicationService` is `providedIn: 'root'`, so the host only has\n * to inject it once to activate the apply effect.\n */\nexport function provideOctoBranding(\n config?: OctoBrandingConfig,\n): EnvironmentProviders {\n const merged: BrandingData = {\n ...NEUTRAL_BRANDING_DEFAULTS,\n ...(config?.defaults ?? {}),\n lightTheme: {\n ...NEUTRAL_BRANDING_DEFAULTS.lightTheme,\n ...(config?.defaults?.lightTheme ?? {}),\n },\n darkTheme:\n config?.defaults?.darkTheme === null\n ? null\n : {\n ...(NEUTRAL_BRANDING_DEFAULTS.darkTheme ??\n NEUTRAL_BRANDING_DEFAULTS.lightTheme),\n ...(config?.defaults?.darkTheme ?? {}),\n },\n };\n\n const providers: Provider[] = [\n { provide: OCTO_BRANDING_DEFAULTS, useValue: merged },\n {\n provide: OCTO_BRANDING_FALLBACK_ASSETS,\n useValue: config?.fallbackAssets ?? NEUTRAL_FALLBACK_ASSETS,\n },\n ];\n\n if (config?.registerTitleStrategy !== false) {\n providers.push({ provide: TitleStrategy, useExisting: AppTitleService });\n }\n\n return makeEnvironmentProviders(providers);\n}\n","/** Convenience barrel re-exporting branding model interfaces from ./models/. */\nexport * from './models/theme.models';\nexport * from './models/branding.models';\nexport * from './models/brand-display';\n","import {\n DOCUMENT,\n inject,\n Injectable,\n Renderer2,\n RendererFactory2,\n signal,\n} from '@angular/core';\n\n/**\n * Light/dark mode toggle backed by `localStorage` + `<html data-theme=\"...\">`.\n * Pure mode toggle; palette generation lives in `BrandingApplicationService`.\n */\n@Injectable({ providedIn: 'root' })\nexport class ThemeService {\n private readonly document = inject(DOCUMENT);\n private readonly renderer: Renderer2;\n private readonly isDarkSignal = signal(false);\n\n readonly isDark = this.isDarkSignal.asReadonly();\n\n constructor() {\n this.renderer = inject(RendererFactory2).createRenderer(null, null);\n this.isDarkSignal.set(this.getInitialThemeIsDark());\n this.applyTheme();\n }\n\n toggleTheme(): void {\n this.setDark(!this.isDarkSignal());\n }\n\n setDark(isDark: boolean): void {\n this.isDarkSignal.set(isDark);\n try {\n this.document.defaultView?.localStorage.setItem(\n 'theme',\n isDark ? 'dark' : 'light',\n );\n } catch {\n // localStorage may be unavailable (private mode, SSR) — degrade silently.\n }\n this.applyTheme();\n }\n\n private applyTheme(): void {\n const html = this.document.documentElement;\n this.renderer.setAttribute(\n html,\n 'data-theme',\n this.isDarkSignal() ? 'dark' : 'light',\n );\n }\n\n private getInitialThemeIsDark(): boolean {\n let stored: string | null = null;\n try {\n stored = this.document.defaultView?.localStorage.getItem('theme') ?? null;\n } catch {\n stored = null;\n }\n if (stored === 'dark') return true;\n if (stored === 'light') return false;\n return (\n this.document.defaultView?.matchMedia?.('(prefers-color-scheme: dark)')\n .matches ?? false\n );\n }\n}\n","export interface ThemeSwitcherMessages {\n toggleToDark: string;\n toggleToLight: string;\n /** Aria label when the tenant disabled dark mode (switcher is locked). */\n unavailable: string;\n}\n\nexport const DEFAULT_THEME_SWITCHER_MESSAGES: ThemeSwitcherMessages = {\n toggleToDark: 'Switch to dark mode',\n toggleToLight: 'Switch to light mode',\n unavailable: 'Theme switching is unavailable for this tenant',\n};\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n input,\n} from '@angular/core';\nimport { SVGIconModule } from '@progress/kendo-angular-icons';\nimport {\n brightnessContrastIcon,\n lightbulbOutlineIcon,\n} from '@progress/kendo-svg-icons';\nimport { BrandingDataSource } from '../../services/branding-data-source.service';\nimport { ThemeService } from '../../services/theme.service';\nimport {\n DEFAULT_THEME_SWITCHER_MESSAGES,\n ThemeSwitcherMessages,\n} from './theme-switcher.messages';\n\n@Component({\n selector: 'mm-theme-switcher',\n standalone: true,\n imports: [SVGIconModule],\n templateUrl: './theme-switcher.component.html',\n styleUrl: './theme-switcher.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ThemeSwitcherComponent {\n readonly messages = input<ThemeSwitcherMessages>(\n DEFAULT_THEME_SWITCHER_MESSAGES,\n );\n\n private readonly themeService = inject(ThemeService);\n private readonly branding = inject(BrandingDataSource);\n\n protected readonly isDark = this.themeService.isDark;\n protected readonly available = computed(\n () => this.branding.branding().darkTheme !== null,\n );\n protected readonly ariaLabel = computed(() => {\n if (!this.available()) return this.messages().unavailable;\n return this.isDark()\n ? this.messages().toggleToLight\n : this.messages().toggleToDark;\n });\n\n protected readonly lightIcon = lightbulbOutlineIcon;\n protected readonly darkIcon = brightnessContrastIcon;\n\n protected onToggle(): void {\n if (!this.available()) return;\n this.themeService.setDark(!this.isDark());\n }\n}\n","<button\n type=\"button\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-pressed]=\"isDark()\"\n [disabled]=\"!available()\"\n (click)=\"onToggle()\"\n>\n <kendo-svg-icon [icon]=\"isDark() ? lightIcon : darkIcon\" />\n</button>\n","import { DOCUMENT, effect, inject, Injectable } from '@angular/core';\nimport {\n OCTO_BRANDING_FALLBACK_ASSETS,\n OctoBrandingFallbackAssets,\n} from '../branding.tokens';\nimport { BrandingData } from '../models/branding.models';\nimport { ThemePalette } from '../models/theme.models';\nimport { BrandingDataSource } from './branding-data-source.service';\nimport { ThemeService } from './theme.service';\n\ntype ColorPaletteShades = Record<number, string>;\n\n/**\n * Writes tenant branding (Kendo color vars, gradients, favicon, document\n * title) inline on <html>. An effect re-applies the correct palette when\n * either the theme mode or the branding data changes, so mode toggles after\n * a save don't leave stale inline values behind.\n */\n@Injectable({ providedIn: 'root' })\nexport class BrandingApplicationService {\n private document = inject(DOCUMENT);\n private themeService = inject(ThemeService);\n private brandingDataSource = inject(BrandingDataSource);\n private fallbackAssets = inject(OCTO_BRANDING_FALLBACK_ASSETS, {\n optional: true,\n }) as OctoBrandingFallbackAssets | null;\n\n // Cleared before every apply so unset palette fields fall through to the\n // static layer-2 brand-default instead of sticking from a prior save.\n private static readonly BRANDED_VARS: readonly string[] = [\n ...['primary', 'secondary', 'tertiary'].flatMap((c) => [\n `--kendo-color-${c}`,\n `--kendo-color-${c}-hover`,\n `--kendo-color-${c}-active`,\n `--kendo-color-on-${c}`,\n `--kendo-color-${c}-subtle`,\n `--kendo-color-${c}-subtle-hover`,\n `--kendo-color-${c}-subtle-active`,\n `--kendo-color-${c}-emphasis`,\n `--kendo-color-${c}-on-subtle`,\n `--kendo-color-${c}-on-surface`,\n ]),\n '--kendo-color-base',\n '--kendo-color-base-hover',\n '--kendo-color-base-active',\n '--kendo-color-on-base',\n '--kendo-color-base-subtle',\n '--kendo-color-base-subtle-hover',\n '--kendo-color-base-subtle-active',\n '--kendo-color-base-emphasis',\n '--kendo-color-base-on-subtle',\n '--kendo-color-subtle',\n '--kendo-color-border',\n '--kendo-color-border-alt',\n '--kendo-color-app-surface',\n '--kendo-color-on-app-surface',\n '--app-header-gradient-start',\n '--app-header-gradient-end',\n '--app-header-text',\n '--app-footer-gradient-start',\n '--app-footer-gradient-end',\n '--app-footer-text',\n ];\n\n constructor() {\n effect(() => {\n const isDark = this.themeService.isDark();\n const data = this.brandingDataSource.branding();\n\n // Tenant disabled dark-theme override (single-theme app) — force light\n // mode. Without this guard a stale 'dark' in localStorage (or system\n // prefers-color-scheme) carries over and we'd render light palette\n // values into html[data-theme='dark']: surface ladder collapses to\n // white and text becomes unreadable. ThemeSwitcherComponent also\n // disables the toggle when darkTheme is null so the user can't\n // re-enter this state interactively.\n if (data.darkTheme === null && isDark) {\n this.themeService.setDark(false);\n return;\n }\n\n const palette = isDark ? data.darkTheme! : data.lightTheme;\n this.apply(data, palette);\n });\n }\n\n apply(data: BrandingData, palette: ThemePalette): void {\n this.clearInlineBrandingVars();\n this.applyThemeColors(palette);\n this.applyFavicon(data.faviconUrl);\n // document.title is owned by AppTitleService (TitleStrategy) — it composes\n // `${branding().appName} | ${routeBreadcrumb}` per navigation. Setting\n // title here would race AppTitleService and overwrite the route portion\n // (e.g. /settings would flicker from \"TecLink | Settings\" to just \"TecLink\"\n // when branding finishes loading). The tab updates on next navigation\n // after a tenant edits appName/appTitle in Settings — acceptable trade-off.\n }\n\n applyThemeColors(palette: ThemePalette): void {\n const root = this.document.documentElement;\n\n if (palette.primaryColor) {\n this.applyColorPalette(root, 'primary', palette.primaryColor);\n }\n if (palette.secondaryColor) {\n this.applyColorPalette(root, 'secondary', palette.secondaryColor);\n }\n if (palette.tertiaryColor) {\n this.applyColorPalette(root, 'tertiary', palette.tertiaryColor);\n }\n if (palette.neutralColor) {\n this.applyNeutralColors(root, palette.neutralColor);\n }\n\n this.setIf(root, '--app-header-gradient-start', palette.headerGradient.startColor);\n this.setIf(root, '--app-header-gradient-end', palette.headerGradient.endColor);\n if (palette.headerGradient.startColor) {\n root.style.setProperty(\n '--app-header-text',\n this.getContrastColor(palette.headerGradient.startColor),\n );\n }\n this.setIf(root, '--app-footer-gradient-start', palette.footerGradient.startColor);\n this.setIf(root, '--app-footer-gradient-end', palette.footerGradient.endColor);\n if (palette.footerGradient.startColor) {\n root.style.setProperty(\n '--app-footer-text',\n this.getContrastColor(palette.footerGradient.startColor),\n );\n }\n\n if (palette.backgroundColor) {\n // Only write the root surface — --kendo-color-surface / -surface-alt /\n // -base / -border are aliased in styles.scss to --color-surface-* shades\n // that derive from --color-surface (= app-surface) via mode-aware\n // color-mix. Writing them directly here would collapse the shade ladder\n // (all surfaces flat = same colour → transparent-looking components).\n root.style.setProperty('--kendo-color-app-surface', palette.backgroundColor);\n // Contrast text on the surface — without this, a dark backgroundColor in\n // light mode (or vice versa) renders text against an inverted surface\n // and becomes unreadable. --color-on-surface in styles.scss aliases this.\n root.style.setProperty(\n '--kendo-color-on-app-surface',\n this.getContrastColor(palette.backgroundColor),\n );\n }\n }\n\n applyFavicon(faviconUrl: string | null): void {\n const href = faviconUrl ?? this.fallbackAssets?.favicon;\n if (!href) return;\n\n let link = this.document.querySelector<HTMLLinkElement>(\n \"link[rel~='icon']\",\n );\n if (!link) {\n link = this.document.createElement('link');\n link.rel = 'icon';\n this.document.head.appendChild(link);\n }\n link.href = href;\n }\n\n private clearInlineBrandingVars(): void {\n const root = this.document.documentElement;\n for (const name of BrandingApplicationService.BRANDED_VARS) {\n root.style.removeProperty(name);\n }\n }\n\n private setIf(\n root: HTMLElement,\n name: string,\n value: string | null | undefined,\n ): void {\n if (value) root.style.setProperty(name, value);\n }\n\n private applyColorPalette(\n root: HTMLElement,\n colorName: string,\n baseColor: string,\n ): void {\n const palette = this.generatePalette(baseColor);\n\n root.style.setProperty(`--kendo-color-${colorName}`, palette[40]);\n root.style.setProperty(`--kendo-color-${colorName}-hover`, palette[50]);\n root.style.setProperty(`--kendo-color-${colorName}-active`, palette[60]);\n root.style.setProperty(\n `--kendo-color-on-${colorName}`,\n this.getContrastColor(palette[40]),\n );\n root.style.setProperty(`--kendo-color-${colorName}-subtle`, palette[90]);\n root.style.setProperty(\n `--kendo-color-${colorName}-subtle-hover`,\n palette[80],\n );\n root.style.setProperty(\n `--kendo-color-${colorName}-subtle-active`,\n palette[70],\n );\n root.style.setProperty(`--kendo-color-${colorName}-emphasis`, palette[70]);\n root.style.setProperty(\n `--kendo-color-${colorName}-on-subtle`,\n palette[20],\n );\n root.style.setProperty(\n `--kendo-color-${colorName}-on-surface`,\n palette[40],\n );\n }\n\n private applyNeutralColors(root: HTMLElement, baseColor: string): void {\n const palette = this.generatePalette(baseColor);\n\n root.style.setProperty('--kendo-color-base', palette[95]);\n root.style.setProperty('--kendo-color-base-hover', palette[90]);\n root.style.setProperty('--kendo-color-base-active', palette[80]);\n root.style.setProperty('--kendo-color-on-base', palette[20]);\n root.style.setProperty('--kendo-color-base-subtle', palette[90]);\n root.style.setProperty('--kendo-color-base-subtle-hover', palette[80]);\n root.style.setProperty('--kendo-color-base-subtle-active', palette[70]);\n root.style.setProperty('--kendo-color-base-emphasis', palette[70]);\n root.style.setProperty('--kendo-color-base-on-subtle', palette[20]);\n root.style.setProperty('--kendo-color-subtle', palette[40]);\n root.style.setProperty('--kendo-color-border', palette[80]);\n root.style.setProperty('--kendo-color-border-alt', palette[70]);\n }\n\n // ---------------------------------------------------------------------------\n // Palette generation (ported from energy-community theme.service.ts)\n // ---------------------------------------------------------------------------\n generatePalette(baseColor: string): ColorPaletteShades {\n const rgb = this.hexToRgb(baseColor);\n const hsl = this.rgbToHsl(rgb.r, rgb.g, rgb.b);\n\n const palette: ColorPaletteShades = {\n 0: '#000000',\n 100: '#ffffff',\n };\n\n palette[40] = baseColor;\n\n const baseL = hsl.l;\n const baseS = hsl.s;\n const baseH = hsl.h;\n\n const lighten = (amount: number): number => Math.min(1, baseL + amount);\n const darken = (amount: number): number => Math.max(0, baseL - amount);\n\n palette[50] = this.hslToHex(baseH, Math.min(1, baseS * 1.15), darken(0.12));\n palette[60] = this.hslToHex(baseH, Math.min(1, baseS * 1.08), darken(0.08));\n palette[70] = this.hslToHex(baseH, Math.max(0.25, baseS * 0.85), lighten(0.08));\n palette[80] = this.hslToHex(baseH, Math.max(0.15, baseS * 0.6), lighten(0.22));\n palette[90] = this.hslToHex(baseH, Math.max(0.08, baseS * 0.35), lighten(0.38));\n palette[95] = this.hslToHex(baseH, Math.max(0.04, baseS * 0.2), lighten(0.43));\n palette[98] = this.hslToHex(baseH, Math.max(0.02, baseS * 0.12), lighten(0.46));\n palette[99] = this.hslToHex(baseH, Math.max(0.01, baseS * 0.08), lighten(0.47));\n\n palette[10] = this.hslToHex(baseH, Math.min(1, baseS * 1.4), darken(0.72));\n palette[20] = this.hslToHex(baseH, Math.min(1, baseS * 1.25), darken(0.62));\n palette[25] = this.hslToHex(baseH, Math.min(1, baseS * 1.2), darken(0.57));\n palette[30] = this.hslToHex(baseH, Math.min(1, baseS * 1.15), darken(0.52));\n palette[35] = this.hslToHex(baseH, Math.min(1, baseS * 1.1), darken(0.42));\n\n return palette;\n }\n\n private hexToRgb(color: string): { r: number; g: number; b: number } {\n const hexResult = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(color);\n if (hexResult) {\n return {\n r: parseInt(hexResult[1], 16),\n g: parseInt(hexResult[2], 16),\n b: parseInt(hexResult[3], 16),\n };\n }\n const rgbResult = /rgba?\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)/.exec(color);\n if (rgbResult) {\n return {\n r: parseInt(rgbResult[1], 10),\n g: parseInt(rgbResult[2], 10),\n b: parseInt(rgbResult[3], 10),\n };\n }\n return { r: 0, g: 0, b: 0 };\n }\n\n private rgbToHsl(\n r: number,\n g: number,\n b: number,\n ): { h: number; s: number; l: number } {\n const rn = r / 255;\n const gn = g / 255;\n const bn = b / 255;\n\n const max = Math.max(rn, gn, bn);\n const min = Math.min(rn, gn, bn);\n let h = 0;\n let s = 0;\n const l = (max + min) / 2;\n\n if (max !== min) {\n const d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n\n switch (max) {\n case rn:\n h = ((gn - bn) / d + (gn < bn ? 6 : 0)) / 6;\n break;\n case gn:\n h = ((bn - rn) / d + 2) / 6;\n break;\n case bn:\n h = ((rn - gn) / d + 4) / 6;\n break;\n }\n }\n\n return { h, s, l };\n }\n\n private hslToHex(h: number, s: number, l: number): string {\n let r: number;\n let g: number;\n let b: number;\n\n if (s === 0) {\n r = l;\n g = l;\n b = l;\n } else {\n const hue2rgb = (p: number, q: number, t: number): number => {\n let tn = t;\n if (tn < 0) tn += 1;\n if (tn > 1) tn -= 1;\n if (tn < 1 / 6) return p + (q - p) * 6 * tn;\n if (tn < 1 / 2) return q;\n if (tn < 2 / 3) return p + (q - p) * (2 / 3 - tn) * 6;\n return p;\n };\n\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n r = hue2rgb(p, q, h + 1 / 3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1 / 3);\n }\n\n return this.rgbToHex(\n Math.round(r * 255),\n Math.round(g * 255),\n Math.round(b * 255),\n );\n }\n\n private rgbToHex(r: number, g: number, b: number): string {\n return (\n '#' +\n [r, g, b]\n .map((x) => {\n const hex = Math.round(x).toString(16);\n return hex.length === 1 ? '0' + hex : hex;\n })\n .join('')\n );\n }\n\n private getContrastColor(hex: string): string {\n const rgb = this.hexToRgb(hex);\n const brightness = (rgb.r * 299 + rgb.g * 587 + rgb.b * 114) / 1000;\n return brightness > 128 ? '#000000' : '#ffffff';\n }\n}\n","import { Provider, signal, WritableSignal } from '@angular/core';\nimport { NEUTRAL_BRANDING_DEFAULTS } from '../branding.tokens';\nimport { BrandingData, BrandingUpdate } from '../models/branding.models';\nimport { BrandingDataSource } from '../services/branding-data-source.service';\n\n/**\n * Framework-agnostic stub matching the runtime shape of `BrandingDataSource`.\n * The async methods are plain functions; consumers wrap them in their own\n * spy primitive (`jasmine.createSpy`, `jest.fn`, `vi.fn`) when they need\n * call assertions. Casting `branding` back to `WritableSignal` lets specs\n * drive state changes.\n */\nexport interface BrandingDataSourceStub {\n branding: WritableSignal<BrandingData>;\n load: () => Promise<void>;\n save: (u: BrandingUpdate) => Promise<BrandingData>;\n resetToDefaults: () => Promise<void>;\n}\n\nexport function createBrandingStub(\n overrides?: Partial<BrandingData>,\n): BrandingDataSourceStub {\n const branding = signal<BrandingData>({\n ...NEUTRAL_BRANDING_DEFAULTS,\n ...(overrides ?? {}),\n });\n return {\n branding,\n load: () => Promise.resolve(),\n save: () => Promise.resolve(branding()),\n resetToDefaults: () => Promise.resolve(),\n };\n}\n\n/** Convenience: returns a Provider that injects the stub as BrandingDataSource. */\nexport function provideBrandingTesting(\n stub: BrandingDataSourceStub = createBrandingStub(),\n): Provider {\n return { provide: BrandingDataSource, useValue: stub };\n}\n","// Public API of the branding feature folder. Re-exported by\n// octo-ui/src/public-api.ts to expose under @meshmakers/octo-ui.\n//\n// Note: the heavy admin-only `SettingsPageComponent` (a.k.a.\n// `mm-branding-settings`) and `BRANDING_ROUTES` live in the dedicated\n// secondary entry point `@meshmakers/octo-ui/branding-settings` so apps that\n// only need the lightweight branding pieces (logo, theme switcher, services)\n// don't pull in form/Kendo modules they don't use.\n\n// Configuration & tokens\nexport * from './branding.config';\nexport * from './branding.tokens';\n\n// Models (via barrel)\nexport * from './branding.model';\n\n// Components\n//\n// Note: there is no `<mm-brand-logo>` component. Hosts render the logo inline\n// with `<img [src]=\"branding.branding().headerLogoUrl ?? '/your-fallback.svg'\">`\n// after injecting `BrandingDataSource`. See `BRANDING_USAGE.md` for the\n// recommended snippet.\nexport * from './components/mm-theme-switcher/theme-switcher.component';\nexport * from './components/mm-theme-switcher/theme-switcher.messages';\n\n// Services\nexport * from './services/branding-data-source.service';\nexport * from './services/theme.service';\nexport * from './services/branding-application.service';\nexport * from './services/app-title.service';\n\n// Test utilities\nexport * from './testing/branding-stub';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["Apollo","i1"],"mappings":"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"}