{"version":3,"sources":["../src/utils.ts","../src/css-manager.ts","../src/virtual-zstack.ts","../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Get the CSS variable value from :root, with fallback\n */\nexport function getZeebraStart(): number {\n  if (typeof window === 'undefined') {\n    return 5000;\n  }\n\n  const root = document.documentElement;\n  const value = getComputedStyle(root).getPropertyValue('--zeebra-start').trim();\n  \n  if (!value) {\n    return 5000;\n  }\n\n  const parsed = Number.parseInt(value, 10);\n  return Number.isNaN(parsed) ? 5000 : parsed;\n}\n\n/**\n * Set CSS variable on element\n */\nexport function setCSSVariable(element: HTMLElement, name: string, value: string | number): void {\n  element.style.setProperty(name, String(value));\n}\n\n/**\n * Get CSS variable from element\n */\nexport function getCSSVariable(element: HTMLElement, name: string): string | null {\n  return getComputedStyle(element).getPropertyValue(name).trim() || null;\n}\n\n","import { getZeebraStart, setCSSVariable } from './utils';\n\n/**\n * Manages CSS variable updates for z-index values\n * Batches updates using requestAnimationFrame for performance\n */\nclass CSSManager {\n  private pendingUpdates = new Map<HTMLElement, number>();\n  private rafScheduled = false;\n\n  /**\n   * Schedule a z-index update for an element\n   */\n  updateZIndex(element: HTMLElement, virtualPosition: number): void {\n    const startIndex = getZeebraStart();\n    const actualZIndex = startIndex + virtualPosition;\n    \n    this.pendingUpdates.set(element, actualZIndex);\n    \n    if (!this.rafScheduled) {\n      this.rafScheduled = true;\n      requestAnimationFrame(() => {\n        this.flushUpdates();\n      });\n    }\n  }\n\n  /**\n   * Flush all pending updates in a single batch\n   */\n  private flushUpdates(): void {\n    for (const [element, zIndex] of this.pendingUpdates) {\n      setCSSVariable(element, '--zeebra-z-index', zIndex);\n      // Also set the actual z-index as fallback for browsers that don't support CSS variables\n      element.style.zIndex = String(zIndex);\n    }\n    \n    this.pendingUpdates.clear();\n    this.rafScheduled = false;\n  }\n\n  /**\n   * Force immediate update (for synchronous operations if needed)\n   */\n  updateZIndexSync(element: HTMLElement, virtualPosition: number): void {\n    const startIndex = getZeebraStart();\n    const actualZIndex = startIndex + virtualPosition;\n    setCSSVariable(element, '--zeebra-z-index', actualZIndex);\n    element.style.zIndex = String(actualZIndex);\n  }\n}\n\nexport const cssManager = new CSSManager();\n\n","import type { ZeebraElement } from './types';\nimport { cssManager } from './css-manager';\nimport { getZeebraStart } from './utils';\n\n/**\n * Virtual Z-Stack implementation\n * Maintains an ordered array of elements and recycles z-indexes efficiently\n */\nexport class VirtualZStack {\n  private elements: ZeebraElement[] = [];\n  private elementMap = new WeakMap<HTMLElement, ZeebraElement>();\n\n  /**\n   * Register an element in the z-stack\n   */\n  register(element: HTMLElement): void {\n    // Check if already registered\n    if (this.elementMap.has(element)) {\n      return;\n    }\n\n    // Add to end of stack (highest z-index)\n    const virtualPosition = this.elements.length;\n    const zeebraElement: ZeebraElement = {\n      element,\n      virtualPosition,\n    };\n\n    this.elements.push(zeebraElement);\n    this.elementMap.set(element, zeebraElement);\n    \n    // Update CSS\n    cssManager.updateZIndex(element, virtualPosition);\n  }\n\n  /**\n   * Unregister an element from the z-stack\n   */\n  unregister(element: HTMLElement): boolean {\n    const zeebraElement = this.elementMap.get(element);\n    if (!zeebraElement) {\n      return false;\n    }\n\n    const index = this.elements.indexOf(zeebraElement);\n    if (index === -1) {\n      return false;\n    }\n\n    // Remove from array\n    this.elements.splice(index, 1);\n    this.elementMap.delete(element);\n\n    // Recalculate virtual positions for remaining elements\n    this.recalculatePositions();\n\n    return true;\n  }\n\n  /**\n   * Lift an element to the top (highest z-index)\n   * @param sync - If true, updates CSS immediately instead of batching\n   */\n  lift(element: HTMLElement, sync: boolean = false): void {\n    // Auto-register if not already registered\n    if (!this.elementMap.has(element)) {\n      this.register(element);\n      return;\n    }\n\n    const zeebraElement = this.elementMap.get(element);\n    if (!zeebraElement) {\n      return;\n    }\n\n    const currentIndex = this.elements.indexOf(zeebraElement);\n    if (currentIndex === -1) {\n      return;\n    }\n\n    // If already at top, nothing to do\n    if (currentIndex === this.elements.length - 1) {\n      return;\n    }\n\n    // Remove from current position\n    this.elements.splice(currentIndex, 1);\n    \n    // Add to end (top of stack)\n    this.elements.push(zeebraElement);\n\n    // Recalculate positions (only affected elements need updates)\n    this.recalculatePositions(sync);\n  }\n\n  /**\n   * Lower an element to the bottom (lowest z-index)\n   * @param sync - If true, updates CSS immediately instead of batching\n   */\n  lower(element: HTMLElement, sync: boolean = false): void {\n    // Auto-register if not already registered\n    if (!this.elementMap.has(element)) {\n      this.register(element);\n      return;\n    }\n\n    const zeebraElement = this.elementMap.get(element);\n    if (!zeebraElement) {\n      return;\n    }\n\n    const currentIndex = this.elements.indexOf(zeebraElement);\n    if (currentIndex === -1) {\n      return;\n    }\n\n    // If already at bottom, nothing to do\n    if (currentIndex === 0) {\n      return;\n    }\n\n    // Remove from current position\n    this.elements.splice(currentIndex, 1);\n    \n    // Add to beginning (bottom of stack)\n    this.elements.unshift(zeebraElement);\n\n    // Recalculate positions\n    this.recalculatePositions(sync);\n  }\n\n  /**\n   * Recalculate virtual positions for all elements\n   * This is called after any structural change to the stack\n   * @param sync - If true, updates CSS immediately instead of batching\n   */\n  private recalculatePositions(sync: boolean = false): void {\n    for (let i = 0; i < this.elements.length; i++) {\n      const zeebraElement = this.elements[i];\n      const oldPosition = zeebraElement.virtualPosition;\n      zeebraElement.virtualPosition = i;\n\n      // Only update CSS if position actually changed\n      if (oldPosition !== i) {\n        if (sync) {\n          cssManager.updateZIndexSync(zeebraElement.element, i);\n        } else {\n          cssManager.updateZIndex(zeebraElement.element, i);\n        }\n      }\n    }\n  }\n\n  /**\n   * Get all tracked elements\n   */\n  getTrackedElements(): HTMLElement[] {\n    return this.elements.map(ze => ze.element);\n  }\n\n  /**\n   * Get the next available z-index value\n   */\n  getNextZIndex(): number {\n    const startIndex = getZeebraStart();\n    return startIndex + this.elements.length;\n  }\n\n  /**\n   * Check if an element is registered\n   */\n  isRegistered(element: HTMLElement): boolean {\n    return this.elementMap.has(element);\n  }\n\n  /**\n   * Get the current virtual position of an element\n   */\n  getVirtualPosition(element: HTMLElement): number | null {\n    const zeebraElement = this.elementMap.get(element);\n    return zeebraElement ? zeebraElement.virtualPosition : null;\n  }\n\n  /**\n   * Get the current z-index value for an element (synchronously calculated)\n   * This is useful when you need the z-index immediately without waiting for CSS updates\n   */\n  getZIndex(element: HTMLElement): number | null {\n    const virtualPosition = this.getVirtualPosition(element);\n    if (virtualPosition === null) {\n      return null;\n    }\n    const startIndex = getZeebraStart();\n    return startIndex + virtualPosition;\n  }\n}\n\n","import { VirtualZStack } from './virtual-zstack';\nimport { getZeebraStart } from './utils';\n\n// Global instance\nconst zstack = new VirtualZStack();\n\n/**\n * Auto-detect and register elements with data-zeebra attribute\n */\nfunction autoDetectElements(): void {\n  if (typeof document === 'undefined') {\n    return;\n  }\n\n  const elements = document.querySelectorAll<HTMLElement>('[data-zeebra]');\n  for (const element of elements) {\n    if (!zstack.isRegistered(element)) {\n      zstack.register(element);\n    }\n  }\n}\n\n// Auto-detect on DOM ready\nif (typeof document !== 'undefined') {\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', autoDetectElements);\n  } else {\n    autoDetectElements();\n  }\n\n  // Also watch for dynamically added elements\n  if (typeof MutationObserver !== 'undefined') {\n    const setupObserver = () => {\n      if (document.body) {\n        const observer = new MutationObserver(() => {\n          autoDetectElements();\n        });\n\n        observer.observe(document.body, {\n          childList: true,\n          subtree: true,\n        });\n      } else {\n        // Retry if body doesn't exist yet\n        setTimeout(setupObserver, 100);\n      }\n    };\n\n    if (document.readyState === 'loading') {\n      document.addEventListener('DOMContentLoaded', setupObserver);\n    } else {\n      setupObserver();\n    }\n  }\n}\n\n/**\n * Register an element in the z-stack\n */\nexport function register(element: HTMLElement): void {\n  zstack.register(element);\n}\n\n/**\n * Unregister an element from the z-stack\n */\nexport function unregister(element: HTMLElement): boolean {\n  return zstack.unregister(element);\n}\n\n/**\n * Lift an element to the top (highest z-index)\n * Auto-registers if not already registered\n * @param sync - If true, updates CSS immediately instead of batching (useful when you need the z-index right away)\n */\nexport function lift(element: HTMLElement, sync: boolean = false): void {\n  zstack.lift(element, sync);\n}\n\n/**\n * Alias for lift\n */\nexport function bringToFront(element: HTMLElement, sync: boolean = false): void {\n  lift(element, sync);\n}\n\n/**\n * Lower an element to the bottom (lowest z-index)\n * Auto-registers if not already registered\n * @param sync - If true, updates CSS immediately instead of batching (useful when you need the z-index right away)\n */\nexport function lower(element: HTMLElement, sync: boolean = false): void {\n  zstack.lower(element, sync);\n}\n\n/**\n * Alias for lower\n */\nexport function sendToBack(element: HTMLElement, sync: boolean = false): void {\n  lower(element, sync);\n}\n\n/**\n * Get all currently tracked elements\n */\nexport function getTrackedElements(): HTMLElement[] {\n  return zstack.getTrackedElements();\n}\n\n/**\n * Get the next available z-index value\n */\nexport function getNextZIndex(): number {\n  return zstack.getNextZIndex();\n}\n\n/**\n * Check if an element is registered\n */\nexport function isRegistered(element: HTMLElement): boolean {\n  return zstack.isRegistered(element);\n}\n\n/**\n * Get the current z-index value for an element (synchronously calculated)\n * This is useful when you need the z-index immediately without waiting for CSS updates\n * Returns null if the element is not registered\n */\nexport function getZIndex(element: HTMLElement): number | null {\n  return zstack.getZIndex(element);\n}\n\n/**\n * Get the virtual position of an element in the z-stack\n * Returns null if the element is not registered\n */\nexport function getVirtualPosition(element: HTMLElement): number | null {\n  return zstack.getVirtualPosition(element);\n}\n\n// Default export with all methods\nconst zeebra = {\n  register,\n  unregister,\n  lift,\n  bringToFront,\n  lower,\n  sendToBack,\n  getTrackedElements,\n  getNextZIndex,\n  isRegistered,\n  getZIndex,\n  getVirtualPosition,\n};\n\nexport default zeebra;\n\n"]}