@ansh-ui/core 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. package/LICENSE +21 -0
  2. package/dist/behaviours.cjs +64 -0
  3. package/dist/behaviours.cjs.map +1 -0
  4. package/dist/behaviours.d.cts +3 -0
  5. package/dist/behaviours.d.ts +3 -0
  6. package/dist/behaviours.js +7 -0
  7. package/dist/behaviours.js.map +1 -0
  8. package/dist/chunk-23GSSIMK.cjs +439 -0
  9. package/dist/chunk-23GSSIMK.cjs.map +1 -0
  10. package/dist/chunk-56NNBIAO.js +2446 -0
  11. package/dist/chunk-56NNBIAO.js.map +1 -0
  12. package/dist/chunk-6PFYGJWD.cjs +136 -0
  13. package/dist/chunk-6PFYGJWD.cjs.map +1 -0
  14. package/dist/chunk-7MEIXWPH.js +313 -0
  15. package/dist/chunk-7MEIXWPH.js.map +1 -0
  16. package/dist/chunk-7MYTSAPR.js +83 -0
  17. package/dist/chunk-7MYTSAPR.js.map +1 -0
  18. package/dist/chunk-BOQQHICI.js +1036 -0
  19. package/dist/chunk-BOQQHICI.js.map +1 -0
  20. package/dist/chunk-C6XPQO2O.js +1170 -0
  21. package/dist/chunk-C6XPQO2O.js.map +1 -0
  22. package/dist/chunk-DXJ63QAR.cjs +723 -0
  23. package/dist/chunk-DXJ63QAR.cjs.map +1 -0
  24. package/dist/chunk-FAVIEION.js +705 -0
  25. package/dist/chunk-FAVIEION.js.map +1 -0
  26. package/dist/chunk-FNR35HTL.cjs +107 -0
  27. package/dist/chunk-FNR35HTL.cjs.map +1 -0
  28. package/dist/chunk-GHBRGMSO.cjs +91 -0
  29. package/dist/chunk-GHBRGMSO.cjs.map +1 -0
  30. package/dist/chunk-GJRIHN76.cjs +359 -0
  31. package/dist/chunk-GJRIHN76.cjs.map +1 -0
  32. package/dist/chunk-ILKUL7GD.cjs +115 -0
  33. package/dist/chunk-ILKUL7GD.cjs.map +1 -0
  34. package/dist/chunk-KTUBCQC3.js +409 -0
  35. package/dist/chunk-KTUBCQC3.js.map +1 -0
  36. package/dist/chunk-KU2C6GEA.js +90 -0
  37. package/dist/chunk-KU2C6GEA.js.map +1 -0
  38. package/dist/chunk-LGA3N3YJ.cjs +413 -0
  39. package/dist/chunk-LGA3N3YJ.cjs.map +1 -0
  40. package/dist/chunk-MMO7KO53.cjs +1060 -0
  41. package/dist/chunk-MMO7KO53.cjs.map +1 -0
  42. package/dist/chunk-NSXKCJJ7.js +109 -0
  43. package/dist/chunk-NSXKCJJ7.js.map +1 -0
  44. package/dist/chunk-QALZKHWH.js +387 -0
  45. package/dist/chunk-QALZKHWH.js.map +1 -0
  46. package/dist/chunk-R7UJ7MWP.cjs +2479 -0
  47. package/dist/chunk-R7UJ7MWP.cjs.map +1 -0
  48. package/dist/chunk-UJBXY6QC.cjs +1186 -0
  49. package/dist/chunk-UJBXY6QC.cjs.map +1 -0
  50. package/dist/chunk-YFQXRC5R.js +99 -0
  51. package/dist/chunk-YFQXRC5R.js.map +1 -0
  52. package/dist/color.cjs +257 -0
  53. package/dist/color.cjs.map +1 -0
  54. package/dist/color.d.cts +303 -0
  55. package/dist/color.d.ts +303 -0
  56. package/dist/color.js +8 -0
  57. package/dist/color.js.map +1 -0
  58. package/dist/easing.cjs +189 -0
  59. package/dist/easing.cjs.map +1 -0
  60. package/dist/easing.d.cts +134 -0
  61. package/dist/easing.d.ts +134 -0
  62. package/dist/easing.js +4 -0
  63. package/dist/easing.js.map +1 -0
  64. package/dist/effects.cjs +99 -0
  65. package/dist/effects.cjs.map +1 -0
  66. package/dist/effects.d.cts +5 -0
  67. package/dist/effects.d.ts +5 -0
  68. package/dist/effects.js +10 -0
  69. package/dist/effects.js.map +1 -0
  70. package/dist/index-CCdpefMp.d.ts +967 -0
  71. package/dist/index-CQEEPu-D.d.ts +435 -0
  72. package/dist/index-DHOfsEIn.d.cts +967 -0
  73. package/dist/index-Dl8GCsya.d.cts +435 -0
  74. package/dist/index.cjs +2206 -0
  75. package/dist/index.cjs.map +1 -0
  76. package/dist/index.d.cts +1122 -0
  77. package/dist/index.d.ts +1122 -0
  78. package/dist/index.js +1182 -0
  79. package/dist/index.js.map +1 -0
  80. package/dist/math.cjs +238 -0
  81. package/dist/math.cjs.map +1 -0
  82. package/dist/math.d.cts +120 -0
  83. package/dist/math.d.ts +120 -0
  84. package/dist/math.js +5 -0
  85. package/dist/math.js.map +1 -0
  86. package/dist/noise.cjs +78 -0
  87. package/dist/noise.cjs.map +1 -0
  88. package/dist/noise.d.cts +190 -0
  89. package/dist/noise.d.ts +190 -0
  90. package/dist/noise.js +5 -0
  91. package/dist/noise.js.map +1 -0
  92. package/dist/palette-6HkVltYU.d.cts +219 -0
  93. package/dist/palette-6HkVltYU.d.ts +219 -0
  94. package/dist/random--4mSc5Lp.d.cts +75 -0
  95. package/dist/random--4mSc5Lp.d.ts +75 -0
  96. package/dist/reduced-motion-D0LUgZle.d.cts +120 -0
  97. package/dist/reduced-motion-D0LUgZle.d.ts +120 -0
  98. package/dist/types-B1FLLf3-.d.cts +21 -0
  99. package/dist/types-B1FLLf3-.d.ts +21 -0
  100. package/package.json +78 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/behaviours/types.ts","../src/behaviours/magnetic.ts","../src/behaviours/tilt.ts","../src/behaviours/marquee.ts","../src/behaviours/split-text.ts","../src/motion/stagger.ts","../src/behaviours/scroll-reveal.ts","../src/behaviours/parallax.ts","../src/behaviours/ripple.ts","../src/behaviours/index.ts"],"names":["getRegistry","trackPointer","resolveMotion","getTicker","clamp","DEFAULTS","observeResize","damp","resolveEasing","prefersReducedMotion","observeIntersection","scroll","lerp","parseColor"],"mappings":"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","file":"chunk-UJBXY6QC.cjs","sourcesContent":["import { getRegistry } from '../plugins/registry'\nimport type { ReducedMotionStrategy } from '../a11y/reduced-motion'\n\n/**\n * The Behaviour contract — the DOM counterpart to {@link import('../effects/types').EffectDefinition}.\n *\n * An Effect owns a canvas and draws pixels. A Behaviour owns an element and manipulates styles,\n * transforms or child nodes. Magnetic hover, 3D tilt, marquee scrolling, split-text reveals and\n * parallax are all Behaviours.\n *\n * They share the same shape deliberately: identical lifecycle, identical option-merging, and a\n * single `createBehaviourComponent` helper per framework. Whether a component is canvas-backed or\n * DOM-backed becomes an implementation detail rather than an API difference.\n */\n\nexport interface BaseBehaviourOptions {\n /** Multiplier on the behaviour's characteristic strength. Default `1`. */\n intensity?: number\n /** How to behave under `prefers-reduced-motion`. */\n reducedMotion?: ReducedMotionStrategy\n /** Suspend the behaviour without unmounting. Default `false`. */\n disabled?: boolean\n}\n\nexport interface BehaviourInstance<Options = Record<string, unknown>> {\n /** Apply changed options. Omit to have the host remount on any change. */\n update?(options: Partial<Options>): void\n /**\n * Release everything.\n *\n * Must restore any inline styles the behaviour set, remove any nodes it created, and detach\n * every listener. The test suite's leak harness asserts all three.\n */\n destroy(): void\n}\n\nexport interface BehaviourDefinition<\n Options extends BaseBehaviourOptions = BaseBehaviourOptions,\n Element extends HTMLElement = HTMLElement,\n> {\n readonly name: string\n readonly defaults: Required<Options>\n readonly capability?: string\n setup(element: Element, options: Required<Options>): BehaviourInstance<Options>\n}\n\nexport interface BehaviourHandle<Options> {\n update(options: Partial<Options>): void\n destroy(): void\n}\n\n/**\n * Mount a behaviour onto an element.\n *\n * Thinner than the effect mount because there is no canvas, no surface and no render loop to\n * manage — a behaviour that needs frames subscribes to the ticker itself. What this does provide\n * is the uniform option merge (including the `undefined`-stripping that React and Vue both\n * require), capability gating, and idempotent teardown.\n */\nexport function mountBehaviour<\n Options extends BaseBehaviourOptions,\n El extends HTMLElement = HTMLElement,\n>(\n definition: BehaviourDefinition<Options, El>,\n element: El,\n userOptions: Partial<Options> = {},\n): BehaviourHandle<Options> {\n getRegistry().requireCapability(definition.capability ?? 'behaviour:core')\n\n let options = { ...definition.defaults, ...stripUndefined(userOptions) } as Required<Options>\n let instance: BehaviourInstance<Options> | null = definition.setup(element, options)\n let destroyed = false\n\n return {\n update(next) {\n if (destroyed) return\n const incoming = stripUndefined(next)\n if (Object.keys(incoming).length === 0) return\n\n options = { ...options, ...incoming } as Required<Options>\n\n if (instance?.update) {\n instance.update(incoming)\n } else {\n // No live-update path: tear down and rebuild. Correct, and far simpler than asking\n // every behaviour to implement reconciliation it may not need.\n instance?.destroy()\n instance = definition.setup(element, options)\n }\n },\n\n destroy() {\n if (destroyed) return\n destroyed = true\n instance?.destroy()\n instance = null\n },\n }\n}\n\n/** Register a behaviour so the CLI and docs site can discover it. */\nexport function defineBehaviour<\n Options extends BaseBehaviourOptions,\n El extends HTMLElement = HTMLElement,\n>(definition: BehaviourDefinition<Options, El>): BehaviourDefinition<Options, El> {\n const registry = getRegistry()\n if (!registry.has('behaviour', definition.name)) {\n registry.register('behaviour', definition.name, definition)\n }\n return definition\n}\n\n/**\n * Drop `undefined` values.\n *\n * React and Vue both pass `undefined` for unsupplied props, and a naive spread would let those\n * overwrite documented defaults — the bug where omitting an optional prop breaks the component.\n */\nfunction stripUndefined<T extends object>(input: T): Partial<T> {\n const out: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(input)) {\n if (value !== undefined) out[key] = value\n }\n return out as Partial<T>\n}\n\n/**\n * Remember an element's inline styles so they can be restored exactly on teardown.\n *\n * Setting `element.style.transform = ''` is *not* a restore — it destroys an inline transform\n * the author may have set themselves. This captures the previous value per property and puts it\n * back, including removing the property entirely if it wasn't there before.\n */\nexport function captureStyles<K extends keyof CSSStyleDeclaration & string>(\n element: HTMLElement,\n properties: readonly K[],\n): () => void {\n const saved = new Map<string, string>()\n for (const property of properties) {\n // Read from the inline style, not the computed style: we are restoring what the author\n // wrote, not what the cascade resolved to.\n saved.set(property, element.style.getPropertyValue(kebab(property)))\n }\n\n return () => {\n for (const [property, value] of saved) {\n if (value) element.style.setProperty(kebab(property), value)\n else element.style.removeProperty(kebab(property))\n }\n }\n}\n\nfunction kebab(property: string): string {\n return property.replace(/[A-Z]/g, (match) => `-${match.toLowerCase()}`)\n}\n","import { clamp } from '../math/scalar'\nimport { getTicker } from '../kernel/ticker'\nimport { resolveMotion } from '../a11y/reduced-motion'\nimport { trackPointer } from '../observers/pointer'\nimport { type BaseBehaviourOptions, captureStyles, defineBehaviour } from './types'\n\n/**\n * Magnetic — an element that leans toward the pointer.\n *\n * Deceptively subtle to get right. Three things separate a magnetic button that feels expensive\n * from one that feels broken:\n *\n * 1. **The pull must be spring-driven, not proportional.** Setting\n * `translate = pointerOffset * 0.2` means the element is rigidly locked to the cursor with no\n * weight. A spring gives it mass, so it lags into position and overshoots slightly on release.\n *\n * 2. **The influence zone must extend beyond the element.** If the effect only starts on hover,\n * the element jumps the instant the cursor crosses its edge. Tracking from a surrounding\n * radius means it is already reaching toward the cursor before contact.\n *\n * 3. **Displacement must be capped, not just scaled.** Otherwise a cursor at the far edge of a\n * large influence zone drags the element clean out of its layout box.\n */\n\nexport interface MagneticOptions extends BaseBehaviourOptions {\n /** Maximum displacement in pixels. Default `12`. */\n strength?: number\n /**\n * Radius in pixels around the element within which the pointer has influence.\n * Measured from the element's edges, not its centre. Default `120`.\n */\n radius?: number\n /** Spring stiffness. Higher is snappier. Default `260`. */\n stiffness?: number\n /** Spring damping. Higher settles sooner. Default `24`. */\n damping?: number\n /** Also scale the element on approach. `1.04` is a 4% grow. Default `1`. */\n scale?: number\n /** Also rotate toward the pointer, in degrees at maximum displacement. Default `0`. */\n rotate?: number\n /** Restrict movement to one axis. Default `'both'`. */\n axis?: 'both' | 'x' | 'y'\n /**\n * Apply the transform to a child element instead of the host.\n *\n * Useful when the host must stay put for layout or hit-testing reasons — a nav link whose\n * text should lean but whose click target should not move.\n */\n target?: string\n}\n\nconst DEFAULTS: Required<MagneticOptions> = {\n intensity: 1,\n // Magnetic response is a direct reaction to the user's own input rather than autonomous\n // motion, but it is still large-scale movement, so the safe default is to disable it.\n reducedMotion: 'pause',\n disabled: false,\n\n strength: 12,\n radius: 120,\n stiffness: 260,\n damping: 24,\n scale: 1,\n rotate: 0,\n axis: 'both',\n target: '',\n}\n\nexport const magnetic = defineBehaviour<MagneticOptions>({\n name: 'magnetic',\n defaults: DEFAULTS,\n\n setup(element, options) {\n let opts = options\n\n const target = opts.target\n ? (element.querySelector<HTMLElement>(opts.target) ?? element)\n : element\n\n const restoreStyles = captureStyles(target, ['transform', 'willChange'])\n\n // Track outside the element: the influence zone is larger than the element itself.\n const pointer = trackPointer(element, { trackOutside: true, smoothing: 0.001 })\n\n // Spring state. Position and velocity per axis, plus scale and rotation.\n let x = 0\n let y = 0\n let vx = 0\n let vy = 0\n let scaleValue = 1\n let scaleVelocity = 0\n let rotation = 0\n let rotationVelocity = 0\n\n let motion = resolveMotion(opts.reducedMotion)\n\n // `will-change` is promoted only while the behaviour is live. Leaving it permanently forces\n // the element onto its own compositor layer for the lifetime of the page, which costs memory\n // and, on long pages with many such elements, causes real problems.\n target.style.willChange = 'transform'\n\n const ticker = getTicker()\n\n const stop = ticker.add(\n ({ delta }) => {\n if (opts.disabled || !motion.animate) return\n\n // --- Resolve the target displacement ---\n let targetX = 0\n let targetY = 0\n let targetScale = 1\n let targetRotation = 0\n\n // The rect is read from the pointer tracker's cached measurement, so this loop performs\n // no layout reads of its own.\n const rect = element.getBoundingClientRect()\n const centerX = rect.width / 2\n const centerY = rect.height / 2\n\n // Pointer coordinates are element-relative; convert to an offset from centre.\n const offsetX = pointer.state.x - centerX\n const offsetY = pointer.state.y - centerY\n\n // Distance from the element's *edge*, not its centre, so the influence radius means the\n // same thing for a small icon and a wide button.\n const edgeDistanceX = Math.max(0, Math.abs(offsetX) - centerX)\n const edgeDistanceY = Math.max(0, Math.abs(offsetY) - centerY)\n const edgeDistance = Math.hypot(edgeDistanceX, edgeDistanceY)\n\n const radius = Math.max(1, opts.radius)\n\n if (pointer.state.everInside || edgeDistance < radius) {\n const proximity = clamp(1 - edgeDistance / radius, 0, 1)\n // Squared proximity: the pull should be gentle at the edge of the zone and strong up\n // close, rather than linear across the whole radius.\n const influence = proximity * proximity * opts.intensity\n\n const maxDisplacement = opts.strength\n // Normalise the direction so displacement is capped by `strength` regardless of how\n // far away the pointer is.\n const magnitude = Math.hypot(offsetX, offsetY)\n if (magnitude > 1e-3) {\n const nx = offsetX / magnitude\n const ny = offsetY / magnitude\n targetX = nx * maxDisplacement * influence\n targetY = ny * maxDisplacement * influence\n }\n\n if (opts.axis === 'x') targetY = 0\n else if (opts.axis === 'y') targetX = 0\n\n targetScale = 1 + (opts.scale - 1) * influence\n targetRotation = opts.rotate * influence * (offsetX / Math.max(1, centerX))\n }\n\n // --- Integrate the springs ---\n const stiffness = opts.stiffness\n const damping = opts.damping\n // Sub-step so stiff springs stay stable through a dropped frame.\n const steps = Math.min(4, Math.max(1, Math.ceil(delta / (1 / 60))))\n const dt = delta / steps\n\n for (let i = 0; i < steps; i++) {\n vx += (-stiffness * (x - targetX) - damping * vx) * dt\n vy += (-stiffness * (y - targetY) - damping * vy) * dt\n x += vx * dt\n y += vy * dt\n\n scaleVelocity += (-stiffness * (scaleValue - targetScale) - damping * scaleVelocity) * dt\n scaleValue += scaleVelocity * dt\n\n rotationVelocity +=\n (-stiffness * (rotation - targetRotation) - damping * rotationVelocity) * dt\n rotation += rotationVelocity * dt\n }\n\n // --- Write ---\n // `translate3d` rather than `translate`: it guarantees GPU compositing in every browser\n // we support, whereas 2D translate is sometimes rasterised on the CPU.\n const parts = [`translate3d(${x.toFixed(2)}px, ${y.toFixed(2)}px, 0)`]\n if (opts.scale !== 1) parts.push(`scale(${scaleValue.toFixed(4)})`)\n if (opts.rotate !== 0) parts.push(`rotate(${rotation.toFixed(3)}deg)`)\n target.style.transform = parts.join(' ')\n },\n { phase: 'write', name: 'behaviour:magnetic' },\n )\n\n return {\n update(next) {\n opts = { ...opts, ...next } as Required<MagneticOptions>\n motion = resolveMotion(opts.reducedMotion)\n if (opts.disabled || !motion.animate) {\n // Return to rest immediately rather than freezing mid-displacement.\n x = y = vx = vy = 0\n scaleValue = 1\n rotation = 0\n target.style.transform = ''\n }\n },\n\n destroy() {\n stop()\n pointer.destroy()\n restoreStyles()\n },\n }\n },\n})\n","import { clamp } from '../math/scalar'\nimport { getTicker } from '../kernel/ticker'\nimport { resolveMotion } from '../a11y/reduced-motion'\nimport { trackPointer } from '../observers/pointer'\nimport { type BaseBehaviourOptions, captureStyles, defineBehaviour } from './types'\n\n/**\n * Tilt — 3D perspective rotation following the pointer.\n *\n * The single most common mistake in tilt implementations is putting `perspective` on the element\n * being rotated. CSS `perspective` on an element applies to its *children*, so tilting the same\n * element that carries the perspective produces a flat, sheared result rather than a 3D one. The\n * perspective must live on the parent, or be baked into the transform via `perspective()` as its\n * **first** function — which is what this does, so no wrapper element is required.\n *\n * The second mistake is omitting the glare. A card that rotates without its highlight moving\n * reads as a flat image being turned, because the brain expects specular reflection to shift.\n * The optional glare layer is what makes it read as a physical surface.\n */\n\nexport interface TiltOptions extends BaseBehaviourOptions {\n /** Maximum rotation in degrees on each axis. Default `10`. */\n max?: number\n /** Perspective distance in pixels. Lower is a more extreme effect. Default `900`. */\n perspective?: number\n /** Scale applied while hovering. Default `1.02`. */\n scale?: number\n /** Spring stiffness. Default `180`. */\n stiffness?: number\n /** Spring damping. Default `22`. */\n damping?: number\n /** Invert the rotation direction. Default `false`. */\n reverse?: boolean\n /** Lift the element toward the viewer in pixels while hovering. Default `0`. */\n lift?: number\n /** Add a moving specular highlight. Default `true`. */\n glare?: boolean\n /** Glare opacity at maximum, in `[0, 1]`. Default `0.18`. */\n glareOpacity?: number\n /** Restrict rotation to one axis. Default `'both'`. */\n axis?: 'both' | 'x' | 'y'\n}\n\nconst DEFAULTS: Required<TiltOptions> = {\n intensity: 1,\n reducedMotion: 'pause',\n disabled: false,\n\n max: 10,\n perspective: 900,\n scale: 1.02,\n stiffness: 180,\n damping: 22,\n reverse: false,\n lift: 0,\n glare: true,\n glareOpacity: 0.18,\n axis: 'both',\n}\n\nexport const tilt = defineBehaviour<TiltOptions>({\n name: 'tilt',\n defaults: DEFAULTS,\n\n setup(element, options) {\n let opts = options\n const restoreStyles = captureStyles(element, ['transform', 'transformStyle', 'willChange'])\n const pointer = trackPointer(element, { smoothing: 0.002 })\n\n // Spring state: rotation about X and Y, plus hover presence driving scale/lift/glare.\n let rotateX = 0\n let rotateY = 0\n let velocityX = 0\n let velocityY = 0\n let presence = 0\n let presenceVelocity = 0\n\n let motion = resolveMotion(opts.reducedMotion)\n\n element.style.willChange = 'transform'\n // Needed so nested 3D-transformed children share this element's perspective rather than\n // being flattened into it.\n element.style.transformStyle = 'preserve-3d'\n\n // --- Glare layer -------------------------------------------------------\n let glareElement: HTMLDivElement | null = null\n\n function ensureGlare(): void {\n if (!opts.glare) {\n removeGlare()\n return\n }\n if (glareElement) return\n\n const glare = document.createElement('div')\n glare.setAttribute('aria-hidden', 'true')\n Object.assign(glare.style, {\n position: 'absolute',\n inset: '0',\n pointerEvents: 'none',\n borderRadius: 'inherit',\n // `overflow: hidden` on the host would clip content, so instead the gradient itself is\n // sized to the element and simply moves within it.\n opacity: '0',\n transition: 'none',\n // Kept behind any positioned content but above the element's own background.\n zIndex: '1',\n } satisfies Partial<CSSStyleDeclaration>)\n element.appendChild(glare)\n glareElement = glare\n }\n\n function removeGlare(): void {\n if (glareElement && glareElement.parentNode === element) {\n element.removeChild(glareElement)\n }\n glareElement = null\n }\n\n ensureGlare()\n\n const ticker = getTicker()\n\n const stop = ticker.add(\n ({ delta }) => {\n if (opts.disabled || !motion.animate) return\n\n const state = pointer.state\n const hovering = state.inside\n\n // Pointer position normalised to [-1, 1] from the element's centre.\n const nx = (state.smoothNx - 0.5) * 2\n const ny = (state.smoothNy - 0.5) * 2\n\n const direction = opts.reverse ? -1 : 1\n const max = opts.max * opts.intensity\n\n // Rotating about X responds to vertical pointer movement, and vice versa — the axes\n // cross. Getting this backwards is the other classic tilt bug: the card appears to\n // rotate away from the cursor.\n let targetRotateX = hovering ? -ny * max * direction : 0\n let targetRotateY = hovering ? nx * max * direction : 0\n\n if (opts.axis === 'x') targetRotateY = 0\n else if (opts.axis === 'y') targetRotateX = 0\n\n const targetPresence = hovering ? 1 : 0\n\n const steps = Math.min(4, Math.max(1, Math.ceil(delta / (1 / 60))))\n const dt = delta / steps\n const stiffness = opts.stiffness\n const damping = opts.damping\n\n for (let i = 0; i < steps; i++) {\n velocityX += (-stiffness * (rotateX - targetRotateX) - damping * velocityX) * dt\n velocityY += (-stiffness * (rotateY - targetRotateY) - damping * velocityY) * dt\n rotateX += velocityX * dt\n rotateY += velocityY * dt\n\n presenceVelocity +=\n (-stiffness * (presence - targetPresence) - damping * presenceVelocity) * dt\n presence += presenceVelocity * dt\n }\n\n presence = clamp(presence, 0, 1.2)\n\n const scale = 1 + (opts.scale - 1) * presence\n const lift = opts.lift * presence\n\n // `perspective()` must come first in the function list, otherwise it applies to an\n // already-rotated coordinate space and the result is a shear.\n element.style.transform =\n `perspective(${opts.perspective}px) ` +\n `rotateX(${rotateX.toFixed(3)}deg) rotateY(${rotateY.toFixed(3)}deg) ` +\n `translateZ(${lift.toFixed(2)}px) scale(${scale.toFixed(4)})`\n\n // --- Glare ---\n if (glareElement) {\n const opacity = opts.glareOpacity * presence\n glareElement.style.opacity = opacity.toFixed(3)\n if (opacity > 0.001) {\n // The highlight sits opposite the pointer and sweeps across as the card turns,\n // which is how a specular reflection behaves on a real surface.\n const angle = Math.atan2(ny, nx) * (180 / Math.PI) + 90\n glareElement.style.background =\n `linear-gradient(${angle.toFixed(1)}deg, ` +\n `rgba(255,255,255,0.55) 0%, rgba(255,255,255,0.12) 45%, rgba(255,255,255,0) 70%)`\n }\n }\n },\n { phase: 'write', name: 'behaviour:tilt' },\n )\n\n return {\n update(next) {\n const previousGlare = opts.glare\n opts = { ...opts, ...next } as Required<TiltOptions>\n motion = resolveMotion(opts.reducedMotion)\n\n if (opts.glare !== previousGlare) ensureGlare()\n\n if (opts.disabled || !motion.animate) {\n rotateX = rotateY = velocityX = velocityY = 0\n presence = presenceVelocity = 0\n element.style.transform = ''\n if (glareElement) glareElement.style.opacity = '0'\n }\n },\n\n destroy() {\n stop()\n pointer.destroy()\n removeGlare()\n restoreStyles()\n },\n }\n },\n})\n","import { damp } from '../math/scalar'\nimport { getTicker } from '../kernel/ticker'\nimport { resolveMotion } from '../a11y/reduced-motion'\nimport { observeResize } from '../observers/pool'\nimport { type BaseBehaviourOptions, captureStyles, defineBehaviour } from './types'\n\n/**\n * Marquee — seamless infinite scrolling content.\n *\n * The CSS-only approach (`animation: scroll linear infinite` on a duplicated track) has three\n * problems this solves:\n *\n * 1. **The seam.** A CSS marquee animates `translateX` from `0` to `-50%` on a doubled track. If\n * the content doesn't exactly fill the container, there is a visible gap or overlap at the\n * wrap point. Here the track is duplicated as many times as needed to exceed the container\n * width, and the wrap distance is the measured width of *one* copy — so it is always exact.\n *\n * 2. **Speed is expressed in duration, not velocity.** A CSS duration means a marquee with more\n * items scrolls faster, so adding a logo to a customer strip changes the animation speed. Here\n * speed is pixels per second, which is what an author actually means.\n *\n * 3. **Pause on hover can't be smooth.** Toggling `animation-play-state` stops dead. This eases\n * the velocity to zero, which reads as deliberate rather than broken.\n */\n\nexport interface MarqueeOptions extends BaseBehaviourOptions {\n /** Scroll speed in pixels per second. Negative reverses. Default `60`. */\n speed?: number\n /** Scroll direction. Default `'left'`. */\n direction?: 'left' | 'right' | 'up' | 'down'\n /** Ease to a stop while the pointer is over the marquee. Default `true`. */\n pauseOnHover?: boolean\n /** Seconds to ease in and out of a pause. Default `0.4`. */\n pauseEasing?: number\n /** Gap between repeated copies, in pixels. Default `0` — use CSS `gap` on the track instead. */\n gap?: number\n /** Fade the edges with a mask, in pixels. `0` disables. Default `0`. */\n fadeEdges?: number\n}\n\nconst DEFAULTS: Required<MarqueeOptions> = {\n intensity: 1,\n // Continuous horizontal motion across a wide area is a classic vestibular trigger, so the\n // safe default is to hold it still. The content stays fully readable.\n reducedMotion: 'static',\n disabled: false,\n\n speed: 60,\n direction: 'left',\n pauseOnHover: true,\n pauseEasing: 0.4,\n gap: 0,\n fadeEdges: 0,\n}\n\nexport const marquee = defineBehaviour<MarqueeOptions>({\n name: 'marquee',\n defaults: DEFAULTS,\n\n setup(element, options) {\n let opts = options\n\n const restoreHost = captureStyles(element, [\n 'overflow',\n 'display',\n 'maskImage',\n 'webkitMaskImage',\n ])\n\n /**\n * The original children are moved into a track element which is what actually scrolls.\n * Clones of that track are appended to fill the container.\n */\n const track = document.createElement('div')\n const originalChildren = Array.from(element.childNodes)\n\n const vertical = opts.direction === 'up' || opts.direction === 'down'\n\n Object.assign(element.style, {\n overflow: 'hidden',\n display: vertical ? 'block' : 'flex',\n } satisfies Partial<CSSStyleDeclaration>)\n\n Object.assign(track.style, {\n display: 'flex',\n flexDirection: vertical ? 'column' : 'row',\n flexShrink: '0',\n willChange: 'transform',\n gap: opts.gap ? `${opts.gap}px` : '',\n } satisfies Partial<CSSStyleDeclaration>)\n\n for (const child of originalChildren) track.appendChild(child)\n element.appendChild(track)\n\n /** Cloned tracks, so they can be removed and rebuilt when the measurement changes. */\n let clones: HTMLElement[] = []\n /** The scroll distance for one full cycle — the measured size of a single track. */\n let cycleSize = 0\n\n let offset = 0\n let currentSpeed = 0\n let hovering = false\n let motion = resolveMotion(opts.reducedMotion)\n\n /**\n * Measure one track and clone it until the container is covered.\n *\n * We need `ceil(containerSize / trackSize) + 1` copies: enough to fill the container, plus\n * one more so that at the moment of wrap there is already content in position. With exactly\n * enough copies you get a one-frame gap at the seam.\n */\n function rebuild(): void {\n for (const clone of clones) clone.remove()\n clones = []\n\n const containerSize = vertical ? element.clientHeight : element.clientWidth\n const trackSize = vertical ? track.scrollHeight : track.scrollWidth\n\n cycleSize = trackSize + (opts.gap ?? 0)\n\n if (cycleSize <= 0 || containerSize <= 0) return\n\n const needed = Math.ceil(containerSize / cycleSize) + 1\n for (let i = 0; i < needed; i++) {\n const clone = track.cloneNode(true) as HTMLElement\n // Clones are decorative duplicates. Announcing them would make a screen reader read a\n // customer logo strip several times over.\n clone.setAttribute('aria-hidden', 'true')\n clone.style.willChange = 'transform'\n element.appendChild(clone)\n clones.push(clone)\n }\n }\n\n function applyEdgeFade(): void {\n const fade = opts.fadeEdges ?? 0\n if (fade <= 0) {\n element.style.removeProperty('mask-image')\n element.style.removeProperty('-webkit-mask-image')\n return\n }\n const axis = vertical ? 'to bottom' : 'to right'\n const mask =\n `linear-gradient(${axis}, transparent 0, black ${fade}px, ` +\n `black calc(100% - ${fade}px), transparent 100%)`\n element.style.setProperty('mask-image', mask)\n element.style.setProperty('-webkit-mask-image', mask)\n }\n\n const stopResize = observeResize(element, rebuild)\n // Content can change size without the container changing — a font loading, an image\n // decoding — so the track is observed too.\n const stopTrackResize = observeResize(track, rebuild)\n\n const onEnter = () => {\n hovering = true\n }\n const onLeave = () => {\n hovering = false\n }\n element.addEventListener('pointerenter', onEnter, { passive: true })\n element.addEventListener('pointerleave', onLeave, { passive: true })\n\n applyEdgeFade()\n rebuild()\n\n const ticker = getTicker()\n\n const stop = ticker.add(\n ({ delta }) => {\n if (opts.disabled || !motion.animate || cycleSize <= 0) return\n\n const targetSpeed =\n opts.pauseOnHover && hovering ? 0 : opts.speed * opts.intensity * motion.timeScale\n\n // Ease the speed rather than switching it, so pausing on hover is smooth. `damp` keeps\n // this frame-rate independent.\n const easing = Math.max(0, opts.pauseEasing)\n currentSpeed =\n easing <= 0 ? targetSpeed : damp(currentSpeed, targetSpeed, 0.0001 ** (1 / easing), delta)\n\n offset += currentSpeed * delta\n\n // Wrap into `[0, cycleSize)`. Using a modulo rather than a subtract-when-exceeded keeps\n // it correct even if a very long frame advances past several cycles.\n offset = ((offset % cycleSize) + cycleSize) % cycleSize\n\n // Positive speed means content moves toward the negative axis for left/up.\n const sign = opts.direction === 'left' || opts.direction === 'up' ? -1 : 1\n const translate = sign * offset\n\n // All tracks share one transform value; the clones are laid out sequentially by flex, so\n // translating each by the same amount moves the whole strip.\n const transform = vertical\n ? `translate3d(0, ${translate.toFixed(2)}px, 0)`\n : `translate3d(${translate.toFixed(2)}px, 0, 0)`\n\n track.style.transform = transform\n for (const clone of clones) clone.style.transform = transform\n },\n { phase: 'write', name: 'behaviour:marquee' },\n )\n\n return {\n update(next) {\n const previousGap = opts.gap\n const previousFade = opts.fadeEdges\n opts = { ...opts, ...next } as Required<MarqueeOptions>\n motion = resolveMotion(opts.reducedMotion)\n\n if (opts.gap !== previousGap) {\n track.style.gap = opts.gap ? `${opts.gap}px` : ''\n rebuild()\n }\n if (opts.fadeEdges !== previousFade) applyEdgeFade()\n },\n\n destroy() {\n stop()\n stopResize()\n stopTrackResize()\n element.removeEventListener('pointerenter', onEnter)\n element.removeEventListener('pointerleave', onLeave)\n\n for (const clone of clones) clone.remove()\n clones = []\n\n // Put the original children back where they were, so the DOM is exactly as we found it.\n for (const child of originalChildren) element.appendChild(child)\n track.remove()\n restoreHost()\n },\n }\n },\n})\n","/**\n * Split Text — break text into per-character, per-word or per-line spans.\n *\n * This is the foundation for every staggered text animation, and the accessibility handling is\n * the part that matters most. Naively wrapping each character in a `<span>` is an accessibility\n * disaster:\n *\n * - **Screen readers** may announce each span separately, turning \"Welcome\" into\n * \"W. E. L. C. O. M. E.\" Some engines do this, some don't, and you cannot rely on either.\n * - **Text selection and copy** produce the right characters but lose word boundaries in some\n * browsers.\n * - **Search engines and translation tools** see fragmented text.\n *\n * The fix used here: the original text is preserved in a visually-hidden element that remains the\n * accessible representation, and the entire split structure is marked `aria-hidden`. Assistive\n * technology reads the real sentence; the eye sees the animated fragments. This is the same\n * approach GSAP's SplitText settled on, and it is the only one that is actually correct.\n */\n\nimport { type BaseBehaviourOptions, defineBehaviour } from './types'\n\nexport type SplitUnit = 'chars' | 'words' | 'lines'\n\nexport interface SplitTextOptions extends BaseBehaviourOptions {\n /**\n * What to split into. `'lines'` requires a layout measurement pass and re-splits on resize,\n * so it is more expensive — but it is the only way to animate by visual line.\n */\n by?: SplitUnit | readonly SplitUnit[]\n /** Class applied to character spans. Default `'ansh-char'`. */\n charClass?: string\n /** Class applied to word spans. Default `'ansh-word'`. */\n wordClass?: string\n /** Class applied to line spans. Default `'ansh-line'`. */\n lineClass?: string\n /**\n * Set `--ansh-index` and `--ansh-total` custom properties on each unit.\n *\n * This is what lets a pure-CSS stagger work: `animation-delay: calc(var(--ansh-index) * 40ms)`.\n * Default `true`.\n */\n cssVariables?: boolean\n /** Wrap each unit in an extra element with `overflow: hidden`, for mask-reveal animations. */\n mask?: boolean\n}\n\nconst DEFAULTS: Required<SplitTextOptions> = {\n intensity: 1,\n reducedMotion: 'none',\n disabled: false,\n\n by: 'chars',\n charClass: 'ansh-char',\n wordClass: 'ansh-word',\n lineClass: 'ansh-line',\n cssVariables: true,\n mask: false,\n}\n\nexport interface SplitTextResult {\n chars: HTMLElement[]\n words: HTMLElement[]\n lines: HTMLElement[]\n}\n\n/** Behaviour handles expose the produced elements so a caller can animate them. */\nconst results = new WeakMap<HTMLElement, SplitTextResult>()\n\n/** Read the split result for an element, if it has been split. */\nexport function getSplitResult(element: HTMLElement): SplitTextResult | undefined {\n return results.get(element)\n}\n\nexport const splitText = defineBehaviour<SplitTextOptions>({\n name: 'split-text',\n defaults: DEFAULTS,\n\n setup(element, options) {\n const opts = options\n const units = Array.isArray(opts.by) ? opts.by : [opts.by]\n\n /** The original markup, restored verbatim on teardown. */\n const originalHTML = element.innerHTML\n const originalText = element.textContent ?? ''\n\n const result: SplitTextResult = { chars: [], words: [], lines: [] }\n\n /**\n * Build the visually-hidden accessible copy.\n *\n * `clip-path: inset(50%)` plus a 1px box is the modern visually-hidden recipe: it keeps the\n * text in the accessibility tree and available to copy, while occupying no visual space.\n * `display: none` and `visibility: hidden` would both remove it from the tree entirely.\n */\n function createAccessibleCopy(): HTMLElement {\n const sr = document.createElement('span')\n sr.textContent = originalText\n Object.assign(sr.style, {\n position: 'absolute',\n width: '1px',\n height: '1px',\n padding: '0',\n margin: '-1px',\n overflow: 'hidden',\n clipPath: 'inset(50%)',\n whiteSpace: 'nowrap',\n borderWidth: '0',\n } satisfies Partial<CSSStyleDeclaration>)\n return sr\n }\n\n function makeUnit(text: string, className: string): HTMLElement {\n const span = document.createElement('span')\n span.className = className\n span.textContent = text\n // `inline-block` is required for transforms to apply — an inline element ignores\n // `translate` and `scale` entirely, which is the most common reason a text animation\n // \"does nothing\".\n span.style.display = 'inline-block'\n return span\n }\n\n function wrapInMask(unit: HTMLElement): HTMLElement {\n const wrapper = document.createElement('span')\n wrapper.className = 'ansh-mask'\n Object.assign(wrapper.style, {\n display: 'inline-block',\n overflow: 'hidden',\n // Without this, descenders (g, y, p) are clipped by the mask box.\n verticalAlign: 'top',\n } satisfies Partial<CSSStyleDeclaration>)\n wrapper.appendChild(unit)\n return wrapper\n }\n\n function stampVariables(elements: HTMLElement[]): void {\n if (!opts.cssVariables) return\n const total = elements.length\n elements.forEach((el, index) => {\n el.style.setProperty('--ansh-index', String(index))\n el.style.setProperty('--ansh-total', String(total))\n // Normalised position, for `calc()` expressions that want a 0–1 ramp.\n el.style.setProperty('--ansh-progress', total <= 1 ? '0' : (index / (total - 1)).toFixed(4))\n })\n }\n\n /**\n * Split into words and characters.\n *\n * Uses `Intl.Segmenter` for characters when available, because `[...string]` splits by code\n * point and breaks grapheme clusters — an emoji with a skin-tone modifier becomes two\n * \"characters\", and so does a combining accent. `Intl.Segmenter` is the only correct answer\n * and is available in every browser we support; the code-point fallback is for older runtimes.\n */\n function segmentCharacters(text: string): string[] {\n if (typeof Intl !== 'undefined' && 'Segmenter' in Intl) {\n const segmenter = new Intl.Segmenter(undefined, { granularity: 'grapheme' })\n return Array.from(segmenter.segment(text), (s) => s.segment)\n }\n return Array.from(text)\n }\n\n function buildWordsAndChars(container: HTMLElement, text: string): void {\n // Lines are derived by measuring word positions, so asking for lines implies words even\n // when the author didn't request them.\n const wantsWords = units.includes('words') || units.includes('lines')\n const wantsChars = units.includes('chars')\n\n // Split on whitespace but keep the separators, so multiple spaces and newlines survive.\n const tokens = text.split(/(\\s+)/)\n\n for (const token of tokens) {\n if (token.length === 0) continue\n\n if (/^\\s+$/.test(token)) {\n // Whitespace between words is emitted as a plain text node rather than a span, so it\n // collapses and wraps exactly as it did in the original text.\n container.appendChild(document.createTextNode(token))\n continue\n }\n\n if (wantsWords) {\n const word = makeUnit(wantsChars ? '' : token, opts.wordClass)\n if (wantsChars) {\n for (const character of segmentCharacters(token)) {\n const char = makeUnit(character, opts.charClass)\n result.chars.push(char)\n word.appendChild(opts.mask ? wrapInMask(char) : char)\n }\n }\n result.words.push(word)\n container.appendChild(opts.mask && !wantsChars ? wrapInMask(word) : word)\n } else if (wantsChars) {\n for (const character of segmentCharacters(token)) {\n const char = makeUnit(character, opts.charClass)\n result.chars.push(char)\n container.appendChild(opts.mask ? wrapInMask(char) : char)\n }\n } else {\n container.appendChild(document.createTextNode(token))\n }\n }\n }\n\n /**\n * Group already-built word spans into visual lines.\n *\n * Lines are a *rendered* property, not a textual one, so they must be measured. Words whose\n * `offsetTop` matches belong to the same line. This runs after the words are in the document\n * and is the reason `by: 'lines'` costs a layout pass.\n */\n function groupIntoLines(container: HTMLElement): void {\n if (result.words.length === 0) return\n\n const lines: HTMLElement[][] = []\n let currentTop: number | null = null\n let current: HTMLElement[] = []\n\n for (const word of result.words) {\n const top = word.offsetTop\n // A 2px tolerance absorbs sub-pixel differences between words with different\n // baselines or font fallbacks on the same line.\n if (currentTop === null || Math.abs(top - currentTop) <= 2) {\n currentTop = currentTop ?? top\n current.push(word)\n } else {\n lines.push(current)\n current = [word]\n currentTop = top\n }\n }\n if (current.length > 0) lines.push(current)\n\n // Re-parent each line's words into a line span. Done after grouping so the measurement\n // isn't invalidated part-way through.\n for (const lineWords of lines) {\n const line = document.createElement('span')\n line.className = opts.lineClass\n line.style.display = 'inline-block'\n\n const first = lineWords[0]\n const parent = first.parentElement ?? container\n parent.insertBefore(opts.mask ? wrapInMask(line) : line, first)\n\n for (const word of lineWords) {\n line.appendChild(word)\n }\n result.lines.push(line)\n }\n }\n\n function build(): void {\n result.chars = []\n result.words = []\n result.lines = []\n\n const fragment = document.createDocumentFragment()\n const visual = document.createElement('span')\n // The entire visual structure is hidden from assistive technology; the visually-hidden\n // copy above is what gets announced.\n visual.setAttribute('aria-hidden', 'true')\n\n buildWordsAndChars(visual, originalText)\n\n fragment.appendChild(createAccessibleCopy())\n fragment.appendChild(visual)\n\n element.replaceChildren(fragment)\n\n if (units.includes('lines')) groupIntoLines(visual)\n\n stampVariables(result.chars)\n stampVariables(result.words)\n stampVariables(result.lines)\n\n results.set(element, result)\n }\n\n if (!opts.disabled) build()\n\n return {\n destroy() {\n results.delete(element)\n // Restore the original markup exactly, including any nested elements the author had.\n element.innerHTML = originalHTML\n },\n }\n },\n})\n\n/**\n * Split text imperatively, outside the behaviour lifecycle.\n *\n * Returns the produced elements plus a `restore` function. Framework bindings use the behaviour;\n * this is for one-off use in vanilla JS and in tests.\n */\nexport function split(\n element: HTMLElement,\n options: Partial<SplitTextOptions> = {},\n): SplitTextResult & { restore(): void } {\n const originalHTML = element.innerHTML\n const definition = splitText\n const merged = { ...definition.defaults, ...options } as Required<SplitTextOptions>\n const instance = definition.setup(element, merged)\n const result = results.get(element) ?? { chars: [], words: [], lines: [] }\n\n return {\n ...result,\n restore() {\n instance.destroy()\n element.innerHTML = originalHTML\n },\n }\n}\n","import { clamp } from '../math/scalar'\nimport { type EasingInput, resolveEasing } from '../easing'\n\n/**\n * Stagger — the per-element delay that turns N simultaneous animations into a sequence.\n *\n * The reason this deserves its own module rather than being `index * 0.05`: *where* the wave\n * originates changes what the motion communicates. A list that reveals from the top reads as\n * \"loading in order\". The same list revealing from the item the user clicked reads as\n * \"responding to you\". Getting the origin right is most of the craft in orchestration.\n */\n\n/**\n * Where the stagger wave begins.\n *\n * - `'first'` — index 0 goes first. The default; reads as natural reading order.\n * - `'last'` — reversed. Useful for exits, so the last thing in stays longest.\n * - `'center'` — radiates outward from the middle. Good for symmetric layouts and hero content.\n * - `'edges'` — converges inward from both ends. Reads as \"gathering\".\n * - a number — a specific index. Pass the index the user interacted with.\n */\nexport type StaggerFrom = 'first' | 'last' | 'center' | 'edges' | number\n\nexport interface StaggerOptions {\n /** Seconds between consecutive elements. Default `0.05`. */\n each?: number\n /**\n * Total seconds the whole wave should span. Overrides `each` when set — the more useful knob\n * for \"reveal these however many items there are in 400ms\".\n */\n total?: number\n from?: StaggerFrom\n /**\n * Easing applied to the *distribution* of delays, not to each animation.\n *\n * `easeOutQuad` bunches later elements closer together, so a long list accelerates rather\n * than plodding at a constant rate — the difference between 40 items feeling fast and\n * feeling interminable.\n */\n easing?: EasingInput\n /** Base delay added to every element. Default `0`. */\n delay?: number\n /**\n * For grid layouts: `[columns, rows]`. Distance is then measured in 2D, so `from: 'center'`\n * radiates as a circle rather than along a single index axis.\n */\n grid?: readonly [number, number]\n /** Which axis to measure along in a grid. `undefined` uses true 2D distance. */\n axis?: 'x' | 'y'\n}\n\n/**\n * Build a delay function for a set of `count` elements.\n *\n * @returns `(index) => delayInSeconds`\n */\nexport function stagger(count: number, options: StaggerOptions = {}): (index: number) => number {\n const total = Math.max(1, Math.floor(count))\n const from = options.from ?? 'first'\n const baseDelay = options.delay ?? 0\n const ease = resolveEasing(options.easing)\n\n if (total === 1) return () => baseDelay\n\n const distances = computeDistances(total, from, options.grid, options.axis)\n\n // Normalise so the furthest element is at 1, independent of layout or origin.\n let maxDistance = 0\n for (const d of distances) if (d > maxDistance) maxDistance = d\n\n const spanSeconds =\n options.total !== undefined\n ? Math.max(0, options.total)\n : Math.max(0, options.each ?? 0.05) * maxDistance\n\n return (index: number): number => {\n const i = clamp(Math.floor(index), 0, total - 1)\n const normalized = maxDistance === 0 ? 0 : distances[i] / maxDistance\n return baseDelay + ease(normalized) * spanSeconds\n }\n}\n\n/**\n * Distance of each index from the wave's origin, in \"steps\".\n *\n * For a linear list this is just index distance. For a grid it is Euclidean distance in cells,\n * which is what makes a centre-out reveal look like a ripple rather than a diagonal sweep.\n */\nfunction computeDistances(\n count: number,\n from: StaggerFrom,\n grid?: readonly [number, number],\n axis?: 'x' | 'y',\n): number[] {\n const distances = new Array<number>(count)\n\n if (grid) {\n const [columns] = grid\n const cols = Math.max(1, Math.floor(columns))\n const rows = Math.max(1, Math.ceil(count / cols))\n\n const origin = resolveGridOrigin(from, cols, rows, count)\n\n for (let i = 0; i < count; i++) {\n const x = i % cols\n const y = Math.floor(i / cols)\n const dx = x - origin.x\n const dy = y - origin.y\n\n if (axis === 'x') distances[i] = Math.abs(dx)\n else if (axis === 'y') distances[i] = Math.abs(dy)\n else distances[i] = Math.hypot(dx, dy)\n }\n\n if (from === 'edges') {\n // Invert: the edges start, the centre finishes.\n let max = 0\n for (const d of distances) if (d > max) max = d\n for (let i = 0; i < count; i++) distances[i] = max - distances[i]\n }\n\n return distances\n }\n\n switch (from) {\n case 'last':\n for (let i = 0; i < count; i++) distances[i] = count - 1 - i\n return distances\n\n case 'center': {\n const centre = (count - 1) / 2\n for (let i = 0; i < count; i++) distances[i] = Math.abs(i - centre)\n return distances\n }\n\n case 'edges': {\n const centre = (count - 1) / 2\n for (let i = 0; i < count; i++) distances[i] = centre - Math.abs(i - centre)\n return distances\n }\n\n case 'first':\n for (let i = 0; i < count; i++) distances[i] = i\n return distances\n\n default: {\n const origin = clamp(Math.floor(from), 0, count - 1)\n for (let i = 0; i < count; i++) distances[i] = Math.abs(i - origin)\n return distances\n }\n }\n}\n\nfunction resolveGridOrigin(\n from: StaggerFrom,\n cols: number,\n rows: number,\n count: number,\n): { x: number; y: number } {\n if (typeof from === 'number') {\n const index = clamp(Math.floor(from), 0, count - 1)\n return { x: index % cols, y: Math.floor(index / cols) }\n }\n switch (from) {\n case 'last':\n return { x: cols - 1, y: rows - 1 }\n case 'center':\n case 'edges':\n return { x: (cols - 1) / 2, y: (rows - 1) / 2 }\n case 'first':\n default:\n return { x: 0, y: 0 }\n }\n}\n\n/**\n * Total wall-clock time a staggered set will take.\n *\n * Needed so a timeline can place whatever comes *after* a staggered group without the author\n * having to work out `count × each + duration` themselves.\n */\nexport function staggerDuration(\n count: number,\n itemDuration: number,\n options: StaggerOptions = {},\n): number {\n const delayFor = stagger(count, options)\n let latest = 0\n for (let i = 0; i < count; i++) {\n const end = delayFor(i) + itemDuration\n if (end > latest) latest = end\n }\n return latest\n}\n","import { clamp } from '../math/scalar'\nimport { type EasingInput, resolveEasing } from '../easing'\nimport { getTicker } from '../kernel/ticker'\nimport { prefersReducedMotion } from '../a11y/reduced-motion'\nimport { observeIntersection } from '../observers/pool'\nimport { stagger, type StaggerOptions } from '../motion/stagger'\nimport { type BaseBehaviourOptions, captureStyles, defineBehaviour } from './types'\n\n/**\n * Scroll Reveal — animate elements in as they enter the viewport.\n *\n * The critical correctness requirement is **SSR and no-JS safety**. The common implementation\n * sets `opacity: 0` in CSS and removes it with JavaScript, which means that if JavaScript fails\n * to load, is blocked, or throws before this runs, the content is permanently invisible. That has\n * shipped to production on a lot of marketing sites.\n *\n * So: the initial hidden state is applied *by this behaviour, in JavaScript*, immediately on\n * setup. If the script never runs, the content is simply visible — degraded but correct. This is\n * the only defensible default for content the user came to read.\n *\n * The reveal itself runs on the shared ticker rather than a CSS transition, so a staggered group\n * shares one clock and cannot drift, and so `prefers-reduced-motion` is handled in one place.\n */\n\nexport interface ScrollRevealOptions extends BaseBehaviourOptions {\n /** Distance in pixels the element travels into place. Default `24`. */\n distance?: number\n /** Direction the element travels *from*. Default `'up'` (enters moving upward). */\n direction?: 'up' | 'down' | 'left' | 'right' | 'none'\n /** Starting opacity. Default `0`. */\n opacity?: number\n /** Starting scale. `1` disables scaling. Default `1`. */\n scale?: number\n /** Starting rotation in degrees. Default `0`. */\n rotate?: number\n /** Starting blur in pixels. Default `0`. */\n blur?: number\n /** Duration in seconds. Default `0.7`. */\n duration?: number\n easing?: EasingInput\n /** Seconds to wait after entering the viewport. Default `0`. */\n delay?: number\n /** Fraction of the element that must be visible to trigger, in `[0, 1]`. Default `0.15`. */\n threshold?: number\n /** Extra margin around the viewport, as a CSS margin string. Default `'0px 0px -10% 0px'`. */\n rootMargin?: string\n /** Reverse the animation when the element leaves the viewport. Default `false`. */\n repeat?: boolean\n /**\n * Selector for descendants to reveal individually rather than the host itself.\n * When set, the host stays untouched and its matching descendants are staggered.\n *\n * Named `selector`, not `children`. The framework bindings spread these options onto a\n * component's props, where `children` means the rendered subtree — a `children: string` option\n * silently narrows the component's real `children` to `string`, making `<ScrollReveal><p/></ScrollReveal>`\n * a type error with an unreadable message. The collision is invisible in the engine and only\n * surfaces at the binding layer.\n */\n selector?: string\n /** Stagger configuration when `selector` is set. */\n stagger?: StaggerOptions\n}\n\nconst DEFAULTS: Required<ScrollRevealOptions> = {\n intensity: 1,\n reducedMotion: 'static',\n disabled: false,\n\n distance: 24,\n direction: 'up',\n opacity: 0,\n scale: 1,\n rotate: 0,\n blur: 0,\n duration: 0.7,\n easing: 'cinematic',\n delay: 0,\n threshold: 0.15,\n rootMargin: '0px 0px -10% 0px',\n repeat: false,\n selector: '',\n stagger: { each: 0.06, from: 'first' },\n}\n\ninterface RevealTarget {\n element: HTMLElement\n restore: () => void\n /** Seconds into this target's own animation. Negative while waiting out its delay. */\n time: number\n delay: number\n done: boolean\n}\n\nexport const scrollReveal = defineBehaviour<ScrollRevealOptions>({\n name: 'scroll-reveal',\n defaults: DEFAULTS,\n\n setup(element, options) {\n let opts = options\n const easing = resolveEasing(opts.easing)\n\n const targets: RevealTarget[] = []\n let revealing = false\n let reversing = false\n let stopTicker: (() => void) | null = null\n\n function collectTargets(): void {\n const elements = opts.selector\n ? Array.from(element.querySelectorAll<HTMLElement>(opts.selector))\n : [element]\n\n const delayFor = stagger(elements.length, opts.stagger)\n\n elements.forEach((el, index) => {\n targets.push({\n element: el,\n restore: captureStyles(el, ['opacity', 'transform', 'filter', 'willChange']),\n time: 0,\n delay: opts.delay + (opts.selector ? delayFor(index) : 0),\n done: false,\n })\n })\n }\n\n /** Compose the transform for a given progress. `0` is fully hidden, `1` is at rest. */\n function applyProgress(target: RevealTarget, progress: number): void {\n const eased = easing(clamp(progress, 0, 1))\n const inverse = 1 - eased\n const intensity = opts.intensity\n\n const distance = opts.distance * intensity * inverse\n let translateX = 0\n let translateY = 0\n switch (opts.direction) {\n case 'up':\n translateY = distance\n break\n case 'down':\n translateY = -distance\n break\n case 'left':\n translateX = distance\n break\n case 'right':\n translateX = -distance\n break\n case 'none':\n break\n }\n\n const style = target.element.style\n style.opacity = String(opts.opacity + (1 - opts.opacity) * eased)\n\n const parts: string[] = []\n if (translateX !== 0 || translateY !== 0) {\n parts.push(`translate3d(${translateX.toFixed(2)}px, ${translateY.toFixed(2)}px, 0)`)\n }\n if (opts.scale !== 1) {\n parts.push(`scale(${(opts.scale + (1 - opts.scale) * eased).toFixed(4)})`)\n }\n if (opts.rotate !== 0) {\n parts.push(`rotate(${(opts.rotate * inverse).toFixed(3)}deg)`)\n }\n style.transform = parts.length > 0 ? parts.join(' ') : ''\n\n if (opts.blur > 0) {\n const blur = opts.blur * inverse\n style.filter = blur > 0.05 ? `blur(${blur.toFixed(2)}px)` : ''\n }\n }\n\n /** Clear the properties we set once an element is fully revealed. */\n function settle(target: RevealTarget): void {\n const style = target.element.style\n style.opacity = ''\n style.transform = ''\n style.filter = ''\n // Drop the compositor promotion once the element is at rest, so a page with 200 revealed\n // elements isn't holding 200 permanent layers.\n style.willChange = ''\n target.done = true\n }\n\n function hide(target: RevealTarget): void {\n target.element.style.willChange = 'opacity, transform'\n target.done = false\n target.time = 0\n applyProgress(target, 0)\n }\n\n const ticker = getTicker()\n\n function startTicker(): void {\n if (stopTicker) return\n stopTicker = ticker.add(\n ({ delta }) => {\n let allDone = true\n\n for (const target of targets) {\n if (target.done && !reversing) continue\n\n target.time += reversing ? -delta : delta\n\n const elapsed = target.time - target.delay\n if (elapsed < 0) {\n allDone = false\n continue\n }\n\n const progress = opts.duration <= 0 ? 1 : elapsed / opts.duration\n\n if (!reversing && progress >= 1) {\n settle(target)\n continue\n }\n if (reversing && target.time <= 0) {\n applyProgress(target, 0)\n continue\n }\n\n applyProgress(target, progress)\n allDone = false\n }\n\n if (allDone) {\n stopTicker?.()\n stopTicker = null\n }\n },\n { phase: 'write', name: 'behaviour:scroll-reveal' },\n )\n }\n\n // --- Setup --------------------------------------------------------------\n\n collectTargets()\n\n /**\n * Reduced motion: reveal instantly and never animate.\n *\n * Note this is checked *before* hiding anything, so a reduced-motion user never sees the\n * hidden state at all — not even for one frame.\n */\n const skipAnimation = opts.disabled || (prefersReducedMotion() && opts.reducedMotion !== 'none')\n\n if (!skipAnimation) {\n for (const target of targets) hide(target)\n }\n\n const stopObserver = skipAnimation\n ? () => {}\n : observeIntersection(\n element,\n (entry) => {\n if (entry.isIntersecting) {\n if (revealing && !opts.repeat) return\n revealing = true\n reversing = false\n for (const target of targets) {\n if (target.done) continue\n target.time = 0\n }\n startTicker()\n } else if (opts.repeat) {\n reversing = true\n for (const target of targets) {\n target.done = false\n target.time = opts.duration + target.delay\n target.element.style.willChange = 'opacity, transform'\n }\n startTicker()\n }\n },\n { threshold: opts.threshold, rootMargin: opts.rootMargin },\n )\n\n return {\n update(next) {\n opts = { ...opts, ...next } as Required<ScrollRevealOptions>\n // Everything else is read fresh each frame; only `disabled` needs an immediate response.\n if (opts.disabled) {\n for (const target of targets) settle(target)\n }\n },\n\n destroy() {\n stopObserver()\n stopTicker?.()\n stopTicker = null\n for (const target of targets) target.restore()\n targets.length = 0\n },\n }\n },\n})\n","import { clamp, lerp } from '../math/scalar'\nimport { getTicker } from '../kernel/ticker'\nimport { resolveMotion } from '../a11y/reduced-motion'\nimport { observeResize } from '../observers/pool'\nimport { type BaseBehaviourOptions, captureStyles, defineBehaviour } from './types'\n\n/**\n * Parallax — elements that move at a different rate from the scroll.\n *\n * Parallax has a bad reputation, and mostly it is deserved: it is the effect most likely to\n * cause motion sickness, and the most commonly implemented by reading\n * `getBoundingClientRect()` in a `scroll` handler — which forces a synchronous layout on every\n * scroll event and is the single most common cause of janky scrolling on the web.\n *\n * Two structural fixes here:\n *\n * **All measurement happens in the ticker's `read` phase, all writes in `write`.** The scroll\n * handler does nothing at all; scroll position is sampled once per frame. Fifty parallax elements\n * therefore cost one layout read per frame between them, not fifty per event.\n *\n * **The element's own document position is cached and only re-measured on resize.** Scrolling\n * does not change where an element sits in the document, so re-measuring per frame is pure waste.\n */\n\nexport interface ParallaxOptions extends BaseBehaviourOptions {\n /**\n * Movement rate relative to the scroll.\n *\n * `0` is fixed to the page (no parallax). `0.3` moves at 30% of scroll speed — the element\n * appears further away. Negative values move against the scroll, appearing nearer.\n * Values beyond ±0.5 read as broken rather than deep. Default `0.3`.\n */\n speed?: number\n /** Axis to translate along. Default `'y'`. */\n axis?: 'y' | 'x'\n /** Also scale as the element passes through. `1` disables. Default `1`. */\n scale?: number\n /** Also rotate as the element passes through, in degrees. Default `0`. */\n rotate?: number\n /** Also fade. `[enterOpacity, centreOpacity, exitOpacity]`. Default no fade. */\n fade?: readonly [number, number, number]\n /**\n * Clamp the translation so the element cannot leave its own container.\n *\n * Strongly recommended for background images inside a fixed-height section: without it, a\n * parallax image reveals the empty space behind it at the extremes. Default `true`.\n */\n contain?: boolean\n /** Smoothing applied to the parallax position, in `[0, 1)`. `0` tracks scroll exactly. Default `0`. */\n smoothing?: number\n}\n\nconst DEFAULTS: Required<ParallaxOptions> = {\n intensity: 1,\n // Parallax is the canonical vestibular trigger. Under reduced motion it is disabled outright,\n // not slowed — a slow parallax is still parallax.\n reducedMotion: 'pause',\n disabled: false,\n\n speed: 0.3,\n axis: 'y',\n scale: 1,\n rotate: 0,\n fade: [1, 1, 1],\n contain: true,\n smoothing: 0,\n}\n\nexport const parallax = defineBehaviour<ParallaxOptions>({\n name: 'parallax',\n defaults: DEFAULTS,\n\n setup(element, options) {\n let opts = options\n const restore = captureStyles(element, ['transform', 'opacity', 'willChange'])\n\n /** Cached geometry, refreshed on resize rather than per frame. */\n let elementTop = 0\n let elementHeight = 1\n let viewportHeight = 1\n let containerSize = 0\n let needsMeasure = true\n\n /** Smoothed translation, when smoothing is enabled. */\n let currentTranslate = 0\n let motion = resolveMotion(opts.reducedMotion)\n\n element.style.willChange = 'transform'\n\n function measure(): void {\n const rect = element.getBoundingClientRect()\n const scroll = opts.axis === 'y' ? window.scrollY : window.scrollX\n elementTop = (opts.axis === 'y' ? rect.top : rect.left) + scroll\n elementHeight = Math.max(1, opts.axis === 'y' ? rect.height : rect.width)\n viewportHeight = Math.max(1, opts.axis === 'y' ? window.innerHeight : window.innerWidth)\n\n // For containment, the parent's size bounds how far we may move.\n const parent = element.parentElement\n if (parent) {\n const parentRect = parent.getBoundingClientRect()\n containerSize = opts.axis === 'y' ? parentRect.height : parentRect.width\n } else {\n containerSize = elementHeight\n }\n\n needsMeasure = false\n }\n\n const invalidate = () => {\n needsMeasure = true\n }\n\n window.addEventListener('resize', invalidate, { passive: true })\n const stopResize = observeResize(element, invalidate)\n\n /**\n * Scroll position, sampled once per frame in the read phase.\n * Kept in closure scope so the write phase can use it without another read.\n */\n let scroll = 0\n /** Progress of the element through the viewport, `0` entering to `1` leaving. */\n let progress = 0\n\n const ticker = getTicker()\n\n const stopRead = ticker.add(\n () => {\n if (opts.disabled || !motion.animate) return\n if (needsMeasure) measure()\n scroll = opts.axis === 'y' ? window.scrollY : window.scrollX\n },\n { phase: 'read', name: 'behaviour:parallax:read' },\n )\n\n const stopWrite = ticker.add(\n ({ delta }) => {\n if (opts.disabled || !motion.animate) return\n\n // Progress from \"element's top edge reaches viewport bottom\" to\n // \"element's bottom edge reaches viewport top\" — the full period of visibility.\n const start = elementTop - viewportHeight\n const end = elementTop + elementHeight\n const span = Math.max(1, end - start)\n progress = clamp((scroll - start) / span, 0, 1)\n\n // Centred at 0 when the element is mid-viewport, so the parallax offset is symmetric\n // and the element sits at its natural position when centred.\n const centred = progress - 0.5\n\n let translate = centred * viewportHeight * opts.speed * opts.intensity\n\n if (opts.contain) {\n // The element may move at most the difference between its own size and its\n // container's, otherwise it exposes an edge.\n const slack = Math.max(0, containerSize - elementHeight) / 2 || elementHeight * 0.25\n translate = clamp(translate, -slack, slack)\n }\n\n if (opts.smoothing > 0) {\n // Frame-rate independent smoothing. Non-zero smoothing decouples the element from the\n // scroll, which reads as weight — but it also means it lags, so it is opt-in.\n const retain = Math.pow(clamp(opts.smoothing, 0.001, 0.999), delta)\n currentTranslate = lerp(translate, currentTranslate, retain)\n } else {\n currentTranslate = translate\n }\n\n const parts: string[] = []\n if (opts.axis === 'y') {\n parts.push(`translate3d(0, ${currentTranslate.toFixed(2)}px, 0)`)\n } else {\n parts.push(`translate3d(${currentTranslate.toFixed(2)}px, 0, 0)`)\n }\n\n if (opts.scale !== 1) {\n // Peaks at the centre of the viewport and falls off symmetrically.\n const proximity = 1 - Math.abs(centred) * 2\n parts.push(`scale(${(1 + (opts.scale - 1) * clamp(proximity, 0, 1)).toFixed(4)})`)\n }\n\n if (opts.rotate !== 0) {\n parts.push(`rotate(${(centred * opts.rotate * 2).toFixed(3)}deg)`)\n }\n\n element.style.transform = parts.join(' ')\n\n const [enter, centre, exit] = opts.fade\n if (enter !== 1 || centre !== 1 || exit !== 1) {\n // Two-segment interpolation: enter → centre for the first half, centre → exit for the\n // second, so the three-stop fade behaves as authors expect.\n const opacity =\n progress < 0.5\n ? lerp(enter, centre, progress * 2)\n : lerp(centre, exit, (progress - 0.5) * 2)\n element.style.opacity = opacity.toFixed(4)\n }\n },\n { phase: 'write', name: 'behaviour:parallax:write' },\n )\n\n return {\n update(next) {\n opts = { ...opts, ...next } as Required<ParallaxOptions>\n motion = resolveMotion(opts.reducedMotion)\n needsMeasure = true\n if (opts.disabled || !motion.animate) {\n element.style.transform = ''\n element.style.opacity = ''\n }\n },\n\n destroy() {\n stopRead()\n stopWrite()\n stopResize()\n window.removeEventListener('resize', invalidate)\n restore()\n },\n }\n },\n})\n","import { clamp } from '../math/scalar'\nimport { type EasingInput, resolveEasing } from '../easing'\nimport { getTicker } from '../kernel/ticker'\nimport { prefersReducedMotion } from '../a11y/reduced-motion'\nimport { parseColor } from '../color/parse'\nimport { type BaseBehaviourOptions, captureStyles, defineBehaviour } from './types'\n\n/**\n * Ripple — a wave that expands from the point of contact.\n *\n * Material Design's ripple, done properly. Three details most implementations miss:\n *\n * **The radius must reach the furthest corner.** A ripple sized to the element's width leaves the\n * corners untouched on a wide button, which looks like a bug. The correct radius is the distance\n * from the contact point to the furthest corner, computed per press.\n *\n * **Fade-out must outlast expansion.** If opacity and scale finish together, the ripple appears to\n * vanish mid-motion. The expansion completes first and the fade continues past it, so the ripple\n * dissolves at full size.\n *\n * **Multiple ripples must coexist.** Rapid clicking should produce overlapping ripples, not one\n * that restarts. Each press gets its own element, and they are cleaned up independently.\n *\n * The ripple layer is inserted as a positioned child with `overflow: hidden`, so it is clipped to\n * the element's own border radius via `border-radius: inherit` — no need for the author to\n * duplicate their radius in a prop.\n */\n\nexport interface RippleOptions extends BaseBehaviourOptions {\n /** Ripple colour. Any CSS colour. Default `'currentColor'` at low alpha. */\n color?: string\n /** Peak opacity, in `[0, 1]`. Default `0.28`. */\n opacity?: number\n /** Expansion duration in seconds. Default `0.55`. */\n duration?: number\n /** Additional seconds the fade continues past the expansion. Default `0.25`. */\n fadeDuration?: number\n easing?: EasingInput\n /** Always start from the element's centre rather than the contact point. Default `false`. */\n centered?: boolean\n /** Trigger on keyboard activation (Enter/Space) as well as pointer. Default `true`. */\n keyboard?: boolean\n /** Maximum simultaneous ripples. Older ones are removed beyond this. Default `6`. */\n maxRipples?: number\n}\n\nconst DEFAULTS: Required<RippleOptions> = {\n intensity: 1,\n // A ripple is a small, local, user-initiated response — not the kind of motion that causes\n // vestibular discomfort. But it is still motion, so `slow` rather than `none` is the honest\n // default: reduced-motion users get a quick, subdued version instead of nothing.\n reducedMotion: 'slow',\n disabled: false,\n\n color: 'currentColor',\n opacity: 0.28,\n duration: 0.55,\n fadeDuration: 0.25,\n easing: 'easeOutQuart',\n centered: false,\n keyboard: true,\n maxRipples: 6,\n}\n\ninterface ActiveRipple {\n element: HTMLDivElement\n radius: number\n time: number\n}\n\nexport const ripple = defineBehaviour<RippleOptions>({\n name: 'ripple',\n defaults: DEFAULTS,\n\n setup(element, options) {\n let opts = options\n let easing = resolveEasing(opts.easing)\n\n const restore = captureStyles(element, ['position', 'overflow'])\n\n if (getComputedStyle(element).position === 'static') {\n element.style.position = 'relative'\n }\n\n /** The clipping container. Kept separate so we never set `overflow: hidden` on the host. */\n const layer = document.createElement('span')\n layer.setAttribute('aria-hidden', 'true')\n Object.assign(layer.style, {\n position: 'absolute',\n inset: '0',\n overflow: 'hidden',\n // Inherits the host's rounding, so a pill button clips its ripple to a pill.\n borderRadius: 'inherit',\n pointerEvents: 'none',\n } satisfies Partial<CSSStyleDeclaration>)\n element.appendChild(layer)\n\n const active: ActiveRipple[] = []\n let stopTicker: (() => void) | null = null\n const ticker = getTicker()\n\n /** Resolve the ripple colour once per spawn, so `currentColor` follows theme changes. */\n function resolveColor(): string {\n const raw = opts.color\n if (raw === 'currentColor') {\n // Read the host's computed colour rather than relying on inheritance: the ripple lives\n // inside an `aria-hidden` span whose colour would inherit anyway, but resolving it here\n // means we can apply our own alpha.\n const computed = getComputedStyle(element).color\n try {\n const parsed = parseColor(computed)\n return `${Math.round(parsed.r * 255)},${Math.round(parsed.g * 255)},${Math.round(parsed.b * 255)}`\n } catch {\n return '255,255,255'\n }\n }\n try {\n const parsed = parseColor(raw)\n return `${Math.round(parsed.r * 255)},${Math.round(parsed.g * 255)},${Math.round(parsed.b * 255)}`\n } catch {\n return '255,255,255'\n }\n }\n\n function spawn(clientX: number, clientY: number): void {\n if (opts.disabled) return\n\n const rect = element.getBoundingClientRect()\n const x = opts.centered ? rect.width / 2 : clientX - rect.left\n const y = opts.centered ? rect.height / 2 : clientY - rect.top\n\n // Distance to the furthest corner — the only radius that guarantees full coverage.\n const radius = Math.max(\n Math.hypot(x, y),\n Math.hypot(rect.width - x, y),\n Math.hypot(x, rect.height - y),\n Math.hypot(rect.width - x, rect.height - y),\n )\n\n const dot = document.createElement('div')\n Object.assign(dot.style, {\n position: 'absolute',\n left: `${x - radius}px`,\n top: `${y - radius}px`,\n width: `${radius * 2}px`,\n height: `${radius * 2}px`,\n borderRadius: '50%',\n // A soft edge rather than a hard circle. A hard-edged expanding disc reads as a shape;\n // a graded one reads as a wave.\n background: `radial-gradient(circle, rgba(${resolveColor()},1) 0%, rgba(${resolveColor()},0.75) 55%, rgba(${resolveColor()},0) 100%)`,\n opacity: '0',\n transform: 'scale(0)',\n willChange: 'transform, opacity',\n pointerEvents: 'none',\n } satisfies Partial<CSSStyleDeclaration>)\n\n layer.appendChild(dot)\n active.push({ element: dot, radius, time: 0 })\n\n // Drop the oldest if we're over the cap, so a held-down key can't grow the DOM without limit.\n while (active.length > Math.max(1, opts.maxRipples)) {\n const oldest = active.shift()\n oldest?.element.remove()\n }\n\n startTicker()\n }\n\n function startTicker(): void {\n if (stopTicker) return\n stopTicker = ticker.add(\n ({ delta }) => {\n // Reduced motion shortens rather than removes the ripple, so the feedback survives.\n const scale = prefersReducedMotion() && opts.reducedMotion === 'slow' ? 0.4 : 1\n const duration = Math.max(0.01, opts.duration * scale)\n const fade = Math.max(0, opts.fadeDuration * scale)\n const total = duration + fade\n const peak = clamp(opts.opacity * opts.intensity, 0, 1)\n\n for (let i = active.length - 1; i >= 0; i--) {\n const r = active[i]\n r.time += delta\n\n if (r.time >= total) {\n r.element.remove()\n active.splice(i, 1)\n continue\n }\n\n const expansion = clamp(r.time / duration, 0, 1)\n r.element.style.transform = `scale(${easing(expansion).toFixed(4)})`\n\n // Opacity ramps in fast, then decays across the whole lifetime. The quick ramp-in\n // avoids a visible flash at scale 0.\n const rampIn = clamp(r.time / 0.08, 0, 1)\n const decay = 1 - clamp(r.time / total, 0, 1)\n r.element.style.opacity = (peak * rampIn * decay).toFixed(4)\n }\n\n if (active.length === 0) {\n stopTicker?.()\n stopTicker = null\n }\n },\n { phase: 'write', name: 'behaviour:ripple' },\n )\n }\n\n // --- Input --------------------------------------------------------------\n\n const onPointerDown = (event: PointerEvent): void => {\n // Ignore secondary buttons: a right-click opens a context menu, it isn't an activation.\n if (event.button !== 0 && event.pointerType === 'mouse') return\n spawn(event.clientX, event.clientY)\n }\n\n const onKeyDown = (event: KeyboardEvent): void => {\n if (!opts.keyboard) return\n if (event.key !== 'Enter' && event.key !== ' ') return\n // `event.repeat` guards a held key from spawning a ripple per repeat tick.\n if (event.repeat) return\n const rect = element.getBoundingClientRect()\n // Keyboard activation has no coordinates, so it ripples from the centre — which is also\n // the correct visual language for \"activated without pointing\".\n spawn(rect.left + rect.width / 2, rect.top + rect.height / 2)\n }\n\n element.addEventListener('pointerdown', onPointerDown, { passive: true })\n element.addEventListener('keydown', onKeyDown)\n\n return {\n update(next) {\n opts = { ...opts, ...next } as Required<RippleOptions>\n easing = resolveEasing(opts.easing)\n },\n\n destroy() {\n element.removeEventListener('pointerdown', onPointerDown)\n element.removeEventListener('keydown', onKeyDown)\n stopTicker?.()\n stopTicker = null\n for (const r of active) r.element.remove()\n active.length = 0\n layer.remove()\n restore()\n },\n }\n },\n})\n","export * from './types'\n\nexport { magnetic, type MagneticOptions } from './magnetic'\nexport { tilt, type TiltOptions } from './tilt'\nexport { marquee, type MarqueeOptions } from './marquee'\nexport {\n splitText,\n split,\n getSplitResult,\n type SplitTextOptions,\n type SplitTextResult,\n type SplitUnit,\n} from './split-text'\nexport { scrollReveal, type ScrollRevealOptions } from './scroll-reveal'\nexport { parallax, type ParallaxOptions } from './parallax'\nexport { ripple, type RippleOptions } from './ripple'\n\nimport { magnetic } from './magnetic'\nimport { tilt } from './tilt'\nimport { marquee } from './marquee'\nimport { splitText } from './split-text'\nimport { scrollReveal } from './scroll-reveal'\nimport { parallax } from './parallax'\nimport { ripple } from './ripple'\n\n/**\n * Every built-in behaviour, keyed by name. Used by the CLI and docs site for discovery.\n * Import individual behaviours in application code so the rest tree-shake away.\n */\nexport const behaviours = {\n magnetic,\n tilt,\n marquee,\n 'split-text': splitText,\n 'scroll-reveal': scrollReveal,\n parallax,\n ripple,\n} as const\n\nexport type BehaviourName = keyof typeof behaviours\n"]}
@@ -0,0 +1,99 @@
1
+ import { clamp, TAU } from './chunk-KU2C6GEA.js';
2
+
3
+ // src/math/random.ts
4
+ function createRng(seed = 1) {
5
+ let state = (typeof seed === "string" ? hashString(seed) : Math.trunc(seed)) >>> 0;
6
+ if (state === 0) state = 2654435769;
7
+ let spareGaussian = null;
8
+ const next = () => {
9
+ state = state + 1831565813 >>> 0;
10
+ let t = state;
11
+ t = Math.imul(t ^ t >>> 15, t | 1);
12
+ t ^= t + Math.imul(t ^ t >>> 7, t | 61);
13
+ return ((t ^ t >>> 14) >>> 0) / 4294967296;
14
+ };
15
+ const rng = {
16
+ next,
17
+ range: (min, max) => min + next() * (max - min),
18
+ int: (min, max) => Math.floor(min + next() * (max - min + 1)),
19
+ bool: (p = 0.5) => next() < p,
20
+ angle: () => next() * TAU,
21
+ gaussian() {
22
+ if (spareGaussian !== null) {
23
+ const value = spareGaussian;
24
+ spareGaussian = null;
25
+ return value;
26
+ }
27
+ const u = 1 - next();
28
+ const v = next();
29
+ const mag = Math.sqrt(-2 * Math.log(u));
30
+ spareGaussian = mag * Math.sin(TAU * v);
31
+ return mag * Math.cos(TAU * v);
32
+ },
33
+ insideCircle() {
34
+ const r = Math.sqrt(next());
35
+ const a = next() * TAU;
36
+ return { x: Math.cos(a) * r, y: Math.sin(a) * r };
37
+ },
38
+ pick(items) {
39
+ if (items.length === 0) throw new RangeError("rng.pick() called with an empty array");
40
+ return items[Math.floor(next() * items.length)];
41
+ },
42
+ shuffle(items) {
43
+ const out = items.slice();
44
+ for (let i = out.length - 1; i > 0; i--) {
45
+ const j = Math.floor(next() * (i + 1));
46
+ const tmp = out[i];
47
+ out[i] = out[j];
48
+ out[j] = tmp;
49
+ }
50
+ return out;
51
+ },
52
+ fork: () => createRng(Math.floor(next() * 4294967295))
53
+ };
54
+ return rng;
55
+ }
56
+ function hashString(input) {
57
+ let hash = 2166136261;
58
+ for (let i = 0; i < input.length; i++) {
59
+ hash ^= input.charCodeAt(i);
60
+ hash = Math.imul(hash, 16777619);
61
+ }
62
+ return hash >>> 0;
63
+ }
64
+ function deriveSeed(seed, index) {
65
+ let h = (seed ^ Math.imul(index + 1, 2654435769)) >>> 0;
66
+ h = Math.imul(h ^ h >>> 16, 2246822507) >>> 0;
67
+ h = Math.imul(h ^ h >>> 13, 3266489909) >>> 0;
68
+ return (h ^ h >>> 16) >>> 0;
69
+ }
70
+ function goldenRatioSequence(index, offset = 0) {
71
+ const PHI = 0.6180339887498949;
72
+ return (offset + index * PHI) % 1;
73
+ }
74
+ function r2Sequence(index) {
75
+ const A1 = 0.7548776662466927;
76
+ const A2 = 0.5698402909980532;
77
+ return { x: (0.5 + A1 * index) % 1, y: (0.5 + A2 * index) % 1 };
78
+ }
79
+ function weightedPick(rng, items, weights) {
80
+ if (items.length === 0) throw new RangeError("weightedPick() called with an empty array");
81
+ let total = 0;
82
+ for (let i = 0; i < items.length; i++) {
83
+ total += Math.max(0, weights[i] ?? 0);
84
+ }
85
+ if (total <= 0) return rng.pick(items);
86
+ let threshold = rng.next() * total;
87
+ for (let i = 0; i < items.length; i++) {
88
+ threshold -= Math.max(0, weights[i] ?? 0);
89
+ if (threshold <= 0) return items[i];
90
+ }
91
+ return items[items.length - 1];
92
+ }
93
+ function jitter(rng, value, amount, min = -Infinity, max = Infinity) {
94
+ return clamp(value + (rng.next() * 2 - 1) * amount, min, max);
95
+ }
96
+
97
+ export { createRng, deriveSeed, goldenRatioSequence, hashString, jitter, r2Sequence, weightedPick };
98
+ //# sourceMappingURL=chunk-YFQXRC5R.js.map
99
+ //# sourceMappingURL=chunk-YFQXRC5R.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/math/random.ts"],"names":[],"mappings":"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","file":"chunk-YFQXRC5R.js","sourcesContent":["import { TAU, clamp } from './scalar'\n\n/**\n * Seeded pseudo-random number generation.\n *\n * Determinism is a hard requirement in Ansh, not a nicety:\n *\n * - **SSR safety.** The server and the client must produce the same first frame, or React\n * and Vue will both scream about hydration mismatches.\n * - **Visual regression testing.** A screenshot diff is meaningless if the particle field\n * is different on every run.\n * - **Authoring.** A designer who likes seed `4821` can pin it and get that composition back.\n *\n * So no effect ever calls `Math.random()`. They all take a `seed` and derive a {@link Rng}.\n */\nexport interface Rng {\n /** Uniform in `[0, 1)`. */\n next(): number\n /** Uniform in `[min, max)`. */\n range(min: number, max: number): number\n /** Integer in `[min, max]`, inclusive on both ends. */\n int(min: number, max: number): number\n /** `true` with probability `p`. */\n bool(p?: number): boolean\n /** Uniform angle in `[0, 2π)`. */\n angle(): number\n /** Approximately standard-normal, mean 0 and standard deviation 1. */\n gaussian(): number\n /** A uniformly distributed point inside the unit circle. */\n insideCircle(): { x: number; y: number }\n /** Uniformly pick an element. Throws on an empty array. */\n pick<T>(items: readonly T[]): T\n /** A new shuffled copy (Fisher–Yates). The input is not mutated. */\n shuffle<T>(items: readonly T[]): T[]\n /** A fresh independent stream, deterministically derived from this one's current state. */\n fork(): Rng\n}\n\n/**\n * Mulberry32: 32-bit state, period 2³², passes gjrand's basic suites and is roughly as fast\n * as `Math.random()`. Chosen over xorshift because its avalanche is better for small seeds\n * (`seed = 1` and `seed = 2` produce visibly unrelated streams, which matters when authors\n * type small numbers).\n */\nexport function createRng(seed: number | string = 1): Rng {\n let state = (typeof seed === 'string' ? hashString(seed) : Math.trunc(seed)) >>> 0\n // A zero state is a valid mulberry32 seed but produces a poor first few outputs.\n if (state === 0) state = 0x9e3779b9\n\n // Cached second value from the Box–Muller pair; regenerated when null.\n let spareGaussian: number | null = null\n\n const next = (): number => {\n state = (state + 0x6d2b79f5) >>> 0\n let t = state\n t = Math.imul(t ^ (t >>> 15), t | 1)\n t ^= t + Math.imul(t ^ (t >>> 7), t | 61)\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296\n }\n\n const rng: Rng = {\n next,\n range: (min, max) => min + next() * (max - min),\n int: (min, max) => Math.floor(min + next() * (max - min + 1)),\n bool: (p = 0.5) => next() < p,\n angle: () => next() * TAU,\n\n gaussian() {\n if (spareGaussian !== null) {\n const value = spareGaussian\n spareGaussian = null\n return value\n }\n // Box–Muller. `1 - next()` keeps the argument of `log` strictly positive.\n const u = 1 - next()\n const v = next()\n const mag = Math.sqrt(-2 * Math.log(u))\n spareGaussian = mag * Math.sin(TAU * v)\n return mag * Math.cos(TAU * v)\n },\n\n insideCircle() {\n // sqrt of the radius, otherwise points bunch toward the centre.\n const r = Math.sqrt(next())\n const a = next() * TAU\n return { x: Math.cos(a) * r, y: Math.sin(a) * r }\n },\n\n pick(items) {\n if (items.length === 0) throw new RangeError('rng.pick() called with an empty array')\n return items[Math.floor(next() * items.length)]\n },\n\n shuffle(items) {\n const out = items.slice()\n for (let i = out.length - 1; i > 0; i--) {\n const j = Math.floor(next() * (i + 1))\n const tmp = out[i]\n out[i] = out[j]\n out[j] = tmp\n }\n return out\n },\n\n fork: () => createRng(Math.floor(next() * 0xffffffff)),\n }\n\n return rng\n}\n\n/** FNV-1a. Lets authors seed with a memorable string (`seed=\"hero-aurora\"`). */\nexport function hashString(input: string): number {\n let hash = 0x811c9dc5\n for (let i = 0; i < input.length; i++) {\n hash ^= input.charCodeAt(i)\n hash = Math.imul(hash, 0x01000193)\n }\n return hash >>> 0\n}\n\n/**\n * Deterministically derive a child seed from a parent seed and an index.\n *\n * Used so that particle *n* of an effect gets a stable stream regardless of how many\n * particles were created before it — which keeps a field visually stable when the count\n * changes at runtime under adaptive quality.\n */\nexport function deriveSeed(seed: number, index: number): number {\n let h = (seed ^ Math.imul(index + 1, 0x9e3779b9)) >>> 0\n h = Math.imul(h ^ (h >>> 16), 0x85ebca6b) >>> 0\n h = Math.imul(h ^ (h >>> 13), 0xc2b2ae35) >>> 0\n return (h ^ (h >>> 16)) >>> 0\n}\n\n/**\n * Low-discrepancy 1D sequence. Fills `[0,1)` far more evenly than uniform random, which is\n * what you want for scattering stars or fireflies — pure random leaves visible clumps and\n * voids that read as a mistake.\n */\nexport function goldenRatioSequence(index: number, offset = 0): number {\n const PHI = 0.6180339887498949\n return (offset + index * PHI) % 1\n}\n\n/** 2D low-discrepancy sequence (R₂ / plastic constant). The 2D analogue of the above. */\nexport function r2Sequence(index: number): { x: number; y: number } {\n const A1 = 0.7548776662466927\n const A2 = 0.5698402909980532\n return { x: (0.5 + A1 * index) % 1, y: (0.5 + A2 * index) % 1 }\n}\n\n/**\n * Weighted pick. `weights` need not be normalised; non-finite or negative entries are\n * treated as zero. Falls back to the last item if floating point leaves a remainder.\n */\nexport function weightedPick<T>(rng: Rng, items: readonly T[], weights: readonly number[]): T {\n if (items.length === 0) throw new RangeError('weightedPick() called with an empty array')\n let total = 0\n for (let i = 0; i < items.length; i++) {\n total += Math.max(0, weights[i] ?? 0)\n }\n if (total <= 0) return rng.pick(items)\n\n let threshold = rng.next() * total\n for (let i = 0; i < items.length; i++) {\n threshold -= Math.max(0, weights[i] ?? 0)\n if (threshold <= 0) return items[i]\n }\n return items[items.length - 1]\n}\n\n/** Jitter a value by ±`amount` (absolute), clamped to an optional range. */\nexport function jitter(rng: Rng, value: number, amount: number, min = -Infinity, max = Infinity) {\n return clamp(value + (rng.next() * 2 - 1) * amount, min, max)\n}\n"]}