{"version":3,"file":"index.cjs","sources":["../src/mouseStore.ts","../src/components/CursorProvider.tsx","../src/components/Cursor.tsx","../node_modules/tslib/tslib.es6.js","../src/hooks/useCursor.tsx","../src/plugins/CursorClickEffect.tsx","../src/plugins/CursorDraw.tsx","../src/plugins/CursorLens.tsx","../src/plugins/CursorReveal.tsx","../src/plugins/CursorSpotlight.tsx","../src/components/CursorTarget.tsx","../src/plugins/CursorTrail.tsx","../src/emitCursorEvent.ts","../src/themes.ts","../src/hooks/useCursorIdle.ts","../src/hooks/useCursorVariant.tsx","../src/hooks/useCursorZone.ts","../src/plugins/useMagnetic.ts","../src/hooks/useMousePosition.tsx","../src/hooks/useVelocityCursor.ts"],"sourcesContent":["/**\n * Module-level singleton mouse position store.\n *\n * Replaces 8+ independent window.mousemove listeners with a single shared one.\n * Listener is added lazily on first subscribe — safe for SSR and \"sideEffects\": false.\n * Subscribers receive raw (x, y) synchronously inside the event handler, with no\n * React state or re-render overhead in the hot path.\n */\n\ntype Listener = (x: number, y: number) => void\n\nlet _x = 0\nlet _y = 0\nlet _initialized = false\nconst _subs = new Set<Listener>()\n\nfunction _init(): void {\n  if (_initialized || typeof window === \"undefined\") return\n  _initialized = true\n  window.addEventListener(\n    \"mousemove\",\n    (e: MouseEvent) => {\n      _x = e.clientX\n      _y = e.clientY\n      if (_subs.size > 0) _subs.forEach((fn) => fn(_x, _y))\n    },\n    { passive: true },\n  )\n}\n\nexport const mouseStore = {\n  get x(): number { return _x },\n  get y(): number { return _y },\n  /** Subscribe to every mouse position change. Returns an unsubscribe function. */\n  subscribe(fn: Listener): () => void {\n    _init()\n    _subs.add(fn)\n    return () => { _subs.delete(fn) }\n  },\n} as const\n","\"use client\"\n\nimport type React from \"react\"\nimport {\n  createContext,\n  useState,\n  useContext,\n  useEffect,\n  useCallback,\n  useMemo,\n  type ReactNode,\n} from \"react\"\nimport type { CursorContextType, CursorConfig, CursorState } from \"../types\"\nimport { mouseStore } from \"../mouseStore\"\n\nexport const defaultCursorConfig: CursorConfig = {\n  default: {\n    width: 24,\n    height: 24,\n    scale: 1,\n    shape: \"circle\",\n    color: \"rgba(255, 255, 255, 0.8)\",\n    opacity: 1,\n    borderColor: \"rgba(0, 0, 0, 0)\",\n    borderWidth: 0,\n    borderStyle: \"solid\",\n    label: \"\",\n    fontSize: \"12px\",\n    fontWeight: \"bold\",\n    labelColor: \"#000\",\n    transition: {\n      stiffness: 800,\n      damping: 80,\n      mass: 1,\n    },\n  },\n}\n\nconst CursorContext = createContext<CursorContextType>({\n  cursorState: { ...defaultCursorConfig.default, variant: \"default\" },\n  setCursorVariant: () => {},\n  config: defaultCursorConfig,\n  mousePosition: { x: 0, y: 0 },\n  resetCursorToDefault: () => {},\n  setGlobalCursorVariant: () => {},\n  clearGlobalCursorVariant: () => {},\n})\n\nexport const useCursorContext = () => useContext(CursorContext)\n\ninterface CursorProviderProps {\n  children: ReactNode\n  config?: CursorConfig\n  hideNativeCursor?: boolean\n}\n\nexport const CursorProvider: React.FC<CursorProviderProps> = ({\n  children,\n  config = defaultCursorConfig,\n  hideNativeCursor = true,\n}) => {\n  const [variantStack, setVariantStack] = useState<string[]>([\"default\"])\n  const [globalVariant, setGlobalVariant] = useState<string | null>(null)\n\n  // All variant setters are stable (useCallback) so hooks that include them\n  // in effect deps (useCursorIdle, useCursorZone) don't re-run every frame.\n  const setCursorVariant = useCallback((variant: string, mode: \"push\" | \"pop\" | \"reset\" = \"push\") => {\n    if (mode === \"reset\") {\n      setVariantStack([\"default\"])\n    } else if (mode === \"push\") {\n      setVariantStack((prev) => [...prev, variant])\n    } else {\n      setVariantStack((prev) => {\n        const next = prev.slice(0, -1)\n        return next.length ? next : [\"default\"]\n      })\n    }\n  }, [])\n\n  const resetCursorToDefault = useCallback(() => {\n    setVariantStack([\"default\"])\n  }, [])\n\n  const setGlobalCursorVariant = useCallback((variant: string) => {\n    setGlobalVariant(variant)\n  }, [])\n\n  const clearGlobalCursorVariant = useCallback(() => {\n    setGlobalVariant(null)\n  }, [])\n\n  // Hide native cursor\n  useEffect(() => {\n    if (!hideNativeCursor) return\n    const style = document.createElement(\"style\")\n    style.textContent = \"body,a,button,[role=\\\"button\\\"],*{cursor:none!important}\"\n    document.head.appendChild(style)\n    return () => { document.head.removeChild(style) }\n  }, [hideNativeCursor])\n\n  // Context value is only recreated when the cursor VARIANT or config changes —\n  // never on mouse move. This stops 60fps re-renders of all context consumers\n  // (CursorTarget, useMagnetic, useCursorIdle, useCursorZone, etc.).\n  const contextValue = useMemo(() => {\n    const topVariant = globalVariant ?? variantStack[variantStack.length - 1]\n    const currentConfig = config[topVariant] ?? config.default\n    const cursorState: CursorState = { ...currentConfig, variant: topVariant }\n\n    return {\n      cursorState,\n      setCursorVariant,\n      resetCursorToDefault,\n      config,\n      // Snapshot at render time. For live position use mouseStore directly\n      // or the useMousePosition() hook. @deprecated for reactive use.\n      mousePosition: { x: mouseStore.x, y: mouseStore.y },\n      setGlobalCursorVariant,\n      clearGlobalCursorVariant,\n    }\n  }, [\n    variantStack,\n    globalVariant,\n    config,\n    setCursorVariant,\n    resetCursorToDefault,\n    setGlobalCursorVariant,\n    clearGlobalCursorVariant,\n  ])\n\n  return (\n    <CursorContext.Provider value={contextValue}>\n      {children}\n    </CursorContext.Provider>\n  )\n}\n","\"use client\"\n\nimport type React from \"react\"\nimport { useEffect, useState, useRef } from \"react\"\nimport { useCursorContext } from \"./CursorProvider\"\nimport { mouseStore } from \"../mouseStore\"\n\ninterface CursorProps {\n  zIndex?: number\n  showOnTouch?: boolean\n  trailLength?: number\n  /**\n   * When true, the cursor squashes and stretches in the direction of travel\n   * based on spring velocity. Applies only to circle shapes without a label.\n   */\n  elongate?: boolean\n}\n\n// Velocity Verlet spring integrator — stable at variable frame rates\nfunction stepSpring(\n  pos: number,\n  vel: number,\n  target: number,\n  stiffness: number,\n  damping: number,\n  mass: number,\n  dt: number\n): [number, number] {\n  const force = -stiffness * (pos - target) - damping * vel\n  const acc = force / mass\n  const newVel = vel + acc * dt\n  const newPos = pos + vel * dt + 0.5 * acc * dt * dt\n  return [newPos, newVel]\n}\n\nexport const Cursor: React.FC<CursorProps> = ({ zIndex = 9999, showOnTouch = false, trailLength = 10, elongate = false }) => {\n  const { cursorState } = useCursorContext()\n  const [isVisible, setIsVisible] = useState(false)\n  const [isTouchDevice, setIsTouchDevice] = useState(false)\n  const [reducedMotion, setReducedMotion] = useState(false)\n\n  const outerRef = useRef<HTMLDivElement>(null)\n  const positionHistoryRef = useRef<{ x: number; y: number }[]>([])\n\n  // All mutable animation state lives in refs — never causes re-renders\n  const springRef = useRef({ x: 0, y: 0, vx: 0, vy: 0 })\n  const targetRef = useRef({ x: 0, y: 0 })\n  const rafRef = useRef<number | null>(null)\n  const lastTimeRef = useRef<number | null>(null)\n  const springConfigRef = useRef({ stiffness: 800, damping: 80, mass: 1 })\n  const reducedMotionRef = useRef(false)\n  const elongateRef = useRef(elongate)\n  const lastAngleRef = useRef(0)\n  const cursorShapeRef = useRef({ shape: cursorState.shape, label: cursorState.label })\n  // Refs to inner element wrapper divs so RAF can update their transforms directly\n  const innerRefsRef = useRef<(HTMLDivElement | null)[]>([])\n\n  useEffect(() => {\n    springConfigRef.current = {\n      stiffness: cursorState.transition?.stiffness ?? 800,\n      damping: cursorState.transition?.damping ?? 80,\n      mass: cursorState.transition?.mass ?? 1,\n    }\n  }, [cursorState.transition])\n\n  useEffect(() => { elongateRef.current = elongate }, [elongate])\n  useEffect(() => {\n    cursorShapeRef.current = { shape: cursorState.shape, label: cursorState.label }\n  }, [cursorState.shape, cursorState.label])\n\n  // Subscribe to shared mouse store — no duplicate window.mousemove listener.\n  // targetRef is updated synchronously; the RAF loop reads it on the next frame.\n  useEffect(() => {\n    return mouseStore.subscribe((x, y) => {\n      targetRef.current = { x, y }\n      positionHistoryRef.current = [\n        { x, y },\n        ...positionHistoryRef.current.slice(0, trailLength - 1),\n      ]\n    })\n  }, [trailLength])\n\n  // Single RAF loop — starts once, reads only from refs, writes only to DOM.\n  // Inner element parallax is also updated here to avoid React re-renders.\n  useEffect(() => {\n    const animate = (time: number) => {\n      if (lastTimeRef.current !== null) {\n        if (reducedMotionRef.current) {\n          const { x, y } = targetRef.current\n          springRef.current = { x, y, vx: 0, vy: 0 }\n          if (outerRef.current) outerRef.current.style.transform = `translate(${x}px, ${y}px)`\n        } else {\n          const dt = Math.min((time - lastTimeRef.current) / 1000, 0.064)\n          const { stiffness, damping, mass } = springConfigRef.current\n          const { x, y, vx, vy } = springRef.current\n          const { x: tx, y: ty } = targetRef.current\n\n          // Sub-step to keep Velocity Verlet stable for stiff spring configs.\n          // Stability requires dt < sqrt(2)/omega where omega = sqrt(k/m).\n          // 8ms sub-steps are stable up to omega ~= 177 rad/s (k/m ~= 31,000).\n          const MAX_SUB_DT = 0.008\n          const steps = Math.max(1, Math.ceil(dt / MAX_SUB_DT))\n          const subDt = dt / steps\n          let nx = x, nvx = vx, ny = y, nvy = vy\n          for (let i = 0; i < steps; i++) {\n            ;[nx, nvx] = stepSpring(nx, nvx, tx, stiffness, damping, mass, subDt)\n            ;[ny, nvy] = stepSpring(ny, nvy, ty, stiffness, damping, mass, subDt)\n          }\n\n          springRef.current = { x: nx, y: ny, vx: nvx, vy: nvy }\n\n          if (outerRef.current) {\n            const canElongate =\n              elongateRef.current &&\n              cursorShapeRef.current.shape !== \"square\" &&\n              !cursorShapeRef.current.label\n\n            if (canElongate) {\n              const speed = Math.sqrt(nvx * nvx + nvy * nvy)\n              const elong = Math.min(1 + speed / 800, 1.35)\n              const comp = 1 / Math.sqrt(elong)\n              if (speed > 30) lastAngleRef.current = Math.atan2(nvy, nvx) * (180 / Math.PI)\n              outerRef.current.style.transform =\n                `translate(${nx}px, ${ny}px) rotate(${lastAngleRef.current}deg) scaleX(${elong}) scaleY(${comp})`\n            } else {\n              outerRef.current.style.transform = `translate(${nx}px, ${ny}px)`\n            }\n          }\n\n          // Update inner element parallax via direct DOM — zero React re-renders\n          const innerDivs = innerRefsRef.current\n          if (innerDivs.length > 0) {\n            const cur = targetRef.current\n            for (let i = 0; i < innerDivs.length; i++) {\n              const el = innerDivs[i]\n              if (!el) continue\n              const delayed = positionHistoryRef.current[Math.min(i + 1, positionHistoryRef.current.length - 1)] || cur\n              const ox = -(cur.x - delayed.x) * 0.5\n              const oy = -(cur.y - delayed.y) * 0.5\n              el.style.transform = `translate(calc(-50% + ${ox}px), calc(-50% + ${oy}px))`\n            }\n          }\n        }\n      }\n      lastTimeRef.current = time\n      rafRef.current = requestAnimationFrame(animate)\n    }\n\n    rafRef.current = requestAnimationFrame(animate)\n    return () => {\n      if (rafRef.current !== null) cancelAnimationFrame(rafRef.current)\n    }\n  }, [])\n\n  // Device + accessibility detection\n  useEffect(() => {\n    const touchMQ = window.matchMedia(\"(pointer: coarse)\")\n    setIsTouchDevice(touchMQ.matches)\n\n    const motionMQ = window.matchMedia(\"(prefers-reduced-motion: reduce)\")\n    reducedMotionRef.current = motionMQ.matches\n    setReducedMotion(motionMQ.matches)\n\n    const onMotionChange = (e: MediaQueryListEvent) => {\n      reducedMotionRef.current = e.matches\n      setReducedMotion(e.matches)\n    }\n    motionMQ.addEventListener(\"change\", onMotionChange)\n\n    const timer = setTimeout(() => setIsVisible(true), 50)\n\n    return () => {\n      motionMQ.removeEventListener(\"change\", onMotionChange)\n      clearTimeout(timer)\n    }\n  }, [])\n\n  if (isTouchDevice && !showOnTouch) return null\n\n  const {\n    width = 24,\n    height = 24,\n    scale = 1,\n    shape = \"circle\",\n    color = \"rgba(255, 255, 255, 0.8)\",\n    opacity = 1,\n    borderColor = \"rgba(0, 0, 0, 0)\",\n    borderWidth = 0,\n    borderStyle = \"solid\",\n    mixBlendMode = \"normal\",\n    label,\n    fontSize = \"12px\",\n    fontWeight = \"bold\",\n    labelColor = \"#000\",\n    customElement,\n    innerElements,\n    borderRadius: customBorderRadius,\n  } = cursorState\n\n  const borderRadius =\n    shape === \"circle\" ? \"50%\" : shape === \"square\" ? `${customBorderRadius ?? 0}px` : \"0\"\n\n  const bgColor = shape === \"custom\" ? \"transparent\" : color\n\n  const shapeTransition = reducedMotion\n    ? \"none\"\n    : \"width 0.2s ease, height 0.2s ease, border-radius 0.2s ease, background-color 0.2s ease, border-color 0.2s ease, opacity 0.2s ease, transform 0.15s ease\"\n\n  // Keep the inner refs array in sync with the count of inner elements\n  if (innerElements) {\n    innerRefsRef.current = innerRefsRef.current.slice(0, innerElements.length)\n  } else {\n    innerRefsRef.current = []\n  }\n\n  return (\n    <div\n      ref={outerRef}\n      aria-hidden=\"true\"\n      style={{\n        position: \"fixed\",\n        left: 0,\n        top: 0,\n        zIndex,\n        pointerEvents: \"none\",\n        opacity: isVisible ? 1 : 0,\n        willChange: \"transform\",\n        mixBlendMode,\n        transformOrigin: \"0 0\",\n      }}\n    >\n      <div\n        style={{\n          width,\n          height,\n          borderRadius,\n          backgroundColor: bgColor,\n          opacity,\n          borderColor,\n          borderWidth,\n          borderStyle,\n          display: \"flex\",\n          justifyContent: \"center\",\n          alignItems: \"center\",\n          transform: `translate(-50%, -50%) scale(${scale})`,\n          transition: shapeTransition,\n          willChange: \"width, height, background-color, transform\",\n        }}\n      >\n        {shape === \"custom\" && customElement}\n\n        {label && (\n          <div\n            style={{\n              fontSize,\n              fontWeight,\n              color: labelColor,\n              textAlign: \"center\",\n              userSelect: \"none\",\n              whiteSpace: \"nowrap\",\n              pointerEvents: \"none\",\n            }}\n          >\n            {label}\n          </div>\n        )}\n\n        {innerElements?.map((item, index) => (\n          <div\n            key={`inner-${index}`}\n            ref={(el) => { innerRefsRef.current[index] = el }}\n            style={{\n              position: \"absolute\",\n              left: \"50%\",\n              top: \"50%\",\n              // Initial transform — RAF overwrites it every frame via direct DOM\n              transform: \"translate(-50%, -50%)\",\n              transition: reducedMotion ? \"none\" : \"transform 0.12s ease\",\n            }}\n          >\n            {item.element}\n          </div>\n        ))}\n      </div>\n    </div>\n  )\n}\n","/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\r\n\r\nvar extendStatics = function(d, b) {\r\n    extendStatics = Object.setPrototypeOf ||\r\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n        function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n    return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n    if (typeof b !== \"function\" && b !== null)\r\n        throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n    extendStatics(d, b);\r\n    function __() { this.constructor = d; }\r\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n    __assign = Object.assign || function __assign(t) {\r\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n            s = arguments[i];\r\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n        }\r\n        return t;\r\n    }\r\n    return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n    var t = {};\r\n    for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n        t[p] = s[p];\r\n    if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n        for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n            if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n                t[p[i]] = s[p[i]];\r\n        }\r\n    return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n    return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n    function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n    var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n    var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n    var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n    var _, done = false;\r\n    for (var i = decorators.length - 1; i >= 0; i--) {\r\n        var context = {};\r\n        for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n        for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n        context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n        var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n        if (kind === \"accessor\") {\r\n            if (result === void 0) continue;\r\n            if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n            if (_ = accept(result.get)) descriptor.get = _;\r\n            if (_ = accept(result.set)) descriptor.set = _;\r\n            if (_ = accept(result.init)) initializers.unshift(_);\r\n        }\r\n        else if (_ = accept(result)) {\r\n            if (kind === \"field\") initializers.unshift(_);\r\n            else descriptor[key] = _;\r\n        }\r\n    }\r\n    if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n    done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n    var useValue = arguments.length > 2;\r\n    for (var i = 0; i < initializers.length; i++) {\r\n        value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n    }\r\n    return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n    return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n    if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n    return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n    return new (P || (P = Promise))(function (resolve, reject) {\r\n        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n        function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n    });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\r\n    return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n    function verb(n) { return function (v) { return step([n, v]); }; }\r\n    function step(op) {\r\n        if (f) throw new TypeError(\"Generator is already executing.\");\r\n        while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n            if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n            if (y = 0, t) op = [op[0] & 2, t.value];\r\n            switch (op[0]) {\r\n                case 0: case 1: t = op; break;\r\n                case 4: _.label++; return { value: op[1], done: false };\r\n                case 5: _.label++; y = op[1]; op = [0]; continue;\r\n                case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n                default:\r\n                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n                    if (t[2]) _.ops.pop();\r\n                    _.trys.pop(); continue;\r\n            }\r\n            op = body.call(thisArg, _);\r\n        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n    }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n    if (k2 === undefined) k2 = k;\r\n    var desc = Object.getOwnPropertyDescriptor(m, k);\r\n    if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n        desc = { enumerable: true, get: function() { return m[k]; } };\r\n    }\r\n    Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n    if (k2 === undefined) k2 = k;\r\n    o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n    for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n    var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n    if (m) return m.call(o);\r\n    if (o && typeof o.length === \"number\") return {\r\n        next: function () {\r\n            if (o && i >= o.length) o = void 0;\r\n            return { value: o && o[i++], done: !o };\r\n        }\r\n    };\r\n    throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n    var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n    if (!m) return o;\r\n    var i = m.call(o), r, ar = [], e;\r\n    try {\r\n        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n    }\r\n    catch (error) { e = { error: error }; }\r\n    finally {\r\n        try {\r\n            if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n        }\r\n        finally { if (e) throw e.error; }\r\n    }\r\n    return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n    for (var ar = [], i = 0; i < arguments.length; i++)\r\n        ar = ar.concat(__read(arguments[i]));\r\n    return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n    for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n    for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n        for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n            r[k] = a[j];\r\n    return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n    if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n        if (ar || !(i in from)) {\r\n            if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n            ar[i] = from[i];\r\n        }\r\n    }\r\n    return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n    return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n    if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n    var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n    return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n    function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\r\n    function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\r\n    function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n    function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n    function fulfill(value) { resume(\"next\", value); }\r\n    function reject(value) { resume(\"throw\", value); }\r\n    function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n    var i, p;\r\n    return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n    function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n    if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n    var m = o[Symbol.asyncIterator], i;\r\n    return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n    function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n    function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n    if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n    return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n    Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n    o[\"default\"] = v;\r\n};\r\n\r\nvar ownKeys = function(o) {\r\n    ownKeys = Object.getOwnPropertyNames || function (o) {\r\n        var ar = [];\r\n        for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\r\n        return ar;\r\n    };\r\n    return ownKeys(o);\r\n};\r\n\r\nexport function __importStar(mod) {\r\n    if (mod && mod.__esModule) return mod;\r\n    var result = {};\r\n    if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\r\n    __setModuleDefault(result, mod);\r\n    return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n    return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n    if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n    if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n    return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n    if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n    if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n    if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n    return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n    if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n    return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n\r\nexport function __addDisposableResource(env, value, async) {\r\n    if (value !== null && value !== void 0) {\r\n        if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\r\n        var dispose, inner;\r\n        if (async) {\r\n            if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\r\n            dispose = value[Symbol.asyncDispose];\r\n        }\r\n        if (dispose === void 0) {\r\n            if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\r\n            dispose = value[Symbol.dispose];\r\n            if (async) inner = dispose;\r\n        }\r\n        if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\r\n        if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\r\n        env.stack.push({ value: value, dispose: dispose, async: async });\r\n    }\r\n    else if (async) {\r\n        env.stack.push({ async: true });\r\n    }\r\n    return value;\r\n\r\n}\r\n\r\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n    var e = new Error(message);\r\n    return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\r\n\r\nexport function __disposeResources(env) {\r\n    function fail(e) {\r\n        env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\r\n        env.hasError = true;\r\n    }\r\n    var r, s = 0;\r\n    function next() {\r\n        while (r = env.stack.pop()) {\r\n            try {\r\n                if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\r\n                if (r.dispose) {\r\n                    var result = r.dispose.call(r.value);\r\n                    if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\r\n                }\r\n                else s |= 1;\r\n            }\r\n            catch (e) {\r\n                fail(e);\r\n            }\r\n        }\r\n        if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\r\n        if (env.hasError) throw env.error;\r\n    }\r\n    return next();\r\n}\r\n\r\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\r\n    if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\r\n        return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\r\n            return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\r\n        });\r\n    }\r\n    return path;\r\n}\r\n\r\nexport default {\r\n    __extends: __extends,\r\n    __assign: __assign,\r\n    __rest: __rest,\r\n    __decorate: __decorate,\r\n    __param: __param,\r\n    __esDecorate: __esDecorate,\r\n    __runInitializers: __runInitializers,\r\n    __propKey: __propKey,\r\n    __setFunctionName: __setFunctionName,\r\n    __metadata: __metadata,\r\n    __awaiter: __awaiter,\r\n    __generator: __generator,\r\n    __createBinding: __createBinding,\r\n    __exportStar: __exportStar,\r\n    __values: __values,\r\n    __read: __read,\r\n    __spread: __spread,\r\n    __spreadArrays: __spreadArrays,\r\n    __spreadArray: __spreadArray,\r\n    __await: __await,\r\n    __asyncGenerator: __asyncGenerator,\r\n    __asyncDelegator: __asyncDelegator,\r\n    __asyncValues: __asyncValues,\r\n    __makeTemplateObject: __makeTemplateObject,\r\n    __importStar: __importStar,\r\n    __importDefault: __importDefault,\r\n    __classPrivateFieldGet: __classPrivateFieldGet,\r\n    __classPrivateFieldSet: __classPrivateFieldSet,\r\n    __classPrivateFieldIn: __classPrivateFieldIn,\r\n    __addDisposableResource: __addDisposableResource,\r\n    __disposeResources: __disposeResources,\r\n    __rewriteRelativeImportExtension: __rewriteRelativeImportExtension,\r\n};\r\n","\"use client\"\n\nimport { useRef } from \"react\"\nimport { useCursorContext } from \"../components/CursorProvider\"\n\ninterface UseCursorOptions {\n  variant: string\n  onEnter?: () => void\n  onLeave?: () => void\n}\n\nexport const useCursor = ({ variant, onEnter, onLeave }: UseCursorOptions) => {\n  const { setCursorVariant } = useCursorContext()\n  // Prevent double-push when both mouseenter and focus fire on the same interaction\n  // (e.g. clicking a button fires mouseenter → push, then focus → push again;\n  //  mouseleave only pops once, leaving a dangling stack entry).\n  const isActiveRef = useRef(false)\n\n  return {\n    onMouseEnter() {\n      if (!isActiveRef.current) { isActiveRef.current = true; setCursorVariant(variant, \"push\") }\n      onEnter?.()\n    },\n    onMouseLeave() {\n      if (isActiveRef.current) { isActiveRef.current = false; setCursorVariant(\"\", \"pop\") }\n      onLeave?.()\n    },\n    onFocus() {\n      if (!isActiveRef.current) { isActiveRef.current = true; setCursorVariant(variant, \"push\") }\n      onEnter?.()\n    },\n    onBlur() {\n      if (isActiveRef.current) { isActiveRef.current = false; setCursorVariant(\"\", \"pop\") }\n      onLeave?.()\n    },\n    \"data-cursor-target\": true,\n  }\n}\n","\"use client\"\n\nimport type React from \"react\"\nimport { useEffect, useRef } from \"react\"\n\ntype ClickEffectType = \"ripple\" | \"burst\" | \"sparkle\" | \"shockwave\" | \"confetti\" | \"implode\"\n\ninterface Particle {\n  angle: number\n  speedMult: number\n  confettiColor: string\n  rotSpeed: number\n  pw: number\n  ph: number\n}\n\ninterface ClickEffect {\n  x: number\n  y: number\n  startTime: number\n  id: number\n  particles: Particle[]\n}\n\ninterface CursorClickEffectProps {\n  /** Maximum diameter the effect expands to in px */\n  size?: number\n  /** Animation duration in ms */\n  duration?: number\n  /** CSS color string (ignored for confetti, use palette) */\n  color?: string\n  /** Stroke / particle width in px */\n  strokeWidth?: number\n  /** z-index */\n  zIndex?: number\n  /**\n   * \"ripple\"    — expanding ring (default)\n   * \"burst\"     — particles radiating outward\n   * \"sparkle\"   — star-ray lines\n   * \"shockwave\" — two concentric rings with stagger\n   * \"confetti\"  — colored rectangles with gravity\n   * \"implode\"   — particles rush inward then explode outward\n   */\n  type?: ClickEffectType\n  /** Number of particles / rays */\n  particleCount?: number\n  /** Color palette for \"confetti\" type */\n  palette?: string[]\n}\n\nconst TAU = Math.PI * 2\n\nconst DEFAULT_PALETTE = [\n  \"#ff6b6b\", \"#ffd93d\", \"#6bcb77\",\n  \"#4d96ff\", \"#c77dff\", \"#ff9a3c\",\n]\n\nexport const CursorClickEffect: React.FC<CursorClickEffectProps> = ({\n  size = 50,\n  duration = 600,\n  color = \"rgba(255, 255, 255, 0.8)\",\n  strokeWidth = 2,\n  zIndex = 9997,\n  type = \"ripple\",\n  particleCount = 12,\n  palette,\n}) => {\n  const canvasRef = useRef<HTMLCanvasElement>(null)\n  const effectsRef = useRef<ClickEffect[]>([])\n  const idRef = useRef(0)\n  const rafRef = useRef<number | null>(null)\n\n  useEffect(() => {\n    const canvas = canvasRef.current\n    if (!canvas) return\n    const ctx = canvas.getContext(\"2d\")\n    if (!ctx) return\n\n    const resize = () => {\n      canvas.width = window.innerWidth\n      canvas.height = window.innerHeight\n    }\n    resize()\n    window.addEventListener(\"resize\", resize, { passive: true })\n\n    const effectivePalette = palette ?? DEFAULT_PALETTE\n\n    // Animate only while there are active effects — idle-suspend between clicks.\n    const animate = (time: number) => {\n      ctx.clearRect(0, 0, canvas.width, canvas.height)\n\n      effectsRef.current = effectsRef.current.filter((effect) => {\n        const elapsed = Math.max(0, time - effect.startTime)\n        if (elapsed >= duration) return false\n\n        const progress = elapsed / duration\n\n        if (type === \"ripple\")         drawRipple(ctx, effect, progress, size, color, strokeWidth)\n        else if (type === \"burst\")     drawBurst(ctx, effect, progress, size, color, strokeWidth)\n        else if (type === \"sparkle\")   drawSparkle(ctx, effect, progress, size, color, strokeWidth)\n        else if (type === \"shockwave\") drawShockwave(ctx, effect, elapsed, duration, size, color, strokeWidth)\n        else if (type === \"confetti\")  drawConfetti(ctx, effect, elapsed, duration, size)\n        else if (type === \"implode\")   drawImplode(ctx, effect, progress, size, color, strokeWidth)\n\n        ctx.globalAlpha = 1\n        return true\n      })\n\n      if (effectsRef.current.length > 0) {\n        rafRef.current = requestAnimationFrame(animate)\n      } else {\n        // All effects finished — stop the loop until the next click\n        rafRef.current = null\n      }\n    }\n\n    const spawnEffect = (x: number, y: number) => {\n      const particles: Particle[] = Array.from({ length: particleCount }, (_, i) => ({\n        angle: (i / particleCount) * TAU + (Math.random() - 0.5) * (TAU / particleCount),\n        speedMult: 0.6 + Math.random() * 0.4,\n        confettiColor: effectivePalette[i % effectivePalette.length],\n        rotSpeed: (Math.random() - 0.5) * 18,\n        pw: 8 + Math.random() * 10,\n        ph: 4 + Math.random() * 6,\n      }))\n      effectsRef.current.push({ x, y, startTime: performance.now(), id: idRef.current++, particles })\n      // Wake the RAF loop if it was idle\n      if (rafRef.current === null) {\n        rafRef.current = requestAnimationFrame(animate)\n      }\n    }\n\n    const onClick = (e: MouseEvent) => spawnEffect(e.clientX, e.clientY)\n    const onCustomClick = (e: Event) => {\n      const { x, y } = (e as CustomEvent<{ x: number; y: number }>).detail\n      spawnEffect(x, y)\n    }\n\n    window.addEventListener(\"click\", onClick)\n    window.addEventListener(\"cursor:click\", onCustomClick)\n\n    return () => {\n      window.removeEventListener(\"resize\", resize)\n      window.removeEventListener(\"click\", onClick)\n      window.removeEventListener(\"cursor:click\", onCustomClick)\n      if (rafRef.current !== null) cancelAnimationFrame(rafRef.current)\n    }\n  }, [color, duration, palette, particleCount, size, strokeWidth, type])\n\n  return (\n    <canvas\n      ref={canvasRef}\n      aria-hidden=\"true\"\n      style={{ position: \"fixed\", top: 0, left: 0, pointerEvents: \"none\", zIndex }}\n    />\n  )\n}\n\n// ─── effect renderers ─────────────────────────────────────────────────────────\n\nfunction drawRipple(ctx: CanvasRenderingContext2D, effect: ClickEffect, progress: number, size: number, color: string, strokeWidth: number) {\n  const r = Math.max((size / 2) * (1 - Math.pow(1 - progress, 3)), 0.5)\n  ctx.beginPath()\n  ctx.arc(effect.x, effect.y, r, 0, TAU)\n  ctx.strokeStyle = color\n  ctx.globalAlpha = 1 - progress\n  ctx.lineWidth = strokeWidth\n  ctx.stroke()\n}\n\nfunction drawBurst(ctx: CanvasRenderingContext2D, effect: ClickEffect, progress: number, size: number, color: string, strokeWidth: number) {\n  const eased = 1 - Math.pow(1 - progress, 2)\n  ctx.fillStyle = color\n  effect.particles.forEach((p) => {\n    const dist = eased * (size / 2) * p.speedMult\n    const x = effect.x + Math.cos(p.angle) * dist\n    const y = effect.y + Math.sin(p.angle) * dist\n    ctx.beginPath()\n    ctx.arc(x, y, Math.max((1 - progress) * strokeWidth * 2.5, 0.5), 0, TAU)\n    ctx.globalAlpha = (1 - progress) * 0.9\n    ctx.fill()\n  })\n}\n\nfunction drawSparkle(ctx: CanvasRenderingContext2D, effect: ClickEffect, progress: number, size: number, color: string, strokeWidth: number) {\n  const eased = 1 - Math.pow(1 - progress, 2)\n  ctx.strokeStyle = color\n  ctx.lineCap = \"round\"\n  effect.particles.forEach((p) => {\n    const x1 = effect.x + Math.cos(p.angle) * eased * (size / 2) * 0.25\n    const y1 = effect.y + Math.sin(p.angle) * eased * (size / 2) * 0.25\n    const x2 = effect.x + Math.cos(p.angle) * eased * (size / 2) * p.speedMult\n    const y2 = effect.y + Math.sin(p.angle) * eased * (size / 2) * p.speedMult\n    ctx.beginPath()\n    ctx.moveTo(x1, y1)\n    ctx.lineTo(x2, y2)\n    ctx.globalAlpha = (1 - progress) * 0.85\n    ctx.lineWidth = Math.max(strokeWidth * (1 - progress * 0.5), 0.5)\n    ctx.stroke()\n  })\n  ctx.beginPath()\n  ctx.arc(effect.x, effect.y, Math.max((1 - progress) * 3, 0.5), 0, TAU)\n  ctx.fillStyle = color\n  ctx.globalAlpha = 1 - progress\n  ctx.fill()\n}\n\nfunction drawShockwave(ctx: CanvasRenderingContext2D, effect: ClickEffect, elapsed: number, duration: number, size: number, color: string, strokeWidth: number) {\n  const p1 = elapsed / duration\n  ctx.beginPath()\n  ctx.arc(effect.x, effect.y, Math.max((size / 2) * (1 - Math.pow(1 - p1, 3)), 0.5), 0, TAU)\n  ctx.strokeStyle = color\n  ctx.globalAlpha = (1 - p1) * 0.85\n  ctx.lineWidth = strokeWidth * 1.5\n  ctx.stroke()\n\n  const DELAY = 0.15\n  if (elapsed > duration * DELAY) {\n    const p2 = Math.min((elapsed - duration * DELAY) / (duration * (1 - DELAY)), 1)\n    ctx.beginPath()\n    ctx.arc(effect.x, effect.y, Math.max((size / 2) * 0.65 * (1 - Math.pow(1 - p2, 3)), 0.5), 0, TAU)\n    ctx.globalAlpha = (1 - p2) * 0.5\n    ctx.lineWidth = strokeWidth\n    ctx.stroke()\n  }\n}\n\nfunction drawConfetti(ctx: CanvasRenderingContext2D, effect: ClickEffect, elapsed: number, duration: number, size: number) {\n  const t = elapsed / 1000\n\n  effect.particles.forEach((p) => {\n    const speed = size * 4 + size * 3.5 * p.speedMult\n    const vx0 = Math.cos(p.angle) * speed\n    const vy0 = Math.sin(p.angle) * speed * 0.5 - size * 7.5\n\n    const drag = Math.exp(-1.5 * t)\n    const x = effect.x + vx0 * t * drag\n    const y = effect.y + vy0 * t + 0.5 * 900 * t * t\n\n    const alpha = Math.max(0, 1 - Math.pow(elapsed / duration, 1.5))\n    const rot = p.rotSpeed * t\n\n    ctx.save()\n    ctx.translate(x, y)\n    ctx.rotate(rot)\n    ctx.fillStyle = p.confettiColor\n    ctx.globalAlpha = alpha\n    ctx.fillRect(-p.pw / 2, -p.ph / 2, p.pw, p.ph)\n    ctx.restore()\n  })\n}\n\nfunction drawImplode(ctx: CanvasRenderingContext2D, effect: ClickEffect, progress: number, size: number, color: string, strokeWidth: number) {\n  const SPLIT = 0.3\n  const maxDist = size / 2\n\n  if (progress < SPLIT) {\n    const p = progress / SPLIT\n    const eased = p * p\n    ctx.fillStyle = color\n    effect.particles.forEach((part) => {\n      const dist = maxDist * (1 - eased) * part.speedMult\n      const x = effect.x + Math.cos(part.angle) * dist\n      const y = effect.y + Math.sin(part.angle) * dist\n      ctx.beginPath()\n      ctx.arc(x, y, Math.max(strokeWidth * 2, 0.5), 0, TAU)\n      ctx.globalAlpha = 0.7 + eased * 0.3\n      ctx.fill()\n    })\n    ctx.beginPath()\n    ctx.arc(effect.x, effect.y, Math.max(eased * 6, 0.5), 0, TAU)\n    ctx.globalAlpha = eased\n    ctx.fill()\n  } else {\n    const p = (progress - SPLIT) / (1 - SPLIT)\n    const eased = 1 - Math.pow(1 - p, 2)\n    ctx.fillStyle = color\n    effect.particles.forEach((part) => {\n      const dist = eased * maxDist * part.speedMult\n      const x = effect.x + Math.cos(part.angle) * dist\n      const y = effect.y + Math.sin(part.angle) * dist\n      ctx.beginPath()\n      ctx.arc(x, y, Math.max((1 - p) * strokeWidth * 2.5, 0.5), 0, TAU)\n      ctx.globalAlpha = (1 - p) * 0.9\n      ctx.fill()\n    })\n  }\n}\n","\"use client\"\n\nimport type React from \"react\"\nimport { useEffect, useRef } from \"react\"\nimport { mouseStore } from \"../mouseStore\"\n\ninterface CursorDrawProps {\n  /** Ink color */\n  color?: string\n  /** Stroke width in px */\n  width?: number\n  /** z-index */\n  zIndex?: number\n  /**\n   * How long strokes persist in ms before fading out.\n   * 0 = permanent until double-click or unmount.\n   */\n  fadeTime?: number\n  /** When false, drawing is paused but existing strokes are preserved */\n  enabled?: boolean\n  /** Eraser diameter in px (right-click drag to erase) */\n  eraseWidth?: number\n  /** Called after every draw stroke is completed */\n  onStroke?: (points: { x: number; y: number }[]) => void\n}\n\ninterface Stroke {\n  /** Points in page (document) coordinates — scroll-anchored */\n  points: { x: number; y: number }[]\n  color: string\n  width: number\n  createdAt: number\n  /** When true, renders with destination-out to erase underlying pixels */\n  erase: boolean\n}\n\nexport const CursorDraw: React.FC<CursorDrawProps> = ({\n  color = \"rgba(255,255,255,0.85)\",\n  width = 2,\n  zIndex = 9996,\n  fadeTime = 0,\n  enabled = true,\n  eraseWidth = 20,\n  onStroke,\n}) => {\n  const canvasRef = useRef<HTMLCanvasElement>(null)\n  const strokesRef = useRef<Stroke[]>([])\n  const currentRef = useRef<{ x: number; y: number }[] | null>(null)\n  const isDownRef = useRef(false)\n  const isErasingRef = useRef(false)\n  const rafRef = useRef<number | null>(null)\n  const enabledRef = useRef(enabled)\n\n  useEffect(() => {\n    enabledRef.current = enabled\n    if (!enabled) {\n      isDownRef.current = false\n      if (currentRef.current && currentRef.current.length > 1) {\n        strokesRef.current.push({\n          points: currentRef.current,\n          color,\n          width,\n          createdAt: performance.now(),\n          erase: false,\n        })\n      }\n      currentRef.current = null\n    }\n  }, [enabled, color, width])\n\n  useEffect(() => {\n    const canvas = canvasRef.current\n    if (!canvas) return\n    const ctx = canvas.getContext(\"2d\")\n    if (!ctx) return\n\n    const resize = () => {\n      canvas.width = window.innerWidth\n      canvas.height = window.innerHeight\n    }\n    resize()\n    window.addEventListener(\"resize\", resize, { passive: true })\n\n    const drawStroke = (pts: { x: number; y: number }[], sw: number, sc: string, alpha: number) => {\n      if (pts.length < 2) return\n      ctx.beginPath()\n      ctx.moveTo(pts[0].x, pts[0].y)\n      for (let i = 1; i < pts.length - 1; i++) {\n        const mx = (pts[i].x + pts[i + 1].x) / 2\n        const my = (pts[i].y + pts[i + 1].y) / 2\n        ctx.quadraticCurveTo(pts[i].x, pts[i].y, mx, my)\n      }\n      ctx.lineTo(pts[pts.length - 1].x, pts[pts.length - 1].y)\n      ctx.strokeStyle = sc\n      ctx.globalAlpha = alpha\n      ctx.lineWidth = sw\n      ctx.lineCap = \"round\"\n      ctx.lineJoin = \"round\"\n      ctx.stroke()\n    }\n\n    const animate = (time: number) => {\n      ctx.clearRect(0, 0, canvas.width, canvas.height)\n\n      // Translate to page coordinates so drawings scroll with content\n      const sx = window.scrollX\n      const sy = window.scrollY\n      ctx.save()\n      ctx.translate(-sx, -sy)\n\n      if (fadeTime > 0) {\n        strokesRef.current = strokesRef.current.filter((s) => time - s.createdAt < fadeTime + 800)\n      }\n\n      strokesRef.current.forEach((s) => {\n        const age = fadeTime > 0 ? Math.max(0, time - s.createdAt - fadeTime) : 0\n        const alpha = fadeTime > 0 ? Math.max(0, 1 - age / 800) : 1\n\n        if (s.erase) {\n          ctx.globalCompositeOperation = \"destination-out\"\n          drawStroke(s.points, s.width, \"rgba(0,0,0,1)\", alpha || 1)\n          ctx.globalCompositeOperation = \"source-over\"\n        } else {\n          drawStroke(s.points, s.width, s.color, alpha)\n        }\n      })\n\n      if (currentRef.current && currentRef.current.length > 0) {\n        if (isErasingRef.current) {\n          // Active erase stroke\n          ctx.globalCompositeOperation = \"destination-out\"\n          drawStroke(currentRef.current, eraseWidth, \"rgba(0,0,0,1)\", 1)\n          ctx.globalCompositeOperation = \"source-over\"\n\n          // Eraser circle indicator\n          const tip = currentRef.current[currentRef.current.length - 1]\n          ctx.beginPath()\n          ctx.arc(tip.x, tip.y, eraseWidth / 2, 0, Math.PI * 2)\n          ctx.setLineDash([3, 3])\n          ctx.strokeStyle = \"rgba(255,255,255,0.5)\"\n          ctx.lineWidth = 1\n          ctx.globalAlpha = 0.7\n          ctx.stroke()\n          ctx.setLineDash([])\n        } else {\n          drawStroke(currentRef.current, width, color, 1)\n        }\n      }\n\n      ctx.restore()\n      ctx.globalAlpha = 1\n\n      const isDrawing = currentRef.current !== null\n      const hasFadingWork = fadeTime > 0 && strokesRef.current.length > 0\n\n      if (isDrawing || hasFadingWork) {\n        rafRef.current = requestAnimationFrame(animate)\n      } else {\n        rafRef.current = null\n      }\n    }\n\n    // Scroll shifts the viewport — repaint strokes at their new screen position\n    const onScroll = () => {\n      const hasStrokes = strokesRef.current.length > 0 || currentRef.current !== null\n      if (hasStrokes && rafRef.current === null) {\n        rafRef.current = requestAnimationFrame(animate)\n      }\n    }\n\n    const onDown = (e: MouseEvent) => {\n      if (!enabledRef.current) return\n      // Left button (0) = draw, right button (2) = erase\n      if (e.button !== 0 && e.button !== 2) return\n      isErasingRef.current = e.button === 2\n      isDownRef.current = true\n      // Suppress text selection while drawing or erasing\n      document.body.style.userSelect = \"none\"\n      ;(document.body.style as any).webkitUserSelect = \"none\"\n      currentRef.current = [{ x: e.clientX + window.scrollX, y: e.clientY + window.scrollY }]\n      if (rafRef.current === null) rafRef.current = requestAnimationFrame(animate)\n    }\n\n    const onUp = (e: MouseEvent) => {\n      if (e.button !== 0 && e.button !== 2) return\n      // Restore text selection\n      document.body.style.userSelect = \"\"\n      ;(document.body.style as any).webkitUserSelect = \"\"\n      if (!isDownRef.current || !currentRef.current) return\n      isDownRef.current = false\n      if (currentRef.current.length > 1) {\n        const stroke: Stroke = {\n          points: currentRef.current,\n          color,\n          width: isErasingRef.current ? eraseWidth : width,\n          createdAt: performance.now(),\n          erase: isErasingRef.current,\n        }\n        strokesRef.current.push(stroke)\n        if (!isErasingRef.current) onStroke?.(stroke.points)\n        if (fadeTime > 0 && rafRef.current === null) rafRef.current = requestAnimationFrame(animate)\n      }\n      currentRef.current = null\n      isErasingRef.current = false\n    }\n\n    // Double-click clears all strokes\n    const onDblClick = () => {\n      if (!enabledRef.current) return\n      strokesRef.current = []\n      currentRef.current = null\n      isDownRef.current = false\n      ctx.clearRect(0, 0, canvas.width, canvas.height)\n      if (rafRef.current !== null) {\n        cancelAnimationFrame(rafRef.current)\n        rafRef.current = null\n      }\n    }\n\n    // Prevent browser context menu while draw plugin is enabled\n    const onContextMenu = (e: MouseEvent) => {\n      if (enabledRef.current) e.preventDefault()\n    }\n\n    const unsubMove = mouseStore.subscribe((x, y) => {\n      if (!enabledRef.current || !isDownRef.current || !currentRef.current) return\n      currentRef.current.push({ x: x + window.scrollX, y: y + window.scrollY })\n    })\n\n    window.addEventListener(\"mousedown\", onDown)\n    window.addEventListener(\"mouseup\", onUp)\n    window.addEventListener(\"dblclick\", onDblClick)\n    window.addEventListener(\"contextmenu\", onContextMenu)\n    window.addEventListener(\"scroll\", onScroll, { passive: true })\n\n    return () => {\n      window.removeEventListener(\"resize\", resize)\n      window.removeEventListener(\"mousedown\", onDown)\n      window.removeEventListener(\"mouseup\", onUp)\n      window.removeEventListener(\"dblclick\", onDblClick)\n      window.removeEventListener(\"contextmenu\", onContextMenu)\n      window.removeEventListener(\"scroll\", onScroll)\n      document.body.style.userSelect = \"\"\n      ;(document.body.style as any).webkitUserSelect = \"\"\n      unsubMove()\n      if (rafRef.current !== null) cancelAnimationFrame(rafRef.current)\n    }\n  }, [color, eraseWidth, fadeTime, width])\n\n  return (\n    <canvas\n      ref={canvasRef}\n      aria-hidden=\"true\"\n      style={{ position: \"fixed\", top: 0, left: 0, pointerEvents: \"none\", zIndex }}\n    />\n  )\n}\n","\"use client\"\n\nimport type React from \"react\"\nimport { useEffect, useRef } from \"react\"\nimport { mouseStore } from \"../mouseStore\"\n\ninterface CursorLensProps {\n  /** Lens circle diameter in px (default 140) */\n  size?: number\n  /** Zoom factor — how much the content is enlarged inside the lens (default 2.2) */\n  scale?: number\n  /** Border of the circular lens frame */\n  border?: string\n  /** z-index of the lens overlay (default 9995) */\n  zIndex?: number\n  /** Content to wrap. The same content renders twice: once normally, once zoomed inside the lens. */\n  children: React.ReactNode\n}\n\n/**\n * Wraps children and shows a circular magnifying-glass lens that follows the\n * cursor over the wrapped area. The lens renders a true zoomed copy of the\n * children via DOM duplication + CSS scale — no canvas, no screenshots.\n *\n * @example\n * <CursorLens scale={2.5}>\n *   <img src=\"...\" alt=\"...\" />\n * </CursorLens>\n */\nexport const CursorLens: React.FC<CursorLensProps> = ({\n  size = 140,\n  scale = 2.2,\n  border = \"1.5px solid rgba(255,255,255,0.25)\",\n  zIndex = 9995,\n  children,\n}) => {\n  const containerRef = useRef<HTMLDivElement>(null)\n  const lensRef = useRef<HTMLDivElement>(null)\n  const zoomedRef = useRef<HTMLDivElement>(null)\n\n  useEffect(() => {\n    const container = containerRef.current\n    const lens = lensRef.current\n    const zoomed = zoomedRef.current\n    if (!container || !lens || !zoomed) return\n\n    const unsub = mouseStore.subscribe((x, y) => {\n      const rect = container.getBoundingClientRect()\n\n      if (x < rect.left || x > rect.right || y < rect.top || y > rect.bottom) {\n        lens.style.opacity = \"0\"\n        return\n      }\n\n      const lx = x - rect.left\n      const ly = y - rect.top\n\n      lens.style.left = `${x}px`\n      lens.style.top = `${y}px`\n      lens.style.opacity = \"1\"\n\n      zoomed.style.width = `${rect.width}px`\n      zoomed.style.height = `${rect.height}px`\n\n      // Offset so cursor point aligns to lens centre: left = size/2 - lx*s\n      zoomed.style.left = `${size / 2 - lx * scale}px`\n      zoomed.style.top  = `${size / 2 - ly * scale}px`\n    })\n\n    const onLeave = () => { lens.style.opacity = \"0\" }\n    document.addEventListener(\"mouseleave\", onLeave)\n\n    return () => {\n      unsub()\n      document.removeEventListener(\"mouseleave\", onLeave)\n    }\n  }, [size, scale])\n\n  return (\n    <>\n      {/* ── Base layer — renders normally ─────────────────────────────── */}\n      <div ref={containerRef} style={{ position: \"relative\" }}>\n        {children}\n      </div>\n\n      {/* ── Lens overlay — fixed, follows cursor ──────────────────────── */}\n      <div\n        ref={lensRef}\n        aria-hidden=\"true\"\n        style={{\n          position: \"fixed\",\n          width: size,\n          height: size,\n          borderRadius: \"50%\",\n          border,\n          boxShadow:\n            \"0 0 0 1px rgba(255,255,255,0.06) inset, 0 8px 32px rgba(0,0,0,0.4), 0 2px 8px rgba(0,0,0,0.3)\",\n          overflow: \"hidden\",\n          pointerEvents: \"none\",\n          zIndex,\n          opacity: 0,\n          transform: \"translate(-50%, -50%)\",\n          transition: \"opacity 0.14s ease\",\n        }}\n      >\n        {/* Zoomed copy — same children, scaled and offset to keep cursor centred */}\n        <div\n          ref={zoomedRef}\n          aria-hidden=\"true\"\n          style={{\n            position: \"absolute\",\n            transformOrigin: \"0 0\",\n            transform: `scale(${scale})`,\n            pointerEvents: \"none\",\n          }}\n        >\n          {children}\n        </div>\n\n        {/* Glass overlay: subtle inner highlight ring */}\n        <div style={{\n          position: \"absolute\", inset: 0, borderRadius: \"50%\",\n          background:\n            \"radial-gradient(ellipse at 35% 30%, rgba(255,255,255,0.07) 0%, transparent 60%)\",\n          pointerEvents: \"none\",\n        }} />\n\n        {/* Crosshairs */}\n        <div style={{ position: \"absolute\", top: \"50%\", left: 0, right: 0, height: 1, background: \"rgba(255,255,255,0.12)\", transform: \"translateY(-0.5px)\", pointerEvents: \"none\" }} />\n        <div style={{ position: \"absolute\", left: \"50%\", top: 0, bottom: 0, width: 1, background: \"rgba(255,255,255,0.12)\", transform: \"translateX(-0.5px)\", pointerEvents: \"none\" }} />\n\n        {/* Scale label */}\n        <div style={{\n          position: \"absolute\", bottom: 8, right: 10,\n          fontSize: 9, fontFamily: \"monospace\",\n          color: \"rgba(255,255,255,0.35)\",\n          letterSpacing: \"0.08em\",\n          pointerEvents: \"none\",\n        }}>\n          {scale}×\n        </div>\n      </div>\n    </>\n  )\n}\n","\"use client\"\n\nimport type React from \"react\"\nimport { useEffect, useRef } from \"react\"\n\ninterface CursorRevealProps {\n  children: React.ReactNode\n  /** Diameter of the reveal circle in px */\n  size?: number\n  /** Color of the overlay that hides content (use rgba) */\n  overlay?: string\n  /** Backdrop blur applied to hidden areas in px (0 = no blur) */\n  blur?: number\n  className?: string\n  style?: React.CSSProperties\n}\n\n/**\n * Wraps content with a dark overlay. Moving the cursor over it\n * cuts a circular hole in the overlay, revealing what's beneath.\n */\nexport const CursorReveal: React.FC<CursorRevealProps> = ({\n  children,\n  size = 180,\n  overlay = \"rgba(9,9,11,0.92)\",\n  blur = 0,\n  className,\n  style,\n}) => {\n  const containerRef = useRef<HTMLDivElement>(null)\n  const overlayRef = useRef<HTMLDivElement>(null)\n\n  useEffect(() => {\n    const container = containerRef.current\n    const overlayEl = overlayRef.current\n    if (!container || !overlayEl) return\n\n    const r = size / 2\n\n    const onMove = (e: MouseEvent) => {\n      const rect = container.getBoundingClientRect()\n      const x = e.clientX - rect.left\n      const y = e.clientY - rect.top\n      const mask = `radial-gradient(circle ${r}px at ${x}px ${y}px, transparent 0%, black ${r}px)`\n      overlayEl.style.maskImage = mask\n      ;(overlayEl.style as any).webkitMaskImage = mask\n    }\n\n    const onLeave = () => {\n      overlayEl.style.maskImage = \"\"\n      ;(overlayEl.style as any).webkitMaskImage = \"\"\n    }\n\n    container.addEventListener(\"mousemove\", onMove, { passive: true })\n    container.addEventListener(\"mouseleave\", onLeave)\n\n    return () => {\n      container.removeEventListener(\"mousemove\", onMove)\n      container.removeEventListener(\"mouseleave\", onLeave)\n    }\n  }, [size])\n\n  return (\n    <div\n      ref={containerRef}\n      className={className}\n      style={{ position: \"relative\", overflow: \"hidden\", ...style }}\n    >\n      {children}\n      <div\n        ref={overlayRef}\n        aria-hidden=\"true\"\n        style={{\n          position: \"absolute\",\n          inset: 0,\n          background: overlay,\n          backdropFilter: blur ? `blur(${blur}px)` : undefined,\n          WebkitBackdropFilter: blur ? `blur(${blur}px)` : undefined,\n          pointerEvents: \"none\",\n        }}\n      />\n    </div>\n  )\n}\n","\"use client\"\n\nimport type React from \"react\"\nimport { useEffect, useRef } from \"react\"\nimport { mouseStore } from \"../mouseStore\"\n\ninterface CursorSpotlightProps {\n  /** Spotlight fill color (use rgba for transparency) */\n  color?: string\n  /** Diameter of the spotlight in px */\n  size?: number\n  /** CSS z-index */\n  zIndex?: number\n  /** CSS mix-blend-mode */\n  blend?: React.CSSProperties[\"mixBlendMode\"]\n}\n\nexport const CursorSpotlight: React.FC<CursorSpotlightProps> = ({\n  color = \"rgba(255,255,255,0.06)\",\n  size = 400,\n  zIndex = 0,\n  blend = \"normal\",\n}) => {\n  const ref = useRef<HTMLDivElement>(null)\n\n  useEffect(() => {\n    const el = ref.current\n    if (!el) return\n    const r = size / 2\n\n    return mouseStore.subscribe((x, y) => {\n      el.style.background = `radial-gradient(circle at ${x}px ${y}px, ${color} 0px, transparent ${r}px)`\n    })\n  }, [color, size])\n\n  return (\n    <div\n      ref={ref}\n      aria-hidden=\"true\"\n      style={{\n        position: \"fixed\",\n        inset: 0,\n        pointerEvents: \"none\",\n        zIndex,\n        mixBlendMode: blend,\n        willChange: \"background\",\n      }}\n    />\n  )\n}\n","\"use client\"\n\nimport type { ComponentPropsWithoutRef, ElementType, ReactNode } from \"react\"\nimport { useCursor } from \"../hooks/useCursor\"\n\ntype OwnProps<T extends ElementType> = {\n  as?: T\n  children: ReactNode\n  variant: string\n  onEnter?: () => void\n  onLeave?: () => void\n}\n\ntype CursorTargetProps<T extends ElementType = \"div\"> = OwnProps<T> &\n  Omit<ComponentPropsWithoutRef<T>, keyof OwnProps<T>>\n\nexport function CursorTarget<T extends ElementType = \"div\">({\n  as,\n  children,\n  variant,\n  onEnter,\n  onLeave,\n  ...rest\n}: CursorTargetProps<T>) {\n  const Component = (as ?? \"div\") as ElementType\n  const cursorHandlers = useCursor({ variant, onEnter, onLeave })\n\n  return (\n    <Component {...rest} {...cursorHandlers} data-cursor-variant={variant}>\n      {children}\n    </Component>\n  )\n}\n","\"use client\"\n\nimport type React from \"react\"\nimport { useEffect, useRef } from \"react\"\nimport { mouseStore } from \"../mouseStore\"\n\ntype TrailType = \"dots\" | \"line\" | \"glow\" | \"ink\" | \"spark\"\n\ninterface CursorTrailProps {\n  /** Number of trail points (dots/line/glow) */\n  count?: number\n  /** CSS color string */\n  color?: string\n  /** Dot diameter / line width in px */\n  size?: number\n  /** z-index */\n  zIndex?: number\n  /**\n   * \"dots\"  — fading circles (default)\n   * \"line\"  — tapered Bézier brushstroke\n   * \"glow\"  — soft radial-gradient halos\n   * \"ink\"   — positions accumulate and fade over `fadeTime` ms\n   * \"spark\" — each position spawns a drifting particle\n   */\n  type?: TrailType\n  /** For \"ink\": ms before strokes fade out (default 1800) */\n  fadeTime?: number\n  /** For \"spark\": initial particle spread velocity in px/s (default 60) */\n  spread?: number\n}\n\nexport const CursorTrail: React.FC<CursorTrailProps> = ({\n  count = 12,\n  color = \"rgba(255,255,255,0.6)\",\n  size = 8,\n  zIndex = 9998,\n  type = \"dots\",\n  fadeTime = 1800,\n  spread = 60,\n}) => {\n  const canvasRef = useRef<HTMLCanvasElement>(null)\n  const positionsRef = useRef<{ x: number; y: number }[]>([])\n  const rafRef = useRef<number | null>(null)\n\n  useEffect(() => {\n    const canvas = canvasRef.current\n    if (!canvas) return\n    const ctx = canvas.getContext(\"2d\")\n    if (!ctx) return\n\n    const resize = () => {\n      canvas.width = window.innerWidth\n      canvas.height = window.innerHeight\n    }\n    resize()\n    window.addEventListener(\"resize\", resize, { passive: true })\n\n    let cleanup: (() => void) | undefined\n\n    // ── dots / line / glow — only redraw when positions change (dirty flag) ──\n    if (type === \"dots\" || type === \"line\" || type === \"glow\") {\n      let dirty = false\n\n      const draw = () => {\n        if (dirty) {\n          ctx.clearRect(0, 0, canvas.width, canvas.height)\n          const pts = positionsRef.current\n          if (pts.length > 0) {\n            if (type === \"dots\") drawDots(ctx, pts, color, size)\n            else if (type === \"line\") drawLine(ctx, pts, color, size)\n            else drawGlow(ctx, pts, color, size)\n          }\n          dirty = false\n          // Schedule one more frame so the next dirty check can halt cleanly\n          rafRef.current = requestAnimationFrame(draw)\n        } else {\n          // Nothing changed — idle. Canvas retains last drawn state.\n          rafRef.current = null\n        }\n      }\n\n      const unsub = mouseStore.subscribe((x, y) => {\n        positionsRef.current = [{ x, y }, ...positionsRef.current.slice(0, count - 1)]\n        dirty = true\n        // Wake the RAF only when it has stopped\n        if (rafRef.current === null) {\n          rafRef.current = requestAnimationFrame(draw)\n        }\n      })\n\n      cleanup = unsub\n    }\n\n    // ── ink — fade over time; RAF runs only while ink remains ────────────────\n    if (type === \"ink\") {\n      type InkPoint = { x: number; y: number; born: number }\n      const ink: InkPoint[] = []\n\n      const draw = (time: number) => {\n        ctx.clearRect(0, 0, canvas.width, canvas.height)\n        while (ink.length && time - ink[0].born > fadeTime) ink.shift()\n\n        if (ink.length >= 2) {\n          ctx.lineCap = \"round\"\n          ctx.lineJoin = \"round\"\n\n          const GAP_MS = 80\n          let segStart = 0\n          for (let i = 1; i <= ink.length; i++) {\n            const atEnd = i === ink.length\n            const hasGap = !atEnd && ink[i].born - ink[i - 1].born > GAP_MS\n\n            if (atEnd || hasGap) {\n              const pts = ink.slice(segStart, i)\n              if (pts.length >= 2) {\n                const age = time - pts[0].born\n                const alpha = Math.pow(Math.max(0, 1 - age / fadeTime), 1.5)\n\n                ctx.beginPath()\n                ctx.moveTo(pts[0].x, pts[0].y)\n                for (let j = 1; j < pts.length - 1; j++) {\n                  const mx = (pts[j].x + pts[j + 1].x) / 2\n                  const my = (pts[j].y + pts[j + 1].y) / 2\n                  ctx.quadraticCurveTo(pts[j].x, pts[j].y, mx, my)\n                }\n                ctx.lineTo(pts[pts.length - 1].x, pts[pts.length - 1].y)\n\n                ctx.strokeStyle = color\n                ctx.lineWidth = Math.max(size * 0.85, 1)\n                ctx.globalAlpha = alpha\n                ctx.stroke()\n              }\n              segStart = i\n            }\n          }\n        }\n\n        ctx.globalAlpha = 1\n        // Keep running only while there is ink left to fade\n        if (ink.length > 0) {\n          rafRef.current = requestAnimationFrame(draw)\n        } else {\n          rafRef.current = null\n        }\n      }\n\n      const unsub = mouseStore.subscribe((x, y) => {\n        ink.push({ x, y, born: performance.now() })\n        if (rafRef.current === null) {\n          rafRef.current = requestAnimationFrame(draw)\n        }\n      })\n\n      cleanup = unsub\n    }\n\n    // ── spark — physics simulation; RAF runs only while sparks are alive ──────\n    if (type === \"spark\") {\n      type Spark = { x: number; y: number; vx: number; vy: number; born: number }\n      const sparks: Spark[] = []\n      let lastTime = performance.now()\n      const LIFETIME = fadeTime\n      const GRAVITY = 120\n\n      const draw = (time: number) => {\n        const dt = Math.min((time - lastTime) / 1000, 0.05)\n        lastTime = time\n        ctx.clearRect(0, 0, canvas.width, canvas.height)\n\n        for (let i = sparks.length - 1; i >= 0; i--) {\n          const s = sparks[i]\n          const age = time - s.born\n          if (age > LIFETIME) { sparks.splice(i, 1); continue }\n\n          s.x += s.vx * dt\n          s.y += s.vy * dt\n          s.vy += GRAVITY * dt\n\n          const t = 1 - age / LIFETIME\n          const r = Math.max(size * t * 0.45, 0.5)\n          ctx.beginPath()\n          ctx.arc(s.x, s.y, r, 0, Math.PI * 2)\n          ctx.fillStyle = color\n          ctx.globalAlpha = t\n          ctx.fill()\n        }\n        ctx.globalAlpha = 1\n\n        if (sparks.length > 0) {\n          rafRef.current = requestAnimationFrame(draw)\n        } else {\n          rafRef.current = null\n        }\n      }\n\n      const unsub = mouseStore.subscribe((x, y) => {\n        const angle = Math.random() * Math.PI * 2\n        sparks.push({\n          x, y,\n          vx: Math.cos(angle) * spread * (0.5 + Math.random()),\n          vy: Math.sin(angle) * spread * (0.5 + Math.random()) - spread * 0.4,\n          born: performance.now(),\n        })\n        if (rafRef.current === null) {\n          rafRef.current = requestAnimationFrame(draw)\n        }\n      })\n\n      cleanup = unsub\n    }\n\n    return () => {\n      window.removeEventListener(\"resize\", resize)\n      cleanup?.()\n      if (rafRef.current !== null) cancelAnimationFrame(rafRef.current)\n    }\n  }, [color, count, size, type, fadeTime, spread])\n\n  return (\n    <canvas\n      ref={canvasRef}\n      aria-hidden=\"true\"\n      style={{ position: \"fixed\", top: 0, left: 0, pointerEvents: \"none\", zIndex }}\n    />\n  )\n}\n\n// ─── draw modes ───────────────────────────────────────────────────────────────\n\nfunction drawDots(ctx: CanvasRenderingContext2D, pts: { x: number; y: number }[], color: string, size: number) {\n  for (let i = 0; i < pts.length; i++) {\n    const t = 1 - i / pts.length\n    ctx.beginPath()\n    ctx.arc(pts[i].x, pts[i].y, Math.max(size * t * 0.5, 0.5), 0, Math.PI * 2)\n    ctx.fillStyle = color\n    ctx.globalAlpha = t\n    ctx.fill()\n  }\n  ctx.globalAlpha = 1\n}\n\nfunction drawLine(ctx: CanvasRenderingContext2D, pts: { x: number; y: number }[], color: string, size: number) {\n  if (pts.length < 2) return\n  for (let i = 0; i < pts.length - 1; i++) {\n    const t = 1 - i / pts.length\n    ctx.beginPath()\n    ctx.moveTo(pts[i].x, pts[i].y)\n    if (i < pts.length - 2) {\n      const mx = (pts[i + 1].x + pts[i + 2].x) / 2\n      const my = (pts[i + 1].y + pts[i + 2].y) / 2\n      ctx.quadraticCurveTo(pts[i + 1].x, pts[i + 1].y, mx, my)\n    } else {\n      ctx.lineTo(pts[i + 1].x, pts[i + 1].y)\n    }\n    ctx.strokeStyle = color\n    ctx.globalAlpha = t\n    ctx.lineWidth = Math.max(size * t, 0.5)\n    ctx.lineCap = \"round\"\n    ctx.lineJoin = \"round\"\n    ctx.stroke()\n  }\n  ctx.globalAlpha = 1\n}\n\nfunction drawGlow(ctx: CanvasRenderingContext2D, pts: { x: number; y: number }[], color: string, size: number) {\n  for (let i = 0; i < pts.length; i++) {\n    const t = 1 - i / pts.length\n    const r = Math.max(size * t * 2, 0.5)\n    const { x, y } = pts[i]\n    const grad = ctx.createRadialGradient(x, y, 0, x, y, r)\n    grad.addColorStop(0, color)\n    grad.addColorStop(1, \"rgba(0,0,0,0)\")\n    ctx.beginPath()\n    ctx.arc(x, y, r, 0, Math.PI * 2)\n    ctx.fillStyle = grad\n    ctx.globalAlpha = t\n    ctx.fill()\n  }\n  ctx.globalAlpha = 1\n}\n","/**\n * Programmatically trigger a cursor visual effect at any screen position\n * without requiring an actual user interaction.\n *\n * CursorClickEffect automatically listens for the `cursor:click` custom event\n * fired by this function, so any mounted CursorClickEffect will react to it.\n *\n * @example\n * // Trigger the current click effect at the screen centre\n * emitCursorEvent(\"click\", { x: window.innerWidth / 2, y: window.innerHeight / 2 })\n *\n * // Trigger at a specific element's centre\n * const rect = buttonRef.current.getBoundingClientRect()\n * emitCursorEvent(\"click\", { x: rect.left + rect.width / 2, y: rect.top + rect.height / 2 })\n */\nexport function emitCursorEvent(\n  type: \"click\",\n  options: { x?: number; y?: number } = {},\n): void {\n  if (typeof window === \"undefined\") return\n  const x = options.x ?? window.innerWidth / 2\n  const y = options.y ?? window.innerHeight / 2\n  window.dispatchEvent(new CustomEvent(\"cursor:click\", { detail: { x, y } }))\n}\n","import type { CursorConfig } from \"./types\"\n\nexport const themes: Record<\"minimal\" | \"neon\" | \"glassmorphism\" | \"brutalist\", CursorConfig> = {\n\n  // ── Minimal ──────────────────────────────────────────────────────────────────\n  // Hairline borders, tiny dot, near-invisible — designed to disappear.\n  minimal: {\n    default: {\n      width: 6, height: 6,\n      shape: \"circle\",\n      color: \"rgba(255,255,255,0.9)\",\n      transition: { stiffness: 1100, damping: 95, mass: 0.6 },\n    },\n    link: {\n      width: 36, height: 36,\n      shape: \"circle\",\n      color: \"transparent\",\n      borderColor: \"rgba(255,255,255,0.45)\",\n      borderWidth: 1,\n      transition: { stiffness: 440, damping: 40, mass: 0.9 },\n    },\n    button: {\n      width: 46, height: 46,\n      shape: \"circle\",\n      color: \"transparent\",\n      borderColor: \"rgba(255,255,255,0.35)\",\n      borderWidth: 1,\n      label: \"click\",\n      fontSize: \"9px\",\n      labelColor: \"rgba(255,255,255,0.55)\",\n      transition: { stiffness: 440, damping: 40, mass: 0.9 },\n    },\n    text: {\n      width: 1.5, height: 24,\n      shape: \"square\", borderRadius: 1,\n      color: \"rgba(255,255,255,0.75)\",\n      transition: { stiffness: 1400, damping: 110, mass: 0.5 },\n    },\n    view: {\n      width: 68, height: 68,\n      shape: \"circle\",\n      color: \"transparent\",\n      borderColor: \"rgba(255,255,255,0.25)\",\n      borderWidth: 1,\n      label: \"view\",\n      fontSize: \"10px\",\n      labelColor: \"rgba(255,255,255,0.5)\",\n      transition: { stiffness: 200, damping: 24, mass: 1.6 },\n    },\n    drag: {\n      width: 56, height: 56,\n      shape: \"circle\",\n      color: \"transparent\",\n      borderColor: \"rgba(255,255,255,0.35)\",\n      borderWidth: 1,\n      label: \"drag\",\n      fontSize: \"9px\",\n      labelColor: \"rgba(255,255,255,0.5)\",\n      transition: { stiffness: 280, damping: 30, mass: 1.2 },\n    },\n    close: {\n      width: 36, height: 36,\n      shape: \"circle\",\n      color: \"transparent\",\n      borderColor: \"rgba(255,255,255,0.4)\",\n      borderWidth: 1,\n      label: \"✕\",\n      fontSize: \"12px\",\n      labelColor: \"rgba(255,255,255,0.6)\",\n      transition: { stiffness: 700, damping: 55, mass: 0.8 },\n    },\n    spot: {\n      width: 110, height: 110,\n      shape: \"circle\",\n      color: \"rgba(255,255,255,0.03)\",\n      borderColor: \"rgba(255,255,255,0.08)\",\n      borderWidth: 1,\n      transition: { stiffness: 100, damping: 16, mass: 2.5 },\n    },\n  },\n\n  // ── Neon ─────────────────────────────────────────────────────────────────────\n  // Bright emissive colours on a dark background. Cyan default, magenta on hover.\n  neon: {\n    default: {\n      width: 10, height: 10,\n      shape: \"circle\",\n      color: \"#00ffff\",\n      opacity: 0.9,\n      transition: { stiffness: 900, damping: 80, mass: 0.7 },\n    },\n    link: {\n      width: 48, height: 48,\n      shape: \"circle\",\n      color: \"rgba(0,255,255,0.06)\",\n      borderColor: \"#00ffff\",\n      borderWidth: 1.5,\n      transition: { stiffness: 360, damping: 36, mass: 1 },\n    },\n    button: {\n      width: 56, height: 56,\n      shape: \"circle\",\n      color: \"rgba(255,0,255,0.08)\",\n      borderColor: \"#ff00ff\",\n      borderWidth: 1.5,\n      label: \"click\",\n      fontSize: \"10px\",\n      labelColor: \"#ff00ff\",\n      transition: { stiffness: 380, damping: 38, mass: 1 },\n    },\n    text: {\n      width: 2, height: 28,\n      shape: \"square\",\n      color: \"#00ffff\",\n      transition: { stiffness: 1400, damping: 110, mass: 0.5 },\n    },\n    view: {\n      width: 80, height: 80,\n      shape: \"circle\",\n      color: \"rgba(0,255,255,0.04)\",\n      borderColor: \"rgba(0,255,255,0.6)\",\n      borderWidth: 1.5,\n      label: \"view\",\n      fontSize: \"11px\",\n      labelColor: \"#00ffff\",\n      transition: { stiffness: 200, damping: 24, mass: 1.8 },\n    },\n    drag: {\n      width: 58, height: 58,\n      shape: \"circle\",\n      color: \"rgba(0,255,128,0.08)\",\n      borderColor: \"#00ff80\",\n      borderWidth: 1.5,\n      label: \"drag\",\n      fontSize: \"10px\",\n      labelColor: \"#00ff80\",\n      transition: { stiffness: 280, damping: 30, mass: 1.2 },\n    },\n    close: {\n      width: 48, height: 48,\n      shape: \"circle\",\n      color: \"rgba(255,0,80,0.12)\",\n      borderColor: \"#ff0050\",\n      borderWidth: 1.5,\n      label: \"✕\",\n      fontSize: \"14px\",\n      labelColor: \"#ff0050\",\n      transition: { stiffness: 650, damping: 52, mass: 0.8 },\n    },\n    invert: {\n      width: 56, height: 56,\n      shape: \"circle\",\n      color: \"rgba(255,0,255,1)\",\n      mixBlendMode: \"difference\",\n      transition: { stiffness: 520, damping: 46, mass: 0.8 },\n    },\n    spot: {\n      width: 130, height: 130,\n      shape: \"circle\",\n      color: \"rgba(0,255,255,0.04)\",\n      borderColor: \"rgba(0,255,255,0.1)\",\n      borderWidth: 1,\n      transition: { stiffness: 100, damping: 14, mass: 2.8 },\n    },\n    square: {\n      width: 38, height: 38,\n      shape: \"square\", borderRadius: 4,\n      color: \"rgba(255,255,0,0.15)\",\n      borderColor: \"#ffff00\",\n      borderWidth: 1.5,\n      transition: { stiffness: 520, damping: 46, mass: 0.8 },\n    },\n  },\n\n  // ── Glassmorphism ────────────────────────────────────────────────────────────\n  // Translucent frosted look: soft borders, muted fill, slow spring.\n  glassmorphism: {\n    default: {\n      width: 14, height: 14,\n      shape: \"circle\",\n      color: \"rgba(255,255,255,0.55)\",\n      borderColor: \"rgba(255,255,255,0.35)\",\n      borderWidth: 1,\n      transition: { stiffness: 780, damping: 72, mass: 0.85 },\n    },\n    link: {\n      width: 52, height: 52,\n      shape: \"circle\",\n      color: \"rgba(255,255,255,0.08)\",\n      borderColor: \"rgba(255,255,255,0.38)\",\n      borderWidth: 1,\n      transition: { stiffness: 320, damping: 32, mass: 1.3 },\n    },\n    button: {\n      width: 64, height: 64,\n      shape: \"circle\",\n      color: \"rgba(255,255,255,0.1)\",\n      borderColor: \"rgba(255,255,255,0.42)\",\n      borderWidth: 1,\n      label: \"click\",\n      fontSize: \"10px\",\n      labelColor: \"rgba(255,255,255,0.65)\",\n      transition: { stiffness: 340, damping: 34, mass: 1.3 },\n    },\n    text: {\n      width: 2, height: 28,\n      shape: \"square\",\n      color: \"rgba(255,255,255,0.65)\",\n      transition: { stiffness: 1400, damping: 110, mass: 0.5 },\n    },\n    view: {\n      width: 82, height: 82,\n      shape: \"circle\",\n      color: \"rgba(255,255,255,0.06)\",\n      borderColor: \"rgba(255,255,255,0.28)\",\n      borderWidth: 1,\n      label: \"view\",\n      fontSize: \"11px\",\n      labelColor: \"rgba(255,255,255,0.58)\",\n      transition: { stiffness: 190, damping: 22, mass: 1.9 },\n    },\n    drag: {\n      width: 62, height: 62,\n      shape: \"circle\",\n      color: \"rgba(255,255,255,0.08)\",\n      borderColor: \"rgba(255,255,255,0.32)\",\n      borderWidth: 1,\n      label: \"drag\",\n      fontSize: \"10px\",\n      labelColor: \"rgba(255,255,255,0.6)\",\n      transition: { stiffness: 270, damping: 28, mass: 1.3 },\n    },\n    close: {\n      width: 46, height: 46,\n      shape: \"circle\",\n      color: \"rgba(255,120,120,0.1)\",\n      borderColor: \"rgba(255,120,120,0.45)\",\n      borderWidth: 1,\n      label: \"✕\",\n      fontSize: \"14px\",\n      labelColor: \"rgba(255,120,120,0.85)\",\n      transition: { stiffness: 650, damping: 52, mass: 0.8 },\n    },\n    invert: {\n      width: 58, height: 58,\n      shape: \"circle\",\n      color: \"rgba(255,255,255,1)\",\n      mixBlendMode: \"difference\",\n      transition: { stiffness: 500, damping: 44, mass: 0.9 },\n    },\n    spot: {\n      width: 130, height: 130,\n      shape: \"circle\",\n      color: \"rgba(255,255,255,0.04)\",\n      borderColor: \"rgba(255,255,255,0.1)\",\n      borderWidth: 1,\n      transition: { stiffness: 110, damping: 16, mass: 2.6 },\n    },\n    square: {\n      width: 40, height: 40,\n      shape: \"square\", borderRadius: 8,\n      color: \"rgba(255,255,255,0.1)\",\n      borderColor: \"rgba(255,255,255,0.35)\",\n      borderWidth: 1,\n      transition: { stiffness: 500, damping: 44, mass: 0.9 },\n    },\n  },\n\n  // ── Brutalist ────────────────────────────────────────────────────────────────\n  // Hard edges, zero rounding, high contrast. The cursor as a design statement.\n  brutalist: {\n    default: {\n      width: 8, height: 8,\n      shape: \"square\",\n      color: \"#ffffff\",\n      transition: { stiffness: 2200, damping: 160, mass: 0.45 },\n    },\n    link: {\n      width: 40, height: 40,\n      shape: \"square\",\n      color: \"#ffffff\",\n      mixBlendMode: \"difference\",\n      transition: { stiffness: 1400, damping: 100, mass: 0.6 },\n    },\n    button: {\n      width: 72, height: 10,\n      shape: \"square\",\n      color: \"#ffffff\",\n      label: \"CLICK\",\n      fontSize: \"8px\",\n      fontWeight: \"900\",\n      labelColor: \"#000000\",\n      transition: { stiffness: 1400, damping: 100, mass: 0.6 },\n    },\n    text: {\n      width: 2, height: 24,\n      shape: \"square\",\n      color: \"#ffffff\",\n      transition: { stiffness: 2200, damping: 160, mass: 0.4 },\n    },\n    view: {\n      width: 64, height: 64,\n      shape: \"square\",\n      color: \"transparent\",\n      borderColor: \"#ffffff\",\n      borderWidth: 2,\n      label: \"VIEW\",\n      fontSize: \"9px\",\n      fontWeight: \"800\",\n      labelColor: \"#ffffff\",\n      transition: { stiffness: 1000, damping: 75, mass: 0.8 },\n    },\n    drag: {\n      width: 12, height: 52,\n      shape: \"square\",\n      color: \"#00ff00\",\n      transition: { stiffness: 1400, damping: 100, mass: 0.6 },\n    },\n    close: {\n      width: 36, height: 36,\n      shape: \"square\",\n      color: \"#ff0000\",\n      label: \"✕\",\n      fontSize: \"16px\",\n      fontWeight: \"900\",\n      labelColor: \"#ffffff\",\n      transition: { stiffness: 1400, damping: 100, mass: 0.6 },\n    },\n    spot: {\n      width: 100, height: 100,\n      shape: \"square\",\n      color: \"transparent\",\n      borderColor: \"rgba(255,255,255,0.2)\",\n      borderWidth: 2,\n      transition: { stiffness: 120, damping: 18, mass: 2.5 },\n    },\n    square: {\n      width: 38, height: 38,\n      shape: \"square\",\n      color: \"#ffff00\",\n      transition: { stiffness: 1400, damping: 100, mass: 0.6 },\n    },\n    invert: {\n      width: 48, height: 48,\n      shape: \"square\",\n      color: \"#ffffff\",\n      mixBlendMode: \"difference\",\n      transition: { stiffness: 1400, damping: 100, mass: 0.6 },\n    },\n  },\n}\n","\"use client\"\n\nimport { useEffect, useRef } from \"react\"\nimport { useCursorContext } from \"../components/CursorProvider\"\nimport { mouseStore } from \"../mouseStore\"\n\ninterface UseCursorIdleOptions {\n  /** Milliseconds of no movement before idle triggers (default 2000) */\n  timeout?: number\n  /** Cursor variant to activate on idle (default \"spot\") */\n  variant?: string\n  /** Called when idle state starts */\n  onIdle?: () => void\n  /** Called when cursor movement resumes */\n  onWake?: () => void\n}\n\n/**\n * Switches to a different cursor variant when the cursor hasn't moved\n * for `timeout` ms. Reverts when movement resumes.\n */\nexport const useCursorIdle = ({\n  timeout = 2000,\n  variant = \"spot\",\n  onIdle,\n  onWake,\n}: UseCursorIdleOptions = {}) => {\n  const { setCursorVariant } = useCursorContext()\n\n  const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n  const idleRef = useRef(false)\n  const onIdleRef = useRef(onIdle)\n  const onWakeRef = useRef(onWake)\n\n  useEffect(() => { onIdleRef.current = onIdle }, [onIdle])\n  useEffect(() => { onWakeRef.current = onWake }, [onWake])\n\n  useEffect(() => {\n    const arm = () => {\n      if (timerRef.current) clearTimeout(timerRef.current)\n\n      if (idleRef.current) {\n        idleRef.current = false\n        setCursorVariant(\"\", \"pop\")\n        onWakeRef.current?.()\n      }\n\n      timerRef.current = setTimeout(() => {\n        idleRef.current = true\n        setCursorVariant(variant, \"push\")\n        onIdleRef.current?.()\n      }, timeout)\n    }\n\n    // mouseStore replaces the direct window.mousemove listener —\n    // no duplicate event handler alongside the other subscribers.\n    const unsub = mouseStore.subscribe(arm)\n    arm() // arm immediately so idle can fire even without mouse movement\n\n    return () => {\n      unsub()\n      if (timerRef.current) clearTimeout(timerRef.current)\n      if (idleRef.current) {\n        idleRef.current = false\n        setCursorVariant(\"\", \"pop\")\n      }\n    }\n  }, [timeout, variant, setCursorVariant])\n  // setCursorVariant is now stable (useCallback in CursorProvider) — this\n  // effect runs only when timeout or variant actually changes, not every frame.\n}\n","\"use client\"\r\n\r\nimport { useCallback } from 'react';\r\nimport { useCursorContext } from '../components/CursorProvider';\r\n\r\nexport const useCursorVariant = () => {\r\n  const { setCursorVariant, resetCursorToDefault, setGlobalCursorVariant, clearGlobalCursorVariant } = useCursorContext();\r\n\r\n  const setVariant = useCallback((variant: string) => {\r\n    setCursorVariant(variant, 'push');\r\n  }, [setCursorVariant]);\r\n\r\n  const resetVariant = useCallback(() => {\r\n    resetCursorToDefault();\r\n  }, [resetCursorToDefault]);\r\n  \r\n  const setGlobalVariant = useCallback((variant: string) => {\r\n    setGlobalCursorVariant?.(variant);\r\n  }, [setGlobalCursorVariant]);\r\n\r\n  const clearGlobalVariant = useCallback(() => {\r\n    clearGlobalCursorVariant?.();\r\n  }, [clearGlobalCursorVariant]);\r\n\r\n  return {\r\n    setVariant,\r\n    resetVariant,\r\n    setGlobalVariant,\r\n    clearGlobalVariant,\r\n  };\r\n};","\"use client\"\n\nimport { useEffect, useRef } from \"react\"\nimport { useCursorContext } from \"../components/CursorProvider\"\n\ninterface UseCursorZoneOptions {\n  /** Cursor variant to activate when this zone is in view */\n  variant: string\n  /**\n   * IntersectionObserver threshold (0–1).\n   * 0 = triggers as soon as any pixel is visible.\n   * 0.5 = triggers when 50% of the element is visible (default).\n   */\n  threshold?: number\n}\n\n/**\n * Returns a ref to attach to any element. When that element scrolls into the\n * viewport past `threshold`, the cursor variant switches automatically.\n */\nexport function useCursorZone<T extends HTMLElement = HTMLDivElement>({\n  variant,\n  threshold = 0.5,\n}: UseCursorZoneOptions) {\n  const ref = useRef<T>(null)\n  const { setCursorVariant } = useCursorContext()\n  const activeRef = useRef(false)\n\n  useEffect(() => {\n    const el = ref.current\n    if (!el) return\n\n    const observer = new IntersectionObserver(\n      ([entry]) => {\n        if (entry.isIntersecting && !activeRef.current) {\n          activeRef.current = true\n          setCursorVariant(variant, \"push\")\n        } else if (!entry.isIntersecting && activeRef.current) {\n          activeRef.current = false\n          setCursorVariant(\"\", \"pop\")\n        }\n      },\n      { threshold },\n    )\n\n    observer.observe(el)\n\n    return () => {\n      observer.disconnect()\n      if (activeRef.current) {\n        activeRef.current = false\n        setCursorVariant(\"\", \"pop\")\n      }\n    }\n  }, [variant, threshold, setCursorVariant])\n\n  return ref\n}\n","\"use client\"\n\nimport { useEffect, useRef } from \"react\"\nimport { mouseStore } from \"../mouseStore\"\n\ninterface UseMagneticOptions {\n  /** Pull strength: 0 = no pull, 1 = cursor snaps to element center */\n  strength?: number\n  /** Distance in px at which the pull begins */\n  distance?: number\n}\n\n/**\n * Attaches a magnetic pull effect to an element: when the cursor comes within\n * `distance` pixels of the element's center, the element shifts toward the cursor.\n *\n * Uses the shared mouseStore — zero React re-renders in the hot path.\n *\n * Usage:\n *   const ref = useMagnetic<HTMLButtonElement>()\n *   return <button ref={ref}>Hover me</button>\n */\nexport function useMagnetic<T extends HTMLElement = HTMLElement>({\n  strength = 0.35,\n  distance = 80,\n}: UseMagneticOptions = {}) {\n  const ref = useRef<T>(null)\n\n  useEffect(() => {\n    const el = ref.current\n    if (!el) return\n\n    const unsub = mouseStore.subscribe((x, y) => {\n      const rect = el.getBoundingClientRect()\n      const centerX = rect.left + rect.width / 2\n      const centerY = rect.top + rect.height / 2\n      const dx = x - centerX\n      const dy = y - centerY\n      const dist = Math.sqrt(dx * dx + dy * dy)\n\n      if (dist < distance) {\n        const pull = (1 - dist / distance) * strength\n        el.style.transform = `translate(${dx * pull}px, ${dy * pull}px)`\n        el.style.transition = \"transform 0.08s linear\"\n      } else {\n        el.style.transform = \"translate(0px, 0px)\"\n        el.style.transition = \"transform 0.4s ease\"\n      }\n    })\n\n    return () => {\n      unsub()\n      if (ref.current) {\n        ref.current.style.transform = \"\"\n        ref.current.style.transition = \"\"\n      }\n    }\n  }, [strength, distance])\n\n  return ref\n}\n","\"use client\"\n\nimport { useState, useEffect, useRef } from \"react\"\nimport type { MousePosition } from \"../types\"\nimport { mouseStore } from \"../mouseStore\"\n\n/**\n * Returns a live-updating mouse position that re-renders the consumer on every\n * animation frame (RAF-throttled). Uses the shared mouseStore singleton, so no\n * additional window.mousemove listener is added.\n *\n * For zero-render position access, read mouseStore.x / mouseStore.y directly.\n */\nexport const useMousePosition = () => {\n  const [mousePosition, setMousePosition] = useState<MousePosition>({ x: 0, y: 0 })\n  const rafRef = useRef<number | null>(null)\n\n  useEffect(() => {\n    return mouseStore.subscribe(() => {\n      if (rafRef.current === null) {\n        rafRef.current = requestAnimationFrame(() => {\n          setMousePosition({ x: mouseStore.x, y: mouseStore.y })\n          rafRef.current = null\n        })\n      }\n    })\n  }, [])\n\n  return typeof window !== \"undefined\" ? mousePosition : { x: 0, y: 0 }\n}\n","\"use client\"\n\nimport { useEffect, useRef, useState } from \"react\"\nimport { mouseStore } from \"../mouseStore\"\n\nexport interface VelocityState {\n  /** Smoothed cursor speed in px/s */\n  speed: number\n  /** Direction of travel in degrees (0 = right, 90 = down, -90 = up) */\n  angle: number\n  /** Horizontal velocity component in px/s */\n  vx: number\n  /** Vertical velocity component in px/s */\n  vy: number\n  /** True when speed exceeds idleThreshold */\n  isMoving: boolean\n}\n\n/**\n * Returns smoothed cursor velocity updated every animation frame.\n * Uses an exponential moving average so values don't jitter on every mouse event.\n * The RAF loop self-suspends after ~3s of inactivity and wakes on the next move.\n *\n * @param idleThreshold - px/s below which `isMoving` becomes false (default 50)\n */\nexport function useVelocityCursor({ idleThreshold = 50 }: { idleThreshold?: number } = {}): VelocityState {\n  const [state, setState] = useState<VelocityState>({ speed: 0, angle: 0, vx: 0, vy: 0, isMoving: false })\n\n  const rawRef = useRef({ vx: 0, vy: 0, lastX: 0, lastY: 0, lastTime: 0 })\n  const smoothRef = useRef({ vx: 0, vy: 0 })\n  const rafIdRef = useRef(0)\n\n  useEffect(() => {\n    rawRef.current.lastTime = performance.now()\n\n    const EMA = 0.12\n    // Suspend after this many consecutive near-zero frames (~3s at 60fps)\n    const IDLE_FRAMES = 180\n    let consecutiveIdle = 0\n\n    const tick = () => {\n      const now = performance.now()\n      if (now - rawRef.current.lastTime > 60) {\n        rawRef.current.vx *= 0.8\n        rawRef.current.vy *= 0.8\n      }\n\n      const s = smoothRef.current\n      s.vx += (rawRef.current.vx - s.vx) * EMA\n      s.vy += (rawRef.current.vy - s.vy) * EMA\n\n      const speed = Math.sqrt(s.vx * s.vx + s.vy * s.vy)\n      const angle = speed > 1 ? Math.atan2(s.vy, s.vx) * (180 / Math.PI) : 0\n\n      setState(prev => {\n        const isMoving = speed > idleThreshold\n        if (Math.abs(prev.speed - speed) < 1 && prev.isMoving === isMoving) return prev\n        return { speed: Math.round(speed), angle: Math.round(angle), vx: Math.round(s.vx), vy: Math.round(s.vy), isMoving }\n      })\n\n      if (speed < 1) {\n        consecutiveIdle++\n        if (consecutiveIdle >= IDLE_FRAMES) {\n          // Velocity fully decayed — suspend until next mouse movement\n          rafIdRef.current = 0\n          return\n        }\n      } else {\n        consecutiveIdle = 0\n      }\n\n      rafIdRef.current = requestAnimationFrame(tick)\n    }\n\n    const unsub = mouseStore.subscribe((x, y) => {\n      const now = performance.now()\n      const dt = Math.max((now - rawRef.current.lastTime) / 1000, 0.001)\n      rawRef.current.vx = (x - rawRef.current.lastX) / dt\n      rawRef.current.vy = (y - rawRef.current.lastY) / dt\n      rawRef.current.lastX = x\n      rawRef.current.lastY = y\n      rawRef.current.lastTime = now\n\n      // Wake the RAF if it suspended\n      if (rafIdRef.current === 0) {\n        consecutiveIdle = 0\n        rafIdRef.current = requestAnimationFrame(tick)\n      }\n    })\n\n    rafIdRef.current = requestAnimationFrame(tick)\n\n    return () => {\n      unsub()\n      if (rafIdRef.current !== 0) cancelAnimationFrame(rafIdRef.current)\n    }\n  }, [idleThreshold])\n\n  return state\n}\n"],"names":["_x","_y","_initialized","_subs","Set","mouseStore","x","y","subscribe","fn","window","addEventListener","e","clientX","clientY","size","forEach","passive","add","delete","defaultCursorConfig","default","width","height","scale","shape","color","opacity","borderColor","borderWidth","borderStyle","label","fontSize","fontWeight","labelColor","transition","stiffness","damping","mass","CursorContext","createContext","cursorState","Object","assign","variant","setCursorVariant","config","mousePosition","resetCursorToDefault","setGlobalCursorVariant","clearGlobalCursorVariant","useCursorContext","useContext","stepSpring","pos","vel","target","dt","acc","SuppressedError","useCursor","onEnter","onLeave","isActiveRef","useRef","onMouseEnter","current","onMouseLeave","onFocus","onBlur","TAU","Math","PI","DEFAULT_PALETTE","zIndex","showOnTouch","trailLength","elongate","isVisible","setIsVisible","useState","isTouchDevice","setIsTouchDevice","reducedMotion","setReducedMotion","outerRef","positionHistoryRef","springRef","vx","vy","targetRef","rafRef","lastTimeRef","springConfigRef","reducedMotionRef","elongateRef","lastAngleRef","cursorShapeRef","innerRefsRef","useEffect","_a","_b","_c","_d","_e","_f","slice","animate","time","style","transform","min","tx","ty","MAX_SUB_DT","steps","max","ceil","subDt","nx","nvx","ny","nvy","i","speed","sqrt","elong","comp","atan2","innerDivs","length","cur","el","delayed","ox","oy","requestAnimationFrame","cancelAnimationFrame","touchMQ","matchMedia","matches","motionMQ","onMotionChange","timer","setTimeout","removeEventListener","clearTimeout","mixBlendMode","customElement","innerElements","borderRadius","customBorderRadius","bgColor","shapeTransition","_jsx","ref","position","left","top","pointerEvents","willChange","transformOrigin","children","_jsxs","backgroundColor","display","justifyContent","alignItems","textAlign","userSelect","whiteSpace","map","item","index","element","duration","strokeWidth","type","particleCount","palette","canvasRef","effectsRef","idRef","canvas","ctx","getContext","resize","innerWidth","innerHeight","effectivePalette","clearRect","filter","effect","elapsed","startTime","progress","r","pow","beginPath","arc","strokeStyle","globalAlpha","lineWidth","stroke","drawRipple","eased","fillStyle","particles","p","dist","speedMult","cos","angle","sin","fill","drawBurst","lineCap","x1","y1","x2","y2","moveTo","lineTo","drawSparkle","p1","DELAY","p2","drawShockwave","t","vx0","vy0","drag","exp","alpha","rot","rotSpeed","save","translate","rotate","confettiColor","fillRect","pw","ph","restore","drawConfetti","SPLIT","maxDist","part","drawImplode","spawnEffect","Array","from","_","random","push","performance","now","id","onClick","onCustomClick","detail","fadeTime","enabled","eraseWidth","onStroke","strokesRef","currentRef","isDownRef","isErasingRef","enabledRef","points","createdAt","erase","drawStroke","pts","sw","sc","mx","my","quadraticCurveTo","lineJoin","sx","scrollX","sy","scrollY","s","age","globalCompositeOperation","tip","setLineDash","isDrawing","hasFadingWork","onScroll","onDown","button","document","body","webkitUserSelect","onUp","onDblClick","onContextMenu","preventDefault","unsubMove","border","containerRef","lensRef","zoomedRef","container","lens","zoomed","unsub","rect","getBoundingClientRect","right","bottom","lx","ly","_Fragment","boxShadow","overflow","inset","background","fontFamily","letterSpacing","hideNativeCursor","variantStack","setVariantStack","globalVariant","setGlobalVariant","useCallback","mode","prev","next","createElement","textContent","head","appendChild","removeChild","contextValue","useMemo","topVariant","currentConfig","Provider","value","overlay","blur","className","overlayRef","overlayEl","onMove","mask","maskImage","webkitMaskImage","backdropFilter","undefined","WebkitBackdropFilter","blend","as","rest","prototype","hasOwnProperty","call","indexOf","getOwnPropertySymbols","propertyIsEnumerable","__rest","Component","cursorHandlers","count","spread","positionsRef","cleanup","dirty","draw","drawDots","drawLine","grad","createRadialGradient","addColorStop","drawGlow","ink","born","shift","GAP_MS","segStart","atEnd","hasGap","j","sparks","lastTime","LIFETIME","GRAVITY","splice","options","dispatchEvent","CustomEvent","minimal","link","text","view","close","spot","neon","invert","square","glassmorphism","brutalist","timeout","onIdle","onWake","timerRef","idleRef","onIdleRef","onWakeRef","arm","setVariant","resetVariant","clearGlobalVariant","threshold","activeRef","observer","IntersectionObserver","entry","isIntersecting","observe","disconnect","strength","distance","dx","dy","pull","setMousePosition","idleThreshold","state","setState","isMoving","rawRef","lastX","lastY","smoothRef","rafIdRef","consecutiveIdle","tick","abs","round"],"mappings":"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","x_google_ignoreList":[3]}