@meshmakers/octo-ui 3.3.920 → 3.3.930

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.
@@ -0,0 +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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"}