{"version":3,"file":"c8y-ngx-components-branding-shared-lazy.mjs","sources":["../../branding/shared/lazy/apply-branding-to-app-modal/apply-branding-to-app.service.ts","../../branding/shared/lazy/apply-branding-to-app-modal/apply-branding-to-app-modal.component.ts","../../branding/shared/lazy/apply-branding-to-app-modal/apply-branding-to-app-modal.component.html","../../branding/shared/lazy/branding-tags-cell-renderer/branding-tags-cell-renderer.component.ts","../../branding/shared/lazy/branding-tags-cell-renderer/branding-tags-cell-renderer.component.html","../../branding/shared/lazy/branding-import-modal/branding-import-modal.component.ts","../../branding/shared/lazy/branding-import-modal/branding-import-modal.component.html","../../branding/shared/lazy/branding-import-modal/branding-import-modal.service.ts","../../branding/shared/lazy/branding-name-cell-renderer/branding-name-cell-renderer.component.ts","../../branding/shared/lazy/branding-name-cell-renderer/branding-name-cell-renderer.component.html","../../branding/shared/lazy/branding-tags-header-cell-renderer/branding-tags-header-cell-renderer.component.ts","../../branding/shared/lazy/branding-tags-header-cell-renderer/branding-tags-header-cell-renderer.component.html","../../branding/shared/lazy/branding/branding.component.ts","../../branding/shared/lazy/branding/branding.component.html","../../branding/shared/lazy/branding-form/branding-form.component.ts","../../branding/shared/lazy/branding-form/branding-form.component.html","../../branding/shared/lazy/branding-theme-form/branding-theme-form-structure.ts","../../branding/shared/lazy/branding-theme-form/branding-theme-form.component.ts","../../branding/shared/lazy/branding-theme-form/branding-theme-form.component.html","../../branding/shared/lazy/edit-branding-router-outlet/edit-branding-router-outlet.component.ts","../../branding/shared/lazy/edit-branding-router-outlet/edit-branding-router-outlet.component.html","../../branding/shared/lazy/branding-assets/branding-assets.component.ts","../../branding/shared/lazy/branding-assets/branding-assets.component.html","../../branding/shared/lazy/c8y-ngx-components-branding-shared-lazy.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { ApplicationService, ApplicationType, IApplication } from '@c8y/client';\n\n@Injectable({ providedIn: 'root' })\nexport class ApplyBrandingToAppService {\n  constructor(private apps: ApplicationService) {}\n\n  async getBrandableApps(): Promise<IApplication[]> {\n    const { data: apps } = await this.apps.list({\n      pageSize: 2000,\n      dropOverwrittenApps: true,\n      type: ApplicationType.HOSTED\n    });\n    const appsWithDynamicOptionsUrl = this.getHostedAppsWhereDynamicOptionsUrlIsUndefined(apps);\n    return appsWithDynamicOptionsUrl;\n  }\n\n  getHostedAppsWhereDynamicOptionsUrlIsUndefined(apps: IApplication[]) {\n    return apps.filter(app => {\n      const manifest = app.manifest;\n      if (!manifest) {\n        return false;\n      }\n      // filter out none web sdk based apps\n      if (!manifest.webSdkVersion) {\n        return false;\n      }\n      // filter out packages\n      if (manifest.isPackage) {\n        return false;\n      }\n      const dynamicOptionsUrl = manifest.dynamicOptionsUrl;\n\n      return dynamicOptionsUrl === undefined || dynamicOptionsUrl === true;\n    });\n  }\n}\n","import { Component, Input, OnInit } from '@angular/core';\nimport { ApplyBrandingToAppService } from './apply-branding-to-app.service';\nimport { FormBuilder, FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { AsyncPipe, NgForOf, NgIf } from '@angular/common';\nimport {\n  AppIconComponent,\n  C8yTranslateDirective,\n  C8yTranslatePipe,\n  HumanizeAppNamePipe,\n  ListItemBodyComponent,\n  ListItemCheckboxComponent,\n  ListItemComponent,\n  ListItemIconComponent,\n  ModalComponent\n} from '@c8y/ngx-components';\nimport { Observable, merge, of } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { uniqBy } from 'lodash-es';\n\n@Component({\n  selector: 'c8y-apply-branding-to-app-modal',\n  templateUrl: './apply-branding-to-app-modal.component.html',\n  standalone: true,\n  imports: [\n    NgIf,\n    AsyncPipe,\n    ReactiveFormsModule,\n    ModalComponent,\n    C8yTranslatePipe,\n    C8yTranslateDirective,\n    ListItemComponent,\n    ListItemIconComponent,\n    ListItemCheckboxComponent,\n    AppIconComponent,\n    ListItemBodyComponent,\n    HumanizeAppNamePipe,\n    NgForOf\n  ]\n})\nexport class ApplyBrandingToAppModalComponent implements OnInit {\n  @Input() currentTags: string[];\n  brandableApps: Awaited<ReturnType<ApplyBrandingToAppService['getBrandableApps']>> = [];\n  form: ReturnType<ApplyBrandingToAppModalComponent['initForm']>;\n  numberOfSelectedApps$: Observable<number>;\n\n  result = new Promise<ReturnType<typeof this.initForm>['value']>((resolve, reject) => {\n    this._resovle = resolve;\n    this._reject = reject;\n  });\n\n  private _resovle: (value: ReturnType<typeof this.initForm>['value']) => void;\n  private _reject: (reason?: any) => void;\n  constructor(\n    private apply: ApplyBrandingToAppService,\n    private formBuilder: FormBuilder\n  ) {}\n\n  async ngOnInit() {\n    const brandableApps = await this.apply.getBrandableApps();\n    this.brandableApps = uniqBy(brandableApps, 'contextPath');\n    const tags = this.brandableApps.map(app => app.contextPath);\n    this.form = this.initForm(tags);\n    if (this.currentTags.length) {\n      this.form.patchValue(\n        this.currentTags.reduce((prev, curr) => Object.assign(prev, { [curr]: true }), {})\n      );\n    }\n    this.numberOfSelectedApps$ = merge(this.form.valueChanges, of(this.form.value)).pipe(\n      map(value => Object.values(value).filter(Boolean).length)\n    );\n  }\n\n  save() {\n    this._resovle(this.form.value);\n  }\n\n  cancel() {\n    this._reject();\n  }\n\n  private initForm(tags: string[]) {\n    const tagsFormMap: Record<string, FormControl<boolean>> = tags.reduceRight(\n      (prev, curr) => Object.assign(prev, { [curr]: this.formBuilder.control(false) }),\n      {}\n    );\n    return this.formBuilder.group(tagsFormMap);\n  }\n}\n","<c8y-modal\n  [title]=\"'Apply branding to apps' | translate\"\n  [disabled]=\"!form || form.invalid || !brandableApps.length\"\n  [headerClasses]=\"'dialog-header'\"\n  (onDismiss)=\"cancel()\"\n  (onClose)=\"save()\"\n  [labels]=\"{ cancel: 'Cancel', ok: 'Save' }\"\n>\n  <ng-container c8y-modal-title>\n    <span c8yIcon=\"palette\"></span>\n  </ng-container>\n  <c8y-list-group\n    class=\"m-b-0 no-border-last\"\n    *ngIf=\"form\"\n    [formGroup]=\"form\"\n  >\n    <c8y-li>\n      <p\n        class=\"text-center text-medium\"\n        *ngIf=\"numberOfSelectedApps$ | async as numberOfApps; else noapps\"\n        translate\n      >\n        {{ numberOfApps }} apps selected for branding\n      </p>\n      <ng-template #noapps>\n        <p\n          class=\"text-center text-medium\"\n          translate\n        >\n          No apps selected for branding\n        </p>\n      </ng-template>\n    </c8y-li>\n    <c8y-li *ngFor=\"let app of brandableApps\">\n      <c8y-li-icon>\n        <c8y-app-icon\n          class=\"icon-40\"\n          [app]=\"app\"\n        ></c8y-app-icon>\n      </c8y-li-icon>\n      <c8y-li-checkbox\n        [attr.data-cy]=\"'branding-apply-branding-to-app-checkbox-' + app.contextPath\"\n        [formControlName]=\"app.contextPath\"\n      ></c8y-li-checkbox>\n      <c8y-li-body class=\"p-t-8 d-block\">{{ app | humanizeAppName | async }}</c8y-li-body>\n    </c8y-li>\n  </c8y-list-group>\n</c8y-modal>\n","import { AsyncPipe, NgForOf, NgIf } from '@angular/common';\nimport { Component } from '@angular/core';\nimport { IApplication } from '@c8y/client';\nimport { AppStateService, CellRendererContext, HumanizeAppNamePipe } from '@c8y/ngx-components';\nimport { Observable, of } from 'rxjs';\nimport { map, startWith } from 'rxjs/operators';\n\n@Component({\n  selector: 'c8y-branding-tags-cell-renderer',\n  templateUrl: './branding-tags-cell-renderer.component.html',\n  standalone: true,\n  imports: [NgIf, NgForOf, HumanizeAppNamePipe, AsyncPipe]\n})\nexport class BrandingTagsCellRendererComponent {\n  hasLatestTag: boolean;\n  appContextPathsOrApps$: Observable<Array<string | IApplication>>;\n  constructor(\n    context: CellRendererContext,\n    private appState: AppStateService\n  ) {\n    const tags: string[] = context.value || [];\n    this.hasLatestTag = tags.some(tag => tag === 'latest');\n    const appSpecificTags = tags\n      .filter(tag => tag.startsWith('app-'))\n      .map(tag => tag.replace('app-', ''));\n\n    this.appContextPathsOrApps$ = this.getAppContextPathsOrApps$(appSpecificTags);\n  }\n\n  private getAppContextPathsOrApps$(\n    appContextPaths: string[]\n  ): Observable<Array<string | IApplication>> {\n    if (!appContextPaths.length) {\n      return of([]);\n    }\n    return this.appState.currentAppsOfUser.pipe(\n      map(apps => {\n        return appContextPaths.map(tag => {\n          const app = apps.find(app => app.contextPath === tag);\n          return app || tag;\n        });\n      }),\n      startWith(appContextPaths)\n    );\n  }\n}\n","<div class=\"d-flex a-i-center gap-4 flex-wrap\">\n  <div\n    class=\"tag tag--success\"\n    *ngIf=\"hasLatestTag\"\n    translate\n  >\n    Global\n  </div>\n  <div\n    class=\"tag tag--info\"\n    *ngFor=\"let tag of appContextPathsOrApps$ | async\"\n    [attr.data-cy]=\"'branding-tags-cell-renderer--tag-' + (tag.contextPath ? tag.contextPath : tag)\"\n  >\n    {{ tag | humanizeAppName | async }}\n  </div>\n</div>\n","import { Component, ViewChild } from '@angular/core';\nimport { CoreModule, DroppedFile, ModalComponent, ZipService } from '@c8y/ngx-components';\nimport { AddBrandingModalService } from '@c8y/ngx-components/branding/shared/lazy/add-branding-modal';\nimport { firstValueFrom } from 'rxjs';\nimport { StaticAsset, StaticAssetsService } from '@c8y/ngx-components/static-assets/data';\nimport { StoreBrandingService } from '@c8y/ngx-components/branding/shared/data';\n\n@Component({\n  selector: 'c8y-branding-import-modal',\n  templateUrl: './branding-import-modal.component.html',\n  standalone: true,\n  imports: [CoreModule]\n})\nexport class BrandingImportModalComponent {\n  @ViewChild(ModalComponent, { static: true }) modal: ModalComponent;\n\n  result = new Promise<void>((resolve, reject) => {\n    this._resovle = resolve;\n    this._reject = reject;\n  });\n  files: DroppedFile[] = [];\n  loading = false;\n\n  private _resovle: () => void;\n  private _reject: (reason?: any) => void;\n\n  constructor(\n    private addBrandingModalService: AddBrandingModalService,\n    private zip: ZipService,\n    private staticAssets: StaticAssetsService,\n    private brandings: StoreBrandingService\n  ) {}\n\n  async droppedFile(event: DroppedFile[]) {\n    this.loading = true;\n    try {\n      this.files = event;\n      await this.import(event[0].file);\n    } catch (e) {\n      console.error(e);\n      this.files = [];\n      this.loading = false;\n      return;\n    }\n    this.modal._close();\n    this._resovle();\n  }\n\n  async import(file: File) {\n    const versionDetails = await this.addBrandingModalService.openAddBrandingModal();\n    if (!versionDetails) {\n      throw Error('No version details provided');\n    }\n\n    // verify if branding is already present\n    const { variants } = await this.brandings.loadBrandingVariants();\n    if (!variants?.length) {\n      await this.brandings.getStartedUsingBranding();\n    }\n\n    const importedZipEntries = await firstValueFrom(this.zip.getEntries(file));\n    const staticAssetsEntry = importedZipEntries.find(\n      entry => entry.filename === this.staticAssets.fileNames.exportZipName\n    );\n    if (!staticAssetsEntry) {\n      throw Error(\n        `Missing \"${this.staticAssets.fileNames.exportZipName}\" file in the uploaded zip.`\n      );\n    }\n    const staticAssetsZip = await firstValueFrom(this.zip.getData(staticAssetsEntry));\n    const staticAssetsZipFile = new File([staticAssetsZip], staticAssetsEntry.filename);\n    const staticAssetsZipEntries = await firstValueFrom(this.zip.getEntries(staticAssetsZipFile));\n    const filesToAdd = new Array<File>();\n    let oldAssets: Array<StaticAsset>;\n    let newAssets: Array<StaticAsset>;\n\n    const contentsFileEntry = staticAssetsZipEntries.find(\n      entry => entry.filename === this.staticAssets.fileNames.contents\n    );\n    if (contentsFileEntry) {\n      const fileContent = await (await firstValueFrom(this.zip.getData(contentsFileEntry))).text();\n      oldAssets = JSON.parse(fileContent);\n    }\n    for (const entry of staticAssetsZipEntries) {\n      if (\n        entry.filename === this.brandings.fileNames.manifest ||\n        entry.filename === this.staticAssets.fileNames.contents\n      ) {\n        continue;\n      }\n      const file = await firstValueFrom(this.zip.getData(entry));\n      const metadata = oldAssets?.find(asset => asset.fileName === entry.filename);\n      if (metadata) {\n        filesToAdd.push(\n          new File([file], entry.filename, {\n            type: metadata.type,\n            lastModified: metadata.lastModified\n          })\n        );\n      } else {\n        filesToAdd.push(new File([file], entry.filename));\n      }\n    }\n    if (filesToAdd.length > 0) {\n      const currentStaticAssets = await this.staticAssets.listFilesCached('branding', true);\n      newAssets = await this.staticAssets.addFilesToStaticAssets(\n        'branding',\n        filesToAdd,\n        currentStaticAssets,\n        false\n      );\n    }\n\n    const publicOptionsEntry = importedZipEntries.find(\n      entry => entry.filename === this.brandings.fileNames.exportZipName\n    );\n    if (!publicOptionsEntry) {\n      throw Error(`Missing \"${this.brandings.fileNames.exportZipName}\" file in the uploaded zip.`);\n    }\n    const publicOptionsZip = await firstValueFrom(this.zip.getData(publicOptionsEntry));\n    const publicOptionsZipFile = new File([publicOptionsZip], publicOptionsEntry.filename);\n\n    const publicOptionsFiles = await firstValueFrom(this.zip.getEntries(publicOptionsZipFile));\n    const optionsFileEntry = publicOptionsFiles.find(\n      entry => entry.filename === this.brandings.fileNames.options\n    );\n    if (!optionsFileEntry) {\n      throw Error(\n        `Missing \"${this.brandings.fileNames.options}\" file in \"${this.brandings.fileNames.exportZipName}\" file of the uploaded zip.`\n      );\n    }\n\n    const optionsFile = await firstValueFrom(this.zip.getData(optionsFileEntry));\n    let options = JSON.parse(await optionsFile.text());\n\n    if (oldAssets.length && newAssets.length) {\n      options = this.brandings.replaceBrandingAssetsInBrandingOptions(\n        options,\n        oldAssets,\n        newAssets\n      );\n    }\n\n    const zip = await this.brandings.getBrandingZip(options);\n\n    await this.brandings.saveBranding(zip, `${versionDetails.brandingName}-1`, [\n      versionDetails.brandingName\n    ]);\n  }\n\n  cancel() {\n    this._reject();\n  }\n}\n","<c8y-modal\n  [title]=\"'Import branding variant'\"\n  [headerClasses]=\"'dialog-header'\"\n  (onDismiss)=\"cancel()\"\n  [labels]=\"{ cancel: 'Cancel' }\"\n>\n  <ng-container c8y-modal-title>\n    <span c8yIcon=\"import\"></span>\n  </ng-container>\n  <div class=\"p-t-16 p-b-16 p-l-24 p-r-24 separator-bottom\">\n    <p\n      class=\"text-medium text-center text-16\"\n      translate\n    >\n      Easily copy any branding variant from any tenant\n    </p>\n    <p translate class=\"p-t-8\">\n      Export the branding variant from the source tenant and import the .zip file here. This process\n      allows you to maintain consistent branding across multiple tenants efficiently.\n    </p>\n  </div>\n  <div\n    class=\"p-24 m-r-auto m-l-auto\"\n    style=\"max-width: 300px\"\n  >\n    <c8y-drop-area\n      [icon]=\"'upload'\"\n      (dropped)=\"droppedFile($event)\"\n      [files]=\"files\"\n      [accept]=\"'.zip'\"\n      [maxAllowedFiles]=\"1\"\n      [loading]=\"loading\"\n    ></c8y-drop-area>\n  </div>\n</c8y-modal>\n","import { Injectable } from '@angular/core';\nimport { BrandingImportModalComponent } from './branding-import-modal.component';\nimport { BsModalService } from 'ngx-bootstrap/modal';\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class BrandingImportModalService {\n  constructor(private modal: BsModalService) {}\n\n  async openBrandingImportModal() {\n    let versionDetails: Awaited<BrandingImportModalComponent['result']>;\n    try {\n      const modalRef = this.modal.show(BrandingImportModalComponent, {\n        class: 'modal-sm',\n        ignoreBackdropClick: true,\n        keyboard: false\n      });\n      versionDetails = await modalRef.content.result;\n    } catch (e) {\n      // modal closed\n      return;\n    }\n\n    return versionDetails;\n  }\n}\n","import { Component } from '@angular/core';\nimport { Router, RouterLink } from '@angular/router';\nimport { CellRendererContext } from '@c8y/ngx-components';\n\n@Component({\n  selector: 'c8y-branding-name-cell-renderer',\n  templateUrl: './branding-name-cell-renderer.component.html',\n  standalone: true,\n  imports: [RouterLink]\n})\nexport class BrandingNameCellRendererComponent {\n  name: string;\n  routerLink: string;\n  constructor(\n    context: CellRendererContext,\n    private router: Router\n  ) {\n    this.name = context.value;\n    this.routerLink = `${this.router.url}/${context.item.name}`;\n  }\n}\n","<a [routerLink]=\"routerLink\">{{ name }}</a>\n","import { Component } from '@angular/core';\nimport { C8yTranslatePipe } from '@c8y/ngx-components';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\n\n@Component({\n  selector: 'c8y-branding-tags-header-cell-renderer',\n  templateUrl: './branding-tags-header-cell-renderer.component.html',\n  standalone: true,\n  imports: [PopoverModule, C8yTranslatePipe]\n})\nexport class BrandingTagsHeaderCellRendererComponent {\n  readonly heading = gettext('Applied to');\n  readonly popoverContent = gettext(`<p class=\"m-b-8\">Branding can be applied at two levels</p>\n    <ul class=\"list-unstyled m-b-0\">\n      <li class=\"m-b-4\">\n        <strong>Global: </strong>\n        <span>Applied to the entire platform, affecting all apps and interfaces.</span>\n      </li>\n      <li>\n        <strong>App-specific: </strong>\n        <span>Applied only to selected apps within the platform.</span>\n      </li>\n    </ul>`);\n}\n","<div class=\"d-flex\">\n  <span\n    class=\"text-truncate\"\n    [title]=\"heading | translate\"\n  >\n    {{ heading | translate }}\n  </span>\n  <button\n    class=\"btn-help btn-help--sm a-s-center\"\n    [attr.aria-label]=\"'Help' | translate\"\n    [popover]=\"applyBrandingPopover\"\n    placement=\"bottom\"\n    triggers=\"focus\"\n    container=\"body\"\n    type=\"button\"\n    (click)=\"$event.stopPropagation()\"\n  >\n    <i c8yIcon=\"question-circle-o\"></i>\n  </button>\n  <ng-template #applyBrandingPopover>\n    <div [innerHTML]=\"popoverContent | translate\"></div>\n  </ng-template>\n</div>\n","import { Component } from '@angular/core';\nimport {\n  BrandVersion,\n  StoreBrandingService,\n  BrandingVersionService,\n  BrandingTrackingService\n} from '@c8y/ngx-components/branding/shared/data';\nimport { BehaviorSubject, Observable, firstValueFrom } from 'rxjs';\nimport { map, shareReplay, switchMap } from 'rxjs/operators';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport {\n  ActionControl,\n  AlertService,\n  AppStateService,\n  BuiltInActionType,\n  Column,\n  DisplayOptions,\n  ModalService,\n  Pagination,\n  Status,\n  ZipService,\n  DataGridComponent,\n  BreadcrumbComponent,\n  BreadcrumbItemComponent,\n  TitleComponent,\n  HelpComponent,\n  ActionBarItemComponent,\n  IconDirective,\n  C8yTranslateDirective,\n  C8yTranslatePipe,\n  EmptyStateComponent,\n  LoadingComponent\n} from '@c8y/ngx-components';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { ApplicationService, IApplication } from '@c8y/client';\nimport { saveAs } from 'file-saver';\nimport { StaticAssetsService } from '@c8y/ngx-components/static-assets/data';\nimport { BsModalService } from 'ngx-bootstrap/modal';\nimport { ApplyBrandingToAppModalComponent } from '../apply-branding-to-app-modal/apply-branding-to-app-modal.component';\nimport { AddBrandingModalService } from '@c8y/ngx-components/branding/shared/lazy/add-branding-modal';\nimport { BrandingTagsCellRendererComponent } from '../branding-tags-cell-renderer/branding-tags-cell-renderer.component';\nimport { BrandingImportModalService } from '../branding-import-modal/branding-import-modal.service';\nimport { BrandingNameCellRendererComponent } from '../branding-name-cell-renderer/branding-name-cell-renderer.component';\nimport { BrandingTagsHeaderCellRendererComponent } from '../branding-tags-header-cell-renderer/branding-tags-header-cell-renderer.component';\nimport { AsyncPipe } from '@angular/common';\n\n@Component({\n  selector: 'c8y-branding',\n  templateUrl: './branding.component.html',\n  standalone: true,\n  imports: [\n    BreadcrumbComponent,\n    BreadcrumbItemComponent,\n    TitleComponent,\n    HelpComponent,\n    ActionBarItemComponent,\n    IconDirective,\n    C8yTranslateDirective,\n    C8yTranslatePipe,\n    EmptyStateComponent,\n    LoadingComponent,\n    DataGridComponent,\n    AsyncPipe\n  ]\n})\nexport class BrandingComponent {\n  pagination: Pagination = {\n    pageSize: 10,\n    currentPage: 1\n  };\n  displayOptions: DisplayOptions = {\n    bordered: false,\n    striped: true,\n    filter: true,\n    gridHeader: true,\n    hover: true\n  };\n  actionControls: ActionControl[] = [\n    {\n      type: BuiltInActionType.Edit,\n      callback: (entry: BrandVersion, _reload) => {\n        this.editBranding(entry.name);\n      }\n    },\n    {\n      type: BuiltInActionType.Export,\n      callback: async (entry: BrandVersion, _reload) => {\n        await this.exportBranding(entry);\n      }\n    },\n    {\n      type: 'preview',\n      icon: 'external-link',\n      text: gettext('Open preview'),\n      callback: async (entry: BrandVersion, _reload) => {\n        this.brandings.openPreviewForBranding(entry.name);\n      }\n    },\n    {\n      type: 'duplicate',\n      icon: 'copy',\n      text: gettext('Duplicate'),\n      callback: async (entry: BrandVersion, _reload) => {\n        await this.duplicateVersion(entry);\n        this.refresh();\n      }\n    },\n    {\n      type: 'apply-to-app',\n      icon: 'form',\n      text: gettext('Apply to specific apps'),\n      callback: async (entry: BrandVersion, _reload) => {\n        await this.applyToApps(entry);\n        this.refresh();\n      }\n    },\n    {\n      type: 'set-as-default',\n      icon: 'globe1',\n      text: gettext('Set as global'),\n      showIf: (entry: BrandVersion) => {\n        if (entry.tags?.includes('latest')) {\n          return false;\n        }\n        return true;\n      },\n      callback: async (entry: BrandVersion, _reload) => {\n        try {\n          await this.confirmModal.confirm(\n            gettext('Set as global branding'),\n            gettext(\n              'Are you sure that you want to set this variant as the global branding? By doing so, this variant will be applied to all apps that do not have a specific branding applied. Do you want to proceed?'\n            ),\n            Status.INFO\n          );\n        } catch {\n          // did not confirm\n          return;\n        }\n        await this.brandings.markAsActive(entry);\n        this.refresh();\n      }\n    },\n    {\n      type: BuiltInActionType.Delete,\n      showIf: (entry: BrandVersion) => {\n        if (entry.tags?.includes('latest')) {\n          return false;\n        }\n        return true;\n      },\n      callback: async (entry: BrandVersion, _reload) => {\n        try {\n          await this.confirmModal.confirm(\n            gettext('Delete branding variant'),\n            gettext(\n              'You are about to delete this branding variant. This action cannot be undone. Do you want to proceed?'\n            ),\n            Status.DANGER\n          );\n        } catch {\n          // did not confirm\n          return;\n        }\n\n        this.brandingTracking.deleteBrandingVariant();\n        await this.applicationService.deleteVersionPackage(entry.publicOptionsApp, {\n          version: entry.version\n        });\n        this.refresh();\n      }\n    }\n  ];\n  columns: Column[] = [\n    {\n      name: 'name',\n      header: gettext('Name'),\n      path: 'name',\n      filterable: true,\n      cellRendererComponent: BrandingNameCellRendererComponent\n    },\n    {\n      name: gettext('Applied to`Applications a branding applies to (table column header)`'),\n      path: 'tags',\n      filterable: false,\n      cellCSSClassName: 'small',\n      cellRendererComponent: BrandingTagsCellRendererComponent,\n      headerCellRendererComponent: BrandingTagsHeaderCellRendererComponent\n    },\n    {\n      name: 'owner',\n      header: gettext('Owner'),\n      path: 'owner',\n      filterable: false\n    },\n    {\n      name: 'lastUpdated',\n      header: gettext('Last updated'),\n      path: 'lastUpdated',\n      filterable: false\n    }\n  ];\n  currentAppContextPath = 'administration';\n  availableBrandingVariants$: Observable<{\n    publicOptions: IApplication;\n    variants: BrandVersion[];\n  }>;\n\n  private reloadTrigger = new BehaviorSubject<void>(undefined);\n  constructor(\n    private brandings: StoreBrandingService,\n    private activatedRoute: ActivatedRoute,\n    private appState: AppStateService,\n    private applicationService: ApplicationService,\n    private zip: ZipService,\n    private staticAssets: StaticAssetsService,\n    private router: Router,\n    private modal: BsModalService,\n    private confirmModal: ModalService,\n    private brandingVersionService: BrandingVersionService,\n    private addBrandingModalService: AddBrandingModalService,\n    private alert: AlertService,\n    private brandingImportModalService: BrandingImportModalService,\n    private brandingTracking: BrandingTrackingService\n  ) {\n    this.currentAppContextPath = this.appState.state.app?.contextPath || this.currentAppContextPath;\n    this.availableBrandingVariants$ = this.reloadTrigger.pipe(\n      switchMap(() => this.brandings.loadBrandingVariants()),\n      // hide the fallback from users\n      map(variants => {\n        variants.variants = variants.variants.filter(v => !v.tags?.includes('fallback'));\n        return variants;\n      }),\n      shareReplay({ refCount: true, bufferSize: 1 })\n    );\n  }\n\n  async deleteAllBrandings(publicOptions?: IApplication) {\n    const result = await this.confirmModal.confirm(\n      gettext('Delete all branding variants'),\n      gettext(\n        `<p class=\"m-b-8\">\n          This action will permanently remove all custom branding variants. Your tenant will revert\n          to the default branding.\n        </p>\n        <p class=\"m-b-8\">\n          Consider exporting your custom branding variants before proceeding, as this action cannot\n          be undone.\n        </p>\n        <p>\n          Are you sure you want to continue?\n        </p>`\n      ),\n      Status.DANGER,\n      { cancel: gettext('Cancel'), ok: gettext('Delete all') }\n    );\n    if (result === false || (typeof result === 'object' && !result.confirmed)) {\n      return;\n    }\n\n    this.brandingTracking.deleteAllBrandings();\n\n    await this.brandings.deleteAllBrandings(publicOptions);\n    this.refresh();\n  }\n\n  async exportBranding(variant: BrandVersion) {\n    this.brandingTracking.exportBranding();\n    const branding = await firstValueFrom(this.brandings.getZipForBinary(variant.id));\n    const staticAssetsApp = await this.staticAssets.getAppForTenant('branding');\n    const staticAssetsZip = await firstValueFrom(\n      this.brandings.getZipForBinary(\n        staticAssetsApp.activeVersionId,\n        this.staticAssets.fileNames.exportZipName\n      )\n    );\n    const blob = await this.zip.createZip([\n      { fileName: this.brandings.fileNames.exportZipName, blob: branding },\n      { fileName: this.staticAssets.fileNames.exportZipName, blob: staticAssetsZip }\n    ]);\n    saveAs(blob, `branding-export-${variant.name}-${variant.revision}-${new Date().getTime()}.zip`);\n  }\n\n  refresh() {\n    this.reloadTrigger.next();\n  }\n\n  async addNewVersion() {\n    const versionDetails = await this.addBrandingModalService.openAddBrandingModal();\n    if (!versionDetails) {\n      this.refresh();\n      return;\n    }\n    let fallBackBranding = {};\n    try {\n      fallBackBranding = await this.brandings.getBrandingOptionsForVersion('latest');\n    } catch (e) {\n      console.warn(`Failed to load latest branding`);\n    }\n\n    this.brandingTracking.addNewVersion();\n\n    try {\n      await this.brandings.addBranding(\n        this.brandingVersionService.createInitialBrandingVersion(versionDetails.brandingName),\n        fallBackBranding,\n        [versionDetails.brandingName]\n      );\n      await this.brandings.waitForBrandingToBePresent(versionDetails.brandingName);\n      this.editBranding(versionDetails.brandingName);\n    } catch (e) {\n      this.alert.addServerFailure(e, 'danger');\n    }\n  }\n\n  async duplicateVersion(version: BrandVersion) {\n    const options = await this.brandings.getBrandingOptionsForVersion(version.version);\n    const versionDetails = await this.addBrandingModalService.openDuplicateBrandingModal();\n    if (!versionDetails) {\n      return;\n    }\n\n    this.brandingTracking.duplicateVersion();\n\n    try {\n      await this.brandings.addBranding(\n        this.brandingVersionService.createInitialBrandingVersion(versionDetails.brandingName),\n        options,\n        [versionDetails.brandingName]\n      );\n      await this.brandings.waitForBrandingToBePresent(versionDetails.brandingName);\n      this.editBranding(versionDetails.brandingName);\n    } catch (e) {\n      this.alert.addServerFailure(e, 'danger');\n    }\n  }\n\n  async editBranding(brandingName: string) {\n    return this.router.navigate([brandingName, 'edit'], { relativeTo: this.activatedRoute });\n  }\n\n  async getStartedUsingBranding() {\n    const result = await this.confirmModal.confirm(\n      gettext(`Get started using branding variants`),\n      gettext(\n        `<p class=\"m-b-8\">Confirming this action creates two branding variants:</p>\n        <ul class=\"m-b-8 p-l-16\">\n          <li>A default copy of your current global branding</li>\n          <li>Your new customizable variant.</li>\n        </ul>\n        <p class=\"m-b-8\">\n          After customization, you can set your new variant as global or apply it to specific apps.\n        </p>\n        <p>\n          To revert changes, simply set the default branding as global or use the \"Delete all variants\" button at any time.\n        </p>`\n      )\n    );\n    if (result === false || (typeof result === 'object' && !result.confirmed)) {\n      return;\n    }\n\n    this.brandingTracking.getStartedUsingBranding();\n\n    await this.brandings.getStartedUsingBranding();\n    await this.addNewVersion();\n  }\n\n  async applyToApps(version: BrandVersion) {\n    const prefix = 'app-';\n    const currentTags = version.tags\n      .filter(tag => tag.startsWith(prefix))\n      .map(tag => tag.replace(prefix, ''));\n    const otherTags = version.tags.filter(tag => !tag.startsWith(prefix));\n    let selectedTags: Awaited<ApplyBrandingToAppModalComponent['result']>;\n    try {\n      const modalRef = this.modal.show(ApplyBrandingToAppModalComponent, {\n        initialState: { currentTags },\n        ignoreBackdropClick: true,\n        keyboard: false\n      });\n      selectedTags = await modalRef.content.result;\n    } catch (e) {\n      // modal closed\n      return;\n    }\n\n    const selectedApps = Object.keys(selectedTags).filter(key => selectedTags[key]);\n\n    this.brandingTracking.applyToApps(selectedApps);\n\n    const tagsToSet = [...otherTags, ...selectedApps.map(tag => `${prefix}${tag}`)];\n\n    await this.removeTagsFromOtherVersions(version.publicOptionsApp, tagsToSet, version.version);\n    await this.applicationService.setPackageVersionTag(\n      version.publicOptionsApp,\n      version.version,\n      tagsToSet\n    );\n  }\n\n  async importBranding() {\n    try {\n      await this.brandingImportModalService.openBrandingImportModal();\n\n      this.brandings.refreshTriggerBrandingVariants.next();\n      this.reloadTrigger.next();\n    } catch (e) {\n      // modal closed\n    }\n  }\n\n  private async removeTagsFromOtherVersions(\n    publicOptionsApp: IApplication,\n    tagsToRemove: string[],\n    versionToIgnore?: string\n  ) {\n    for (const version of publicOptionsApp.applicationVersions) {\n      if (version.version === versionToIgnore) {\n        continue;\n      }\n      const removedTags = version.tags.filter(tag => !tagsToRemove.includes(tag));\n      if (removedTags.length === version.tags.length) {\n        continue;\n      }\n      await this.applicationService.setPackageVersionTag(\n        publicOptionsApp,\n        version.version,\n        removedTags\n      );\n    }\n  }\n}\n","<c8y-title>{{ 'Branding' | translate }}</c8y-title>\n\n<c8y-breadcrumb>\n  <c8y-breadcrumb-item\n    [icon]=\"'cog'\"\n    [label]=\"'Settings' | translate\"\n  ></c8y-breadcrumb-item>\n  <c8y-breadcrumb-item\n    [icon]=\"'palette'\"\n    [label]=\"'Branding' | translate\"\n  ></c8y-breadcrumb-item>\n  <c8y-breadcrumb-item\n    [icon]=\"'palette'\"\n    [label]=\"'Variants' | translate\"\n    [path]=\"'/branding-editor/variants'\"\n  ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n@let brandingVariant = availableBrandingVariants$ | async;\n@if (!brandingVariant) {\n  <c8y-loading></c8y-loading>\n} @else {\n  @if (brandingVariant.publicOptions) {\n    <c8y-action-bar-item\n      [placement]=\"'right'\"\n      [priority]=\"30\"\n    >\n      <button\n        class=\"btn btn-link\"\n        (click)=\"addNewVersion()\"\n        data-cy=\"branding-add-branding-variant\"\n      >\n        <i c8yIcon=\"plus-circle\"></i>\n        <span translate>Add variant</span>\n      </button>\n    </c8y-action-bar-item>\n  }\n  <c8y-action-bar-item\n    [placement]=\"'right'\"\n    [priority]=\"20\"\n  >\n    <button\n      class=\"btn btn-link\"\n      data-cy=\"branding-import-branding\"\n      (click)=\"importBranding()\"\n    >\n      <i [c8yIcon]=\"'data-import'\"></i>\n      <span translate>Import variant</span>\n    </button>\n  </c8y-action-bar-item>\n\n  @if (brandingVariant.publicOptions) {\n    <c8y-action-bar-item\n      [placement]=\"'right'\"\n      [priority]=\"10\"\n    >\n      <button\n        class=\"btn btn-link\"\n        (click)=\"deleteAllBrandings(brandingVariant.publicOptions)\"\n        data-cy=\"branding-remove-all-brandings\"\n      >\n        <i [c8yIcon]=\"'trash-o'\"></i>\n        <span translate>Delete all variants</span>\n      </button>\n    </c8y-action-bar-item>\n  }\n\n  <c8y-help\n    [src]=\"'/docs/enterprise-tenant/customization/#to-configure-branding-settings'\"\n  ></c8y-help>\n\n  <div class=\"content-fullpage d-flex d-col border-top\">\n    <c8y-data-grid\n      [title]=\"'Branding variants' | translate\"\n      [columns]=\"columns\"\n      [actionControls]=\"actionControls\"\n      [pagination]=\"pagination\"\n      [displayOptions]=\"displayOptions\"\n      (onReload)=\"refresh()\"\n      [rows]=\"brandingVariant.variants\"\n    >\n      @if (!brandingVariant.publicOptions) {\n        <c8y-ui-empty-state\n          [icon]=\"'palette'\"\n          [title]=\"'No branding variants' | translate\"\n          [subtitle]=\"\n            'Personalize your experience with a theme-able interface. Create a unique look that aligns with your brand identity.'\n              | translate\n          \"\n          [horizontal]=\"false\"\n        >\n          <button\n            class=\"btn btn-default\"\n            data-cy=\"branding-get-started-using-branding\"\n            (click)=\"getStartedUsingBranding()\"\n            translate\n          >\n            Add branding variant\n          </button>\n        </c8y-ui-empty-state>\n      }\n    </c8y-data-grid>\n  </div>\n}\n","import { Component } from '@angular/core';\nimport { ControlValueAccessor, FormBuilder, FormsModule } from '@angular/forms';\nimport { CollapseModule } from 'ngx-bootstrap/collapse';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { CoreModule, MessageBannerService } from '@c8y/ngx-components';\nimport { cloneDeep } from 'lodash-es';\nimport { StaticAssetsFilePickerComponent } from '@c8y/ngx-components/static-assets';\nimport {\n  brandingFormGroupTopLevelEntries,\n  brandingFormGroupTopLevelEntriesToUnpack,\n  BrandingOptionsJson,\n  createGenericBrandingForm,\n  TopLevelValues\n} from '@c8y/ngx-components/branding/shared/data';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { EditorComponent } from '@c8y/ngx-components/editor';\nimport { combineLatest } from 'rxjs';\nimport { debounceTime, distinctUntilChanged } from 'rxjs/operators';\n\n@Component({\n  selector: 'c8y-branding-form',\n  templateUrl: './branding-form.component.html',\n  standalone: true,\n  host: { class: 'd-contents' },\n  imports: [\n    CoreModule,\n    FormsModule,\n    CollapseModule,\n    StaticAssetsFilePickerComponent,\n    EditorComponent\n  ]\n})\nexport class BrandingFormComponent implements ControlValueAccessor {\n  formGroup: ReturnType<BrandingFormComponent['initForm']>;\n  messageBannerHelp = gettext(\n    'Supports markdown. Use {{ headerMark }} for headers, {{ listMark }} for lists, {{ boldMark }} for bold, {{ italicMark }} for italic, and {{ linkMark }} for links.'\n  );\n  messageBannerHelpParams = {\n    headerMark: '`#`',\n    listMark: '`*`',\n    boldMark: '`**`',\n    italicMark: '`_`',\n    linkMark: '`[]()`'\n  };\n  private onTouched: () => void;\n\n  private externalValue: BrandingOptionsJson = {};\n  private formGroupValueChanges$: BrandingFormComponent['formGroup']['valueChanges'];\n\n  constructor(\n    private formBuilder: FormBuilder,\n    private messageBannerService: MessageBannerService\n  ) {\n    this.formGroup = this.initForm();\n    this.formGroupValueChanges$ = this.formGroup.valueChanges.pipe(takeUntilDestroyed());\n    this.setupMessageBannerIdAutoGeneration();\n  }\n\n  writeValue(obj: string): void {\n    try {\n      const parsedObj = JSON.parse(obj);\n      this.externalValue = parsedObj;\n      this.applyStateToForm(parsedObj);\n    } catch (e) {\n      // failed to parse\n    }\n  }\n\n  registerOnChange(fn: (value: string) => void): void {\n    this.formGroupValueChanges$.subscribe(value => fn(this.convertFormToState(value)));\n  }\n\n  registerOnTouched(fn: () => void): void {\n    this.onTouched = fn;\n  }\n\n  cockieBannerChange(toggleState: boolean) {\n    this.formGroup.controls.cookieBanner.patchValue({ cookieBannerDisabled: !toggleState });\n  }\n\n  onBlur(): void {\n    this.onTouched();\n  }\n\n  initForm() {\n    return createGenericBrandingForm(this.formBuilder);\n  }\n\n  applyStateToForm(branding: BrandingOptionsJson) {\n    if (!branding) {\n      return;\n    }\n    let toBePatched = brandingFormGroupTopLevelEntries.reduceRight((prev, curr) => {\n      if (brandingFormGroupTopLevelEntriesToUnpack.includes(curr as any)) {\n        return Object.assign(prev, { [curr]: branding });\n      }\n      return Object.assign(prev, { [curr]: branding[curr] });\n    }, {});\n\n    toBePatched = Object.keys(this.formGroup.controls)\n      .filter(key => !brandingFormGroupTopLevelEntries.includes(key as any))\n      .reduceRight((prev, curr) => {\n        return Object.assign(prev, { [curr]: branding.brandingCssVars || {} });\n      }, toBePatched);\n    this.formGroup.patchValue(toBePatched);\n\n    this.ensureMessageBannerIdExists();\n  }\n\n  convertFormToState(value: BrandingFormComponent['formGroup']['value']): string {\n    const topLevel: TopLevelValues = brandingFormGroupTopLevelEntries.reduceRight((prev, curr) => {\n      if (brandingFormGroupTopLevelEntriesToUnpack.includes(curr as any)) {\n        return Object.assign(prev, value[curr]);\n      }\n      return Object.assign(prev, { [curr]: value[curr] });\n    }, {});\n    const newBrandingCssVars = Object.entries(value).reduceRight((prev, [key, value]) => {\n      if (brandingFormGroupTopLevelEntries.includes(key as any)) {\n        return prev;\n      }\n      return Object.assign(prev, value);\n    }, {});\n    const externalValue: BrandingOptionsJson = cloneDeep(this.externalValue || {});\n    Object.assign(externalValue, topLevel);\n    const currentCSSVars = externalValue['brandingCssVars'] || {};\n    const assignedNewValues = Object.assign(currentCSSVars, newBrandingCssVars);\n    externalValue['brandingCssVars'] = assignedNewValues;\n    return JSON.stringify(externalValue, null, 2);\n  }\n\n  previewBanner(): void {\n    this.messageBannerService.showBanner(true);\n  }\n\n  private setupMessageBannerIdAutoGeneration(): void {\n    const messageBannerGroup = this.formGroup.controls.messageBanner;\n\n    combineLatest([\n      messageBannerGroup.controls.messageBannerContent.valueChanges,\n      messageBannerGroup.controls.messageBannerType.valueChanges,\n      messageBannerGroup.controls.messageBannerEnabled.valueChanges\n    ])\n      .pipe(\n        debounceTime(300),\n        distinctUntilChanged((prev, curr) => {\n          return JSON.stringify(prev) === JSON.stringify(curr);\n        }),\n        takeUntilDestroyed()\n      )\n      .subscribe(() => {\n        messageBannerGroup.controls.messageBannerId.setValue(crypto.randomUUID());\n      });\n  }\n\n  private async ensureMessageBannerIdExists(): Promise<void> {\n    const messageBannerGroup = this.formGroup.controls.messageBanner;\n    const content = messageBannerGroup.controls.messageBannerContent.value;\n    const currentId = messageBannerGroup.controls.messageBannerId.value;\n\n    if (content && !currentId) {\n      messageBannerGroup.controls.messageBannerId.setValue(crypto.randomUUID());\n    }\n  }\n}\n","<c8y-help [src]=\"'/docs/enterprise-tenant/customization/#generic-tab'\"></c8y-help>\n\n<div\n  class=\"inner-scroll\"\n  [formGroup]=\"formGroup\"\n>\n  <!--  Title & Favicon-->\n  <div class=\"card-block\">\n    <div class=\"row\">\n      <div class=\"col-xs-12 col-sm-3 col-md-2 p-t-16\">\n        <h4 class=\"text-normal text-right text-left-xs m-b-16\">\n          {{ 'Title & favicon' | translate }}\n        </h4>\n      </div>\n      <div class=\"col-xs-12 col-sm-9 col-md-10\">\n        <div\n          class=\"row p-t-16 p-b-16\"\n          [formGroupName]=\"'genericApplicationOptions'\"\n        >\n          <div class=\"col-md-6\">\n            <c8y-form-group class=\"m-b-32\">\n              <label\n                for=\"globalTitle\"\n                translate\n              >\n                Title\n              </label>\n              <input\n                class=\"form-control\"\n                id=\"globalTitle\"\n                name=\"globalTitle\"\n                type=\"text\"\n                formControlName=\"globalTitle\"\n              />\n              <c8y-messages\n                [helpMessage]=\"'Title to display in the browser tab' | translate\"\n              ></c8y-messages>\n            </c8y-form-group>\n          </div>\n          <div class=\"col-md-6\">\n            <c8y-form-group>\n              <label translate>Favicon</label>\n              <c8y-static-assets-file-picker\n                name=\"faviconUrl\"\n                [supportedFileExtensions]=\"['ico']\"\n                [isCSSURL]=\"false\"\n                formControlName=\"faviconUrl\"\n              ></c8y-static-assets-file-picker>\n              <c8y-messages [helpMessage]=\"'Supported files: *.ico' | translate\"></c8y-messages>\n            </c8y-form-group>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n\n  <div class=\"card-block separator-top\">\n    <div class=\"col-xs-12 col-sm-3 col-md-2 p-t-16\">\n      <h4\n        class=\"text-normal text-right text-left-xs m-b-16\"\n        translate\n      >\n        Dark theme\n      </h4>\n    </div>\n    <div class=\"col-xs-12 col-sm-9 col-md-10\">\n      <c8y-form-group class=\"m-b-32 p-t-8 m-t-4\">\n        <label class=\"c8y-switch\">\n          <input\n            class=\"form-control\"\n            name=\"darkThemeAvailable\"\n            type=\"checkbox\"\n            formControlName=\"darkThemeAvailable\"\n          />\n          <span></span>\n          <span translate>Enable dark theme support</span>\n        </label>\n      </c8y-form-group>\n    </div>\n  </div>\n  <!-- Typography -->\n  <div class=\"card-block separator-top\">\n    <div class=\"row\">\n      <div class=\"col-xs-12 col-sm-3 col-md-2 p-t-16\">\n        <h4\n          class=\"text-normal text-right text-left-xs m-b-16\"\n          translate\n        >\n          Typography\n        </h4>\n      </div>\n      <div class=\"col-xs-12 col-sm-9 col-md-10\">\n        <div class=\"row\">\n          <div class=\"col-md-6\">\n            <fieldset\n              class=\"c8y-fieldset p-24\"\n              [formGroupName]=\"'baseTypography'\"\n            >\n              <legend translate>Base typography</legend>\n              <c8y-form-group class=\"m-b-32\">\n                <label\n                  for=\"font-url\"\n                  translate\n                >\n                  Fonts URL\n                </label>\n                <input\n                  class=\"form-control\"\n                  id=\"font-url\"\n                  placeholder=\"{{\n                    'e.g. {{ example }}' | translate : { example: 'https://fonts.googleapis.com/css?family=Roboto:400,500,700' }\n                  }}\"\n                  type=\"text\"\n                  formControlName=\"font-url\"\n                />\n                <c8y-messages [helpMessage]=\"'The Google fonts URL' | translate\"></c8y-messages>\n              </c8y-form-group>\n              <c8y-form-group class=\"m-b-32\">\n                <label\n                  title=\"font-family-base\"\n                  for=\"font-family-base\"\n                  translate\n                >\n                  Base font stack\n                </label>\n                <input\n                  class=\"form-control\"\n                  id=\"font-family-base\"\n                  placeholder=\"{{ 'e.g. {{ example }}' | translate : {example: '&quot;Roboto&quot;, Arial, sans-serif'} }}\"\n                  name=\"font-family-base\"\n                  type=\"text\"\n                  formControlName=\"font-family-base\"\n                />\n                <c8y-messages></c8y-messages>\n              </c8y-form-group>\n            </fieldset>\n          </div>\n          <div class=\"col-md-6\">\n            <fieldset\n              class=\"c8y-fieldset p-24\"\n              [formGroupName]=\"'headingsAndNavigatorTypography'\"\n            >\n              <legend>{{ 'Headings & navigator' | translate }}</legend>\n              <c8y-form-group class=\"m-b-32\">\n                <label\n                  title=\"font-family-headings\"\n                  for=\"font-family-headings\"\n                  translate\n                >\n                  Headings font stack\n                </label>\n                <input\n                  class=\"form-control\"\n                  id=\"font-family-headings\"\n                  placeholder=\"{{ 'e.g. {{ example }}' | translate : {example: '&quot;Roboto&quot;, Arial, sans-serif'} }}\"\n                  type=\"text\"\n                  formControlName=\"font-family-headings\"\n                />\n                <c8y-messages\n                  [helpMessage]=\"\n                    'Leave empty to use the same font as the base font stack' | translate\n                  \"\n                ></c8y-messages>\n              </c8y-form-group>\n              <c8y-form-group class=\"m-b-32\">\n                <label\n                  title=\"navigator-font-family\"\n                  translate\n                >\n                  Navigator font stack\n                </label>\n                <div class=\"form-control-static\">\n                  <label class=\"c8y-radio radio-inline\">\n                    <input\n                      name=\"navigator-font-family\"\n                      type=\"radio\"\n                      formControlName=\"navigator-font-family\"\n                      [value]=\"'var(--font-family-base)'\"\n                    />\n                    <span></span>\n                    <span translate>Match base font stack</span>\n                  </label>\n                  <label\n                    class=\"c8y-radio radio-inline\"\n                    title=\"Radio Two\"\n                  >\n                    <input\n                      name=\"navigator-font-family\"\n                      type=\"radio\"\n                      formControlName=\"navigator-font-family\"\n                      [value]=\"'var(--font-family-headings)'\"\n                    />\n                    <span></span>\n                    <span translate>Match headings font stack</span>\n                  </label>\n                </div>\n              </c8y-form-group>\n            </fieldset>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n  <!-- Cookie banner -->\n  <div class=\"card-block separator-top\">\n    <div class=\"row\">\n      <div class=\"col-xs-12 col-sm-3 col-md-2 p-t-16\">\n        <h4\n          class=\"text-normal text-right text-left-xs m-b-16\"\n          translate\n        >\n          Cookie banner\n        </h4>\n      </div>\n      <div class=\"col-xs-12 col-sm-9 col-md-10\">\n        <fieldset\n          class=\"c8y-fieldset p-24\"\n          [formGroupName]=\"'cookieBanner'\"\n        >\n          <legend translate>Cookie banner</legend>\n          <label class=\"c8y-switch\">\n            <input\n              class=\"form-control\"\n              name=\"cookieBannerEnabled\"\n              type=\"checkbox\"\n              [ngModelOptions]=\"{ standalone: true }\"\n              [ngModel]=\"!formGroup.value.cookieBanner.cookieBannerDisabled\"\n              (ngModelChange)=\"cockieBannerChange($event)\"\n            />\n            <span></span>\n            <span translate>Enable cookie banner</span>\n          </label>\n\n          <div\n            class=\"collapse\"\n            [collapse]=\"formGroup.value.cookieBanner.cookieBannerDisabled\"\n            [isAnimated]=\"true\"\n          >\n            <div\n              class=\"row\"\n              style=\"min-height: 227px\"\n            >\n              <ng-container *ngIf=\"formGroup.value.cookieBanner.cookieBannerDisabled !== true\">\n                <div class=\"col-md-6\">\n                  <c8y-form-group class=\"m-b-32\">\n                    <label\n                      for=\"cookieBannerTitle\"\n                      translate\n                    >\n                      Title\n                    </label>\n                    <input\n                      class=\"form-control\"\n                      id=\"cookieBannerTitle\"\n                      name=\"cookieBannerTitle\"\n                      type=\"text\"\n                      formControlName=\"cookieBannerTitle\"\n                    />\n                    <c8y-messages></c8y-messages>\n                  </c8y-form-group>\n                  <c8y-form-group class=\"m-b-32\">\n                    <label\n                      for=\"policyUrl\"\n                      translate\n                    >\n                      Link to privacy policy\n                    </label>\n                    <input\n                      class=\"form-control\"\n                      id=\"policyUrl\"\n                      name=\"policyUrl\"\n                      type=\"text\"\n                      formControlName=\"policyUrl\"\n                    />\n                    <c8y-messages></c8y-messages>\n                  </c8y-form-group>\n                  <c8y-form-group class=\"m-b-32\">\n                    <label\n                      for=\"policyVersion\"\n                      translate\n                    >\n                      Version of privacy policy\n                    </label>\n                    <input\n                      class=\"form-control\"\n                      id=\"policyVersion\"\n                      name=\"policyVersion\"\n                      type=\"text\"\n                      formControlName=\"policyVersion\"\n                    />\n                    <c8y-messages\n                      [helpMessage]=\"\n                        'Changing the version of the privacy policy invalidates already existing cookie consents.'\n                          | translate\n                      \"\n                    ></c8y-messages>\n                  </c8y-form-group>\n                </div>\n\n                <div class=\"col-md-6\">\n                  <c8y-form-group class=\"m-b-32\">\n                    <label\n                      for=\"cookieBannerText\"\n                      translate\n                    >\n                      Text\n                    </label>\n                    <textarea\n                      class=\"form-control\"\n                      id=\"cookieBannerText\"\n                      name=\"cookieBannerText\"\n                      rows=\"8\"\n                      formControlName=\"cookieBannerText\"\n                    ></textarea>\n                    <c8y-messages></c8y-messages>\n                  </c8y-form-group>\n                </div>\n              </ng-container>\n            </div>\n          </div>\n        </fieldset>\n      </div>\n    </div>\n  </div>\n  <!-- Message banner -->\n  <div class=\"card-block separator-top\">\n    <div class=\"row\">\n      <div class=\"col-xs-12 col-sm-3 col-md-2 p-t-16\">\n        <h4\n          class=\"text-normal text-right text-left-xs m-b-16\"\n          translate\n        >\n          Message banner\n        </h4>\n      </div>\n\n      <div class=\"col-xs-12 col-sm-9 col-md-10\">\n        <fieldset\n          class=\"c8y-fieldset p-24\"\n          [formGroupName]=\"'messageBanner'\"\n        >\n          <legend translate>Message banner</legend>\n\n          <label class=\"c8y-switch\">\n            <input\n              class=\"form-control\"\n              name=\"messageBannerEnabled\"\n              type=\"checkbox\"\n              formControlName=\"messageBannerEnabled\"\n            />\n            <span></span>\n            <span translate>Enable message banner</span>\n          </label>\n          <div\n            class=\"collapse\"\n            [collapse]=\"!formGroup.value.messageBanner.messageBannerEnabled\"\n            [isAnimated]=\"true\"\n          >\n            <div class=\"d-flex a-i-center gap-8 p-t-16 p-b-16\">\n              <fieldset class=\"c8y-fieldset p-16\">\n                <legend>{{ 'Message type' | translate }}</legend>\n                <label\n                  class=\"c8y-radio radio-inline\"\n                  title=\"{{ 'Info' | translate }}\"\n                >\n                  <input\n                    type=\"radio\"\n                    value=\"info\"\n                    formControlName=\"messageBannerType\"\n                  />\n                  <span></span>\n                  <span class=\"d-flex a-i-center\">\n                    <i\n                      class=\"text-info icon-16 m-r-4\"\n                      c8yIcon=\"info-circle\"\n                    ></i>\n                    Info\n                  </span>\n                </label>\n                <label\n                  class=\"c8y-radio radio-inline\"\n                  title=\"{{ 'Warning' | translate }}\"\n                >\n                  <input\n                    type=\"radio\"\n                    value=\"warning\"\n                    formControlName=\"messageBannerType\"\n                  />\n                  <span></span>\n                  <span class=\"d-flex a-i-center\">\n                    <i\n                      class=\"text-warning icon-16 m-r-4\"\n                      c8yIcon=\"warning\"\n                    ></i>\n                    {{ 'Warning' | translate }}\n                  </span>\n                </label>\n                <label\n                  class=\"c8y-radio radio-inline\"\n                  title=\"{{ 'Danger' | translate }}\"\n                >\n                  <input\n                    type=\"radio\"\n                    value=\"danger\"\n                    formControlName=\"messageBannerType\"\n                  />\n                  <span></span>\n                  <span class=\"d-flex a-i-center\">\n                    <i\n                      class=\"text-danger icon-16 m-r-4\"\n                      c8yIcon=\"exclamation-circle\"\n                    ></i>\n                    {{ 'Danger' | translate }}\n                  </span>\n                </label>\n                <label\n                  class=\"c8y-radio radio-inline\"\n                  title=\"{{ 'Success' | translate }}\"\n                >\n                  <input\n                    type=\"radio\"\n                    value=\"success\"\n                    formControlName=\"messageBannerType\"\n                  />\n                  <span></span>\n                  <span class=\"d-flex a-i-center\">\n                    <i\n                      class=\"text-success icon-16 m-r-4\"\n                      c8yIcon=\"check-circle\"\n                    ></i>\n                    {{ 'Success' | translate }}\n                  </span>\n                </label>\n                <label\n                  class=\"c8y-radio radio-inline\"\n                  title=\"{{ 'System' | translate }}\"\n                >\n                  <input\n                    type=\"radio\"\n                    value=\"system\"\n                    formControlName=\"messageBannerType\"\n                  />\n                  <span></span>\n                  <span>\n                    <i\n                      class=\"text-primary icon-16 m-r4\"\n                      c8yIcon=\"wrench\"\n                    ></i>\n                    {{ 'System' | translate }}\n                  </span>\n                </label>\n              </fieldset>\n            </div>\n\n            <c8y-form-group\n              class=\"m-b-32 p-b-32\"\n              [style]=\"{ height: '300px' }\"\n              *ngIf=\"formGroup.value.messageBanner.messageBannerEnabled\"\n            >\n              <label\n                for=\"messageBannerContent\"\n                translate\n              >\n                Message content\n              </label>\n              <c8y-editor\n                class=\"flex-grow form-control\"\n                style=\"height: 100%\"\n                formControlName=\"messageBannerContent\"\n                [editorOptions]=\"{language: 'markdown'}\"\n                monacoEditorMarkerValidator\n              ></c8y-editor>\n              <c8y-messages\n                [helpMessage]=\"messageBannerHelp | translate: messageBannerHelpParams\"\n              ></c8y-messages>\n              <c8y-messages></c8y-messages>\n            </c8y-form-group>\n\n            <button\n              class=\"btn btn-default\"\n              type=\"button\"\n              (click)=\"previewBanner()\"\n            >\n              <i\n                class=\"m-r-4\"\n                c8yIcon=\"eye\"\n              ></i>\n              <span translate>Preview banner</span>\n            </button>\n          </div>\n        </fieldset>\n      </div>\n    </div>\n  </div>\n</div>\n","import { gettext } from '@c8y/ngx-components/gettext';\nimport { colorBrandingVars } from '@c8y/ngx-components/branding/shared/data';\n\ntype ColorVariableName = (typeof colorBrandingVars)[number];\n\ntype Color = { label: string; formControlName: ColorVariableName };\n\nexport const formStructure = {\n  brandColors: {\n    label: gettext('Brand colors'),\n    brandColors: {\n      label: gettext('Brand colors'),\n      colors: [\n        {\n          label: gettext('Brand primary'),\n          formControlName: 'brand-primary'\n        },\n        {\n          label: gettext('Brand light'),\n          formControlName: 'brand-light'\n        },\n        {\n          label: gettext('Brand dark'),\n          formControlName: 'brand-dark'\n        }\n      ] as const satisfies Color[]\n    },\n    shades: {\n      label: gettext('Shades'),\n      colorColumn: [\n        [\n          {\n            label: 'c8y-brand-10',\n            formControlName: 'c8y-brand-10'\n          },\n          {\n            label: 'c8y-brand-20',\n            formControlName: 'c8y-brand-20'\n          },\n          {\n            label: 'c8y-brand-30',\n            formControlName: 'c8y-brand-30'\n          },\n          {\n            label: 'c8y-brand-40',\n            formControlName: 'c8y-brand-40'\n          }\n        ],\n        [\n          {\n            label: 'c8y-brand-50',\n            formControlName: 'c8y-brand-50'\n          },\n          {\n            label: 'c8y-brand-60',\n            formControlName: 'c8y-brand-60'\n          },\n          {\n            label: 'c8y-brand-70',\n            formControlName: 'c8y-brand-70'\n          },\n          {\n            label: 'c8y-brand-80',\n            formControlName: 'c8y-brand-80'\n          }\n        ]\n      ] as const satisfies Color[][]\n    }\n  },\n  statusColors: {\n    label: gettext('Status colors'),\n    subCategories: [\n      {\n        label: gettext('Info colors'),\n        colors: [\n          {\n            label: gettext('Info'),\n            formControlName: 'palette-status-info'\n          },\n          {\n            label: gettext('Info light'),\n            formControlName: 'palette-status-info-light'\n          },\n          {\n            label: gettext('Info dark'),\n            formControlName: 'palette-status-info-dark'\n          }\n        ] as const satisfies Color[]\n      },\n      {\n        label: gettext('Warning colors'),\n        colors: [\n          {\n            label: gettext('Warning'),\n            formControlName: 'palette-status-warning'\n          },\n          {\n            label: gettext('Warning light'),\n            formControlName: 'palette-status-warning-light'\n          },\n          {\n            label: gettext('Warning dark'),\n            formControlName: 'palette-status-warning-dark'\n          }\n        ] as const satisfies Color[]\n      },\n      {\n        label: gettext('Danger colors'),\n        colors: [\n          {\n            label: gettext('Danger'),\n            formControlName: 'palette-status-danger'\n          },\n          {\n            label: gettext('Danger light'),\n            formControlName: 'palette-status-danger-light'\n          },\n          {\n            label: gettext('Danger dark'),\n            formControlName: 'palette-status-danger-dark'\n          }\n        ] as const satisfies Color[]\n      },\n      {\n        label: gettext('Success colors'),\n        colors: [\n          {\n            label: gettext('Success'),\n            formControlName: 'palette-status-success'\n          },\n          {\n            label: gettext('Success light'),\n            formControlName: 'palette-status-success-light'\n          },\n          {\n            label: gettext('Success dark'),\n            formControlName: 'palette-status-success-dark'\n          }\n        ] as const satisfies Color[]\n      }\n    ]\n  },\n  actionBar: {\n    label: gettext('Action bar'),\n    colorColumns: [\n      {\n        label: gettext('Action bar'),\n        colorColumns: [\n          [\n            {\n              label: gettext('Background color'),\n              formControlName: 'action-bar-background-default'\n            },\n            {\n              label: gettext('Text color'),\n              formControlName: 'action-bar-color-default'\n            },\n            {\n              label: gettext('Icon color'),\n              formControlName: 'action-bar-icon-color'\n            }\n          ],\n          [\n            {\n              label: gettext('Button color'),\n              formControlName: 'action-bar-color-actions'\n            },\n            {\n              label: gettext('Button hover color'),\n              formControlName: 'action-bar-color-actions-hover'\n            }\n          ]\n        ] as const satisfies Color[][]\n      }\n    ]\n  },\n  mainHeader: {\n    label: gettext('Main header'),\n    colorColumns: [\n      {\n        label: gettext('Main header'),\n        colorColumns: [\n          [\n            {\n              label: gettext('Background color'),\n              formControlName: 'header-color'\n            },\n            {\n              label: gettext('Text color'),\n              formControlName: 'header-text-color'\n            }\n          ],\n          [\n            {\n              label: gettext('Button hover color'),\n              formControlName: 'header-hover-color'\n            }\n          ]\n        ] as const satisfies Color[][]\n      }\n    ]\n  },\n  navigator: {\n    label: gettext('Navigator'),\n    colorColumns: [\n      {\n        label: gettext('Navigation'),\n        colors: [\n          {\n            label: gettext('Background color'),\n            formControlName: 'navigator-bg-color'\n          },\n          {\n            label: gettext('Text color'),\n            formControlName: 'navigator-text-color'\n          },\n          {\n            label: gettext('Separator color'),\n            formControlName: 'navigator-separator-color'\n          }\n        ] as const satisfies Color[]\n      },\n      {\n        label: gettext('Header'),\n        colors: [\n          {\n            label: gettext('Header background color'),\n            formControlName: 'navigator-header-bg'\n          },\n          {\n            label: gettext('Title color'),\n            formControlName: 'navigator-title-color'\n          }\n        ] as const satisfies Color[]\n      },\n      {\n        label: gettext('Active node'),\n        colors: [\n          {\n            label: gettext('Active background color'),\n            formControlName: 'navigator-active-bg'\n          },\n          {\n            label: gettext('Active border color'),\n            formControlName: 'navigator-border-active'\n          },\n          {\n            label: gettext('Active text color'),\n            formControlName: 'navigator-color-active'\n          }\n        ] as const satisfies Color[]\n      }\n    ]\n  },\n  rightDrawer: {\n    label: gettext('Right drawer'),\n    colorColumns: [\n      {\n        label: gettext('Panel'),\n        colors: [\n          {\n            label: gettext('Background color'),\n            formControlName: 'right-drawer-background-default'\n          },\n          {\n            label: gettext('Text color'),\n            formControlName: 'right-drawer-text-color-default'\n          },\n          {\n            label: gettext('Text muted color'),\n            formControlName: 'right-drawer-text-color-muted'\n          },\n          {\n            label: gettext('Separator color'),\n            formControlName: 'right-drawer-separator-color'\n          }\n        ] as const satisfies Color[]\n      },\n      {\n        label: gettext('Interactive'),\n        colors: [\n          {\n            label: gettext('Link color'),\n            formControlName: 'right-drawer-link-color'\n          },\n          {\n            label: gettext('Link hover color'),\n            formControlName: 'right-drawer-link-color-hover'\n          }\n        ] as const satisfies Color[]\n      }\n    ]\n  }\n} as const;\n","import { Component, OnDestroy } from '@angular/core';\nimport { ControlValueAccessor, FormBuilder, FormsModule } from '@angular/forms';\nimport {\n  map,\n  distinctUntilChanged,\n  pairwise,\n  delay,\n  switchMap,\n  filter,\n  startWith,\n  take\n} from 'rxjs/operators';\nimport {\n  CoreModule,\n  FilesService,\n  GENERIC_FILE_TYPE,\n  ThemeSwitcherService,\n  ColorInputComponent\n} from '@c8y/ngx-components';\nimport { cloneDeep } from 'lodash-es';\nimport { StaticAssetsFilePickerComponent } from '@c8y/ngx-components/static-assets';\nimport {\n  BrandingOptionsJson,\n  BrandingShadesService,\n  createBrandingForm\n} from '@c8y/ngx-components/branding/shared/data';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { Observable, defer, interval, merge, of } from 'rxjs';\nimport { ActivatedRoute } from '@angular/router';\nimport { formStructure } from './branding-theme-form-structure';\n\n@Component({\n  selector: 'c8y-branding-theme-form',\n  templateUrl: './branding-theme-form.component.html',\n  standalone: true,\n  host: { class: 'd-contents' },\n  imports: [CoreModule, FormsModule, StaticAssetsFilePickerComponent, ColorInputComponent]\n})\nexport class BrandingThemeFormComponent implements ControlValueAccessor, OnDestroy {\n  readonly formStructure = formStructure;\n  formGroup: ReturnType<BrandingThemeFormComponent['initForm']>;\n  imageFileExtensions: string[];\n  resetShadesButtonEnabled$: Observable<boolean>;\n  private onTouched: () => void;\n\n  private externalValue: BrandingOptionsJson = {};\n  private formGroupValueChanges$: BrandingThemeFormComponent['formGroup']['valueChanges'];\n  private addDarkThemePrefix = false;\n  private readonly varsToConvertToHeight = [\n    'navigator-platform-logo-height',\n    'dark-navigator-platform-logo-height'\n  ] as const;\n\n  constructor(\n    private activatedRoute: ActivatedRoute,\n    private formBuilder: FormBuilder,\n    private filesService: FilesService,\n    private brandingShades: BrandingShadesService,\n    private themeSwitcher: ThemeSwitcherService\n  ) {\n    this.addDarkThemePrefix = !!this.activatedRoute.snapshot.data.dark;\n    this.themeSwitcher.temporaryChangeTheme(this.addDarkThemePrefix ? 'dark' : 'light');\n    this.formGroup = this.initForm();\n    this.formGroupValueChanges$ = this.formGroup.valueChanges.pipe(takeUntilDestroyed());\n    this.imageFileExtensions = this.filesService\n      .mapGenericFileTypesToExtensions([GENERIC_FILE_TYPE.IMAGE])\n      .filter(ext => ext !== 'ico');\n\n    const hasCustomShades$ = merge(\n      this.formGroup.valueChanges,\n      defer(() => of(this.formGroup.value))\n    ).pipe(\n      takeUntilDestroyed(),\n      map(tmp => this.brandingShades.hasCustomShadesSet(tmp['brand-primary'], tmp)),\n      distinctUntilChanged()\n    );\n    this.resetShadesButtonEnabled$ = merge(\n      defer(() => of(this.formGroup.controls['brand-primary'].status)),\n      this.formGroup.controls['brand-primary'].statusChanges\n    ).pipe(\n      // statusChanges emits 'PENDING' when the form control is async validating\n      // https://github.com/angular/angular/issues/41519\n      switchMap(status => {\n        if (status === 'PENDING') {\n          return interval(200).pipe(\n            map(() => this.formGroup.controls['brand-primary'].status),\n            filter(stat => stat !== 'PENDING'),\n            take(1),\n            startWith(status)\n          );\n        }\n        return of(status);\n      }),\n      switchMap(status => {\n        if (status !== 'VALID') {\n          return of(false);\n        }\n        return hasCustomShades$;\n      })\n    );\n\n    const brandPrimaryFormControl = this.formGroup.controls['brand-primary'];\n    brandPrimaryFormControl.valueChanges\n      .pipe(\n        filter(color => this.brandingShades.isValidShadeColor(color)),\n        takeUntilDestroyed(),\n        distinctUntilChanged(),\n        pairwise(),\n        delay(5)\n      )\n      .subscribe(([prev, curr]) => {\n        try {\n          if (!this.brandingShades.hasCustomShadesSet(prev, this.formGroup.value)) {\n            this.regenerateShadesBasedOnPrimaryColor(curr);\n          }\n        } catch (e) {\n          console.log(e);\n        }\n      });\n  }\n\n  ngOnDestroy(): void {\n    this.themeSwitcher.resetTemporaryTheme();\n  }\n\n  regenerateShadesBasedOnPrimaryColor(color?: string) {\n    const newShades = this.brandingShades.getShadeColorBrandingCssVars(\n      color || this.formGroup.value['brand-primary']\n    );\n    this.formGroup.patchValue(newShades);\n  }\n\n  writeValue(obj: string): void {\n    try {\n      const parsedObj = JSON.parse(obj);\n      this.externalValue = parsedObj;\n      this.applyStateToForm(parsedObj);\n    } catch (e) {\n      // failed to parse\n    }\n  }\n\n  registerOnChange(fn: (value: string) => void): void {\n    this.formGroupValueChanges$.subscribe(value => fn(this.convertFormToState(value)));\n  }\n\n  registerOnTouched(fn: () => void): void {\n    this.onTouched = fn;\n  }\n\n  onBlur(): void {\n    this.onTouched();\n  }\n\n  initForm() {\n    return createBrandingForm(this.formBuilder);\n  }\n\n  applyStateToForm(branding: BrandingOptionsJson) {\n    if (!branding) {\n      return;\n    }\n    const toBePatched = {};\n\n    const prefix = this.getPrefix();\n    Object.entries(branding.brandingCssVars || {}).forEach(([key, value]) => {\n      if (prefix && !key.startsWith(prefix)) {\n        return;\n      }\n      const keyInForm = key.replace(prefix, '');\n      if (this.varsToConvertToHeight.includes(keyInForm as any) && typeof value === 'string') {\n        toBePatched[keyInForm] = Number.parseInt(value.replace(/[a-zA-Z%]/, '') || '0');\n        return;\n      }\n      toBePatched[keyInForm] = value;\n    });\n    this.formGroup.patchValue(toBePatched);\n  }\n\n  convertFormToState(value: BrandingThemeFormComponent['formGroup']['value']): string {\n    const prefixedBrandingCssVars = {};\n    const prefix = this.getPrefix();\n    Object.entries(value).forEach(([key, value]) => {\n      prefixedBrandingCssVars[`${prefix}${key}`] = value;\n    });\n    const externalValue: BrandingOptionsJson = cloneDeep(this.externalValue || {});\n    const currentCSSVars = externalValue['brandingCssVars'] || {};\n    const assignedNewValues = Object.assign(currentCSSVars, prefixedBrandingCssVars);\n    for (const key of this.varsToConvertToHeight) {\n      const value = assignedNewValues[key];\n      if (typeof value === 'number') {\n        assignedNewValues[key] += 'px';\n      }\n    }\n    externalValue['brandingCssVars'] = assignedNewValues;\n    return JSON.stringify(externalValue, null, 2);\n  }\n\n  private getPrefix() {\n    return this.addDarkThemePrefix ? 'dark-' : '';\n  }\n}\n","<c8y-help [src]=\"'/docs/enterprise-tenant/customization/#light-dark-theme-tab'\"></c8y-help>\n\n<div\n  class=\"inner-scroll\"\n  [formGroup]=\"formGroup\"\n>\n  <!--   Logos -->\n  <div class=\"card-block\">\n    <div class=\"row\">\n      <div class=\"col-xs-12 col-sm-3 col-md-2 p-t-16\">\n        <h4\n          class=\"text-normal text-right text-left-xs m-b-16\"\n          translate\n        >\n          Logos\n        </h4>\n      </div>\n      <div class=\"col-xs-12 col-sm-9 col-md-10\">\n        <div class=\"row\">\n          <div class=\"col-md-6\">\n            <fieldset class=\"c8y-fieldset p-24\">\n              <legend translate>Brand logo</legend>\n              <c8y-form-group class=\"m-b-32\">\n                <label\n                  title=\"brand-logo-img\"\n                  translate\n                >\n                  Brand logo file\n                </label>\n                <c8y-static-assets-file-picker\n                  name=\"brand-logo-img\"\n                  [supportedFileExtensions]=\"imageFileExtensions\"\n                  [isCSSURL]=\"true\"\n                  [size]=\"150\"\n                  formControlName=\"brand-logo-img\"\n                ></c8y-static-assets-file-picker>\n                <c8y-messages [helpMessage]=\"'Supported files: *.png, *.svg, *.jpg' | translate\"></c8y-messages>\n              </c8y-form-group>\n              <c8y-form-group class=\"m-b-32\">\n                <label\n                  title=\"brand-logo-img-height\"\n                  for=\"brand-logo-img-height\"\n                  translate\n                >\n                  Brand logo height\n                </label>\n                <input\n                  class=\"form-control\"\n                  id=\"brand-logo-img-height\"\n                  placeholder=\"{{ 'e.g. {{ example }}' | translate: { example: '50' } }}\"\n                  name=\"brand-logo-img-height\"\n                  type=\"number\"\n                  formControlName=\"brand-logo-img-height\"\n                />\n                <c8y-messages [helpMessage]=\"'Value is applied in px' | translate\"></c8y-messages>\n              </c8y-form-group>\n            </fieldset>\n          </div>\n          <div class=\"col-md-6\">\n            <fieldset class=\"c8y-fieldset p-24\">\n              <legend translate>Navigator logo</legend>\n              <c8y-form-group class=\"m-b-32\">\n                <label\n                  title=\"navigator-platform-logo\"\n                  translate\n                >\n                  Navigator logo file\n                </label>\n                <c8y-static-assets-file-picker\n                  name=\"navigator-platform-logo\"\n                  [supportedFileExtensions]=\"imageFileExtensions\"\n                  [isCSSURL]=\"true\"\n                  [size]=\"150\"\n                  formControlName=\"navigator-platform-logo\"\n                ></c8y-static-assets-file-picker>\n                <c8y-messages [helpMessage]=\"'Supported files: *.png, *.svg, *.jpg' | translate\"></c8y-messages>\n              </c8y-form-group>\n              <c8y-form-group class=\"m-b-32\">\n                <label\n                  title=\"navigator-platform-logo-height\"\n                  for=\"navigator-platform-logo-height\"\n                  translate\n                >\n                  Navigator logo height\n                </label>\n                <input\n                  class=\"form-control\"\n                  id=\"navigator-platform-logo-height\"\n                  placeholder=\"{{ 'e.g. {{ example }}' | translate: { example: '50' } }}\"\n                  name=\"navigator-platform-logo-height\"\n                  type=\"number\"\n                  [min]=\"1\"\n                  formControlName=\"navigator-platform-logo-height\"\n                />\n                <c8y-messages [helpMessage]=\"'Value is applied in px' | translate\"></c8y-messages>\n              </c8y-form-group>\n            </fieldset>\n          </div>\n          <div class=\"col-md-6\">\n            <fieldset class=\"c8y-fieldset p-24\">\n              <legend translate>Login image</legend>\n              <c8y-form-group class=\"m-b-32\">\n                <label\n                  title=\"login-platform-animation-img\"\n                  translate\n                >\n                  Login image file\n                </label>\n                <c8y-static-assets-file-picker\n                  name=\"login-platform-animation-img\"\n                  [supportedFileExtensions]=\"imageFileExtensions\"\n                  [isCSSURL]=\"false\"\n                  [size]=\"150\"\n                  formControlName=\"login-platform-animation-img\"\n                ></c8y-static-assets-file-picker>\n                <c8y-messages [helpMessage]=\"'Supported files: *.png, *.svg, *.jpg' | translate\"></c8y-messages>\n              </c8y-form-group>\n            </fieldset>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n  <!--  Brand colors -->\n  <div class=\"card-block separator-top\">\n    <div class=\"row\">\n      <div class=\"col-xs-12 col-sm-3 col-md-2 p-t-16\">\n        <h4\n          class=\"text-normal text-right text-left-xs m-b-16\"\n        >\n          {{ formStructure.brandColors.label | translate}}\n        </h4>\n      </div>\n      <div class=\"col-xs-12 col-sm-9 col-md-10\">\n        <div class=\"row\">\n          <div class=\"col-md-4\">\n            <fieldset class=\"c8y-fieldset p-24\">\n              <legend>{{ formStructure.brandColors.brandColors.label | translate}}</legend>\n              <c8y-form-group class=\"m-b-32\" *ngFor=\"let color of formStructure.brandColors.brandColors.colors\">\n                <label\n                  [title]=\"color.formControlName\"\n                  [for]=\"color.formControlName\"\n                >\n                  {{ color.label | translate }}\n                </label>\n                <c8y-color-input\n                  [attr.data-cy]=\"'branding-theme-form-color-input-' + color.formControlName\"\n                  [formControlName]=\"color.formControlName\"\n                ></c8y-color-input>\n                <c8y-messages></c8y-messages>\n              </c8y-form-group>\n            </fieldset>\n          </div>\n          <div class=\"col-md-8\">\n            <fieldset class=\"c8y-fieldset p-24\">\n              <legend>{{ formStructure.brandColors.shades.label | translate }}</legend>\n              <div class=\"row\">\n                <div class=\"col-md-6\" *ngFor=\"let colorColumn of formStructure.brandColors.shades.colorColumn\">\n                  <c8y-form-group class=\"m-b-32\" *ngFor=\"let color of colorColumn\">\n                    <label\n                      [title]=\"color.formControlName\"\n                      [for]=\"color.formControlName\"\n                    >\n                      {{ color.label | translate }}\n                    </label>\n                    <c8y-color-input\n                      [attr.data-cy]=\"'branding-theme-form-color-input-' + color.formControlName\"\n                      [formControlName]=\"color.formControlName\"\n                    ></c8y-color-input>\n                    <c8y-messages></c8y-messages>\n                  </c8y-form-group>\n                </div>\n              </div>\n              <button\n                class=\"btn btn-default btn-sm\"\n                type=\"button\"\n                data-cy=\"branding-reset-shades-button\"\n                (click)=\"regenerateShadesBasedOnPrimaryColor()\"\n                [disabled]=\"!(resetShadesButtonEnabled$ | async)\"\n              >\n                <i [c8yIcon]=\"'reset'\"></i>\n                <span translate>Reset shades</span>\n              </button>\n            </fieldset>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n  <!-- Status colors -->\n  <div class=\"card-block separator-top\">\n    <div class=\"row\">\n      <div class=\"col-xs-12 col-sm-3 col-md-2 p-t-16\">\n        <h4\n          class=\"text-normal text-right text-left-xs m-b-16\"\n        >\n          {{ formStructure.statusColors.label | translate }}\n        </h4>\n      </div>\n      <div class=\"col-xs-12 col-sm-9 col-md-10\">\n        <div class=\"row\">\n          <div class=\"col-md-6\" *ngFor=\"let subCategory of formStructure.statusColors.subCategories\">\n            <fieldset class=\"c8y-fieldset p-24\">\n              <legend>{{ subCategory.label | translate }}</legend>\n              <c8y-form-group class=\"m-b-32\" *ngFor=\"let color of subCategory.colors\">\n                <label\n                  [title]=\"color.formControlName\"\n                  [for]=\"color.formControlName\"\n                >\n                  {{ color.label | translate }}\n                </label>\n                <c8y-color-input\n                  [attr.data-cy]=\"'branding-theme-form-color-input-' + color.formControlName\"\n                  [formControlName]=\"color.formControlName\"\n                ></c8y-color-input>\n                <c8y-messages></c8y-messages>\n              </c8y-form-group>\n            </fieldset>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n  <!-- Generic -->\n  <div class=\"card-block separator-top\">\n    <div class=\"row\">\n      <div class=\"col-xs-12 col-sm-3 col-md-2 p-t-16\">\n        <h4\n          class=\"text-normal text-right text-left-xs m-b-16\"\n          translate\n        >\n          Generic\n        </h4>\n      </div>\n      <div class=\"col-xs-12 col-sm-9 col-md-10\">\n        <div class=\"row\">\n          <div class=\"col-md-6\">\n            <fieldset class=\"c8y-fieldset p-24\">\n              <legend translate>Generic colors</legend>\n              <c8y-form-group class=\"m-b-32\">\n                <label\n                  title=\"body-background-color\"\n                  for=\"body-background-color\"\n                  translate\n                >\n                  Body background color\n                </label>\n                <c8y-color-input\n                  name=\"body-background-color\"\n                  formControlName=\"body-background-color\"\n                ></c8y-color-input>\n                <c8y-messages></c8y-messages>\n              </c8y-form-group>\n\n              <c8y-form-group class=\"m-b-32\">\n                <label\n                  title=\"text-color\"\n                  for=\"text-color\"\n                  translate\n                >\n                  Text color\n                </label>\n                <c8y-color-input\n                  name=\"text-color\"\n                  formControlName=\"text-color\"\n                ></c8y-color-input>\n                <c8y-messages></c8y-messages>\n              </c8y-form-group>\n              <c8y-form-group class=\"m-b-32\">\n                <label\n                  title=\"text-muted\"\n                  for=\"text-muted\"\n                  translate\n                >\n                  Text muted color\n                </label>\n                <c8y-color-input\n                  name=\"text-muted\"\n                  formControlName=\"text-muted\"\n                ></c8y-color-input>\n                <c8y-messages></c8y-messages>\n              </c8y-form-group>\n            </fieldset>\n          </div>\n          <div class=\"col-md-6\">\n            <fieldset class=\"c8y-fieldset p-24\">\n              <legend translate>Interactive</legend>\n              <c8y-form-group class=\"m-b-32\">\n                <label\n                  title=\"link-color\"\n                  for=\"link-color\"\n                  translate\n                >\n                  Link color\n                </label>\n                <c8y-color-input\n                  name=\"link-color\"\n                  formControlName=\"link-color\"\n                ></c8y-color-input>\n                <c8y-messages></c8y-messages>\n              </c8y-form-group>\n              <c8y-form-group class=\"m-b-32\">\n                <label\n                  title=\"link-hover-color\"\n                  for=\"link-hover-color\"\n                  translate\n                >\n                  Link hover color\n                </label>\n                <c8y-color-input\n                  name=\"link-hover-color\"\n                  formControlName=\"link-hover-color\"\n                ></c8y-color-input>\n                <c8y-messages></c8y-messages>\n              </c8y-form-group>\n              <c8y-form-group class=\"m-b-32\">\n                <label\n                  title=\"btn-border-radius-base\"\n                  for=\"btn-border-radius-base\"\n                  translate\n                >\n                  Button border-radius\n                </label>\n                <input\n                  class=\"form-control\"\n                  placeholder=\"{{ 'e.g. 4' | translate }}\"\n                  name=\"btn-border-radius-base\"\n                  type=\"number\"\n                  formControlName=\"btn-border-radius-base\"\n                />\n                <c8y-messages [helpMessage]=\"'Value is applied in px' | translate\"></c8y-messages>\n              </c8y-form-group>\n            </fieldset>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n  <!-- Action bar -->\n  <div class=\"card-block separator-top\">\n    <div class=\"row\">\n      <div class=\"col-xs-12 col-sm-3 col-md-2 p-t-16\">\n        <h4\n          class=\"text-normal text-right text-left-xs m-b-16\"\n        >\n          {{ formStructure.actionBar.label | translate }}\n        </h4>\n      </div>\n      <div class=\"col-xs-12 col-sm-9 col-md-10\">\n        <fieldset class=\"c8y-fieldset p-24\" *ngFor=\"let colorColumn of formStructure.actionBar.colorColumns\">\n          <legend>{{ colorColumn.label | translate }}</legend>\n          <div class=\"row\">\n            <div class=\"col-md-6\" *ngFor=\"let subColorColumn of colorColumn.colorColumns\">\n              <c8y-form-group class=\"m-b-32\" *ngFor=\"let color of subColorColumn\">\n                <label\n                  [title]=\"color.formControlName\"\n                  [for]=\"color.formControlName\"\n                >\n                  {{ color.label | translate }}\n                </label>\n                <c8y-color-input\n                  [attr.data-cy]=\"'branding-theme-form-color-input-' + color.formControlName\"\n                  [formControlName]=\"color.formControlName\"\n                ></c8y-color-input>\n                <c8y-messages></c8y-messages>\n              </c8y-form-group>\n            </div>\n          </div>\n        </fieldset>\n      </div>\n    </div>\n  </div>\n  <!-- Main header -->\n  <div class=\"card-block separator-top\">\n    <div class=\"row\">\n      <div class=\"col-xs-12 col-sm-3 col-md-2 p-t-16\">\n        <h4\n          class=\"text-normal text-right text-left-xs m-b-16\"\n        >\n          {{ formStructure.mainHeader.label | translate }}\n        </h4>\n      </div>\n      <div class=\"col-xs-12 col-sm-9 col-md-10\">\n        <fieldset class=\"c8y-fieldset p-24\" *ngFor=\"let colorColumn of formStructure.mainHeader.colorColumns\">\n          <legend>{{ colorColumn.label | translate }}</legend>\n          <div class=\"row\">\n            <div class=\"col-md-6\" *ngFor=\"let subColorColumn of colorColumn.colorColumns\">\n              <c8y-form-group class=\"m-b-32\" *ngFor=\"let color of subColorColumn\">\n                <label\n                  [title]=\"color.formControlName\"\n                  [for]=\"color.formControlName\"\n                >\n                  {{ color.label | translate }}\n                </label>\n                <c8y-color-input\n                  [attr.data-cy]=\"'branding-theme-form-color-input-' + color.formControlName\"\n                  [formControlName]=\"color.formControlName\"\n                ></c8y-color-input>\n                <c8y-messages></c8y-messages>\n              </c8y-form-group>\n            </div>\n          </div>\n        </fieldset>\n      </div>\n    </div>\n  </div>\n  <!-- Navigator -->\n  <div class=\"card-block separator-top\">\n    <div class=\"row\">\n      <div class=\"col-xs-12 col-sm-3 col-md-2 p-t-16\">\n        <h4\n          class=\"text-normal text-right text-left-xs m-b-16\"\n        >\n          {{ formStructure.navigator.label }}\n        </h4>\n      </div>\n      <div class=\"col-xs-12 col-sm-9 col-md-10\">\n        <div class=\"row\">\n          <div class=\"col-md-4\" *ngFor=\"let colorColumn of formStructure.navigator.colorColumns\">\n            <fieldset class=\"c8y-fieldset p-24\">\n              <legend>{{ colorColumn.label | translate }}</legend>\n              <c8y-form-group class=\"m-b-32\" *ngFor=\"let color of colorColumn.colors\">\n                <label\n                  [title]=\"color.formControlName\"\n                  [for]=\"color.formControlName\"\n                >\n                  {{ color.label | translate }}\n                </label>\n                <c8y-color-input\n                  [attr.data-cy]=\"'branding-theme-form-color-input-' + color.formControlName\"\n                  [formControlName]=\"color.formControlName\"\n                ></c8y-color-input>\n                <c8y-messages></c8y-messages>\n              </c8y-form-group>\n            </fieldset>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n  <!-- Right drawer -->\n  <div class=\"card-block separator-top\">\n    <div class=\"row\">\n      <div class=\"col-xs-12 col-sm-3 col-md-2 p-t-16\">\n        <h4\n          class=\"text-normal text-right text-left-xs m-b-16\"\n        >\n          {{ formStructure.rightDrawer.label | translate }}\n        </h4>\n      </div>\n      <div class=\"col-xs-12 col-sm-9 col-md-10\">\n        <div class=\"row\">\n          <div class=\"col-md-6\" *ngFor=\"let colorColumn of formStructure.rightDrawer.colorColumns\">\n            <fieldset class=\"c8y-fieldset p-24\">\n              <legend>{{ colorColumn.label | translate }}</legend>\n              <c8y-form-group class=\"m-b-32\" *ngFor=\"let color of colorColumn.colors\">\n                <label\n                  [title]=\"color.formControlName\"\n                  [for]=\"color.formControlName\"\n                >\n                  {{ color.label | translate }}\n                </label>\n                <c8y-color-input\n                  [attr.data-cy]=\"'branding-theme-form-color-input-' + color.formControlName\"\n                  [formControlName]=\"color.formControlName\"\n                ></c8y-color-input>\n                <c8y-messages></c8y-messages>\n              </c8y-form-group>\n            </fieldset>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n","import { Component, OnDestroy } from '@angular/core';\nimport { ActivatedRoute, Router, RouterOutlet } from '@angular/router';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { AlertService, AppStateService, CoreModule } from '@c8y/ngx-components';\nimport { BehaviorSubject, Observable, firstValueFrom } from 'rxjs';\nimport { map, distinctUntilChanged, switchMap } from 'rxjs/operators';\nimport { cloneDeep } from 'lodash-es';\nimport {\n  ApplyBrandingLocallyService,\n  BrandingOptionsJson,\n  StoreBrandingService\n} from '@c8y/ngx-components/branding/shared/data';\nimport { AsyncValidator, ControlValueAccessor, FormControl } from '@angular/forms';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\n@Component({\n  selector: 'c8y-edit-branding-router-outlet',\n  templateUrl: './edit-branding-router-outlet.component.html',\n  standalone: true,\n  imports: [RouterOutlet, CoreModule]\n})\nexport class EditBrandingRouterOutletComponent implements OnDestroy {\n  brandingName$: Observable<string>;\n  formControl = new FormControl<string>(undefined);\n  fallbackBranding$: Observable<BrandingOptionsJson>;\n  tabName$: Observable<string>;\n  isGlobalBranding$: Observable<boolean>;\n  private newBranding = new BehaviorSubject<BrandingOptionsJson>(null);\n  private currentlyDisplayedComponent = new BehaviorSubject<\n    (ControlValueAccessor & Partial<AsyncValidator>) | null\n  >(null);\n\n  constructor(\n    private activatedRoute: ActivatedRoute,\n    private store: StoreBrandingService,\n    private router: Router,\n    private alert: AlertService,\n    private applyBrandingService: ApplyBrandingLocallyService,\n    private appState: AppStateService\n  ) {\n    this.isGlobalBranding$ = this.activatedRoute.data.pipe(\n      map(({ tags }) => {\n        return tags?.includes('latest');\n      })\n    );\n    this.tabName$ = this.currentlyDisplayedComponent.pipe(\n      switchMap(() => this.activatedRoute.firstChild.data),\n      map(data => data.tabName)\n    );\n    this.brandingName$ = this.activatedRoute.params.pipe(map(params => params.name));\n    this.formControl.addValidators(control => {\n      try {\n        JSON.parse(control.value);\n        return null;\n      } catch (e) {\n        return { invalidJson: true };\n      }\n    });\n    this.fallbackBranding$ = this.activatedRoute.data.pipe(map(data => data.fallbackBranding));\n    this.activatedRoute.data\n      .pipe(takeUntilDestroyed(), distinctUntilChanged())\n      .subscribe(({ branding }) => {\n        this.applyBrandingService.applyBranding(branding);\n        this.formControl.setValue(JSON.stringify(branding, null, 2));\n      });\n    this.currentlyDisplayedComponent.pipe(takeUntilDestroyed()).subscribe(component => {\n      if (!component) {\n        return;\n      }\n      this.formControl.clearAsyncValidators();\n      component.registerOnChange(value => this.onBrandingVarChanges(value));\n      component.writeValue(this.formControl.value);\n      if (component.validate) {\n        this.formControl.addAsyncValidators(form => component.validate(form));\n        if (component.registerOnValidatorChange) {\n          component.registerOnValidatorChange(() => this.formControl.updateValueAndValidity());\n        }\n      }\n\n      this.formControl.updateValueAndValidity();\n    });\n  }\n\n  ngOnDestroy(): void {\n    this.applyBrandingService.resetBranding();\n  }\n\n  routeActivated(event: ControlValueAccessor & Partial<AsyncValidator>) {\n    this.currentlyDisplayedComponent.next(event);\n  }\n\n  async saveBranding() {\n    try {\n      const currentBranding = this.newBranding.value;\n      const tagsOfCurrentVersion = await firstValueFrom(\n        this.activatedRoute.data.pipe(map(data => data.tags))\n      );\n\n      const currentBrandingName = this.activatedRoute.snapshot.params.name;\n      const { variants } = await this.store.loadBrandingVariants();\n      const currentBrandingObj = variants.find(v => v.tags.includes(currentBrandingName));\n      const currentVersion = currentBrandingObj.version;\n      await this.store.saveExistingBranding(currentBranding, currentVersion, tagsOfCurrentVersion);\n      this.router.navigate(\n        ['../../', currentBrandingName, this.activatedRoute.snapshot.routeConfig.path],\n        {\n          relativeTo: this.activatedRoute,\n          replaceUrl: true\n        }\n      );\n      this.alert.success(\n        gettext(\n          'Branding saved. To apply this branding, refresh any open window that might be affected.'\n        )\n      );\n    } catch (e) {\n      this.alert.addServerFailure(e, 'danger');\n      console.warn(e);\n    }\n  }\n\n  cancel() {\n    this.router.navigate(['branding-editor']);\n  }\n\n  async openPreview() {\n    const name = this.activatedRoute.snapshot.params.name;\n    this.store.openPreviewForBranding(name);\n  }\n\n  async markAsActive() {\n    const currentBrandingName = this.activatedRoute.snapshot.params.name;\n    const { variants } = await this.store.loadBrandingVariants();\n    const currentBrandingObj = variants.find(v => v.tags.includes(currentBrandingName));\n    await this.store.markAsActive(currentBrandingObj);\n  }\n\n  async onBrandingVarChanges(value: string) {\n    this.formControl.setValue(value);\n\n    try {\n      const parsedValue: BrandingOptionsJson = JSON.parse(value);\n      const fallbackBranding: BrandingOptionsJson = cloneDeep(\n        await firstValueFrom(this.fallbackBranding$)\n      );\n      this.cleanUpObjects(parsedValue);\n      this.cleanUpObjects(parsedValue.brandingCssVars);\n      for (const key in fallbackBranding) {\n        if (parsedValue[key] === undefined) {\n          parsedValue[key] = fallbackBranding[key];\n        }\n\n        if (typeof parsedValue[key] === 'object' && typeof fallbackBranding[key] === 'object') {\n          parsedValue[key] = Object.assign(fallbackBranding[key], parsedValue[key]);\n        }\n      }\n      this.applyBrandingService.applyBranding(parsedValue);\n      this.newBranding.next(parsedValue);\n    } catch (e) {\n      // not valid JSON;\n    }\n  }\n\n  private cleanUpObjects(value: Record<string, any>) {\n    if (!value) {\n      return;\n    }\n    Object.keys(value).forEach(key => {\n      if (value[key] === null || value[key] === '') {\n        delete value[key];\n      }\n    });\n  }\n}\n","<c8y-title>{{ brandingName$ | async }}</c8y-title>\n\n<c8y-breadcrumb>\n  <c8y-breadcrumb-item\n    [icon]=\"'cog'\"\n    [label]=\"'Settings' | translate\"\n  ></c8y-breadcrumb-item>\n  <c8y-breadcrumb-item\n    [icon]=\"'palette'\"\n    [label]=\"'Branding' | translate\"\n    [path]=\"'/branding-editor'\"\n  ></c8y-breadcrumb-item>\n  <c8y-breadcrumb-item\n    [icon]=\"'cog'\"\n    [label]=\"brandingName$ | async\"\n  ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<div class=\"card card--fullpage content-fullpage\">\n  <div class=\"card-header separator\">\n    <div class=\"card-title\">{{ brandingName$ | async }} — {{ tabName$ | async | translate }}</div>\n  </div>\n  <router-outlet\n    class=\"d-contents\"\n    (activate)=\"routeActivated($event)\"\n  ></router-outlet>\n\n  <div class=\"card-footer separator\">\n    <!-- footer content -->\n    <button\n      class=\"btn btn-default\"\n      data-cy=\"branding-cancel\"\n      (click)=\"cancel()\"\n      translate\n    >\n      Cancel\n    </button>\n    <button\n      class=\"btn btn-primary\"\n      data-cy=\"branding-save\"\n      [disabled]=\"formControl.invalid\"\n      (click)=\"saveBranding()\"\n      translate\n    >\n      Save\n    </button>\n    <button\n      class=\"btn btn-default\"\n      data-cy=\"branding-save-as\"\n      [disabled]=\"formControl.invalid\"\n      (click)=\"openPreview()\"\n      translate\n    >\n      Open preview\n    </button>\n    <button\n      class=\"btn btn-default\"\n      data-cy=\"branding-set-as-latest\"\n      (click)=\"markAsActive()\"\n      [disabled]=\"isGlobalBranding$ | async\"\n      translate\n    >\n      Set as global\n    </button>\n  </div>\n</div>\n","import { Component } from '@angular/core';\nimport { StaticAssetsFileListComponent } from '@c8y/ngx-components/static-assets/modal';\nimport {\n  BreadcrumbComponent,\n  BreadcrumbItemComponent,\n  C8yTranslateDirective,\n  C8yTranslatePipe,\n  ClipboardService,\n  TitleComponent,\n  ActionBarItemComponent,\n  FilesService,\n  GENERIC_FILE_TYPE\n} from '@c8y/ngx-components';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { StaticAsset } from '@c8y/ngx-components/static-assets/data';\nimport { FormsModule } from '@angular/forms';\nimport { TranslateService } from '@ngx-translate/core';\n\n@Component({\n  selector: 'c8y-branding-assets',\n  templateUrl: './branding-assets.component.html',\n  standalone: true,\n  imports: [\n    StaticAssetsFileListComponent,\n    TitleComponent,\n    BreadcrumbComponent,\n    BreadcrumbItemComponent,\n    C8yTranslateDirective,\n    C8yTranslatePipe,\n    ActionBarItemComponent,\n    FormsModule\n  ]\n})\nexport class BrandingAssetsComponent {\n  filterOptions = [\n    {\n      label: gettext('All'),\n      value: []\n    },\n    {\n      label: gettext('Images'),\n      value: this.filesService.mapGenericFileTypesToExtensions([GENERIC_FILE_TYPE.IMAGE])\n    },\n    {\n      label: gettext('Fonts'),\n      value: this.filesService.mapGenericFileTypesToExtensions([GENERIC_FILE_TYPE.FONT])\n    }\n  ];\n  supportedFileExtensions = this.filterOptions[0].value;\n\n  constructor(\n    private clipboard: ClipboardService,\n    private filesService: FilesService,\n    private translate: TranslateService\n  ) {}\n\n  onItemSelected(file: StaticAsset) {\n    const successMessage = this.translate.instant(\n      gettext('Copied asset file path to clipboard. You can use it e.g. in custom CSS.')\n    );\n    this.clipboard.writeText(file.path, { success: successMessage });\n  }\n}\n","<c8y-title>{{ 'Branding assets' | translate }}</c8y-title>\n\n<c8y-breadcrumb>\n  <c8y-breadcrumb-item\n    [icon]=\"'cog'\"\n    [label]=\"'Settings' | translate\"\n  ></c8y-breadcrumb-item>\n  <c8y-breadcrumb-item\n    [icon]=\"'palette'\"\n    [label]=\"'Branding' | translate\"\n  ></c8y-breadcrumb-item>\n  <c8y-breadcrumb-item\n    [icon]=\"'files'\"\n    [label]=\"'Branding assets' | translate\"\n    [path]=\"'/branding-editor/assets'\"\n  ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item [placement]=\"'left'\">\n  <div class=\"c8y-select-wrapper\">\n    <select\n      class=\"form-control\"\n      [(ngModel)]=\"supportedFileExtensions\"\n    >\n      @for (filterOption of filterOptions; track $index) {\n        <option [ngValue]=\"filterOption.value\">\n          {{ filterOption.label | translate }}\n        </option>\n      }\n    </select>\n  </div>\n</c8y-action-bar-item>\n\n<div class=\"card content-fullpage inner-scroll\">\n  <c8y-static-assets-file-list\n    [supportedFileExtensions]=\"supportedFileExtensions\"\n    (itemSelected)=\"onItemSelected($event)\"\n  ></c8y-static-assets-file-list>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.ApplyBrandingToAppService","i1","i2","i3","i4","i5","i6","i7","i8.BrandingImportModalService"],"mappings":"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"}