{"version":3,"sources":["../src/depthtext.ts"],"names":["DEPTHTEXT_DEFAULTS","DEPTHTEXT_GLOBAL","dx","dy","isSettled","inst","e","cx","cy","i","DepthTextInstance","element","options","normalizeAddClass","v","normalizeEngaged","normalizeEvent","validEvents","raw","n","clamped","d","dNum","r","rNum","p","elStyle","temp","frag","wrapper","layersContainer","layers","dir","fade","template","layer","classSet","c","cls","pct","t","direction","entries","entry","xPct","yPct","mul","xTilt","yTilt","rect","k","DepthTextify","selectorOrOptions","maybeOptions","selector","nodes","instances","el","dataset","getDataAttr","key","val","dataOptions","mergedOptions","err","depthtext_default"],"mappings":"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","sourcesContent":["/**\r\n * DepthText v1.2.0 - TypeScript\r\n * https://mobiwise.dev | https://github.com/mobiwise-dev/depthtext\r\n * MIT License | (c) 2025\r\n *\r\n * - Compatible SSR (guards around window/document)\r\n * - Designed to be bundled (tsup / rollup / vite)\r\n * - Exports: DepthTextInstance, DEPTHTEXT_DEFAULTS, DepthTextify\r\n */\r\n\r\n/* ===========================================================================\r\n   Types & Defaults\r\n   =========================================================================== */\r\n\r\nexport interface DepthTextOptions {\r\n  depth?: string; // e.g. \"1rem\", \"20px\"\r\n  direction?: \"both\" | \"backwards\" | \"forwards\";\r\n  event?: \"none\" | \"pointer\" | \"scroll\" | \"scrollX\" | \"scrollY\";\r\n  eventRotation?: string; // e.g. \"30deg\"\r\n  eventDirection?: \"default\" | \"reverse\";\r\n  fade?: boolean | string;\r\n  layers?: number | string;\r\n  perspective?: string;\r\n  engaged?: boolean | string;\r\n  addClass?: string;\r\n  layerClassMap?: string[];\r\n}\r\n\r\nexport const DEPTHTEXT_DEFAULTS: Required<Pick<DepthTextOptions, \"depth\" | \"direction\" | \"event\" | \"eventRotation\" | \"eventDirection\" | \"fade\" | \"layers\" | \"perspective\" | \"engaged\" | \"addClass\" | \"layerClassMap\">> = {\r\n  depth: \"1rem\",\r\n  direction: \"both\",\r\n  event: \"none\",\r\n  eventRotation: \"30deg\",\r\n  eventDirection: \"default\",\r\n  fade: false,\r\n  layers: 10,\r\n  perspective: \"500px\",\r\n  engaged: true,\r\n  addClass: \"\",\r\n  layerClassMap: [],\r\n};\r\n\r\n/* ===========================================================================\r\n   Global manager (singleton) - keeps one RAF and one pointer/scroll listener\r\n   =========================================================================== */\r\n\r\ntype MaybeElement = HTMLElement | Element | null;\r\n\r\nconst DEPTHTEXT_GLOBAL = {\r\n  instances: new Set<DepthTextInstance>(),\r\n  rafId: null as number | null,\r\n\r\n  // Target values (where we want to be)\r\n  targetX: 0,\r\n  targetY: 0,\r\n\r\n  // Current values (where we are currently - smoothed)\r\n  currentX: 0,\r\n  currentY: 0,\r\n\r\n  // Smoothing factor (0.1 = smooth, 1 = instant)\r\n  lerpFactor: 0.1,\r\n\r\n  // State\r\n  isMoving: false,\r\n  hasPointerListener: false,\r\n  hasScrollListener: false,\r\n\r\n  requestLoop() {\r\n    if (this.isMoving) return;\r\n    this.isMoving = true;\r\n    this.tick();\r\n  },\r\n\r\n  tick() {\r\n    // 1. Interpolate pointer values\r\n    // Simple lerp: current = current + (target - current) * factor\r\n    const dx = this.targetX - this.currentX;\r\n    const dy = this.targetY - this.currentY;\r\n\r\n    this.currentX += dx * this.lerpFactor;\r\n    this.currentY += dy * this.lerpFactor;\r\n\r\n    // Check if we are \"close enough\" to stop (optimization)\r\n    const isSettled = Math.abs(dx) < 0.001 && Math.abs(dy) < 0.001;\r\n\r\n    // 2. Update all instances\r\n    this.updateAll();\r\n\r\n    // 3. Continue loop if not settled, otherwise stop\r\n    if (!isSettled) {\r\n      this.rafId = requestAnimationFrame(() => this.tick());\r\n    } else {\r\n      // Snap to target to finish\r\n      this.currentX = this.targetX;\r\n      this.currentY = this.targetY;\r\n      this.updateAll(); // Final update\r\n      this.isMoving = false;\r\n      this.rafId = null;\r\n    }\r\n  },\r\n\r\n  updateAll() {\r\n    this.instances.forEach((inst) => {\r\n      if (!inst.isVisible) return;\r\n\r\n      // POINTER: Use the smoothed global values\r\n      if (inst.options.event === \"pointer\") {\r\n        inst.tilt(this.currentX, this.currentY);\r\n      }\r\n\r\n      // SCROLL: Direct update for scroll events (no lerp for scroll - immediate response)\r\n      if (inst.options.event === \"scroll\" || inst.options.event === \"scrollX\" || inst.options.event === \"scrollY\") {\r\n        inst.handleScrollGlobal();\r\n      }\r\n    });\r\n  },\r\n\r\n  attachPointerIfNeeded() {\r\n    if (this.hasPointerListener) return;\r\n    if (typeof window === \"undefined\") return;\r\n\r\n    this._pointerHandler = (e: PointerEvent | TouchEvent) => {\r\n      let cx = 0,\r\n        cy = 0;\r\n      if (\"clientX\" in e && typeof (e as PointerEvent).clientX === \"number\") {\r\n        cx = (e as PointerEvent).clientX;\r\n        cy = (e as PointerEvent).clientY;\r\n      } else if (\"touches\" in e && (e as TouchEvent).touches && (e as TouchEvent).touches.length) {\r\n        cx = (e as TouchEvent).touches[0].clientX;\r\n        cy = (e as TouchEvent).touches[0].clientY;\r\n      }\r\n      // Update TARGET values\r\n      this.targetX = (cx / window.innerWidth - 0.5) * 2;\r\n      this.targetY = (cy / window.innerHeight - 0.5) * 2;\r\n\r\n      // Start the loop\r\n      this.requestLoop();\r\n    };\r\n\r\n    window.addEventListener(\"pointermove\" as any, this._pointerHandler, { passive: true } as any);\r\n    this.hasPointerListener = true;\r\n  },\r\n\r\n  detachPointerIfUnused() {\r\n    const need = [...this.instances].some((i) => i.options.event === \"pointer\");\r\n    if (!need && this.hasPointerListener && typeof window !== \"undefined\") {\r\n      window.removeEventListener(\"pointermove\" as any, this._pointerHandler as any);\r\n      this._pointerHandler = undefined;\r\n      this.hasPointerListener = false;\r\n    }\r\n  },\r\n\r\n  attachScrollIfNeeded() {\r\n    if (this.hasScrollListener) return;\r\n    if (typeof window === \"undefined\") return;\r\n\r\n    this._scrollHandler = () => {\r\n      // Direct update for scroll to ensure responsiveness\r\n      requestAnimationFrame(() => this.updateAll());\r\n    };\r\n\r\n    window.addEventListener(\"scroll\", this._scrollHandler, { passive: true } as any);\r\n    this.hasScrollListener = true;\r\n  },\r\n\r\n  detachScrollIfUnused() {\r\n    const need = [...this.instances].some((i) => [\"scroll\", \"scrollX\", \"scrollY\"].includes(i.options.event));\r\n    if (!need && this.hasScrollListener && typeof window !== \"undefined\") {\r\n      window.removeEventListener(\"scroll\", this._scrollHandler as any);\r\n      this._scrollHandler = undefined;\r\n      this.hasScrollListener = false;\r\n    }\r\n  },\r\n\r\n  // internals (set after creation)\r\n  _pointerHandler: undefined as undefined | ((e: any) => void),\r\n  _scrollHandler: undefined as undefined | (() => void),\r\n};\r\n\r\n/* expose for debugging in browser, optional */\r\nif (typeof window !== \"undefined\") {\r\n  (window as any).DEPTHTEXT_GLOBAL = DEPTHTEXT_GLOBAL;\r\n}\r\n\r\n/* ===========================================================================\r\n   DepthTextInstance - core class\r\n   =========================================================================== */\r\n\r\nexport class DepthTextInstance {\r\n  element: MaybeElement;\r\n  options: Required<DepthTextOptions>;\r\n  wrapper: MaybeElement | null = null;\r\n  layersContainer: MaybeElement | null = null;\r\n  _layerContentTemplate: DocumentFragment | null = null;\r\n  _originalStyles = new Map<string, string>();\r\n  intersectionObserver: any = null;\r\n  resizeObserver: any = null;\r\n  depthValue = 0;\r\n  depthUnit = \"rem\";\r\n  rotationValue = 0;\r\n  rotationUnit = \"deg\";\r\n  isVisible = true;\r\n  _isDestroyed = false;\r\n\r\n  constructor(element: MaybeElement, options: DepthTextOptions = {}) {\r\n    if (!element) throw new Error(\"DepthTextInstance: element required\");\r\n    this.element = element;\r\n    this.options = this._validateOptions(options);\r\n    // parse and init only if engaged\r\n    if (this.options.engaged === false) return;\r\n    this._parseUnits();\r\n    this._storeOriginalState();\r\n    this._createStructure();\r\n    this._setupObservers();\r\n    this._enableGlobalHooks();\r\n  }\r\n\r\n  /* -------------------------\r\n     options validation\r\n  ------------------------- */\r\n  _validateOptions(options: DepthTextOptions): Required<DepthTextOptions> {\r\n    const normalizeAddClass = (v: any): string => {\r\n      if (!v && v !== \"\") return DEPTHTEXT_DEFAULTS.addClass;\r\n      if (Array.isArray(v)) return v.map(String).join(\" \").trim().replace(/\\s+/g, \" \");\r\n      return String(v).trim().replace(/\\s+/g, \" \");\r\n    };\r\n\r\n    // FIX: engaged validation correcte\r\n    const normalizeEngaged = (v: any): boolean => {\r\n      if (v === false || v === \"false\") return false;\r\n      if (v === true || v === \"true\") return true;\r\n      if (v === undefined || v === null) return DEPTHTEXT_DEFAULTS.engaged as boolean;\r\n      return Boolean(v);\r\n    };\r\n\r\n    // FIX: event validation\r\n    const normalizeEvent = (v: any): \"none\" | \"pointer\" | \"scroll\" | \"scrollX\" | \"scrollY\" => {\r\n      const validEvents = [\"none\", \"pointer\", \"scroll\", \"scrollX\", \"scrollY\"];\r\n      if (v && validEvents.includes(String(v))) {\r\n        return v as any;\r\n      }\r\n      if (v && !validEvents.includes(String(v))) {\r\n        console.warn(`DepthText: Invalid event \"${v}\", defaulting to \"none\"`);\r\n      }\r\n      return DEPTHTEXT_DEFAULTS.event as any;\r\n    };\r\n\r\n    const merged: Required<DepthTextOptions> = {\r\n      depth: options.depth ?? DEPTHTEXT_DEFAULTS.depth,\r\n      direction: options.direction ?? DEPTHTEXT_DEFAULTS.direction,\r\n      event: normalizeEvent(options.event),\r\n      eventRotation: options.eventRotation ?? DEPTHTEXT_DEFAULTS.eventRotation,\r\n      eventDirection: options.eventDirection ?? DEPTHTEXT_DEFAULTS.eventDirection,\r\n      perspective: options.perspective ?? DEPTHTEXT_DEFAULTS.perspective,\r\n      fade: options.fade === true || options.fade === \"true\" ? true : DEPTHTEXT_DEFAULTS.fade,\r\n      layers: ((): number => {\r\n        const raw = options.layers ?? DEPTHTEXT_DEFAULTS.layers;\r\n        const n = typeof raw === \"string\" ? parseInt(raw, 10) : Number(raw);\r\n        const clamped: number = isFinite(n) ? Math.min(Math.max(1, n), 40) : Number(DEPTHTEXT_DEFAULTS.layers);\r\n        if (clamped > 25) console.warn(`DepthText: ${clamped} layers may affect performance`);\r\n        return clamped;\r\n      })(),\r\n      engaged: normalizeEngaged(options.engaged),\r\n      addClass: normalizeAddClass(options.addClass ?? DEPTHTEXT_DEFAULTS.addClass),\r\n      layerClassMap: Array.isArray(options.layerClassMap) ? options.layerClassMap.map(String) : DEPTHTEXT_DEFAULTS.layerClassMap,\r\n    };\r\n    return merged;\r\n  }\r\n\r\n  /* -------------------------\r\n     parse numeric units\r\n  ------------------------- */\r\n  _parseUnits() {\r\n    const d = String(this.options.depth);\r\n    const dNum = parseFloat(d);\r\n    this.depthValue = isFinite(dNum) ? dNum : 1;\r\n    this.depthUnit = d.replace(/[0-9.\\-\\s]/g, \"\") || \"rem\";\r\n\r\n    const r = String(this.options.eventRotation);\r\n    const rNum = parseFloat(r);\r\n    this.rotationValue = isFinite(rNum) ? rNum : 30;\r\n    this.rotationUnit = r.replace(/[0-9.\\-\\s]/g, \"\") || \"deg\";\r\n  }\r\n\r\n  /* -------------------------\r\n     store original content and styles (create a single template clone)\r\n  ------------------------- */\r\n  _storeOriginalState() {\r\n    const styleProps = [\"display\", \"position\", \"perspective\", \"webkitPerspective\"];\r\n    styleProps.forEach((p) => {\r\n      try {\r\n        const elStyle = (this.element as HTMLElement | null)?.style;\r\n        if (elStyle) {\r\n          // CSSStyleDeclaration doesn't have an index signature, so cast to any for dynamic property access\r\n          this._originalStyles.set(p, (elStyle as any)[p] ?? \"\");\r\n        } else {\r\n          this._originalStyles.set(p, \"\");\r\n        }\r\n      } catch {\r\n        this._originalStyles.set(p, \"\");\r\n      }\r\n    });\r\n\r\n    // Pull children into a fragment\r\n    const temp = ((): DocumentFragment => {\r\n      const frag = document.createDocumentFragment();\r\n      try {\r\n        while (this.element && (this.element as any).firstChild) {\r\n          frag.appendChild((this.element as any).firstChild);\r\n        }\r\n      } catch {\r\n        // SSR-safety: if element isn't DOM-like, do nothing\r\n      }\r\n      return frag;\r\n    })();\r\n\r\n    // store a clone to use as template for each layer\r\n    this._layerContentTemplate = temp.cloneNode(true) as DocumentFragment;\r\n  }\r\n\r\n  /* -------------------------\r\n     create DOM structure\r\n  ------------------------- */\r\n  _createStructure() {\r\n    // Apply basic inline styles to host element (safe: doesn't require window)\r\n    try {\r\n      const elStyle = (this.element as any).style;\r\n      if (elStyle) {\r\n        elStyle.display = elStyle.display || \"inline-block\";\r\n        elStyle.position = elStyle.position || \"relative\";\r\n        elStyle.perspective = elStyle.perspective || this.options.perspective;\r\n        elStyle.webkitPerspective = elStyle.webkitPerspective || this.options.perspective;\r\n      }\r\n    } catch {\r\n      /* ignore for non-DOM hosts */\r\n    }\r\n\r\n    // wrapper that will receive will-change & transform\r\n    const wrapper = document.createElement ? document.createElement(\"span\") : ({} as any);\r\n    wrapper.className = \"depthtext-wrapper\";\r\n    try {\r\n      Object.assign(wrapper.style, {\r\n        display: \"inline-block\",\r\n        transformStyle: \"preserve-3d\",\r\n        willChange: \"transform\",\r\n      });\r\n    } catch {\r\n      /* ignore */\r\n    }\r\n    this.wrapper = wrapper;\r\n\r\n    // layers container\r\n    const layersContainer = document.createElement ? document.createElement(\"span\") : ({} as any);\r\n    layersContainer.className = \"depthtext-layers\";\r\n    try {\r\n      Object.assign(layersContainer.style, {\r\n        display: \"inline-block\",\r\n        transformStyle: \"preserve-3d\",\r\n      });\r\n      layersContainer.setAttribute(\"aria-hidden\", \"true\");\r\n    } catch {\r\n      /* ignore */\r\n    }\r\n    this.layersContainer = layersContainer;\r\n\r\n    // append\r\n    try {\r\n      (wrapper as any).appendChild(layersContainer);\r\n      (this.element as any).appendChild(wrapper);\r\n    } catch {\r\n      // if element isn't DOM-like, skip append (still usable programmatically)\r\n    }\r\n\r\n    // build layers (off DOM)\r\n    this._createLayers();\r\n  }\r\n\r\n  _createLayers() {\r\n    const frag = document.createDocumentFragment();\r\n    const layers = Number(this.options.layers);\r\n    const dir = this.options.direction;\r\n    const fade = Boolean(this.options.fade);\r\n    const template = this._layerContentTemplate;\r\n\r\n    for (let i = 0; i < layers; i++) {\r\n      const layer = document.createElement ? document.createElement(\"span\") : ({} as any);\r\n\r\n      // FIX: Utiliser un Set pour éviter les doublons de classes\r\n      const classSet = new Set<string>();\r\n\r\n      /* Base class */\r\n      classSet.add(\"depthtext-layer\");\r\n\r\n      /* Layer index class (0-indexed) */\r\n      classSet.add(`depthtext-layer-${i}`);\r\n\r\n      /* layerClassMap[i] - Optional per-layer custom classes */\r\n      if (this.options.layerClassMap && this.options.layerClassMap[i]) {\r\n        const mapped = String(this.options.layerClassMap[i])\r\n          .split(/\\s+/)\r\n          .map((c) => c.trim())\r\n          .filter(Boolean);\r\n        mapped.forEach((cls) => classSet.add(cls));\r\n      }\r\n\r\n      /* addClass - Applied to ALL layers */\r\n      if (this.options.addClass) {\r\n        const extra = String(this.options.addClass)\r\n          .split(/\\s+/)\r\n          .map((c) => c.trim())\r\n          .filter(Boolean);\r\n        extra.forEach((cls) => classSet.add(cls));\r\n      }\r\n\r\n      // Appliquer toutes les classes uniques\r\n      classSet.forEach((cls) => {\r\n        try {\r\n          layer.classList.add(cls);\r\n        } catch {}\r\n      });\r\n\r\n      /* Clone content per layer */\r\n      if (template && layer.appendChild) {\r\n        layer.appendChild(template.cloneNode(true));\r\n      }\r\n\r\n      /* Positioning / transforms */\r\n      const pct = i / layers;\r\n      const t = this._calculateTranslation(pct, dir);\r\n\r\n      try {\r\n        layer.style.transform = `translateZ(${t}${this.depthUnit})`;\r\n        layer.style.display = \"inline-block\";\r\n      } catch {}\r\n\r\n      if (i >= 1) {\r\n        try {\r\n          Object.assign(layer.style, {\r\n            position: \"absolute\",\r\n            top: \"0\",\r\n            left: \"0\",\r\n            pointerEvents: \"none\",\r\n            userSelect: \"none\",\r\n            WebkitUserSelect: \"none\",\r\n            MozUserSelect: \"none\",\r\n            msUserSelect: \"none\",\r\n          });\r\n          layer.setAttribute(\"aria-hidden\", \"true\");\r\n\r\n          if (fade) {\r\n            layer.style.opacity = String((1 - pct) / 2);\r\n          }\r\n        } catch {}\r\n      }\r\n\r\n      frag.appendChild(layer);\r\n    }\r\n\r\n    try {\r\n      this.layersContainer?.appendChild(frag);\r\n    } catch {}\r\n  }\r\n\r\n  _calculateTranslation(pct: number, direction: string) {\r\n    switch (direction) {\r\n      case \"backwards\":\r\n        return -pct * this.depthValue;\r\n      case \"forwards\":\r\n        return -(pct * this.depthValue) + this.depthValue;\r\n      case \"both\":\r\n      default:\r\n        return -(pct * this.depthValue) + this.depthValue / 2;\r\n    }\r\n  }\r\n\r\n  /* -------------------------\r\n     IntersectionObserver + ResizeObserver\r\n  ------------------------- */\r\n  _setupObservers() {\r\n    if (typeof window === \"undefined\" || typeof IntersectionObserver === \"undefined\") {\r\n      // noop for SSR or very old envs\r\n      return;\r\n    }\r\n\r\n    this.intersectionObserver = new IntersectionObserver(\r\n      (entries: IntersectionObserverEntry[]) => {\r\n        const entry = entries[0];\r\n        if (!entry) return;\r\n        this.isVisible = entry.isIntersecting;\r\n        if (!this.isVisible) this.tilt(0, 0);\r\n        else DEPTHTEXT_GLOBAL.updateAll();\r\n      },\r\n      { threshold: 0 }\r\n    );\r\n\r\n    try {\r\n      this.intersectionObserver.observe(this.element as Element);\r\n    } catch {\r\n      /* ignore */\r\n    }\r\n\r\n    if (typeof ResizeObserver !== \"undefined\") {\r\n      try {\r\n        // FIX: Protéger le callback avec check de destruction\r\n        this.resizeObserver = new ResizeObserver(() => {\r\n          if (!this._isDestroyed && this.isVisible && DEPTHTEXT_GLOBAL.instances.has(this)) {\r\n            DEPTHTEXT_GLOBAL.updateAll();\r\n          }\r\n        });\r\n        this.resizeObserver.observe(this.element as Element);\r\n      } catch {\r\n        /* ignore */\r\n      }\r\n    }\r\n  }\r\n\r\n  /* -------------------------\r\n     Register with global manager & attach global listeners if needed\r\n  ------------------------- */\r\n  _enableGlobalHooks() {\r\n    DEPTHTEXT_GLOBAL.instances.add(this);\r\n    if (this.options.event === \"pointer\") DEPTHTEXT_GLOBAL.attachPointerIfNeeded();\r\n    if ([\"scroll\", \"scrollX\", \"scrollY\"].includes(this.options.event)) DEPTHTEXT_GLOBAL.attachScrollIfNeeded();\r\n  }\r\n\r\n  /* -------------------------\r\n     Apply tilt (called by global RAF or pointer handler)\r\n  ------------------------- */\r\n  tilt(xPct = 0, yPct = 0) {\r\n    if (!this.wrapper) return;\r\n    const mul = this.options.eventDirection === \"reverse\" ? -1 : 1;\r\n    const xTilt = xPct * this.rotationValue * mul;\r\n    const yTilt = -yPct * this.rotationValue * mul;\r\n    try {\r\n      (this.wrapper as any).style.transform = `rotateX(${yTilt}${this.rotationUnit}) rotateY(${xTilt}${this.rotationUnit})`;\r\n    } catch {\r\n      /* ignore for non-DOM targets */\r\n    }\r\n  }\r\n\r\n  /* -------------------------\r\n     Recompute tilt from scroll (per-instance logic)\r\n  ------------------------- */\r\n  handleScrollGlobal() {\r\n    if (typeof window === \"undefined\") return;\r\n    try {\r\n      const rect = (this.element as Element).getBoundingClientRect();\r\n      let xPct = 0,\r\n        yPct = 0;\r\n      if (this.options.event === \"scroll\" || this.options.event === \"scrollX\") {\r\n        const centerX = rect.left + rect.width / 2 - window.innerWidth / 2;\r\n        xPct = (centerX / window.innerWidth) * 2;\r\n      }\r\n      if (this.options.event === \"scroll\" || this.options.event === \"scrollY\") {\r\n        const centerY = rect.top + rect.height / 2 - window.innerHeight / 2;\r\n        yPct = (centerY / window.innerHeight) * 2;\r\n      }\r\n      this.tilt(xPct, yPct);\r\n    } catch {\r\n      /* ignore in non-DOM contexts */\r\n    }\r\n  }\r\n\r\n  /* -------------------------\r\n     Public API: Update options dynamically\r\n  ------------------------- */\r\n  update(options?: Partial<DepthTextOptions>) {\r\n    if (this._isDestroyed) {\r\n      console.warn(\"DepthText: Cannot update destroyed instance\");\r\n      return;\r\n    }\r\n    if (options) {\r\n      this.options = this._validateOptions({ ...this.options, ...options });\r\n      this._parseUnits();\r\n    }\r\n    DEPTHTEXT_GLOBAL.updateAll();\r\n  }\r\n\r\n  /* -------------------------\r\n     Destroy instance (cleanup)\r\n  ------------------------- */\r\n  destroy() {\r\n    if (this._isDestroyed) return;\r\n    this._isDestroyed = true;\r\n\r\n    try {\r\n      this.intersectionObserver?.disconnect();\r\n    } catch {}\r\n    try {\r\n      this.resizeObserver?.disconnect();\r\n    } catch {}\r\n\r\n    // restore original content if template exists\r\n    try {\r\n      if (this.element) {\r\n        (this.element as any).innerHTML = \"\";\r\n        if (this._layerContentTemplate) {\r\n          (this.element as any).appendChild(this._layerContentTemplate.cloneNode(true));\r\n        }\r\n      }\r\n    } catch {\r\n      /* ignore */\r\n    }\r\n\r\n    // restore inline styles\r\n    this._originalStyles.forEach((v, k) => {\r\n      try {\r\n        (this.element as any).style[k] = v || \"\";\r\n      } catch {}\r\n    });\r\n\r\n    DEPTHTEXT_GLOBAL.instances.delete(this);\r\n    DEPTHTEXT_GLOBAL.detachPointerIfUnused();\r\n    DEPTHTEXT_GLOBAL.detachScrollIfUnused();\r\n\r\n    try {\r\n      delete (this.element as any)._depthTextInstance;\r\n    } catch {\r\n      (this.element as any)._depthTextInstance = undefined;\r\n    }\r\n  }\r\n}\r\n\r\n/* ===========================================================================\r\n   Auto-init + API\r\n   - Auto-initialize elements with data-depth attributes\r\n   - Provide global DepthTextify(selector, options)\r\n   =========================================================================== */\r\n\r\nexport function DepthTextify(selectorOrOptions?: string | DepthTextOptions, maybeOptions?: DepthTextOptions) {\r\n  // Overloads:\r\n  // DepthTextify() -> init all [data-depth]\r\n  // DepthTextify(selector) -> init selector\r\n  // DepthTextify(selector, options) -> init selector with options\r\n  // DepthTextify(undefined, options) -> init [data-depth] with options\r\n  if (typeof window === \"undefined\") return [];\r\n\r\n  let selector = \"[data-depth]\";\r\n  let options: DepthTextOptions | undefined = undefined;\r\n\r\n  if (typeof selectorOrOptions === \"string\") {\r\n    selector = selectorOrOptions;\r\n    options = maybeOptions;\r\n  } else if (typeof selectorOrOptions === \"object\" && selectorOrOptions !== null) {\r\n    // user passed options as first arg\r\n    options = selectorOrOptions as DepthTextOptions;\r\n  }\r\n\r\n  const nodes = Array.from(document.querySelectorAll(selector));\r\n  const instances: DepthTextInstance[] = [];\r\n  nodes.forEach((el) => {\r\n    try {\r\n      // Skip if already initialized\r\n      if ((el as any)._depthTextInstance) {\r\n        return;\r\n      }\r\n\r\n      // FIX: Lecture correcte des data-attributes\r\n      const dataset = (el as HTMLElement).dataset;\r\n\r\n      // Helper pour normaliser les valeurs vides\r\n      const getDataAttr = (key: string): string | undefined => {\r\n        const val = dataset[key];\r\n        return val === \"\" ? undefined : val;\r\n      };\r\n\r\n      const dataOptions: DepthTextOptions = {\r\n        // depth peut être data-depth ou data-depth-depth\r\n        depth: getDataAttr(\"depthDepth\") ?? getDataAttr(\"depth\"),\r\n\r\n        direction: getDataAttr(\"depthDirection\") as any,\r\n        event: getDataAttr(\"depthEvent\") as any,\r\n\r\n        // Support à la fois camelCase et lowercase pour eventRotation\r\n        eventRotation: getDataAttr(\"depthEventRotation\") ?? getDataAttr(\"depthEventrotation\"),\r\n        eventDirection: getDataAttr(\"depthEventDirection\") ?? (getDataAttr(\"depthEventdirection\") as any),\r\n\r\n        fade: getDataAttr(\"depthFade\") as any,\r\n        layers: getDataAttr(\"depthLayers\") as any,\r\n        perspective: getDataAttr(\"depthPerspective\") as any,\r\n\r\n        // FIX CRITIQUE: engaged utilise data-depth-engaged, PAS data-depth\r\n        engaged: getDataAttr(\"depthEngaged\") as any,\r\n\r\n        // Support multiples variantes pour addClass\r\n        addClass: getDataAttr(\"depthAddClass\") ?? getDataAttr(\"depthAddclass\") ?? getDataAttr(\"depthAdd\") ?? getDataAttr(\"addClass\"),\r\n      };\r\n\r\n      const mergedOptions = { ...(options || {}), ...(dataOptions || {}) };\r\n      const inst = new DepthTextInstance(el as MaybeElement, mergedOptions);\r\n      (el as any)._depthTextInstance = inst;\r\n      instances.push(inst);\r\n    } catch (err) {\r\n      // swallow errors per-element so a broken node doesn't stop others\r\n      console.error(\"DepthTextify: failed to initialize element\", err);\r\n    }\r\n  });\r\n\r\n  return instances.length === 1 ? instances[0] : instances;\r\n}\r\n\r\n/* Auto init on DOMContentLoaded */\r\nif (typeof window !== \"undefined\") {\r\n  document.addEventListener(\"DOMContentLoaded\", () => {\r\n    DepthTextify();\r\n  });\r\n\r\n  // Expose on window for convenience\r\n  try {\r\n    (window as any).DepthTextify = DepthTextify;\r\n  } catch {\r\n    /* ignore */\r\n  }\r\n}\r\n\r\n/* Export default names */\r\nexport default DepthTextInstance;\r\n"]}