{"version":3,"file":"z-index-manager.mjs","sources":["../../../../src/lib/layouts/context-aware/z-index-manager.ts"],"sourcesContent":["/**\n * @fileoverview Z-Index Management System\n *\n * This module provides comprehensive z-index management:\n * - Layer-based z-index allocation\n * - Stacking context tracking\n * - Conflict resolution\n * - Dynamic z-index assignment\n *\n * @module layouts/context-aware/z-index-manager\n * @author Agent 4 - PhD Context Systems Expert\n * @version 1.0.0\n */\n\nimport type { ZIndexLayer, ZIndexContext, ContextTrackingConfig } from './types';\nimport { Z_INDEX_LAYERS, DEFAULT_TRACKING_CONFIG } from './types';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Registration for a z-index allocation.\n */\nexport interface ZIndexRegistration {\n  /** Unique registration ID */\n  id: string;\n  /** The element being registered */\n  element: Element;\n  /** Assigned layer */\n  layer: ZIndexLayer;\n  /** Assigned z-index value */\n  zIndex: number;\n  /** Priority within layer (higher = on top) */\n  priority: number;\n  /** Registration timestamp */\n  registeredAt: number;\n}\n\n/**\n * Options for z-index registration.\n */\nexport interface ZIndexRegistrationOptions {\n  /** Layer to register in */\n  layer?: ZIndexLayer;\n  /** Priority within layer (default: 0) */\n  priority?: number;\n  /** Whether to auto-increment within layer */\n  autoIncrement?: boolean;\n}\n\n/**\n * Callback for z-index changes.\n */\nexport type ZIndexChangeCallback = (registration: ZIndexRegistration) => void;\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/**\n * Gap between z-index values within a layer for dynamic insertion.\n */\nconst LAYER_GAP = 10;\n\n/**\n * Maximum z-index value before requiring rebalancing.\n */\nconst MAX_LAYER_OFFSET = 900;\n\n// ============================================================================\n// ZIndexManager Class\n// ============================================================================\n\n/**\n * Manages z-index values across the application.\n *\n * @remarks\n * Provides a centralized system for z-index management that prevents\n * conflicts and ensures consistent layering behavior.\n *\n * @example\n * ```typescript\n * const manager = ZIndexManager.getInstance();\n *\n * // Register an element in the modal layer\n * const reg = manager.register(element, { layer: 'modal' });\n *\n * // Apply the z-index\n * element.style.zIndex = String(reg.zIndex);\n *\n * // When done:\n * manager.unregister(reg.id);\n * ```\n */\nexport class ZIndexManager {\n  private static instance: ZIndexManager | null = null;\n\n  /** Map of registration IDs to registrations */\n  private readonly registrations: Map<string, ZIndexRegistration> = new Map();\n\n  /** Map of elements to their registration IDs */\n  private readonly elementToId: WeakMap<Element, string> = new WeakMap();\n\n  /** Map of layers to their registration IDs (ordered by z-index) */\n  private readonly layerRegistrations: Map<ZIndexLayer, string[]> = new Map();\n\n  /** Current offset within each layer */\n  private readonly layerOffsets: Map<ZIndexLayer, number> = new Map();\n\n  /** Change callbacks */\n  private readonly changeCallbacks: Set<ZIndexChangeCallback> = new Set();\n\n  /** Configuration */\n  private readonly config: ContextTrackingConfig;\n\n  /** Registration ID counter */\n  private registrationIdCounter = 0;\n\n  /**\n   * Creates a new ZIndexManager instance.\n   */\n  private constructor(config: Partial<ContextTrackingConfig> = {}) {\n    this.config = { ...DEFAULT_TRACKING_CONFIG, ...config };\n\n    // Initialize layer registrations and offsets\n    (Object.keys(Z_INDEX_LAYERS) as ZIndexLayer[]).forEach((layer) => {\n      this.layerRegistrations.set(layer, []);\n      this.layerOffsets.set(layer, 0);\n    });\n  }\n\n  /**\n   * Gets the singleton instance.\n   */\n  public static getInstance(config?: Partial<ContextTrackingConfig>): ZIndexManager {\n    ZIndexManager.instance ??= new ZIndexManager(config);\n    return ZIndexManager.instance;\n  }\n\n  /**\n   * Resets the singleton instance.\n   */\n  public static resetInstance(): void {\n    if (ZIndexManager.instance) {\n      ZIndexManager.instance.clear();\n      ZIndexManager.instance = null;\n    }\n  }\n\n  // ==========================================================================\n  // Public API - Registration\n  // ==========================================================================\n\n  /**\n   * Registers an element for z-index management.\n   *\n   * @param element - Element to register\n   * @param options - Registration options\n   * @returns Registration object\n   */\n  public register(element: Element, options: ZIndexRegistrationOptions = {}): ZIndexRegistration {\n    const { layer = 'base', priority = 0, autoIncrement = true } = options;\n\n    // Check if already registered\n    const existingId = this.elementToId.get(element);\n    if (existingId !== undefined) {\n      const existing = this.registrations.get(existingId);\n      if (existing !== undefined) {\n        // Update if layer changed\n        if (existing.layer !== layer) {\n          this.unregister(existingId);\n        } else {\n          return existing;\n        }\n      }\n    }\n\n    // Generate registration ID\n    const id = this.generateId();\n\n    // Calculate z-index\n    const baseZIndex = Z_INDEX_LAYERS[layer];\n    let offset = 0;\n\n    if (autoIncrement) {\n      const currentOffset = this.layerOffsets.get(layer) ?? 0;\n      offset = currentOffset + LAYER_GAP;\n      this.layerOffsets.set(layer, offset);\n\n      // Check if rebalancing needed\n      if (offset >= MAX_LAYER_OFFSET) {\n        this.rebalanceLayer(layer);\n        offset = this.layerOffsets.get(layer) ?? 0;\n      }\n    }\n\n    const zIndex = baseZIndex + offset + priority;\n\n    // Create registration\n    const registration: ZIndexRegistration = {\n      id,\n      element,\n      layer,\n      zIndex,\n      priority,\n      registeredAt: Date.now(),\n    };\n\n    // Store registration\n    this.registrations.set(id, registration);\n    this.elementToId.set(element, id);\n\n    // Add to layer registrations\n    const layerRegs = this.layerRegistrations.get(layer) ?? [];\n    layerRegs.push(id);\n    this.layerRegistrations.set(layer, layerRegs);\n\n    // Sort layer by z-index\n    this.sortLayer(layer);\n\n    // Notify callbacks\n    this.notifyChange(registration);\n\n    if (this.config.debug) {\n      // eslint-disable-next-line no-console -- debug logging\n      console.debug('[ZIndexManager] Registered:', id, registration);\n    }\n\n    return registration;\n  }\n\n  /**\n   * Unregisters an element.\n   *\n   * @param idOrElement - Registration ID or element to unregister\n   */\n  public unregister(idOrElement: string | Element): void {\n    let id: string | undefined;\n\n    if (typeof idOrElement === 'string') {\n      id = idOrElement;\n    } else {\n      id = this.elementToId.get(idOrElement);\n    }\n\n    if (id === undefined || id === '') {\n      return;\n    }\n\n    const registration = this.registrations.get(id);\n    if (registration === undefined) {\n      return;\n    }\n\n    // Remove from maps\n    this.registrations.delete(id);\n    this.elementToId.delete(registration.element);\n\n    // Remove from layer registrations\n    const layerRegs = this.layerRegistrations.get(registration.layer);\n    if (layerRegs !== undefined) {\n      const index = layerRegs.indexOf(id);\n      if (index !== -1) {\n        layerRegs.splice(index, 1);\n      }\n    }\n\n    if (this.config.debug) {\n      // eslint-disable-next-line no-console -- debug logging\n      console.debug('[ZIndexManager] Unregistered:', id);\n    }\n  }\n\n  /**\n   * Updates an existing registration.\n   *\n   * @param id - Registration ID\n   * @param options - New options\n   * @returns Updated registration or null\n   */\n  public update(\n    id: string,\n    options: Partial<ZIndexRegistrationOptions>\n  ): ZIndexRegistration | null {\n    const existing = this.registrations.get(id);\n    if (!existing) {\n      return null;\n    }\n\n    // If layer changed, re-register\n    if (options.layer && options.layer !== existing.layer) {\n      this.unregister(id);\n      return this.register(existing.element, {\n        layer: options.layer,\n        priority: options.priority ?? existing.priority,\n        autoIncrement: options.autoIncrement,\n      });\n    }\n\n    // Update priority\n    if (options.priority !== undefined && options.priority !== existing.priority) {\n      const newZIndex =\n        Z_INDEX_LAYERS[existing.layer] +\n        (existing.zIndex - Z_INDEX_LAYERS[existing.layer]) +\n        (options.priority - existing.priority);\n\n      const updated: ZIndexRegistration = {\n        ...existing,\n        priority: options.priority,\n        zIndex: newZIndex,\n      };\n\n      this.registrations.set(id, updated);\n      this.sortLayer(existing.layer);\n      this.notifyChange(updated);\n\n      return updated;\n    }\n\n    return existing;\n  }\n\n  // ==========================================================================\n  // Public API - Query\n  // ==========================================================================\n\n  /**\n   * Gets the registration for an element.\n   *\n   * @param element - Element to look up\n   * @returns Registration or null\n   */\n  public getRegistration(element: Element): ZIndexRegistration | null {\n    const id = this.elementToId.get(element);\n    if (id === undefined || id === '') {\n      return null;\n    }\n    return this.registrations.get(id) ?? null;\n  }\n\n  /**\n   * Gets all registrations in a layer.\n   *\n   * @param layer - Layer to query\n   * @returns Array of registrations (sorted by z-index)\n   */\n  public getLayerRegistrations(layer: ZIndexLayer): ZIndexRegistration[] {\n    const ids = this.layerRegistrations.get(layer) ?? [];\n    return ids\n      .map((id) => this.registrations.get(id))\n      .filter((reg): reg is ZIndexRegistration => reg !== undefined);\n  }\n\n  /**\n   * Gets the z-index for a layer.\n   *\n   * @param layer - Layer to query\n   * @returns Base z-index for the layer\n   */\n  public getLayerZIndex(layer: ZIndexLayer): number {\n    return Z_INDEX_LAYERS[layer];\n  }\n\n  /**\n   * Gets the z-index context for an element.\n   *\n   * @param element - Element to query\n   * @returns Z-index context\n   */\n  public getZIndexContext(element: Element): ZIndexContext {\n    const registration = this.getRegistration(element);\n\n    if (registration) {\n      const layerRegs = this.layerRegistrations.get(registration.layer) ?? [];\n      const orderInLayer = layerRegs.indexOf(registration.id);\n\n      return {\n        zIndex: registration.zIndex,\n        layer: registration.layer,\n        stackingContextRoot: this.findStackingContextRoot(element),\n        createsStackingContext: this.createsStackingContext(element),\n        orderInLayer,\n        layerCount: layerRegs.length,\n      };\n    }\n\n    return {\n      zIndex: 0,\n      layer: 'base',\n      stackingContextRoot: this.findStackingContextRoot(element),\n      createsStackingContext: this.createsStackingContext(element),\n      orderInLayer: 0,\n      layerCount: 0,\n    };\n  }\n\n  /**\n   * Gets the next available z-index in a layer.\n   *\n   * @param layer - Layer to query\n   * @returns Next z-index value\n   */\n  public getNextZIndex(layer: ZIndexLayer): number {\n    const baseZIndex = Z_INDEX_LAYERS[layer];\n    const currentOffset = this.layerOffsets.get(layer) ?? 0;\n    return baseZIndex + currentOffset + LAYER_GAP;\n  }\n\n  /**\n   * Gets the highest z-index currently in use in a layer.\n   *\n   * @param layer - Layer to query\n   * @returns Highest z-index or base layer z-index\n   */\n  public getHighestZIndex(layer: ZIndexLayer): number {\n    const regs = this.getLayerRegistrations(layer);\n    if (regs.length === 0) {\n      return Z_INDEX_LAYERS[layer];\n    }\n    return Math.max(...regs.map((r) => r.zIndex));\n  }\n\n  // ==========================================================================\n  // Public API - Lifecycle\n  // ==========================================================================\n\n  /**\n   * Subscribes to z-index changes.\n   *\n   * @param callback - Change callback\n   * @returns Unsubscribe function\n   */\n  public onChange(callback: ZIndexChangeCallback): () => void {\n    this.changeCallbacks.add(callback);\n    return () => {\n      this.changeCallbacks.delete(callback);\n    };\n  }\n\n  /**\n   * Brings an element to the front of its layer.\n   *\n   * @param element - Element to bring to front\n   */\n  public bringToFront(element: Element): void {\n    const registration = this.getRegistration(element);\n    if (!registration) {\n      return;\n    }\n\n    const highestZIndex = this.getHighestZIndex(registration.layer);\n    if (registration.zIndex >= highestZIndex) {\n      return; // Already at front\n    }\n\n    // Update z-index to be highest\n    const updated: ZIndexRegistration = {\n      ...registration,\n      zIndex: highestZIndex + LAYER_GAP,\n    };\n\n    this.registrations.set(registration.id, updated);\n    this.sortLayer(registration.layer);\n    this.notifyChange(updated);\n\n    // Update layer offset\n    const currentOffset = this.layerOffsets.get(registration.layer) ?? 0;\n    this.layerOffsets.set(\n      registration.layer,\n      Math.max(currentOffset, updated.zIndex - Z_INDEX_LAYERS[registration.layer])\n    );\n  }\n\n  /**\n   * Sends an element to the back of its layer.\n   *\n   * @param element - Element to send to back\n   */\n  public sendToBack(element: Element): void {\n    const registration = this.getRegistration(element);\n    if (!registration) {\n      return;\n    }\n\n    const layerRegs = this.getLayerRegistrations(registration.layer);\n    if (layerRegs.length === 0) {\n      return;\n    }\n\n    const lowestZIndex = Math.min(...layerRegs.map((r) => r.zIndex));\n    if (registration.zIndex <= lowestZIndex) {\n      return; // Already at back\n    }\n\n    // Update z-index to be lowest\n    const updated: ZIndexRegistration = {\n      ...registration,\n      zIndex: Math.max(Z_INDEX_LAYERS[registration.layer], lowestZIndex - LAYER_GAP),\n    };\n\n    this.registrations.set(registration.id, updated);\n    this.sortLayer(registration.layer);\n    this.notifyChange(updated);\n  }\n\n  /**\n   * Clears all registrations.\n   */\n  public clear(): void {\n    this.registrations.clear();\n    this.changeCallbacks.clear();\n\n    // Reset layer data\n    (Object.keys(Z_INDEX_LAYERS) as ZIndexLayer[]).forEach((layer) => {\n      this.layerRegistrations.set(layer, []);\n      this.layerOffsets.set(layer, 0);\n    });\n\n    if (this.config.debug) {\n      // eslint-disable-next-line no-console -- debug logging\n      console.debug('[ZIndexManager] Cleared all registrations');\n    }\n  }\n\n  // ==========================================================================\n  // Private Methods\n  // ==========================================================================\n\n  /**\n   * Generates a unique registration ID.\n   */\n  private generateId(): string {\n    return `zidx-${++this.registrationIdCounter}`;\n  }\n\n  /**\n   * Sorts registrations within a layer by z-index.\n   */\n  private sortLayer(layer: ZIndexLayer): void {\n    const ids = this.layerRegistrations.get(layer);\n    if (!ids) {\n      return;\n    }\n\n    ids.sort((a, b) => {\n      const regA = this.registrations.get(a);\n      const regB = this.registrations.get(b);\n      if (regA === undefined || regB === undefined) return 0;\n      return regA.zIndex - regB.zIndex;\n    });\n  }\n\n  /**\n   * Rebalances z-index values within a layer.\n   */\n  private rebalanceLayer(layer: ZIndexLayer): void {\n    const ids = this.layerRegistrations.get(layer);\n    if (ids === undefined || ids.length === 0) {\n      this.layerOffsets.set(layer, 0);\n      return;\n    }\n\n    const baseZIndex = Z_INDEX_LAYERS[layer];\n    let offset = LAYER_GAP;\n\n    ids.forEach((id) => {\n      const registration = this.registrations.get(id);\n      if (registration !== undefined) {\n        const updated: ZIndexRegistration = {\n          ...registration,\n          zIndex: baseZIndex + offset + registration.priority,\n        };\n        this.registrations.set(id, updated);\n        offset += LAYER_GAP;\n      }\n    });\n\n    this.layerOffsets.set(layer, offset);\n\n    if (this.config.debug) {\n      // eslint-disable-next-line no-console -- debug logging\n      console.debug('[ZIndexManager] Rebalanced layer:', layer);\n    }\n  }\n\n  /**\n   * Notifies change callbacks.\n   */\n  private notifyChange(registration: ZIndexRegistration): void {\n    this.changeCallbacks.forEach((callback) => {\n      try {\n        callback(registration);\n      } catch (error) {\n        if (this.config.debug) {\n          console.error('[ZIndexManager] Callback error:', error);\n        }\n      }\n    });\n  }\n\n  /**\n   * Finds the stacking context root for an element.\n   */\n  private findStackingContextRoot(element: Element): Element | null {\n    let current: Element | null = element.parentElement;\n\n    while (current) {\n      if (this.createsStackingContext(current)) {\n        return current;\n      }\n      current = current.parentElement;\n    }\n\n    return document.documentElement;\n  }\n\n  /**\n   * Checks if an element creates a stacking context.\n   */\n  private createsStackingContext(element: Element): boolean {\n    if (typeof window === 'undefined') {\n      return false;\n    }\n\n    const style = getComputedStyle(element);\n    const { position } = style;\n\n    // z-index on positioned element\n    if (\n      (position === 'relative' ||\n        position === 'absolute' ||\n        position === 'fixed' ||\n        position === 'sticky') &&\n      style.zIndex !== 'auto'\n    ) {\n      return true;\n    }\n\n    // opacity less than 1\n    if (parseFloat(style.opacity) < 1) {\n      return true;\n    }\n\n    // transform, filter, perspective\n    if (style.transform !== 'none' || style.filter !== 'none' || style.perspective !== 'none') {\n      return true;\n    }\n\n    // mix-blend-mode\n    if (style.mixBlendMode !== 'normal') {\n      return true;\n    }\n\n    // isolation\n    if (style.isolation === 'isolate') {\n      return true;\n    }\n\n    // will-change with certain values\n    const { willChange } = style;\n    if (willChange === 'transform' || willChange === 'opacity' || willChange === 'filter') {\n      return true;\n    }\n\n    // contain\n    const { contain } = style;\n    return (\n      contain === 'layout' || contain === 'paint' || contain === 'strict' || contain === 'content'\n    );\n  }\n}\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/**\n * Gets the z-index manager instance.\n */\nexport function getZIndexManager(): ZIndexManager {\n  return ZIndexManager.getInstance();\n}\n\n/**\n * Registers an element for z-index management.\n *\n * @param element - Element to register\n * @param options - Registration options\n * @returns Registration object\n */\nexport function registerZIndex(\n  element: Element,\n  options?: ZIndexRegistrationOptions\n): ZIndexRegistration {\n  return getZIndexManager().register(element, options);\n}\n\n/**\n * Unregisters an element from z-index management.\n *\n * @param idOrElement - Registration ID or element\n */\nexport function unregisterZIndex(idOrElement: string | Element): void {\n  getZIndexManager().unregister(idOrElement);\n}\n\n/**\n * Gets the z-index for a specific layer.\n *\n * @param layer - Layer to query\n * @returns Z-index value\n */\nexport function getLayerZIndex(layer: ZIndexLayer): number {\n  return Z_INDEX_LAYERS[layer];\n}\n\n/**\n * Brings an element to the front of its layer.\n *\n * @param element - Element to bring to front\n */\nexport function bringToFront(element: Element): void {\n  getZIndexManager().bringToFront(element);\n}\n\n/**\n * Sends an element to the back of its layer.\n *\n * @param element - Element to send to back\n */\nexport function sendToBack(element: Element): void {\n  getZIndexManager().sendToBack(element);\n}\n"],"names":["LAYER_GAP","MAX_LAYER_OFFSET","ZIndexManager","config","DEFAULT_TRACKING_CONFIG","Z_INDEX_LAYERS","layer","element","options","priority","autoIncrement","existingId","existing","id","baseZIndex","offset","zIndex","registration","layerRegs","idOrElement","index","newZIndex","updated","reg","orderInLayer","currentOffset","regs","callback","highestZIndex","lowestZIndex","r","ids","a","b","regA","regB","error","current","style","position","willChange","contain","getZIndexManager","registerZIndex","unregisterZIndex","getLayerZIndex","bringToFront","sendToBack"],"mappings":"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"}