{"version":3,"file":"ardimedia-angular-portal-azure.mjs","sources":["../../../../projects/ardimedia/angular-portal-azure/src/lib/models/status-bar.model.ts","../../../../projects/ardimedia/angular-portal-azure/src/lib/models/blade.model.ts","../../../../projects/ardimedia/angular-portal-azure/src/lib/models/blade-command.model.ts","../../../../projects/ardimedia/angular-portal-azure/src/lib/models/portal-labels.model.ts","../../../../projects/ardimedia/angular-portal-azure/src/lib/models/blade-data.model.ts","../../../../projects/ardimedia/angular-portal-azure/src/lib/models/blade-nav-item.model.ts","../../../../projects/ardimedia/angular-portal-azure/src/lib/models/tile-definition.model.ts","../../../../projects/ardimedia/angular-portal-azure/src/lib/models/user-account.model.ts","../../../../projects/ardimedia/angular-portal-azure/src/lib/models/notification.model.ts","../../../../projects/ardimedia/angular-portal-azure/src/lib/models/panorama.model.ts","../../../../projects/ardimedia/angular-portal-azure/src/lib/models/avatar-menu.model.ts","../../../../projects/ardimedia/angular-portal-azure/src/lib/models/filter.util.ts","../../../../projects/ardimedia/angular-portal-azure/src/lib/services/portal.service.ts","../../../../projects/ardimedia/angular-portal-azure/src/lib/services/blade-registry.service.ts","../../../../projects/ardimedia/angular-portal-azure/src/lib/services/blade.service.ts","../../../../projects/ardimedia/angular-portal-azure/src/lib/services/provide-blade-router.ts","../../../../projects/ardimedia/angular-portal-azure/src/lib/services/blade-router.service.ts","../../../../projects/ardimedia/angular-portal-azure/src/lib/services/provide-portal-azure.ts","../../../../projects/ardimedia/angular-portal-azure/src/lib/components/tile/tile.component.ts","../../../../projects/ardimedia/angular-portal-azure/src/lib/components/panorama/panorama.component.ts","../../../../projects/ardimedia/angular-portal-azure/src/lib/components/portal-layout/portal-layout.component.ts","../../../../projects/ardimedia/angular-portal-azure/src/lib/components/command-bar/command-bar.component.ts","../../../../projects/ardimedia/angular-portal-azure/src/lib/components/blade/blade.component.ts","../../../../projects/ardimedia/angular-portal-azure/src/lib/components/blade-host/blade-host.component.ts","../../../../projects/ardimedia/angular-portal-azure/src/lib/components/blade-nav/blade-nav.component.ts","../../../../projects/ardimedia/angular-portal-azure/src/lib/components/blade-grid/blade-grid.component.ts","../../../../projects/ardimedia/angular-portal-azure/src/lib/components/blade-detail/blade-detail.component.ts","../../../../projects/ardimedia/angular-portal-azure/src/lib/components/notification-panel/notification-panel.component.ts","../../../../projects/ardimedia/angular-portal-azure/src/lib/components/avatar-menu/avatar-menu.component.ts","../../../../projects/ardimedia/angular-portal-azure/src/lib/components/sidebar/sidebar.component.ts","../../../../projects/ardimedia/angular-portal-azure/src/public-api.ts","../../../../projects/ardimedia/angular-portal-azure/src/ardimedia-angular-portal-azure.ts"],"sourcesContent":["/**\n * Status bar display state for a blade.\n * Ported from UserControlBase.statusBar / statusBarClass in v0.2.346.\n */\nexport interface StatusBarState {\n  /** Status bar text message */\n  text: string;\n  /** CSS class for styling (e.g. 'info', 'error', 'success') */\n  style: StatusBarStyle;\n}\n\nexport type StatusBarStyle = 'none' | 'info' | 'error' | 'success' | 'warning';\n\nexport function clearStatusBar(): StatusBarState {\n  return { text: '', style: 'none' };\n}\n\nexport function statusBarInfo(text: string): StatusBarState {\n  return { text, style: 'info' };\n}\n\nexport function statusBarError(text: string): StatusBarState {\n  return { text, style: 'error' };\n}\n\nexport function statusBarSuccess(text: string): StatusBarState {\n  return { text, style: 'success' };\n}\n","import { signal } from '@angular/core';\nimport { BladeCommand } from './blade-command.model';\nimport { StatusBarState, clearStatusBar } from './status-bar.model';\n\nlet _nextBladeUid = 0;\n/** @internal */\nexport function nextBladeUid(): number { return ++_nextBladeUid; }\n\n/**\n * Base blade definition used by BladeService to manage the blade stack.\n * Ported from Blade class in v0.2.346 — flattened from the UserControlBase → Blade hierarchy.\n *\n * In v0.2.346 this was a class with 18 command boolean groups and deep inheritance.\n * In v0.3.0 commands are a BladeCommand[] array and blade state is managed by the service.\n */\nexport interface BladeDefinition {\n  /** Auto-incrementing unique ID for @for track identity */\n  readonly uid: number;\n  /** Unique path identifying this blade (lowercased) */\n  path: string;\n  /** Blade header title */\n  title: string;\n  /** Blade header subtitle */\n  subtitle: string;\n  /** Blade width in pixels */\n  width: number;\n  /** Whether the blade content uses inner HTML (ng-content) vs structured content */\n  isInnerHtml: boolean;\n  /** Command bar buttons */\n  commands: BladeCommand[];\n  /** Status bar state */\n  statusBar: StatusBarState;\n  /** URL-persisted parameters for this blade (e.g., { id: '1' }) */\n  params: Record<string, string>;\n}\n\n/** Creates a blade definition with sensible defaults.\n *  statusBar and title use getter/setter pairs backed by signals for zoneless change detection. */\nexport function createBlade(path: string, title: string, width: number = 315, params: Record<string, string> = {}, uid?: number): BladeDefinition {\n  const _statusBar = signal<StatusBarState>(clearStatusBar());\n  const _title = signal(title);\n  return {\n    uid: uid ?? nextBladeUid(),\n    path: path.toLowerCase(),\n    get title(): string { return _title(); },\n    set title(value: string) { _title.set(value); },\n    subtitle: '',\n    width,\n    isInnerHtml: true,\n    commands: [],\n    get statusBar(): StatusBarState { return _statusBar(); },\n    set statusBar(value: StatusBarState) { _statusBar.set(value); },\n    params,\n  };\n}\n\n/**\n * Event args for blade navigation.\n * Ported from IAddBladeEventArgs in v0.2.346.\n */\nexport interface AddBladeEventArgs {\n  path: string;\n  pathSender: string;\n}\n","/**\n * Defines a command button in a blade's command bar.\n *\n * Replaces the 18 individual command boolean groups from v0.2.346.\n * Each command has visibility, enabled state, label text, icon, and action callback.\n */\nexport interface BladeCommand {\n  /** Unique key identifying the command (e.g. 'save', 'delete', 'new') */\n  key: string;\n  /** Display text for the command button */\n  label: string;\n  /** Whether the command button is visible */\n  visible: boolean;\n  /** Whether the command button is enabled (clickable) */\n  enabled: boolean;\n  /** SVG icon identifier or CSS class for the command icon */\n  icon?: string;\n  /** Callback executed when the command is clicked (supports async) */\n  action: () => void | Promise<void>;\n}\n\n/**\n * Standard command keys matching the 18 commands from v0.2.346:\n * browse, cancel, copy, delete, document, document2, document3, document4, document5,\n * new, order, restart, save, search, start, stop, swap, excel\n */\nexport type StandardCommandKey =\n  | 'browse' | 'cancel' | 'copy' | 'delete'\n  | 'document' | 'document2' | 'document3' | 'document4' | 'document5'\n  | 'new' | 'order' | 'restart' | 'save' | 'search'\n  | 'start' | 'stop' | 'swap' | 'excel';\n\n/** Creates a command with sensible defaults (visible, enabled, no-op action) */\nexport function createCommand(key: string, label: string, action: () => void | Promise<void>, icon?: string): BladeCommand {\n  return { key, label, visible: true, enabled: true, icon, action };\n}\n","/**\r\n * Localization labels for the angular-portal-azure library.\r\n * All labels default to German (de-CH). Override via PortalConfig.labels.\r\n */\r\nexport interface PortalLabels {\r\n  // CRUD status messages\r\n  loading: string;\r\n  saving: string;\r\n  saved: string;\r\n  deleting: string;\r\n  deleted: string;\r\n  loadError: string;\r\n  saveError: string;\r\n  deleteError: string;\r\n\r\n  // Command bar buttons\r\n  cmdNew: string;\r\n  cmdSave: string;\r\n  cmdDelete: string;\r\n  cmdCancel: string;\r\n\r\n  // Search\r\n  search: string;\r\n\r\n  // Blade actions\r\n  close: string;\r\n\r\n  // Panorama\r\n  noAppsTitle: string;\r\n  noAppsMessage: string;\r\n\r\n  // Notification panel\r\n  closePanel: string;\r\n\r\n  // Appearance\r\n  lightMode: string;\r\n  darkMode: string;\r\n  switchToLight: string;\r\n  switchToDark: string;\r\n\r\n  // Settings dropdown\r\n  settings: string;\r\n  language: string;\r\n  appearance: string;\r\n\r\n  // Unsaved-changes guard\r\n  unsavedChangesConfirm: string;\r\n}\r\n\r\n/** Language preset definition for the built-in language registry. */\r\nexport interface LanguagePreset {\r\n  code: string;\r\n  displayName: string;\r\n  labels: PortalLabels;\r\n}\r\n\r\n// ── Built-in label sets ─────────────────────────────────────────────\r\n\r\n/** German (Switzerland / Liechtenstein) — default */\r\nexport const LABELS_DE_CH: PortalLabels = {\r\n  loading: 'Laden...',\r\n  saving: 'Speichern...',\r\n  saved: 'Gespeichert',\r\n  deleting: 'Löschen...',\r\n  deleted: 'Gelöscht',\r\n  loadError: 'Fehler beim Laden',\r\n  saveError: 'Fehler beim Speichern',\r\n  deleteError: 'Fehler beim Löschen',\r\n  cmdNew: 'Neu',\r\n  cmdSave: 'Speichern',\r\n  cmdDelete: 'Löschen',\r\n  cmdCancel: 'Abbrechen',\r\n  search: 'Suchen...',\r\n  close: 'Schliessen',\r\n  noAppsTitle: 'Keine Applikationen zugeordnet',\r\n  noAppsMessage: 'Wende dich bitte an den Administrator, damit die Applikationen zugeordnet werden können.',\r\n  closePanel: 'Schliessen',\r\n  lightMode: 'Hellmodus',\r\n  darkMode: 'Dunkelmodus',\r\n  switchToLight: 'Zum Hellmodus wechseln',\r\n  switchToDark: 'Zum Dunkelmodus wechseln',\r\n  settings: 'Einstellungen',\r\n  language: 'Sprache',\r\n  appearance: 'Darstellung',\r\n  unsavedChangesConfirm: 'Die Änderungen wurden noch nicht gespeichert. Trotzdem verlassen?',\r\n};\r\n\r\n/** German (Germany) — Swiss spelling rules apply (no ß) */\r\nexport const LABELS_DE_DE: PortalLabels = { ...LABELS_DE_CH };\r\n\r\n/** English */\r\nexport const LABELS_EN: PortalLabels = {\r\n  loading: 'Loading...',\r\n  saving: 'Saving...',\r\n  saved: 'Saved',\r\n  deleting: 'Deleting...',\r\n  deleted: 'Deleted',\r\n  loadError: 'Error loading data',\r\n  saveError: 'Error saving data',\r\n  deleteError: 'Error deleting data',\r\n  cmdNew: 'New',\r\n  cmdSave: 'Save',\r\n  cmdDelete: 'Delete',\r\n  cmdCancel: 'Cancel',\r\n  search: 'Search...',\r\n  close: 'Close',\r\n  noAppsTitle: 'No applications assigned',\r\n  noAppsMessage: 'Please contact the administrator to have applications assigned.',\r\n  closePanel: 'Close',\r\n  lightMode: 'Light mode',\r\n  darkMode: 'Dark mode',\r\n  switchToLight: 'Switch to light mode',\r\n  switchToDark: 'Switch to dark mode',\r\n  settings: 'Settings',\r\n  language: 'Language',\r\n  appearance: 'Appearance',\r\n  unsavedChangesConfirm: 'You have unsaved changes. Leave anyway?',\r\n};\r\n\r\n/** French */\r\nexport const LABELS_FR: PortalLabels = {\r\n  loading: 'Chargement...',\r\n  saving: 'Enregistrement...',\r\n  saved: 'Enregistré',\r\n  deleting: 'Suppression...',\r\n  deleted: 'Supprimé',\r\n  loadError: 'Erreur lors du chargement',\r\n  saveError: 'Erreur lors de l\\'enregistrement',\r\n  deleteError: 'Erreur lors de la suppression',\r\n  cmdNew: 'Nouveau',\r\n  cmdSave: 'Enregistrer',\r\n  cmdDelete: 'Supprimer',\r\n  cmdCancel: 'Annuler',\r\n  search: 'Rechercher...',\r\n  close: 'Fermer',\r\n  noAppsTitle: 'Aucune application attribuée',\r\n  noAppsMessage: 'Veuillez contacter l\\'administrateur pour que les applications soient attribuées.',\r\n  closePanel: 'Fermer',\r\n  lightMode: 'Mode clair',\r\n  darkMode: 'Mode sombre',\r\n  switchToLight: 'Passer au mode clair',\r\n  switchToDark: 'Passer au mode sombre',\r\n  settings: 'Paramètres',\r\n  language: 'Langue',\r\n  appearance: 'Apparence',\r\n  unsavedChangesConfirm: 'Les modifications n\\'ont pas été enregistrées. Quitter quand même ?',\r\n};\r\n\r\n/** Spanish */\r\nexport const LABELS_ES: PortalLabels = {\r\n  loading: 'Cargando...',\r\n  saving: 'Guardando...',\r\n  saved: 'Guardado',\r\n  deleting: 'Eliminando...',\r\n  deleted: 'Eliminado',\r\n  loadError: 'Error al cargar',\r\n  saveError: 'Error al guardar',\r\n  deleteError: 'Error al eliminar',\r\n  cmdNew: 'Nuevo',\r\n  cmdSave: 'Guardar',\r\n  cmdDelete: 'Eliminar',\r\n  cmdCancel: 'Cancelar',\r\n  search: 'Buscar...',\r\n  close: 'Cerrar',\r\n  noAppsTitle: 'No hay aplicaciones asignadas',\r\n  noAppsMessage: 'Póngase en contacto con el administrador para que se asignen las aplicaciones.',\r\n  closePanel: 'Cerrar',\r\n  lightMode: 'Modo claro',\r\n  darkMode: 'Modo oscuro',\r\n  switchToLight: 'Cambiar a modo claro',\r\n  switchToDark: 'Cambiar a modo oscuro',\r\n  settings: 'Configuración',\r\n  language: 'Idioma',\r\n  appearance: 'Apariencia',\r\n  unsavedChangesConfirm: 'Hay cambios sin guardar. ¿Salir de todos modos?',\r\n};\r\n\r\n/** Italian */\r\nexport const LABELS_IT: PortalLabels = {\r\n  loading: 'Caricamento...',\r\n  saving: 'Salvataggio...',\r\n  saved: 'Salvato',\r\n  deleting: 'Eliminazione...',\r\n  deleted: 'Eliminato',\r\n  loadError: 'Errore durante il caricamento',\r\n  saveError: 'Errore durante il salvataggio',\r\n  deleteError: 'Errore durante l\\'eliminazione',\r\n  cmdNew: 'Nuovo',\r\n  cmdSave: 'Salva',\r\n  cmdDelete: 'Elimina',\r\n  cmdCancel: 'Annulla',\r\n  search: 'Cerca...',\r\n  close: 'Chiudi',\r\n  noAppsTitle: 'Nessuna applicazione assegnata',\r\n  noAppsMessage: 'Contattare l\\'amministratore per l\\'assegnazione delle applicazioni.',\r\n  closePanel: 'Chiudi',\r\n  lightMode: 'Modalità chiara',\r\n  darkMode: 'Modalità scura',\r\n  switchToLight: 'Passa alla modalità chiara',\r\n  switchToDark: 'Passa alla modalità scura',\r\n  settings: 'Impostazioni',\r\n  language: 'Lingua',\r\n  appearance: 'Aspetto',\r\n  unsavedChangesConfirm: 'Le modifiche non sono state salvate. Uscire comunque?',\r\n};\r\n\r\n// ── Language preset registry ────────────────────────────────────────\r\n\r\n/** Keep DEFAULT_LABELS as alias for backward compatibility */\r\nexport const DEFAULT_LABELS: PortalLabels = LABELS_DE_CH;\r\n\r\n/** Built-in language presets. Consumers can add custom presets via registerLanguagePreset(). */\r\nexport const LANGUAGE_PRESETS = new Map<string, LanguagePreset>([\r\n  ['de-CH', { code: 'de-CH', displayName: 'Deutsch (CH)', labels: LABELS_DE_CH }],\r\n  ['de-DE', { code: 'de-DE', displayName: 'Deutsch (DE)', labels: LABELS_DE_DE }],\r\n  ['en',    { code: 'en',    displayName: 'English',       labels: LABELS_EN }],\r\n  ['fr',    { code: 'fr',    displayName: 'Français',      labels: LABELS_FR }],\r\n  ['es',    { code: 'es',    displayName: 'Español',       labels: LABELS_ES }],\r\n  ['it',    { code: 'it',    displayName: 'Italiano',      labels: LABELS_IT }],\r\n]);\r\n\r\n/** Register a custom language preset. */\r\nexport function registerLanguagePreset(preset: LanguagePreset): void {\r\n  LANGUAGE_PRESETS.set(preset.code, preset);\r\n}\r\n","import { signal } from '@angular/core';\nimport { BladeDefinition, nextBladeUid } from './blade.model';\nimport { StatusBarState, statusBarInfo, statusBarError, statusBarSuccess, clearStatusBar } from './status-bar.model';\nimport { PortalLabels, DEFAULT_LABELS } from './portal-labels.model';\n\n/**\n * Exception model for API error responses.\n * Ported from Exception / ExceptionDotNet in v0.2.346.\n */\nexport interface ApiException {\n  message: string;\n  status?: number;\n  statusText?: string;\n  data?: Array<{ key: number; value: string }>;\n  validationResults?: Array<{ errorMessage: string; memberNames: string[] }>;\n}\n\n/**\n * Lifecycle hooks for CRUD operations on a blade.\n * Ported from BladeData<T> template method pattern in v0.2.346.\n *\n * Each operation follows the pattern: onBefore → execute → onSuccess | onError\n */\nexport interface BladeDataLifecycle<T> {\n  // Load single item\n  onLoadItem?: () => void;\n  onLoadedItem?: () => void;\n  onLoadItemError?: (ex: ApiException) => void;\n\n  // Load multiple items\n  onLoadItems?: () => void;\n  onLoadedItems?: () => void;\n  onLoadItemsError?: (ex: ApiException) => void;\n\n  // Save item\n  onSaveItem?: () => void;\n  onSavedItem?: () => void;\n  onSaveItemError?: (ex: ApiException) => void;\n\n  // Delete item\n  onDeleteItem?: () => void;\n  onDeletedItem?: () => boolean; // return false to prevent blade close\n  onDeleteItemError?: (ex: ApiException) => void;\n\n  // New item\n  onNewItem?: () => void;\n  onNewedItem?: () => void;\n  onNewItemError?: (ex: ApiException) => void;\n\n  // Execute generic action\n  onExecute?: () => void;\n  onExecuted?: () => void;\n  onExecuteError?: (ex: ApiException) => void;\n\n  // Form validation\n  isFormValid?: () => boolean;\n\n  // Unsaved-changes guard. Return true if the blade has unsaved edits; the BladeService then\n  // asks for confirmation before this blade is closed/replaced or the page is left.\n  // apa-blade-detail wires this automatically from the projected <form> (NgForm.dirty).\n  isDirty?: () => boolean;\n}\n\n/**\n * Extended blade definition for data-driven blades with CRUD operations.\n * Ported from BladeData<T> in v0.2.346.\n */\nexport interface BladeDataDefinition<T> extends BladeDefinition {\n  /** Current item being edited/viewed */\n  item: T;\n  /** List of items (for grid/list blades) */\n  items: T[];\n  /** Whether data is currently being loaded */\n  loading: boolean;\n  /** Lifecycle hooks for CRUD operations */\n  lifecycle: BladeDataLifecycle<T>;\n}\n\n/** Creates a data blade definition with sensible defaults.\n *  statusBar, title, item, items use getter/setter pairs backed by signals for zoneless change detection.\n *  Note: cannot use ...createBlade() spread here — spread copies getter values, not getter/setter pairs. */\nexport function createDataBlade<T>(\n  path: string,\n  title: string,\n  width: number = 315,\n  params: Record<string, string> = {},\n  uid?: number,\n): BladeDataDefinition<T> {\n  const _statusBar = signal<StatusBarState>(clearStatusBar());\n  const _title = signal(title);\n  const _item = signal<T>({} as T);\n  const _items = signal<T[]>([]);\n  const _loading = signal(false);\n  return {\n    uid: uid ?? nextBladeUid(),\n    path: path.toLowerCase(),\n    get title(): string { return _title(); },\n    set title(value: string) { _title.set(value); },\n    subtitle: '',\n    width,\n    isInnerHtml: true,\n    commands: [],\n    get statusBar(): StatusBarState { return _statusBar(); },\n    set statusBar(value: StatusBarState) { _statusBar.set(value); },\n    get item(): T { return _item(); },\n    set item(value: T) { _item.set(value); },\n    get items(): T[] { return _items(); },\n    set items(value: T[]) { _items.set(value); },\n    get loading(): boolean { return _loading(); },\n    set loading(value: boolean) { _loading.set(value); },\n    lifecycle: {},\n    params,\n  };\n}\n\n/**\n * Execute a load-item operation with lifecycle hooks and status bar updates.\n * Replaces the BladeData.loadItem() template method from v0.2.346.\n */\nexport async function executeLoadItem<T>(\n  blade: BladeDataDefinition<T>,\n  loadFn: () => Promise<T>,\n  labels: PortalLabels = DEFAULT_LABELS,\n): Promise<T | void> {\n  blade.lifecycle.onLoadItem?.();\n  blade.statusBar = statusBarInfo(labels.loading);\n  try {\n    const result = await loadFn();\n    blade.item = result;\n    blade.statusBar = clearStatusBar();\n    blade.lifecycle.onLoadedItem?.();\n    return result;\n  } catch (ex) {\n    blade.statusBar = statusBarError((ex as ApiException).message || labels.loadError);\n    blade.lifecycle.onLoadItemError?.(ex as ApiException);\n  }\n}\n\n/**\n * Execute a load-items operation with lifecycle hooks and status bar updates.\n */\nexport async function executeLoadItems<T>(\n  blade: BladeDataDefinition<T>,\n  loadFn: () => Promise<T[]>,\n  labels: PortalLabels = DEFAULT_LABELS,\n): Promise<T[] | void> {\n  blade.lifecycle.onLoadItems?.();\n  blade.loading = true;\n  blade.statusBar = statusBarInfo(labels.loading);\n  try {\n    const result = await loadFn();\n    blade.items = result;\n    blade.statusBar = clearStatusBar();\n    blade.lifecycle.onLoadedItems?.();\n    return result;\n  } catch (ex) {\n    blade.statusBar = statusBarError((ex as ApiException).message || labels.loadError);\n    blade.lifecycle.onLoadItemsError?.(ex as ApiException);\n  } finally {\n    blade.loading = false;\n  }\n}\n\n/**\n * Execute a save-item operation with lifecycle hooks and status bar updates.\n */\nexport async function executeSaveItem<T>(\n  blade: BladeDataDefinition<T>,\n  saveFn: () => Promise<T>,\n  labels: PortalLabels = DEFAULT_LABELS,\n): Promise<T | void> {\n  if (blade.lifecycle.isFormValid && !blade.lifecycle.isFormValid()) {\n    return;\n  }\n  blade.lifecycle.onSaveItem?.();\n  blade.statusBar = statusBarInfo(labels.saving);\n  try {\n    const result = await saveFn();\n    blade.item = result;\n    blade.statusBar = statusBarSuccess(labels.saved);\n    blade.lifecycle.onSavedItem?.();\n    return result;\n  } catch (ex) {\n    blade.statusBar = statusBarError((ex as ApiException).message || labels.saveError);\n    blade.lifecycle.onSaveItemError?.(ex as ApiException);\n  }\n}\n\n/**\n * Execute a delete-item operation with lifecycle hooks and status bar updates.\n * Returns true if the blade should be closed after deletion.\n */\nexport async function executeDeleteItem<T>(\n  blade: BladeDataDefinition<T>,\n  deleteFn: () => Promise<void>,\n  labels: PortalLabels = DEFAULT_LABELS,\n): Promise<boolean> {\n  blade.lifecycle.onDeleteItem?.();\n  blade.statusBar = statusBarInfo(labels.deleting);\n  try {\n    await deleteFn();\n    blade.statusBar = statusBarSuccess(labels.deleted);\n    const shouldClose = blade.lifecycle.onDeletedItem?.() ?? true;\n    return shouldClose;\n  } catch (ex) {\n    blade.statusBar = statusBarError((ex as ApiException).message || labels.deleteError);\n    blade.lifecycle.onDeleteItemError?.(ex as ApiException);\n    return false;\n  }\n}\n","/**\n * Navigation item displayed in a BladeNav component.\n * Ported from BladeNavItem in v0.2.346.\n */\nexport interface BladeNavItem {\n  /** Display title */\n  title: string;\n  /** CSS class for the icon */\n  cssClass?: string;\n  /** Path of the blade to open when clicked */\n  bladePath: string;\n  /** External href link (alternative to bladePath) */\n  hrefPath?: string;\n  /** Comma-separated role names for visibility control */\n  roles?: string;\n  /** Whether this nav item is visible */\n  isVisible: boolean;\n  /** Optional callback executed on click (in addition to navigation) */\n  callback?: () => void;\n  /** Optional badge text (e.g. notification count) */\n  badge?: string;\n}\n\nexport function createNavItem(title: string, bladePath: string, cssClass?: string): BladeNavItem {\n  return { title, bladePath, cssClass, isVisible: true };\n}\n","/**\n * Tile size enum matching v0.2.346 TileSizes.\n * The names are used in CSS class names (e.g. 'fxs-tilesize-normal').\n */\nexport enum TileSize {\n  Small = 'small',\n  Mini = 'mini',\n  Normal = 'normal',\n  HeroWide = 'herowide',\n}\n\n/** Pixel dimensions for each tile size */\nexport const TILE_DIMENSIONS: Record<TileSize, { width: number; height: number }> = {\n  [TileSize.Small]: { width: 90, height: 90 },\n  [TileSize.Mini]: { width: 180, height: 90 },\n  [TileSize.Normal]: { width: 180, height: 180 },\n  [TileSize.HeroWide]: { width: 540, height: 360 },\n};\n\n/**\n * Tile definition for the panorama/startboard.\n * Ported from Tile in v0.2.346.\n */\nexport interface TileDefinition {\n  /** Display title on the tile */\n  title: string;\n  /** Optional subtitle */\n  subtitle?: string;\n  /** Path of the blade to open when the tile is clicked */\n  bladePath: string;\n  /** Tile size (determines CSS class and dimensions) */\n  size: TileSize;\n  /** Optional CSS class for tile icon/content */\n  cssClass?: string;\n  /** Whether the tile is disabled (grayed out, not clickable) */\n  disabled?: boolean;\n}\n\nexport function createTile(title: string, bladePath: string, size: TileSize = TileSize.Normal): TileDefinition {\n  return { title, bladePath, size };\n}\n","/**\n * User account information for the avatar menu.\n * Ported from UserAccount in v0.2.346.\n */\nexport interface UserAccount {\n  userName: string;\n  firstName: string;\n  lastName: string;\n  emailAddress?: string;\n}\n\n/** Computed full name from first and last name */\nexport function getUserDisplayName(account: UserAccount): string {\n  return `${account.firstName || ''} ${account.lastName || ''}`.trim();\n}\n","/**\n * Notification panel definition.\n * Ported from AreaNotification in v0.2.346.\n */\n\n/** Lifecycle hooks for the notification panel */\nexport interface NotificationLifecycle {\n  /** Called before hide; return false to prevent hiding */\n  onHide?: () => boolean;\n  /** Called before showing */\n  onShow?: () => void;\n  /** Called after the panel is shown */\n  onShowed?: () => void;\n}\n\nexport interface NotificationDefinition {\n  /** Path/identifier for the content shown in the notification area */\n  path: string;\n  /** Panel width in pixels (default 250) */\n  width: number;\n  /** Whether the notification panel is currently visible */\n  isVisible: boolean;\n  /** Background color (default '#32383f') */\n  backgroundColor: string;\n  /** Optional lifecycle hooks invoked during show/hide transitions */\n  lifecycle?: NotificationLifecycle;\n}\n\nexport function createNotificationPanel(): NotificationDefinition {\n  return {\n    path: '',\n    width: 250,\n    isVisible: false,\n    backgroundColor: '#32383f',\n  };\n}\n","import { TileDefinition, TileSize, TILE_DIMENSIONS } from './tile-definition.model';\n\n/**\n * Panorama (startboard) definition.\n * Ported from Panorama + Startboard + Tiles in v0.2.346.\n *\n * The panorama is the dashboard view that shows tiles and toggles\n * visibility with the blade area.\n */\nexport interface PanoramaDefinition {\n  /** Portal title displayed in the panorama header */\n  title: string;\n  /** Whether the panorama/startboard is visible (hidden when blades are open) */\n  isVisible: boolean;\n  /** Whether tiles have been loaded */\n  isTilesLoaded: boolean;\n  /** Whether to show tiles at all */\n  showTiles: boolean;\n  /** Hide the tile section if only one tile exists */\n  hideTileIfOnlyOne: boolean;\n  /** Positioned tiles with layout coordinates */\n  tiles: PositionedTile[];\n}\n\n/** A tile with computed layout position (left/top in pixels) */\nexport interface PositionedTile extends TileDefinition {\n  /** Horizontal offset in pixels */\n  left: number;\n  /** Vertical offset in pixels */\n  top: number;\n}\n\n/**\n * Lay out tiles in a flowing grid pattern matching v0.2.346's Tiles.addTile() algorithm.\n * Tiles wrap after 540px width (3 normal tiles or 1 hero-wide tile).\n */\nexport function layoutTiles(tiles: TileDefinition[]): PositionedTile[] {\n  const maxWidth = 720;\n  let nextLeft = 0;\n  let nextTop = 0;\n  let columnHeightMax = 0;\n\n  return tiles.map((tile) => {\n    const dim = TILE_DIMENSIONS[tile.size];\n\n    // Wrap to next row if tile exceeds max width\n    if (nextLeft + dim.width > maxWidth && nextLeft > 0) {\n      nextLeft = 0;\n      nextTop += columnHeightMax;\n      columnHeightMax = 0;\n    }\n\n    const positioned: PositionedTile = {\n      ...tile,\n      left: nextLeft,\n      top: nextTop,\n    };\n\n    nextLeft += dim.width;\n    if (dim.height > columnHeightMax) {\n      columnHeightMax = dim.height;\n    }\n\n    return positioned;\n  });\n}\n\nexport function createPanorama(title: string): PanoramaDefinition {\n  return {\n    title,\n    isVisible: true,\n    isTilesLoaded: false,\n    showTiles: true,\n    hideTileIfOnlyOne: true,\n    tiles: [],\n  };\n}\n","import { UserAccount } from './user-account.model';\n\n/**\n * A single item in the avatar dropdown menu.\n */\nexport interface AvatarMenuItem {\n  /** Display text */\n  label: string;\n  /** Navigation URL. Used when {@link action} is not set; ignored otherwise (use '#'). */\n  href: string;\n  /** Optional icon CSS class, e.g. 'ti ti-settings' */\n  icon?: string;\n  /**\n   * Optional click handler. When set, the item performs this action instead of navigating to\n   * {@link href} (e.g. open a blade). The dropdown closes and the default link navigation is\n   * prevented.\n   */\n  action?: () => void;\n}\n\n/**\n * Avatar menu definition for the user menu in the portal header.\n * Ported from AvatarMenu in v0.2.346.\n */\nexport interface AvatarMenuDefinition {\n  /** The logged-in user's account info */\n  userAccount: UserAccount;\n  /** Whether the avatar dropdown is currently open */\n  isOpen: boolean;\n  /** Menu items shown in the dropdown */\n  items: AvatarMenuItem[];\n}\n\nexport function createAvatarMenu(): AvatarMenuDefinition {\n  return {\n    userAccount: { userName: '', firstName: '', lastName: '' },\n    isOpen: false,\n    items: [],\n  };\n}\n","/**\n * Multi-word search filter for grid/list blades.\n * Ported from BladeGrid.onFilter() in v0.2.346.\n *\n * Splits the search string by spaces and checks if ALL words\n * are found in ANY string property of the item.\n */\nexport function filterItems<T>(items: T[], searchText: string): T[] {\n  if (!searchText || !searchText.trim()) {\n    return items;\n  }\n\n  const words = searchText.toLowerCase().split(/\\s+/).filter(Boolean);\n\n  return items.filter((item) => {\n    const allValues = getAllStringValues(item).toLowerCase();\n    return words.every((word) => allValues.includes(word));\n  });\n}\n\n/** Concatenate all string property values of an object into one searchable string */\nfunction getAllStringValues(obj: unknown): string {\n  if (obj === null || obj === undefined) return '';\n  if (typeof obj === 'string') return obj;\n  if (typeof obj !== 'object') return String(obj);\n\n  return Object.values(obj as Record<string, unknown>)\n    .filter((v) => typeof v === 'string')\n    .join(' ');\n}\n","import { Injectable, signal, computed, WritableSignal } from '@angular/core';\nimport { BladeDefinition } from '../models/blade.model';\nimport { BladeParameter } from '../models/blade-parameter.model';\nimport { PanoramaDefinition, createPanorama, PositionedTile, layoutTiles } from '../models/panorama.model';\nimport { NotificationDefinition, NotificationLifecycle, createNotificationPanel } from '../models/notification.model';\nimport { AvatarMenuDefinition, AvatarMenuItem, createAvatarMenu } from '../models/avatar-menu.model';\nimport { TileDefinition } from '../models/tile-definition.model';\nimport { UserAccount } from '../models/user-account.model';\nimport { PortalConfig } from '../models/portal-config.model';\nimport { PortalLabels, DEFAULT_LABELS, LANGUAGE_PRESETS } from '../models/portal-labels.model';\n\n/**\n * Central state service for the angular-portal-azure library.\n * Replaces v0.2.346's PortalService + Panorama + AreaNotification state.\n *\n * All state is managed via Angular signals for reactive updates.\n */\n@Injectable({ providedIn: 'root' })\nexport class PortalService {\n  private static readonly LANG_STORAGE_KEY = 'apa-language';\n\n  /** Localization labels (defaults to German/de-CH, override via PortalConfig.labels) */\n  readonly labels: WritableSignal<PortalLabels> = signal({ ...DEFAULT_LABELS });\n\n  /** Current language code */\n  readonly currentLanguage: WritableSignal<string> = signal('de-CH');\n\n  /** Whether the settings dropdown is open */\n  readonly isSettingsOpen: WritableSignal<boolean> = signal(false);\n\n  /** The blade stack — ordered left-to-right */\n  readonly blades: WritableSignal<BladeDefinition[]> = signal([]);\n\n  /** Panorama (startboard/dashboard) state */\n  readonly panorama: WritableSignal<PanoramaDefinition> = signal(createPanorama(''));\n\n  /** Notification panel state */\n  readonly notification: WritableSignal<NotificationDefinition> = signal(createNotificationPanel());\n\n  /** Avatar menu state */\n  readonly avatarMenu: WritableSignal<AvatarMenuDefinition> = signal(createAvatarMenu());\n\n  /** Shared parameter for passing data between blades */\n  readonly parameter: WritableSignal<BladeParameter> = signal({ action: 'none', itemId: 0 });\n\n  /** Portal theme identifier */\n  readonly theme: WritableSignal<string> = signal('azure-blue');\n\n  /** Whether the panorama is visible (true when no blades are open) */\n  readonly isPanoramaVisible = computed(() => this.blades().length === 0);\n\n  /** Number of open blades */\n  readonly bladeCount = computed(() => this.blades().length);\n\n  /** Positioned tiles with layout coordinates */\n  readonly positionedTiles = computed(() => {\n    const pano = this.panorama();\n    return pano.tiles;\n  });\n\n  /** Consumer label overrides from PortalConfig — re-applied on every language switch */\n  private _configLabelOverrides: Partial<PortalLabels> = {};\n\n  /**\n   * Initialize the portal with configuration.\n   * Called by providePortalAzure() during app bootstrap.\n   */\n  configure(config: PortalConfig): void {\n    this.panorama.update((p) => ({\n      ...p,\n      title: config.title,\n      tiles: config.tiles ? layoutTiles(config.tiles) : [],\n      isTilesLoaded: !!config.tiles,\n      showTiles: true,\n    }));\n\n    if (config.userAccount) {\n      this.avatarMenu.update((m) => ({\n        ...m,\n        userAccount: config.userAccount!,\n      }));\n    }\n\n    if (config.theme) {\n      this.theme.set(config.theme);\n    }\n\n    // Store consumer label overrides for re-application on language switch\n    if (config.labels) {\n      this._configLabelOverrides = config.labels;\n    }\n\n    // Determine initial language: localStorage → config → browser → default\n    const stored = typeof localStorage !== 'undefined'\n      ? localStorage.getItem(PortalService.LANG_STORAGE_KEY)\n      : null;\n    const langCode = stored || config.language || this.detectBrowserLanguage();\n    this.setLanguage(langCode);\n  }\n\n  // --- Language ---\n\n  /** Switch the active language. Persists to localStorage. */\n  setLanguage(code: string): void {\n    const preset = LANGUAGE_PRESETS.get(code);\n    if (!preset) {\n      console.warn(`[PortalService] Unknown language \"${code}\", falling back to de-CH`);\n      this.setLanguage('de-CH');\n      return;\n    }\n    this.currentLanguage.set(code);\n    this.labels.set({ ...preset.labels, ...this._configLabelOverrides });\n    if (typeof localStorage !== 'undefined') {\n      localStorage.setItem(PortalService.LANG_STORAGE_KEY, code);\n    }\n  }\n\n  /** Detect language from browser, match to closest preset. */\n  private detectBrowserLanguage(): string {\n    if (typeof navigator === 'undefined') return 'de-CH';\n    const browserLang = navigator.language; // e.g. 'de-CH', 'en-US', 'fr'\n\n    // Exact match\n    if (LANGUAGE_PRESETS.has(browserLang)) return browserLang;\n\n    // Base language match (e.g. 'en-US' → 'en', 'de-AT' → 'de-CH')\n    const base = browserLang.split('-')[0];\n    for (const key of LANGUAGE_PRESETS.keys()) {\n      if (key === base || key.startsWith(base + '-')) return key;\n    }\n\n    return 'de-CH';\n  }\n\n  // --- Settings dropdown ---\n\n  /** Toggle settings dropdown. Closes avatar menu if opening. */\n  toggleSettings(): void {\n    const willOpen = !this.isSettingsOpen();\n    this.isSettingsOpen.set(willOpen);\n    if (willOpen) this.closeAvatarMenu();\n  }\n\n  /** Close settings dropdown */\n  closeSettings(): void {\n    this.isSettingsOpen.set(false);\n  }\n\n  /** Update the portal title */\n  setTitle(title: string): void {\n    this.panorama.update((p) => ({ ...p, title }));\n  }\n\n  /** Update the user account */\n  setUserAccount(userAccount: UserAccount): void {\n    this.avatarMenu.update((m) => ({ ...m, userAccount }));\n  }\n\n  /** Clear all blades and return to panorama */\n  clearBlades(): void {\n    this.blades.set([]);\n  }\n\n  /** Set tiles on the startboard */\n  setTiles(tiles: TileDefinition[]): void {\n    this.panorama.update((p) => ({\n      ...p,\n      tiles: layoutTiles(tiles),\n      isTilesLoaded: true,\n    }));\n  }\n\n  /** Set blade parameter for inter-blade communication */\n  setParameter(param: Partial<BladeParameter>): void {\n    this.parameter.update((p) => ({ ...p, ...param }));\n  }\n\n  /** Clear the blade parameter back to defaults */\n  clearParameter(): void {\n    this.parameter.set({ action: 'none', itemId: 0 });\n  }\n\n  // --- Notification panel ---\n\n  /** Show the notification panel */\n  showNotification(path: string, width: number = 250, lifecycle?: NotificationLifecycle): void {\n    lifecycle?.onShow?.();\n    this.notification.update((n) => ({\n      ...n,\n      path,\n      width,\n      isVisible: true,\n      lifecycle,\n    }));\n  }\n\n  /** Hide the notification panel. Aborted if onHide() returns false. */\n  hideNotification(): void {\n    const current = this.notification();\n    if (current.lifecycle?.onHide?.() === false) return;\n    this.notification.update((n) => ({\n      ...n,\n      path: '',\n      isVisible: false,\n      lifecycle: undefined,\n    }));\n  }\n\n  // --- Avatar menu ---\n\n  /** Toggle avatar menu open/close. Closes settings if opening. */\n  toggleAvatarMenu(): void {\n    const willOpen = !this.avatarMenu().isOpen;\n    this.avatarMenu.update((m) => ({ ...m, isOpen: willOpen }));\n    if (willOpen) this.closeSettings();\n  }\n\n  /** Close avatar menu */\n  closeAvatarMenu(): void {\n    this.avatarMenu.update((m) => ({ ...m, isOpen: false }));\n  }\n\n  /** Set avatar menu items */\n  setAvatarMenuItems(items: AvatarMenuItem[]): void {\n    this.avatarMenu.update((m) => ({ ...m, items }));\n  }\n}\n","import { Injectable, Type } from '@angular/core';\r\n\r\n/** Entry in the blade registry: component + optional metadata for URL restoration */\r\nexport interface BladeRegistryEntry {\r\n  component: Type<unknown>;\r\n  title?: string;\r\n  width?: number;\r\n  /** Parameter names this blade expects from the URL (e.g., ['id']) */\r\n  params?: string[];\r\n}\r\n\r\n/**\r\n * Registry for mapping blade paths to Angular components.\r\n *\r\n * Allows consumer apps to register components for blade paths,\r\n * enabling dynamic rendering in BladeHostComponent without\r\n * manual @switch blocks.\r\n *\r\n * Usage in app bootstrap:\r\n * ```typescript\r\n * const registry = inject(BladeRegistry);\r\n * registry.register('customers', CustomerNavComponent);\r\n * registry.register('customers/list', CustomerListComponent, { title: 'All Customers', width: 585 });\r\n * ```\r\n *\r\n * Or register multiple at once:\r\n * ```typescript\r\n * registry.registerAll({\r\n *   'customers': CustomerNavComponent,\r\n *   'customers/list': CustomerListComponent,\r\n * });\r\n * ```\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class BladeRegistry {\r\n  private readonly registry = new Map<string, BladeRegistryEntry>();\r\n\r\n  /** Register a component for a blade path with optional metadata (title, width, params) */\r\n  register(path: string, component: Type<unknown>, metadata?: { title?: string; width?: number; params?: string[] }): void {\r\n    this.registry.set(path.toLowerCase(), { component, ...metadata });\r\n  }\r\n\r\n  /** Register multiple blade path → component mappings */\r\n  registerAll(mappings: Record<string, Type<unknown>>): void {\r\n    for (const [path, component] of Object.entries(mappings)) {\r\n      this.register(path, component);\r\n    }\r\n  }\r\n\r\n  /** Get the component registered for a path, if any */\r\n  get(path: string): Type<unknown> | undefined {\r\n    return this.registry.get(path.toLowerCase())?.component;\r\n  }\r\n\r\n  /** Get the full registry entry (component + metadata) for a path */\r\n  getEntry(path: string): BladeRegistryEntry | undefined {\r\n    return this.registry.get(path.toLowerCase());\r\n  }\r\n\r\n  /** Check if a component is registered for a path */\r\n  has(path: string): boolean {\r\n    return this.registry.has(path.toLowerCase());\r\n  }\r\n}\r\n","import { Injectable, inject } from '@angular/core';\nimport { PortalService } from './portal.service';\nimport { BladeDefinition, createBlade, AddBladeEventArgs } from '../models/blade.model';\nimport { BladeRegistry } from './blade-registry.service';\nimport { DEFAULT_LABELS } from '../models/portal-labels.model';\n\n/**\n * Blade stack management service.\n * Replaces v0.2.346's AreaBlades class.\n *\n * Manages the blade stack: adding, removing, cascade-closing,\n * and panorama visibility toggling.\n *\n * When a BladeRegistry is available, metadata (title, width) from the\n * registry is used as defaults — explicit arguments take precedence.\n */\n@Injectable({ providedIn: 'root' })\nexport class BladeService {\n  private readonly portal = inject(PortalService);\n  private readonly registry = inject(BladeRegistry);\n\n  /**\n   * Unsaved-changes guard registry: blade path -> predicate returning true when the blade has\n   * unsaved edits. Populated by apa-blade-detail (from the projected NgForm). Consulted before a\n   * blade is closed/replaced or the page is left, so the user can confirm discarding changes.\n   * Message can be localised via PortalLabels.unsavedChangesConfirm; the navigation flow is\n   * synchronous, so a synchronous window.confirm is used.\n   */\n  private readonly dirtyChecks = new Map<string, () => boolean>();\n\n  /** Optional override for the confirmation message (defaults to the de-CH label). */\n  unsavedChangesMessage = DEFAULT_LABELS.unsavedChangesConfirm;\n\n  constructor() {\n    // Native browser guard when the whole page/tab is closed or reloaded with unsaved edits.\n    if (typeof window !== 'undefined') {\n      window.addEventListener('beforeunload', (e: BeforeUnloadEvent) => {\n        if (this.anyDirty()) {\n          e.preventDefault();\n          e.returnValue = '';\n        }\n      });\n    }\n  }\n\n  /** Register a blade's unsaved-changes predicate (called by apa-blade-detail). */\n  registerDirtyCheck(path: string, isDirty: () => boolean): void {\n    this.dirtyChecks.set(path.toLowerCase(), isDirty);\n  }\n\n  /** Remove a blade's unsaved-changes predicate (called when the detail is destroyed). */\n  unregisterDirtyCheck(path: string): void {\n    this.dirtyChecks.delete(path.toLowerCase());\n  }\n\n  private isPathDirty(path: string): boolean {\n    const check = this.dirtyChecks.get(path.toLowerCase());\n    try {\n      return check ? check() === true : false;\n    } catch {\n      return false;\n    }\n  }\n\n  private anyDirty(): boolean {\n    for (const path of this.dirtyChecks.keys()) {\n      if (this.isPathDirty(path)) return true;\n    }\n    return false;\n  }\n\n  /**\n   * Returns true if it's OK to proceed with removing the given blade paths: none of them is dirty,\n   * or the user confirmed discarding the changes. Shows one confirmation regardless of how many\n   * dirty blades are affected.\n   */\n  private mayDiscard(removedPaths: string[]): boolean {\n    const anyDirty = removedPaths.some((p) => this.isPathDirty(p));\n    if (!anyDirty) return true;\n    return typeof window === 'undefined' ? true : window.confirm(this.unsavedChangesMessage);\n  }\n\n  /** Drop dirty-check entries for paths that are no longer open. */\n  private pruneDirtyChecks(): void {\n    const open = new Set(this.portal.blades().map((b) => b.path));\n    for (const path of [...this.dirtyChecks.keys()]) {\n      if (!open.has(path)) this.dirtyChecks.delete(path);\n    }\n  }\n\n  /**\n   * Set the first blade (e.g., when opening a top-level item from a tile).\n   * Clears all existing blades, hides panorama, and adds the new blade.\n   *\n   * Ported from AreaBlades.setFirstBlade() in v0.2.346.\n   */\n  setFirstBlade(path: string, title: string = '', width?: number): BladeDefinition {\n    const existing = this.portal.blades();\n    if (existing.length > 0 && !this.mayDiscard(existing.map((b) => b.path))) {\n      return existing[0];\n    }\n    this.dirtyChecks.clear();\n    this.portal.blades.set([]);\n    const entry = this.registry.getEntry(path);\n    const blade = createBlade(\n      path.toLowerCase(),\n      title || entry?.title || path,\n      width ?? entry?.width ?? 315,\n    );\n    this.portal.blades.set([blade]);\n    return blade;\n  }\n\n  /**\n   * Add a blade to the stack. If senderPath is provided, all blades\n   * after the sender are removed first (cascade close).\n   *\n   * Ported from AreaBlades.addBlade() in v0.2.346.\n   */\n  addBlade(path: string, senderPath: string = '', title: string = '', width?: number, params?: Record<string, string>): BladeDefinition | undefined {\n    if (!path) return undefined;\n\n    const normalizedPath = path.toLowerCase();\n\n    // Cascade close first: remove blades after the sender\n    // This ensures a blade at the same path gets recreated with new params\n    if (senderPath) {\n      if (!this.clearChild(senderPath)) return undefined;\n    }\n\n    // Check if blade already exists (after cascade close)\n    const existing = this.portal.blades().find((b) => b.path === normalizedPath);\n    if (existing) {\n      return existing;\n    }\n\n    const entry = this.registry.getEntry(normalizedPath);\n    const blade = createBlade(\n      normalizedPath,\n      title || entry?.title || normalizedPath,\n      width ?? entry?.width ?? 315,\n      params,\n    );\n    this.portal.blades.update((b) => [...b, blade]);\n    return blade;\n  }\n\n  /**\n   * Open a blade from a navigation event (e.g., tile click, nav item click).\n   * Wraps addBlade with AddBladeEventArgs for compatibility.\n   */\n  openBlade(args: AddBladeEventArgs, title: string = '', width?: number): BladeDefinition | undefined {\n    return this.addBlade(args.path, args.pathSender, title, width);\n  }\n\n  /**\n   * Clear all blades. Shows panorama if appropriate.\n   * Ported from AreaBlades.clearAll() in v0.2.346.\n   */\n  clearAll(): void {\n    if (!this.mayDiscard(this.portal.blades().map((b) => b.path))) return;\n    this.portal.blades.set([]);\n    this.dirtyChecks.clear();\n  }\n\n  /**\n   * Remove a specific blade and all blades to its right.\n   * This is what happens when a blade is closed.\n   *\n   * Ported from AreaBlades.clearPath() in v0.2.346.\n   */\n  clearPath(path: string): boolean {\n    const normalizedPath = path.toLowerCase();\n    const blades = this.portal.blades();\n    const index = blades.findIndex((b) => b.path === normalizedPath);\n\n    if (index >= 0) {\n      if (!this.mayDiscard(blades.slice(index).map((b) => b.path))) return false;\n      this.portal.blades.set(blades.slice(0, index));\n      this.pruneDirtyChecks();\n    } else {\n      // Check notification area\n      const notif = this.portal.notification();\n      if (notif.path === normalizedPath) {\n        this.portal.hideNotification();\n      }\n    }\n    return true;\n  }\n\n  /**\n   * Remove all blades AFTER a given path (keeps the blade itself).\n   * Used for cascade close when a blade opens a child.\n   *\n   * Ported from AreaBlades.clearChild() in v0.2.346.\n   */\n  clearChild(path: string): boolean {\n    if (!path) return true;\n\n    const normalizedPath = path.toLowerCase();\n    const blades = this.portal.blades();\n    const index = blades.findIndex((b) => b.path === normalizedPath);\n\n    if (index >= 0) {\n      if (!this.mayDiscard(blades.slice(index + 1).map((b) => b.path))) return false;\n      this.portal.blades.set(blades.slice(0, index + 1));\n      this.pruneDirtyChecks();\n    }\n    return true;\n  }\n\n  /**\n   * Remove blades at and beyond a specific 1-based level.\n   * Ported from AreaBlades.clearLevel() in v0.2.346.\n   */\n  clearLevel(level: number): void {\n    const adjustedLevel = level <= 0 ? 1 : level;\n    const blades = this.portal.blades();\n    if (adjustedLevel <= blades.length) {\n      if (!this.mayDiscard(blades.slice(adjustedLevel - 1).map((b) => b.path))) return;\n      this.portal.blades.set(blades.slice(0, adjustedLevel - 1));\n      this.pruneDirtyChecks();\n    }\n  }\n\n  /**\n   * Remove only the last (rightmost) blade.\n   * Ported from AreaBlades.clearLastLevel() in v0.2.346.\n   */\n  clearLastLevel(): void {\n    const blades = this.portal.blades();\n    if (blades.length > 0) {\n      if (!this.mayDiscard([blades[blades.length - 1].path])) return;\n      this.portal.blades.set(blades.slice(0, -1));\n      this.pruneDirtyChecks();\n    }\n  }\n\n  /**\n   * Close a specific blade by its definition reference.\n   * Removes the blade and all blades to its right.\n   */\n  closeBlade(blade: BladeDefinition): void {\n    this.clearPath(blade.path);\n  }\n\n  /**\n   * Get a blade by path, if it exists in the stack.\n   */\n  getBlade(path: string): BladeDefinition | undefined {\n    return this.portal.blades().find((b) => b.path === path.toLowerCase());\n  }\n\n  /**\n   * Check if a blade with the given path is currently open.\n   */\n  isBladeOpen(path: string): boolean {\n    return this.portal.blades().some((b) => b.path === path.toLowerCase());\n  }\n\n  /**\n   * Get URL-persisted parameters for a blade by path.\n   * Returns empty object if blade not found or has no params.\n   */\n  getBladeParams(path: string): Record<string, string> {\n    return this.getBlade(path)?.params ?? {};\n  }\n}\n","import { EnvironmentProviders, ENVIRONMENT_INITIALIZER, inject, InjectionToken, makeEnvironmentProviders } from '@angular/core';\r\nimport { BladeRouterService } from './blade-router.service';\r\n\r\n/** Configuration for `provideBladeRouter()`. */\r\nexport interface BladeRouterConfig {\r\n  /**\r\n   * Fixed URL prefix for blade path segments.\r\n   *\r\n   * - When omitted, the prefix is read dynamically from the first URL segment (default).\r\n   * - When set to a non-empty string (e.g. `'app'`), that string is used as the fixed prefix.\r\n   * - When set to `''` (empty string), blade paths are encoded directly at the URL root with no prefix.\r\n   */\r\n  prefix?: string;\r\n}\r\n\r\n/** @internal */\r\nexport const BLADE_ROUTER_CONFIG = new InjectionToken<BladeRouterConfig>('BLADE_ROUTER_CONFIG');\r\n\r\n/**\r\n * Enables opt-in URL synchronization for the blade stack.\r\n *\r\n * Add alongside `provideRouter()` and `providePortalAzure()`:\r\n * ```typescript\r\n * export const appConfig: ApplicationConfig = {\r\n *   providers: [\r\n *     provideRouter(routes),\r\n *     providePortalAzure({ title: 'My Portal', ... }),\r\n *     provideBladeRouter(),\r\n *   ],\r\n * };\r\n * ```\r\n *\r\n * Optionally pass a config to set a fixed route prefix:\r\n * ```typescript\r\n * provideBladeRouter({ prefix: 'app' })   // → /app/customers/list\r\n * provideBladeRouter({ prefix: '' })       // → /customers/list (no prefix)\r\n * ```\r\n *\r\n * Without this provider, blade navigation remains purely in-memory.\r\n */\r\nexport function provideBladeRouter(config?: BladeRouterConfig): EnvironmentProviders {\r\n  return makeEnvironmentProviders([\r\n    BladeRouterService,\r\n    { provide: BLADE_ROUTER_CONFIG, useValue: config ?? {} },\r\n    {\r\n      provide: ENVIRONMENT_INITIALIZER,\r\n      multi: true,\r\n      useFactory: () => () => inject(BladeRouterService),\r\n    },\r\n  ]);\r\n}\r\n","import { Injectable, inject, effect, DestroyRef } from '@angular/core';\r\nimport { Router, NavigationEnd } from '@angular/router';\r\nimport { filter } from 'rxjs/operators';\r\nimport { PortalService } from './portal.service';\r\nimport { BladeRegistry } from './blade-registry.service';\r\nimport { BladeDefinition, createBlade } from '../models/blade.model';\r\nimport { BLADE_ROUTER_CONFIG, BladeRouterConfig } from './provide-blade-router';\r\n\r\n/**\r\n * Optional service that syncs the blade stack with the browser URL.\r\n *\r\n * When enabled, blade paths are stored as URL path segments with matrix params:\r\n *   `/crm/customers/list/detail;id=1`\r\n *\r\n * This makes blade states bookmarkable, shareable, and back-button navigable.\r\n *\r\n * Opt-in: add `provideBladeRouter()` to your app providers alongside `provideRouter()`.\r\n * Without it, blade navigation remains purely in-memory (no URL changes).\r\n */\r\n@Injectable()\r\nexport class BladeRouterService {\r\n  private readonly router = inject(Router);\r\n  private readonly portal = inject(PortalService);\r\n  private readonly registry = inject(BladeRegistry);\r\n  private readonly destroyRef = inject(DestroyRef);\r\n  private readonly config: BladeRouterConfig = inject(BLADE_ROUTER_CONFIG, { optional: true }) ?? {};\r\n\r\n  private _syncingFromUrl = false;\r\n  private _initialRestoreDone = false;\r\n\r\n  constructor() {\r\n    // Sync: blade stack changes → URL path segments\r\n    effect(() => {\r\n      const blades = this.portal.blades();\r\n      if (this._syncingFromUrl) return;\r\n      if (blades.length === 0 && !this._initialRestoreDone) return;\r\n\r\n      const prefix = this.getEffectivePrefix();\r\n      const bladePath = this.encodeBladesToPath(blades);\r\n      const targetUrl = prefix\r\n        ? (bladePath ? `/${prefix}/${bladePath}` : `/${prefix}`)\r\n        : (bladePath ? `/${bladePath}` : `/`);\r\n\r\n      const currentPath = this.router.url.split('?')[0].split(';')[0];\r\n      // Only navigate if the path actually changed (avoid loops)\r\n      if (this.normalizeUrl(currentPath) !== this.normalizeUrl(targetUrl)) {\r\n        this.router.navigateByUrl(targetUrl);\r\n      }\r\n    });\r\n\r\n    // Sync: URL path segments → blade stack (on NavigationEnd)\r\n    const sub = this.router.events\r\n      .pipe(filter((e) => e instanceof NavigationEnd))\r\n      .subscribe((e) => {\r\n        this._initialRestoreDone = true;\r\n        const url = (e as NavigationEnd).urlAfterRedirects;\r\n\r\n        // Backward compat: handle legacy ?blades= query param\r\n        const legacyParam = this.extractLegacyBladesParam(url);\r\n        if (legacyParam !== null) {\r\n          this.handleLegacyUrl(legacyParam);\r\n          return;\r\n        }\r\n\r\n        this.restoreFromPath(url);\r\n      });\r\n    this.destroyRef.onDestroy(() => sub.unsubscribe());\r\n  }\r\n\r\n  /**\r\n   * Encode the blade stack into URL path segments.\r\n   * Each blade contributes its \"short name\" (suffix after parent prefix).\r\n   * Blades with params get Angular matrix params appended.\r\n   *\r\n   * Example: [customers, customers/list, customers/detail{id:1}]\r\n   *   → \"customers/list/detail;id=1\"\r\n   */\r\n  private encodeBladesToPath(blades: BladeDefinition[]): string {\r\n    if (blades.length === 0) return '';\r\n\r\n    const segments: string[] = [];\r\n    const allPaths: string[] = [];\r\n\r\n    for (const blade of blades) {\r\n      // Compute short name: strip the longest matching ancestor prefix\r\n      let shortName = blade.path;\r\n      for (let i = allPaths.length - 1; i >= 0; i--) {\r\n        if (blade.path.startsWith(allPaths[i] + '/')) {\r\n          shortName = blade.path.substring(allPaths[i].length + 1);\r\n          break;\r\n        }\r\n      }\r\n\r\n      // Append matrix params if any\r\n      let segment = shortName;\r\n      if (blade.params && Object.keys(blade.params).length > 0) {\r\n        const paramStr = Object.entries(blade.params)\r\n          .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(v)}`)\r\n          .join(';');\r\n        segment += ';' + paramStr;\r\n      }\r\n\r\n      segments.push(segment);\r\n      allPaths.push(blade.path);\r\n    }\r\n\r\n    return segments.join('/');\r\n  }\r\n\r\n  /**\r\n   * Decode URL path segments into blade definitions.\r\n   * Resolves short segment names to full blade paths using the registry.\r\n   *\r\n   * Example: \"customers/list/detail;id=1\" with route prefix \"crm\"\r\n   *   → [customers, customers/list, customers/detail] with detail.params={id:'1'}\r\n   */\r\n  private decodeBladesFromPath(pathAfterPrefix: string): BladeDefinition[] {\r\n    if (!pathAfterPrefix) return [];\r\n\r\n    const rawSegments = pathAfterPrefix.split('/').filter(Boolean);\r\n    const blades: BladeDefinition[] = [];\r\n    const resolvedPaths: string[] = [];\r\n\r\n    for (const rawSegment of rawSegments) {\r\n      // Parse matrix params from segment: \"detail;id=1\" → name=\"detail\", params={id:'1'}\r\n      const { name, params } = this.parseSegment(rawSegment);\r\n\r\n      // Resolve short name to full blade path\r\n      const fullPath = this.resolveSegment(name, resolvedPaths);\r\n      if (!fullPath) {\r\n        console.warn(`[BladeRouter] Could not resolve segment \"${name}\" to a registered blade path`);\r\n        continue;\r\n      }\r\n\r\n      const entry = this.registry.getEntry(fullPath);\r\n      const blade = createBlade(\r\n        fullPath,\r\n        entry?.title ?? fullPath,\r\n        entry?.width ?? 315,\r\n        params,\r\n      );\r\n      blades.push(blade);\r\n      resolvedPaths.push(fullPath);\r\n    }\r\n\r\n    return blades;\r\n  }\r\n\r\n  /**\r\n   * Parse a URL segment into its name and matrix parameters.\r\n   * \"detail;id=1;mode=edit\" → { name: \"detail\", params: { id: \"1\", mode: \"edit\" } }\r\n   */\r\n  private parseSegment(segment: string): { name: string; params: Record<string, string> } {\r\n    const parts = segment.split(';');\r\n    const name = decodeURIComponent(parts[0]);\r\n    const params: Record<string, string> = {};\r\n\r\n    for (let i = 1; i < parts.length; i++) {\r\n      const eqIndex = parts[i].indexOf('=');\r\n      if (eqIndex > 0) {\r\n        const key = decodeURIComponent(parts[i].substring(0, eqIndex));\r\n        const value = decodeURIComponent(parts[i].substring(eqIndex + 1));\r\n        params[key] = value;\r\n      }\r\n    }\r\n\r\n    return { name, params };\r\n  }\r\n\r\n  /**\r\n   * Resolve a short segment name to a full blade path using the registry.\r\n   * Tries parent/segment first, then walks up ancestors.\r\n   */\r\n  private resolveSegment(name: string, previousPaths: string[]): string | null {\r\n    // Direct match: the segment itself is a registered path\r\n    if (this.registry.has(name)) {\r\n      return name.toLowerCase();\r\n    }\r\n\r\n    // Try prepending each previous blade path (most recent first)\r\n    for (let i = previousPaths.length - 1; i >= 0; i--) {\r\n      const candidate = previousPaths[i] + '/' + name;\r\n      if (this.registry.has(candidate)) {\r\n        return candidate.toLowerCase();\r\n      }\r\n    }\r\n\r\n    return null;\r\n  }\r\n\r\n  /** Restore blade stack from a path-based URL */\r\n  private restoreFromPath(url: string): void {\r\n    const prefix = this.getEffectivePrefix();\r\n    const path = url.split('?')[0]; // strip query params\r\n\r\n    let pathAfterPrefix: string;\r\n    if (prefix) {\r\n      const prefixPattern = '/' + prefix;\r\n      if (!path.startsWith(prefixPattern)) return;\r\n      pathAfterPrefix = path.substring(prefixPattern.length + 1); // +1 for trailing /\r\n    } else {\r\n      // No prefix: everything after the leading / is blade path\r\n      pathAfterPrefix = path.substring(1);\r\n    }\r\n    const newBlades = this.decodeBladesFromPath(pathAfterPrefix);\r\n    const currentPaths = this.portal.blades().map((b) => b.path);\r\n    const newPaths = newBlades.map((b) => b.path);\r\n\r\n    // Skip if blade stack already matches (paths and params)\r\n    if (\r\n      newPaths.length === currentPaths.length &&\r\n      newPaths.every((p, i) => p === currentPaths[i]) &&\r\n      this.paramsMatch(newBlades, this.portal.blades())\r\n    ) {\r\n      return;\r\n    }\r\n\r\n    this._syncingFromUrl = true;\r\n    this.portal.blades.set(newBlades);\r\n\r\n    // Restore parameter signal for backward compat (from deepest blade with params)\r\n    const deepestWithParams = [...newBlades].reverse().find((b) => Object.keys(b.params).length > 0);\r\n    if (deepestWithParams && deepestWithParams.params['id']) {\r\n      this.portal.setParameter({\r\n        action: 'edit',\r\n        itemId: Number(deepestWithParams.params['id']) || 0,\r\n      });\r\n    }\r\n\r\n    queueMicrotask(() => (this._syncingFromUrl = false));\r\n  }\r\n\r\n  /** Check if params match between two blade arrays */\r\n  private paramsMatch(a: BladeDefinition[], b: BladeDefinition[]): boolean {\r\n    if (a.length !== b.length) return false;\r\n    return a.every((blade, i) => {\r\n      const aKeys = Object.keys(blade.params);\r\n      const bKeys = Object.keys(b[i].params);\r\n      if (aKeys.length !== bKeys.length) return false;\r\n      return aKeys.every((k) => blade.params[k] === b[i].params[k]);\r\n    });\r\n  }\r\n\r\n  /** Get the route prefix from the current URL (e.g., 'crm' from '/crm/...') */\r\n  private getRoutePrefix(): string {\r\n    const url = this.router.url.split('?')[0];\r\n    const firstSegment = url.split('/').filter(Boolean)[0] ?? '';\r\n    return firstSegment.split(';')[0];\r\n  }\r\n\r\n  /** Normalize URL for comparison (strip trailing slashes) */\r\n  private normalizeUrl(url: string): string {\r\n    return url.replace(/\\/+$/, '') || '/';\r\n  }\r\n\r\n  // --- Legacy backward compatibility ---\r\n\r\n  /** Extract legacy `blades` query parameter from URL */\r\n  private extractLegacyBladesParam(url: string): string | null {\r\n    const qIndex = url.indexOf('?');\r\n    if (qIndex === -1) return null;\r\n    const params = new URLSearchParams(url.substring(qIndex));\r\n    return params.get('blades');\r\n  }\r\n\r\n  /** Handle legacy ?blades= URL by redirecting to new path format */\r\n  private handleLegacyUrl(bladesParam: string): void {\r\n    const paths = bladesParam.split(',').filter(Boolean);\r\n    if (paths.length === 0) return;\r\n\r\n    // Create temporary blades to encode\r\n    const blades = paths.map((path) => {\r\n      const entry = this.registry.getEntry(path);\r\n      return createBlade(path, entry?.title ?? path, entry?.width ?? 315);\r\n    });\r\n\r\n    const prefix = this.getEffectivePrefix();\r\n    const bladePath = this.encodeBladesToPath(blades);\r\n    const newUrl = prefix\r\n      ? (bladePath ? `/${prefix}/${bladePath}` : `/${prefix}`)\r\n      : (bladePath ? `/${bladePath}` : `/`);\r\n\r\n    // Redirect to new format\r\n    this.router.navigateByUrl(newUrl, { replaceUrl: true });\r\n  }\r\n\r\n  /**\r\n   * Return the effective route prefix. If a prefix was configured via\r\n   * `provideBladeRouter({ prefix })`, use it (including empty string).\r\n   * Otherwise fall back to dynamically reading the first URL segment.\r\n   */\r\n  private getEffectivePrefix(): string {\r\n    if (this.config.prefix !== undefined) {\r\n      return this.config.prefix;\r\n    }\r\n    return this.getRoutePrefix();\r\n  }\r\n}\r\n","import { EnvironmentProviders, makeEnvironmentProviders, APP_INITIALIZER, inject } from '@angular/core';\nimport { PortalConfig } from '../models/portal-config.model';\nimport { PortalService } from './portal.service';\n\n/**\n * Provide the angular-portal-azure library configuration.\n *\n * Usage in app.config.ts:\n * ```typescript\n * export const appConfig: ApplicationConfig = {\n *   providers: [\n *     providePortalAzure({\n *       title: 'My Portal',\n *       tiles: [...],\n *       theme: 'azure-blue',\n *     }),\n *   ],\n * };\n * ```\n *\n * New in v0.3.0 — no equivalent in v0.2.346 (which used PortalShell constructor).\n */\nexport function providePortalAzure(config: PortalConfig): EnvironmentProviders {\n  return makeEnvironmentProviders([\n    {\n      provide: APP_INITIALIZER,\n      multi: true,\n      useFactory: () => {\n        const portalService = inject(PortalService);\n        return () => portalService.configure(config);\n      },\n    },\n  ]);\n}\n","import { Component, input, output } from '@angular/core';\nimport { PositionedTile } from '../../models/panorama.model';\n\n/**\n * Individual dashboard tile.\n * Ported from the tile section in home.html (v0.2.346).\n *\n * Usage:\n * ```html\n * <apa-tile [tile]=\"myTile\" (tileClick)=\"onTileClick($event)\" />\n * ```\n */\n@Component({\n  selector: 'apa-tile',\n  standalone: true,\n  styles: [`:host { display: contents; }`],\n  template: `\n    <section\n      class=\"fxs-tile fx-rightClick fxs-flowlayout-element\"\n      [class.fxs-tilesize-normal]=\"tile().size === 'normal'\"\n      [class.fxs-tilesize-mini]=\"tile().size === 'mini'\"\n      [class.fxs-tilesize-herowide]=\"tile().size === 'herowide'\"\n      [class.fxs-tilesize-small]=\"tile().size === 'small'\">\n      <div class=\"fxs-part\"\n           [class.fxs-part-clickable]=\"!tile().disabled\"\n           role=\"button\"\n           [attr.tabindex]=\"tile().disabled ? -1 : 0\"\n           [attr.aria-label]=\"tile().title\"\n           [attr.aria-disabled]=\"tile().disabled || null\"\n           (click)=\"onClick()\"\n           (keydown.enter)=\"onClick()\"\n           (keydown.space)=\"onClick(); $event.preventDefault()\"\n           [style.cursor]=\"tile().disabled ? 'default' : 'pointer'\"\n           [style.opacity]=\"tile().disabled ? 0.45 : 1\">\n        <header class=\"fxs-part-title\">\n          <h2 class=\"msportalfx-tooltip-overflow\">{{ tile().title }}</h2>\n          @if (tile().subtitle) {\n            <h3 class=\"msportalfx-tooltip-overflow\">{{ tile().subtitle }}</h3>\n          }\n        </header>\n        <section class=\"fxs-part-content css-scope-HubsExtension\"></section>\n      </div>\n      <div class=\"fxs-tile-overlay\"></div>\n    </section>\n  `,\n})\nexport class TileComponent {\n  readonly tile = input.required<PositionedTile>();\n  readonly tileClick = output<PositionedTile>();\n\n  onClick(): void {\n    if (!this.tile().disabled) {\n      this.tileClick.emit(this.tile());\n    }\n  }\n}\n","import { Component, inject, input, output } from '@angular/core';\nimport { PortalService } from '../../services/portal.service';\nimport { BladeService } from '../../services/blade.service';\nimport { TileComponent } from '../tile/tile.component';\nimport { PositionedTile } from '../../models/panorama.model';\n\n/**\n * Panorama (startboard/dashboard) component.\n * Ported from the fxs-panorama-homearea section in home.html (v0.2.346).\n *\n * Displays tiles on the startboard. When a tile is clicked, it opens\n * the first blade via BladeService.setFirstBlade().\n *\n * When `autoNavigate` is true (default), clicking a tile automatically\n * opens the first blade. Set it to false to handle tile clicks manually\n * via the `(tileClick)` output.\n *\n * Usage:\n * ```html\n * <apa-panorama />\n * <apa-panorama [autoNavigate]=\"false\" (tileClick)=\"onTileClick($event)\" />\n * ```\n */\n@Component({\n  selector: 'apa-panorama',\n  standalone: true,\n  imports: [TileComponent],\n  styles: [`:host { display: contents; }`],\n  template: `\n    @if (portal.isPanoramaVisible()) {\n      <div class=\"fxs-panorama-homearea\" [class.collapsed]=\"!panorama().showTiles\">\n        <div class=\"fxs-startboard-target fxs-startboard fx-rightClick\" [class.collapsed]=\"!panorama().showTiles\">\n          @if (panorama().tiles.length === 0 && panorama().isTilesLoaded) {\n            <div class=\"fxs-part fxs-part-clickable\" style=\"background-color:var(--apa-surface-raised); padding:25px; max-width:800px; margin-bottom:15px; height:auto;\">\n              <header class=\"fxs-part-title\" style=\"color:var(--apa-text)\">\n                <h3 class=\"msportalfx-tooltip-overflow\">{{ portal.labels().noAppsTitle }}</h3>\n                <p class=\"msportalfx-tooltip-overflow\" style=\"margin:0;padding:0\">\n                  {{ portal.labels().noAppsMessage }}\n                </p>\n              </header>\n            </div>\n          }\n          <div class=\"fxs-startboard-layout fxs-flowlayout\">\n            <div class=\"fxs-flowlayout-childcontainer\">\n              @for (tile of panorama().tiles; track tile.bladePath) {\n                <apa-tile [tile]=\"tile\" (tileClick)=\"onTileClick($event)\" />\n              }\n            </div>\n          </div>\n        </div>\n      </div>\n    }\n  `,\n})\nexport class PanoramaComponent {\n  protected readonly portal = inject(PortalService);\n  private readonly bladeService = inject(BladeService);\n\n  /** When false, tile clicks only emit tileClick without opening a blade. */\n  readonly autoNavigate = input(true);\n\n  /** Emitted when a tile is clicked (always, regardless of autoNavigate). */\n  readonly tileClick = output<PositionedTile>();\n\n  protected panorama = this.portal.panorama;\n\n  onTileClick(tile: PositionedTile): void {\n    this.tileClick.emit(tile);\n    if (this.autoNavigate()) {\n      this.bladeService.setFirstBlade(tile.bladePath, tile.title);\n    }\n  }\n}\n","import { Component, inject, signal, ElementRef, afterNextRender, effect, Injector, DestroyRef } from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\nimport { PortalService } from '../../services/portal.service';\nimport { getUserDisplayName } from '../../models/user-account.model';\nimport { AvatarMenuItem } from '../../models/avatar-menu.model';\nimport { LANGUAGE_PRESETS, LanguagePreset } from '../../models/portal-labels.model';\n\n/**\n * Root portal shell component.\n * Ported from the fxs-portal structure in home.html (v0.2.346).\n *\n * Provides the top bar (with portal title, settings gear, and avatar menu),\n * and the main content area. Child components (panorama, blade-host,\n * notification-panel) are projected via content projection.\n *\n * Usage:\n * ```html\n * <apa-portal-layout>\n *   <apa-panorama />\n *   <apa-blade-host />\n * </apa-portal-layout>\n * ```\n */\n@Component({\n  selector: 'apa-portal-layout',\n  standalone: true,\n  template: `\n    <div class=\"fxs-portal fxs-theme-blue\">\n      <!-- Top bar -->\n      <header class=\"fxs-topbar\" role=\"banner\">\n        <div style=\"padding-left:25px;\">\n          <a href=\"#\" class=\"fxs-topbar-home fxs-has-hover\" (click)=\"onHomeClick($event)\">\n            {{ portal.panorama().title }}\n          </a>\n        </div>\n        <div style=\"display:flex; align-items:center; gap:12px; padding-right:10px;\">\n          <!-- Settings gear -->\n          <div class=\"apa-settings-container\" style=\"position:relative;\">\n            <button class=\"apa-settings-trigger fxs-has-hover\"\n                    (click)=\"portal.toggleSettings()\"\n                    [attr.aria-label]=\"portal.labels().settings\"\n                    [attr.title]=\"portal.labels().settings\"\n                    [attr.aria-expanded]=\"portal.isSettingsOpen()\"\n                    aria-haspopup=\"true\">\n              <i class=\"ti ti-settings\" aria-hidden=\"true\"></i>\n            </button>\n            @if (portal.isSettingsOpen()) {\n              <div class=\"apa-settings-dropdown\" role=\"menu\">\n                <!-- Appearance -->\n                <div class=\"apa-settings-section-header\">{{ portal.labels().appearance }}</div>\n                <button class=\"apa-settings-item\" role=\"menuitem\" (click)=\"toggleDarkMode()\">\n                  <i [class]=\"isDark() ? 'ti ti-sun' : 'ti ti-moon'\" aria-hidden=\"true\"></i>\n                  <span>{{ isDark() ? portal.labels().lightMode : portal.labels().darkMode }}</span>\n                </button>\n                <!-- Language -->\n                <div class=\"apa-settings-section-header\">{{ portal.labels().language }}</div>\n                @for (lang of availableLanguages; track lang.code) {\n                  <button class=\"apa-settings-item\" role=\"menuitem\"\n                          [class.apa-settings-item-active]=\"lang.code === portal.currentLanguage()\"\n                          (click)=\"switchLanguage(lang.code)\">\n                    <span>{{ lang.displayName }}</span>\n                    @if (lang.code === portal.currentLanguage()) {\n                      <i class=\"ti ti-check\" aria-hidden=\"true\"></i>\n                    }\n                  </button>\n                }\n              </div>\n            }\n          </div>\n          <!-- Avatar menu -->\n          <div class=\"fxs-avatarmenu-tenant-container\" style=\"position:relative;\">\n            <a class=\"apa-avatar-trigger fxs-has-hover\"\n               role=\"button\"\n               tabindex=\"0\"\n               [attr.aria-expanded]=\"portal.avatarMenu().isOpen\"\n               aria-haspopup=\"true\"\n               (click)=\"portal.toggleAvatarMenu()\"\n               (keydown.enter)=\"portal.toggleAvatarMenu()\"\n               (keydown.space)=\"portal.toggleAvatarMenu()\">\n              <span class=\"apa-avatar-initials\" aria-hidden=\"true\">{{ initials() }}</span>\n              <span class=\"apa-avatar-info\">\n                <span class=\"apa-avatar-name\">{{ displayName() }}</span>\n                <span class=\"apa-avatar-email\">{{ portal.avatarMenu().userAccount.userName }}</span>\n              </span>\n              <i class=\"ti\" [class.ti-chevron-down]=\"!portal.avatarMenu().isOpen\"\n                            [class.ti-chevron-up]=\"portal.avatarMenu().isOpen\"\n                            aria-hidden=\"true\"></i>\n            </a>\n            @if (portal.avatarMenu().isOpen && portal.avatarMenu().items.length > 0) {\n              <div class=\"apa-avatar-dropdown\" role=\"menu\">\n                @for (item of portal.avatarMenu().items; track item.label) {\n                  <a class=\"apa-avatar-dropdown-item\" role=\"menuitem\" [href]=\"item.href\"\n                     (click)=\"onAvatarItemClick(item, $event)\">\n                    @if (item.icon) {\n                      <i [class]=\"item.icon\" aria-hidden=\"true\"></i>\n                    }\n                    <span>{{ item.label }}</span>\n                  </a>\n                }\n              </div>\n            }\n          </div>\n        </div>\n      </header>\n      <!-- Main content area -->\n      <main class=\"fxs-portal-content fxs-panorama\"\n            [style.margin-right.px]=\"notificationMargin()\">\n        <ng-content />\n      </main>\n      <!-- Footer -->\n      <div class=\"fxs-portal-footer\"></div>\n    </div>\n  `,\n})\nexport class PortalLayoutComponent {\n  protected readonly portal = inject(PortalService);\n  private static readonly STORAGE_KEY = 'apa-dark-mode';\n  private readonly document = inject(DOCUMENT);\n  private readonly elementRef = inject(ElementRef);\n  private readonly injector = inject(Injector);\n  private readonly destroyRef = inject(DestroyRef);\n  protected readonly isDark = signal(false);\n\n  /** Available languages from the preset registry */\n  protected readonly availableLanguages: { code: string; displayName: string }[] =\n    Array.from(LANGUAGE_PRESETS.values()).map((p) => ({ code: p.code, displayName: p.displayName }));\n\n  /**\n   * Handle an avatar dropdown item click. If the item defines an action (e.g. open a blade), run it\n   * and suppress the default link navigation; otherwise let the href navigate normally.\n   */\n  protected onAvatarItemClick(item: AvatarMenuItem, event: Event): void {\n    this.portal.closeAvatarMenu();\n    if (item.action) {\n      event.preventDefault();\n      item.action();\n    }\n  }\n\n  constructor() {\n    const stored = localStorage.getItem(PortalLayoutComponent.STORAGE_KEY);\n    const dark = stored === 'true';\n    this.applyTheme(dark);\n\n    // Scroll to the last blade whenever the blade stack changes\n    const injector = this.injector;\n    effect(() => {\n      const blades = this.portal.blades();\n      if (blades.length === 0) return;\n      afterNextRender(() => {\n        this.scrollToLastBlade();\n      }, { injector });\n    });\n\n    // Click-outside handler for dropdowns\n    afterNextRender(() => {\n      const handler = (event: Event) => {\n        const target = event.target as Node;\n        const settingsEl = this.elementRef.nativeElement.querySelector('.apa-settings-container');\n        const avatarEl = this.elementRef.nativeElement.querySelector('.fxs-avatarmenu-tenant-container');\n        if (settingsEl && !settingsEl.contains(target)) {\n          this.portal.closeSettings();\n        }\n        if (avatarEl && !avatarEl.contains(target)) {\n          this.portal.closeAvatarMenu();\n        }\n      };\n      this.document.addEventListener('click', handler);\n\n      // Escape key closes open dropdowns\n      const keyHandler = (event: KeyboardEvent) => {\n        if (event.key === 'Escape') {\n          if (this.portal.isSettingsOpen()) {\n            this.portal.closeSettings();\n            event.preventDefault();\n          }\n          if (this.portal.avatarMenu().isOpen) {\n            this.portal.closeAvatarMenu();\n            event.preventDefault();\n          }\n        }\n      };\n      this.document.addEventListener('keydown', keyHandler);\n\n      this.destroyRef.onDestroy(() => {\n        this.document.removeEventListener('click', handler);\n        this.document.removeEventListener('keydown', keyHandler);\n      });\n    }, { injector: this.injector });\n  }\n\n  protected toggleDarkMode(): void {\n    const dark = !this.isDark();\n    localStorage.setItem(PortalLayoutComponent.STORAGE_KEY, String(dark));\n    this.applyTheme(dark);\n  }\n\n  protected switchLanguage(code: string): void {\n    this.portal.setLanguage(code);\n  }\n\n  private applyTheme(dark: boolean): void {\n    this.isDark.set(dark);\n    this.document.documentElement.classList.toggle('apa-dark', dark);\n    this.document.documentElement.classList.toggle('apa-light', !dark);\n  }\n\n  protected displayName(): string {\n    const account = this.portal.avatarMenu().userAccount;\n    return getUserDisplayName(account);\n  }\n\n  protected initials(): string {\n    const a = this.portal.avatarMenu().userAccount;\n    const f = (a.firstName || '')[0] || '';\n    const l = (a.lastName || '')[0] || '';\n    return (f + l).toUpperCase() || '?';\n  }\n\n  protected notificationMargin(): number {\n    const notif = this.portal.notification();\n    return notif.isVisible ? notif.width : 0;\n  }\n\n  protected onHomeClick(event: Event): void {\n    event.preventDefault();\n    this.portal.clearBlades();\n  }\n\n  private scrollToLastBlade(): void {\n    const scrollContainer = this.elementRef.nativeElement.querySelector('.fxs-portal-content');\n    if (!scrollContainer) return;\n\n    const bladeElements = scrollContainer.querySelectorAll('.azureportalblade');\n    if (bladeElements.length === 0) return;\n\n    const lastBlade = bladeElements[bladeElements.length - 1] as HTMLElement;\n    const scrollRect = scrollContainer.getBoundingClientRect();\n    const bladeRect = lastBlade.getBoundingClientRect();\n\n    // Blade is already fully visible — no scroll needed\n    if (bladeRect.left >= scrollRect.left && bladeRect.right <= scrollRect.right) {\n      return;\n    }\n\n    const currentScroll = scrollContainer.scrollLeft;\n    const viewportWidth = scrollContainer.clientWidth;\n\n    let targetScroll: number;\n\n    if (bladeElements.length >= 2) {\n      // Use the previous blade's right edge (= where the new blade starts)\n      const prevBlade = bladeElements[bladeElements.length - 2] as HTMLElement;\n      const prevRect = prevBlade.getBoundingClientRect();\n      // Distance from viewport's left edge to the previous blade's right edge\n      const delta = prevRect.right - scrollRect.left;\n      targetScroll = currentScroll + delta;\n    } else {\n      // First blade — scroll to show it\n      targetScroll = currentScroll + (bladeRect.left - scrollRect.left);\n    }\n\n    // Cap scroll movement to at most one viewport width\n    targetScroll = Math.min(targetScroll, currentScroll + viewportWidth);\n\n    scrollContainer.scrollTo({ left: targetScroll, behavior: 'smooth' });\n  }\n}\n","import { Component, input } from '@angular/core';\nimport { BladeCommand } from '../../models/blade-command.model';\n\n/**\n * Command bar for a blade.\n * Ported from the fxs-commandBar section in blade.html (v0.2.346).\n *\n * Replaces the 18 individual command buttons with a dynamic BladeCommand[] array.\n *\n * Usage:\n * ```html\n * <apa-command-bar [commands]=\"blade.commands\" />\n * ```\n */\n@Component({\n  selector: 'apa-command-bar',\n  standalone: true,\n  styles: [`:host { display: block; }`],\n  template: `\n    <nav class=\"fxs-commandBar\" role=\"toolbar\" aria-label=\"Commands\">\n      <ul class=\"fxs-commandBar-itemList\" role=\"list\">\n        @for (cmd of visibleCommands(); track cmd.key) {\n          <li role=\"listitem\">\n            <a class=\"fxs-commandBar-item\"\n               role=\"button\"\n               [tabindex]=\"cmd.enabled ? 0 : -1\"\n               [class.apa-disable-click]=\"!cmd.enabled\"\n               [attr.aria-disabled]=\"!cmd.enabled\"\n               [attr.aria-label]=\"cmd.label\"\n               (click)=\"onCommand(cmd)\"\n               (keydown.enter)=\"onCommand(cmd)\"\n               (keydown.space)=\"onCommand(cmd)\">\n              <span class=\"fxs-commandBar-item-text\">{{ cmd.label }}</span>\n              @if (cmd.icon) {\n                <span class=\"fxs-commandBar-item-icon apa-commandbar-icon\" aria-hidden=\"true\">\n                  <span [class]=\"cmd.icon\"></span>\n                </span>\n              }\n            </a>\n          </li>\n        }\n      </ul>\n    </nav>\n  `,\n})\nexport class CommandBarComponent {\n  readonly commands = input<BladeCommand[]>([]);\n\n  visibleCommands(): BladeCommand[] {\n    return this.commands().filter((c) => c.visible);\n  }\n\n  onCommand(cmd: BladeCommand): void {\n    if (cmd.enabled && cmd.action) {\n      const result = cmd.action();\n      if (result instanceof Promise) {\n        result.catch((err) => console.error(`[CommandBar] Command \"${cmd.key}\" failed:`, err));\n      }\n    }\n  }\n}\n","import { Component, input, output, inject } from '@angular/core';\nimport { BladeDefinition } from '../../models/blade.model';\nimport { BladeService } from '../../services/blade.service';\nimport { PortalService } from '../../services/portal.service';\nimport { CommandBarComponent } from '../command-bar/command-bar.component';\n\n/**\n * Blade chrome component — the visual container for a single blade.\n * Ported from blade.html (v0.2.346).\n *\n * Renders the blade header (status bar, close/maximize buttons, title,\n * command bar) and projects blade content via <ng-content>.\n *\n * Usage:\n * ```html\n * <apa-blade [blade]=\"myBlade\">\n *   <p>Blade content here</p>\n * </apa-blade>\n * ```\n */\n@Component({\n  selector: 'apa-blade',\n  standalone: true,\n  imports: [CommandBarComponent],\n  styles: [`:host { display: block; height: 100%; }`],\n  template: `\n    <section class=\"fxs-blade-locked fxs-blade fx-rightClick fxs-bladesize-small\"\n             role=\"region\"\n             [attr.aria-label]=\"blade().title\"\n             [style.width.px]=\"blade().width\">\n      <!-- Header -->\n      <header class=\"fxs-blade-header\">\n        <!-- Status bar -->\n        <div class=\"fxs-blade-statusbar-wrapper\">\n          <div class=\"fxs-blade-statusbar\"\n               role=\"status\"\n               aria-live=\"polite\"\n               [class.apa-statusbar-info]=\"blade().statusBar.style === 'info'\"\n               [class.apa-statusbar-error]=\"blade().statusBar.style === 'error' || blade().statusBar.style === 'warning'\"\n               [class.apa-statusbar-success]=\"blade().statusBar.style === 'success'\">\n            {{ blade().statusBar.text }}\n          </div>\n        </div>\n\n        <!-- Action buttons -->\n        <div class=\"fxs-blade-actions\">\n          <button (click)=\"onClose()\"\n                  [title]=\"portal.labels().close\"\n                  [attr.aria-label]=\"portal.labels().close + ' ' + blade().title\">\n            <svg viewBox=\"0 0 11 11\" role=\"presentation\" focusable=\"false\" xmlns=\"http://www.w3.org/2000/svg\">\n              <g>\n                <polygon class=\"msportal-fx-svg-placeholder\" points=\"10.4,1.4 9.6,0.6 5.5,4.7 1.4,0.6 0.6,1.4 4.7,5.5 0.6,9.6 1.4,10.4 5.5,6.3 9.6,10.4 10.4,9.6 6.3,5.5\"/>\n              </g>\n            </svg>\n          </button>\n        </div>\n\n        <!-- Title -->\n        <div class=\"fxs-blade-title\">\n          <div class=\"fxs-blade-title-text-container\">\n            <h2>{{ blade().title }}</h2>\n            @if (blade().subtitle) {\n              <h3>{{ blade().subtitle }}</h3>\n            }\n          </div>\n        </div>\n\n        <!-- Command bar -->\n        <div class=\"fxs-blade-commandBarContainer\">\n          <apa-command-bar [commands]=\"blade().commands\" />\n        </div>\n      </header>\n\n      <!-- Content area -->\n      <div class=\"fxs-blade-content fxs-pannable\">\n        <div class=\"fxs-blade-stacklayout\">\n          <div class=\"fxs-stacklayout-child\">\n            <ng-content />\n          </div>\n        </div>\n      </div>\n    </section>\n  `,\n})\nexport class BladeComponent {\n  readonly blade = input.required<BladeDefinition>();\n  readonly bladeClose = output<BladeDefinition>();\n\n  protected readonly portal = inject(PortalService);\n  private readonly bladeService = inject(BladeService);\n\n  onClose(): void {\n    const b = this.blade();\n    this.bladeClose.emit(b);\n    this.bladeService.closeBlade(b);\n  }\n}\n","import { Component, inject, input } from '@angular/core';\nimport { NgComponentOutlet } from '@angular/common';\nimport { PortalService } from '../../services/portal.service';\nimport { BladeRegistry } from '../../services/blade-registry.service';\nimport { BladeComponent } from '../blade/blade.component';\n\n/**\n * Blade host — renders the blade stack (journey area).\n * Ported from the apa-blade-area section in home.html (v0.2.346).\n *\n * Each blade in the stack is rendered horizontally. When a new blade\n * is added, the portal layout scrolls to show it.\n *\n * If a component is registered via BladeRegistry for a blade path,\n * it is rendered dynamically via ngComponentOutlet. Otherwise,\n * the blade path is shown as fallback text.\n *\n * Usage:\n * ```html\n * <!-- Default: each component is wrapped in <apa-blade> -->\n * <apa-blade-host />\n *\n * <!-- No wrapper: components render directly (they manage their own blade chrome) -->\n * <apa-blade-host [wrapBlade]=\"false\" />\n * ```\n */\n@Component({\n  selector: 'apa-blade-host',\n  standalone: true,\n  imports: [BladeComponent, NgComponentOutlet],\n  styles: [`:host { display: block; height: 100%; }`],\n  template: `\n    <div id=\"apa-blade-area\" class=\"fxs-journey-target fxs-journey\">\n      <div class=\"fxs-journey-layout fxs-stacklayout fxs-stacklayout-horizontal\">\n        @for (blade of portal.blades(); track blade.uid) {\n          <div class=\"azureportalblade fxs-stacklayout-child\">\n            @if (wrapBlade()) {\n              <apa-blade [blade]=\"blade\">\n                @if (getComponent(blade.path); as component) {\n                  <ng-container *ngComponentOutlet=\"component\" />\n                } @else {\n                  <p style=\"padding:25px; color:var(--apa-text-secondary);\">{{ blade.path }}</p>\n                }\n              </apa-blade>\n            } @else {\n              @if (getComponent(blade.path); as component) {\n                <ng-container *ngComponentOutlet=\"component\" />\n              } @else {\n                <p style=\"padding:25px; color:var(--apa-text-secondary);\">{{ blade.path }}</p>\n              }\n            }\n          </div>\n        }\n      </div>\n    </div>\n  `,\n})\nexport class BladeHostComponent {\n  /** Whether to wrap each component in an `<apa-blade>` element. Default: true. */\n  readonly wrapBlade = input(true);\n\n  protected readonly portal = inject(PortalService);\n  private readonly registry = inject(BladeRegistry);\n\n  getComponent(path: string) {\n    return this.registry.get(path) ?? null;\n  }\n}\n","import { Component, input, inject } from '@angular/core';\nimport { BladeNavItem } from '../../models/blade-nav-item.model';\nimport { BladeService } from '../../services/blade.service';\n\n/**\n * Navigation blade content — renders a list of nav items.\n * Ported from nav.html (v0.2.346).\n *\n * Each nav item shows an icon and title. Clicking a row opens\n * the target blade via BladeService.\n *\n * Usage:\n * ```html\n * <apa-blade [blade]=\"navBlade\">\n *   <apa-blade-nav [items]=\"navItems\" [senderPath]=\"navBlade.path\" />\n * </apa-blade>\n * ```\n */\n@Component({\n  selector: 'apa-blade-nav',\n  standalone: true,\n  styles: [`:host { display: flex; flex-direction: column; flex: 1; }`],\n  template: `\n    <table class=\"azc-grid-full azc-grid-multiselectable\" role=\"grid\" aria-label=\"Navigation\">\n      <colgroup>\n        <col class=\"col0\" style=\"width:28px;\">\n        <col class=\"col1\">\n      </colgroup>\n      <tbody class=\"azc-grid-groupdata\" role=\"rowgroup\">\n        @for (item of visibleItems(); track item.bladePath) {\n          <tr role=\"row\" style=\"cursor:pointer\"\n              [attr.aria-label]=\"item.title\"\n              (click)=\"onItemClick(item)\"\n              (keydown.enter)=\"onItemClick(item)\">\n            <td class=\"msportalfx-gridcolumn-asseticon\" role=\"gridcell\" aria-hidden=\"true\">\n              @if (item.cssClass) {\n                <i [class]=\"item.cssClass\"></i>\n              }\n            </td>\n            <td tabindex=\"0\" role=\"gridcell\">\n              @if (item.hrefPath) {\n                <a [href]=\"item.hrefPath\" target=\"_blank\" rel=\"noopener noreferrer\">{{ item.title }}</a>\n              } @else {\n                <span>{{ item.title }}</span>\n              }\n            </td>\n          </tr>\n        }\n      </tbody>\n    </table>\n  `,\n})\nexport class BladeNavComponent {\n  readonly items = input<BladeNavItem[]>([]);\n  readonly senderPath = input<string>('');\n\n  private readonly bladeService = inject(BladeService);\n\n  visibleItems(): BladeNavItem[] {\n    return this.items().filter((item) => item.isVisible);\n  }\n\n  onItemClick(item: BladeNavItem): void {\n    if (item.hrefPath) {\n      // External link — let the <a> handle it\n      return;\n    }\n    if (item.bladePath) {\n      this.bladeService.addBlade(item.bladePath, this.senderPath());\n    }\n    item.callback?.();\n  }\n}\n","import { Component, input, output, inject } from '@angular/core';\nimport { BladeService } from '../../services/blade.service';\nimport { PortalService } from '../../services/portal.service';\nimport { filterItems } from '../../models/filter.util';\n\n/**\n * Grid/list blade content — renders a searchable list of items.\n * Ported from grid.html + BladeGrid (v0.2.346).\n *\n * Displays items in a table with optional search filtering.\n * Each row shows a title and optional subtitle. Clicking a row\n * opens the target blade.\n *\n * Usage:\n * ```html\n * <apa-blade [blade]=\"gridBlade\">\n *   <apa-blade-grid\n *     [items]=\"items\"\n *     [senderPath]=\"gridBlade.path\"\n *     [displayField]=\"'title'\"\n *     (itemClick)=\"onItemClick($event)\" />\n * </apa-blade>\n * ```\n */\n@Component({\n  selector: 'apa-blade-grid',\n  standalone: true,\n  styles: [`:host { display: flex; flex-direction: column; flex: 1; }`],\n  template: `\n    @if (searchable()) {\n      <div style=\"padding:0 0 10px 0;\">\n        <input type=\"search\"\n               class=\"form-control\"\n               [placeholder]=\"portal.labels().search\"\n               [attr.aria-label]=\"portal.labels().search\"\n               [value]=\"searchText\"\n               (input)=\"onSearchInput($event)\" />\n      </div>\n    }\n    <table class=\"azc-grid-full azc-grid-multiselectable\" role=\"grid\" aria-label=\"Items\">\n      <colgroup>\n        <col class=\"col0\" style=\"width:41px;\">\n        <col class=\"col1\">\n      </colgroup>\n      <tbody class=\"azc-grid-groupdata\" role=\"rowgroup\">\n        @for (item of filteredItems(); track $index) {\n          <tr role=\"row\" style=\"cursor:pointer\"\n              [attr.aria-label]=\"getDisplayValue(item)\"\n              (click)=\"onRowClick(item)\"\n              (keydown.enter)=\"onRowClick(item)\">\n            <td class=\"msportalfx-gridcolumn-asseticon\" role=\"gridcell\" aria-hidden=\"true\">\n              <i [class]=\"iconClass()\" style=\"font-size:20px; color:var(--apa-accent);\"></i>\n            </td>\n            <td tabindex=\"0\" role=\"gridcell\">\n              <span>{{ getDisplayValue(item) }}</span>\n            </td>\n          </tr>\n        }\n      </tbody>\n    </table>\n  `,\n})\nexport class BladeGridComponent {\n  readonly items = input<any[]>([]);\n  readonly senderPath = input<string>('');\n  readonly displayField = input<string>('title');\n  readonly bladePathField = input<string>('bladePath');\n  readonly idField = input<string>('id');\n  readonly iconClass = input<string>('ti ti-point-filled');\n  readonly searchable = input<boolean>(true);\n  readonly itemClick = output<any>();\n\n  searchText = '';\n\n  private readonly bladeService = inject(BladeService);\n  protected readonly portal = inject(PortalService);\n\n  filteredItems(): any[] {\n    return filterItems(this.items(), this.searchText);\n  }\n\n  getDisplayValue(item: any): string {\n    return item[this.displayField()] ?? '';\n  }\n\n  onSearchInput(event: Event): void {\n    this.searchText = (event.target as HTMLInputElement).value;\n  }\n\n  onRowClick(item: any): void {\n    this.itemClick.emit(item);\n    const bladePath = item[this.bladePathField()];\n    if (bladePath) {\n      const itemId = item[this.idField()];\n      const params = itemId != null ? { id: String(itemId) } : undefined;\n      this.bladeService.addBlade(bladePath, this.senderPath(), '', undefined, params);\n    }\n  }\n}\n","import { AfterContentInit, Component, OnDestroy, contentChild, inject, input } from '@angular/core';\nimport { NgForm } from '@angular/forms';\nimport { BladeDataDefinition } from '../../models/blade-data.model';\nimport { BladeCommand, createCommand } from '../../models/blade-command.model';\nimport { PortalLabels, DEFAULT_LABELS } from '../../models/portal-labels.model';\nimport { BladeService } from '../../services/blade.service';\n\n/**\n * Detail/edit blade content — renders a form area for editing an item.\n * Ported from BladeDetail<T> (v0.2.346).\n *\n * Provides a content projection area for forms. The blade's commands\n * (save, delete, cancel, new) are managed via the blade definition.\n *\n * This is a thin wrapper that projects content and provides\n * convenience methods for setting up typical detail blade commands.\n *\n * Usage:\n * ```html\n * <apa-blade [blade]=\"detailBlade\">\n *   <apa-blade-detail [blade]=\"detailBlade\">\n *     <form>\n *       <!-- form fields here -->\n *     </form>\n *   </apa-blade-detail>\n * </apa-blade>\n * ```\n */\n@Component({\n  selector: 'apa-blade-detail',\n  standalone: true,\n  styles: [`:host { display: flex; flex-direction: column; flex: 1; min-height: 0; }\n    .apa-blade-detail { flex: 1; display: flex; flex-direction: column; min-height: 0; }`],\n  template: `\n    <div class=\"apa-blade-detail\">\n      <ng-content />\n    </div>\n  `,\n})\nexport class BladeDetailComponent implements AfterContentInit, OnDestroy {\n  readonly blade = input.required<BladeDataDefinition<any>>();\n\n  private readonly bladeService = inject(BladeService);\n\n  /** The template-driven form projected into this detail, if any (auto-discovered). */\n  private readonly form = contentChild(NgForm, { descendants: true });\n\n  ngAfterContentInit(): void {\n    const blade = this.blade();\n    const isDirty = (): boolean => this.form()?.dirty ?? false;\n\n    // Expose on the lifecycle (for consumers) and register with the BladeService so navigation\n    // away from a dirty blade prompts for confirmation. No per-detail wiring needed — every\n    // detail that projects a <form> is guarded automatically.\n    blade.lifecycle.isDirty = isDirty;\n    this.bladeService.registerDirtyCheck(blade.path, isDirty);\n\n    // After a successful save, reset the form to pristine so the guard does not fire on a\n    // saved-but-not-yet-navigated blade. Wrap (don't replace) any existing onSavedItem hook.\n    const originalOnSaved = blade.lifecycle.onSavedItem;\n    blade.lifecycle.onSavedItem = (): void => {\n      this.form()?.form.markAsPristine();\n      originalOnSaved?.();\n    };\n  }\n\n  ngOnDestroy(): void {\n    this.bladeService.unregisterDirtyCheck(this.blade().path);\n  }\n}\n\n/**\n * Create standard detail blade commands (new, save, delete, cancel).\n * Convenience function for setting up typical detail/edit blade commands\n * matching the v0.2.346 BladeDetail default commands.\n */\nexport function createDetailCommands(handlers: {\n  onNew?: () => void;\n  onSave?: () => void;\n  onDelete?: () => void;\n  onCancel?: () => void;\n}, labels: PortalLabels = DEFAULT_LABELS): BladeCommand[] {\n  const commands: BladeCommand[] = [];\n\n  if (handlers.onNew) {\n    commands.push(createCommand('new', labels.cmdNew, handlers.onNew, 'ti ti-plus'));\n  }\n  if (handlers.onSave) {\n    commands.push(createCommand('save', labels.cmdSave, handlers.onSave, 'ti ti-device-floppy'));\n  }\n  if (handlers.onDelete) {\n    commands.push(createCommand('delete', labels.cmdDelete, handlers.onDelete, 'ti ti-trash'));\n  }\n  if (handlers.onCancel) {\n    commands.push(createCommand('cancel', labels.cmdCancel, handlers.onCancel, 'ti ti-x'));\n  }\n\n  return commands;\n}\n","import { Component, effect, inject } from '@angular/core';\nimport { PortalService } from '../../services/portal.service';\n\n/**\n * Notification panel — right-side overlay panel.\n * Ported from apa-notification-area in home.html (v0.2.346).\n *\n * Usage:\n * ```html\n * <apa-notification-panel>\n *   <!-- Custom notification content -->\n * </apa-notification-panel>\n * ```\n */\n@Component({\n  selector: 'apa-notification-panel',\n  standalone: true,\n  styles: [`:host { display: contents; }`],\n  template: `\n    @if (portal.notification().isVisible) {\n      <div class=\"apa-notification-panel\"\n           role=\"complementary\"\n           aria-live=\"polite\"\n           [style.width.px]=\"portal.notification().width\">\n        <button class=\"apa-notification-close\" (click)=\"onClose()\"\n                [title]=\"portal.labels().closePanel\"\n                [attr.aria-label]=\"portal.labels().closePanel\">\n          <svg viewBox=\"0 0 11 11\" role=\"presentation\" focusable=\"false\" xmlns=\"http://www.w3.org/2000/svg\">\n            <polygon class=\"msportal-fx-svg-placeholder\" points=\"10.4,1.4 9.6,0.6 5.5,4.7 1.4,0.6 0.6,1.4 4.7,5.5 0.6,9.6 1.4,10.4 5.5,6.3 9.6,10.4 10.4,9.6 6.3,5.5\"/>\n          </svg>\n        </button>\n        <ng-content />\n      </div>\n    }\n  `,\n})\nexport class NotificationPanelComponent {\n  protected readonly portal = inject(PortalService);\n\n  private wasVisible = false;\n\n  constructor() {\n    effect(() => {\n      const visible = this.portal.notification().isVisible;\n      if (visible && !this.wasVisible) {\n        const lifecycle = this.portal.notification().lifecycle;\n        queueMicrotask(() => lifecycle?.onShowed?.());\n      }\n      this.wasVisible = visible;\n    });\n  }\n\n  onClose(): void {\n    this.portal.hideNotification();\n  }\n}\n","import { Component, inject } from '@angular/core';\nimport { PortalService } from '../../services/portal.service';\nimport { getUserDisplayName } from '../../models/user-account.model';\n\n/**\n * Avatar menu — user account dropdown in the portal header.\n * Ported from fxs-avatarmenu CSS structure in v0.2.346.\n *\n * Shows the user's name and email. Clicking toggles a dropdown\n * with optional actions (sign out, etc.).\n *\n * Usage:\n * ```html\n * <apa-avatar-menu>\n *   <a href=\"/Account/SignOut\">Abmelden</a>\n * </apa-avatar-menu>\n * ```\n */\n@Component({\n  selector: 'apa-avatar-menu',\n  standalone: true,\n  template: `\n    <div class=\"fxs-avatarmenu\">\n      <a class=\"fxs-has-hover\" (click)=\"portal.toggleAvatarMenu()\">\n        <div class=\"fxs-avatarmenu-header\">\n          <span class=\"fxs-avatarmenu-username\">{{ displayName() }}</span>\n          <span class=\"fxs-avatarmenu-emailaddress\">{{ userAccount().emailAddress }}</span>\n        </div>\n      </a>\n      @if (portal.avatarMenu().isOpen) {\n        <div class=\"fxs-avatarmenu-dropdown\" style=\"display:block;\">\n          <ul>\n            <ng-content />\n          </ul>\n        </div>\n      }\n    </div>\n  `,\n})\nexport class AvatarMenuComponent {\n  protected readonly portal = inject(PortalService);\n\n  protected userAccount() {\n    return this.portal.avatarMenu().userAccount;\n  }\n\n  protected displayName(): string {\n    return getUserDisplayName(this.userAccount());\n  }\n}\n","import { Component, input, inject } from '@angular/core';\nimport { BladeNavItem } from '../../models/blade-nav-item.model';\nimport { BladeService } from '../../services/blade.service';\n\n/**\n * Sidebar navigation — optional vertical navigation panel.\n * New in v0.3.0 (no equivalent in v0.2.346).\n *\n * Provides a collapsible sidebar with navigation items that\n * open blades when clicked.\n *\n * Usage:\n * ```html\n * <apa-sidebar [items]=\"sidebarItems\" [collapsed]=\"false\" />\n * <apa-sidebar [items]=\"sidebarItems\" [width]=\"240\" [collapsedWidth]=\"60\" />\n * ```\n */\n@Component({\n  selector: 'apa-sidebar',\n  standalone: true,\n  template: `\n    <nav class=\"apa-sidebar\" aria-label=\"Sidebar\"\n         [class.apa-sidebar-collapsed]=\"collapsed()\"\n         [style.width.px]=\"collapsed() ? collapsedWidth() : width()\">\n      @for (item of visibleItems(); track item.bladePath) {\n        <a class=\"apa-sidebar-item\"\n           role=\"button\"\n           tabindex=\"0\"\n           [attr.aria-label]=\"item.title\"\n           (click)=\"onItemClick(item)\"\n           (keydown.enter)=\"onItemClick(item)\"\n           (keydown.space)=\"onItemClick(item)\"\n           style=\"cursor:pointer;\">\n          @if (item.cssClass) {\n            <i [class]=\"item.cssClass\" class=\"apa-sidebar-icon\" aria-hidden=\"true\"></i>\n          }\n          @if (!collapsed()) {\n            <span class=\"apa-sidebar-label\">{{ item.title }}</span>\n            @if (item.badge) {\n              <span class=\"apa-sidebar-badge\" aria-label=\"badge\">{{ item.badge }}</span>\n            }\n          }\n        </a>\n      }\n    </nav>\n  `,\n  styles: [`\n    .apa-sidebar {\n      display: flex;\n      flex-direction: column;\n      background-color: var(--apa-chrome);\n      height: 100%;\n      padding-top: 10px;\n      transition: width 0.2s ease;\n    }\n    .apa-sidebar-item {\n      display: flex;\n      align-items: center;\n      padding: 10px 15px;\n      color: var(--apa-chrome-text);\n      text-decoration: none;\n      font-size: 13px;\n      transition: background-color 0.15s ease;\n    }\n    .apa-sidebar-item:hover {\n      background-color: var(--apa-chrome-hover);\n    }\n    .apa-sidebar-icon {\n      margin-right: 10px;\n      width: 20px;\n      text-align: center;\n    }\n    .apa-sidebar-collapsed .apa-sidebar-icon {\n      margin-right: 0;\n    }\n    .apa-sidebar-label {\n      flex: 1;\n    }\n    .apa-sidebar-badge {\n      display: inline-flex;\n      align-items: center;\n      justify-content: center;\n      min-width: 18px;\n      height: 18px;\n      padding: 0 5px;\n      border-radius: 9px;\n      background-color: var(--apa-accent);\n      color: #fff;\n      font-size: 11px;\n      font-weight: 600;\n      line-height: 1;\n    }\n  `],\n})\nexport class SidebarComponent {\n  readonly items = input<BladeNavItem[]>([]);\n  readonly collapsed = input<boolean>(false);\n  readonly width = input<number>(200);\n  readonly collapsedWidth = input<number>(50);\n\n  private readonly bladeService = inject(BladeService);\n\n  visibleItems(): BladeNavItem[] {\n    return this.items().filter((item) => item.isVisible);\n  }\n\n  onItemClick(item: BladeNavItem): void {\n    if (item.bladePath) {\n      this.bladeService.setFirstBlade(item.bladePath, item.title);\n    }\n    item.callback?.();\n  }\n}\n","/*\r\n * Public API Surface of @ardimedia/angular-portal-azure\r\n */\r\n\r\n// Models\r\nexport * from './lib/models/blade.model';\r\nexport * from './lib/models/blade-command.model';\r\nexport * from './lib/models/blade-data.model';\r\nexport * from './lib/models/blade-nav-item.model';\r\nexport * from './lib/models/blade-parameter.model';\r\nexport * from './lib/models/status-bar.model';\r\nexport * from './lib/models/tile-definition.model';\r\nexport * from './lib/models/user-account.model';\r\nexport * from './lib/models/notification.model';\r\nexport * from './lib/models/panorama.model';\r\nexport * from './lib/models/avatar-menu.model';\r\nexport * from './lib/models/portal-config.model';\r\nexport * from './lib/models/portal-labels.model';\r\nexport * from './lib/models/filter.util';\r\n\r\n// Services\r\nexport * from './lib/services/portal.service';\r\nexport * from './lib/services/blade.service';\r\nexport * from './lib/services/blade-registry.service';\r\nexport * from './lib/services/blade-router.service';\r\nexport * from './lib/services/provide-portal-azure';\r\nexport * from './lib/services/provide-blade-router';\r\n\r\n// Components\r\nexport * from './lib/components/tile/tile.component';\r\nexport * from './lib/components/panorama/panorama.component';\r\nexport * from './lib/components/portal-layout/portal-layout.component';\r\nexport * from './lib/components/command-bar/command-bar.component';\r\nexport * from './lib/components/blade/blade.component';\r\nexport * from './lib/components/blade-host/blade-host.component';\r\nexport * from './lib/components/blade-nav/blade-nav.component';\r\nexport * from './lib/components/blade-grid/blade-grid.component';\r\nexport * from './lib/components/blade-detail/blade-detail.component';\r\nexport * from './lib/components/notification-panel/notification-panel.component';\r\nexport * from './lib/components/avatar-menu/avatar-menu.component';\r\nexport * from './lib/components/sidebar/sidebar.component';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}