{"version":3,"sources":["../src/runtime/phases.ts","../src/runtime/registry.tsx","../src/runtime/TimelineProvider.tsx","../src/runtime/hooks.ts","../src/runtime/SceneRoot.tsx","../src/annotations/selector.ts","../src/annotations/fiber.ts","../src/annotations/storage.ts","../src/annotations/AnnotationsProvider.tsx","../src/annotations/export.ts","../src/scenes/PaperScene.tsx","../src/panel/Welcome.tsx","../src/panel/SampleScene.tsx","../src/panel/Tooltip.tsx","../src/panel/LoupePanel.tsx","../src/annotations/AnnotationOverlay.tsx","../src/annotations/AnnotationPins.tsx"],"names":["cubicBezier","createContext","useRef","useState","useCallback","useEffect","useMemo","jsx","useContext","motionValue","useTransform","forwardRef","SceneRoot","PaperScene","jsxs","motion","ACCENT","createPortal","AnimatePresence","useMotionValue","tick","PANEL_BG","PANEL_FG","PANEL_MUTED","PANEL_BORDER","FONT","Fragment","useDragControls","useLayoutEffect","useMotionValueEvent","formatMs"],"mappings":"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","file":"index.cjs","sourcesContent":["import { cubicBezier, type EasingFunction } from 'framer-motion';\n\nexport type SceneConfig = {\n  id: string;\n  label: string;\n  phaseOrder: readonly string[];\n  phaseDurations: Readonly<Record<string, number>>;\n  phaseLabels?: Readonly<Record<string, string>>;\n};\n\nexport type PhaseRange = {\n  phase: string;\n  start: number;\n  end: number;\n  duration: number;\n};\n\nexport function computeRanges(config: SceneConfig): PhaseRange[] {\n  const out: PhaseRange[] = [];\n  let cursor = 0;\n  for (const phase of config.phaseOrder) {\n    const duration = config.phaseDurations[phase] ?? 0;\n    out.push({ phase, start: cursor, end: cursor + duration, duration });\n    cursor += duration;\n  }\n  return out;\n}\n\nexport function totalDurationFor(ranges: PhaseRange[]): number {\n  if (ranges.length === 0) return 0;\n  return ranges[ranges.length - 1].end;\n}\n\nexport function rangeOf(ranges: PhaseRange[], phase: string): PhaseRange {\n  const found = ranges.find((r) => r.phase === phase);\n  if (!found) throw new Error(`Phase \"${phase}\" has no range`);\n  return found;\n}\n\n/**\n * Wrap `t` into the range `[0, total)`. Used by the rAF tick to keep\n * `time` bounded after the loop hits the end. Handles dt accumulating\n * beyond a single period (e.g. tab backgrounded, then resumed) and\n * negative inputs.\n */\nexport function wrapTime(t: number, total: number): number {\n  if (total <= 0) return t;\n  return ((t % total) + total) % total;\n}\n\nexport function phaseAtTime(\n  ranges: PhaseRange[],\n  totalDuration: number,\n  time: number,\n): string {\n  if (ranges.length === 0) return '';\n  const t = Math.max(0, Math.min(time, totalDuration - 0.001));\n  for (const r of ranges) {\n    if (t >= r.start && t < r.end) return r.phase;\n  }\n  return ranges[ranges.length - 1].phase;\n}\n\n/** Calm, decisive easing — no bounce. Loupe's house default. */\nexport const HOUSE_CURVE_FN: EasingFunction = cubicBezier(0.59, 0.01, 0.4, 0.98);\n\n/** Soft settle with mild overshoot — for cards landing into place. */\nexport const SETTLE_CURVE_FN: EasingFunction = cubicBezier(\n  0.175,\n  0.885,\n  0.32,\n  1.275,\n);\n","import {\n  createContext,\n  useCallback,\n  useContext,\n  useEffect,\n  useMemo,\n  useRef,\n  useState,\n} from 'react';\nimport type { MotionValue } from 'framer-motion';\nimport type { PhaseRange } from './phases';\n\n/**\n * LoupeRegistry — app-root context that knows about every Loupe-enabled\n * scene currently mounted on the page. A single floating panel drives the\n * active scene picked from the dropdown.\n */\n\nexport type RegisteredTimeline = {\n  time: MotionValue<number>;\n  ranges: PhaseRange[];\n  totalDuration: number;\n  phaseOrder: readonly string[];\n  phaseLabels?: Readonly<Record<string, string>>;\n  speed: number;\n  setSpeed: (s: number) => void;\n  paused: boolean;\n  setPaused: (p: boolean) => void;\n  seek: (ms: number) => void;\n  restart: () => void;\n};\n\nexport type RegisteredAnnotations = {\n  state: unknown;\n};\n\nexport type RegisteredScene = {\n  id: string;\n  label: string;\n  rootRef: React.RefObject<HTMLElement | null>;\n  timeline: RegisteredTimeline;\n  annotations?: RegisteredAnnotations;\n};\n\n/**\n * Shape callers pass to `useRegisterSceneWithLoupe`. Matches what\n * a TimelineProvider-style component already computes — a MotionValue\n * + scene config + controls. Keep this decoupled from our internal\n * `TimelineState` so third-party timelines don't need to mirror our\n * exact types.\n */\nexport type ExternalScene = {\n  id: string;\n  label: string;\n  phaseOrder: readonly string[];\n  phaseLabels?: Readonly<Record<string, string>>;\n  ranges: PhaseRange[];\n  totalDuration: number;\n  time: MotionValue<number>;\n  speed: number;\n  setSpeed: (s: number) => void;\n  paused: boolean;\n  setPaused: (p: boolean) => void;\n  seek: (ms: number) => void;\n  restart: () => void;\n};\n\ntype LoupeRegistryState = {\n  scenes: RegisteredScene[];\n  activeSceneId: string | null;\n  /**\n   * Set the active scene by id, or pass `null` to clear selection\n   * (collapses the floating panel to a draggable pill). Marks the\n   * user's choice as sticky so later registrations don't auto-swap\n   * it back.\n   */\n  setActiveSceneId: (id: string | null) => void;\n  registerScene: (scene: RegisteredScene) => void;\n  unregisterScene: (id: string) => void;\n  attachAnnotations: (sceneId: string, ann: RegisteredAnnotations) => void;\n  flashTick: number;\n  flash: (id: string) => void;\n};\n\nconst LoupeRegistryContext = createContext<LoupeRegistryState | null>(null);\n\nexport function LoupeRegistryProvider({\n  children,\n}: {\n  children: React.ReactNode;\n}) {\n  const scenesRef = useRef<RegisteredScene[]>([]);\n  const [scenes, setScenes] = useState<RegisteredScene[]>([]);\n  const [activeSceneId, setActiveSceneIdState] = useState<string | null>(null);\n  const [flashTick, setFlashTick] = useState(0);\n  /**\n   * Once the user explicitly picks a scene via the panel dropdown,\n   * stop auto-switching on new registrations. Without this we'd\n   * yank the user's selection back to \"whatever just registered\"\n   * every time a scene re-registered (common with HMR / effect\n   * re-runs).\n   */\n  const userPickedRef = useRef(false);\n\n  const sync = useCallback(() => {\n    setScenes([...scenesRef.current]);\n  }, []);\n\n  /** ID of the generated demo scene — the registry treats it as\n   *  secondary to any real scene. See `cli/auto-wire.ts`. */\n  const DEMO_SCENE_ID = 'loupe-demo';\n\n  const registerScene = useCallback(\n    (scene: RegisteredScene) => {\n      const existing = scenesRef.current.find((s) => s.id === scene.id);\n      if (existing) {\n        Object.assign(existing, scene);\n      } else {\n        scenesRef.current.push(scene);\n      }\n      sync();\n      setActiveSceneIdState((current) => {\n        // User has already made an explicit pick — honor it.\n        if (userPickedRef.current) return current;\n        // Prefer any real scene over the demo. If the current active\n        // is the demo and a non-demo just registered, auto-switch.\n        const nonDemo = scenesRef.current.find(\n          (s) => s.id !== DEMO_SCENE_ID,\n        );\n        if (nonDemo) return nonDemo.id;\n        // Only demo around — keep current selection or fall back.\n        return current ?? scene.id;\n      });\n    },\n    [sync],\n  );\n\n  const unregisterScene = useCallback(\n    (id: string) => {\n      scenesRef.current = scenesRef.current.filter((s) => s.id !== id);\n      sync();\n      setActiveSceneIdState((current) => {\n        if (current !== id) return current;\n        const next = scenesRef.current[0]?.id ?? null;\n        return next;\n      });\n    },\n    [sync],\n  );\n\n  const attachAnnotations = useCallback(\n    (sceneId: string, ann: RegisteredAnnotations) => {\n      const scene = scenesRef.current.find((s) => s.id === sceneId);\n      if (!scene) return;\n      scene.annotations = ann;\n      sync();\n    },\n    [sync],\n  );\n\n  const setActiveSceneId = useCallback((id: string | null) => {\n    userPickedRef.current = true;\n    setActiveSceneIdState(id);\n    // Only flash when selecting a real scene — collapsing to \"None\"\n    // doesn't need a flash since there's nothing to highlight on the\n    // page.\n    if (id) setFlashTick((t) => t + 1);\n  }, []);\n\n  const flash = useCallback((id: string) => {\n    setActiveSceneIdState(id);\n    setFlashTick((t) => t + 1);\n  }, []);\n\n  /**\n   * Picker rescue: force `pointer-events: auto` on every registered\n   * scene's root element while Loupe is mounted. `document.elementFromPoint`\n   * sees through any ancestor with `pointer-events: none`, so a scene\n   * wrapped in (or nested under) a click-through container would be\n   * invisible to the picker. Patching here means every scene that goes\n   * through `TimelineProvider` or `useRegisterSceneWithLoupe` is rescued\n   * automatically — consumers don't have to remember the rule.\n   *\n   * We record the element's original inline `pointerEvents` value so we\n   * can restore it when the scene unregisters or the provider unmounts.\n   */\n  const patchedRef = useRef<Map<string, { el: HTMLElement; original: string }>>(\n    new Map(),\n  );\n  useEffect(() => {\n    const patched = patchedRef.current;\n    const liveIds = new Set(scenes.map((s) => s.id));\n\n    // Restore + drop entries for scenes that have gone away.\n    for (const [id, entry] of patched) {\n      if (!liveIds.has(id)) {\n        entry.el.style.pointerEvents = entry.original;\n        patched.delete(id);\n      }\n    }\n\n    // Patch any scene whose element is mounted and not yet patched.\n    for (const scene of scenes) {\n      const el = scene.rootRef.current;\n      if (!(el instanceof HTMLElement)) continue;\n      const existing = patched.get(scene.id);\n      if (existing && existing.el === el) continue;\n      // Element swapped (HMR, remount) — restore the old one before\n      // re-patching the new one.\n      if (existing && existing.el !== el) {\n        existing.el.style.pointerEvents = existing.original;\n      }\n      patched.set(scene.id, { el, original: el.style.pointerEvents });\n      el.style.pointerEvents = 'auto';\n    }\n  }, [scenes]);\n\n  useEffect(() => {\n    // Provider-unmount cleanup: restore every patched element.\n    const patched = patchedRef.current;\n    return () => {\n      for (const entry of patched.values()) {\n        entry.el.style.pointerEvents = entry.original;\n      }\n      patched.clear();\n    };\n  }, []);\n\n  const value = useMemo<LoupeRegistryState>(\n    () => ({\n      scenes,\n      activeSceneId,\n      setActiveSceneId,\n      registerScene,\n      unregisterScene,\n      attachAnnotations,\n      flashTick,\n      flash,\n    }),\n    [\n      scenes,\n      activeSceneId,\n      setActiveSceneId,\n      registerScene,\n      unregisterScene,\n      attachAnnotations,\n      flashTick,\n      flash,\n    ],\n  );\n\n  return (\n    <LoupeRegistryContext.Provider value={value}>\n      {children}\n    </LoupeRegistryContext.Provider>\n  );\n}\n\nexport function useLoupeRegistry(): LoupeRegistryState {\n  const ctx = useContext(LoupeRegistryContext);\n  if (!ctx)\n    throw new Error('useLoupeRegistry must be used inside LoupeRegistryProvider');\n  return ctx;\n}\n\nexport function useOptionalLoupeRegistry(): LoupeRegistryState | null {\n  return useContext(LoupeRegistryContext);\n}\n\n/**\n * Register a scene with the Loupe panel's registry from outside\n * Loupe's built-in `<TimelineProvider>`. Useful when you've got\n * your OWN TimelineProvider implementation (e.g. a local copy of\n * the timeline primitives) and just want its state to show up in\n * the Loupe panel's scene dropdown.\n *\n * Call this inside your provider with the scene's timeline state\n * + the root-element ref you want the panel to flash / scroll to.\n * No-op if no `<LoupeRegistryProvider>` is mounted above — safe to\n * leave in place even when Loupe isn't active.\n *\n * @example\n * ```tsx\n * function MyTimelineProvider({ config, children }) {\n *   const time = motionValue(0);\n *   // ...all the usual state...\n *   const value = { id: config.id, label: config.label, time, ... };\n *   const rootRef = useRef<HTMLDivElement | null>(null);\n *   useRegisterSceneWithLoupe(value, rootRef);\n *   return <div ref={rootRef}>{children}</div>;\n * }\n * ```\n */\nexport function useRegisterSceneWithLoupe(\n  scene: ExternalScene,\n  rootRef: React.RefObject<HTMLElement | null>,\n): void {\n  const registry = useOptionalLoupeRegistry();\n  // Pull the stable useCallback refs off the registry BEFORE using\n  // them as deps. Depending on the whole `registry` object would\n  // retrigger the effect on every scene registration (registry.value\n  // re-memoizes when scenes changes), which re-registers, which\n  // re-memoizes, which re-registers — infinite loop. The callback\n  // references are stable, so deps on them are safe.\n  const registerScene = registry?.registerScene;\n  const unregisterScene = registry?.unregisterScene;\n\n  // Identity-level registration. Mount = register, unmount =\n  // unregister. paused/speed are intentionally NOT in deps —\n  // re-running the cleanup on every pause toggle would call\n  // unregisterScene mid-flip, which reassigns active to whatever\n  // remained in the registry (the first-registered scene), causing\n  // the panel to jump scenes. A second effect below pushes the\n  // live paused/speed values without tearing registration down.\n  useEffect(() => {\n    if (!registerScene || !unregisterScene) return;\n    registerScene({\n      id: scene.id,\n      label: scene.label,\n      rootRef,\n      timeline: {\n        time: scene.time,\n        ranges: scene.ranges,\n        totalDuration: scene.totalDuration,\n        phaseOrder: scene.phaseOrder,\n        phaseLabels: scene.phaseLabels,\n        speed: scene.speed,\n        setSpeed: scene.setSpeed,\n        paused: scene.paused,\n        setPaused: scene.setPaused,\n        seek: scene.seek,\n        restart: scene.restart,\n      },\n    });\n    return () => unregisterScene(scene.id);\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [\n    scene.id,\n    scene.label,\n    scene.phaseOrder,\n    scene.phaseLabels,\n    scene.ranges,\n    scene.totalDuration,\n    rootRef,\n    registerScene,\n    unregisterScene,\n  ]);\n\n  // Live paused/speed updates. registerScene merges by id, so this\n  // just refreshes the values without an unregister cycle.\n  useEffect(() => {\n    if (!registerScene) return;\n    registerScene({\n      id: scene.id,\n      label: scene.label,\n      rootRef,\n      timeline: {\n        time: scene.time,\n        ranges: scene.ranges,\n        totalDuration: scene.totalDuration,\n        phaseOrder: scene.phaseOrder,\n        phaseLabels: scene.phaseLabels,\n        speed: scene.speed,\n        setSpeed: scene.setSpeed,\n        paused: scene.paused,\n        setPaused: scene.setPaused,\n        seek: scene.seek,\n        restart: scene.restart,\n      },\n    });\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [scene.paused, scene.speed]);\n}\n\nconst SceneRootRefContext = createContext<React.RefObject<HTMLElement | null> | null>(\n  null,\n);\n\nexport function SceneRootRefProvider({\n  refValue,\n  children,\n}: {\n  refValue: React.RefObject<HTMLElement | null>;\n  children: React.ReactNode;\n}) {\n  return (\n    <SceneRootRefContext.Provider value={refValue}>\n      {children}\n    </SceneRootRefContext.Provider>\n  );\n}\n\nexport function useSceneRootRef(): React.RefObject<HTMLElement | null> {\n  const ref = useContext(SceneRootRefContext);\n  if (!ref)\n    throw new Error('useSceneRootRef must be used inside a TimelineProvider');\n  return ref;\n}\n\n/**\n * Like `useSceneRootRef` but returns `null` when no provider is mounted.\n * Used by `<SceneRoot>` to detect whether Loupe is active without throwing\n * in production code that ships the component but skips the provider.\n */\nexport function useOptionalSceneRootRef(): React.RefObject<HTMLElement | null> | null {\n  return useContext(SceneRootRefContext);\n}\n","import {\n  createContext,\n  useContext,\n  useEffect,\n  useMemo,\n  useRef,\n  useState,\n} from 'react';\nimport { motionValue, type MotionValue } from 'framer-motion';\nimport {\n  computeRanges,\n  totalDurationFor,\n  wrapTime,\n  type PhaseRange,\n  type SceneConfig,\n} from './phases';\nimport { SceneRootRefProvider, useOptionalLoupeRegistry } from './registry';\n\n/**\n * TimelineProvider — owns the time axis for a single scene.\n *\n * Each scene wraps itself in a `<TimelineProvider config={...}>`. The provider\n * computes phase ranges, runs the rAF loop, and (if a LoupeRegistry is mounted\n * above) registers itself so the floating panel can drive it.\n */\n\nexport type TimelineState = {\n  sceneId: string;\n  sceneLabel: string;\n  ranges: PhaseRange[];\n  totalDuration: number;\n  phaseOrder: readonly string[];\n  time: MotionValue<number>;\n  speed: number;\n  setSpeed: (s: number) => void;\n  paused: boolean;\n  setPaused: (p: boolean) => void;\n  seek: (ms: number) => void;\n  restart: () => void;\n};\n\nexport const TimelineContext = createContext<TimelineState | null>(null);\n\nexport function TimelineProvider({\n  config,\n  children,\n}: {\n  config: SceneConfig;\n  children: React.ReactNode;\n}) {\n  const time = useMemo(() => motionValue(0), []);\n  const [speed, setSpeed] = useState(1);\n  const [paused, setPaused] = useState(false);\n  const rafRef = useRef<number | null>(null);\n  const lastTimestampRef = useRef<number | null>(null);\n  const sceneRootRef = useRef<HTMLElement | null>(null);\n\n  const ranges = useMemo(() => computeRanges(config), [config]);\n  const totalDuration = useMemo(() => totalDurationFor(ranges), [ranges]);\n\n  useEffect(() => {\n    if (paused) {\n      if (rafRef.current !== null) cancelAnimationFrame(rafRef.current);\n      rafRef.current = null;\n      lastTimestampRef.current = null;\n      return;\n    }\n    const tick = (t: number) => {\n      if (lastTimestampRef.current === null) lastTimestampRef.current = t;\n      const dt = (t - lastTimestampRef.current) * speed;\n      lastTimestampRef.current = t;\n      time.set(wrapTime(time.get() + dt, totalDuration));\n      rafRef.current = requestAnimationFrame(tick);\n    };\n    rafRef.current = requestAnimationFrame(tick);\n    return () => {\n      if (rafRef.current !== null) cancelAnimationFrame(rafRef.current);\n      rafRef.current = null;\n      lastTimestampRef.current = null;\n    };\n  }, [paused, speed, time, totalDuration]);\n\n  const seek = (ms: number) => {\n    const clamped = Math.max(0, Math.min(ms, Math.max(0, totalDuration - 1)));\n    time.set(clamped);\n    lastTimestampRef.current = null;\n  };\n\n  const restart = () => {\n    time.set(0);\n    lastTimestampRef.current = null;\n  };\n\n  const value = useMemo<TimelineState>(\n    () => ({\n      sceneId: config.id,\n      sceneLabel: config.label,\n      ranges,\n      totalDuration,\n      phaseOrder: config.phaseOrder,\n      time,\n      speed,\n      setSpeed,\n      paused,\n      setPaused,\n      seek,\n      restart,\n    }),\n    [\n      config.id,\n      config.label,\n      config.phaseOrder,\n      ranges,\n      totalDuration,\n      time,\n      speed,\n      paused,\n    ],\n  );\n\n  const registry = useOptionalLoupeRegistry();\n  // Identity-level registration. Mount = register, unmount =\n  // unregister. We deliberately KEEP paused/speed out of the deps\n  // here: React would otherwise run the cleanup (unregisterScene)\n  // on every pause toggle, and `unregisterScene` reassigns the\n  // active scene to whatever's left in the array — which snaps the\n  // panel to the first-registered scene mid-flip. A separate\n  // effect below pushes paused/speed updates without tearing the\n  // registration down.\n  useEffect(() => {\n    if (!registry) return;\n    registry.registerScene({\n      id: config.id,\n      label: config.label,\n      rootRef: sceneRootRef,\n      timeline: {\n        time,\n        ranges,\n        totalDuration,\n        phaseOrder: config.phaseOrder,\n        phaseLabels: config.phaseLabels,\n        speed,\n        setSpeed,\n        paused,\n        setPaused,\n        seek,\n        restart,\n      },\n    });\n    return () => registry.unregisterScene(config.id);\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [\n    config.id,\n    config.label,\n    config.phaseOrder,\n    config.phaseLabels,\n    ranges,\n    totalDuration,\n  ]);\n\n  // Live updates for paused/speed. registerScene merges into the\n  // existing entry by id (Object.assign), so this just refreshes\n  // the live values without a register/unregister cycle.\n  useEffect(() => {\n    if (!registry) return;\n    registry.registerScene({\n      id: config.id,\n      label: config.label,\n      rootRef: sceneRootRef,\n      timeline: {\n        time,\n        ranges,\n        totalDuration,\n        phaseOrder: config.phaseOrder,\n        phaseLabels: config.phaseLabels,\n        speed,\n        setSpeed,\n        paused,\n        setPaused,\n        seek,\n        restart,\n      },\n    });\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [paused, speed]);\n\n  return (\n    <TimelineContext.Provider value={value}>\n      <SceneRootRefProvider refValue={sceneRootRef}>\n        {/*\n          We deliberately do NOT attach the scene ref to a wrapper here.\n          Earlier versions wrapped children in a `display: contents` div\n          and pinned the ref to it as a \"safe default\" so the registry's\n          flash overlay always had something to measure. Two problems\n          surfaced from that:\n            1. React's commit order made the wrapper's ref-attach run AFTER\n               any consumer that attached the same ref to their own root,\n               so the ref ended up on the `display: contents` element.\n            2. IntersectionObserver (the engine behind framer-motion's\n               `useInView`) treats `display: contents` elements as having\n               no layout box on most engines, so consumers' in-view\n               auto-pause logic silently never fired `true` and scenes\n               appeared frozen.\n          Consumers are expected to call `useSceneRootRef()` and attach\n          the returned ref to their own root element. If a consumer\n          forgets, ref-dependent registry features (flash, scroll-to-\n          scene) degrade gracefully — but timeline playback, panel\n          control, and `useInView`-driven auto-pause all keep working.\n        */}\n        {children}\n      </SceneRootRefProvider>\n    </TimelineContext.Provider>\n  );\n}\n\nexport function useTimeline(): TimelineState {\n  const ctx = useContext(TimelineContext);\n  if (!ctx) throw new Error('useTimeline must be used inside <TimelineProvider>');\n  return ctx;\n}\n","import { useEffect, useRef, useState } from 'react';\nimport { useTransform, type EasingFunction, type MotionValue } from 'framer-motion';\nimport { useTimeline } from './TimelineProvider';\nimport { HOUSE_CURVE_FN, phaseAtTime, rangeOf, type PhaseRange } from './phases';\n\n/** Subscribe to the raw time MotionValue of the active scene. */\nexport function useTimelineTime(): MotionValue<number> {\n  return useTimeline().time;\n}\n\n/** Look up a range from the active scene's config. Throws if phase unknown. */\nexport function useRangeOf(phase: string): PhaseRange {\n  const { ranges } = useTimeline();\n  return rangeOf(ranges, phase);\n}\n\ntype UseTimelineValueOptions = {\n  startMs?: number;\n  endMs?: number;\n  /** Shortcut: span the full duration of this phase. */\n  phase?: string;\n  /** Offset within the phase before the transition begins. */\n  offset?: number;\n  /** How long the transition runs (overrides endMs). */\n  duration?: number;\n  ease?: EasingFunction;\n};\n\n/**\n * Derive a MotionValue animating `from → to` between two timeline points.\n * Holds at `from` before the window and at `to` after it.\n */\nexport function useTimelineValue(\n  from: number,\n  to: number,\n  options: UseTimelineValueOptions = {},\n): MotionValue<number> {\n  const { time, ranges, totalDuration } = useTimeline();\n  const { phase, offset = 0, duration, startMs, endMs, ease = HOUSE_CURVE_FN } = options;\n\n  let start: number;\n  let end: number;\n  if (phase) {\n    const r = rangeOf(ranges, phase);\n    start = r.start + offset;\n    end = duration !== undefined ? start + duration : r.end;\n  } else {\n    start = startMs ?? 0;\n    end = endMs ?? (duration !== undefined ? start + duration : totalDuration);\n  }\n\n  return useTransform(time, [start, end], [from, to], { ease, clamp: true });\n}\n\n/** Current phase name, derived from time on every tick. */\nexport function usePhaseFromTime(): string {\n  const { time, ranges, totalDuration } = useTimeline();\n  const [phase, setPhase] = useState<string>(() =>\n    phaseAtTime(ranges, totalDuration, time.get()),\n  );\n  useEffect(() => {\n    const unsubscribe = time.on('change', (ms) => {\n      const next = phaseAtTime(ranges, totalDuration, ms);\n      setPhase((prev) => (prev === next ? prev : next));\n    });\n    return unsubscribe;\n  }, [time, ranges, totalDuration]);\n  return phase;\n}\n\n/**\n * Counter that increments each time the timeline ENTERS `targetPhase`.\n * Use as a `playKey` on one-shot effects (Lottie, Web Animations) so they\n * re-trigger on every loop pass and on scrub-past-then-forward.\n */\nexport function usePhaseEnterKey(targetPhase: string): number {\n  const phase = usePhaseFromTime();\n  const [key, setKey] = useState(0);\n  const prevRef = useRef<string | null>(null);\n  useEffect(() => {\n    if (phase === targetPhase && prevRef.current !== targetPhase) {\n      setKey((k) => k + 1);\n    }\n    prevRef.current = phase;\n  }, [phase, targetPhase]);\n  return key;\n}\n","import { forwardRef, type CSSProperties, type ElementType, type ReactNode, type Ref } from 'react';\nimport { useOptionalSceneRootRef } from './registry';\n\n/**\n * <SceneRoot> — the recommended wrapper for a Loupe-instrumented scene.\n *\n * Bakes in two invariants consumers used to re-derive by hand:\n *   1. Registers itself with the scene-ref context so registry features\n *      (flash, scroll-to, picker fallback) can locate the scene.\n *   2. Pointer-events: auto whenever Loupe is mounted; pointer-events:\n *      none otherwise. `document.elementFromPoint` sees through any\n *      ancestor with `pointer-events: none`, so a hardcoded `none` on\n *      the scene root makes the picker pick through to the page\n *      underneath. We restore production click-through automatically\n *      when no `<LoupeRegistryProvider>` is mounted above.\n */\n\ninterface SceneRootProps {\n  as?: ElementType;\n  className?: string;\n  style?: CSSProperties;\n  children?: ReactNode;\n  [key: string]: unknown;\n}\n\nexport const SceneRoot = forwardRef<HTMLElement, SceneRootProps>(function SceneRoot(\n  props,\n  forwardedRef,\n) {\n  const { as, className, style, children, ...rest } = props as SceneRootProps & {\n    style?: CSSProperties;\n  };\n  const Component = (as ?? 'div') as ElementType;\n  const sceneRef = useOptionalSceneRootRef();\n  const loupeActive = sceneRef !== null;\n\n  const setRef = (node: HTMLElement | null) => {\n    if (sceneRef) {\n      (sceneRef as React.MutableRefObject<HTMLElement | null>).current = node;\n    }\n    if (typeof forwardedRef === 'function') forwardedRef(node);\n    else if (forwardedRef)\n      (forwardedRef as React.MutableRefObject<HTMLElement | null>).current = node;\n  };\n\n  // Loupe's pointerEvents goes LAST so a consumer style prop can't\n  // accidentally override the picker-rescue behavior.\n  const mergedStyle: CSSProperties = {\n    ...style,\n    pointerEvents: loupeActive ? 'auto' : 'none',\n  };\n\n  return (\n    <Component\n      ref={setRef as Ref<HTMLElement>}\n      data-loupe-scene-root=\"\"\n      className={className}\n      style={mergedStyle}\n      {...rest}\n    >\n      {children}\n    </Component>\n  );\n});\n\nexport const SCENE_ROOT_ATTR = 'data-loupe-scene-root';\n","/**\n * Build a short, human-readable CSS selector path for a DOM element.\n * Optimized for legibility, not uniqueness — prefers id > short class chain > tag.\n */\n\nconst MAX_DEPTH = 5;\nconst MAX_CLASSES_PER_NODE = 2;\n\nexport function elementToSelector(el: Element | null): string {\n  if (!el) return '';\n  const parts: string[] = [];\n  let node: Element | null = el;\n  let depth = 0;\n  while (node && node.nodeType === Node.ELEMENT_NODE && depth < MAX_DEPTH) {\n    parts.unshift(nodeLabel(node));\n    if (node.id) break;\n    node = node.parentElement;\n    depth++;\n  }\n  return parts.join(' > ');\n}\n\nfunction nodeLabel(el: Element): string {\n  const tag = el.tagName.toLowerCase();\n  if (el.id) return `${tag}#${el.id}`;\n  const classAttr = el.getAttribute('class') ?? '';\n  const classes = classAttr\n    .split(/\\s+/)\n    .filter(Boolean)\n    .filter((c) => c.length <= 20)\n    .slice(0, MAX_CLASSES_PER_NODE);\n  if (classes.length > 0) {\n    return `${tag}.${classes.join('.')}`;\n  }\n  return tag;\n}\n","/**\n * React Fiber introspection for Loupe annotations.\n *\n * Walks up from a DOM node's attached Fiber to find the nearest user-defined\n * component and returns its displayName + source file (from `_debugSource`\n * in dev builds). Same approach as React DevTools — uses the `__reactFiber$`\n * key React attaches to each DOM node. Undocumented but stable across React 16–19.\n */\n\ntype FiberNode = {\n  type?: unknown;\n  elementType?: unknown;\n  return?: FiberNode;\n  stateNode?: unknown;\n  memoizedProps?: unknown;\n  _debugSource?: {\n    fileName?: string;\n    lineNumber?: number;\n    columnNumber?: number;\n  };\n  _debugOwner?: FiberNode;\n};\n\nexport type FiberInfo = {\n  componentName?: string;\n  sourceLocation?: string;\n};\n\nexport function fiberInfo(el: Element | null): FiberInfo {\n  if (!el) return {};\n  const fiber = getFiber(el);\n  if (!fiber) return {};\n  let current: FiberNode | undefined = fiber;\n  let componentName: string | undefined;\n  let sourceLocation: string | undefined;\n  for (let i = 0; i < 12 && current; i++) {\n    const name = componentNameFor(current);\n    if (name && !componentName) {\n      componentName = name;\n      sourceLocation = formatDebugSource(current._debugSource);\n      if (sourceLocation) break;\n    }\n    current = current.return;\n  }\n  return { componentName, sourceLocation };\n}\n\nfunction getFiber(el: Element): FiberNode | undefined {\n  const key = Object.keys(el).find(\n    (k) => k.startsWith('__reactFiber$') || k.startsWith('__reactInternalInstance$'),\n  );\n  if (!key) return undefined;\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  return (el as any)[key] as FiberNode;\n}\n\nfunction componentNameFor(fiber: FiberNode): string | undefined {\n  const type = (fiber.type ?? fiber.elementType) as unknown;\n  if (!type) return undefined;\n  if (typeof type === 'string') return undefined;\n  if (typeof type === 'function') {\n    const fn = type as { displayName?: string; name?: string };\n    return fn.displayName || fn.name || undefined;\n  }\n  if (typeof type === 'object' && type !== null) {\n    const obj = type as {\n      displayName?: string;\n      render?: { displayName?: string; name?: string };\n      type?: { displayName?: string; name?: string };\n    };\n    if (obj.displayName) return obj.displayName;\n    if (obj.render) return obj.render.displayName || obj.render.name;\n    if (obj.type) return obj.type.displayName || obj.type.name;\n  }\n  return undefined;\n}\n\nfunction formatDebugSource(src: FiberNode['_debugSource']): string | undefined {\n  if (!src || !src.fileName) return undefined;\n  const file = src.fileName;\n  const srcIdx = file.lastIndexOf('/src/');\n  const rel = srcIdx !== -1 ? file.slice(srcIdx + 1) : file;\n  return src.lineNumber ? `${rel}:${src.lineNumber}` : rel;\n}\n","import type { Annotation } from './types';\n\n/**\n * localStorage-backed persistence for Loupe annotations, keyed per scene.\n *   loupe:annotations:v2:{sceneId}  →  Annotation[]\n */\n\nconst KEY_PREFIX = 'loupe:annotations:v2:';\n\nfunction keyFor(sceneId: string): string {\n  return `${KEY_PREFIX}${sceneId}`;\n}\n\nexport function loadAnnotations(sceneId: string): Annotation[] {\n  if (typeof window === 'undefined') return [];\n  try {\n    const raw = window.localStorage.getItem(keyFor(sceneId));\n    if (raw) {\n      const parsed = JSON.parse(raw);\n      if (Array.isArray(parsed)) return parsed as Annotation[];\n    }\n    return [];\n  } catch {\n    return [];\n  }\n}\n\nexport function saveAnnotations(sceneId: string, list: Annotation[]): void {\n  if (typeof window === 'undefined') return;\n  try {\n    window.localStorage.setItem(keyFor(sceneId), JSON.stringify(list));\n  } catch {\n    // Private-mode Safari / quota exceeded — silently drop.\n  }\n}\n\nexport function clearAnnotationsForScene(sceneId: string): void {\n  if (typeof window === 'undefined') return;\n  try {\n    window.localStorage.removeItem(keyFor(sceneId));\n  } catch {\n    // ignore\n  }\n}\n","import {\n  createContext,\n  useCallback,\n  useContext,\n  useEffect,\n  useMemo,\n  useRef,\n  useState,\n} from 'react';\nimport { useLoupeRegistry } from '../runtime/registry';\nimport { phaseAtTime, rangeOf } from '../runtime/phases';\nimport { elementToSelector } from './selector';\nimport { fiberInfo } from './fiber';\nimport { loadAnnotations, saveAnnotations } from './storage';\nimport type { Annotation, AnnotationDraft } from './types';\n\n/**\n * AnnotationsProvider — lives at app root (above all TimelineProviders).\n *\n * Reads `activeSceneId` from the LoupeRegistry and presents that scene's\n * annotation list. Scene-aware ops (pickElement, pickRegion, focusAnnotation)\n * read time/pause/seek from the active scene's registered TimelineState.\n */\n\nexport type PickerMode = 'off' | 'element' | 'region';\n\ntype AnnotationsState = {\n  annotations: Annotation[];\n  visible: boolean;\n  pickerMode: PickerMode;\n  draft: AnnotationDraft | null;\n\n  setVisible: (v: boolean) => void;\n  setPickerMode: (m: PickerMode) => void;\n  /**\n   * Accepts any DOM `Element`, NOT `HTMLElement`. SVG nodes (paper paths,\n   * circles, cross strokes inside an animated `<svg>`) inherit from\n   * `Element` only — tightening this to `HTMLElement` silently drops every\n   * SVG pick and was the original bug behind \"I can't select the paper.\"\n   * Regression covered in `AnnotationsProvider.test.tsx`.\n   */\n  pickElement: (el: Element) => void;\n  pickRegion: (region: { x: number; y: number; w: number; h: number }) => void;\n  commitDraft: (note: string) => void;\n  cancelDraft: () => void;\n  updateAnnotation: (id: string, patch: Partial<Annotation>) => void;\n  deleteAnnotation: (id: string) => void;\n  clearAll: () => void;\n  focusAnnotation: (id: string) => Annotation | undefined;\n};\n\nconst AnnotationsContext = createContext<AnnotationsState | null>(null);\n\nconst COLOR_ELEMENT = 'var(--loupe-accent, #3A97F9)';\nconst COLOR_REGION = 'var(--loupe-region-accent, #A855F7)';\n\nexport function AnnotationsProvider({ children }: { children: React.ReactNode }) {\n  const registry = useLoupeRegistry();\n  const activeSceneId = registry.activeSceneId;\n  const activeScene = activeSceneId\n    ? registry.scenes.find((s) => s.id === activeSceneId)\n    : undefined;\n\n  const [annotationsBySceneId, setAnnotationsBySceneId] = useState<\n    Record<string, Annotation[]>\n  >({});\n  const [visible, setVisible] = useState(true);\n  const [pickerMode, setPickerModeState] = useState<PickerMode>('off');\n  const [draft, setDraft] = useState<AnnotationDraft | null>(null);\n\n  const loadedRef = useRef<Set<string>>(new Set());\n  useEffect(() => {\n    if (!activeSceneId) return;\n    if (loadedRef.current.has(activeSceneId)) return;\n    loadedRef.current.add(activeSceneId);\n    const loaded = loadAnnotations(activeSceneId);\n    setAnnotationsBySceneId((prev) => ({ ...prev, [activeSceneId]: loaded }));\n  }, [activeSceneId]);\n\n  const annotations = activeSceneId\n    ? annotationsBySceneId[activeSceneId] ?? []\n    : [];\n\n  useEffect(() => {\n    if (!activeSceneId) return;\n    if (!loadedRef.current.has(activeSceneId)) return;\n    saveAnnotations(activeSceneId, annotations);\n  }, [activeSceneId, annotations]);\n\n  const setSceneAnnotations = useCallback(\n    (sceneId: string, updater: (prev: Annotation[]) => Annotation[]) => {\n      setAnnotationsBySceneId((prev) => ({\n        ...prev,\n        [sceneId]: updater(prev[sceneId] ?? []),\n      }));\n    },\n    [],\n  );\n\n  const setPickerMode = useCallback(\n    (m: PickerMode) => {\n      if (m !== 'off' && activeScene) activeScene.timeline.setPaused(true);\n      setPickerModeState(m);\n      if (m === 'off') setDraft(null);\n    },\n    [activeScene],\n  );\n\n  const snapshotForActive = useCallback(() => {\n    if (!activeScene) {\n      return {\n        sceneId: 'unknown',\n        sceneLabel: 'Unknown',\n        phase: '',\n        phaseElapsedMs: 0,\n        phaseDurationMs: 0,\n        globalTimeMs: 0,\n        totalDurationMs: 0,\n        totalPercent: 0,\n      };\n    }\n    const tl = activeScene.timeline;\n    const now = tl.time.get();\n    const phase = phaseAtTime(tl.ranges, tl.totalDuration, now);\n    const range = rangeOf(tl.ranges, phase);\n    return {\n      sceneId: activeScene.id,\n      sceneLabel: activeScene.label,\n      phase,\n      phaseElapsedMs: Math.max(0, now - range.start),\n      phaseDurationMs: range.duration,\n      globalTimeMs: now,\n      totalDurationMs: tl.totalDuration,\n      totalPercent: tl.totalDuration\n        ? Math.round((now / tl.totalDuration) * 100)\n        : 0,\n    };\n  }, [activeScene]);\n\n  const pickElement = useCallback(\n    (el: Element) => {\n      const info = fiberInfo(el);\n      const tl = snapshotForActive();\n      setDraft({\n        kind: 'element',\n        element: el,\n        snapshot: {\n          ...tl,\n          selector: elementToSelector(el),\n          componentName: info.componentName,\n          sourceLocation: info.sourceLocation,\n          tagName: el.tagName.toLowerCase(),\n        },\n      });\n    },\n    [snapshotForActive],\n  );\n\n  const pickRegion = useCallback(\n    (region: { x: number; y: number; w: number; h: number }) => {\n      const tl = snapshotForActive();\n      setDraft({ kind: 'region', region, snapshot: tl });\n    },\n    [snapshotForActive],\n  );\n\n  const commitDraft = useCallback(\n    (note: string) => {\n      if (!draft) return;\n      const sceneId = draft.snapshot.sceneId;\n      const annotation: Annotation =\n        draft.kind === 'element'\n          ? {\n              id: makeId(),\n              createdAt: new Date().toISOString(),\n              note,\n              color: COLOR_ELEMENT,\n              ...draft.snapshot,\n            }\n          : {\n              id: makeId(),\n              createdAt: new Date().toISOString(),\n              note,\n              color: COLOR_REGION,\n              region: draft.region,\n              ...draft.snapshot,\n            };\n      setSceneAnnotations(sceneId, (prev) => [...prev, annotation]);\n      setDraft(null);\n      setPickerModeState('off');\n    },\n    [draft, setSceneAnnotations],\n  );\n\n  const cancelDraft = useCallback(() => {\n    setDraft(null);\n    setPickerModeState('off');\n  }, []);\n\n  const updateAnnotation = useCallback(\n    (id: string, patch: Partial<Annotation>) => {\n      if (!activeSceneId) return;\n      setSceneAnnotations(activeSceneId, (prev) =>\n        prev.map((a) => (a.id === id ? { ...a, ...patch } : a)),\n      );\n    },\n    [activeSceneId, setSceneAnnotations],\n  );\n\n  const deleteAnnotation = useCallback(\n    (id: string) => {\n      if (!activeSceneId) return;\n      setSceneAnnotations(activeSceneId, (prev) => prev.filter((a) => a.id !== id));\n    },\n    [activeSceneId, setSceneAnnotations],\n  );\n\n  const clearAll = useCallback(() => {\n    if (!activeSceneId) return;\n    setSceneAnnotations(activeSceneId, () => []);\n  }, [activeSceneId, setSceneAnnotations]);\n\n  const focusAnnotation = useCallback(\n    (id: string) => {\n      const a = annotations.find((x) => x.id === id);\n      if (!a) return undefined;\n      if (a.sceneId !== activeSceneId) registry.setActiveSceneId(a.sceneId);\n      const target = registry.scenes.find((s) => s.id === a.sceneId);\n      if (target) {\n        target.timeline.seek(a.globalTimeMs);\n        target.timeline.setPaused(true);\n      }\n      return a;\n    },\n    [annotations, activeSceneId, registry],\n  );\n\n  const value = useMemo<AnnotationsState>(\n    () => ({\n      annotations,\n      visible,\n      pickerMode,\n      draft,\n      setVisible,\n      setPickerMode,\n      pickElement,\n      pickRegion,\n      commitDraft,\n      cancelDraft,\n      updateAnnotation,\n      deleteAnnotation,\n      clearAll,\n      focusAnnotation,\n    }),\n    [\n      annotations,\n      visible,\n      pickerMode,\n      draft,\n      setPickerMode,\n      pickElement,\n      pickRegion,\n      commitDraft,\n      cancelDraft,\n      updateAnnotation,\n      deleteAnnotation,\n      clearAll,\n      focusAnnotation,\n    ],\n  );\n\n  return <AnnotationsContext.Provider value={value}>{children}</AnnotationsContext.Provider>;\n}\n\nexport function useAnnotations(): AnnotationsState {\n  const ctx = useContext(AnnotationsContext);\n  if (!ctx) throw new Error('useAnnotations must be used inside AnnotationsProvider');\n  return ctx;\n}\n\nfunction makeId(): string {\n  const c = (globalThis as unknown as { crypto?: { randomUUID?: () => string } }).crypto;\n  if (c?.randomUUID) return c.randomUUID();\n  return `a-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\n}\n","import type { Annotation } from './types';\n\n/**\n * Serialize a list of annotations into a markdown block that can be pasted\n * into an AI agent (or any chat) and convey:\n *   - WHICH scene the user was reviewing (groups multiple scenes)\n *   - WHERE in the DOM the user was pointing\n *   - WHEN in the animation they were pointing\n *   - WHAT they wrote\n */\nexport function annotationsToMarkdown(list: Annotation[]): string {\n  if (list.length === 0) return '_(no annotations)_';\n  const date = new Date().toISOString().slice(0, 10);\n\n  const grouped = new Map<string, Annotation[]>();\n  for (const a of list) {\n    const key = a.sceneId || 'unknown';\n    const bucket = grouped.get(key) ?? [];\n    bucket.push(a);\n    grouped.set(key, bucket);\n  }\n\n  const sections: string[] = [];\n  for (const [sceneId, items] of grouped) {\n    const label = items[0]?.sceneLabel || sceneId;\n    sections.push(`## ${label} · ${items.length} ${items.length === 1 ? 'item' : 'items'}\\n`);\n    sections.push(items.map((a, i) => formatOne(a, i + 1)).join('\\n\\n'));\n  }\n\n  return `# Loupe feedback · ${date}\\n\\n${sections.join('\\n\\n')}\\n`;\n}\n\nfunction formatOne(a: Annotation, index: number): string {\n  const title = [\n    `#${index}`,\n    a.phase || '—',\n    `${formatMs(a.phaseElapsedMs)} / ${formatMs(a.phaseDurationMs)}`,\n    `${formatMs(a.globalTimeMs)} / ${formatMs(a.totalDurationMs)} total`,\n    `${a.totalPercent}%`,\n  ].join(' · ');\n\n  const lines: string[] = [`### ${title}`];\n\n  if (a.region) {\n    lines.push(\n      `**Region:** x=${a.region.x.toFixed(1)}% y=${a.region.y.toFixed(1)}% w=${a.region.w.toFixed(1)}% h=${a.region.h.toFixed(1)}%`,\n    );\n  } else {\n    const element = [\n      a.componentName && `\\`${a.componentName}\\``,\n      a.tagName && `(\\`<${a.tagName}>\\`)`,\n    ]\n      .filter(Boolean)\n      .join(' ');\n    if (element) lines.push(`**Element:** ${element}`);\n    if (a.sourceLocation) lines.push(`**Source:** ${a.sourceLocation}`);\n    if (a.selector) lines.push(`**Selector:** \\`${a.selector}\\``);\n  }\n\n  lines.push('');\n  lines.push(a.note);\n  return lines.join('\\n');\n}\n\nfunction formatMs(ms: number): string {\n  if (!Number.isFinite(ms)) return '∞';\n  if (ms < 1000) return `${Math.round(ms)}ms`;\n  return `${(ms / 1000).toFixed(1)}s`;\n}\n","import { cubicBezier, motion, useTransform, type MotionValue } from 'framer-motion';\nimport { forwardRef } from 'react';\n\n/**\n * PaperScene — the paper-slide-up-with-cross-draw illustration that\n * appears in both the onboarding modal (driven by a local time motion\n * value) and the built-in `<SampleScene>` (driven by Loupe's TimelineProvider).\n *\n * Keeping a single component for both means the thing the user sees in\n * onboarding is exactly what they get to scrub / pick / annotate when\n * they click \"Try the sample.\" No recognition gap.\n *\n * Time is in milliseconds. Total length: 1500ms.\n *   - 0–500ms: paper slides up from below the circular frame.\n *   - 400–1100ms: cross strokes draw on the paper (overlaps with the slide\n *     so motion feels continuous; opacity fades in over 400–550 so the\n *     round linecaps don't render as dots before length is visible).\n */\n\nconst ACCENT = 'var(--loupe-accent, #3A97F9)';\nconst EASE_OUT = cubicBezier(0.23, 1, 0.32, 1);\n\nexport const PAPER_SCENE_DURATION_MS = 1500;\nexport const PAPER_SCENE_PHASES = [\n  { id: 'slide', label: 'Slide', start: 0, end: 500 },\n  { id: 'draw', label: 'Draw', start: 500, end: 1500 },\n] as const;\n\nexport const PaperScene = forwardRef<\n  HTMLDivElement,\n  { time: MotionValue<number>; showHighlight?: boolean }\n>(function PaperScene({ time, showHighlight = false }, ref) {\n  const paperY = useTransform(time, [0, 500], [120, 0], { clamp: true, ease: EASE_OUT });\n  const crossPathLength = useTransform(time, [400, 1100], [0, 1], {\n    clamp: true,\n    ease: EASE_OUT,\n  });\n  const crossOpacity = useTransform(time, [400, 550], [0, 1], {\n    clamp: true,\n    ease: EASE_OUT,\n  });\n\n  return (\n    <div ref={ref} style={{ position: 'relative', width: 150, height: 150 }}>\n      {/* Circular frame — overflow:hidden clips the paper while it slides up. */}\n      <div\n        data-loupe-pickable=\"frame\"\n        style={{\n          position: 'absolute',\n          inset: 0,\n          background: 'linear-gradient(180deg, #E3ECFA 0%, #DAE7FF 100%)',\n          borderRadius: 9999,\n          overflow: 'hidden',\n        }}\n      >\n        {/* Paper group — pulled from Figma node 619:145736, positioned at\n            (30, 37) inside the 150x150 frame. */}\n        <motion.svg\n          data-loupe-pickable=\"paper\"\n          viewBox=\"0 0 90 113\"\n          width={90}\n          height={113}\n          fill=\"none\"\n          xmlns=\"http://www.w3.org/2000/svg\"\n          style={{ position: 'absolute', left: 30, top: 37, y: paperY }}\n        >\n          <path\n            d=\"M90 111C90 112.105 89.1046 113 88 113H2C0.89543 113 0 112.105 0 111V17.9978C0 16.8941 0.897541 16.0119 1.99251 15.8734C5.49952 15.4298 8.78245 13.8345 11.3084 11.3085C13.8344 8.78247 15.4298 5.49952 15.8734 1.99251C16.0119 0.897542 16.8941 0 17.9978 0H71.9957C73.102 0 73.9851 0.901504 74.1219 1.99925C74.2982 3.41388 74.6644 4.80141 75.213 6.12378C76.0182 8.06478 77.2003 9.82685 78.691 11.308C80.1721 12.7991 81.9342 13.9816 83.8754 14.787C85.198 15.3357 86.5857 15.7019 88.0006 15.8782C89.0984 16.0149 90 16.8981 90 18.0044V111Z\"\n            fill=\"white\"\n          />\n          <path\n            d=\"M45 65C58.2548 65 69 54.2548 69 41C69 27.7452 58.2548 17 45 17C31.7452 17 21 27.7452 21 41C21 54.2548 31.7452 65 45 65Z\"\n            fill=\"#4285F4\"\n          />\n          <motion.path\n            d=\"M35.1186 31.1187L54.8814 50.8815\"\n            stroke=\"white\"\n            strokeWidth={4}\n            strokeLinecap=\"round\"\n            style={{ pathLength: crossPathLength, opacity: crossOpacity }}\n          />\n          <motion.path\n            d=\"M54.8814 31.1187L35.1186 50.8815\"\n            stroke=\"white\"\n            strokeWidth={4}\n            strokeLinecap=\"round\"\n            style={{ pathLength: crossPathLength, opacity: crossOpacity }}\n          />\n          <path\n            d=\"M58 71H32C30.3431 71 29 72.3431 29 74C29 75.6569 30.3431 77 32 77H58C59.6569 77 61 75.6569 61 74C61 72.3431 59.6569 71 58 71Z\"\n            fill=\"#DFEAFB\"\n          />\n          <path\n            d=\"M67 83H23C21.3431 83 20 84.3431 20 86C20 87.6569 21.3431 89 23 89H67C68.6569 89 70 87.6569 70 86C70 84.3431 68.6569 83 67 83Z\"\n            fill=\"#DFEAFB\"\n          />\n        </motion.svg>\n      </div>\n\n      {showHighlight && (\n        <motion.div\n          aria-hidden\n          style={{\n            position: 'absolute',\n            left: 30 - 3,\n            top: 37 - 3,\n            width: 90 + 6,\n            height: 113 + 6,\n            y: paperY,\n            borderRadius: 5,\n            border: `1.5px solid ${ACCENT}`,\n            boxShadow:\n              '0 0 0 3px rgba(58, 151, 249, 0.14), 0 0 18px rgba(58, 151, 249, 0.22)',\n            pointerEvents: 'none',\n          }}\n        />\n      )}\n    </div>\n  );\n});\n","import {\n  AnimatePresence,\n  motion,\n  useMotionValue,\n} from 'framer-motion';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useOptionalLoupeRegistry } from '../runtime/registry';\nimport { PaperScene, PAPER_SCENE_DURATION_MS } from '../scenes/PaperScene';\n\nconst WELCOME_SEEN_KEY = 'loupe.welcome.seen.v1';\n\n/**\n * Returns whether the welcome modal is currently meant to be shown.\n * Used by `LoupePanel` to render its empty state — no scene controls,\n * no active scrubber — while onboarding is happening, so the panel\n * doesn't show a \"live\" picker behind the dimmed overlay.\n */\nexport function useWelcomeOpen(): boolean {\n  const [open, setOpen] = useState<boolean>(() => {\n    if (typeof window === 'undefined') return false;\n    if (isForcedOpen()) return true;\n    try {\n      return window.localStorage.getItem(WELCOME_SEEN_KEY) !== '1';\n    } catch {\n      return false;\n    }\n  });\n\n  useEffect(() => {\n    if (typeof window === 'undefined') return;\n    const check = () => {\n      if (isForcedOpen()) {\n        setOpen(true);\n        return;\n      }\n      try {\n        setOpen(window.localStorage.getItem(WELCOME_SEEN_KEY) !== '1');\n      } catch {\n        setOpen(false);\n      }\n    };\n    window.addEventListener('loupe-welcome-changed', check);\n    return () => window.removeEventListener('loupe-welcome-changed', check);\n  }, []);\n\n  return open;\n}\n\nconst FONT = 'var(--loupe-font, system-ui, -apple-system, sans-serif)';\nconst ACCENT = 'var(--loupe-accent, #3A97F9)';\nconst PANEL_BG = 'var(--loupe-panel-bg, rgba(18, 20, 25, 0.96))';\nconst PANEL_FG = 'var(--loupe-panel-fg, #E8EAEE)';\nconst PANEL_MUTED = 'var(--loupe-panel-muted, #9BA3AF)';\nconst PANEL_BORDER = 'var(--loupe-panel-border, rgba(255, 255, 255, 0.08))';\n\nconst DEMO_DURATION_MS = PAPER_SCENE_DURATION_MS;\n\nfunction isForcedOpen(): boolean {\n  if (typeof window === 'undefined') return false;\n  try {\n    return new URLSearchParams(window.location.search).get('loupe_welcome') === 'force';\n  } catch {\n    return false;\n  }\n}\n\nexport function Welcome() {\n  const forced = isForcedOpen();\n  const [open, setOpen] = useState<boolean>(() => {\n    if (typeof window === 'undefined') return false;\n    if (forced) return true;\n    try {\n      return window.localStorage.getItem(WELCOME_SEEN_KEY) !== '1';\n    } catch {\n      return false;\n    }\n  });\n  const [step, setStep] = useState(0);\n\n  // Dev-time escape hatch — call from the browser console to re-show\n  // the welcome without editing localStorage by hand or changing URL.\n  useEffect(() => {\n    if (typeof window === 'undefined') return;\n    (window as unknown as { __loupeResetWelcome?: () => void }).__loupeResetWelcome = () => {\n      try {\n        window.localStorage.removeItem(WELCOME_SEEN_KEY);\n      } catch {\n        /* ignore */\n      }\n      window.location.reload();\n    };\n  }, []);\n\n  const dismiss = useCallback(() => {\n    // When `?loupe_welcome=force` is in the URL, dismissal closes the\n    // modal for this view but does NOT mark it seen — that way every\n    // refresh re-triggers it, which is what you want while iterating.\n    if (!forced) {\n      try {\n        window.localStorage.setItem(WELCOME_SEEN_KEY, '1');\n      } catch {\n        /* private mode — fine, they'll see it again next session */\n      }\n    }\n    setOpen(false);\n    // Notify `useWelcomeOpen` subscribers (the panel) so they can\n    // re-render and reveal themselves now that onboarding is done.\n    if (typeof window !== 'undefined') {\n      window.dispatchEvent(new Event('loupe-welcome-changed'));\n    }\n  }, [forced]);\n\n  useEffect(() => {\n    if (!open) return;\n    const onKey = (e: KeyboardEvent) => {\n      if (e.key === 'Escape') dismiss();\n    };\n    window.addEventListener('keydown', onKey);\n    return () => window.removeEventListener('keydown', onKey);\n  }, [open, dismiss]);\n\n  // While the welcome is open, freeze every scene at frame 0 — the\n  // panel stays fully alive (scrubber visible at 0%, scene picker\n  // populated), but nothing autoplays behind the dimmed overlay.\n  // The designer sees a still preview, not a looping distraction.\n  // On dismiss, restore the user's prior paused state so we don't\n  // silently overwrite their intent.\n  const registry = useOptionalLoupeRegistry();\n  useEffect(() => {\n    if (!open || !registry) return;\n    const prior = registry.scenes.map((s) => ({\n      paused: s.timeline.paused,\n      setPaused: s.timeline.setPaused,\n      seek: s.timeline.seek,\n    }));\n    prior.forEach((p) => {\n      p.setPaused(true);\n      p.seek(0);\n    });\n    return () => {\n      prior.forEach((p) => p.setPaused(p.paused));\n    };\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [open]);\n\n  if (!open || typeof document === 'undefined') return null;\n\n  return createPortal(\n    <AnimatePresence>\n      <motion.div\n        key=\"loupe-welcome\"\n        initial={{ opacity: 0 }}\n        animate={{ opacity: 1 }}\n        exit={{ opacity: 0 }}\n        transition={{ duration: 0.25, ease: 'easeOut' }}\n        style={{\n          position: 'fixed',\n          inset: 0,\n          zIndex: 2147483646,\n          background: 'rgba(8, 9, 12, 0.55)',\n          backdropFilter: 'blur(4px)',\n          WebkitBackdropFilter: 'blur(4px)',\n          display: 'flex',\n          alignItems: 'center',\n          justifyContent: 'center',\n          fontFamily: FONT,\n          padding: '24px',\n        }}\n        role=\"dialog\"\n        aria-modal=\"true\"\n        aria-label=\"Welcome to Loupe\"\n      >\n        <motion.div\n          initial={{ opacity: 0, y: 12, scale: 0.98 }}\n          animate={{ opacity: 1, y: 0, scale: 1 }}\n          exit={{ opacity: 0, y: 8, scale: 0.98 }}\n          transition={{ duration: 0.32, ease: [0.2, 0.7, 0.2, 1] }}\n          style={{\n            width: 'min(480px, 100%)',\n            background: PANEL_BG,\n            color: PANEL_FG,\n            border: `1px solid ${PANEL_BORDER}`,\n            borderRadius: 20,\n            boxShadow:\n              '0 24px 80px rgba(0, 0, 0, 0.55), 0 2px 8px rgba(0, 0, 0, 0.3)',\n            padding: '28px 28px 22px',\n          }}\n        >\n          {step === 0 && <SlideOne />}\n          {step === 1 && <SlideTwo />}\n          {step === 2 && <SlideThree />}\n\n          <Footer\n            step={step}\n            onBack={() => setStep((s) => Math.max(0, s - 1))}\n            onNext={() => setStep((s) => Math.min(2, s + 1))}\n            onDismiss={dismiss}\n          />\n        </motion.div>\n      </motion.div>\n    </AnimatePresence>,\n    document.body,\n  );\n}\n\nfunction SlideOne() {\n  return (\n    <div>\n      <Eyebrow>Welcome</Eyebrow>\n      <h1 style={titleStyle}>Your web animations, on a timeline.</h1>\n      <p style={bodyStyle}>\n        Scrub like a video. Pause on any frame. Mark what's off,\n        export the notes — all on real running code, not a recording.\n      </p>\n    </div>\n  );\n}\n\nfunction SlideTwo() {\n  return (\n    <div>\n      <Eyebrow>Try it</Eyebrow>\n      <h1 style={titleStyle}>This one's real. Drag it.</h1>\n      <p style={bodyStyle}>\n        Scrub through to see every frame — and yes, you can leave notes\n        like the one pinned on the card. Same flow with your own work.\n      </p>\n      <DemoScrubber />\n    </div>\n  );\n}\n\nfunction SlideThree() {\n  return (\n    <div>\n      <Eyebrow>Now make yours scrubbable</Eyebrow>\n      <h1 style={titleStyle}>Two ways in.</h1>\n\n      <div style={pathBlockStyle}>\n        <div style={pathLabelStyle}>With Claude, Cursor, or Copilot</div>\n        <p style={pathBodyStyle}>\n          Run <Code>loupe scan</Code>. Your assistant finds every\n          animation in your project and walks you through, one at\n          a time.\n        </p>\n      </div>\n\n      <div style={pathBlockStyle}>\n        <div style={pathLabelStyle}>No AI? No problem.</div>\n        <p style={pathBodyStyle}>\n          Run <Code>loupe refactor</Code>. Loupe shows you each one — the\n          before, the after — and asks before changing anything.\n        </p>\n      </div>\n\n      <p style={{ ...bodyStyle, fontStyle: 'italic', marginTop: 16, color: PANEL_MUTED }}>\n        Either way, nothing gets refactored without your sign-off.\n      </p>\n    </div>\n  );\n}\n\n// Phase ranges for the empty-state illustration scene. Sourced from\n// the Figma node 619:145736. Two discrete designer-tweakable moments:\n// the paper slide and the cross trim-path draw.\nconst PHASES = [\n  { id: 'slide', label: 'slide', start: 0, end: 500 },\n  { id: 'draw', label: 'draw', start: 500, end: 1500 },\n] as const;\n\nfunction activePhase(timeMs: number): (typeof PHASES)[number] {\n  for (const p of PHASES) {\n    if (timeMs >= p.start && timeMs < p.end) return p;\n  }\n  return PHASES[PHASES.length - 1];\n}\n\nfunction DemoScrubber() {\n  const [paused, setPaused] = useState(false);\n  const time = useMotionValue(0);\n  const [scrubbing, setScrubbing] = useState(false);\n  const rafRef = useRef<number | null>(null);\n  const lastRef = useRef<number | null>(null);\n\n  useEffect(() => {\n    if (paused || scrubbing) {\n      if (rafRef.current !== null) cancelAnimationFrame(rafRef.current);\n      rafRef.current = null;\n      lastRef.current = null;\n      return;\n    }\n    const tick = (t: number) => {\n      if (lastRef.current === null) lastRef.current = t;\n      const dt = t - lastRef.current;\n      lastRef.current = t;\n      const next = (time.get() + dt) % DEMO_DURATION_MS;\n      time.set(next);\n      rafRef.current = requestAnimationFrame(tick);\n    };\n    rafRef.current = requestAnimationFrame(tick);\n    return () => {\n      if (rafRef.current !== null) cancelAnimationFrame(rafRef.current);\n      rafRef.current = null;\n      lastRef.current = null;\n    };\n  }, [paused, scrubbing, time]);\n\n  const [tick, setTick] = useState(0);\n  useEffect(() => {\n    return time.on('change', () => setTick((n) => (n + 1) % 1024));\n  }, [time]);\n  const progress = time.get() / DEMO_DURATION_MS;\n\n  return (\n    <div\n      style={{\n        marginTop: 20,\n        borderRadius: 12,\n        overflow: 'hidden',\n        background: '#0E0F12',\n        border: `1px solid ${PANEL_BORDER}`,\n        boxShadow: '0 12px 36px rgba(0,0,0,0.35)',\n      }}\n    >\n      {/* Mock browser chrome — anchors the demo as \"a product on a page\" */}\n      <div\n        style={{\n          display: 'flex',\n          alignItems: 'center',\n          gap: 6,\n          padding: '8px 10px',\n          background: '#15171B',\n          borderBottom: `1px solid ${PANEL_BORDER}`,\n        }}\n        aria-hidden\n      >\n        <span style={{ width: 8, height: 8, borderRadius: 999, background: '#FF5F57' }} />\n        <span style={{ width: 8, height: 8, borderRadius: 999, background: '#FEBC2E' }} />\n        <span style={{ width: 8, height: 8, borderRadius: 999, background: '#28C840' }} />\n        <span\n          style={{\n            flex: 1,\n            marginLeft: 8,\n            padding: '3px 10px',\n            borderRadius: 6,\n            background: 'rgba(255,255,255,0.04)',\n            color: 'rgba(255,255,255,0.35)',\n            fontSize: 10,\n            fontFamily: 'ui-monospace, SFMono-Regular, \"SF Mono\", Menlo, monospace',\n          }}\n        >\n          loupe.dev/preview\n        </span>\n      </div>\n\n      {/* Mock app content — a small interface fragment with one element\n          animating in. The pin sits on the animated element so the\n          \"target + annotate\" idea reads as a single thought. */}\n      <div\n        style={{\n          position: 'relative',\n          padding: '24px 20px',\n          minHeight: 156,\n          background:\n            'radial-gradient(120% 80% at 50% 0%, rgba(58,151,249,0.06), rgba(0,0,0,0))',\n        }}\n      >\n        {/* Fixed annotation — pin + note popup live OUTSIDE the\n            animated scene so they don't move during scrubbing. */}\n        <DemoAnnotation />\n\n        {/* Centered illustration scene. The gradient circle is the\n            frame; the paper (SVG, pulled exactly from Figma node\n            619:145736) slides up from below and clips to the frame. */}\n        <div\n          style={{\n            display: 'flex',\n            justifyContent: 'center',\n            alignItems: 'center',\n            paddingTop: 16,\n            paddingBottom: 8,\n          }}\n        >\n          <PaperScene time={time} showHighlight />\n        </div>\n      </div>\n\n      {/* Mini Loupe panel — interactive scrubber + phase strip. Shows\n          the three phases of the envelope scene so the reader sees\n          a real timeline structure, not just a slider. */}\n      <div\n        style={{\n          background: PANEL_BG,\n          borderTop: `1px solid ${PANEL_BORDER}`,\n          padding: '8px 10px 10px',\n          display: 'flex',\n          flexDirection: 'column',\n          gap: 6,\n        }}\n      >\n        <div\n          style={{\n            display: 'flex',\n            alignItems: 'center',\n            gap: 8,\n            fontSize: 10,\n            color: PANEL_MUTED,\n            fontVariantNumeric: 'tabular-nums',\n          }}\n        >\n          <span\n            style={{\n              padding: '2px 8px',\n              borderRadius: 999,\n              border: `1px solid ${PANEL_BORDER}`,\n              color: PANEL_FG,\n              fontWeight: 600,\n              fontSize: 10,\n            }}\n          >\n            Envelope\n          </span>\n          <span style={{ fontWeight: 700, color: PANEL_FG, letterSpacing: 0.2 }}>\n            {activePhase(time.get()).label}\n          </span>\n          <span>{Math.round(time.get())}ms / {DEMO_DURATION_MS}ms</span>\n          <span style={{ marginLeft: 'auto', color: PANEL_FG, fontWeight: 600 }}>\n            {Math.round(progress * 100)}%\n          </span>\n        </div>\n\n        <div style={{ display: 'flex', alignItems: 'center', gap: 10 }}>\n          <button\n            type=\"button\"\n            onClick={() => setPaused((p) => !p)}\n            aria-label={paused ? 'Play demo' : 'Pause demo'}\n            style={iconButtonStyle}\n          >\n            {paused ? '▶' : '❚❚'}\n          </button>\n          <input\n            type=\"range\"\n            min={0}\n            max={DEMO_DURATION_MS}\n            value={time.get()}\n            onChange={(e) => {\n              time.set(Number(e.target.value));\n              setTick((n) => (n + 1) % 1024);\n            }}\n            onMouseDown={() => setScrubbing(true)}\n            onMouseUp={() => setScrubbing(false)}\n            onTouchStart={() => setScrubbing(true)}\n            onTouchEnd={() => setScrubbing(false)}\n            style={{\n              flex: 1,\n              accentColor: ACCENT,\n              cursor: 'pointer',\n            }}\n            aria-label=\"Demo scrubber\"\n          />\n        </div>\n\n        {/* Phase strip — three segments sized to phase duration. The\n            active segment lights up, mirroring the real panel. */}\n        <div style={{ display: 'flex', gap: 3, height: 14 }}>\n          {PHASES.map((p) => {\n            const active = activePhase(time.get()).id === p.id;\n            const widthPct = ((p.end - p.start) / DEMO_DURATION_MS) * 100;\n            return (\n              <button\n                key={p.id}\n                type=\"button\"\n                onClick={() => {\n                  time.set(p.start);\n                  setTick((n) => (n + 1) % 1024);\n                }}\n                style={{\n                  flex: `0 0 ${widthPct}%`,\n                  minWidth: 0,\n                  height: '100%',\n                  padding: 0,\n                  borderRadius: 3,\n                  border: 'none',\n                  background: active ? ACCENT : 'rgba(255,255,255,0.06)',\n                  color: active ? '#0B1220' : PANEL_MUTED,\n                  fontFamily: 'inherit',\n                  fontWeight: active ? 700 : 500,\n                  fontSize: 9,\n                  letterSpacing: 0.3,\n                  cursor: 'pointer',\n                  transition: 'background 150ms ease, color 150ms ease',\n                }}\n                aria-label={`Jump to ${p.label} phase`}\n              >\n                {p.label}\n              </button>\n            );\n          })}\n        </div>\n      </div>\n    </div>\n  );\n}\n\n/**\n * Pre-placed annotation pin + note popup, positioned in fixed space\n * inside the mock content area. They DO NOT animate with the card —\n * an annotation is an observation about the animation, not part of\n * it. Visual language mirrors Loupe's real annotation: white-bordered\n * circular marker + dark panel-styled note popup with a header (the\n * targeted element + phase) and the note body.\n */\nfunction DemoAnnotation() {\n  return (\n    <div\n      style={{\n        position: 'absolute',\n        top: 130,\n        right: 260,\n        display: 'flex',\n        alignItems: 'flex-start',\n        gap: 8,\n        pointerEvents: 'none',\n        zIndex: 3,\n      }}\n    >\n      {/* Note popup — mirrors AnnotationPins.tsx styling */}\n      <div\n        style={{\n          background: 'rgba(18, 20, 25, 0.96)',\n          color: PANEL_FG,\n          border: `1px solid ${PANEL_BORDER}`,\n          borderRadius: 10,\n          padding: '7px 10px',\n          fontSize: 11,\n          lineHeight: 1.4,\n          maxWidth: 200,\n          boxShadow: '0 12px 30px rgba(0,0,0,0.45)',\n        }}\n      >\n        <div\n          style={{\n            fontWeight: 700,\n            color: '#EAF3FF',\n            marginBottom: 3,\n            fontSize: 10,\n            display: 'flex',\n            alignItems: 'center',\n            gap: 5,\n          }}\n        >\n          paper\n          <span style={{ fontWeight: 500, color: PANEL_MUTED }}>· slide</span>\n        </div>\n        <div style={{ fontWeight: 500 }}>\n          Let's make this feel like it settles, not just stops.\n        </div>\n      </div>\n\n      {/* Marker — matches the real AnnotationPins button (white border,\n          accent fill, white number) but scaled down to fit the modal. */}\n      <div\n        style={{\n          width: 22,\n          height: 22,\n          borderRadius: 999,\n          border: '2px solid #fff',\n          background: ACCENT,\n          color: '#fff',\n          fontSize: 11,\n          fontWeight: 700,\n          display: 'flex',\n          alignItems: 'center',\n          justifyContent: 'center',\n          boxShadow: '0 4px 12px rgba(0,0,0,0.4)',\n          flexShrink: 0,\n          marginTop: 2,\n        }}\n      >\n        1\n      </div>\n    </div>\n  );\n}\n\nfunction Footer({\n  step,\n  onBack,\n  onNext,\n  onDismiss,\n}: {\n  step: number;\n  onBack: () => void;\n  onNext: () => void;\n  onDismiss: () => void;\n}) {\n  return (\n    <div\n      style={{\n        display: 'flex',\n        alignItems: 'center',\n        justifyContent: 'space-between',\n        marginTop: 24,\n        paddingTop: 18,\n        borderTop: `1px solid ${PANEL_BORDER}`,\n      }}\n    >\n      <div style={{ display: 'flex', gap: 6 }} aria-hidden>\n        {[0, 1, 2].map((i) => (\n          <div\n            key={i}\n            style={{\n              width: 6,\n              height: 6,\n              borderRadius: 999,\n              background: i === step ? ACCENT : 'rgba(255,255,255,0.18)',\n              transition: 'background 200ms ease',\n            }}\n          />\n        ))}\n      </div>\n\n      <div style={{ display: 'flex', gap: 8 }}>\n        {step > 0 && (\n          <button type=\"button\" onClick={onBack} style={secondaryButtonStyle}>\n            Back\n          </button>\n        )}\n        {step < 2 ? (\n          <button type=\"button\" onClick={onNext} style={primaryButtonStyle}>\n            Next\n          </button>\n        ) : (\n          <button type=\"button\" onClick={onDismiss} style={primaryButtonStyle}>\n            Got it, let me try\n          </button>\n        )}\n      </div>\n    </div>\n  );\n}\n\nfunction Eyebrow({ children }: { children: React.ReactNode }) {\n  return (\n    <div\n      style={{\n        fontSize: 11,\n        textTransform: 'uppercase',\n        letterSpacing: '0.08em',\n        color: ACCENT,\n        marginBottom: 10,\n        fontWeight: 600,\n      }}\n    >\n      {children}\n    </div>\n  );\n}\n\nfunction Code({ children }: { children: React.ReactNode }) {\n  return (\n    <code\n      style={{\n        fontFamily:\n          'ui-monospace, SFMono-Regular, \"SF Mono\", Menlo, monospace',\n        fontSize: '0.92em',\n        padding: '1px 6px',\n        borderRadius: 4,\n        background: 'rgba(255, 255, 255, 0.08)',\n        color: PANEL_FG,\n      }}\n    >\n      {children}\n    </code>\n  );\n}\n\nconst titleStyle: React.CSSProperties = {\n  fontSize: 22,\n  lineHeight: 1.25,\n  fontWeight: 600,\n  margin: '0 0 12px',\n  color: PANEL_FG,\n  letterSpacing: '-0.01em',\n};\n\nconst bodyStyle: React.CSSProperties = {\n  fontSize: 14,\n  lineHeight: 1.55,\n  color: PANEL_FG,\n  margin: 0,\n};\n\nconst pathBlockStyle: React.CSSProperties = {\n  marginTop: 16,\n  padding: '14px 16px',\n  borderRadius: 12,\n  background: 'rgba(255, 255, 255, 0.03)',\n  border: `1px solid ${PANEL_BORDER}`,\n};\n\nconst pathLabelStyle: React.CSSProperties = {\n  fontSize: 12,\n  fontWeight: 600,\n  color: ACCENT,\n  marginBottom: 6,\n};\n\nconst pathBodyStyle: React.CSSProperties = {\n  ...bodyStyle,\n  fontSize: 13,\n};\n\nconst primaryButtonStyle: React.CSSProperties = {\n  background: ACCENT,\n  color: '#0B1220',\n  border: 'none',\n  borderRadius: 999,\n  padding: '8px 16px',\n  fontFamily: 'inherit',\n  fontSize: 13,\n  fontWeight: 600,\n  cursor: 'pointer',\n};\n\nconst secondaryButtonStyle: React.CSSProperties = {\n  background: 'transparent',\n  color: PANEL_MUTED,\n  border: `1px solid ${PANEL_BORDER}`,\n  borderRadius: 999,\n  padding: '8px 14px',\n  fontFamily: 'inherit',\n  fontSize: 13,\n  fontWeight: 500,\n  cursor: 'pointer',\n};\n\nconst iconButtonStyle: React.CSSProperties = {\n  width: 32,\n  height: 32,\n  borderRadius: 999,\n  background: 'rgba(255, 255, 255, 0.06)',\n  border: `1px solid ${PANEL_BORDER}`,\n  color: PANEL_FG,\n  fontSize: 11,\n  cursor: 'pointer',\n  display: 'flex',\n  alignItems: 'center',\n  justifyContent: 'center',\n};\n","import { createPortal } from 'react-dom';\nimport { TimelineProvider } from '../runtime/TimelineProvider';\nimport { useTimeline } from '../runtime/TimelineProvider';\nimport { useSceneRootRef } from '../runtime/registry';\nimport { PaperScene, PAPER_SCENE_PHASES, PAPER_SCENE_DURATION_MS } from '../scenes/PaperScene';\n\n/**\n * A built-in demo scene Loupe can mount from the empty-panel state's\n * \"Try the sample\" button. Uses the SAME paper-slide animation the\n * onboarding modal shows — so what the user just watched is exactly\n * the thing they get to scrub, pick, and annotate.\n */\n\nconst ACCENT = 'var(--loupe-accent, #3A97F9)';\nconst PANEL_BG = 'var(--loupe-panel-bg, rgba(18, 20, 25, 0.96))';\nconst PANEL_FG = 'var(--loupe-panel-fg, #E8EAEE)';\nconst PANEL_MUTED = 'var(--loupe-panel-muted, #9BA3AF)';\nconst PANEL_BORDER = 'var(--loupe-panel-border, rgba(255, 255, 255, 0.08))';\nconst FONT = 'var(--loupe-font, system-ui, -apple-system, sans-serif)';\n\nexport const SAMPLE_SCENE_ID = 'loupe:sample';\n\nconst SAMPLE_PHASE_DURATIONS = PAPER_SCENE_PHASES.reduce<Record<string, number>>(\n  (acc, p) => {\n    acc[p.id] = p.end - p.start;\n    return acc;\n  },\n  {},\n);\nconst SAMPLE_PHASE_LABELS = PAPER_SCENE_PHASES.reduce<Record<string, string>>(\n  (acc, p) => {\n    acc[p.id] = p.label;\n    return acc;\n  },\n  {},\n);\nconst SAMPLE_PHASE_ORDER = PAPER_SCENE_PHASES.map((p) => p.id);\n\nexport function SampleScene({ onDismiss }: { onDismiss: () => void }) {\n  if (typeof document === 'undefined') return null;\n\n  return (\n    <>\n      {createPortal(\n        <div\n          style={{\n            position: 'fixed',\n            top: '50%',\n            left: '50%',\n            transform: 'translate(-50%, -50%)',\n            // Sits BELOW the picker overlay (z 9998) so the overlay\n            // can intercept hover/click for picking the sample card's\n            // pieces. Still above page content.\n            zIndex: 9500,\n            pointerEvents: 'none',\n            fontFamily: FONT,\n            display: 'flex',\n            flexDirection: 'column',\n            alignItems: 'center',\n            gap: 10,\n          }}\n        >\n          <TimelineProvider\n            config={{\n              id: SAMPLE_SCENE_ID,\n              label: 'Sample · Paper slide',\n              phaseOrder: SAMPLE_PHASE_ORDER,\n              phaseDurations: SAMPLE_PHASE_DURATIONS,\n              phaseLabels: SAMPLE_PHASE_LABELS,\n            }}\n          >\n            <SampleCard />\n          </TimelineProvider>\n        </div>,\n        document.body,\n      )}\n      {/* Stop chip lives in its OWN portal so it can sit ABOVE the\n          picker overlay (z 9998). It's tagged data-loupe-ui so the\n          picker still skips it — the chip can't be picked, but it\n          remains clickable mid-pick. */}\n      {createPortal(\n        <SampleControlChip onDismiss={onDismiss} />,\n        document.body,\n      )}\n    </>\n  );\n}\n\n/**\n * The chip + Stop button are Loupe's own chrome — tag them with\n * `data-loupe-ui` so the picker skips them. The sample card itself\n * stays untagged so designers can pick the paper, circle, and cross.\n */\nfunction SampleControlChip({ onDismiss }: { onDismiss: () => void }) {\n  return (\n    <div\n      data-loupe-ui\n      style={{\n        // Positioned just below the centered card. Roughly: viewport\n        // midpoint + half-card-height + gap. The exact pixel doesn't\n        // matter — visual alignment with the card is what reads.\n        position: 'fixed',\n        top: 'calc(50% + 130px)',\n        left: '50%',\n        transform: 'translateX(-50%)',\n        // Above the picker overlay (9998) so Stop stays clickable\n        // mid-pick. The chip is tagged data-loupe-ui so the picker\n        // still excludes it from element resolution.\n        zIndex: 10050,\n        pointerEvents: 'auto',\n        display: 'inline-flex',\n        alignItems: 'center',\n        gap: 8,\n        padding: '4px 4px 4px 12px',\n        background: PANEL_BG,\n        color: PANEL_FG,\n        border: `1px solid ${PANEL_BORDER}`,\n        borderRadius: 999,\n        fontFamily: FONT,\n        fontSize: 11,\n        fontWeight: 600,\n        letterSpacing: 0.2,\n        boxShadow: '0 8px 24px rgba(0,0,0,0.35)',\n        whiteSpace: 'nowrap',\n      }}\n    >\n      <span\n        aria-hidden\n        style={{\n          display: 'inline-block',\n          width: 6,\n          height: 6,\n          borderRadius: 999,\n          background: ACCENT,\n          boxShadow: `0 0 0 3px rgba(58, 151, 249, 0.18)`,\n        }}\n      />\n      <span style={{ color: PANEL_MUTED, fontWeight: 500 }}>Loupe Sample</span>\n      <button\n        type=\"button\"\n        onClick={onDismiss}\n        style={{\n          background: 'rgba(255,255,255,0.08)',\n          color: PANEL_FG,\n          border: 'none',\n          borderRadius: 999,\n          padding: '4px 10px',\n          fontFamily: 'inherit',\n          fontSize: 11,\n          fontWeight: 600,\n          cursor: 'pointer',\n        }}\n      >\n        Stop\n      </button>\n    </div>\n  );\n}\n\nfunction SampleCard() {\n  const ref = useSceneRootRef();\n  const { time } = useTimeline();\n\n  return (\n    <div\n      ref={ref as React.Ref<HTMLDivElement>}\n      style={{\n        // Card opts back into hit-testing so the picker can find\n        // descendants. The registry also auto-patches this to `auto`\n        // on registration as a safety net.\n        pointerEvents: 'auto',\n        padding: 16,\n        borderRadius: 18,\n        background: PANEL_BG,\n        color: PANEL_FG,\n        border: `1px solid ${PANEL_BORDER}`,\n        boxShadow: '0 12px 40px rgba(0,0,0,0.45)',\n        display: 'flex',\n        flexDirection: 'column',\n        alignItems: 'center',\n        gap: 10,\n        position: 'relative',\n      }}\n    >\n      <div\n        style={{\n          fontSize: 10,\n          textTransform: 'uppercase',\n          letterSpacing: '0.1em',\n          color: ACCENT,\n          fontWeight: 700,\n          alignSelf: 'flex-start',\n        }}\n      >\n        Sample · Paper slide\n      </div>\n      <PaperScene time={time} />\n      <div style={{ fontSize: 12, color: PANEL_MUTED, alignSelf: 'flex-start' }}>\n        Scrub the timeline · pick the paper, circle, or cross.\n      </div>\n    </div>\n  );\n}\n","import { useEffect, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\n\n/**\n * Small custom tooltip for the Loupe panel.\n *\n * Native browser tooltips (`title=`) are slow (~700ms delay) and\n * visually unrelated to the panel's styling. This component:\n *   - Shows on hover after ~180ms, hides instantly\n *   - Inherits the panel's CSS variables for colour and font\n *   - Positions above the trigger with a small downward arrow\n *   - Portals to body so it can escape any container's overflow\n *   - Suppresses itself when no `label` is provided (callers can\n *     pass an empty string to opt out, useful inside loops)\n *\n * Usage:\n *   <Tooltip label=\"Pause\">\n *     <button>...</button>\n *   </Tooltip>\n */\n\nconst FONT = 'var(--loupe-font, system-ui, -apple-system, sans-serif)';\nconst PANEL_BG = 'var(--loupe-panel-bg, rgba(18, 20, 25, 0.96))';\nconst PANEL_FG = 'var(--loupe-panel-fg, #E8EAEE)';\nconst PANEL_BORDER = 'var(--loupe-panel-border, rgba(255, 255, 255, 0.08))';\n\nconst SHOW_DELAY_MS = 180;\nconst ARROW_SIZE = 5;\n\ntype TooltipPlacement = 'top' | 'bottom';\n\nexport function Tooltip({\n  label,\n  children,\n  placement = 'top',\n  shortcut,\n}: {\n  label: string;\n  children: React.ReactNode;\n  placement?: TooltipPlacement;\n  /** Optional keyboard shortcut, rendered to the right of the label\n   *  in a subtler colour (e.g. \"Space\"). */\n  shortcut?: string;\n}) {\n  const [open, setOpen] = useState(false);\n  const [coords, setCoords] = useState<{ x: number; y: number } | null>(null);\n  const triggerRef = useRef<HTMLSpanElement | null>(null);\n  const timerRef = useRef<number | null>(null);\n\n  const cancelTimer = () => {\n    if (timerRef.current !== null) {\n      window.clearTimeout(timerRef.current);\n      timerRef.current = null;\n    }\n  };\n\n  const computeCoords = () => {\n    const el = triggerRef.current;\n    if (!el) return null;\n    const r = el.getBoundingClientRect();\n    return {\n      x: r.left + r.width / 2,\n      y: placement === 'top' ? r.top : r.bottom,\n    };\n  };\n\n  const scheduleOpen = () => {\n    cancelTimer();\n    timerRef.current = window.setTimeout(() => {\n      const c = computeCoords();\n      if (!c) return;\n      setCoords(c);\n      setOpen(true);\n    }, SHOW_DELAY_MS);\n  };\n\n  const close = () => {\n    cancelTimer();\n    setOpen(false);\n  };\n\n  useEffect(() => () => cancelTimer(), []);\n\n  // Reposition on scroll / resize while open so the tooltip\n  // follows its trigger if the layout shifts.\n  useEffect(() => {\n    if (!open) return;\n    const reposition = () => {\n      const c = computeCoords();\n      if (c) setCoords(c);\n    };\n    window.addEventListener('scroll', reposition, true);\n    window.addEventListener('resize', reposition);\n    return () => {\n      window.removeEventListener('scroll', reposition, true);\n      window.removeEventListener('resize', reposition);\n    };\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [open, placement]);\n\n  // No label → behave as a transparent pass-through (still\n  // wrap so the parent layout is identical with/without).\n  return (\n    <>\n      <span\n        ref={triggerRef}\n        onMouseEnter={label ? scheduleOpen : undefined}\n        onMouseLeave={label ? close : undefined}\n        onFocus={label ? scheduleOpen : undefined}\n        onBlur={label ? close : undefined}\n        style={{\n          display: 'inline-flex',\n          alignItems: 'center',\n        }}\n      >\n        {children}\n      </span>\n      {open && label && coords && typeof document !== 'undefined'\n        ? createPortal(\n            <TooltipBubble\n              label={label}\n              shortcut={shortcut}\n              x={coords.x}\n              y={coords.y}\n              placement={placement}\n            />,\n            document.body,\n          )\n        : null}\n    </>\n  );\n}\n\nfunction TooltipBubble({\n  label,\n  shortcut,\n  x,\n  y,\n  placement,\n}: {\n  label: string;\n  shortcut?: string;\n  x: number;\n  y: number;\n  placement: TooltipPlacement;\n}) {\n  const offset = 8;\n  const bubbleStyle: React.CSSProperties = {\n    position: 'fixed',\n    left: x,\n    top: placement === 'top' ? y - offset : y + offset,\n    transform:\n      placement === 'top'\n        ? 'translate(-50%, -100%)'\n        : 'translate(-50%, 0%)',\n    zIndex: 2147483647,\n    pointerEvents: 'none',\n    background: PANEL_BG,\n    color: PANEL_FG,\n    fontFamily: FONT,\n    fontSize: 11,\n    fontWeight: 500,\n    letterSpacing: 0.2,\n    padding: '5px 9px',\n    borderRadius: 6,\n    border: `1px solid ${PANEL_BORDER}`,\n    boxShadow: '0 6px 18px rgba(0, 0, 0, 0.45)',\n    whiteSpace: 'nowrap',\n    display: 'flex',\n    alignItems: 'center',\n    gap: 8,\n    animation: 'loupe-tooltip-fade-in 120ms ease-out',\n  };\n\n  const arrowStyle: React.CSSProperties = {\n    position: 'absolute',\n    left: '50%',\n    [placement === 'top' ? 'top' : 'bottom']: '100%',\n    transform: `translate(-50%, ${placement === 'top' ? '-1px' : '1px'}) rotate(45deg)`,\n    width: ARROW_SIZE * 2,\n    height: ARROW_SIZE * 2,\n    background: PANEL_BG,\n    border: `1px solid ${PANEL_BORDER}`,\n    borderTopWidth: placement === 'top' ? 0 : '1px',\n    borderLeftWidth: placement === 'top' ? 0 : '1px',\n    borderBottomWidth: placement === 'top' ? '1px' : 0,\n    borderRightWidth: placement === 'top' ? '1px' : 0,\n    marginTop: placement === 'top' ? -ARROW_SIZE : 0,\n    marginBottom: placement === 'bottom' ? -ARROW_SIZE : 0,\n  };\n\n  return (\n    <>\n      <style>{`\n        @keyframes loupe-tooltip-fade-in {\n          from { opacity: 0; transform: translate(-50%, ${\n            placement === 'top' ? '-95%' : '5%'\n          }); }\n          to   { opacity: 1; transform: translate(-50%, ${\n            placement === 'top' ? '-100%' : '0%'\n          }); }\n        }\n      `}</style>\n      <div role=\"tooltip\" style={bubbleStyle}>\n        <span>{label}</span>\n        {shortcut ? (\n          <span\n            style={{\n              fontSize: 10,\n              color: 'rgba(255,255,255,0.5)',\n              padding: '1px 5px',\n              borderRadius: 3,\n              border: `1px solid ${PANEL_BORDER}`,\n              fontFamily:\n                'ui-monospace, SFMono-Regular, \"SF Mono\", Menlo, monospace',\n            }}\n          >\n            {shortcut}\n          </span>\n        ) : null}\n        <span style={arrowStyle} />\n      </div>\n    </>\n  );\n}\n","import {\n  AnimatePresence,\n  motion,\n  useDragControls,\n  useMotionValue,\n  useMotionValueEvent,\n} from 'framer-motion';\nimport {\n  useCallback,\n  useEffect,\n  useLayoutEffect,\n  useMemo,\n  useRef,\n  useState,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport { useLoupeRegistry } from '../runtime/registry';\nimport { phaseAtTime, rangeOf } from '../runtime/phases';\nimport { useAnnotations } from '../annotations/AnnotationsProvider';\nimport { annotationsToMarkdown } from '../annotations/export';\nimport { Welcome } from './Welcome';\nimport { SampleScene, SAMPLE_SCENE_ID } from './SampleScene';\nimport { Tooltip } from './Tooltip';\n\n/**\n * Loupe panel — the floating UI at app root, driven by the LoupeRegistry.\n *\n * Reads the active scene's TimelineState from the registry. The user picks\n * the scene to control via the dropdown; switching scenes triggers a brief\n * highlight overlay on the picked scene's root element so it's never\n * ambiguous which animation you're working on.\n */\n\nconst SPEED_OPTIONS = [0.25, 0.5, 1, 2, 4] as const;\nconst LOUPE_POSITION_KEY = 'loupe:panelPosition';\n/** Stores the user's explicit scene pick — including `null` when\n *  they collapsed the panel. Loaded on mount so refresh doesn't\n *  un-collapse the panel by auto-selecting whatever scene registers\n *  first. */\nconst LOUPE_ACTIVE_SCENE_KEY = 'loupe:activeScene';\n\nconst FONT = 'var(--loupe-font, system-ui, -apple-system, sans-serif)';\nconst ACCENT = 'var(--loupe-accent, #3A97F9)';\nconst ACCENT_SOFT = 'var(--loupe-accent-soft, rgba(58, 151, 249, 0.28))';\nconst ACCENT_GLOW = 'var(--loupe-accent-glow, rgba(58, 151, 249, 0.6))';\nconst ACCENT_RING = 'var(--loupe-accent-ring, rgba(58, 151, 249, 0.18))';\nconst ACCENT_HALO = 'var(--loupe-accent-halo, rgba(58, 151, 249, 0.35))';\nconst ACCENT_TINT = 'var(--loupe-accent-tint, rgba(58, 151, 249, 0.7))';\nconst PANEL_BG = 'var(--loupe-panel-bg, rgba(18, 20, 25, 0.92))';\nconst PANEL_FG = 'var(--loupe-panel-fg, #E8EAEE)';\nconst PANEL_MUTED = 'var(--loupe-panel-muted, #9BA3AF)';\nconst PANEL_BORDER = 'var(--loupe-panel-border, rgba(255, 255, 255, 0.08))';\nconst PANEL_HIGHLIGHT = 'var(--loupe-panel-highlight, #EAF3FF)';\n\nexport function LoupePanel() {\n  const registry = useLoupeRegistry();\n  const [sampleActive, setSampleActive] = useState(false);\n  const activeScene = registry.activeSceneId\n    ? registry.scenes.find((s) => s.id === registry.activeSceneId)\n    : undefined;\n\n  // Hydrate the persisted scene selection once — BEFORE any auto-\n  // select from scene registration has time to override it. Writing\n  // `null` explicitly means \"user picked None, stay collapsed\".\n  const sceneHydratedRef = useRef(false);\n  useEffect(() => {\n    if (sceneHydratedRef.current) return;\n    sceneHydratedRef.current = true;\n    try {\n      const raw = localStorage.getItem(LOUPE_ACTIVE_SCENE_KEY);\n      if (raw === null) return;\n      const parsed = JSON.parse(raw) as { id: string | null };\n      // null = deliberate collapsed state; a real id = restore it\n      // if the scene is (or becomes) registered.\n      if (parsed.id === null) {\n        registry.setActiveSceneId(null);\n      } else if (registry.scenes.some((s) => s.id === parsed.id)) {\n        registry.setActiveSceneId(parsed.id);\n      }\n    } catch {\n      /* corrupt storage — ignore */\n    }\n  }, [registry]);\n\n  // Persist every explicit change so refreshes preserve it.\n  useEffect(() => {\n    try {\n      localStorage.setItem(\n        LOUPE_ACTIVE_SCENE_KEY,\n        JSON.stringify({ id: registry.activeSceneId }),\n      );\n    } catch {\n      /* ignore */\n    }\n  }, [registry.activeSceneId]);\n\n  // Escape toggles the panel between collapsed (no scene) and the\n  // last-selected real scene. Fast way to get the panel out of the\n  // way mid-edit without reaching for the dropdown.\n  const lastRealSceneIdRef = useRef<string | null>(null);\n  useEffect(() => {\n    if (registry.activeSceneId) {\n      lastRealSceneIdRef.current = registry.activeSceneId;\n    }\n  }, [registry.activeSceneId]);\n  useEffect(() => {\n    const onKey = (e: KeyboardEvent) => {\n      if (e.key !== 'Escape') return;\n      // Only react when Loupe-relevant — skip when the user is\n      // typing in an input, contenteditable, etc.\n      const target = e.target as HTMLElement | null;\n      if (target && (\n        target.tagName === 'INPUT' ||\n        target.tagName === 'TEXTAREA' ||\n        target.isContentEditable\n      )) return;\n      if (registry.activeSceneId) {\n        registry.setActiveSceneId(null);\n      } else if (lastRealSceneIdRef.current &&\n                 registry.scenes.some((s) => s.id === lastRealSceneIdRef.current)) {\n        registry.setActiveSceneId(lastRealSceneIdRef.current);\n      }\n    };\n    window.addEventListener('keydown', onKey);\n    return () => window.removeEventListener('keydown', onKey);\n  }, [registry]);\n\n  const {\n    pickerMode,\n    setPickerMode,\n    visible: annotationsVisible,\n    setVisible: setAnnotationsVisible,\n    annotations,\n  } = useAnnotations();\n\n  const [expanded, setExpanded] = useState(true);\n\n  const dragControls = useDragControls();\n  const x = useMotionValue(0);\n  const y = useMotionValue(0);\n\n  const panelRef = useRef<HTMLDivElement | null>(null);\n  const [viewport, setViewport] = useState(() => ({\n    w: typeof window === 'undefined' ? 1440 : window.innerWidth,\n    h: typeof window === 'undefined' ? 900 : window.innerHeight,\n  }));\n  const [panelSize, setPanelSize] = useState(() => {\n    const w =\n      typeof window === 'undefined' ? 1024 : Math.min(1024, window.innerWidth - 32);\n    return { w, h: 80 };\n  });\n\n  const SAFE_PADDING = 16;\n\n  const constraints = useMemo(() => {\n    if (panelSize.w === 0 || panelSize.h === 0) {\n      return { left: 0, right: 0, top: 0, bottom: 0 };\n    }\n    const halfW = panelSize.w / 2;\n    const naturalLeft = viewport.w / 2 - halfW;\n    const naturalRight = viewport.w / 2 + halfW;\n    const naturalTop = viewport.h - 16 - panelSize.h;\n    const naturalBottom = viewport.h - 16;\n\n    return {\n      left: SAFE_PADDING - naturalLeft,\n      right: viewport.w - SAFE_PADDING - naturalRight,\n      top: SAFE_PADDING - naturalTop,\n      bottom: viewport.h - SAFE_PADDING - naturalBottom,\n    };\n  }, [viewport.w, viewport.h, panelSize.w, panelSize.h]);\n\n  const clampToViewport = useCallback(\n    (cx: number, cy: number) => ({\n      x: Math.min(\n        Math.max(constraints.left, cx),\n        Math.max(constraints.left, constraints.right),\n      ),\n      y: Math.min(\n        Math.max(constraints.top, cy),\n        Math.max(constraints.top, constraints.bottom),\n      ),\n    }),\n    [constraints],\n  );\n\n  const hydratedRef = useRef(false);\n  useEffect(() => {\n    if (hydratedRef.current) return;\n    if (panelSize.w === 0) return;\n    hydratedRef.current = true;\n    try {\n      const raw = localStorage.getItem(LOUPE_POSITION_KEY);\n      if (raw) {\n        const saved = JSON.parse(raw);\n        const clamped = clampToViewport(\n          typeof saved?.x === 'number' ? saved.x : 0,\n          typeof saved?.y === 'number' ? saved.y : 0,\n        );\n        x.set(clamped.x);\n        y.set(clamped.y);\n      }\n    } catch {\n      /* ignore */\n    }\n  }, [panelSize.w, clampToViewport, x, y]);\n\n  useEffect(() => {\n    const onResize = () => {\n      setViewport({ w: window.innerWidth, h: window.innerHeight });\n    };\n    window.addEventListener('resize', onResize);\n    return () => window.removeEventListener('resize', onResize);\n  }, []);\n\n  // Re-attach the ResizeObserver whenever the element under\n  // `panelRef` changes. That happens on `expanded` toggles AND on\n  // collapse/expand transitions (CollapsedPanel ↔ ActiveScenePanel\n  // are different elements sharing the same ref). Without\n  // `activeSceneId` in the deps, the observer stays bound to the\n  // unmounted node after transition → `panelSize` keeps the old\n  // (pill) dimensions → drag constraints stay permissive → the\n  // newly-expanded panel renders past the safe area at edge\n  // positions. Including `activeSceneId` here forces re-observation\n  // against the new element on every swap.\n  useLayoutEffect(() => {\n    const el = panelRef.current;\n    if (!el) return;\n    const update = () => {\n      const rect = el.getBoundingClientRect();\n      setPanelSize((prev) =>\n        prev.w === rect.width && prev.h === rect.height\n          ? prev\n          : { w: rect.width, h: rect.height },\n      );\n    };\n    update();\n    const ro = new ResizeObserver(update);\n    ro.observe(el);\n    return () => ro.disconnect();\n  }, [expanded, registry.activeSceneId]);\n\n  useEffect(() => {\n    if (panelSize.w === 0) return;\n    const clamped = clampToViewport(x.get(), y.get());\n    if (clamped.x !== x.get()) x.set(clamped.x);\n    if (clamped.y !== y.get()) y.set(clamped.y);\n  }, [clampToViewport, panelSize.w, panelSize.h, x, y]);\n\n  const persistPosition = () => {\n    try {\n      localStorage.setItem(LOUPE_POSITION_KEY, JSON.stringify({ x: x.get(), y: y.get() }));\n    } catch {\n      /* ignore */\n    }\n  };\n\n  // If the only registered scene is our built-in sample, treat the\n  // panel as still effectively empty for \"Try the sample\" button\n  // visibility logic. If the user wires up a real scene, sample\n  // auto-removes — no point keeping a teaching aid alongside real work.\n  const realSceneCount = registry.scenes.filter(\n    (s) => s.id !== SAMPLE_SCENE_ID,\n  ).length;\n  useEffect(() => {\n    if (sampleActive && realSceneCount > 0) setSampleActive(false);\n  }, [sampleActive, realSceneCount]);\n  const sampleNode = sampleActive ? (\n    <SampleScene onDismiss={() => setSampleActive(false)} />\n  ) : null;\n\n  if (!activeScene) {\n    // Two sub-states:\n    //  - No scenes registered at all → static centered \"no scene\" pill\n    //    (Loupe hasn't found anything to drive yet).\n    //  - Scenes registered but user picked \"None\" → collapsed\n    //    draggable pill with JUST the scene picker, so they can\n    //    re-select any time. Shares the drag position with the\n    //    full panel so collapsing/expanding doesn't jump around.\n    if (registry.scenes.length === 0) {\n      return (\n        <>\n          <Welcome />\n          {sampleNode}\n          <EmptyPanel\n            onTrySample={() => {\n              setSampleActive(true);\n              // Pre-select the sample so when it registers the panel\n              // expands to drive it — beats any sticky \"None\" pick\n              // from a prior session.\n              registry.setActiveSceneId(SAMPLE_SCENE_ID);\n            }}\n          />\n        </>\n      );\n    }\n    return (\n      <>\n        <Welcome />\n        {sampleNode}\n        <CollapsedPanel\n        registry={registry}\n        dragControls={dragControls}\n        x={x}\n        y={y}\n        panelRef={panelRef}\n        setPanelSize={setPanelSize}\n        persistPosition={persistPosition}\n        dragConstraints={constraints}\n      />\n      </>\n    );\n  }\n\n  return (\n    <>\n    <Welcome />\n    {sampleNode}\n    <ActiveScenePanel\n      registry={registry}\n      activeScene={activeScene}\n      pickerMode={pickerMode}\n      setPickerMode={setPickerMode}\n      annotationsVisible={annotationsVisible}\n      setAnnotationsVisible={setAnnotationsVisible}\n      annotations={annotations}\n      expanded={expanded}\n      setExpanded={setExpanded}\n      dragControls={dragControls}\n      x={x}\n      y={y}\n      persistPosition={persistPosition}\n      dragConstraints={constraints}\n      panelRef={panelRef}\n      viewportW={viewport.w}\n    />\n    </>\n  );\n}\n\ntype Registry = ReturnType<typeof useLoupeRegistry>;\ntype ActiveScene = NonNullable<ReturnType<Registry['scenes']['find']>>;\n\n/**\n * Empty-state panel — a skeleton/preview of the real ActiveScenePanel\n * shown when no scenes are registered. Same shape, same controls,\n * same rhythm — but all controls are inert and the scene picker\n * dropdown exposes a single \"Try the sample\" option that mounts\n * Loupe's built-in demo scene. The designer learns the panel's real\n * mechanics in the empty state.\n */\nfunction EmptyPanel({ onTrySample }: { onTrySample: () => void }) {\n  return (\n    <div\n      data-loupe-ui\n      style={{\n        position: 'fixed',\n        left: '50%',\n        bottom: 16,\n        transform: 'translateX(-50%)',\n        width: 'min(1024px, calc(100vw - 32px))',\n        zIndex: 10050,\n        pointerEvents: 'none',\n      }}\n    >\n      <div\n        style={{\n          pointerEvents: 'auto',\n          display: 'flex',\n          flexDirection: 'column',\n          width: '100%',\n          background: PANEL_BG,\n          backdropFilter: 'blur(14px)',\n          WebkitBackdropFilter: 'blur(14px)',\n          borderRadius: 16,\n          border: `1px solid ${PANEL_BORDER}`,\n          boxShadow:\n            '0 20px 40px rgba(0, 0, 0, 0.35), 0 4px 12px rgba(0, 0, 0, 0.25)',\n          color: PANEL_FG,\n          fontFamily: FONT,\n          padding: '12px 14px 14px',\n        }}\n      >\n        {/* Top row — picker, phase label, time, controls */}\n        <div\n          style={{\n            display: 'flex',\n            alignItems: 'center',\n            justifyContent: 'space-between',\n            marginBottom: 10,\n          }}\n        >\n          <div style={{ display: 'flex', alignItems: 'center', gap: 10, flexWrap: 'wrap' }}>\n            <span\n              style={{\n                display: 'inline-flex',\n                alignItems: 'center',\n                padding: '4px 2px',\n                color: '#6B7280',\n              }}\n              aria-hidden\n            >\n              <GripIcon />\n            </span>\n\n            <button\n              type=\"button\"\n              onClick={onTrySample}\n              style={{\n                display: 'inline-flex',\n                alignItems: 'center',\n                gap: 6,\n                padding: '6px 12px',\n                borderRadius: 999,\n                border: `1px solid ${PANEL_BORDER}`,\n                background: 'rgba(255, 255, 255, 0.04)',\n                color: PANEL_FG,\n                fontFamily: 'inherit',\n                fontSize: 12,\n                fontWeight: 600,\n                cursor: 'pointer',\n              }}\n            >\n              <span style={{ color: PANEL_MUTED, fontWeight: 500 }}>Empty —</span>\n              <span style={{ color: ACCENT }}>try the sample</span>\n            </button>\n\n            <span\n              style={{\n                fontWeight: 700,\n                fontSize: 13,\n                letterSpacing: 0.2,\n                color: PANEL_MUTED,\n                opacity: 0.6,\n              }}\n            >\n              —\n            </span>\n            <span\n              style={{\n                fontWeight: 500,\n                fontSize: 11,\n                color: PANEL_MUTED,\n                fontVariantNumeric: 'tabular-nums',\n                opacity: 0.6,\n              }}\n            >\n              0ms / 0ms · 0%\n            </span>\n          </div>\n\n          <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}>\n            <DisabledIconButton title=\"Add feedback on element\">\n              <PointerIcon />\n            </DisabledIconButton>\n            <DisabledIconButton title=\"Draw region\">\n              <RegionIcon />\n            </DisabledIconButton>\n            <DisabledIconButton title=\"Annotations\">\n              <EyeIcon />\n            </DisabledIconButton>\n            <span style={{ width: 1, height: 18, background: PANEL_BORDER, margin: '0 2px' }} />\n            <DisabledIconButton title=\"Play / pause\">\n              <PlayIconShape />\n            </DisabledIconButton>\n            <DisabledIconButton title=\"Restart\">\n              <RestartIconShape />\n            </DisabledIconButton>\n          </div>\n        </div>\n\n        {/* Inert scrubber */}\n        <div\n          aria-hidden\n          style={{\n            height: 6,\n            borderRadius: 999,\n            background: 'rgba(255, 255, 255, 0.06)',\n            position: 'relative',\n            overflow: 'hidden',\n          }}\n        >\n          <div\n            style={{\n              position: 'absolute',\n              left: 0,\n              top: 0,\n              bottom: 0,\n              width: '0%',\n              background: ACCENT,\n              opacity: 0.5,\n            }}\n          />\n        </div>\n\n        {/* Phase strip — single neutral band */}\n        <div style={{ marginTop: 8, display: 'flex', gap: 4, height: 22 }}>\n          <div\n            style={{\n              flex: 1,\n              borderRadius: 6,\n              background: 'rgba(255, 255, 255, 0.04)',\n              border: `1px dashed ${PANEL_BORDER}`,\n              display: 'flex',\n              alignItems: 'center',\n              justifyContent: 'center',\n              fontSize: 10,\n              color: PANEL_MUTED,\n              letterSpacing: 0.3,\n            }}\n          >\n            no phases yet\n          </div>\n        </div>\n      </div>\n    </div>\n  );\n}\n\nfunction DisabledIconButton({\n  children,\n  title,\n}: {\n  children: React.ReactNode;\n  title: string;\n}) {\n  return (\n    <Tooltip label={title}>\n      <span\n        aria-disabled\n        style={{\n        width: 26,\n        height: 26,\n        display: 'inline-flex',\n        alignItems: 'center',\n        justifyContent: 'center',\n        borderRadius: 8,\n        background: 'rgba(255,255,255,0.04)',\n        color: PANEL_MUTED,\n        opacity: 0.55,\n        cursor: 'not-allowed',\n      }}\n      >\n        {children}\n      </span>\n    </Tooltip>\n  );\n}\n\nfunction PlayIconShape() {\n  return (\n    <svg width=\"20\" height=\"20\" viewBox=\"0 0 14 14\" fill=\"currentColor\">\n      <path d=\"M4 3l8 4-8 4z\" />\n    </svg>\n  );\n}\n\nfunction RestartIconShape() {\n  return (\n    <svg width=\"20\" height=\"20\" viewBox=\"0 0 14 14\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n      <path d=\"M3 7a4 4 0 1 1 1.2 2.8\" />\n      <path d=\"M2 4v3h3\" />\n    </svg>\n  );\n}\n\n/**\n * Compact, draggable pill shown when the user picks \"None\" from the\n * scene dropdown. Contains only the scene picker so they can re-\n * select a scene whenever they want. Shares the drag position\n * (x/y MotionValues) with the full panel so collapsing/expanding\n * doesn't jump the panel across the screen.\n */\nfunction CollapsedPanel({\n  registry,\n  dragControls,\n  x,\n  y,\n  panelRef,\n  setPanelSize,\n  persistPosition,\n  dragConstraints,\n}: {\n  registry: Registry;\n  dragControls: ReturnType<typeof useDragControls>;\n  x: ReturnType<typeof useMotionValue<number>>;\n  y: ReturnType<typeof useMotionValue<number>>;\n  panelRef: React.MutableRefObject<HTMLDivElement | null>;\n  setPanelSize: (size: { w: number; h: number }) => void;\n  persistPosition: () => void;\n  dragConstraints: { left: number; right: number; top: number; bottom: number };\n}) {\n  // Track the collapsed pill's size so constraints stay honest if\n  // user drags to viewport edges.\n  useLayoutEffect(() => {\n    const el = panelRef.current;\n    if (!el) return;\n    const update = () => {\n      setPanelSize({ w: el.offsetWidth, h: el.offsetHeight });\n    };\n    update();\n    const ro = new ResizeObserver(update);\n    ro.observe(el);\n    return () => ro.disconnect();\n  }, [panelRef, setPanelSize]);\n\n  return (\n    <motion.div\n      data-loupe-ui\n      style={{\n        // Inline styles only — Loupe ships no CSS, so we must not\n        // rely on host utility classes (Tailwind `fixed` /\n        // `pointer-events-none`). Without `position: fixed` here the\n        // pill drops into normal document flow and renders below the\n        // page content instead of floating at the bottom-center.\n        position: 'fixed',\n        pointerEvents: 'none',\n        bottom: 16,\n        left: '50%',\n        zIndex: 10050,\n        translateX: '-50%',\n      }}\n    >\n      <motion.div\n        ref={panelRef}\n        drag\n        dragListener={false}\n        dragControls={dragControls}\n        dragMomentum={false}\n        dragElastic={0}\n        dragConstraints={dragConstraints}\n        onDragEnd={persistPosition}\n        transition={{ duration: 0.35, ease: [0.59, 0.01, 0.4, 0.98] }}\n        style={{\n          pointerEvents: 'auto',\n          x,\n          y,\n          display: 'inline-flex',\n          alignItems: 'center',\n          gap: 8,\n          padding: '6px 8px 6px 10px',\n          background: PANEL_BG,\n          border: `1px solid ${PANEL_BORDER}`,\n          borderRadius: 999,\n          color: PANEL_FG,\n          fontFamily: FONT,\n          boxShadow:\n            '0 12px 28px rgba(0, 0, 0, 0.30), 0 3px 10px rgba(0, 0, 0, 0.20)',\n          backdropFilter: 'blur(14px)',\n          WebkitBackdropFilter: 'blur(14px)',\n        }}\n      >\n        {/* Drag handle — grabs the whole pill */}\n        <button\n          type=\"button\"\n          aria-label=\"Drag Loupe\"\n          onPointerDown={(e) => dragControls.start(e)}\n          style={{\n            display: 'inline-flex',\n            alignItems: 'center',\n            justifyContent: 'center',\n            width: 22,\n            height: 22,\n            border: 'none',\n            borderRadius: 999,\n            background: 'transparent',\n            color: PANEL_MUTED,\n            cursor: 'grab',\n            padding: 0,\n          }}\n        >\n          <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"currentColor\" aria-hidden>\n            <circle cx=\"3\" cy=\"3\" r=\"1.1\" />\n            <circle cx=\"3\" cy=\"6\" r=\"1.1\" />\n            <circle cx=\"3\" cy=\"9\" r=\"1.1\" />\n            <circle cx=\"9\" cy=\"3\" r=\"1.1\" />\n            <circle cx=\"9\" cy=\"6\" r=\"1.1\" />\n            <circle cx=\"9\" cy=\"9\" r=\"1.1\" />\n          </svg>\n        </button>\n        <ScenePicker registry={registry} />\n      </motion.div>\n    </motion.div>\n  );\n}\n\nfunction ActiveScenePanel({\n  registry,\n  activeScene,\n  pickerMode,\n  setPickerMode,\n  annotationsVisible,\n  setAnnotationsVisible,\n  annotations,\n  expanded,\n  setExpanded,\n  dragControls,\n  x,\n  y,\n  persistPosition,\n  dragConstraints,\n  panelRef,\n  viewportW,\n}: {\n  registry: Registry;\n  activeScene: ActiveScene;\n  pickerMode: ReturnType<typeof useAnnotations>['pickerMode'];\n  setPickerMode: ReturnType<typeof useAnnotations>['setPickerMode'];\n  annotationsVisible: boolean;\n  setAnnotationsVisible: (v: boolean) => void;\n  annotations: ReturnType<typeof useAnnotations>['annotations'];\n  expanded: boolean;\n  setExpanded: (v: boolean) => void;\n  dragControls: ReturnType<typeof useDragControls>;\n  x: ReturnType<typeof useMotionValue<number>>;\n  y: ReturnType<typeof useMotionValue<number>>;\n  persistPosition: () => void;\n  dragConstraints: { left: number; right: number; top: number; bottom: number };\n  panelRef: React.MutableRefObject<HTMLDivElement | null>;\n  viewportW: number;\n}) {\n  const isMobile = viewportW < 640;\n  const tl = activeScene.timeline;\n  const {\n    time,\n    ranges,\n    totalDuration,\n    phaseOrder,\n    phaseLabels,\n    speed,\n    setSpeed,\n    paused,\n    setPaused,\n    seek,\n    restart,\n  } = tl;\n\n  const [displayMs, setDisplayMs] = useState(() => time.get());\n  useEffect(() => {\n    setDisplayMs(time.get());\n  }, [time]);\n  useMotionValueEvent(time, 'change', (v) => setDisplayMs(v));\n\n  const phase = phaseAtTime(ranges, totalDuration, displayMs);\n  const phaseRange = phase\n    ? rangeOf(ranges, phase)\n    : { start: 0, end: 0, duration: 0, phase: '' };\n  const phaseElapsed = Math.max(0, displayMs - phaseRange.start);\n  const totalProgress = totalDuration > 0 ? displayMs / totalDuration : 0;\n  const phaseProgress = phaseRange.duration > 0 ? phaseElapsed / phaseRange.duration : 0;\n\n  const stripRef = useRef<HTMLDivElement>(null);\n  const setTimeFromPointer = (clientX: number) => {\n    const el = stripRef.current;\n    if (!el) return;\n    const rect = el.getBoundingClientRect();\n    const ratio = Math.max(0, Math.min(1, (clientX - rect.left) / rect.width));\n    seek(ratio * totalDuration);\n  };\n  const onPointerDown = (e: React.PointerEvent) => {\n    e.preventDefault();\n    if (!paused) setPaused(true);\n    setTimeFromPointer(e.clientX);\n    const el = stripRef.current;\n    if (el) el.setPointerCapture(e.pointerId);\n  };\n  const onPointerMove = (e: React.PointerEvent) => {\n    if (e.buttons === 0) return;\n    setTimeFromPointer(e.clientX);\n  };\n  const onPointerUp = (e: React.PointerEvent) => {\n    const el = stripRef.current;\n    if (el && el.hasPointerCapture(e.pointerId)) el.releasePointerCapture(e.pointerId);\n  };\n\n  const labelFor = (p: string) => phaseLabels?.[p] ?? p;\n\n  return (\n    <>\n      <SceneFlashOverlay registry={registry} />\n      <SceneActiveHalo registry={registry} />\n\n      <motion.div\n        data-loupe-ui\n        style={{\n          position: 'fixed',\n          left: '50%',\n          transform: 'translateX(-50%)',\n          bottom: 16,\n          width: 'min(1024px, calc(100vw - 32px))',\n          zIndex: 10050,\n          display: 'flex',\n          pointerEvents: 'none',\n        }}\n      >\n        <motion.div\n          ref={panelRef}\n          layout\n          drag\n          dragListener={false}\n          dragControls={dragControls}\n          dragMomentum={false}\n          dragElastic={0}\n          onDragEnd={persistPosition}\n          dragConstraints={dragConstraints}\n          transition={{ duration: 0.35, ease: [0.59, 0.01, 0.4, 0.98] }}\n          style={{\n            pointerEvents: 'auto',\n            display: 'flex',\n            flexDirection: 'column',\n            width: '100%',\n            x,\n            y,\n            background: PANEL_BG,\n            backdropFilter: 'blur(14px)',\n            WebkitBackdropFilter: 'blur(14px)',\n            borderRadius: 16,\n            border: `1px solid ${PANEL_BORDER}`,\n            boxShadow:\n              '0 20px 40px rgba(0, 0, 0, 0.35), 0 4px 12px rgba(0, 0, 0, 0.25)',\n            color: PANEL_FG,\n            fontFamily: FONT,\n            overflow: 'hidden',\n          }}\n        >\n          <AnimatePresence initial={false} mode=\"wait\">\n            {expanded ? (\n              <motion.div\n                key=\"expanded\"\n                initial={{ opacity: 0 }}\n                animate={{ opacity: 1 }}\n                exit={{ opacity: 0 }}\n                transition={{ duration: 0.2 }}\n                style={{ padding: isMobile ? '10px 10px 10px' : '12px 14px 14px' }}\n              >\n                <div\n                  style={{\n                    display: 'flex',\n                    flexDirection: isMobile ? 'column' : 'row',\n                    alignItems: isMobile ? 'stretch' : 'center',\n                    justifyContent: isMobile ? undefined : 'space-between',\n                    marginBottom: 10,\n                    gap: isMobile ? 8 : 0,\n                  }}\n                >\n                  <div\n                    style={{\n                      display: 'flex',\n                      alignItems: 'center',\n                      gap: isMobile ? 8 : 10,\n                      flexWrap: 'wrap',\n                    }}\n                  >\n                    <Tooltip label=\"Drag to move the panel\">\n                      <span\n                        onPointerDown={(e) => dragControls.start(e)}\n                        style={{\n                          display: 'inline-flex',\n                          alignItems: 'center',\n                          padding: '4px 2px',\n                          cursor: 'grab',\n                          color: '#6B7280',\n                          touchAction: 'none',\n                        }}\n                      >\n                        <GripIcon />\n                      </span>\n                    </Tooltip>\n                    <ScenePicker registry={registry} />\n                    <span\n                      style={{\n                        fontWeight: 700,\n                        fontSize: isMobile ? 12 : 13,\n                        letterSpacing: 0.2,\n                      }}\n                    >\n                      {phase}\n                    </span>\n                    <span\n                      style={{\n                        fontWeight: 500,\n                        fontSize: isMobile ? 10 : 11,\n                        color: PANEL_MUTED,\n                        fontVariantNumeric: 'tabular-nums',\n                      }}\n                    >\n                      {isMobile ? (\n                        <>\n                          {formatMs(phaseElapsed)} / {formatMs(phaseRange.duration)}\n                          {' · '}\n                          {Math.round(totalProgress * 100)}%\n                        </>\n                      ) : (\n                        <>\n                          {formatMs(phaseElapsed)} / {formatMs(phaseRange.duration)}\n                          {' · '}\n                          {formatMs(displayMs)} / {formatMs(totalDuration)}\n                          {' · '}\n                          {Math.round(totalProgress * 100)}%\n                        </>\n                      )}\n                    </span>\n                  </div>\n\n                  <div\n                    style={{\n                      display: 'flex',\n                      alignItems: 'center',\n                      gap: isMobile ? 6 : 8,\n                      flexWrap: isMobile ? 'wrap' : 'nowrap',\n                      justifyContent: isMobile ? 'flex-start' : undefined,\n                    }}\n                  >\n                    <IconButton\n                      onClick={() =>\n                        setPickerMode(pickerMode === 'element' ? 'off' : 'element')\n                      }\n                      title={pickerMode === 'element' ? 'Cancel picker' : 'Add feedback on element'}\n                      active={pickerMode === 'element'}\n                    >\n                      <PointerIcon />\n                    </IconButton>\n                    <IconButton\n                      onClick={() =>\n                        setPickerMode(pickerMode === 'region' ? 'off' : 'region')\n                      }\n                      disabled={!paused && pickerMode !== 'region'}\n                      title={paused ? 'Draw region (paused mode)' : 'Pause first to draw a region'}\n                      active={pickerMode === 'region'}\n                    >\n                      <RegionIcon />\n                    </IconButton>\n                    <IconButton\n                      onClick={() => setAnnotationsVisible(!annotationsVisible)}\n                      title={annotationsVisible ? 'Hide annotations' : 'Show annotations'}\n                      active={!annotationsVisible}\n                    >\n                      {annotationsVisible ? <EyeIcon /> : <EyeOffIcon />}\n                    </IconButton>\n                    {annotations.length > 0 && (\n                      <Tooltip\n                        label={`${annotations.length} annotation${annotations.length === 1 ? '' : 's'} on this scene`}\n                      >\n                        <span\n                          style={{\n                            padding: '0 6px',\n                            height: 18,\n                            borderRadius: 999,\n                            background: ACCENT,\n                            color: '#121419',\n                            fontSize: 10,\n                            fontWeight: 700,\n                            display: 'inline-flex',\n                            alignItems: 'center',\n                          }}\n                        >\n                          {annotations.length}\n                        </span>\n                      </Tooltip>\n                    )}\n                    <span\n                      style={{\n                        width: 1,\n                        height: 16,\n                        background: 'rgba(255,255,255,0.12)',\n                        margin: '0 2px',\n                      }}\n                    />\n                    {isMobile ? (\n                      <CompactSpeedChip speed={speed} onChange={setSpeed} />\n                    ) : (\n                      <SpeedSelector speed={speed} onChange={setSpeed} />\n                    )}\n                    <IconButton\n                      onClick={() => setPaused(!paused)}\n                      title={paused ? 'Play' : 'Pause'}\n                    >\n                      {paused ? <PlayIcon /> : <PauseIcon />}\n                    </IconButton>\n                    <IconButton onClick={restart} title=\"Restart\">\n                      <RestartIcon />\n                    </IconButton>\n                    <IconButton onClick={() => setExpanded(false)} title=\"Collapse\">\n                      <CollapseIcon />\n                    </IconButton>\n                  </div>\n                </div>\n\n                <div\n                  ref={stripRef}\n                  onPointerDown={onPointerDown}\n                  onPointerMove={onPointerMove}\n                  onPointerUp={onPointerUp}\n                  onPointerCancel={onPointerUp}\n                  style={{\n                    position: 'relative',\n                    display: 'flex',\n                    height: 26,\n                    borderRadius: 8,\n                    background: 'rgba(255, 255, 255, 0.04)',\n                    overflow: 'hidden',\n                    border: '1px solid rgba(255, 255, 255, 0.06)',\n                    cursor: 'ew-resize',\n                    touchAction: 'none',\n                    userSelect: 'none',\n                  }}\n                >\n                  {phaseOrder.map((p) => {\n                    const dur = ranges.find((r) => r.phase === p)?.duration ?? 0;\n                    const widthPct = totalDuration > 0 ? (dur / totalDuration) * 100 : 0;\n                    const isActive = p === phase;\n                    return (\n                      <Tooltip key={p} label={`${labelFor(p)} · ${formatMs(dur)} · jump here`}>\n                      <button\n                        type=\"button\"\n                        onClick={(e) => {\n                          e.stopPropagation();\n                          seek(rangeOf(ranges, p).start);\n                        }}\n                        style={{\n                          flex: `0 0 ${widthPct}%`,\n                          minWidth: 0,\n                          height: '100%',\n                          padding: '0 6px',\n                          margin: 0,\n                          border: 'none',\n                          borderRight: '1px solid rgba(0, 0, 0, 0.35)',\n                          background: isActive ? ACCENT_SOFT : 'transparent',\n                          color: isActive ? PANEL_HIGHLIGHT : PANEL_MUTED,\n                          fontFamily: 'inherit',\n                          fontWeight: isActive ? 700 : 500,\n                          fontSize: 10,\n                          lineHeight: 1,\n                          textAlign: 'left',\n                          whiteSpace: 'nowrap',\n                          overflow: 'hidden',\n                          textOverflow: 'ellipsis',\n                          cursor: 'pointer',\n                          display: 'flex',\n                          alignItems: 'center',\n                          transition: 'background 150ms ease, color 150ms ease',\n                        }}\n                      >\n                        {labelFor(p)}\n                      </button>\n                      </Tooltip>\n                    );\n                  })}\n\n                  <div\n                    aria-hidden\n                    style={{\n                      position: 'absolute',\n                      top: 0,\n                      bottom: 0,\n                      left: `${totalProgress * 100}%`,\n                      width: 2,\n                      background: ACCENT,\n                      boxShadow: `0 0 8px ${ACCENT_GLOW}`,\n                      pointerEvents: 'none',\n                    }}\n                  />\n                </div>\n\n                <div\n                  style={{\n                    marginTop: 8,\n                    height: 2,\n                    borderRadius: 999,\n                    background: 'rgba(255, 255, 255, 0.06)',\n                    overflow: 'hidden',\n                  }}\n                >\n                  <div\n                    style={{\n                      height: '100%',\n                      width: `${Math.min(phaseProgress, 1) * 100}%`,\n                      background: ACCENT_TINT,\n                    }}\n                  />\n                </div>\n\n                {annotations.length > 0 && <AnnotationList />}\n              </motion.div>\n            ) : (\n              <motion.div\n                key=\"collapsed\"\n                initial={{ opacity: 0 }}\n                animate={{ opacity: 1 }}\n                exit={{ opacity: 0 }}\n                transition={{ duration: 0.2 }}\n                style={{\n                  display: 'flex',\n                  alignItems: 'center',\n                  padding: isMobile ? '8px 10px' : '8px 14px',\n                  gap: isMobile ? 8 : 10,\n                  width: '100%',\n                  color: 'inherit',\n                  fontFamily: 'inherit',\n                }}\n              >\n                <Tooltip label=\"Drag to move the panel\">\n                  <span\n                    onPointerDown={(e) => dragControls.start(e)}\n                    style={{\n                      display: 'inline-flex',\n                      alignItems: 'center',\n                      color: '#6B7280',\n                      cursor: 'grab',\n                      touchAction: 'none',\n                    }}\n                  >\n                    <GripIcon />\n                  </span>\n                </Tooltip>\n                <button\n                  type=\"button\"\n                  onClick={() => setExpanded(true)}\n                  style={{\n                    display: 'flex',\n                    alignItems: 'center',\n                    flex: 1,\n                    padding: 0,\n                    gap: isMobile ? 8 : 10,\n                    background: 'transparent',\n                    border: 'none',\n                    color: 'inherit',\n                    cursor: 'pointer',\n                    fontFamily: 'inherit',\n                    minWidth: 0,\n                  }}\n                >\n                  <span\n                    style={{\n                      fontWeight: 700,\n                      fontSize: 12,\n                      whiteSpace: 'nowrap',\n                      flexShrink: 0,\n                    }}\n                  >\n                    {activeScene.label}\n                  </span>\n                  <span\n                    style={{\n                      fontWeight: 500,\n                      fontSize: 11,\n                      color: PANEL_MUTED,\n                      whiteSpace: 'nowrap',\n                      overflow: 'hidden',\n                      textOverflow: 'ellipsis',\n                      minWidth: 0,\n                      flexShrink: 1,\n                    }}\n                  >\n                    {isMobile ? labelFor(phase) : phase}\n                  </span>\n                  <span\n                    style={{\n                      flex: 1,\n                      minWidth: 20,\n                      height: 3,\n                      borderRadius: 999,\n                      background: 'rgba(255, 255, 255, 0.08)',\n                      overflow: 'hidden',\n                    }}\n                  >\n                    <span\n                      style={{\n                        display: 'block',\n                        height: '100%',\n                        width: `${Math.min(totalProgress, 1) * 100}%`,\n                        background: ACCENT,\n                      }}\n                    />\n                  </span>\n                  <span style={{ fontSize: 10, color: PANEL_MUTED, flexShrink: 0 }}>\n                    {Math.round(totalProgress * 100)}%\n                  </span>\n                  <ExpandIcon />\n                </button>\n              </motion.div>\n            )}\n          </AnimatePresence>\n        </motion.div>\n      </motion.div>\n    </>\n  );\n}\n\nfunction ScenePicker({ registry }: { registry: Registry }) {\n  const [open, setOpen] = useState(false);\n  // `buttonRef` is the trigger; `menuRef` is the portalled popover.\n  // Keeping both refs so the outside-click handler knows to ignore\n  // clicks that land inside either (otherwise the popover closes\n  // the instant the user clicks an item).\n  const buttonRef = useRef<HTMLButtonElement>(null);\n  const menuRef = useRef<HTMLDivElement>(null);\n  const [menuPos, setMenuPos] = useState<{ left: number; top: number } | null>(null);\n  const active = registry.scenes.find((s) => s.id === registry.activeSceneId);\n\n  // Recompute the popover anchor each time it opens (or the viewport\n  // resizes). The panel has `overflow: hidden` on its outer wrapper\n  // — any absolute child gets clipped — so the menu lives in a\n  // React portal outside that container and is anchored via fixed\n  // coords pulled from the trigger button's bounding rect.\n  useEffect(() => {\n    if (!open) {\n      setMenuPos(null);\n      return;\n    }\n    const update = () => {\n      const btn = buttonRef.current;\n      if (!btn) return;\n      const rect = btn.getBoundingClientRect();\n      setMenuPos({ left: rect.left, top: rect.top });\n    };\n    update();\n    window.addEventListener('resize', update);\n    window.addEventListener('scroll', update, true);\n    return () => {\n      window.removeEventListener('resize', update);\n      window.removeEventListener('scroll', update, true);\n    };\n  }, [open]);\n\n  useEffect(() => {\n    if (!open) return;\n    const onClick = (e: MouseEvent) => {\n      const t = e.target as Node;\n      if (buttonRef.current?.contains(t)) return;\n      if (menuRef.current?.contains(t)) return;\n      setOpen(false);\n    };\n    window.addEventListener('mousedown', onClick);\n    return () => window.removeEventListener('mousedown', onClick);\n  }, [open]);\n\n  return (\n    <div style={{ position: 'relative' }}>\n      <Tooltip label=\"Pick which animation Loupe is controlling\">\n      <button\n        ref={buttonRef}\n        type=\"button\"\n        onClick={() => setOpen((o) => !o)}\n        style={{\n          display: 'inline-flex',\n          alignItems: 'center',\n          gap: 6,\n          background: 'rgba(255,255,255,0.06)',\n          color: PANEL_HIGHLIGHT,\n          border: '1px solid rgba(255,255,255,0.08)',\n          borderRadius: 999,\n          padding: '4px 10px',\n          fontFamily: 'inherit',\n          fontWeight: 700,\n          fontSize: 11,\n          cursor: 'pointer',\n          letterSpacing: 0.2,\n        }}\n      >\n        <span>{active?.label ?? '— Pick a scene'}</span>\n        <svg width=\"9\" height=\"9\" viewBox=\"0 0 14 14\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n          <path d=\"M3 5l4 4 4-4\" />\n        </svg>\n      </button>\n      </Tooltip>\n      {open && menuPos &&\n        typeof document !== 'undefined' &&\n        createPortal(\n        <div\n          ref={menuRef}\n          style={{\n            position: 'fixed',\n            // Float above the trigger — translateY pulls the menu\n            // back by its own height + 6px so its bottom edge sits\n            // 6px above the button's top edge.\n            left: menuPos.left,\n            top: menuPos.top,\n            transform: 'translateY(calc(-100% - 6px))',\n            minWidth: 180,\n            background: '#121419',\n            border: '1px solid rgba(255,255,255,0.12)',\n            borderRadius: 10,\n            padding: 4,\n            boxShadow: '0 12px 30px rgba(0,0,0,0.4)',\n            zIndex: 2147483647,\n            color: PANEL_FG,\n            fontFamily: FONT,\n          }}\n        >\n          {registry.scenes.length === 0 && (\n            <div style={{ padding: '8px 10px', color: '#6B7280', fontSize: 11 }}>\n              No scenes registered\n            </div>\n          )}\n          {registry.scenes.length > 0 && (\n            <>\n              {/* \"None\" option — collapses Loupe to a draggable\n                  pill so it's out of the way without being fully\n                  dismissed. */}\n              <button\n                type=\"button\"\n                onClick={() => {\n                  registry.setActiveSceneId(null);\n                  setOpen(false);\n                }}\n                style={{\n                  display: 'flex',\n                  alignItems: 'center',\n                  width: '100%',\n                  padding: '7px 10px',\n                  borderRadius: 6,\n                  border: 'none',\n                  background:\n                    registry.activeSceneId === null\n                      ? 'rgba(58,151,249,0.18)'\n                      : 'transparent',\n                  color:\n                    registry.activeSceneId === null ? PANEL_HIGHLIGHT : PANEL_MUTED,\n                  fontFamily: 'inherit',\n                  fontWeight: 600,\n                  fontSize: 12,\n                  cursor: 'pointer',\n                  textAlign: 'left',\n                  gap: 8,\n                  fontStyle: 'italic',\n                }}\n                onMouseEnter={(e) => {\n                  if (registry.activeSceneId !== null)\n                    (e.currentTarget as HTMLElement).style.background =\n                      'rgba(255,255,255,0.06)';\n                }}\n                onMouseLeave={(e) => {\n                  if (registry.activeSceneId !== null)\n                    (e.currentTarget as HTMLElement).style.background = 'transparent';\n                }}\n              >\n                <span\n                  style={{\n                    width: 6,\n                    height: 6,\n                    borderRadius: 999,\n                    background: 'rgba(255,255,255,0.12)',\n                    border: '1px dashed rgba(255,255,255,0.3)',\n                    flexShrink: 0,\n                  }}\n                />\n                <span style={{ flex: 1 }}>— None (collapse panel)</span>\n              </button>\n              <div\n                aria-hidden\n                style={{\n                  height: 1,\n                  background: 'rgba(255,255,255,0.08)',\n                  margin: '4px 6px',\n                }}\n              />\n            </>\n          )}\n          {registry.scenes.map((s) => {\n            const isActive = s.id === registry.activeSceneId;\n            return (\n              <button\n                key={s.id}\n                type=\"button\"\n                onClick={() => {\n                  registry.setActiveSceneId(s.id);\n                  setOpen(false);\n                }}\n                style={{\n                  display: 'flex',\n                  alignItems: 'center',\n                  width: '100%',\n                  padding: '7px 10px',\n                  borderRadius: 6,\n                  border: 'none',\n                  background: isActive ? 'rgba(58,151,249,0.18)' : 'transparent',\n                  color: isActive ? PANEL_HIGHLIGHT : PANEL_FG,\n                  fontFamily: 'inherit',\n                  fontWeight: isActive ? 700 : 600,\n                  fontSize: 12,\n                  cursor: 'pointer',\n                  textAlign: 'left',\n                  gap: 8,\n                }}\n                onMouseEnter={(e) => {\n                  if (!isActive)\n                    (e.currentTarget as HTMLElement).style.background = 'rgba(255,255,255,0.06)';\n                }}\n                onMouseLeave={(e) => {\n                  if (!isActive)\n                    (e.currentTarget as HTMLElement).style.background = 'transparent';\n                }}\n              >\n                <span\n                  style={{\n                    width: 6,\n                    height: 6,\n                    borderRadius: 999,\n                    background: isActive ? ACCENT : 'rgba(255,255,255,0.18)',\n                    flexShrink: 0,\n                  }}\n                />\n                <span style={{ flex: 1, display: 'flex', alignItems: 'center', gap: 6 }}>\n                  {s.label}\n                  {s.id === 'loupe-demo' && (\n                    <span\n                      style={{\n                        fontSize: 9,\n                        fontWeight: 700,\n                        letterSpacing: 0.5,\n                        padding: '1px 5px',\n                        borderRadius: 4,\n                        background: 'rgba(255,255,255,0.1)',\n                        color: 'rgba(255,255,255,0.55)',\n                        textTransform: 'uppercase',\n                      }}\n                    >\n                      Demo\n                    </span>\n                  )}\n                </span>\n                <span style={{ color: '#6B7280', fontWeight: 500, fontSize: 10 }}>{s.id}</span>\n              </button>\n            );\n          })}\n        </div>,\n        document.body,\n      )}\n    </div>\n  );\n}\n\nfunction SceneFlashOverlay({ registry }: { registry: Registry }) {\n  const [rect, setRect] = useState<DOMRect | null>(null);\n  const lastTickRef = useRef<number>(registry.flashTick);\n\n  useEffect(() => {\n    if (registry.flashTick === lastTickRef.current) return;\n    lastTickRef.current = registry.flashTick;\n    const scene = registry.scenes.find((s) => s.id === registry.activeSceneId);\n    const el = scene?.rootRef.current;\n    if (!el) {\n      setRect(null);\n      return;\n    }\n    // Scroll the scene into view first so the flash and the\n    // animation itself are actually visible. `block: 'center'`\n    // frames the scene rather than jamming its top against the\n    // viewport.\n    try {\n      el.scrollIntoView({ behavior: 'smooth', block: 'center' });\n    } catch {\n      el.scrollIntoView();\n    }\n    // Wait for the smooth scroll to ACTUALLY stop, not a fixed\n    // 400ms guess — smooth-scroll duration varies by browser and\n    // distance. Poll every frame and only fire once the rect has\n    // been identical for ~120ms. Otherwise the flash paints\n    // mid-scroll at a stale position and the rest of the fade\n    // plays out there while the page keeps moving.\n    let raf = 0;\n    let clearTimer = 0;\n    let lastMeasured: DOMRect | null = null;\n    let stableSince = 0;\n    let fired = false;\n    const STABLE_MS = 120;\n    const STABLE_TIMEOUT_MS = 1500;\n    const startedAt = performance.now();\n\n    const tick = () => {\n      const now = performance.now();\n      const next = el.getBoundingClientRect();\n      if (\n        lastMeasured &&\n        lastMeasured.left === next.left &&\n        lastMeasured.top === next.top &&\n        lastMeasured.width === next.width &&\n        lastMeasured.height === next.height\n      ) {\n        if (stableSince === 0) stableSince = now;\n        if (now - stableSince >= STABLE_MS) {\n          fired = true;\n          setRect(next);\n          clearTimer = window.setTimeout(() => setRect(null), 750);\n          return;\n        }\n      } else {\n        stableSince = 0;\n        lastMeasured = next;\n      }\n      if (now - startedAt > STABLE_TIMEOUT_MS) {\n        fired = true;\n        setRect(next);\n        clearTimer = window.setTimeout(() => setRect(null), 750);\n        return;\n      }\n      raf = requestAnimationFrame(tick);\n    };\n    raf = requestAnimationFrame(tick);\n\n    return () => {\n      cancelAnimationFrame(raf);\n      if (clearTimer) window.clearTimeout(clearTimer);\n      // If we never fired (e.g., user re-selected before settle),\n      // silently drop — no stale flash will paint.\n      void fired;\n    };\n  }, [registry.flashTick, registry.activeSceneId, registry.scenes]);\n\n  if (!rect) return null;\n  return (\n    <motion.div\n      data-loupe-ui\n      aria-hidden\n      initial={{ opacity: 0, scale: 0.985 }}\n      animate={{ opacity: [0, 1, 1, 0], scale: [0.985, 1, 1, 1] }}\n      transition={{ duration: 0.7, times: [0, 0.18, 0.6, 1], ease: [0.59, 0.01, 0.4, 0.98] }}\n      style={{\n        position: 'fixed',\n        left: rect.left,\n        top: rect.top,\n        width: rect.width,\n        height: rect.height,\n        pointerEvents: 'none',\n        border: `3px solid ${ACCENT}`,\n        borderRadius: 8,\n        boxShadow: `0 0 0 4px ${ACCENT_RING}, 0 0 32px 8px ${ACCENT_HALO}`,\n        boxSizing: 'border-box',\n        zIndex: 10049,\n      }}\n    />\n  );\n}\n\n/**\n * Persistent, subtle halo around the active scene's root. Lives for\n * as long as a scene is active — answers \"what am I scrubbing right\n * now?\" at a glance. The momentary `SceneFlashOverlay` sits on top\n * during selection; this layer stays after the flash fades.\n */\nfunction SceneActiveHalo({ registry }: { registry: Registry }) {\n  const [rect, setRect] = useState<DOMRect | null>(null);\n  const [radius, setRadius] = useState<string>('12px');\n  const [visible, setVisible] = useState(false);\n  const activeId = registry.activeSceneId;\n\n  useLayoutEffect(() => {\n    if (!activeId) {\n      setRect(null);\n      setVisible(false);\n      return;\n    }\n    const scene = registry.scenes.find((s) => s.id === activeId);\n    const el = scene?.rootRef.current;\n    if (!el) {\n      setRect(null);\n      setVisible(false);\n      return;\n    }\n\n    // Don't paint until the scroll-into-view (triggered by the flash\n    // overlay on the same `activeSceneId` change) has settled. Smooth\n    // scroll duration varies wildly by browser and distance, so we\n    // detect stability instead of timing it: poll the rect every\n    // frame, and only reveal once it has been identical for ~120ms.\n    // That's \"the scroll has actually stopped\" — robust to short\n    // and long scroll distances both.\n    setVisible(false);\n\n    const rectsEqual = (a: DOMRect, b: DOMRect) =>\n      a.left === b.left &&\n      a.top === b.top &&\n      a.width === b.width &&\n      a.height === b.height;\n\n    const reveal = () => {\n      try {\n        setRadius(window.getComputedStyle(el).borderRadius || '12px');\n      } catch {\n        setRadius('12px');\n      }\n      const next = el.getBoundingClientRect();\n      setRect((prev) => (prev && rectsEqual(prev, next) ? prev : next));\n      setVisible(true);\n    };\n\n    // Phase 1 — wait for the scroll-into-view (triggered on the same\n    // activeSceneId change) to ACTUALLY settle, then reveal and STOP\n    // the rAF. Critically, this loop terminates: it does NOT keep\n    // measuring forever. A permanently-running rAF that calls\n    // getBoundingClientRect every frame forces a synchronous reflow\n    // each frame and keeps the page from ever going idle, which\n    // starves the main thread and makes the panel feel unresponsive.\n    let settleRaf = 0;\n    let lastRect: DOMRect | null = null;\n    let stableSince = 0;\n    const STABLE_MS = 120;\n    const STABLE_TIMEOUT_MS = 1500;\n    const startedAt = performance.now();\n\n    const settle = () => {\n      const now = performance.now();\n      const next = el.getBoundingClientRect();\n      if (lastRect && rectsEqual(lastRect, next)) {\n        if (stableSince === 0) stableSince = now;\n        if (now - stableSince >= STABLE_MS) {\n          reveal();\n          settleRaf = 0;\n          return;\n        }\n      } else {\n        stableSince = 0;\n        lastRect = next;\n      }\n      // Hard cap so a constantly-shifting scene still eventually shows\n      // the halo. Better one-frame jitter than no halo at all.\n      if (now - startedAt > STABLE_TIMEOUT_MS) {\n        reveal();\n        settleRaf = 0;\n        return;\n      }\n      settleRaf = requestAnimationFrame(settle);\n    };\n    settleRaf = requestAnimationFrame(settle);\n\n    // Phase 2 — once revealed, only track the target while it's\n    // actually moving (page scroll, resize). Coalesce to a single\n    // rAF and STOP a few stable frames after motion ceases, so an\n    // idle page runs no rAF and does no per-frame layout work.\n    let trackRaf = 0;\n    let trackLast: DOMRect | null = null;\n    let trackStableFrames = 0;\n    const track = () => {\n      const next = el.getBoundingClientRect();\n      setRect((prev) => (prev && rectsEqual(prev, next) ? prev : next));\n      if (trackLast && rectsEqual(trackLast, next)) {\n        trackStableFrames += 1;\n      } else {\n        trackStableFrames = 0;\n      }\n      trackLast = next;\n      if (trackStableFrames >= 3) {\n        trackRaf = 0;\n        return;\n      }\n      trackRaf = requestAnimationFrame(track);\n    };\n\n    const schedule = () => {\n      // Before reveal, just keep Phase 1 waiting for stability.\n      if (settleRaf) {\n        stableSince = 0;\n        return;\n      }\n      // After reveal, (re)start the short tracking burst.\n      trackStableFrames = 0;\n      if (!trackRaf) trackRaf = requestAnimationFrame(track);\n    };\n\n    const ro = new ResizeObserver(schedule);\n    ro.observe(el);\n    window.addEventListener('scroll', schedule, { capture: true, passive: true });\n    window.addEventListener('resize', schedule);\n    return () => {\n      if (settleRaf) cancelAnimationFrame(settleRaf);\n      if (trackRaf) cancelAnimationFrame(trackRaf);\n      ro.disconnect();\n      window.removeEventListener('scroll', schedule, { capture: true } as EventListenerOptions);\n      window.removeEventListener('resize', schedule);\n    };\n  }, [activeId, registry.scenes]);\n\n  if (!rect) return null;\n  return (\n    <div\n      data-loupe-ui\n      aria-hidden\n      style={{\n        position: 'fixed',\n        left: rect.left,\n        top: rect.top,\n        width: rect.width,\n        height: rect.height,\n        pointerEvents: 'none',\n        borderRadius: radius,\n        boxShadow: `0 0 0 1px ${ACCENT_RING}, 0 0 24px 2px ${ACCENT_RING}`,\n        boxSizing: 'border-box',\n        zIndex: 10048,\n        opacity: visible ? 1 : 0,\n        transition: 'opacity 220ms ease',\n      }}\n    />\n  );\n}\n\nfunction SpeedSelector({\n  speed,\n  onChange,\n}: {\n  speed: number;\n  onChange: (s: number) => void;\n}) {\n  return (\n    <div\n      style={{\n        display: 'flex',\n        alignItems: 'center',\n        background: 'rgba(255, 255, 255, 0.06)',\n        borderRadius: 999,\n        padding: 2,\n        gap: 2,\n      }}\n    >\n      {SPEED_OPTIONS.map((s) => {\n        const active = s === speed;\n        return (\n          <button\n            key={s}\n            type=\"button\"\n            onClick={() => onChange(s)}\n            style={{\n              padding: '3px 8px',\n              borderRadius: 999,\n              border: 'none',\n              fontFamily: 'inherit',\n              fontWeight: active ? 700 : 500,\n              fontSize: 10,\n              lineHeight: 1,\n              color: active ? '#121419' : PANEL_MUTED,\n              background: active ? PANEL_HIGHLIGHT : 'transparent',\n              cursor: 'pointer',\n              transition: 'background 150ms ease, color 150ms ease',\n            }}\n          >\n            {s === 1 ? '1×' : `${s}×`}\n          </button>\n        );\n      })}\n    </div>\n  );\n}\n\nfunction CompactSpeedChip({\n  speed,\n  onChange,\n}: {\n  speed: number;\n  onChange: (s: number) => void;\n}) {\n  return (\n    <Tooltip label={`Playback speed · click to cycle`}>\n      <button\n        type=\"button\"\n        onClick={() => {\n          const idx = SPEED_OPTIONS.indexOf(speed as (typeof SPEED_OPTIONS)[number]);\n          const next = SPEED_OPTIONS[(idx + 1) % SPEED_OPTIONS.length];\n          onChange(next);\n        }}\n        style={{\n          minWidth: 32,\n          height: 22,\n          padding: '0 8px',\n          borderRadius: 999,\n          border: 'none',\n          fontFamily: 'inherit',\n          fontWeight: 700,\n          fontSize: 11,\n          lineHeight: 1,\n          color: PANEL_HIGHLIGHT,\n          background: 'rgba(255, 255, 255, 0.08)',\n          cursor: 'pointer',\n          transition: 'background 150ms ease, color 150ms ease',\n        }}\n      >\n        {speed === 1 ? '1×' : `${speed}×`}\n      </button>\n    </Tooltip>\n  );\n}\n\nfunction IconButton({\n  children,\n  onClick,\n  title,\n  shortcut,\n  active = false,\n  disabled = false,\n}: {\n  children: React.ReactNode;\n  onClick: () => void;\n  title: string;\n  shortcut?: string;\n  active?: boolean;\n  disabled?: boolean;\n}) {\n  const baseBg = active ? ACCENT : 'rgba(255, 255, 255, 0.06)';\n  const hoverBg = active ? ACCENT : 'rgba(255, 255, 255, 0.12)';\n  const fg = active ? '#fff' : disabled ? '#4B5563' : PANEL_FG;\n  return (\n    <Tooltip label={title} shortcut={shortcut}>\n      <button\n        type=\"button\"\n        onClick={onClick}\n        aria-label={title}\n        disabled={disabled}\n        style={{\n          display: 'inline-flex',\n          alignItems: 'center',\n          justifyContent: 'center',\n          width: 26,\n          height: 26,\n          borderRadius: 999,\n          border: 'none',\n          background: baseBg,\n          color: fg,\n          cursor: disabled ? 'not-allowed' : 'pointer',\n          transition: 'background 150ms ease, color 150ms ease',\n          opacity: disabled ? 0.5 : 1,\n        }}\n        onMouseEnter={(e) => {\n          if (!disabled) (e.currentTarget as HTMLElement).style.background = hoverBg;\n        }}\n        onMouseLeave={(e) => {\n          if (!disabled) (e.currentTarget as HTMLElement).style.background = baseBg;\n        }}\n      >\n        {children}\n      </button>\n    </Tooltip>\n  );\n}\n\nfunction PlayIcon() {\n  return (\n    <svg width=\"20\" height=\"20\" viewBox=\"0 0 14 14\" fill=\"none\">\n      <path d=\"M3 1.5L12 7L3 12.5V1.5Z\" fill=\"currentColor\" />\n    </svg>\n  );\n}\nfunction PauseIcon() {\n  return (\n    <svg width=\"20\" height=\"20\" viewBox=\"0 0 14 14\" fill=\"none\">\n      <rect x=\"2\" y=\"1\" width=\"3.5\" height=\"12\" rx=\"1\" fill=\"currentColor\" />\n      <rect x=\"8.5\" y=\"1\" width=\"3.5\" height=\"12\" rx=\"1\" fill=\"currentColor\" />\n    </svg>\n  );\n}\nfunction RestartIcon() {\n  return (\n    <svg width=\"20\" height=\"20\" viewBox=\"0 0 14 14\" fill=\"none\">\n      <path d=\"M2 2V6H6\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n      <path d=\"M2.5 6A5 5 0 1 1 3.5 10\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" />\n    </svg>\n  );\n}\nfunction CollapseIcon() {\n  return (\n    <svg width=\"20\" height=\"20\" viewBox=\"0 0 14 14\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n      <path d=\"M3 5l4 4 4-4\" />\n    </svg>\n  );\n}\nfunction ExpandIcon() {\n  return (\n    <svg width=\"20\" height=\"20\" viewBox=\"0 0 14 14\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n      <path d=\"M3 9l4-4 4 4\" />\n    </svg>\n  );\n}\n/**\n * The \"Add feedback on element\" entry point — a crosshair targeting\n * a circle. Reads as \"pick a target on screen.\"\n */\nfunction PointerIcon() {\n  return (\n    <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden>\n      <path d=\"M12 7.99609C9.79218 7.99609 7.99609 9.79218 7.99609 12C7.99609 14.2078 9.79218 16.0039 12 16.0039C14.2078 16.0039 16.0039 14.2078 16.0039 12C16.0039 9.7922 14.2078 7.99609 12 7.99609ZM12 14.8276C10.441 14.8276 9.17246 13.5591 9.17246 12C9.17246 10.4409 10.441 9.17246 12 9.17246C13.559 9.17246 14.8275 10.4409 14.8275 12C14.8275 13.5591 13.559 14.8276 12 14.8276Z\" />\n      <path d=\"M21.4108 11.414H19.5366C19.2505 7.70525 16.2932 4.74869 12.5844 4.46257V2.58817C12.5844 2.2633 12.3235 2 11.9988 2C11.6741 2 11.4132 2.2633 11.4132 2.58817V4.46257C7.70443 4.74867 4.74949 7.70525 4.46335 11.414H2.58915C2.26442 11.414 2.00098 11.6748 2.00098 11.9996C2.00098 12.3245 2.26444 12.5852 2.58915 12.5852H4.46339C4.74951 16.294 7.70447 19.2494 11.4132 19.5355V21.4099C11.4132 21.7348 11.6741 21.9981 11.9988 21.9981C12.3236 21.9981 12.5844 21.7348 12.5844 21.4099V19.5355C16.2932 19.2494 19.2505 16.294 19.5366 12.5852H21.4109C21.7356 12.5852 21.999 12.3245 21.999 11.9996C21.999 11.6748 21.7356 11.414 21.4108 11.414ZM12 18.3818C8.48042 18.3818 5.61703 15.5184 5.61703 11.999C5.61703 8.47962 8.48042 5.61623 12 5.61623C15.5196 5.61623 18.383 8.47962 18.383 11.999C18.383 15.5184 15.5196 18.3818 12 18.3818Z\" />\n    </svg>\n  );\n}\n/**\n * Region / marquee-select tool. Dotted-perimeter rectangle with a \"+\"\n * tucked in the bottom-right — reads as \"select an area and add.\"\n */\nfunction RegionIcon() {\n  return (\n    <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden>\n      <path d=\"M13 18C13 17.4477 13.4477 17 14 17H17V14C17 13.4477 17.4477 13 18 13C18.5523 13 19 13.4477 19 14V17H22C22.5523 17 23 17.4477 23 18C23 18.5523 22.5523 19 22 19H19V22C19 22.5523 18.5523 23 18 23C17.4477 23 17 22.5523 17 22V19H14C13.4477 19 13 18.5523 13 18ZM10 17C10.5523 17 11 17.4477 11 18C11 18.5523 10.5523 19 10 19C9.44772 19 9 18.5523 9 18C9 17.4477 9.44772 17 10 17ZM6 17C6.55228 17 7 17.4477 7 18C7 18.5523 6.55228 19 6 19C5.44772 19 5 18.5523 5 18C5 17.4477 5.44772 17 6 17ZM18 9C18.5523 9 19 9.44772 19 10C19 10.5523 18.5523 11 18 11C17.4477 11 17 10.5523 17 10C17 9.44772 17.4477 9 18 9ZM18 5C18.5523 5 19 5.44772 19 6C19 6.55228 18.5523 7 18 7C17.4477 7 17 6.55228 17 6C17 5.44772 17.4477 5 18 5ZM14 5C14.5523 5 15 5.44772 15 6C15 6.55228 14.5523 7 14 7C13.4477 7 13 6.55228 13 6C13 5.44772 13.4477 5 14 5ZM10 5C10.5523 5 11 5.44772 11 6C11 6.55228 10.5523 7 10 7C9.44772 7 9 6.55228 9 6C9 5.44772 9.44772 5 10 5ZM6 5C6.55228 5 7 5.44772 7 6C7 6.55228 6.55228 7 6 7C5.44772 7 5 6.55228 5 6C5 5.44772 5.44772 5 6 5ZM6 13C6.55228 13 7 13.4477 7 14C7 14.5523 6.55228 15 6 15C5.44772 15 5 14.5523 5 14C5 13.4477 5.44772 13 6 13ZM6 9C6.55228 9 7 9.44772 7 10C7 10.5523 6.55228 11 6 11C5.44772 11 5 10.5523 5 10C5 9.44772 5.44772 9 6 9Z\" />\n    </svg>\n  );\n}\nfunction EyeIcon() {\n  return (\n    <svg width=\"20\" height=\"20\" viewBox=\"0 0 14 14\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.0\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n      <path d=\"M1 7s2-4 6-4 6 4 6 4-2 4-6 4-6-4-6-4z\" />\n      <circle cx=\"7\" cy=\"7\" r=\"1.8\" />\n    </svg>\n  );\n}\nfunction EyeOffIcon() {\n  return (\n    <svg width=\"20\" height=\"20\" viewBox=\"0 0 14 14\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.0\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n      <path d=\"M2 2l10 10\" />\n      <path d=\"M4.2 4.3C2.5 5.3 1 7 1 7s2 4 6 4c1.1 0 2-.2 2.8-.6M11 10.2C12.3 9.3 13 7 13 7s-2-4-6-4c-.6 0-1.1.1-1.7.2\" />\n    </svg>\n  );\n}\nfunction GripIcon() {\n  return (\n    <svg width=\"10\" height=\"14\" viewBox=\"0 0 10 14\" fill=\"currentColor\" aria-hidden>\n      <circle cx=\"2\" cy=\"3\" r=\"1\" />\n      <circle cx=\"2\" cy=\"7\" r=\"1\" />\n      <circle cx=\"2\" cy=\"11\" r=\"1\" />\n      <circle cx=\"8\" cy=\"3\" r=\"1\" />\n      <circle cx=\"8\" cy=\"7\" r=\"1\" />\n      <circle cx=\"8\" cy=\"11\" r=\"1\" />\n    </svg>\n  );\n}\n\nfunction formatMs(ms: number) {\n  if (!Number.isFinite(ms)) return '∞';\n  if (ms < 1000) return `${Math.round(ms)}ms`;\n  return `${(ms / 1000).toFixed(1)}s`;\n}\n\nfunction AnnotationList() {\n  const { annotations, focusAnnotation, deleteAnnotation, clearAll } = useAnnotations();\n  const [open, setOpen] = useState(true);\n  const [copied, setCopied] = useState(false);\n\n  const onCopy = async () => {\n    const md = annotationsToMarkdown(annotations);\n    try {\n      await navigator.clipboard.writeText(md);\n      setCopied(true);\n      window.setTimeout(() => setCopied(false), 1600);\n    } catch {\n      const ta = document.createElement('textarea');\n      ta.value = md;\n      document.body.appendChild(ta);\n      ta.select();\n      try {\n        document.execCommand('copy');\n        setCopied(true);\n        window.setTimeout(() => setCopied(false), 1600);\n      } catch {\n        /* ignore */\n      } finally {\n        document.body.removeChild(ta);\n      }\n    }\n  };\n  return (\n    <div style={{ marginTop: 12, borderTop: '1px solid rgba(255,255,255,0.08)', paddingTop: 10 }}>\n      <button\n        type=\"button\"\n        onClick={() => setOpen(!open)}\n        style={{\n          display: 'flex',\n          alignItems: 'center',\n          justifyContent: 'space-between',\n          width: '100%',\n          padding: 0,\n          background: 'transparent',\n          border: 'none',\n          color: PANEL_FG,\n          cursor: 'pointer',\n          fontFamily: 'inherit',\n        }}\n      >\n        <span style={{ fontSize: 11, fontWeight: 700, letterSpacing: 0.2 }}>\n          Annotations\n          <span style={{ fontWeight: 500, color: PANEL_MUTED, marginLeft: 6 }}>\n            {annotations.length}\n          </span>\n        </span>\n        <div style={{ display: 'flex', alignItems: 'center', gap: 8 }}>\n          {annotations.length > 0 && (\n            <Tooltip label=\"Copy every annotation as a Markdown bullet list\">\n              <span\n                onClick={(e) => {\n                  e.stopPropagation();\n                  onCopy();\n                }}\n                style={{\n                  fontSize: 10,\n                  fontWeight: 700,\n                  color: copied ? '#86EFAC' : PANEL_HIGHLIGHT,\n                  cursor: 'pointer',\n                  background: copied ? 'rgba(34, 197, 94, 0.15)' : ACCENT,\n                  padding: '2px 8px',\n                  borderRadius: 999,\n                }}\n              >\n                {copied ? 'copied ✓' : 'copy feedback'}\n              </span>\n            </Tooltip>\n          )}\n          {annotations.length > 0 && (\n            <span\n              onClick={(e) => {\n                e.stopPropagation();\n                if (confirm('Clear all annotations for this scene?')) clearAll();\n              }}\n              style={{ fontSize: 10, fontWeight: 600, color: PANEL_MUTED, cursor: 'pointer' }}\n            >\n              clear all\n            </span>\n          )}\n          <span\n            style={{\n              color: PANEL_MUTED,\n              transform: open ? 'rotate(180deg)' : 'none',\n              transition: 'transform 150ms',\n            }}\n          >\n            <svg width=\"10\" height=\"10\" viewBox=\"0 0 14 14\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n              <path d=\"M3 5l4 4 4-4\" />\n            </svg>\n          </span>\n        </div>\n      </button>\n      {open && (\n        <div\n          style={{\n            marginTop: 8,\n            maxHeight: 180,\n            overflowY: 'auto',\n            display: 'flex',\n            flexDirection: 'column',\n            gap: 4,\n          }}\n        >\n          {annotations.map((a, i) => (\n            <div\n              key={a.id}\n              style={{\n                display: 'flex',\n                alignItems: 'flex-start',\n                gap: 8,\n                padding: '6px 8px',\n                borderRadius: 8,\n                background: 'rgba(255,255,255,0.03)',\n                border: '1px solid rgba(255,255,255,0.06)',\n              }}\n            >\n              <span\n                style={{\n                  flexShrink: 0,\n                  width: 20,\n                  height: 20,\n                  borderRadius: 999,\n                  background: a.color,\n                  color: '#fff',\n                  fontSize: 10,\n                  fontWeight: 700,\n                  display: 'inline-flex',\n                  alignItems: 'center',\n                  justifyContent: 'center',\n                }}\n              >\n                {i + 1}\n              </span>\n              <button\n                type=\"button\"\n                onClick={() => focusAnnotation(a.id)}\n                style={{\n                  flex: 1,\n                  minWidth: 0,\n                  textAlign: 'left',\n                  background: 'transparent',\n                  border: 'none',\n                  color: PANEL_FG,\n                  fontFamily: 'inherit',\n                  padding: 0,\n                  cursor: 'pointer',\n                }}\n              >\n                <div style={{ fontSize: 11, fontWeight: 700 }}>\n                  {a.componentName || a.tagName || 'Region'}\n                  <span style={{ fontWeight: 500, color: PANEL_MUTED, marginLeft: 6 }}>\n                    {a.phase} · {Math.round(a.phaseElapsedMs)}ms\n                  </span>\n                </div>\n                <div\n                  style={{\n                    fontSize: 11,\n                    color: PANEL_MUTED,\n                    marginTop: 2,\n                    overflow: 'hidden',\n                    textOverflow: 'ellipsis',\n                    whiteSpace: 'nowrap',\n                  }}\n                >\n                  {a.note}\n                </div>\n              </button>\n              <Tooltip label=\"Delete this annotation\">\n                <button\n                  type=\"button\"\n                  onClick={() => {\n                    if (confirm(`Delete annotation #${i + 1}?`)) deleteAnnotation(a.id);\n                  }}\n                  style={{\n                    flexShrink: 0,\n                    width: 18,\n                    height: 18,\n                    borderRadius: 4,\n                    background: 'transparent',\n                    border: 'none',\n                    color: '#6B7280',\n                    cursor: 'pointer',\n                    fontFamily: 'inherit',\n                    fontSize: 12,\n                    lineHeight: 1,\n                  }}\n                >\n                  ×\n                </button>\n              </Tooltip>\n            </div>\n          ))}\n        </div>\n      )}\n    </div>\n  );\n}\n","import { useEffect, useRef, useState } from 'react';\nimport { useAnnotations } from './AnnotationsProvider';\nimport { useOptionalLoupeRegistry } from '../runtime/registry';\nimport { elementToSelector } from './selector';\nimport { fiberInfo } from './fiber';\n\n/**\n * AnnotationOverlay — full-viewport interaction layer used while picker mode\n * or a draft is active. Two jobs:\n *   1. Element picker — DevTools-style highlight on hover, click to pick.\n *   2. Region drawer — drag a rectangle, mouseup commits.\n *\n * When a draft exists, renders the inline editor at the picked element /\n * region's position.\n */\n\nconst FONT = 'var(--loupe-font, system-ui, -apple-system, sans-serif)';\nconst ACCENT = 'var(--loupe-accent, #3A97F9)';\nconst ACCENT_BG = 'var(--loupe-accent-bg, rgba(58, 151, 249, 0.12))';\nconst REGION_ACCENT = 'var(--loupe-region-accent, #A855F7)';\nconst REGION_BG = 'var(--loupe-region-bg, rgba(168, 85, 247, 0.12))';\nconst PANEL_BG = 'var(--loupe-panel-bg, #121419)';\nconst PANEL_FG = 'var(--loupe-panel-fg, #E8EAEE)';\nconst PANEL_MUTED = 'var(--loupe-panel-muted, #9BA3AF)';\nconst PANEL_BORDER = 'var(--loupe-panel-border, rgba(255,255,255,0.12))';\n\nexport function AnnotationOverlay() {\n  const { pickerMode, draft, pickElement, pickRegion, cancelDraft } = useAnnotations();\n\n  const active = pickerMode !== 'off' || draft !== null;\n  if (!active) return null;\n  return (\n    <>\n      {pickerMode === 'element' && !draft && <ElementPicker onPick={pickElement} onCancel={cancelDraft} />}\n      {pickerMode === 'region' && !draft && <RegionPicker onPick={pickRegion} onCancel={cancelDraft} />}\n      {draft && <DraftEditor />}\n    </>\n  );\n}\n\n/**\n * Cross-fade-aware element-picker threshold.\n *\n * `document.elementsFromPoint` returns the full hit-stack at a coordinate,\n * but it doesn't filter for visibility — `opacity: 0` elements still hit-\n * test. Animations stack multiple full-bleed surfaces and cross-fade\n * between them via opacity, so the topmost element under the cursor is\n * often a transparent ghost. We multiply opacity along the ancestor chain\n * and skip anything below this threshold to recover the element the user\n * can actually see. Threshold is intentionally low so faintly-fading\n * surfaces (mid-cross-fade) remain pickable.\n */\nconst VISIBILITY_THRESHOLD = 0.05;\n\nfunction effectiveOpacity(el: Element): number {\n  let opacity = 1;\n  let cursor: Element | null = el;\n  while (cursor) {\n    const cs = window.getComputedStyle(cursor);\n    if (cs.visibility === 'hidden' || cs.display === 'none') return 0;\n    const o = parseFloat(cs.opacity);\n    if (Number.isFinite(o)) opacity *= o;\n    if (opacity <= 0) return 0;\n    cursor = cursor.parentElement;\n  }\n  return opacity;\n}\n\n/**\n * Walk a scene root's descendants and find the deepest element whose\n * bounding rect contains (x, y) and which is visible. Used as a fallback\n * when `elementFromPoint` is defeated by a `pointer-events: none` ancestor.\n */\nfunction manualHitTest(root: Element, x: number, y: number): Element | null {\n  const rootRect = root.getBoundingClientRect();\n  if (x < rootRect.left || x > rootRect.right || y < rootRect.top || y > rootRect.bottom) {\n    return null;\n  }\n  let best: Element | null = root;\n  let bestArea = rootRect.width * rootRect.height;\n  const walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT);\n  let node: Node | null = walker.currentNode;\n  while ((node = walker.nextNode())) {\n    if (!(node instanceof Element)) continue;\n    if (node.closest('[data-loupe-ui]')) continue;\n    const rect = node.getBoundingClientRect();\n    if (rect.width === 0 || rect.height === 0) continue;\n    if (x < rect.left || x > rect.right || y < rect.top || y > rect.bottom) continue;\n    if (effectiveOpacity(node) < VISIBILITY_THRESHOLD) continue;\n    const area = rect.width * rect.height;\n    // Prefer the smallest (deepest) hit — same heuristic the browser uses.\n    if (area <= bestArea) {\n      best = node;\n      bestArea = area;\n    }\n  }\n  return best;\n}\n\nlet pickerDefeatedWarned = false;\nfunction warnPickerDefeated() {\n  if (pickerDefeatedWarned) return;\n  pickerDefeatedWarned = true;\n  // eslint-disable-next-line no-console\n  console.warn(\n    '[Loupe] Element picker hit a non-scene element. A `pointer-events: none` ancestor is likely making your scenes invisible to the picker. If you\\'re not using <SceneRoot>, switch to it, or set `pointer-events: auto` on the scene root in dev.',\n  );\n}\n\nfunction ElementPicker({\n  onPick,\n  onCancel,\n}: {\n  onPick: (el: Element) => void;\n  onCancel: () => void;\n}) {\n  const [hovered, setHovered] = useState<Element | null>(null);\n  const overlayRef = useRef<HTMLDivElement>(null);\n  const registry = useOptionalLoupeRegistry();\n\n  // Returns `Element`, not `HTMLElement`. SVG paths/circles/text inside\n  // animated scenes inherit from `Element` only — narrowing the return type\n  // drops every SVG hit and breaks picking on the most common use case.\n  const resolveTarget = (clientX: number, clientY: number): Element | null => {\n    const overlay = overlayRef.current;\n    if (overlay) overlay.style.pointerEvents = 'none';\n    // Walk the full hit-stack instead of grabbing only the topmost element.\n    // Reason: animations commonly cross-fade two or more surfaces stacked at\n    // the same position via opacity; `elementFromPoint` would happily return\n    // an `opacity: 0` ghost layer sitting above the visible one. We prefer the\n    // first element in z-order whose *effective* opacity (multiplied along\n    // its ancestor chain) is above a small threshold — i.e. what the user\n    // can actually see.\n    const stack = document.elementsFromPoint(clientX, clientY);\n    if (overlay) overlay.style.pointerEvents = 'auto';\n\n    // Collect every registered scene root so we can both filter by it and\n    // fall back to manual hit-testing when elementFromPoint is defeated.\n    const sceneRoots: Element[] = [];\n    if (registry) {\n      for (const scene of registry.scenes) {\n        const el = scene.rootRef.current;\n        if (el instanceof Element) sceneRoots.push(el);\n      }\n    }\n    // Also pick up SceneRoot markers that aren't in the registry yet.\n    document.querySelectorAll('[data-loupe-scene-root]').forEach((el) => {\n      if (el instanceof Element && !sceneRoots.includes(el)) sceneRoots.push(el);\n    });\n\n    const inAnySceneRoot = (el: Element): boolean =>\n      sceneRoots.length === 0 || sceneRoots.some((root) => root.contains(el));\n\n    for (const candidate of stack) {\n      if (!(candidate instanceof Element)) continue;\n      if (candidate.closest('[data-loupe-ui]')) continue;\n      if (effectiveOpacity(candidate) < VISIBILITY_THRESHOLD) continue;\n      if (!inAnySceneRoot(candidate)) continue;\n      return candidate;\n    }\n\n    // Fallback: nothing in the hit-stack belonged to a scene. Likely an\n    // ancestor has `pointer-events: none`. Manually rect-test the scene\n    // roots — slower, but correct.\n    if (sceneRoots.length > 0) {\n      warnPickerDefeated();\n      // Iterate in reverse DOM order so the most-recently-mounted scene\n      // (typically on top) wins ties.\n      for (let i = sceneRoots.length - 1; i >= 0; i--) {\n        const hit = manualHitTest(sceneRoots[i], clientX, clientY);\n        if (hit) return hit;\n      }\n    }\n    return null;\n  };\n\n  useEffect(() => {\n    const onKey = (e: KeyboardEvent) => {\n      if (e.key === 'Escape') onCancel();\n    };\n    window.addEventListener('keydown', onKey);\n    return () => window.removeEventListener('keydown', onKey);\n  }, [onCancel]);\n\n  return (\n    <div\n      ref={overlayRef}\n      data-loupe-ui\n      style={{\n        position: 'fixed',\n        inset: 0,\n        zIndex: 9998,\n        cursor: 'crosshair',\n        userSelect: 'none',\n        touchAction: 'none',\n      }}\n      onPointerMove={(e) => {\n        const el = resolveTarget(e.clientX, e.clientY);\n        setHovered(el);\n      }}\n      onPointerDown={(e) => {\n        e.preventDefault();\n        const el = resolveTarget(e.clientX, e.clientY);\n        if (el) onPick(el);\n      }}\n    >\n      {hovered && <HighlightBox el={hovered} />}\n    </div>\n  );\n}\n\nfunction HighlightBox({ el }: { el: Element }) {\n  const [rect, setRect] = useState<DOMRect | null>(() => el.getBoundingClientRect());\n  useEffect(() => {\n    let raf = 0;\n    const tick = () => {\n      setRect(el.getBoundingClientRect());\n      raf = requestAnimationFrame(tick);\n    };\n    raf = requestAnimationFrame(tick);\n    return () => cancelAnimationFrame(raf);\n  }, [el]);\n  if (!rect) return null;\n  const info = fiberInfo(el);\n  const label = info.componentName || el.tagName.toLowerCase();\n  return (\n    <>\n      <div\n        data-loupe-ui\n        aria-hidden\n        style={{\n          position: 'fixed',\n          left: rect.left,\n          top: rect.top,\n          width: rect.width,\n          height: rect.height,\n          pointerEvents: 'none',\n          border: `2px solid ${ACCENT}`,\n          background: ACCENT_BG,\n          borderRadius: 4,\n          transition: 'none',\n          zIndex: 9999,\n          boxSizing: 'border-box',\n        }}\n      />\n      <div\n        data-loupe-ui\n        aria-hidden\n        style={{\n          position: 'fixed',\n          left: Math.max(4, rect.left),\n          top: rect.top > 28 ? rect.top - 26 : rect.bottom + 6,\n          zIndex: 10000,\n          padding: '3px 8px',\n          borderRadius: 6,\n          background: ACCENT,\n          color: '#fff',\n          fontFamily: FONT,\n          fontSize: 11,\n          fontWeight: 700,\n          pointerEvents: 'none',\n          whiteSpace: 'nowrap',\n          letterSpacing: 0.2,\n        }}\n      >\n        {label}\n        <span style={{ fontWeight: 500, opacity: 0.85, marginLeft: 6 }}>\n          {elementToSelector(el)}\n        </span>\n      </div>\n    </>\n  );\n}\n\nfunction RegionPicker({\n  onPick,\n  onCancel,\n}: {\n  onPick: (region: { x: number; y: number; w: number; h: number }) => void;\n  onCancel: () => void;\n}) {\n  const [start, setStart] = useState<{ x: number; y: number } | null>(null);\n  const [current, setCurrent] = useState<{ x: number; y: number } | null>(null);\n\n  useEffect(() => {\n    const onKey = (e: KeyboardEvent) => {\n      if (e.key === 'Escape') onCancel();\n    };\n    window.addEventListener('keydown', onKey);\n    return () => window.removeEventListener('keydown', onKey);\n  }, [onCancel]);\n\n  const viewportW = window.innerWidth;\n  const viewportH = window.innerHeight;\n\n  return (\n    <div\n      data-loupe-ui\n      style={{\n        position: 'fixed',\n        inset: 0,\n        zIndex: 9998,\n        cursor: 'crosshair',\n        userSelect: 'none',\n        touchAction: 'none',\n        background: start ? 'rgba(0,0,0,0.08)' : 'transparent',\n      }}\n      onPointerDown={(e) => {\n        e.preventDefault();\n        setStart({ x: e.clientX, y: e.clientY });\n        setCurrent({ x: e.clientX, y: e.clientY });\n        (e.currentTarget as HTMLElement).setPointerCapture(e.pointerId);\n      }}\n      onPointerMove={(e) => {\n        if (!start) return;\n        setCurrent({ x: e.clientX, y: e.clientY });\n      }}\n      onPointerUp={(e) => {\n        (e.currentTarget as HTMLElement).releasePointerCapture(e.pointerId);\n        if (!start || !current) {\n          setStart(null);\n          setCurrent(null);\n          return;\n        }\n        const x = Math.min(start.x, current.x);\n        const y = Math.min(start.y, current.y);\n        const w = Math.abs(current.x - start.x);\n        const h = Math.abs(current.y - start.y);\n        if (w < 10 || h < 10) {\n          setStart(null);\n          setCurrent(null);\n          return;\n        }\n        onPick({\n          x: (x / viewportW) * 100,\n          y: (y / viewportH) * 100,\n          w: (w / viewportW) * 100,\n          h: (h / viewportH) * 100,\n        });\n        setStart(null);\n        setCurrent(null);\n      }}\n    >\n      {start && current && (\n        <div\n          data-loupe-ui\n          style={{\n            position: 'fixed',\n            left: Math.min(start.x, current.x),\n            top: Math.min(start.y, current.y),\n            width: Math.abs(current.x - start.x),\n            height: Math.abs(current.y - start.y),\n            border: `2px solid ${REGION_ACCENT}`,\n            background: REGION_BG,\n            pointerEvents: 'none',\n            borderRadius: 4,\n            boxSizing: 'border-box',\n          }}\n        />\n      )}\n    </div>\n  );\n}\n\nfunction DraftEditor() {\n  const { draft, commitDraft, cancelDraft } = useAnnotations();\n  const [note, setNote] = useState('');\n  const taRef = useRef<HTMLTextAreaElement>(null);\n\n  useEffect(() => {\n    taRef.current?.focus();\n  }, []);\n\n  if (!draft) return null;\n\n  let anchorRect: DOMRect | { left: number; top: number; right: number; bottom: number };\n  if (draft.kind === 'element') {\n    anchorRect = draft.element.getBoundingClientRect();\n  } else {\n    const r = draft.region;\n    const vw = window.innerWidth;\n    const vh = window.innerHeight;\n    anchorRect = {\n      left: (r.x / 100) * vw,\n      top: (r.y / 100) * vh,\n      right: ((r.x + r.w) / 100) * vw,\n      bottom: ((r.y + r.h) / 100) * vh,\n    };\n  }\n\n  const editorWidth = 320;\n  const editorHeight = 140;\n  const preferredLeft = (anchorRect as DOMRect).left;\n  const preferredTop = (anchorRect as DOMRect).bottom + 8;\n  const left = Math.max(8, Math.min(window.innerWidth - editorWidth - 8, preferredLeft));\n  const top =\n    preferredTop + editorHeight + 20 > window.innerHeight\n      ? Math.max(8, (anchorRect as DOMRect).top - editorHeight - 12)\n      : preferredTop;\n\n  return (\n    <>\n      {draft.kind === 'element' ? (\n        <DraftOutline el={draft.element} />\n      ) : (\n        <DraftRegionOutline region={draft.region} />\n      )}\n\n      <div\n        data-loupe-ui\n        style={{\n          position: 'fixed',\n          left,\n          top,\n          width: editorWidth,\n          // Must sit above the sample-stop pill (z 10050) so the\n          // composer is never occluded while typing feedback.\n          zIndex: 10070,\n          background: PANEL_BG,\n          color: PANEL_FG,\n          borderRadius: 12,\n          border: `1px solid ${PANEL_BORDER}`,\n          boxShadow: '0 20px 50px rgba(0,0,0,0.45)',\n          padding: 10,\n          fontFamily: FONT,\n        }}\n      >\n        <div\n          style={{\n            fontSize: 11,\n            fontWeight: 700,\n            color: '#EAF3FF',\n            marginBottom: 6,\n          }}\n        >\n          {draft.kind === 'element' && (draft.snapshot.componentName || draft.snapshot.tagName)}\n          {draft.kind === 'region' && 'Region'}\n          <span style={{ fontWeight: 500, color: PANEL_MUTED, marginLeft: 8 }}>\n            {draft.snapshot.phase} · {formatMs(draft.snapshot.phaseElapsedMs)} /{' '}\n            {formatMs(draft.snapshot.phaseDurationMs)}\n          </span>\n        </div>\n        <textarea\n          ref={taRef}\n          value={note}\n          onChange={(e) => setNote(e.target.value)}\n          placeholder=\"What's the feedback here?\"\n          rows={4}\n          style={{\n            width: '100%',\n            boxSizing: 'border-box',\n            background: 'rgba(255,255,255,0.04)',\n            color: PANEL_FG,\n            border: '1px solid rgba(255,255,255,0.1)',\n            borderRadius: 8,\n            padding: 8,\n            fontFamily: 'inherit',\n            fontSize: 13,\n            resize: 'vertical',\n            outline: 'none',\n          }}\n          onKeyDown={(e) => {\n            if (e.key === 'Escape') {\n              e.preventDefault();\n              cancelDraft();\n            }\n            if ((e.metaKey || e.ctrlKey) && e.key === 'Enter') {\n              e.preventDefault();\n              if (note.trim()) commitDraft(note.trim());\n            }\n          }}\n        />\n        <div\n          style={{\n            display: 'flex',\n            alignItems: 'center',\n            justifyContent: 'space-between',\n            marginTop: 8,\n            gap: 8,\n          }}\n        >\n          <span style={{ fontSize: 10, color: '#6B7280' }}>⌘ Enter to save · Esc to cancel</span>\n          <div style={{ display: 'flex', alignItems: 'center', gap: 6 }}>\n            <button type=\"button\" onClick={cancelDraft} style={chipBtn('transparent', PANEL_MUTED)}>\n              Cancel\n            </button>\n            <button\n              type=\"button\"\n              disabled={!note.trim()}\n              onClick={() => note.trim() && commitDraft(note.trim())}\n              style={{\n                ...chipBtn(ACCENT, '#fff'),\n                opacity: note.trim() ? 1 : 0.5,\n                cursor: note.trim() ? 'pointer' : 'not-allowed',\n              }}\n            >\n              Save\n            </button>\n          </div>\n        </div>\n      </div>\n    </>\n  );\n}\n\nfunction DraftOutline({ el }: { el: Element }) {\n  const [rect, setRect] = useState<DOMRect>(() => el.getBoundingClientRect());\n  useEffect(() => {\n    let raf = 0;\n    const tick = () => {\n      setRect(el.getBoundingClientRect());\n      raf = requestAnimationFrame(tick);\n    };\n    raf = requestAnimationFrame(tick);\n    return () => cancelAnimationFrame(raf);\n  }, [el]);\n  return (\n    <div\n      data-loupe-ui\n      aria-hidden\n      style={{\n        position: 'fixed',\n        left: rect.left,\n        top: rect.top,\n        width: rect.width,\n        height: rect.height,\n        pointerEvents: 'none',\n        border: `2px solid ${ACCENT}`,\n        background: ACCENT_BG,\n        borderRadius: 4,\n        zIndex: 9999,\n        boxSizing: 'border-box',\n      }}\n    />\n  );\n}\n\nfunction DraftRegionOutline({\n  region,\n}: {\n  region: { x: number; y: number; w: number; h: number };\n}) {\n  const vw = window.innerWidth;\n  const vh = window.innerHeight;\n  return (\n    <div\n      data-loupe-ui\n      aria-hidden\n      style={{\n        position: 'fixed',\n        left: (region.x / 100) * vw,\n        top: (region.y / 100) * vh,\n        width: (region.w / 100) * vw,\n        height: (region.h / 100) * vh,\n        pointerEvents: 'none',\n        border: `2px solid ${REGION_ACCENT}`,\n        background: REGION_BG,\n        borderRadius: 4,\n        zIndex: 9999,\n        boxSizing: 'border-box',\n      }}\n    />\n  );\n}\n\nfunction chipBtn(bg: string, fg: string): React.CSSProperties {\n  return {\n    padding: '5px 10px',\n    borderRadius: 8,\n    border: 'none',\n    background: bg,\n    color: fg,\n    fontFamily: 'inherit',\n    fontWeight: 700,\n    fontSize: 12,\n    cursor: 'pointer',\n  };\n}\n\nfunction formatMs(ms: number) {\n  if (!Number.isFinite(ms)) return '∞';\n  if (ms < 1000) return `${Math.round(ms)}ms`;\n  return `${(ms / 1000).toFixed(1)}s`;\n}\n","import { useEffect, useState } from 'react';\nimport { useAnnotations } from './AnnotationsProvider';\nimport type { Annotation } from './types';\n\nconst FONT = 'var(--loupe-font, system-ui, -apple-system, sans-serif)';\nconst ACCENT = 'var(--loupe-accent, #3A97F9)';\nconst PANEL_BG = 'var(--loupe-panel-bg, #121419)';\nconst PANEL_FG = 'var(--loupe-panel-fg, #E8EAEE)';\nconst PANEL_MUTED = 'var(--loupe-panel-muted, #9BA3AF)';\nconst PANEL_BORDER = 'var(--loupe-panel-border, rgba(255,255,255,0.12))';\n\n/**\n * AnnotationPins — numbered pin at each saved annotation. Element pins\n * follow their selector via rAF tracking; region pins anchor to the region's\n * top-right corner. Click → focus + edit. Right-click → delete.\n */\nexport function AnnotationPins() {\n  const { annotations, visible, focusAnnotation, deleteAnnotation, updateAnnotation } =\n    useAnnotations();\n  if (!visible || annotations.length === 0) return null;\n  return (\n    <>\n      {annotations.map((a, i) => (\n        <Pin\n          key={a.id}\n          annotation={a}\n          index={i + 1}\n          onFocus={() => focusAnnotation(a.id)}\n          onDelete={() => deleteAnnotation(a.id)}\n          onUpdate={(patch) => updateAnnotation(a.id, patch)}\n        />\n      ))}\n    </>\n  );\n}\n\nfunction Pin({\n  annotation,\n  index,\n  onFocus,\n  onDelete,\n  onUpdate,\n}: {\n  annotation: Annotation;\n  index: number;\n  onFocus: () => void;\n  onDelete: () => void;\n  onUpdate: (patch: Partial<Annotation>) => void;\n}) {\n  const [rect, setRect] = useState<{ x: number; y: number } | null>(null);\n  const [hovered, setHovered] = useState(false);\n  const [editing, setEditing] = useState(false);\n  const [noteDraft, setNoteDraft] = useState(annotation.note);\n\n  useEffect(() => {\n    let raf = 0;\n    const compute = () => {\n      if (annotation.region) {\n        const vw = window.innerWidth;\n        const vh = window.innerHeight;\n        const rx = (annotation.region.x / 100) * vw + (annotation.region.w / 100) * vw;\n        const ry = (annotation.region.y / 100) * vh;\n        setRect({ x: rx - 14, y: ry - 14 });\n      } else if (annotation.selector) {\n        const el = lookupElement(annotation.selector);\n        if (el) {\n          const r = el.getBoundingClientRect();\n          setRect({ x: r.right - 14, y: r.top - 14 });\n        } else {\n          setRect(null);\n        }\n      }\n      raf = requestAnimationFrame(compute);\n    };\n    compute();\n    return () => cancelAnimationFrame(raf);\n  }, [annotation.region, annotation.selector]);\n\n  if (!rect) return null;\n\n  const regionRect = annotation.region\n    ? {\n        left: (annotation.region.x / 100) * window.innerWidth,\n        top: (annotation.region.y / 100) * window.innerHeight,\n        width: (annotation.region.w / 100) * window.innerWidth,\n        height: (annotation.region.h / 100) * window.innerHeight,\n      }\n    : null;\n\n  return (\n    <>\n      {regionRect && (\n        <div\n          data-loupe-ui\n          aria-hidden\n          style={{\n            position: 'fixed',\n            left: regionRect.left,\n            top: regionRect.top,\n            width: regionRect.width,\n            height: regionRect.height,\n            border: `2px solid ${annotation.color}`,\n            background: 'rgba(168, 85, 247, 0.08)',\n            borderRadius: 4,\n            boxSizing: 'border-box',\n            pointerEvents: 'none',\n            zIndex: 10040,\n          }}\n        />\n      )}\n\n      <button\n        data-loupe-ui\n        type=\"button\"\n        title={`#${index} · ${annotation.phase} · ${Math.round(\n          annotation.phaseElapsedMs,\n        )}ms / ${Math.round(annotation.phaseDurationMs)}ms`}\n        onClick={(e) => {\n          e.stopPropagation();\n          onFocus();\n          setEditing(true);\n          setNoteDraft(annotation.note);\n        }}\n        onContextMenu={(e) => {\n          e.preventDefault();\n          if (confirm(`Delete annotation #${index}?`)) onDelete();\n        }}\n        onMouseEnter={() => setHovered(true)}\n        onMouseLeave={() => setHovered(false)}\n        style={{\n          position: 'fixed',\n          left: rect.x,\n          top: rect.y,\n          width: 28,\n          height: 28,\n          borderRadius: 999,\n          border: '2px solid #fff',\n          background: annotation.color,\n          color: '#fff',\n          fontFamily: FONT,\n          fontWeight: 700,\n          fontSize: 12,\n          cursor: 'pointer',\n          boxShadow: '0 4px 12px rgba(0,0,0,0.35)',\n          zIndex: 10041,\n          display: 'flex',\n          alignItems: 'center',\n          justifyContent: 'center',\n          padding: 0,\n        }}\n      >\n        {index}\n      </button>\n\n      {hovered && !editing && (\n        <div\n          data-loupe-ui\n          style={{\n            position: 'fixed',\n            left: rect.x + 36,\n            top: rect.y - 4,\n            zIndex: 10042,\n            maxWidth: 280,\n            padding: 8,\n            borderRadius: 10,\n            background: PANEL_BG,\n            color: PANEL_FG,\n            border: `1px solid ${PANEL_BORDER}`,\n            fontFamily: FONT,\n            fontSize: 12,\n            lineHeight: 1.4,\n            boxShadow: '0 12px 30px rgba(0,0,0,0.35)',\n            pointerEvents: 'none',\n          }}\n        >\n          <div style={{ fontWeight: 700, color: '#EAF3FF', marginBottom: 4 }}>\n            {annotation.componentName || annotation.tagName || 'Region'}\n            <span style={{ fontWeight: 500, color: PANEL_MUTED, marginLeft: 6 }}>\n              {annotation.phase}\n            </span>\n          </div>\n          <div style={{ whiteSpace: 'pre-wrap' }}>{annotation.note}</div>\n        </div>\n      )}\n\n      {editing && (\n        <div\n          data-loupe-ui\n          style={{\n            position: 'fixed',\n            left: Math.max(8, Math.min(window.innerWidth - 336, rect.x)),\n            top: Math.min(window.innerHeight - 180, rect.y + 36),\n            // Aligned with the new-annotation composer — both must\n            // sit above the sample-stop pill (z 10050).\n            zIndex: 10070,\n            width: 320,\n            background: PANEL_BG,\n            color: PANEL_FG,\n            borderRadius: 12,\n            border: `1px solid ${PANEL_BORDER}`,\n            boxShadow: '0 20px 50px rgba(0,0,0,0.45)',\n            padding: 10,\n            fontFamily: FONT,\n          }}\n        >\n          <div style={{ fontSize: 11, fontWeight: 700, marginBottom: 6 }}>\n            #{index} · {annotation.componentName || annotation.tagName || 'Region'}\n            <span style={{ fontWeight: 500, color: PANEL_MUTED, marginLeft: 8 }}>\n              {annotation.phase}\n            </span>\n          </div>\n          <textarea\n            value={noteDraft}\n            onChange={(e) => setNoteDraft(e.target.value)}\n            rows={4}\n            style={{\n              width: '100%',\n              boxSizing: 'border-box',\n              background: 'rgba(255,255,255,0.04)',\n              color: PANEL_FG,\n              border: '1px solid rgba(255,255,255,0.1)',\n              borderRadius: 8,\n              padding: 8,\n              fontFamily: 'inherit',\n              fontSize: 13,\n              resize: 'vertical',\n              outline: 'none',\n            }}\n            autoFocus\n            onKeyDown={(e) => {\n              if (e.key === 'Escape') {\n                e.preventDefault();\n                setEditing(false);\n                setNoteDraft(annotation.note);\n              }\n              if ((e.metaKey || e.ctrlKey) && e.key === 'Enter') {\n                e.preventDefault();\n                onUpdate({ note: noteDraft.trim() });\n                setEditing(false);\n              }\n            }}\n          />\n          <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'flex-end', marginTop: 8, gap: 6 }}>\n            <button\n              type=\"button\"\n              onClick={() => {\n                setEditing(false);\n                setNoteDraft(annotation.note);\n              }}\n              style={{\n                padding: '5px 10px',\n                borderRadius: 8,\n                border: 'none',\n                background: 'transparent',\n                color: PANEL_MUTED,\n                fontFamily: 'inherit',\n                fontWeight: 700,\n                fontSize: 12,\n                cursor: 'pointer',\n              }}\n            >\n              Cancel\n            </button>\n            <button\n              type=\"button\"\n              onClick={() => {\n                if (confirm(`Delete annotation #${index}?`)) {\n                  onDelete();\n                  setEditing(false);\n                }\n              }}\n              style={{\n                padding: '5px 10px',\n                borderRadius: 8,\n                border: 'none',\n                background: 'rgba(220, 38, 38, 0.18)',\n                color: '#FCA5A5',\n                fontFamily: 'inherit',\n                fontWeight: 700,\n                fontSize: 12,\n                cursor: 'pointer',\n              }}\n            >\n              Delete\n            </button>\n            <button\n              type=\"button\"\n              onClick={() => {\n                onUpdate({ note: noteDraft.trim() });\n                setEditing(false);\n              }}\n              style={{\n                padding: '5px 10px',\n                borderRadius: 8,\n                border: 'none',\n                background: ACCENT,\n                color: '#fff',\n                fontFamily: 'inherit',\n                fontWeight: 700,\n                fontSize: 12,\n                cursor: 'pointer',\n              }}\n            >\n              Save\n            </button>\n          </div>\n        </div>\n      )}\n    </>\n  );\n}\n\nfunction lookupElement(selector: string): HTMLElement | null {\n  try {\n    const el = document.querySelector(selector);\n    if (el instanceof HTMLElement) return el;\n  } catch {\n    /* invalid selector */\n  }\n  return null;\n}\n"]}