{"version":3,"sources":["../src/defaults.ts","../src/cursor.ts","../src/utils/isEditable.ts","../src/keyboard.ts","../src/lens/createLens.ts","../src/capture/CanvasCapture.ts","../src/capture/CloneCapture.ts","../src/Magnifier.ts","../src/index.ts"],"sourcesContent":["import type { ResolvedMagnifierOptions } from './types';\n\nexport const DEFAULTS: ResolvedMagnifierOptions = {\n  shape: 'circle',\n\n  size: 220,\n  width: 360,\n  height: 220,\n\n  zoom: 2,\n\n  borderWidth: 3,\n  borderColor: 'rgba(255, 255, 255, 0.95)',\n  borderStyle: 'solid',\n  borderRadius: 8,\n  shadow: '0 10px 40px rgba(0,0,0,.45), 0 0 0 1px rgba(0,0,0,.15)',\n  background: '#ffffff',\n  crosshair: false,\n  crosshairColor: 'rgba(255,0,0,.6)',\n\n  autoStart: false,\n  hideCursor: true,\n  smooth: true,\n  smoothDuration: 50,\n  offsetX: 0,\n  offsetY: 0,\n  zIndex: 2147483646,\n  excludeSelectors: [],\n\n  renderMode: 'canvas',\n  refreshIntervalMs: 500,\n\n  keyboardShortcut: 'm',\n  shortcutWithCtrl: false,\n  shortcutWithAlt: true,\n  shortcutWithShift: false,\n\n  onEnable: null,\n  onDisable: null,\n  onMove: null,\n};\n","// Hiding the native cursor requires a global rule (`*` under a marker class) —\n// this is the one place the library touches page-wide CSS instead of inline\n// styles, so it is kept isolated in its own module.\nexport function injectCursorStyle(): HTMLStyleElement {\n  const style = document.createElement('style');\n  style.setAttribute('data-magnifier-cursor', '');\n  style.textContent =\n    'html.magnifier-active, html.magnifier-active *, ' +\n    'html.magnifier-active *::before, html.magnifier-active *::after ' +\n    '{ cursor: none !important; }';\n  document.head.appendChild(style);\n  document.documentElement.classList.add('magnifier-active');\n  return style;\n}\n\nexport function removeCursorStyle(style: HTMLStyleElement | null): void {\n  document.documentElement.classList.remove('magnifier-active');\n  if (style && style.parentNode) {\n    style.parentNode.removeChild(style);\n  }\n}\n","export function isEditable(el: Element | null): boolean {\n  if (!el) return false;\n  const tag = (el.tagName || '').toLowerCase();\n  return tag === 'input' || tag === 'textarea' || (el as HTMLElement).isContentEditable;\n}\n","import type { ResolvedMagnifierOptions } from './types';\nimport { isEditable } from './utils/isEditable';\n\nexport function matchesShortcut(e: KeyboardEvent, options: ResolvedMagnifierOptions): boolean {\n  const key = options.keyboardShortcut;\n  if (!key || !e.key) return false;\n  if (e.key.toLowerCase() !== String(key).toLowerCase()) return false;\n  if (isEditable(e.target as Element | null)) return false;\n\n  const ctrlOk = options.shortcutWithCtrl ? (e.ctrlKey || e.metaKey) : !(e.ctrlKey || e.metaKey);\n  const altOk = options.shortcutWithAlt ? e.altKey : !e.altKey;\n  const shiftOk = options.shortcutWithShift ? e.shiftKey : !e.shiftKey;\n\n  return ctrlOk && altOk && shiftOk;\n}\n","import type { ResolvedMagnifierOptions, MagnifierRenderMode } from '../types';\n\nexport interface LensRefs {\n  el: HTMLDivElement;\n  inner: HTMLDivElement | null;\n  canvas: HTMLCanvasElement | null;\n  ctx: CanvasRenderingContext2D | null;\n}\n\nexport function getLensSize(options: ResolvedMagnifierOptions): { w: number; h: number } {\n  if (options.shape === 'rectangle') return { w: options.width, h: options.height };\n  return { w: options.size, h: options.size };\n}\n\n/**\n * Builds the fixed-position lens element and, depending on render mode,\n * either a <canvas> (canvas mode draws snapshots into it) or an inner <div>\n * (clone mode scales a DOM clone inside it).\n */\nexport function createLens(options: ResolvedMagnifierOptions, renderMode: MagnifierRenderMode): LensRefs {\n  const { w, h } = getLensSize(options);\n  const radius = options.shape === 'circle' ? '50%' : `${options.borderRadius}px`;\n\n  const lens = document.createElement('div');\n  lens.setAttribute('aria-hidden', 'true');\n  lens.setAttribute('data-magnifier-lens', '');\n  Object.assign(lens.style, {\n    position: 'fixed',\n    left: '0',\n    top: '0',\n    width: `${w}px`,\n    height: `${h}px`,\n    borderRadius: radius,\n    border: `${options.borderWidth}px ${options.borderStyle} ${options.borderColor}`,\n    boxShadow: options.shadow,\n    background: options.background,\n    overflow: 'hidden',\n    pointerEvents: 'none',\n    zIndex: String(options.zIndex),\n    transform: 'translate3d(-9999px,-9999px,0)',\n    willChange: 'transform',\n    transition: options.smooth ? `transform ${options.smoothDuration}ms linear` : 'none',\n    display: 'none',\n  });\n\n  let inner: HTMLDivElement | null = null;\n  let canvas: HTMLCanvasElement | null = null;\n  let ctx: CanvasRenderingContext2D | null = null;\n\n  if (renderMode === 'canvas') {\n    // Canvas-based render: the page snapshot is drawn into `canvas` via\n    // drawImage — no second DOM tree lives inside the lens.\n    const dpr = window.devicePixelRatio || 1;\n    canvas = document.createElement('canvas');\n    canvas.width = Math.round(w * dpr);\n    canvas.height = Math.round(h * dpr);\n    Object.assign(canvas.style, {\n      position: 'absolute',\n      left: '0',\n      top: '0',\n      width: `${w}px`,\n      height: `${h}px`,\n      pointerEvents: 'none',\n    });\n    lens.appendChild(canvas);\n    ctx = canvas.getContext('2d');\n    if (ctx) ctx.scale(dpr, dpr); // HiDPI — logical coordinates are used everywhere else\n  } else {\n    // DOM clone render: a body clone is scaled inside `inner` via CSS transform.\n    inner = document.createElement('div');\n    inner.setAttribute('data-magnifier-inner', '');\n    Object.assign(inner.style, {\n      position: 'absolute',\n      left: '0',\n      top: '0',\n      width: `${document.documentElement.clientWidth}px`,\n      height: `${window.innerHeight}px`,\n      transformOrigin: '0 0',\n      pointerEvents: 'none',\n    });\n    lens.appendChild(inner);\n  }\n\n  if (options.crosshair) {\n    const ch = document.createElement('div');\n    Object.assign(ch.style, {\n      position: 'absolute',\n      left: '50%',\n      top: '50%',\n      width: '10px',\n      height: '10px',\n      marginLeft: '-5px',\n      marginTop: '-5px',\n      border: `1px solid ${options.crosshairColor}`,\n      borderRadius: '50%',\n      pointerEvents: 'none',\n      zIndex: '2',\n    });\n    lens.appendChild(ch);\n  }\n\n  document.body.appendChild(lens);\n  return { el: lens, inner, canvas, ctx };\n}\n","/**\n * Replaces cloned <link rel=\"stylesheet\"> tags with the CSS already parsed\n * for the live page (read synchronously from `document.styleSheets`).\n *\n * A foreignObject's cloned content is a fresh, isolated rendering context —\n * external stylesheets referenced by <link> have to be re-fetched inside it,\n * an async load with no guarantee of finishing before the SVG rasterizes.\n * When it loses that race, the snapshot renders with the stylesheet only\n * partially (or never) applied: every layout rule depending on it — a\n * centered `max-width` container, for instance — computes against the\n * browser's unstyled defaults instead, so content can render shifted from\n * where it actually sits on the live page. Inlining already-parsed CSS\n * removes that race entirely.\n */\nfunction inlineStylesheets(clonedHead: Element): void {\n  const links = Array.from(clonedHead.querySelectorAll('link[rel=\"stylesheet\"]'));\n  for (const link of links) {\n    const href = (link as HTMLLinkElement).href;\n    const sheet = Array.from(document.styleSheets).find((s) => s.href === href);\n    if (!sheet) continue;\n    try {\n      const cssText = Array.from(sheet.cssRules)\n        .map((rule) => rule.cssText)\n        .join('\\n');\n      const style = document.createElement('style');\n      style.textContent = cssText;\n      link.replaceWith(style);\n    } catch (e) {\n      // Cross-origin stylesheet — cssRules access is blocked by CORS.\n      // Leave the <link> in place; the <base> tag gives it a shot at\n      // resolving, best-effort only.\n    }\n  }\n}\n\n/**\n * Snapshots the page into an off-screen <canvas> by serializing the current\n * document into an SVG `foreignObject`, rasterizing that through an <img>,\n * and drawing the result into the canvas. This avoids creating a second DOM\n * tree inside the lens — the lens just `drawImage`s a region of this canvas.\n */\nexport class CanvasCapture {\n  private pageCanvas: HTMLCanvasElement | null = null;\n  private ready = false;\n  private inProgress = false;\n\n  // Device pixels per logical (CSS) page pixel, measured from the actual\n  // rasterized snapshot rather than assumed — see captureToCanvas().\n  private scaleX = 1;\n  private scaleY = 1;\n\n  constructor(private readonly onCaptured: () => void) {}\n\n  get isReady(): boolean {\n    return this.ready;\n  }\n\n  get source(): HTMLCanvasElement | null {\n    return this.pageCanvas;\n  }\n\n  get scale(): { x: number; y: number } {\n    return { x: this.scaleX, y: this.scaleY };\n  }\n\n  init(): void {\n    this.pageCanvas = document.createElement('canvas');\n  }\n\n  schedule(): void {\n    if (this.inProgress) return;\n    this.inProgress = true;\n    this.captureToCanvas()\n      .then(() => {\n        this.inProgress = false;\n      })\n      .catch(() => {\n        this.inProgress = false;\n      });\n  }\n\n  destroy(): void {\n    this.pageCanvas = null;\n    this.ready = false;\n    this.inProgress = false;\n    this.scaleX = 1;\n    this.scaleY = 1;\n  }\n\n  private captureToCanvas(): Promise<void> {\n    // clientWidth (not innerWidth) — innerWidth includes the scrollbar, which\n    // would make the snapshot's containing block wider than the live page's\n    // actual content width and shift centered/fluid layouts to the right.\n    const pw = document.documentElement.clientWidth;\n    const ph = document.documentElement.scrollHeight;\n\n    return new Promise((resolve) => {\n      try {\n        // Full document clone — <head> included so styles are preserved.\n        const htmlEl = document.documentElement.cloneNode(true) as HTMLElement;\n        htmlEl.querySelectorAll('[data-magnifier-lens], script, noscript').forEach((el) => el.remove());\n\n        // Pin <html>/<body> to an explicit, unambiguous width. Without this,\n        // a foreignObject's containing block for its cloned content isn't\n        // reliably `pw` px wide across browsers — any centered/max-width\n        // layout (e.g. Tailwind's `mx-auto`) then computes its margins\n        // against the wrong reference width and renders shifted left\n        // relative to where it actually sits on the live page.\n        htmlEl.style.setProperty('width', `${pw}px`, 'important');\n        htmlEl.style.setProperty('margin', '0', 'important');\n        const bodyEl = htmlEl.querySelector('body');\n        if (bodyEl instanceof HTMLElement) {\n          bodyEl.style.setProperty('width', `${pw}px`, 'important');\n          bodyEl.style.setProperty('margin', '0', 'important');\n        }\n\n        // Add a <base> for relative URLs, and inline stylesheets so layout\n        // doesn't depend on winning a re-fetch race inside the snapshot.\n        const head = htmlEl.querySelector('head');\n        if (head) {\n          let base = htmlEl.querySelector('base');\n          if (!base) {\n            base = document.createElement('base');\n            base.href = document.baseURI || location.href;\n            head.insertBefore(base, head.firstChild);\n          }\n          inlineStylesheets(head);\n        }\n\n        const serialized = new XMLSerializer().serializeToString(htmlEl);\n\n        // HTML wrapped in an SVG foreignObject → Image → Canvas.\n        //\n        // `width`/`height` on the outer <svg> request the actual raster\n        // resolution (device pixels, for crisp HiDPI output); `viewBox`\n        // keeps the foreignObject's own coordinate system in logical CSS\n        // pixels (matching `pw`/`ph`, i.e. the live page's real layout\n        // width) so the embedded page reflows identically to how it\n        // renders on screen — not wider/narrower, which would silently\n        // shift where content ends up relative to the cursor.\n        const dpr = window.devicePixelRatio || 1;\n        const rasterW = Math.round(pw * dpr);\n        const rasterH = Math.round(ph * dpr);\n        const svgStr =\n          `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${rasterW}\" height=\"${rasterH}\" viewBox=\"0 0 ${pw} ${ph}\">` +\n          `<foreignObject x=\"0\" y=\"0\" width=\"${pw}\" height=\"${ph}\">` +\n          serialized +\n          `</foreignObject></svg>`;\n\n        const blob = new Blob([svgStr], { type: 'image/svg+xml;charset=utf-8' });\n        const url = URL.createObjectURL(blob);\n        const img = new Image();\n\n        img.onload = () => {\n          if (this.pageCanvas) {\n            // Never assume the browser rasterized at exactly rasterW×rasterH —\n            // measure it and draw 1:1. Force-stretching a mismatched source\n            // into a fixed size (the previous approach) silently distorts the\n            // scale, which is what was throwing the lens sampling off.\n            const naturalW = img.naturalWidth || rasterW;\n            const naturalH = img.naturalHeight || rasterH;\n            this.pageCanvas.width = naturalW;\n            this.pageCanvas.height = naturalH;\n            this.scaleX = naturalW / pw;\n            this.scaleY = naturalH / ph;\n            const ctx = this.pageCanvas.getContext('2d');\n            if (ctx) {\n              ctx.clearRect(0, 0, naturalW, naturalH);\n              ctx.drawImage(img, 0, 0, naturalW, naturalH);\n            }\n            this.ready = true;\n            this.onCaptured();\n          }\n          URL.revokeObjectURL(url);\n          resolve();\n        };\n\n        img.onerror = () => {\n          URL.revokeObjectURL(url);\n          resolve();\n        };\n\n        img.src = url;\n      } catch (e) {\n        resolve();\n      }\n    });\n  }\n}\n","/**\n * Fallback/explicit 'clone' render strategy: clones `document.body` into the\n * lens's inner element and lets the caller scale it with a CSS transform.\n * Used when cross-origin images make the canvas snapshot unreliable.\n */\nexport class CloneCapture {\n  constructor(private readonly inner: HTMLDivElement) {}\n\n  build(): void {\n    this.refresh();\n  }\n\n  refresh(): void {\n    try {\n      const body = document.body;\n      const clone = body.cloneNode(true) as HTMLElement;\n      clone.querySelectorAll('script, noscript, iframe, [data-magnifier-lens]').forEach((el) => el.remove());\n      Object.assign(clone.style, {\n        position: 'absolute',\n        left: '0',\n        top: '0',\n        width: `${document.documentElement.clientWidth}px`,\n        margin: '0',\n        padding: getComputedStyle(body).padding,\n        pointerEvents: 'none',\n      });\n      while (this.inner.firstChild) this.inner.removeChild(this.inner.firstChild);\n      this.inner.style.width = `${document.documentElement.clientWidth}px`;\n      this.inner.style.height = `${document.documentElement.scrollHeight}px`;\n      clone.style.top = '0px';\n      this.inner.appendChild(clone);\n    } catch (e) {\n      /* swallow */\n    }\n  }\n}\n","import type { MagnifierOptions, ResolvedMagnifierOptions, MagnifierRenderMode } from './types';\nimport { DEFAULTS } from './defaults';\nimport { injectCursorStyle, removeCursorStyle } from './cursor';\nimport { matchesShortcut } from './keyboard';\nimport { createLens, getLensSize } from './lens/createLens';\nimport { CanvasCapture } from './capture/CanvasCapture';\nimport { CloneCapture } from './capture/CloneCapture';\n\nconst VERSION = '2.0.3';\n\n/**\n * Cursor-following, shape-configurable screen magnifier with zero runtime\n * dependencies. See README.md for the full option reference.\n */\nexport class Magnifier {\n  static readonly version = VERSION;\n\n  private options: ResolvedMagnifierOptions;\n  private enabled = false;\n  private renderMode: MagnifierRenderMode | null = null;\n\n  private lens: HTMLDivElement | null = null;\n  private inner: HTMLDivElement | null = null;\n  private lensCanvas: HTMLCanvasElement | null = null;\n  private lensCtx: CanvasRenderingContext2D | null = null;\n\n  private canvasCapture: CanvasCapture | null = null;\n  private cloneCapture: CloneCapture | null = null;\n\n  private cursorStyle: HTMLStyleElement | null = null;\n  private mouseX = 0;\n  private mouseY = 0;\n  private rafId: number | null = null;\n  private cloneTimer: ReturnType<typeof setInterval> | null = null;\n  private mo: MutationObserver | null = null;\n  private moPending = false;\n\n  constructor(options: MagnifierOptions = {}) {\n    this.options = { ...DEFAULTS, ...options };\n\n    if (this.options.keyboardShortcut) {\n      document.addEventListener('keydown', this.onKeyDown, true);\n    }\n\n    if (this.options.autoStart) {\n      if (document.readyState === 'loading') {\n        document.addEventListener('DOMContentLoaded', () => this.enable(), { once: true });\n      } else {\n        this.enable();\n      }\n    }\n  }\n\n  /* -------- Public API -------- */\n\n  enable(): void {\n    if (this.enabled) return;\n    this.enabled = true;\n\n    const rm = this.options.renderMode;\n    this.renderMode = rm === 'auto' ? (this.supportsCanvas() ? 'canvas' : 'clone') : rm;\n\n    this.createLensElement();\n\n    if (this.renderMode === 'canvas') {\n      this.canvasCapture = new CanvasCapture(() => {\n        if (!this.rafId) this.rafId = requestAnimationFrame(this.tick);\n      });\n      this.canvasCapture.init();\n      this.canvasCapture.schedule();\n      this.cloneTimer = setInterval(() => this.canvasCapture?.schedule(), this.options.refreshIntervalMs);\n    } else {\n      this.cloneCapture = new CloneCapture(this.inner as HTMLDivElement);\n      this.cloneCapture.build();\n      this.cloneTimer = setInterval(() => this.cloneCapture?.refresh(), this.options.refreshIntervalMs);\n    }\n\n    this.cursorStyle = this.options.hideCursor ? injectCursorStyle() : null;\n\n    document.addEventListener('mousemove', this.onMouseMove, { passive: true });\n    document.documentElement.addEventListener('mouseleave', this.onMouseLeave);\n    document.documentElement.addEventListener('mouseenter', this.onMouseEnter);\n    window.addEventListener('scroll', this.onScroll, { passive: true, capture: true });\n    window.addEventListener('resize', this.onResize);\n\n    if (typeof MutationObserver !== 'undefined') {\n      this.mo = new MutationObserver(() => {\n        if (this.moPending) return;\n        this.moPending = true;\n        setTimeout(() => {\n          this.moPending = false;\n          if (!this.enabled) return;\n          if (this.renderMode === 'canvas') this.canvasCapture?.schedule();\n          else this.cloneCapture?.refresh();\n        }, 200);\n      });\n      this.mo.observe(document.body, {\n        childList: true,\n        subtree: true,\n        characterData: true,\n        attributes: true,\n      });\n    }\n\n    this.callCallback('onEnable');\n  }\n\n  disable(): void {\n    if (!this.enabled) return;\n    this.enabled = false;\n\n    document.removeEventListener('mousemove', this.onMouseMove);\n    document.documentElement.removeEventListener('mouseleave', this.onMouseLeave);\n    document.documentElement.removeEventListener('mouseenter', this.onMouseEnter);\n    window.removeEventListener('scroll', this.onScroll, true);\n    window.removeEventListener('resize', this.onResize);\n\n    if (this.rafId) {\n      cancelAnimationFrame(this.rafId);\n      this.rafId = null;\n    }\n    if (this.cloneTimer) {\n      clearInterval(this.cloneTimer);\n      this.cloneTimer = null;\n    }\n    if (this.mo) {\n      this.mo.disconnect();\n      this.mo = null;\n    }\n\n    this.removeLensElement();\n    removeCursorStyle(this.cursorStyle);\n    this.cursorStyle = null;\n    this.callCallback('onDisable');\n  }\n\n  toggle(): void {\n    this.enabled ? this.disable() : this.enable();\n  }\n\n  isEnabled(): boolean {\n    return this.enabled;\n  }\n\n  setOptions(newOptions: MagnifierOptions = {}): void {\n    const wasEnabled = this.enabled;\n    this.options = { ...this.options, ...newOptions };\n    if (wasEnabled) {\n      this.disable();\n      this.enable();\n    }\n  }\n\n  getOptions(): ResolvedMagnifierOptions {\n    return { ...this.options };\n  }\n\n  destroy(): void {\n    this.disable();\n    if (this.options.keyboardShortcut) {\n      document.removeEventListener('keydown', this.onKeyDown, true);\n    }\n  }\n\n  /* -------- Private -------- */\n\n  private supportsCanvas(): boolean {\n    try {\n      return !!(\n        typeof document.createElement('canvas').getContext === 'function' &&\n        typeof XMLSerializer !== 'undefined' &&\n        typeof URL.createObjectURL === 'function'\n      );\n    } catch (e) {\n      return false;\n    }\n  }\n\n  private callCallback(name: 'onEnable' | 'onDisable'): void {\n    const cb = this.options[name];\n    if (typeof cb === 'function') {\n      try {\n        cb.call(this);\n      } catch (e) {\n        /* swallow */\n      }\n    }\n  }\n\n  private createLensElement(): void {\n    const { el, inner, canvas, ctx } = createLens(this.options, this.renderMode as MagnifierRenderMode);\n    this.lens = el;\n    this.inner = inner;\n    this.lensCanvas = canvas;\n    this.lensCtx = ctx;\n  }\n\n  private removeLensElement(): void {\n    if (this.lens && this.lens.parentNode) {\n      this.lens.parentNode.removeChild(this.lens);\n    }\n    this.lens = null;\n    this.inner = null;\n    this.lensCanvas = null;\n    this.lensCtx = null;\n    this.canvasCapture?.destroy();\n    this.canvasCapture = null;\n    this.cloneCapture = null;\n  }\n\n  /* ---- Event handlers ---- */\n\n  private onMouseMove = (e: MouseEvent): void => {\n    this.mouseX = e.clientX;\n    this.mouseY = e.clientY;\n\n    const excluded = this.options.excludeSelectors;\n    if (excluded && excluded.length) {\n      const sel = excluded.join(',');\n      const target = e.target as Element | null;\n      if (target && target.closest(sel)) {\n        if (this.lens) this.lens.style.display = 'none';\n        return;\n      }\n    }\n\n    if (!this.rafId) this.rafId = requestAnimationFrame(this.tick);\n  };\n\n  private onMouseLeave = (): void => {\n    if (this.lens) this.lens.style.display = 'none';\n  };\n\n  private onMouseEnter = (): void => {\n    if (this.lens) this.lens.style.display = 'block';\n  };\n\n  private onScroll = (): void => {\n    if (!this.rafId) this.rafId = requestAnimationFrame(this.tick);\n  };\n\n  private onResize = (): void => {\n    if (this.renderMode === 'clone' && this.inner) {\n      this.inner.style.width = `${document.documentElement.clientWidth}px`;\n      this.cloneCapture?.refresh();\n    } else if (this.renderMode === 'canvas') {\n      this.canvasCapture?.schedule();\n    }\n    if (!this.rafId) this.rafId = requestAnimationFrame(this.tick);\n  };\n\n  private onKeyDown = (e: KeyboardEvent): void => {\n    if (matchesShortcut(e, this.options)) {\n      e.preventDefault();\n      e.stopPropagation();\n      this.toggle();\n    }\n  };\n\n  /* ---- Render tick ---- */\n\n  private tick = (): void => {\n    this.rafId = null;\n    if (!this.enabled || !this.lens) return;\n\n    const opt = this.options;\n    const { w: lensW, h: lensH } = getLensSize(opt);\n\n    const lensX = this.mouseX - lensW / 2 + opt.offsetX;\n    const lensY = this.mouseY - lensH / 2 + opt.offsetY;\n\n    this.lens.style.display = 'block';\n    this.lens.style.transform = `translate3d(${lensX}px, ${lensY}px, 0)`;\n\n    const pageCanvas = this.canvasCapture?.source ?? null;\n\n    if (this.renderMode === 'canvas' && this.lensCtx && pageCanvas && this.canvasCapture?.isReady) {\n      // Canvas mode: copy the magnified region of the page snapshot into the\n      // lens canvas. drawImage's source→destination scaling is the zoom —\n      // no CSS transform needed.\n      const { x: scaleX, y: scaleY } = this.canvasCapture.scale;\n      const z = opt.zoom;\n\n      // Compute the sample region in logical (CSS) page pixels first — this\n      // is the same coordinate space as mouseX/mouseY/scrollY — then convert\n      // to the snapshot's actual pixel space via the measured scale factor.\n      const srcWLogical = lensW / z;\n      const srcHLogical = lensH / z;\n      const srcXLogical = this.mouseX - srcWLogical / 2;\n      const srcYLogical = this.mouseY + window.scrollY - srcHLogical / 2;\n\n      const srcW = srcWLogical * scaleX;\n      const srcH = srcHLogical * scaleY;\n      const srcX = srcXLogical * scaleX;\n      const srcY = srcYLogical * scaleY;\n\n      const maxX = pageCanvas.width - srcW;\n      const maxY = pageCanvas.height - srcH;\n      const cx = Math.max(0, Math.min(srcX, maxX));\n      const cy = Math.max(0, Math.min(srcY, maxY));\n\n      this.lensCtx.clearRect(0, 0, lensW, lensH);\n      this.lensCtx.drawImage(pageCanvas, cx, cy, srcW, srcH, 0, 0, lensW, lensH);\n    } else if (this.renderMode !== 'canvas' && this.inner) {\n      // Clone mode: magnify the DOM clone with a CSS transform.\n      const z = opt.zoom;\n      const tx = -(this.mouseX * z) + lensW / 2;\n      const ty = -((this.mouseY + window.scrollY) * z) + lensH / 2;\n      this.inner.style.transform = `translate(${tx}px, ${ty}px) scale(${z})`;\n    }\n\n    if (typeof opt.onMove === 'function') {\n      try {\n        opt.onMove.call(this, this.mouseX, this.mouseY);\n      } catch (e) {\n        /* swallow */\n      }\n    }\n  };\n}\n","import { Magnifier } from './Magnifier';\n\n// No named runtime export alongside `default` on purpose — it lets the build\n// (see tsup.config.ts's `cjsInterop`) make `require('a11y-magnifier')` return\n// the class directly, matching the old UMD file's ergonomics.\nexport default Magnifier;\nexport type { MagnifierOptions, MagnifierShape, MagnifierRenderMode, ResolvedMagnifierOptions } from './types';\n"],"mappings":"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","names":[]}