tekiyo-physics 1.0.0 → 1.1.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.
- package/dist/index.cjs +2404 -101
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +313 -0
- package/dist/index.js +2305 -2
- package/dist/index.js.map +1 -1
- package/package.json +5 -2
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../src/core/Vector2.ts","../src/core/Spring.ts","../src/core/Velocity.ts","../src/core/Friction.ts","../src/core/PhysicsEngine.ts","../src/presets/index.ts","../src/components/PhysicsProvider.tsx","../src/hooks/useSpring.ts","../src/hooks/useGesture.ts","../src/hooks/useDrag.ts","../src/hooks/useStretch.ts","../src/hooks/useLift.ts","../src/hooks/useFlick.ts","../src/components/Draggable.tsx","../src/components/Card.tsx"],"sourcesContent":["/**\n * Immutable 2D vector class for physics calculations\n */\nexport class Vector2 {\n constructor(\n public readonly x: number = 0,\n public readonly y: number = 0\n ) {}\n\n static zero(): Vector2 {\n return new Vector2(0, 0);\n }\n\n static from(x: number, y: number): Vector2 {\n return new Vector2(x, y);\n }\n\n static fromObject(obj: { x: number; y: number }): Vector2 {\n return new Vector2(obj.x, obj.y);\n }\n\n add(other: Vector2): Vector2 {\n return new Vector2(this.x + other.x, this.y + other.y);\n }\n\n subtract(other: Vector2): Vector2 {\n return new Vector2(this.x - other.x, this.y - other.y);\n }\n\n multiply(scalar: number): Vector2 {\n return new Vector2(this.x * scalar, this.y * scalar);\n }\n\n divide(scalar: number): Vector2 {\n if (scalar === 0) return Vector2.zero();\n return new Vector2(this.x / scalar, this.y / scalar);\n }\n\n get magnitude(): number {\n return Math.sqrt(this.x * this.x + this.y * this.y);\n }\n\n get magnitudeSquared(): number {\n return this.x * this.x + this.y * this.y;\n }\n\n normalize(): Vector2 {\n const mag = this.magnitude;\n if (mag === 0) return Vector2.zero();\n return this.divide(mag);\n }\n\n clamp(maxMagnitude: number): Vector2 {\n const mag = this.magnitude;\n if (mag <= maxMagnitude) return this;\n return this.normalize().multiply(maxMagnitude);\n }\n\n clampComponents(min: Vector2, max: Vector2): Vector2 {\n return new Vector2(\n Math.max(min.x, Math.min(max.x, this.x)),\n Math.max(min.y, Math.min(max.y, this.y))\n );\n }\n\n lerp(target: Vector2, t: number): Vector2 {\n return new Vector2(\n this.x + (target.x - this.x) * t,\n this.y + (target.y - this.y) * t\n );\n }\n\n dot(other: Vector2): number {\n return this.x * other.x + this.y * other.y;\n }\n\n distanceTo(other: Vector2): number {\n return this.subtract(other).magnitude;\n }\n\n equals(other: Vector2, epsilon: number = 0.0001): boolean {\n return (\n Math.abs(this.x - other.x) < epsilon &&\n Math.abs(this.y - other.y) < epsilon\n );\n }\n\n isZero(epsilon: number = 0.0001): boolean {\n return this.magnitude < epsilon;\n }\n\n negate(): Vector2 {\n return new Vector2(-this.x, -this.y);\n }\n\n abs(): Vector2 {\n return new Vector2(Math.abs(this.x), Math.abs(this.y));\n }\n\n toObject(): { x: number; y: number } {\n return { x: this.x, y: this.y };\n }\n}\n","import { Vector2 } from './Vector2';\n\nexport interface SpringConfig {\n /** Force pulling toward target (100-500, default: 170) */\n tension: number;\n /** Resistance to motion (10-50, default: 26) */\n friction: number;\n /** Virtual mass affecting inertia (0.5-3, default: 1) */\n mass: number;\n /** Threshold to consider animation complete (default: 0.01) */\n precision: number;\n}\n\nexport const DEFAULT_SPRING_CONFIG: SpringConfig = {\n tension: 170,\n friction: 26,\n mass: 1,\n precision: 0.01,\n};\n\nexport interface SpringState {\n position: Vector2;\n velocity: Vector2;\n target: Vector2;\n isSettled: boolean;\n}\n\n/**\n * Spring physics simulation using semi-implicit Euler integration\n * Provides smooth, natural motion without overshoot\n */\nexport class Spring {\n private position: Vector2;\n private velocity: Vector2;\n private target: Vector2;\n private config: SpringConfig;\n\n constructor(\n initialPosition: Vector2 = Vector2.zero(),\n config: Partial<SpringConfig> = {}\n ) {\n this.position = initialPosition;\n this.velocity = Vector2.zero();\n this.target = initialPosition;\n this.config = { ...DEFAULT_SPRING_CONFIG, ...config };\n }\n\n setTarget(target: Vector2): void {\n this.target = target;\n }\n\n setPosition(position: Vector2): void {\n this.position = position;\n }\n\n setVelocity(velocity: Vector2): void {\n this.velocity = velocity;\n }\n\n updateConfig(config: Partial<SpringConfig>): void {\n this.config = { ...this.config, ...config };\n }\n\n /**\n * Advance the spring simulation by deltaTime seconds\n * Uses semi-implicit Euler for stability\n */\n step(deltaTime: number): SpringState {\n const { tension, friction, mass, precision } = this.config;\n\n // Calculate spring force: F = -k * displacement\n const displacement = this.position.subtract(this.target);\n const springForce = displacement.multiply(-tension);\n\n // Calculate damping force: F = -c * velocity\n const dampingForce = this.velocity.multiply(-friction);\n\n // Total acceleration: a = F / m\n const totalForce = springForce.add(dampingForce);\n const acceleration = totalForce.divide(mass);\n\n // Semi-implicit Euler: update velocity first, then position\n this.velocity = this.velocity.add(acceleration.multiply(deltaTime));\n this.position = this.position.add(this.velocity.multiply(deltaTime));\n\n // Check if settled\n const isSettled =\n displacement.magnitude < precision &&\n this.velocity.magnitude < precision;\n\n if (isSettled) {\n this.position = this.target;\n this.velocity = Vector2.zero();\n }\n\n return {\n position: this.position,\n velocity: this.velocity,\n target: this.target,\n isSettled,\n };\n }\n\n getState(): SpringState {\n const displacement = this.position.subtract(this.target);\n return {\n position: this.position,\n velocity: this.velocity,\n target: this.target,\n isSettled:\n displacement.magnitude < this.config.precision &&\n this.velocity.magnitude < this.config.precision,\n };\n }\n\n /**\n * Immediately snap to target\n */\n snapToTarget(): void {\n this.position = this.target;\n this.velocity = Vector2.zero();\n }\n}\n\n/**\n * 1D Spring for single-value animations (scale, opacity, etc.)\n */\nexport class Spring1D {\n private position: number;\n private velocity: number;\n private target: number;\n private config: SpringConfig;\n\n constructor(initialValue: number = 0, config: Partial<SpringConfig> = {}) {\n this.position = initialValue;\n this.velocity = 0;\n this.target = initialValue;\n this.config = { ...DEFAULT_SPRING_CONFIG, ...config };\n }\n\n setTarget(target: number): void {\n this.target = target;\n }\n\n setPosition(position: number): void {\n this.position = position;\n }\n\n setVelocity(velocity: number): void {\n this.velocity = velocity;\n }\n\n step(deltaTime: number): { value: number; velocity: number; isSettled: boolean } {\n const { tension, friction, mass, precision } = this.config;\n\n const displacement = this.position - this.target;\n const springForce = -tension * displacement;\n const dampingForce = -friction * this.velocity;\n const acceleration = (springForce + dampingForce) / mass;\n\n this.velocity += acceleration * deltaTime;\n this.position += this.velocity * deltaTime;\n\n const isSettled =\n Math.abs(displacement) < precision && Math.abs(this.velocity) < precision;\n\n if (isSettled) {\n this.position = this.target;\n this.velocity = 0;\n }\n\n return {\n value: this.position,\n velocity: this.velocity,\n isSettled,\n };\n }\n\n getValue(): number {\n return this.position;\n }\n\n snapToTarget(): void {\n this.position = this.target;\n this.velocity = 0;\n }\n}\n","import { Vector2 } from './Vector2';\n\ninterface VelocitySample {\n position: Vector2;\n timestamp: number;\n}\n\n/**\n * Velocity tracker using circular buffer for smooth velocity estimation\n * Calculates average velocity from recent position history\n */\nexport class VelocityTracker {\n private samples: VelocitySample[] = [];\n private maxSamples: number;\n private maxAge: number;\n\n constructor(maxSamples: number = 8, maxAge: number = 100) {\n this.maxSamples = maxSamples;\n this.maxAge = maxAge; // ms\n }\n\n /**\n * Record a position sample\n */\n addSample(position: Vector2, timestamp: number = performance.now()): void {\n this.samples.push({ position, timestamp });\n\n // Limit buffer size\n if (this.samples.length > this.maxSamples) {\n this.samples.shift();\n }\n }\n\n /**\n * Calculate current velocity from sample history\n * Returns smoothed velocity vector in pixels per second\n */\n getVelocity(): Vector2 {\n const now = performance.now();\n\n // Filter out old samples\n this.samples = this.samples.filter(\n (sample) => now - sample.timestamp < this.maxAge\n );\n\n if (this.samples.length < 2) {\n return Vector2.zero();\n }\n\n // Weight recent samples more heavily\n let totalWeight = 0;\n let weightedVelocity = Vector2.zero();\n\n for (let i = 1; i < this.samples.length; i++) {\n const prev = this.samples[i - 1];\n const curr = this.samples[i];\n const dt = (curr.timestamp - prev.timestamp) / 1000; // Convert to seconds\n\n if (dt <= 0) continue;\n\n const instantVelocity = curr.position.subtract(prev.position).divide(dt);\n\n // Exponential weight: more recent = higher weight\n const age = now - curr.timestamp;\n const weight = Math.exp(-age / this.maxAge);\n\n weightedVelocity = weightedVelocity.add(instantVelocity.multiply(weight));\n totalWeight += weight;\n }\n\n if (totalWeight === 0) {\n return Vector2.zero();\n }\n\n return weightedVelocity.divide(totalWeight);\n }\n\n /**\n * Get velocity magnitude in pixels per second\n */\n getSpeed(): number {\n return this.getVelocity().magnitude;\n }\n\n /**\n * Check if current velocity qualifies as a flick gesture\n */\n isFlick(threshold: number = 500): boolean {\n return this.getSpeed() > threshold;\n }\n\n /**\n * Get dominant direction of movement\n */\n getDirection(): 'up' | 'down' | 'left' | 'right' | 'none' {\n const velocity = this.getVelocity();\n const speed = velocity.magnitude;\n\n if (speed < 10) return 'none';\n\n if (Math.abs(velocity.x) > Math.abs(velocity.y)) {\n return velocity.x > 0 ? 'right' : 'left';\n } else {\n return velocity.y > 0 ? 'down' : 'up';\n }\n }\n\n /**\n * Clear all samples\n */\n reset(): void {\n this.samples = [];\n }\n\n /**\n * Get the last recorded position\n */\n getLastPosition(): Vector2 | null {\n if (this.samples.length === 0) return null;\n return this.samples[this.samples.length - 1].position;\n }\n}\n\n/**\n * 1D velocity tracker for single-axis motion\n */\nexport class VelocityTracker1D {\n private samples: { value: number; timestamp: number }[] = [];\n private maxSamples: number;\n private maxAge: number;\n\n constructor(maxSamples: number = 8, maxAge: number = 100) {\n this.maxSamples = maxSamples;\n this.maxAge = maxAge;\n }\n\n addSample(value: number, timestamp: number = performance.now()): void {\n this.samples.push({ value, timestamp });\n if (this.samples.length > this.maxSamples) {\n this.samples.shift();\n }\n }\n\n getVelocity(): number {\n const now = performance.now();\n this.samples = this.samples.filter((s) => now - s.timestamp < this.maxAge);\n\n if (this.samples.length < 2) return 0;\n\n let totalWeight = 0;\n let weightedVelocity = 0;\n\n for (let i = 1; i < this.samples.length; i++) {\n const prev = this.samples[i - 1];\n const curr = this.samples[i];\n const dt = (curr.timestamp - prev.timestamp) / 1000;\n\n if (dt <= 0) continue;\n\n const instantVelocity = (curr.value - prev.value) / dt;\n const age = now - curr.timestamp;\n const weight = Math.exp(-age / this.maxAge);\n\n weightedVelocity += instantVelocity * weight;\n totalWeight += weight;\n }\n\n return totalWeight > 0 ? weightedVelocity / totalWeight : 0;\n }\n\n reset(): void {\n this.samples = [];\n }\n}\n","import { Vector2 } from './Vector2';\n\nexport interface FrictionConfig {\n /** Friction coefficient (0.9-0.99, higher = less friction) */\n decay: number;\n /** Minimum velocity before stopping (default: 0.1) */\n stopThreshold: number;\n /** Maximum velocity cap (default: 5000 px/s) */\n maxVelocity: number;\n}\n\nexport const DEFAULT_FRICTION_CONFIG: FrictionConfig = {\n decay: 0.95,\n stopThreshold: 0.1,\n maxVelocity: 2000,\n};\n\n/**\n * Momentum system with exponential friction decay\n * Provides natural deceleration after flick gestures\n */\nexport class Momentum {\n private position: Vector2;\n private velocity: Vector2;\n private config: FrictionConfig;\n private isActive: boolean = false;\n\n constructor(\n initialPosition: Vector2 = Vector2.zero(),\n config: Partial<FrictionConfig> = {}\n ) {\n this.position = initialPosition;\n this.velocity = Vector2.zero();\n this.config = { ...DEFAULT_FRICTION_CONFIG, ...config };\n }\n\n /**\n * Start momentum with initial velocity\n */\n start(position: Vector2, velocity: Vector2): void {\n this.position = position;\n // Clamp velocity to max\n this.velocity = velocity.clamp(this.config.maxVelocity);\n this.isActive = true;\n }\n\n /**\n * Stop momentum immediately\n */\n stop(): void {\n this.velocity = Vector2.zero();\n this.isActive = false;\n }\n\n /**\n * Update momentum simulation\n * @param deltaTime Time in seconds\n */\n step(deltaTime: number): {\n position: Vector2;\n velocity: Vector2;\n isActive: boolean;\n } {\n if (!this.isActive) {\n return {\n position: this.position,\n velocity: Vector2.zero(),\n isActive: false,\n };\n }\n\n // Apply velocity to position\n this.position = this.position.add(this.velocity.multiply(deltaTime));\n\n // Apply exponential friction decay\n // Adjust decay for frame rate independence\n const frameDecay = Math.pow(this.config.decay, deltaTime * 60);\n this.velocity = this.velocity.multiply(frameDecay);\n\n // Check if velocity is below threshold\n if (this.velocity.magnitude < this.config.stopThreshold) {\n this.velocity = Vector2.zero();\n this.isActive = false;\n }\n\n return {\n position: this.position,\n velocity: this.velocity,\n isActive: this.isActive,\n };\n }\n\n /**\n * Apply rubber band effect at boundaries\n */\n applyRubberBand(\n bounds: { min: Vector2; max: Vector2 },\n rubberBandFactor: number = 0.55\n ): void {\n let newX = this.position.x;\n let newY = this.position.y;\n\n // Calculate rubber band displacement\n if (this.position.x < bounds.min.x) {\n const overshoot = bounds.min.x - this.position.x;\n newX = bounds.min.x - overshoot * rubberBandFactor;\n } else if (this.position.x > bounds.max.x) {\n const overshoot = this.position.x - bounds.max.x;\n newX = bounds.max.x + overshoot * rubberBandFactor;\n }\n\n if (this.position.y < bounds.min.y) {\n const overshoot = bounds.min.y - this.position.y;\n newY = bounds.min.y - overshoot * rubberBandFactor;\n } else if (this.position.y > bounds.max.y) {\n const overshoot = this.position.y - bounds.max.y;\n newY = bounds.max.y + overshoot * rubberBandFactor;\n }\n\n this.position = new Vector2(newX, newY);\n }\n\n getPosition(): Vector2 {\n return this.position;\n }\n\n getVelocity(): Vector2 {\n return this.velocity;\n }\n\n getIsActive(): boolean {\n return this.isActive;\n }\n\n setPosition(position: Vector2): void {\n this.position = position;\n }\n\n updateConfig(config: Partial<FrictionConfig>): void {\n this.config = { ...this.config, ...config };\n }\n}\n\n/**\n * 1D Momentum for single-axis motion\n */\nexport class Momentum1D {\n private position: number;\n private velocity: number;\n private config: FrictionConfig;\n private isActive: boolean = false;\n\n constructor(initialPosition: number = 0, config: Partial<FrictionConfig> = {}) {\n this.position = initialPosition;\n this.velocity = 0;\n this.config = { ...DEFAULT_FRICTION_CONFIG, ...config };\n }\n\n start(position: number, velocity: number): void {\n this.position = position;\n this.velocity = Math.sign(velocity) * Math.min(Math.abs(velocity), this.config.maxVelocity);\n this.isActive = true;\n }\n\n stop(): void {\n this.velocity = 0;\n this.isActive = false;\n }\n\n step(deltaTime: number): { position: number; velocity: number; isActive: boolean } {\n if (!this.isActive) {\n return { position: this.position, velocity: 0, isActive: false };\n }\n\n this.position += this.velocity * deltaTime;\n const frameDecay = Math.pow(this.config.decay, deltaTime * 60);\n this.velocity *= frameDecay;\n\n if (Math.abs(this.velocity) < this.config.stopThreshold) {\n this.velocity = 0;\n this.isActive = false;\n }\n\n return {\n position: this.position,\n velocity: this.velocity,\n isActive: this.isActive,\n };\n }\n\n getPosition(): number {\n return this.position;\n }\n\n setPosition(position: number): void {\n this.position = position;\n }\n}\n","type UpdateCallback = (deltaTime: number) => void;\n\ninterface PhysicsBody {\n id: string;\n update: UpdateCallback;\n priority: number;\n}\n\n/**\n * Central physics engine with shared RAF loop\n * Manages all physics simulations efficiently\n */\nclass PhysicsEngineCore {\n private bodies: Map<string, PhysicsBody> = new Map();\n private rafId: number | null = null;\n private lastTime: number = 0;\n private isRunning: boolean = false;\n\n // Cap deltaTime to prevent spiral of death (max ~30fps frame time)\n private readonly maxDelta = 1 / 30;\n\n /**\n * Register a physics body to receive updates\n */\n register(id: string, update: UpdateCallback, priority: number = 0): void {\n this.bodies.set(id, { id, update, priority });\n this.start();\n }\n\n /**\n * Unregister a physics body\n */\n unregister(id: string): void {\n this.bodies.delete(id);\n\n // Auto-pause when no bodies are registered\n if (this.bodies.size === 0) {\n this.stop();\n }\n }\n\n /**\n * Check if a body is registered\n */\n has(id: string): boolean {\n return this.bodies.has(id);\n }\n\n /**\n * Start the physics loop\n */\n private start(): void {\n if (this.isRunning) return;\n\n this.isRunning = true;\n this.lastTime = performance.now();\n this.loop();\n }\n\n /**\n * Stop the physics loop\n */\n private stop(): void {\n if (!this.isRunning) return;\n\n this.isRunning = false;\n if (this.rafId !== null) {\n cancelAnimationFrame(this.rafId);\n this.rafId = null;\n }\n }\n\n /**\n * Main RAF loop\n */\n private loop = (): void => {\n if (!this.isRunning) return;\n\n const currentTime = performance.now();\n let deltaTime = (currentTime - this.lastTime) / 1000;\n this.lastTime = currentTime;\n\n // Cap delta time to prevent instability\n deltaTime = Math.min(deltaTime, this.maxDelta);\n\n // Sort bodies by priority and update\n const sortedBodies = Array.from(this.bodies.values()).sort(\n (a, b) => b.priority - a.priority\n );\n\n for (const body of sortedBodies) {\n body.update(deltaTime);\n }\n\n this.rafId = requestAnimationFrame(this.loop);\n };\n\n /**\n * Get current number of active bodies\n */\n getActiveCount(): number {\n return this.bodies.size;\n }\n\n /**\n * Check if engine is running\n */\n getIsRunning(): boolean {\n return this.isRunning;\n }\n}\n\n// Singleton instance\nexport const PhysicsEngine = new PhysicsEngineCore();\n\n/**\n * Generate unique ID for physics bodies\n */\nlet idCounter = 0;\nexport function generatePhysicsId(prefix: string = 'physics'): string {\n return `${prefix}_${++idCounter}_${Date.now().toString(36)}`;\n}\n","import { SpringConfig } from '../core/Spring';\nimport { FrictionConfig } from '../core/Friction';\n\nexport interface PhysicsPreset {\n name: string;\n description: string;\n spring: SpringConfig;\n friction: FrictionConfig;\n stretch: {\n intensity: number;\n maxVelocity: number;\n };\n lift: {\n scale: number;\n shadowIntensity: number;\n };\n}\n\n/**\n * iOS-like feel\n * Smooth, natural, slightly bouncy response\n * Premium Apple-style interactions\n */\nexport const ios: PhysicsPreset = {\n name: 'ios',\n description: 'iOS-like smooth, natural feel',\n spring: {\n tension: 170,\n friction: 26,\n mass: 1,\n precision: 0.01,\n },\n friction: {\n decay: 0.95,\n stopThreshold: 0.1,\n maxVelocity: 2000,\n },\n stretch: {\n intensity: 0.08,\n maxVelocity: 1500,\n },\n lift: {\n scale: 1.02,\n shadowIntensity: 0.8,\n },\n};\n\n/**\n * Snappy preset\n * Ultra-responsive, minimal lag\n * For UI that needs to feel instant\n */\nexport const snappy: PhysicsPreset = {\n name: 'snappy',\n description: 'Ultra-responsive, instant feedback',\n spring: {\n tension: 400,\n friction: 30,\n mass: 0.8,\n precision: 0.01,\n },\n friction: {\n decay: 0.92,\n stopThreshold: 0.5,\n maxVelocity: 3000,\n },\n stretch: {\n intensity: 0.06,\n maxVelocity: 2000,\n },\n lift: {\n scale: 1.015,\n shadowIntensity: 0.6,\n },\n};\n\n/**\n * Smooth preset\n * Slow, deliberate, luxurious feel\n * For premium, elegant interfaces\n */\nexport const smooth: PhysicsPreset = {\n name: 'smooth',\n description: 'Slow, luxurious, elegant motion',\n spring: {\n tension: 120,\n friction: 20,\n mass: 1.5,\n precision: 0.005,\n },\n friction: {\n decay: 0.97,\n stopThreshold: 0.05,\n maxVelocity: 1500,\n },\n stretch: {\n intensity: 0.1,\n maxVelocity: 1200,\n },\n lift: {\n scale: 1.04,\n shadowIntensity: 1.2,\n },\n};\n\n/**\n * Stiff preset\n * Minimal overshoot, direct response\n * For precision interfaces\n */\nexport const stiff: PhysicsPreset = {\n name: 'stiff',\n description: 'Direct, precise, no overshoot',\n spring: {\n tension: 300,\n friction: 35,\n mass: 1,\n precision: 0.01,\n },\n friction: {\n decay: 0.9,\n stopThreshold: 0.2,\n maxVelocity: 2500,\n },\n stretch: {\n intensity: 0.04,\n maxVelocity: 2500,\n },\n lift: {\n scale: 1.01,\n shadowIntensity: 0.5,\n },\n};\n\n/**\n * Gentle preset\n * Soft, forgiving, approachable\n * For friendly, accessible interfaces\n */\nexport const gentle: PhysicsPreset = {\n name: 'gentle',\n description: 'Soft, forgiving, approachable',\n spring: {\n tension: 150,\n friction: 22,\n mass: 1.2,\n precision: 0.01,\n },\n friction: {\n decay: 0.96,\n stopThreshold: 0.1,\n maxVelocity: 1800,\n },\n stretch: {\n intensity: 0.12,\n maxVelocity: 1400,\n },\n lift: {\n scale: 1.03,\n shadowIntensity: 1,\n },\n};\n\n// Preset map for easy lookup\nexport const presets: Record<string, PhysicsPreset> = {\n ios,\n snappy,\n smooth,\n stiff,\n gentle,\n};\n\n/**\n * Get a preset by name\n */\nexport function getPreset(name: string): PhysicsPreset | undefined {\n return presets[name];\n}\n\n/**\n * Get spring config from preset name\n */\nexport function getSpringConfig(preset: string | SpringConfig): SpringConfig {\n if (typeof preset === 'string') {\n return presets[preset]?.spring ?? ios.spring;\n }\n return preset;\n}\n\n/**\n * Get friction config from preset name\n */\nexport function getFrictionConfig(preset: string | FrictionConfig): FrictionConfig {\n if (typeof preset === 'string') {\n return presets[preset]?.friction ?? ios.friction;\n }\n return preset;\n}\n","import React, { createContext, useContext, useMemo } from 'react';\nimport { SpringConfig, DEFAULT_SPRING_CONFIG } from '../core/Spring';\nimport { FrictionConfig, DEFAULT_FRICTION_CONFIG } from '../core/Friction';\nimport { PhysicsPreset, presets, ios } from '../presets';\n\nexport interface PhysicsContextValue {\n spring: SpringConfig;\n friction: FrictionConfig;\n stretch: {\n intensity: number;\n maxVelocity: number;\n };\n lift: {\n scale: number;\n shadowIntensity: number;\n };\n}\n\nconst defaultContext: PhysicsContextValue = {\n spring: DEFAULT_SPRING_CONFIG,\n friction: DEFAULT_FRICTION_CONFIG,\n stretch: {\n intensity: 0.12,\n maxVelocity: 2000,\n },\n lift: {\n scale: 1.03,\n shadowIntensity: 1,\n },\n};\n\nconst PhysicsContext = createContext<PhysicsContextValue>(defaultContext);\n\nexport interface PhysicsProviderProps {\n children: React.ReactNode;\n /** Preset name or custom configuration */\n preset?: keyof typeof presets | PhysicsPreset;\n /** Override spring config */\n spring?: Partial<SpringConfig>;\n /** Override friction config */\n friction?: Partial<FrictionConfig>;\n /** Override stretch config */\n stretch?: Partial<{ intensity: number; maxVelocity: number }>;\n /** Override lift config */\n lift?: Partial<{ scale: number; shadowIntensity: number }>;\n}\n\n/**\n * Provider for global physics configuration\n * Wrap your app or component tree to set defaults\n */\nexport function PhysicsProvider({\n children,\n preset = 'ios',\n spring,\n friction,\n stretch,\n lift,\n}: PhysicsProviderProps) {\n const value = useMemo(() => {\n // Resolve preset\n const basePreset: PhysicsPreset =\n typeof preset === 'string' ? presets[preset] ?? ios : preset;\n\n return {\n spring: { ...basePreset.spring, ...spring },\n friction: { ...basePreset.friction, ...friction },\n stretch: { ...basePreset.stretch, ...stretch },\n lift: { ...basePreset.lift, ...lift },\n };\n }, [preset, spring, friction, stretch, lift]);\n\n return (\n <PhysicsContext.Provider value={value}>\n {children}\n </PhysicsContext.Provider>\n );\n}\n\n/**\n * Hook to access physics configuration\n */\nexport function usePhysicsContext(): PhysicsContextValue {\n return useContext(PhysicsContext);\n}\n\n/**\n * Hook to get spring config from context\n */\nexport function usePhysicsConfig(): Partial<SpringConfig> {\n const context = useContext(PhysicsContext);\n return context.spring;\n}\n\n/**\n * Hook to get friction config from context\n */\nexport function useFrictionConfig(): Partial<FrictionConfig> {\n const context = useContext(PhysicsContext);\n return context.friction;\n}\n\n/**\n * Hook to get stretch config from context\n */\nexport function useStretchConfig(): { intensity: number; maxVelocity: number } {\n const context = useContext(PhysicsContext);\n return context.stretch;\n}\n\n/**\n * Hook to get lift config from context\n */\nexport function useLiftConfig(): { scale: number; shadowIntensity: number } {\n const context = useContext(PhysicsContext);\n return context.lift;\n}\n","import { useRef, useState, useEffect, useCallback, useMemo } from 'react';\nimport { Spring, Spring1D, SpringConfig, DEFAULT_SPRING_CONFIG } from '../core/Spring';\nimport { Vector2 } from '../core/Vector2';\nimport { PhysicsEngine, generatePhysicsId } from '../core/PhysicsEngine';\nimport { usePhysicsConfig } from '../components/PhysicsProvider';\n\nexport interface UseSpringOptions {\n /** Initial position */\n from?: { x: number; y: number };\n /** Target position */\n to: { x: number; y: number };\n /** Spring configuration or preset name */\n config?: Partial<SpringConfig> | 'ios' | 'snappy' | 'smooth';\n /** Callback when animation completes */\n onRest?: () => void;\n /** Start immediately (default: true) */\n immediate?: boolean;\n}\n\nexport interface UseSpringReturn {\n /** Current x position */\n x: number;\n /** Current y position */\n y: number;\n /** CSS style object ready to apply */\n style: React.CSSProperties;\n /** Whether animation is currently running */\n isAnimating: boolean;\n /** Whether animation has reached target */\n isSettled: boolean;\n /** Set new target position */\n setTarget: (target: { x: number; y: number }) => void;\n /** Immediately snap to position */\n snapTo: (position: { x: number; y: number }) => void;\n /** Add impulse velocity */\n impulse: (velocity: { x: number; y: number }) => void;\n}\n\nexport function useSpring(options: UseSpringOptions): UseSpringReturn {\n const { to, from, config, onRest, immediate = true } = options;\n const globalConfig = usePhysicsConfig();\n\n // Resolve config from presets or custom\n const resolvedConfig = useMemo(() => {\n if (!config) return { ...DEFAULT_SPRING_CONFIG, ...globalConfig };\n if (typeof config === 'string') {\n // Preset names resolved elsewhere\n return { ...DEFAULT_SPRING_CONFIG, ...globalConfig };\n }\n return { ...DEFAULT_SPRING_CONFIG, ...globalConfig, ...config };\n }, [config, globalConfig]);\n\n const springRef = useRef<Spring | null>(null);\n const idRef = useRef<string>(generatePhysicsId('spring'));\n const onRestRef = useRef(onRest);\n onRestRef.current = onRest;\n\n const [state, setState] = useState({\n x: from?.x ?? to.x,\n y: from?.y ?? to.y,\n isAnimating: false,\n isSettled: true,\n });\n\n // Initialize spring\n useEffect(() => {\n const initialPos = from ? Vector2.from(from.x, from.y) : Vector2.from(to.x, to.y);\n springRef.current = new Spring(initialPos, resolvedConfig);\n\n if (immediate) {\n springRef.current.setTarget(Vector2.from(to.x, to.y));\n }\n\n return () => {\n PhysicsEngine.unregister(idRef.current);\n };\n }, []);\n\n // Update target when 'to' changes\n useEffect(() => {\n if (springRef.current && immediate) {\n springRef.current.setTarget(Vector2.from(to.x, to.y));\n\n // Register for updates if not already\n if (!PhysicsEngine.has(idRef.current)) {\n PhysicsEngine.register(idRef.current, (deltaTime) => {\n if (!springRef.current) return;\n\n const result = springRef.current.step(deltaTime);\n setState({\n x: result.position.x,\n y: result.position.y,\n isAnimating: !result.isSettled,\n isSettled: result.isSettled,\n });\n\n if (result.isSettled) {\n PhysicsEngine.unregister(idRef.current);\n onRestRef.current?.();\n }\n });\n }\n }\n }, [to.x, to.y, immediate]);\n\n // Update config when it changes\n useEffect(() => {\n springRef.current?.updateConfig(resolvedConfig);\n }, [resolvedConfig]);\n\n const setTarget = useCallback((target: { x: number; y: number }) => {\n if (!springRef.current) return;\n\n springRef.current.setTarget(Vector2.from(target.x, target.y));\n\n if (!PhysicsEngine.has(idRef.current)) {\n PhysicsEngine.register(idRef.current, (deltaTime) => {\n if (!springRef.current) return;\n\n const result = springRef.current.step(deltaTime);\n setState({\n x: result.position.x,\n y: result.position.y,\n isAnimating: !result.isSettled,\n isSettled: result.isSettled,\n });\n\n if (result.isSettled) {\n PhysicsEngine.unregister(idRef.current);\n onRestRef.current?.();\n }\n });\n }\n }, []);\n\n const snapTo = useCallback((position: { x: number; y: number }) => {\n if (!springRef.current) return;\n\n springRef.current.setPosition(Vector2.from(position.x, position.y));\n springRef.current.setTarget(Vector2.from(position.x, position.y));\n springRef.current.snapToTarget();\n\n setState({\n x: position.x,\n y: position.y,\n isAnimating: false,\n isSettled: true,\n });\n\n PhysicsEngine.unregister(idRef.current);\n }, []);\n\n const impulse = useCallback((velocity: { x: number; y: number }) => {\n if (!springRef.current) return;\n\n const currentState = springRef.current.getState();\n springRef.current.setVelocity(\n currentState.velocity.add(Vector2.from(velocity.x, velocity.y))\n );\n\n if (!PhysicsEngine.has(idRef.current)) {\n PhysicsEngine.register(idRef.current, (deltaTime) => {\n if (!springRef.current) return;\n\n const result = springRef.current.step(deltaTime);\n setState({\n x: result.position.x,\n y: result.position.y,\n isAnimating: !result.isSettled,\n isSettled: result.isSettled,\n });\n\n if (result.isSettled) {\n PhysicsEngine.unregister(idRef.current);\n onRestRef.current?.();\n }\n });\n }\n }, []);\n\n const style: React.CSSProperties = useMemo(\n () => ({\n transform: `translate3d(${state.x}px, ${state.y}px, 0)`,\n willChange: state.isAnimating ? 'transform' : 'auto',\n }),\n [state.x, state.y, state.isAnimating]\n );\n\n return {\n x: state.x,\n y: state.y,\n style,\n isAnimating: state.isAnimating,\n isSettled: state.isSettled,\n setTarget,\n snapTo,\n impulse,\n };\n}\n\n/**\n * 1D Spring hook for single values (scale, opacity, rotation, etc.)\n */\nexport interface UseSpring1DOptions {\n from?: number;\n to: number;\n config?: Partial<SpringConfig>;\n onRest?: () => void;\n immediate?: boolean;\n}\n\nexport function useSpring1D(options: UseSpring1DOptions) {\n const { to, from, config, onRest, immediate = true } = options;\n const globalConfig = usePhysicsConfig();\n\n const resolvedConfig = useMemo(\n () => ({ ...DEFAULT_SPRING_CONFIG, ...globalConfig, ...config }),\n [config, globalConfig]\n );\n\n const springRef = useRef<Spring1D | null>(null);\n const idRef = useRef<string>(generatePhysicsId('spring1d'));\n const onRestRef = useRef(onRest);\n onRestRef.current = onRest;\n\n const [state, setState] = useState({\n value: from ?? to,\n isAnimating: false,\n isSettled: true,\n });\n\n useEffect(() => {\n springRef.current = new Spring1D(from ?? to, resolvedConfig);\n\n if (immediate) {\n springRef.current.setTarget(to);\n }\n\n return () => {\n PhysicsEngine.unregister(idRef.current);\n };\n }, []);\n\n useEffect(() => {\n if (springRef.current && immediate) {\n springRef.current.setTarget(to);\n\n if (!PhysicsEngine.has(idRef.current)) {\n PhysicsEngine.register(idRef.current, (deltaTime) => {\n if (!springRef.current) return;\n\n const result = springRef.current.step(deltaTime);\n setState({\n value: result.value,\n isAnimating: !result.isSettled,\n isSettled: result.isSettled,\n });\n\n if (result.isSettled) {\n PhysicsEngine.unregister(idRef.current);\n onRestRef.current?.();\n }\n });\n }\n }\n }, [to, immediate]);\n\n const setTarget = useCallback((target: number) => {\n if (!springRef.current) return;\n springRef.current.setTarget(target);\n\n if (!PhysicsEngine.has(idRef.current)) {\n PhysicsEngine.register(idRef.current, (deltaTime) => {\n if (!springRef.current) return;\n\n const result = springRef.current.step(deltaTime);\n setState({\n value: result.value,\n isAnimating: !result.isSettled,\n isSettled: result.isSettled,\n });\n\n if (result.isSettled) {\n PhysicsEngine.unregister(idRef.current);\n onRestRef.current?.();\n }\n });\n }\n }, []);\n\n return {\n value: state.value,\n isAnimating: state.isAnimating,\n isSettled: state.isSettled,\n setTarget,\n };\n}\n","import { useRef, useCallback, useEffect } from 'react';\nimport { Vector2 } from '../core/Vector2';\nimport { VelocityTracker } from '../core/Velocity';\n\nexport interface GestureState {\n /** Current position relative to element */\n position: Vector2;\n /** Delta from last event */\n delta: Vector2;\n /** Delta from start of gesture */\n offset: Vector2;\n /** Current velocity in px/s */\n velocity: Vector2;\n /** Dominant movement direction */\n direction: 'up' | 'down' | 'left' | 'right' | 'none';\n /** Whether gesture is currently active */\n active: boolean;\n /** Whether this is first event of gesture */\n first: boolean;\n /** Whether this is last event of gesture */\n last: boolean;\n /** Original event */\n event: PointerEvent;\n}\n\nexport interface GestureHandlers {\n onDragStart?: (state: GestureState) => void;\n onDrag?: (state: GestureState) => void;\n onDragEnd?: (state: GestureState) => void;\n onFlick?: (state: GestureState & { flickVelocity: Vector2 }) => void;\n onHover?: (hovering: boolean) => void;\n onFocus?: (focused: boolean) => void;\n}\n\nexport interface UseGestureOptions extends GestureHandlers {\n /** Minimum distance before drag starts (default: 3) */\n threshold?: number;\n /** Minimum velocity for flick detection (default: 500 px/s) */\n flickThreshold?: number;\n /** Enable touch action prevention */\n preventTouch?: boolean;\n}\n\nexport interface GestureBindings {\n onPointerDown: (e: React.PointerEvent) => void;\n onPointerEnter: (e: React.PointerEvent) => void;\n onPointerLeave: (e: React.PointerEvent) => void;\n onFocus: (e: React.FocusEvent) => void;\n onBlur: (e: React.FocusEvent) => void;\n style: React.CSSProperties;\n}\n\nexport function useGesture(options: UseGestureOptions): GestureBindings {\n const {\n onDragStart,\n onDrag,\n onDragEnd,\n onFlick,\n onHover,\n onFocus,\n threshold = 3,\n flickThreshold = 500,\n preventTouch = true,\n } = options;\n\n const velocityTracker = useRef(new VelocityTracker());\n const startPosition = useRef<Vector2>(Vector2.zero());\n const lastPosition = useRef<Vector2>(Vector2.zero());\n const isDragging = useRef(false);\n const hasExceededThreshold = useRef(false);\n const pointerId = useRef<number | null>(null);\n const elementRef = useRef<HTMLElement | null>(null);\n\n // Store handlers in refs to avoid stale closures\n const handlersRef = useRef({ onDragStart, onDrag, onDragEnd, onFlick });\n handlersRef.current = { onDragStart, onDrag, onDragEnd, onFlick };\n\n const createGestureState = useCallback(\n (event: PointerEvent, first: boolean, last: boolean): GestureState => {\n const position = Vector2.from(event.clientX, event.clientY);\n const delta = position.subtract(lastPosition.current);\n const offset = position.subtract(startPosition.current);\n const velocity = velocityTracker.current.getVelocity();\n const direction = velocityTracker.current.getDirection();\n\n return {\n position,\n delta,\n offset,\n velocity,\n direction,\n active: !last,\n first,\n last,\n event,\n };\n },\n []\n );\n\n const handlePointerMove = useCallback(\n (event: PointerEvent) => {\n if (!isDragging.current || pointerId.current !== event.pointerId) return;\n\n const position = Vector2.from(event.clientX, event.clientY);\n velocityTracker.current.addSample(position);\n\n // Check threshold\n if (!hasExceededThreshold.current) {\n const distance = position.distanceTo(startPosition.current);\n if (distance < threshold) return;\n\n hasExceededThreshold.current = true;\n const state = createGestureState(event, true, false);\n handlersRef.current.onDragStart?.(state);\n }\n\n const state = createGestureState(event, false, false);\n handlersRef.current.onDrag?.(state);\n lastPosition.current = position;\n },\n [threshold, createGestureState]\n );\n\n const handlePointerUp = useCallback(\n (event: PointerEvent) => {\n if (!isDragging.current || pointerId.current !== event.pointerId) return;\n\n isDragging.current = false;\n pointerId.current = null;\n\n document.removeEventListener('pointermove', handlePointerMove);\n document.removeEventListener('pointerup', handlePointerUp);\n document.removeEventListener('pointercancel', handlePointerUp);\n\n if (hasExceededThreshold.current) {\n const state = createGestureState(event, false, true);\n handlersRef.current.onDragEnd?.(state);\n\n // Check for flick\n const velocity = velocityTracker.current.getVelocity();\n if (velocity.magnitude > flickThreshold) {\n handlersRef.current.onFlick?.({ ...state, flickVelocity: velocity });\n }\n }\n\n velocityTracker.current.reset();\n hasExceededThreshold.current = false;\n },\n [handlePointerMove, createGestureState, flickThreshold]\n );\n\n const onPointerDown = useCallback(\n (e: React.PointerEvent) => {\n if (isDragging.current) return;\n\n const element = e.currentTarget as HTMLElement;\n elementRef.current = element;\n element.setPointerCapture(e.pointerId);\n\n pointerId.current = e.pointerId;\n isDragging.current = true;\n hasExceededThreshold.current = false;\n\n const position = Vector2.from(e.clientX, e.clientY);\n startPosition.current = position;\n lastPosition.current = position;\n velocityTracker.current.reset();\n velocityTracker.current.addSample(position);\n\n document.addEventListener('pointermove', handlePointerMove);\n document.addEventListener('pointerup', handlePointerUp);\n document.addEventListener('pointercancel', handlePointerUp);\n },\n [handlePointerMove, handlePointerUp]\n );\n\n const onPointerEnter = useCallback(() => {\n onHover?.(true);\n }, [onHover]);\n\n const onPointerLeave = useCallback(() => {\n onHover?.(false);\n }, [onHover]);\n\n const handleFocus = useCallback(() => {\n onFocus?.(true);\n }, [onFocus]);\n\n const handleBlur = useCallback(() => {\n onFocus?.(false);\n }, [onFocus]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n document.removeEventListener('pointermove', handlePointerMove);\n document.removeEventListener('pointerup', handlePointerUp);\n document.removeEventListener('pointercancel', handlePointerUp);\n };\n }, [handlePointerMove, handlePointerUp]);\n\n return {\n onPointerDown,\n onPointerEnter,\n onPointerLeave,\n onFocus: handleFocus,\n onBlur: handleBlur,\n style: preventTouch ? { touchAction: 'none' } : {},\n };\n}\n","import { useRef, useState, useCallback, useEffect, useMemo } from 'react';\nimport { Vector2 } from '../core/Vector2';\nimport { Spring, SpringConfig, DEFAULT_SPRING_CONFIG } from '../core/Spring';\nimport { Momentum, FrictionConfig, DEFAULT_FRICTION_CONFIG } from '../core/Friction';\nimport { VelocityTracker } from '../core/Velocity';\nimport { PhysicsEngine, generatePhysicsId } from '../core/PhysicsEngine';\nimport { usePhysicsConfig } from '../components/PhysicsProvider';\n\nexport interface Bounds {\n left?: number;\n right?: number;\n top?: number;\n bottom?: number;\n}\n\nexport interface UseDragOptions {\n /** Initial position */\n initial?: { x: number; y: number };\n /** Movement bounds */\n bounds?: Bounds;\n /** Enable rubber band effect at bounds (default: true) */\n rubberBand?: boolean;\n /** Rubber band resistance (0-1, default: 0.55) */\n rubberBandFactor?: number;\n /** Enable momentum after release (default: true) */\n momentum?: boolean;\n /** Snap to positions after release */\n snapTo?: { x: number; y: number }[];\n /** Snap threshold distance (default: 50) */\n snapThreshold?: number;\n /** Lock to single axis */\n axis?: 'x' | 'y' | 'both';\n /** Spring configuration for snap */\n springConfig?: Partial<SpringConfig>;\n /** Friction configuration for momentum */\n frictionConfig?: Partial<FrictionConfig>;\n /** Callback on drag start */\n onDragStart?: (position: Vector2) => void;\n /** Callback during drag */\n onDrag?: (position: Vector2) => void;\n /** Callback on drag end */\n onDragEnd?: (position: Vector2, velocity: Vector2) => void;\n /** Callback when settled */\n onRest?: (position: Vector2) => void;\n}\n\nexport interface UseDragReturn {\n /** Current x position */\n x: number;\n /** Current y position */\n y: number;\n /** Whether currently dragging */\n isDragging: boolean;\n /** Whether momentum is active */\n isMomentum: boolean;\n /** CSS style object */\n style: React.CSSProperties;\n /** Bind to element */\n bind: {\n onPointerDown: (e: React.PointerEvent) => void;\n style: React.CSSProperties;\n };\n /** Set position programmatically */\n setPosition: (position: { x: number; y: number }) => void;\n /** Snap to position with spring */\n snapToPosition: (position: { x: number; y: number }) => void;\n}\n\nexport function useDrag(options: UseDragOptions = {}): UseDragReturn {\n const {\n initial = { x: 0, y: 0 },\n bounds,\n rubberBand = true,\n rubberBandFactor = 0.55,\n momentum = true,\n snapTo,\n snapThreshold = 50,\n axis = 'both',\n springConfig,\n frictionConfig,\n onDragStart,\n onDrag,\n onDragEnd,\n onRest,\n } = options;\n\n const globalConfig = usePhysicsConfig();\n const resolvedSpringConfig = useMemo(\n () => ({ ...DEFAULT_SPRING_CONFIG, ...globalConfig, ...springConfig }),\n [globalConfig, springConfig]\n );\n const resolvedFrictionConfig = useMemo(\n () => ({ ...DEFAULT_FRICTION_CONFIG, ...frictionConfig }),\n [frictionConfig]\n );\n\n const [state, setState] = useState({\n x: initial.x,\n y: initial.y,\n isDragging: false,\n isMomentum: false,\n });\n\n const positionRef = useRef(Vector2.from(initial.x, initial.y));\n const startPositionRef = useRef(Vector2.zero());\n const dragOffsetRef = useRef(Vector2.zero());\n const velocityTracker = useRef(new VelocityTracker());\n const springRef = useRef<Spring | null>(null);\n const momentumRef = useRef<Momentum | null>(null);\n const idRef = useRef(generatePhysicsId('drag'));\n const pointerIdRef = useRef<number | null>(null);\n\n const handlersRef = useRef({ onDragStart, onDrag, onDragEnd, onRest });\n handlersRef.current = { onDragStart, onDrag, onDragEnd, onRest };\n\n // Convert bounds to Vector2 format\n const boundsVec = useMemo(() => {\n if (!bounds) return null;\n return {\n min: Vector2.from(bounds.left ?? -Infinity, bounds.top ?? -Infinity),\n max: Vector2.from(bounds.right ?? Infinity, bounds.bottom ?? Infinity),\n };\n }, [bounds]);\n\n // Apply rubber band at bounds\n const applyRubberBand = useCallback(\n (pos: Vector2): Vector2 => {\n if (!boundsVec || !rubberBand) return pos;\n\n let x = pos.x;\n let y = pos.y;\n\n if (pos.x < boundsVec.min.x) {\n const over = boundsVec.min.x - pos.x;\n x = boundsVec.min.x - over * rubberBandFactor;\n } else if (pos.x > boundsVec.max.x) {\n const over = pos.x - boundsVec.max.x;\n x = boundsVec.max.x + over * rubberBandFactor;\n }\n\n if (pos.y < boundsVec.min.y) {\n const over = boundsVec.min.y - pos.y;\n y = boundsVec.min.y - over * rubberBandFactor;\n } else if (pos.y > boundsVec.max.y) {\n const over = pos.y - boundsVec.max.y;\n y = boundsVec.max.y + over * rubberBandFactor;\n }\n\n return Vector2.from(x, y);\n },\n [boundsVec, rubberBand, rubberBandFactor]\n );\n\n // Clamp to bounds\n const clampToBounds = useCallback(\n (pos: Vector2): Vector2 => {\n if (!boundsVec) return pos;\n return pos.clampComponents(boundsVec.min, boundsVec.max);\n },\n [boundsVec]\n );\n\n // Find nearest snap point\n const findSnapPoint = useCallback(\n (pos: Vector2, velocity: Vector2): Vector2 | null => {\n if (!snapTo || snapTo.length === 0) return null;\n\n // Project position based on velocity\n const projectedPos = pos.add(velocity.multiply(0.1));\n\n let nearestPoint: Vector2 | null = null;\n let nearestDistance = Infinity;\n\n for (const point of snapTo) {\n const snapVec = Vector2.from(point.x, point.y);\n const distance = projectedPos.distanceTo(snapVec);\n\n if (distance < nearestDistance && distance < snapThreshold) {\n nearestDistance = distance;\n nearestPoint = snapVec;\n }\n }\n\n return nearestPoint;\n },\n [snapTo, snapThreshold]\n );\n\n // Spring animation to target\n const animateToTarget = useCallback(\n (target: Vector2) => {\n springRef.current = new Spring(positionRef.current, resolvedSpringConfig);\n springRef.current.setTarget(target);\n\n PhysicsEngine.register(idRef.current, (deltaTime) => {\n if (!springRef.current) return;\n\n const result = springRef.current.step(deltaTime);\n positionRef.current = result.position;\n\n setState((prev) => ({\n ...prev,\n x: result.position.x,\n y: result.position.y,\n isMomentum: false,\n }));\n\n if (result.isSettled) {\n PhysicsEngine.unregister(idRef.current);\n handlersRef.current.onRest?.(result.position);\n }\n });\n },\n [resolvedSpringConfig]\n );\n\n const handlePointerMove = useCallback(\n (e: PointerEvent) => {\n if (pointerIdRef.current !== e.pointerId) return;\n\n const currentPos = Vector2.from(e.clientX, e.clientY);\n velocityTracker.current.addSample(currentPos);\n\n let newPos = currentPos.subtract(dragOffsetRef.current);\n\n // Apply axis lock\n if (axis === 'x') {\n newPos = Vector2.from(newPos.x, startPositionRef.current.y);\n } else if (axis === 'y') {\n newPos = Vector2.from(startPositionRef.current.x, newPos.y);\n }\n\n // Apply rubber band\n newPos = applyRubberBand(newPos);\n\n positionRef.current = newPos;\n setState((prev) => ({\n ...prev,\n x: newPos.x,\n y: newPos.y,\n }));\n\n handlersRef.current.onDrag?.(newPos);\n },\n [axis, applyRubberBand]\n );\n\n const handlePointerUp = useCallback(\n (e: PointerEvent) => {\n if (pointerIdRef.current !== e.pointerId) return;\n\n pointerIdRef.current = null;\n document.removeEventListener('pointermove', handlePointerMove);\n document.removeEventListener('pointerup', handlePointerUp);\n document.removeEventListener('pointercancel', handlePointerUp);\n\n const velocity = velocityTracker.current.getVelocity();\n velocityTracker.current.reset();\n\n setState((prev) => ({ ...prev, isDragging: false }));\n handlersRef.current.onDragEnd?.(positionRef.current, velocity);\n\n // Check for snap point\n const snapPoint = findSnapPoint(positionRef.current, velocity);\n if (snapPoint) {\n animateToTarget(snapPoint);\n return;\n }\n\n // Check if out of bounds - spring back\n if (boundsVec) {\n const clamped = clampToBounds(positionRef.current);\n if (!clamped.equals(positionRef.current)) {\n animateToTarget(clamped);\n return;\n }\n }\n\n // Apply momentum if enabled and velocity is significant\n if (momentum && velocity.magnitude > 100) {\n setState((prev) => ({ ...prev, isMomentum: true }));\n\n momentumRef.current = new Momentum(positionRef.current, resolvedFrictionConfig);\n momentumRef.current.start(positionRef.current, velocity);\n\n PhysicsEngine.register(idRef.current, (deltaTime) => {\n if (!momentumRef.current) return;\n\n const result = momentumRef.current.step(deltaTime);\n\n // Check bounds during momentum\n let newPos = result.position;\n if (boundsVec) {\n const clamped = clampToBounds(newPos);\n if (!clamped.equals(newPos)) {\n // Hit boundary, spring back\n momentumRef.current.stop();\n PhysicsEngine.unregister(idRef.current);\n positionRef.current = newPos;\n animateToTarget(clamped);\n return;\n }\n }\n\n positionRef.current = newPos;\n setState((prev) => ({\n ...prev,\n x: newPos.x,\n y: newPos.y,\n isMomentum: result.isActive,\n }));\n\n if (!result.isActive) {\n PhysicsEngine.unregister(idRef.current);\n handlersRef.current.onRest?.(newPos);\n }\n });\n } else {\n handlersRef.current.onRest?.(positionRef.current);\n }\n },\n [\n handlePointerMove,\n momentum,\n boundsVec,\n clampToBounds,\n findSnapPoint,\n animateToTarget,\n resolvedFrictionConfig,\n ]\n );\n\n const onPointerDown = useCallback(\n (e: React.PointerEvent) => {\n if (pointerIdRef.current !== null) return;\n\n // Stop any ongoing animation\n PhysicsEngine.unregister(idRef.current);\n\n pointerIdRef.current = e.pointerId;\n const element = e.currentTarget as HTMLElement;\n element.setPointerCapture(e.pointerId);\n\n const pointerPos = Vector2.from(e.clientX, e.clientY);\n dragOffsetRef.current = pointerPos.subtract(positionRef.current);\n startPositionRef.current = positionRef.current;\n\n velocityTracker.current.reset();\n velocityTracker.current.addSample(pointerPos);\n\n setState((prev) => ({ ...prev, isDragging: true, isMomentum: false }));\n handlersRef.current.onDragStart?.(positionRef.current);\n\n document.addEventListener('pointermove', handlePointerMove);\n document.addEventListener('pointerup', handlePointerUp);\n document.addEventListener('pointercancel', handlePointerUp);\n },\n [handlePointerMove, handlePointerUp]\n );\n\n const setPosition = useCallback((position: { x: number; y: number }) => {\n PhysicsEngine.unregister(idRef.current);\n positionRef.current = Vector2.from(position.x, position.y);\n setState((prev) => ({\n ...prev,\n x: position.x,\n y: position.y,\n isDragging: false,\n isMomentum: false,\n }));\n }, []);\n\n const snapToPosition = useCallback(\n (position: { x: number; y: number }) => {\n animateToTarget(Vector2.from(position.x, position.y));\n },\n [animateToTarget]\n );\n\n // Cleanup\n useEffect(() => {\n return () => {\n PhysicsEngine.unregister(idRef.current);\n document.removeEventListener('pointermove', handlePointerMove);\n document.removeEventListener('pointerup', handlePointerUp);\n document.removeEventListener('pointercancel', handlePointerUp);\n };\n }, [handlePointerMove, handlePointerUp]);\n\n const style: React.CSSProperties = useMemo(\n () => ({\n transform: `translate3d(${state.x}px, ${state.y}px, 0)`,\n willChange: state.isDragging || state.isMomentum ? 'transform' : 'auto',\n cursor: state.isDragging ? 'grabbing' : 'grab',\n }),\n [state.x, state.y, state.isDragging, state.isMomentum]\n );\n\n return {\n x: state.x,\n y: state.y,\n isDragging: state.isDragging,\n isMomentum: state.isMomentum,\n style,\n bind: {\n onPointerDown,\n style: { touchAction: 'none' },\n },\n setPosition,\n snapToPosition,\n };\n}\n","import { useMemo } from 'react';\nimport { Vector2 } from '../core/Vector2';\n\nexport interface UseStretchOptions {\n /** Current velocity vector */\n velocity: Vector2 | { x: number; y: number };\n /** Axis to apply stretch ('x', 'y', or 'both') */\n axis?: 'x' | 'y' | 'both';\n /** Maximum stretch intensity (0-0.3, default: 0.12) */\n intensity?: number;\n /** Velocity at which max stretch is reached (default: 2000) */\n maxVelocity?: number;\n}\n\nexport interface UseStretchReturn {\n /** Scale X value */\n scaleX: number;\n /** Scale Y value */\n scaleY: number;\n /** CSS style object with transform */\n style: React.CSSProperties;\n}\n\n/**\n * Calculate stretch deformation based on velocity\n * Subtle, directional stretch - never cartoon-like\n */\nexport function useStretch(options: UseStretchOptions): UseStretchReturn {\n const {\n velocity,\n axis = 'both',\n intensity = 0.12,\n maxVelocity = 2000,\n } = options;\n\n return useMemo(() => {\n const vel = velocity instanceof Vector2 ? velocity : Vector2.from(velocity.x, velocity.y);\n\n // Normalize velocity to 0-1 range\n const normalizedX = Math.min(Math.abs(vel.x) / maxVelocity, 1);\n const normalizedY = Math.min(Math.abs(vel.y) / maxVelocity, 1);\n\n // Apply easing for more natural feel\n const easedX = easeOutQuad(normalizedX);\n const easedY = easeOutQuad(normalizedY);\n\n let scaleX = 1;\n let scaleY = 1;\n\n if (axis === 'x' || axis === 'both') {\n // Stretch in direction of movement, compress perpendicular\n const stretchX = 1 + easedX * intensity;\n const compressY = 1 - easedX * intensity * 0.5; // Less compression than stretch\n\n if (axis === 'x') {\n scaleX = stretchX;\n scaleY = compressY;\n } else {\n scaleX = stretchX;\n }\n }\n\n if (axis === 'y' || axis === 'both') {\n const stretchY = 1 + easedY * intensity;\n const compressX = 1 - easedY * intensity * 0.5;\n\n if (axis === 'y') {\n scaleY = stretchY;\n scaleX = compressX;\n } else {\n scaleY = stretchY;\n }\n }\n\n // When both axes have velocity, blend the effects\n if (axis === 'both' && normalizedX > 0 && normalizedY > 0) {\n // Dominant axis gets stretch, other gets slight compression\n if (normalizedX > normalizedY) {\n scaleX = 1 + easedX * intensity;\n scaleY = 1 - easedX * intensity * 0.3 + easedY * intensity * 0.5;\n } else {\n scaleY = 1 + easedY * intensity;\n scaleX = 1 - easedY * intensity * 0.3 + easedX * intensity * 0.5;\n }\n }\n\n // Clamp to prevent excessive deformation\n scaleX = Math.max(0.85, Math.min(1.15, scaleX));\n scaleY = Math.max(0.85, Math.min(1.15, scaleY));\n\n return {\n scaleX,\n scaleY,\n style: {\n transform: `scale3d(${scaleX}, ${scaleY}, 1)`,\n willChange: scaleX !== 1 || scaleY !== 1 ? 'transform' : 'auto',\n },\n };\n }, [velocity, axis, intensity, maxVelocity]);\n}\n\n// Easing function for natural stretch feel\nfunction easeOutQuad(t: number): number {\n return t * (2 - t);\n}\n\n/**\n * Combine stretch with position transform\n */\nexport function combineStretchStyle(\n positionStyle: React.CSSProperties,\n stretchStyle: React.CSSProperties\n): React.CSSProperties {\n const positionTransform = positionStyle.transform || '';\n const stretchTransform = stretchStyle.transform || '';\n\n return {\n ...positionStyle,\n transform: `${positionTransform} ${stretchTransform}`.trim(),\n willChange:\n positionStyle.willChange === 'transform' || stretchStyle.willChange === 'transform'\n ? 'transform'\n : 'auto',\n };\n}\n","import { useState, useCallback, useMemo } from 'react';\nimport { useSpring1D } from './useSpring';\nimport { SpringConfig } from '../core/Spring';\n\nexport interface UseLiftOptions {\n /** When to activate lift effect */\n trigger?: 'hover' | 'drag' | 'focus' | 'active';\n /** Scale factor when lifted (default: 1.03) */\n scale?: number;\n /** Enable dynamic shadow (default: true) */\n shadow?: boolean;\n /** Shadow intensity multiplier (default: 1) */\n shadowIntensity?: number;\n /** Spring configuration */\n springConfig?: Partial<SpringConfig>;\n /** Callback when lift state changes */\n onLift?: (isLifted: boolean) => void;\n}\n\nexport interface UseLiftReturn {\n /** Whether element is currently lifted */\n isLifted: boolean;\n /** Current scale value */\n scale: number;\n /** CSS style object */\n style: React.CSSProperties;\n /** Event handlers to bind */\n bind: {\n onPointerEnter?: () => void;\n onPointerLeave?: () => void;\n onPointerDown?: () => void;\n onPointerUp?: () => void;\n onFocus?: () => void;\n onBlur?: () => void;\n };\n /** Manually set lift state */\n setLifted: (lifted: boolean) => void;\n}\n\nexport function useLift(options: UseLiftOptions = {}): UseLiftReturn {\n const {\n trigger = 'hover',\n scale: targetScale = 1.03,\n shadow = true,\n shadowIntensity = 1,\n springConfig,\n onLift,\n } = options;\n\n const [isLifted, setIsLifted] = useState(false);\n\n // Spring for smooth scale animation\n const { value: scale } = useSpring1D({\n to: isLifted ? targetScale : 1,\n config: {\n tension: 300,\n friction: 20,\n ...springConfig,\n },\n });\n\n const handleLift = useCallback(\n (lifted: boolean) => {\n setIsLifted(lifted);\n onLift?.(lifted);\n },\n [onLift]\n );\n\n // Generate event bindings based on trigger\n const bind = useMemo(() => {\n switch (trigger) {\n case 'hover':\n return {\n onPointerEnter: () => handleLift(true),\n onPointerLeave: () => handleLift(false),\n };\n case 'drag':\n return {\n onPointerDown: () => handleLift(true),\n onPointerUp: () => handleLift(false),\n };\n case 'focus':\n return {\n onFocus: () => handleLift(true),\n onBlur: () => handleLift(false),\n };\n case 'active':\n return {\n onPointerDown: () => handleLift(true),\n onPointerUp: () => handleLift(false),\n onPointerLeave: () => handleLift(false),\n };\n default:\n return {};\n }\n }, [trigger, handleLift]);\n\n // Calculate shadow based on lift amount\n const shadowStyle = useMemo(() => {\n if (!shadow) return {};\n\n const liftAmount = (scale - 1) / (targetScale - 1);\n const clampedLift = Math.max(0, Math.min(1, liftAmount));\n\n // Progressive shadow - subtle at rest, more pronounced when lifted\n const blur = 8 + clampedLift * 24 * shadowIntensity;\n const spread = clampedLift * 4 * shadowIntensity;\n const yOffset = 2 + clampedLift * 12 * shadowIntensity;\n const opacity = 0.08 + clampedLift * 0.12 * shadowIntensity;\n\n return {\n boxShadow: `0 ${yOffset}px ${blur}px ${spread}px rgba(0, 0, 0, ${opacity})`,\n };\n }, [scale, targetScale, shadow, shadowIntensity]);\n\n const style: React.CSSProperties = useMemo(\n () => ({\n transform: `scale3d(${scale}, ${scale}, 1)`,\n transformOrigin: 'center center',\n willChange: scale !== 1 ? 'transform, box-shadow' : 'auto',\n ...shadowStyle,\n }),\n [scale, shadowStyle]\n );\n\n return {\n isLifted,\n scale,\n style,\n bind,\n setLifted: handleLift,\n };\n}\n\n/**\n * Combine lift style with other transforms\n */\nexport function combineLiftStyle(\n baseStyle: React.CSSProperties,\n liftStyle: React.CSSProperties\n): React.CSSProperties {\n const baseTransform = baseStyle.transform || '';\n const liftTransform = liftStyle.transform || '';\n\n // Extract scale from lift and apply after position transforms\n return {\n ...baseStyle,\n ...liftStyle,\n transform: `${baseTransform} ${liftTransform}`.trim(),\n };\n}\n","import { useRef, useState, useCallback, useEffect, useMemo } from 'react';\nimport { Vector2 } from '../core/Vector2';\nimport { VelocityTracker } from '../core/Velocity';\nimport { Momentum, FrictionConfig, DEFAULT_FRICTION_CONFIG } from '../core/Friction';\nimport { PhysicsEngine, generatePhysicsId } from '../core/PhysicsEngine';\n\nexport interface UseFlickOptions {\n /** Initial position */\n initial?: { x: number; y: number };\n /** Minimum velocity to trigger flick (default: 500 px/s) */\n threshold?: number;\n /** Friction configuration */\n friction?: Partial<FrictionConfig>;\n /** Lock to single axis */\n axis?: 'x' | 'y' | 'both';\n /** Callback when flick starts */\n onFlickStart?: (velocity: Vector2) => void;\n /** Callback during flick momentum */\n onFlick?: (position: Vector2, velocity: Vector2) => void;\n /** Callback when flick ends */\n onFlickEnd?: (position: Vector2) => void;\n}\n\nexport interface UseFlickReturn {\n /** Current x position */\n x: number;\n /** Current y position */\n y: number;\n /** Whether flick momentum is active */\n isFlicking: boolean;\n /** Current velocity */\n velocity: Vector2;\n /** CSS style object */\n style: React.CSSProperties;\n /** Trigger a flick with given velocity */\n flick: (velocity: { x: number; y: number }) => void;\n /** Stop current flick */\n stop: () => void;\n /** Set position (stops any active flick) */\n setPosition: (position: { x: number; y: number }) => void;\n /** Record position sample for velocity tracking */\n recordSample: (position: { x: number; y: number }) => void;\n /** Get current velocity from samples */\n getCurrentVelocity: () => Vector2;\n /** Release with current velocity (triggers flick if above threshold) */\n release: (position: { x: number; y: number }) => boolean;\n}\n\nexport function useFlick(options: UseFlickOptions = {}): UseFlickReturn {\n const {\n initial = { x: 0, y: 0 },\n threshold = 500,\n friction,\n axis = 'both',\n onFlickStart,\n onFlick,\n onFlickEnd,\n } = options;\n\n const resolvedFriction = useMemo(\n () => ({ ...DEFAULT_FRICTION_CONFIG, ...friction }),\n [friction]\n );\n\n const [state, setState] = useState({\n x: initial.x,\n y: initial.y,\n isFlicking: false,\n velocity: Vector2.zero(),\n });\n\n const positionRef = useRef(Vector2.from(initial.x, initial.y));\n const momentumRef = useRef<Momentum | null>(null);\n const velocityTracker = useRef(new VelocityTracker());\n const idRef = useRef(generatePhysicsId('flick'));\n\n const handlersRef = useRef({ onFlickStart, onFlick, onFlickEnd });\n handlersRef.current = { onFlickStart, onFlick, onFlickEnd };\n\n const startMomentum = useCallback(\n (velocity: Vector2) => {\n // Apply axis constraint\n let constrainedVelocity = velocity;\n if (axis === 'x') {\n constrainedVelocity = Vector2.from(velocity.x, 0);\n } else if (axis === 'y') {\n constrainedVelocity = Vector2.from(0, velocity.y);\n }\n\n momentumRef.current = new Momentum(positionRef.current, resolvedFriction);\n momentumRef.current.start(positionRef.current, constrainedVelocity);\n\n setState((prev) => ({\n ...prev,\n isFlicking: true,\n velocity: constrainedVelocity,\n }));\n\n handlersRef.current.onFlickStart?.(constrainedVelocity);\n\n PhysicsEngine.register(idRef.current, (deltaTime) => {\n if (!momentumRef.current) return;\n\n const result = momentumRef.current.step(deltaTime);\n\n // Apply axis constraint to position\n let newPos = result.position;\n if (axis === 'x') {\n newPos = Vector2.from(newPos.x, positionRef.current.y);\n } else if (axis === 'y') {\n newPos = Vector2.from(positionRef.current.x, newPos.y);\n }\n\n positionRef.current = newPos;\n\n setState({\n x: newPos.x,\n y: newPos.y,\n isFlicking: result.isActive,\n velocity: result.velocity,\n });\n\n handlersRef.current.onFlick?.(newPos, result.velocity);\n\n if (!result.isActive) {\n PhysicsEngine.unregister(idRef.current);\n handlersRef.current.onFlickEnd?.(newPos);\n }\n });\n },\n [axis, resolvedFriction]\n );\n\n const flick = useCallback(\n (velocity: { x: number; y: number }) => {\n PhysicsEngine.unregister(idRef.current);\n velocityTracker.current.reset();\n startMomentum(Vector2.from(velocity.x, velocity.y));\n },\n [startMomentum]\n );\n\n const stop = useCallback(() => {\n PhysicsEngine.unregister(idRef.current);\n momentumRef.current?.stop();\n velocityTracker.current.reset();\n\n setState((prev) => ({\n ...prev,\n isFlicking: false,\n velocity: Vector2.zero(),\n }));\n }, []);\n\n const setPosition = useCallback(\n (position: { x: number; y: number }) => {\n stop();\n positionRef.current = Vector2.from(position.x, position.y);\n setState({\n x: position.x,\n y: position.y,\n isFlicking: false,\n velocity: Vector2.zero(),\n });\n },\n [stop]\n );\n\n const recordSample = useCallback((position: { x: number; y: number }) => {\n velocityTracker.current.addSample(Vector2.from(position.x, position.y));\n positionRef.current = Vector2.from(position.x, position.y);\n setState((prev) => ({\n ...prev,\n x: position.x,\n y: position.y,\n }));\n }, []);\n\n const getCurrentVelocity = useCallback(() => {\n return velocityTracker.current.getVelocity();\n }, []);\n\n const release = useCallback(\n (position: { x: number; y: number }): boolean => {\n positionRef.current = Vector2.from(position.x, position.y);\n const velocity = velocityTracker.current.getVelocity();\n velocityTracker.current.reset();\n\n if (velocity.magnitude >= threshold) {\n startMomentum(velocity);\n return true;\n }\n\n setState((prev) => ({\n ...prev,\n x: position.x,\n y: position.y,\n isFlicking: false,\n velocity: Vector2.zero(),\n }));\n\n return false;\n },\n [threshold, startMomentum]\n );\n\n // Cleanup\n useEffect(() => {\n return () => {\n PhysicsEngine.unregister(idRef.current);\n };\n }, []);\n\n const style: React.CSSProperties = useMemo(\n () => ({\n transform: `translate3d(${state.x}px, ${state.y}px, 0)`,\n willChange: state.isFlicking ? 'transform' : 'auto',\n }),\n [state.x, state.y, state.isFlicking]\n );\n\n return {\n x: state.x,\n y: state.y,\n isFlicking: state.isFlicking,\n velocity: state.velocity,\n style,\n flick,\n stop,\n setPosition,\n recordSample,\n getCurrentVelocity,\n release,\n };\n}\n","import React, { useMemo, forwardRef } from 'react';\nimport { useDrag, Bounds } from '../hooks/useDrag';\nimport { useLift } from '../hooks/useLift';\nimport { useStretch, combineStretchStyle } from '../hooks/useStretch';\nimport { combineLiftStyle } from '../hooks/useLift';\nimport { usePhysicsContext } from './PhysicsProvider';\nimport { Vector2 } from '../core/Vector2';\nimport { SpringConfig } from '../core/Spring';\n\nexport interface DraggableProps {\n children: React.ReactNode;\n /** Initial position */\n initial?: { x: number; y: number };\n /** Movement bounds */\n bounds?: Bounds;\n /** Enable rubber band at bounds (default: true) */\n rubberBand?: boolean;\n /** Enable momentum after release (default: true) */\n momentum?: boolean;\n /** Enable lift effect on drag (default: true) */\n lift?: boolean;\n /** Enable velocity stretch (default: true) */\n stretch?: boolean;\n /** Snap points after release */\n snapTo?: { x: number; y: number }[];\n /** Lock to axis */\n axis?: 'x' | 'y' | 'both';\n /** Spring configuration override */\n springConfig?: Partial<SpringConfig>;\n /** Additional class name */\n className?: string;\n /** Additional inline styles */\n style?: React.CSSProperties;\n /** Callback on drag start */\n onDragStart?: (position: { x: number; y: number }) => void;\n /** Callback during drag */\n onDrag?: (position: { x: number; y: number }) => void;\n /** Callback on drag end */\n onDragEnd?: (position: { x: number; y: number }, velocity: { x: number; y: number }) => void;\n /** Callback when animation settles */\n onRest?: (position: { x: number; y: number }) => void;\n}\n\n/**\n * Draggable component with physics-based motion\n * Combines drag, lift, and stretch effects\n */\nexport const Draggable = forwardRef<HTMLDivElement, DraggableProps>(\n (\n {\n children,\n initial = { x: 0, y: 0 },\n bounds,\n rubberBand = true,\n momentum = true,\n lift: enableLift = true,\n stretch: enableStretch = true,\n snapTo,\n axis = 'both',\n springConfig,\n className,\n style: customStyle,\n onDragStart,\n onDrag,\n onDragEnd,\n onRest,\n },\n ref\n ) => {\n const physicsContext = usePhysicsContext();\n\n const {\n isDragging,\n isMomentum,\n style: dragStyle,\n bind,\n } = useDrag({\n initial,\n bounds,\n rubberBand,\n momentum,\n snapTo,\n axis,\n springConfig: { ...physicsContext.spring, ...springConfig },\n onDragStart: (pos) => onDragStart?.(pos.toObject()),\n onDrag: (pos) => onDrag?.(pos.toObject()),\n onDragEnd: (pos, vel) => onDragEnd?.(pos.toObject(), vel.toObject()),\n onRest: (pos) => onRest?.(pos.toObject()),\n });\n\n // Lift effect\n const { style: liftStyle, bind: liftBind } = useLift({\n trigger: 'drag',\n scale: physicsContext.lift.scale,\n shadowIntensity: physicsContext.lift.shadowIntensity,\n });\n\n // Stretch effect - estimate velocity from recent movement\n const velocity = useMemo(() => {\n if (!isDragging && !isMomentum) return Vector2.zero();\n // Use a small velocity for visual feedback during drag\n return Vector2.from(0, 0);\n }, [isDragging, isMomentum]);\n\n const { style: stretchStyle } = useStretch({\n velocity,\n intensity: physicsContext.stretch.intensity,\n maxVelocity: physicsContext.stretch.maxVelocity,\n });\n\n // Combine all styles\n const combinedStyle = useMemo(() => {\n let result = { ...dragStyle };\n\n if (enableLift && isDragging) {\n result = combineLiftStyle(result, liftStyle);\n }\n\n if (enableStretch) {\n result = combineStretchStyle(result, stretchStyle);\n }\n\n return {\n ...result,\n ...customStyle,\n position: 'relative' as const,\n userSelect: 'none' as const,\n };\n }, [dragStyle, liftStyle, stretchStyle, enableLift, enableStretch, isDragging, customStyle]);\n\n // Combine bindings\n const combinedBind = useMemo(() => {\n return {\n ...bind,\n onPointerDown: (e: React.PointerEvent) => {\n bind.onPointerDown(e);\n if (enableLift) {\n liftBind.onPointerDown?.();\n }\n },\n onPointerUp: () => {\n if (enableLift) {\n liftBind.onPointerUp?.();\n }\n },\n };\n }, [bind, liftBind, enableLift]);\n\n return (\n <div\n ref={ref}\n className={className}\n {...combinedBind}\n style={combinedStyle}\n >\n {children}\n </div>\n );\n }\n);\n\nDraggable.displayName = 'Draggable';\n","import React, { forwardRef, useMemo, useState, useCallback } from 'react';\nimport { useLift } from '../hooks/useLift';\nimport { useSpring1D } from '../hooks/useSpring';\nimport { usePhysicsContext } from './PhysicsProvider';\nimport { SpringConfig } from '../core/Spring';\n\nexport interface CardProps {\n children: React.ReactNode;\n /** Enable hover lift effect (default: true) */\n lift?: boolean;\n /** Enable press feedback (default: true) */\n pressable?: boolean;\n /** Scale on lift (overrides context) */\n liftScale?: number;\n /** Scale reduction on press (default: 0.98) */\n pressScale?: number;\n /** Enable glassmorphism background */\n glass?: boolean;\n /** Glass blur intensity (default: 20) */\n glassBlur?: number;\n /** Spring configuration override */\n springConfig?: Partial<SpringConfig>;\n /** Additional class name */\n className?: string;\n /** Additional inline styles */\n style?: React.CSSProperties;\n /** Click handler */\n onClick?: (e: React.MouseEvent) => void;\n /** Callback when hover state changes */\n onHover?: (isHovered: boolean) => void;\n /** Callback when press state changes */\n onPress?: (isPressed: boolean) => void;\n}\n\n/**\n * Premium card component with physics-based interactions\n * Features lift on hover, press feedback, and optional glassmorphism\n */\nexport const Card = forwardRef<HTMLDivElement, CardProps>(\n (\n {\n children,\n lift: enableLift = true,\n pressable = true,\n liftScale,\n pressScale = 0.98,\n glass = false,\n glassBlur = 20,\n springConfig,\n className,\n style: customStyle,\n onClick,\n onHover,\n onPress,\n },\n ref\n ) => {\n const physicsContext = usePhysicsContext();\n const [isPressed, setIsPressed] = useState(false);\n\n const resolvedLiftScale = liftScale ?? physicsContext.lift.scale;\n\n // Lift effect for hover\n const { style: liftStyle, bind: liftBind, isLifted } = useLift({\n trigger: 'hover',\n scale: resolvedLiftScale,\n shadowIntensity: physicsContext.lift.shadowIntensity,\n springConfig: { ...physicsContext.spring, ...springConfig },\n onLift: onHover,\n });\n\n // Press scale animation\n const { value: pressScaleValue } = useSpring1D({\n to: isPressed ? pressScale : 1,\n config: {\n tension: 400,\n friction: 25,\n ...springConfig,\n },\n });\n\n const handlePointerDown = useCallback(() => {\n if (pressable) {\n setIsPressed(true);\n onPress?.(true);\n }\n }, [pressable, onPress]);\n\n const handlePointerUp = useCallback(() => {\n if (pressable) {\n setIsPressed(false);\n onPress?.(false);\n }\n }, [pressable, onPress]);\n\n const handlePointerLeave = useCallback(() => {\n if (isPressed) {\n setIsPressed(false);\n onPress?.(false);\n }\n }, [isPressed, onPress]);\n\n // Glassmorphism styles\n const glassStyles: React.CSSProperties = glass\n ? {\n background: 'rgba(255, 255, 255, 0.1)',\n backdropFilter: `blur(${glassBlur}px)`,\n WebkitBackdropFilter: `blur(${glassBlur}px)`,\n border: '1px solid rgba(255, 255, 255, 0.18)',\n }\n : {};\n\n // Combine transforms\n const combinedStyle = useMemo(() => {\n const liftTransform = enableLift ? liftStyle.transform || '' : '';\n const pressTransform = pressable ? `scale(${pressScaleValue})` : '';\n const transform = `${liftTransform} ${pressTransform}`.trim() || undefined;\n\n return {\n ...glassStyles,\n ...liftStyle,\n ...customStyle,\n transform,\n transformOrigin: 'center center',\n cursor: onClick ? 'pointer' : 'default',\n willChange: isLifted || isPressed ? 'transform, box-shadow' : 'auto',\n };\n }, [\n liftStyle,\n pressScaleValue,\n enableLift,\n pressable,\n glassStyles,\n customStyle,\n onClick,\n isLifted,\n isPressed,\n ]);\n\n return (\n <div\n ref={ref}\n className={className}\n style={combinedStyle}\n onClick={onClick}\n onPointerEnter={liftBind.onPointerEnter}\n onPointerLeave={() => {\n liftBind.onPointerLeave?.();\n handlePointerLeave();\n }}\n onPointerDown={handlePointerDown}\n onPointerUp={handlePointerUp}\n >\n {children}\n </div>\n );\n }\n);\n\nCard.displayName = 'Card';\n\n/**\n * Default card styles (optional, can be applied via className)\n */\nexport const cardBaseStyles: React.CSSProperties = {\n padding: '24px',\n borderRadius: '16px',\n background: 'white',\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.08)',\n};\n"],"names":["createContext","useMemo","jsx","useContext","useRef","useState","useEffect","useCallback","state","_b","_a","forwardRef"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/core/Vector2.ts","../src/core/Spring.ts","../src/core/Velocity.ts","../src/core/Friction.ts","../src/core/PhysicsEngine.ts","../src/presets/index.ts","../src/components/PhysicsProvider.tsx","../src/hooks/useSpring.ts","../src/hooks/useGesture.ts","../src/hooks/useDrag.ts","../src/hooks/useStretch.ts","../src/hooks/useLift.ts","../src/hooks/useFlick.ts","../src/components/Draggable.tsx","../src/components/Card.tsx","../src/components/sliders/PhysicsSlider.tsx","../src/components/sliders/PhysicsRangeSlider.tsx","../src/components/sliders/PhysicsStepSlider.tsx","../src/components/sliders/PhysicsVerticalSlider.tsx","../src/components/sliders/types.ts","../src/components/SegmentedControl/SegmentedControl.tsx","../src/components/SegmentedControl/types.ts","../src/effects/liquidGlass/types.ts","../src/effects/liquidGlass/DisplacementMapGenerator.ts","../src/effects/liquidGlass/LiquidGlassFilter.tsx","../src/effects/liquidGlass/useLiquidGlass.ts"],"sourcesContent":["/**\n * Immutable 2D vector class for physics calculations\n */\nexport class Vector2 {\n constructor(\n public readonly x: number = 0,\n public readonly y: number = 0\n ) {}\n\n static zero(): Vector2 {\n return new Vector2(0, 0);\n }\n\n static from(x: number, y: number): Vector2 {\n return new Vector2(x, y);\n }\n\n static fromObject(obj: { x: number; y: number }): Vector2 {\n return new Vector2(obj.x, obj.y);\n }\n\n add(other: Vector2): Vector2 {\n return new Vector2(this.x + other.x, this.y + other.y);\n }\n\n subtract(other: Vector2): Vector2 {\n return new Vector2(this.x - other.x, this.y - other.y);\n }\n\n multiply(scalar: number): Vector2 {\n return new Vector2(this.x * scalar, this.y * scalar);\n }\n\n divide(scalar: number): Vector2 {\n if (scalar === 0) return Vector2.zero();\n return new Vector2(this.x / scalar, this.y / scalar);\n }\n\n get magnitude(): number {\n return Math.sqrt(this.x * this.x + this.y * this.y);\n }\n\n get magnitudeSquared(): number {\n return this.x * this.x + this.y * this.y;\n }\n\n normalize(): Vector2 {\n const mag = this.magnitude;\n if (mag === 0) return Vector2.zero();\n return this.divide(mag);\n }\n\n clamp(maxMagnitude: number): Vector2 {\n const mag = this.magnitude;\n if (mag <= maxMagnitude) return this;\n return this.normalize().multiply(maxMagnitude);\n }\n\n clampComponents(min: Vector2, max: Vector2): Vector2 {\n return new Vector2(\n Math.max(min.x, Math.min(max.x, this.x)),\n Math.max(min.y, Math.min(max.y, this.y))\n );\n }\n\n lerp(target: Vector2, t: number): Vector2 {\n return new Vector2(\n this.x + (target.x - this.x) * t,\n this.y + (target.y - this.y) * t\n );\n }\n\n dot(other: Vector2): number {\n return this.x * other.x + this.y * other.y;\n }\n\n distanceTo(other: Vector2): number {\n return this.subtract(other).magnitude;\n }\n\n equals(other: Vector2, epsilon: number = 0.0001): boolean {\n return (\n Math.abs(this.x - other.x) < epsilon &&\n Math.abs(this.y - other.y) < epsilon\n );\n }\n\n isZero(epsilon: number = 0.0001): boolean {\n return this.magnitude < epsilon;\n }\n\n negate(): Vector2 {\n return new Vector2(-this.x, -this.y);\n }\n\n abs(): Vector2 {\n return new Vector2(Math.abs(this.x), Math.abs(this.y));\n }\n\n toObject(): { x: number; y: number } {\n return { x: this.x, y: this.y };\n }\n}\n","import { Vector2 } from './Vector2';\n\nexport interface SpringConfig {\n /** Force pulling toward target (100-500, default: 170) */\n tension: number;\n /** Resistance to motion (10-50, default: 26) */\n friction: number;\n /** Virtual mass affecting inertia (0.5-3, default: 1) */\n mass: number;\n /** Threshold to consider animation complete (default: 0.01) */\n precision: number;\n}\n\nexport const DEFAULT_SPRING_CONFIG: SpringConfig = {\n tension: 170,\n friction: 26,\n mass: 1,\n precision: 0.01,\n};\n\nexport interface SpringState {\n position: Vector2;\n velocity: Vector2;\n target: Vector2;\n isSettled: boolean;\n}\n\n/**\n * Spring physics simulation using semi-implicit Euler integration\n * Provides smooth, natural motion without overshoot\n */\nexport class Spring {\n private position: Vector2;\n private velocity: Vector2;\n private target: Vector2;\n private config: SpringConfig;\n\n constructor(\n initialPosition: Vector2 = Vector2.zero(),\n config: Partial<SpringConfig> = {}\n ) {\n this.position = initialPosition;\n this.velocity = Vector2.zero();\n this.target = initialPosition;\n this.config = { ...DEFAULT_SPRING_CONFIG, ...config };\n }\n\n setTarget(target: Vector2): void {\n this.target = target;\n }\n\n setPosition(position: Vector2): void {\n this.position = position;\n }\n\n setVelocity(velocity: Vector2): void {\n this.velocity = velocity;\n }\n\n updateConfig(config: Partial<SpringConfig>): void {\n this.config = { ...this.config, ...config };\n }\n\n /**\n * Advance the spring simulation by deltaTime seconds\n * Uses semi-implicit Euler for stability\n */\n step(deltaTime: number): SpringState {\n const { tension, friction, mass, precision } = this.config;\n\n // Calculate spring force: F = -k * displacement\n const displacement = this.position.subtract(this.target);\n const springForce = displacement.multiply(-tension);\n\n // Calculate damping force: F = -c * velocity\n const dampingForce = this.velocity.multiply(-friction);\n\n // Total acceleration: a = F / m\n const totalForce = springForce.add(dampingForce);\n const acceleration = totalForce.divide(mass);\n\n // Semi-implicit Euler: update velocity first, then position\n this.velocity = this.velocity.add(acceleration.multiply(deltaTime));\n this.position = this.position.add(this.velocity.multiply(deltaTime));\n\n // Check if settled\n const isSettled =\n displacement.magnitude < precision &&\n this.velocity.magnitude < precision;\n\n if (isSettled) {\n this.position = this.target;\n this.velocity = Vector2.zero();\n }\n\n return {\n position: this.position,\n velocity: this.velocity,\n target: this.target,\n isSettled,\n };\n }\n\n getState(): SpringState {\n const displacement = this.position.subtract(this.target);\n return {\n position: this.position,\n velocity: this.velocity,\n target: this.target,\n isSettled:\n displacement.magnitude < this.config.precision &&\n this.velocity.magnitude < this.config.precision,\n };\n }\n\n /**\n * Immediately snap to target\n */\n snapToTarget(): void {\n this.position = this.target;\n this.velocity = Vector2.zero();\n }\n}\n\n/**\n * 1D Spring for single-value animations (scale, opacity, etc.)\n */\nexport class Spring1D {\n private position: number;\n private velocity: number;\n private target: number;\n private config: SpringConfig;\n\n constructor(initialValue: number = 0, config: Partial<SpringConfig> = {}) {\n this.position = initialValue;\n this.velocity = 0;\n this.target = initialValue;\n this.config = { ...DEFAULT_SPRING_CONFIG, ...config };\n }\n\n setTarget(target: number): void {\n this.target = target;\n }\n\n setPosition(position: number): void {\n this.position = position;\n }\n\n setVelocity(velocity: number): void {\n this.velocity = velocity;\n }\n\n step(deltaTime: number): { value: number; velocity: number; isSettled: boolean } {\n const { tension, friction, mass, precision } = this.config;\n\n const displacement = this.position - this.target;\n const springForce = -tension * displacement;\n const dampingForce = -friction * this.velocity;\n const acceleration = (springForce + dampingForce) / mass;\n\n this.velocity += acceleration * deltaTime;\n this.position += this.velocity * deltaTime;\n\n const isSettled =\n Math.abs(displacement) < precision && Math.abs(this.velocity) < precision;\n\n if (isSettled) {\n this.position = this.target;\n this.velocity = 0;\n }\n\n return {\n value: this.position,\n velocity: this.velocity,\n isSettled,\n };\n }\n\n getValue(): number {\n return this.position;\n }\n\n snapToTarget(): void {\n this.position = this.target;\n this.velocity = 0;\n }\n}\n","import { Vector2 } from './Vector2';\n\ninterface VelocitySample {\n position: Vector2;\n timestamp: number;\n}\n\n/**\n * Velocity tracker using circular buffer for smooth velocity estimation\n * Calculates average velocity from recent position history\n */\nexport class VelocityTracker {\n private samples: VelocitySample[] = [];\n private maxSamples: number;\n private maxAge: number;\n\n constructor(maxSamples: number = 8, maxAge: number = 100) {\n this.maxSamples = maxSamples;\n this.maxAge = maxAge; // ms\n }\n\n /**\n * Record a position sample\n */\n addSample(position: Vector2, timestamp: number = performance.now()): void {\n this.samples.push({ position, timestamp });\n\n // Limit buffer size\n if (this.samples.length > this.maxSamples) {\n this.samples.shift();\n }\n }\n\n /**\n * Calculate current velocity from sample history\n * Returns smoothed velocity vector in pixels per second\n */\n getVelocity(): Vector2 {\n const now = performance.now();\n\n // Filter out old samples\n this.samples = this.samples.filter(\n (sample) => now - sample.timestamp < this.maxAge\n );\n\n if (this.samples.length < 2) {\n return Vector2.zero();\n }\n\n // Weight recent samples more heavily\n let totalWeight = 0;\n let weightedVelocity = Vector2.zero();\n\n for (let i = 1; i < this.samples.length; i++) {\n const prev = this.samples[i - 1];\n const curr = this.samples[i];\n const dt = (curr.timestamp - prev.timestamp) / 1000; // Convert to seconds\n\n if (dt <= 0) continue;\n\n const instantVelocity = curr.position.subtract(prev.position).divide(dt);\n\n // Exponential weight: more recent = higher weight\n const age = now - curr.timestamp;\n const weight = Math.exp(-age / this.maxAge);\n\n weightedVelocity = weightedVelocity.add(instantVelocity.multiply(weight));\n totalWeight += weight;\n }\n\n if (totalWeight === 0) {\n return Vector2.zero();\n }\n\n return weightedVelocity.divide(totalWeight);\n }\n\n /**\n * Get velocity magnitude in pixels per second\n */\n getSpeed(): number {\n return this.getVelocity().magnitude;\n }\n\n /**\n * Check if current velocity qualifies as a flick gesture\n */\n isFlick(threshold: number = 500): boolean {\n return this.getSpeed() > threshold;\n }\n\n /**\n * Get dominant direction of movement\n */\n getDirection(): 'up' | 'down' | 'left' | 'right' | 'none' {\n const velocity = this.getVelocity();\n const speed = velocity.magnitude;\n\n if (speed < 10) return 'none';\n\n if (Math.abs(velocity.x) > Math.abs(velocity.y)) {\n return velocity.x > 0 ? 'right' : 'left';\n } else {\n return velocity.y > 0 ? 'down' : 'up';\n }\n }\n\n /**\n * Clear all samples\n */\n reset(): void {\n this.samples = [];\n }\n\n /**\n * Get the last recorded position\n */\n getLastPosition(): Vector2 | null {\n if (this.samples.length === 0) return null;\n return this.samples[this.samples.length - 1].position;\n }\n}\n\n/**\n * 1D velocity tracker for single-axis motion\n */\nexport class VelocityTracker1D {\n private samples: { value: number; timestamp: number }[] = [];\n private maxSamples: number;\n private maxAge: number;\n\n constructor(maxSamples: number = 8, maxAge: number = 100) {\n this.maxSamples = maxSamples;\n this.maxAge = maxAge;\n }\n\n addSample(value: number, timestamp: number = performance.now()): void {\n this.samples.push({ value, timestamp });\n if (this.samples.length > this.maxSamples) {\n this.samples.shift();\n }\n }\n\n getVelocity(): number {\n const now = performance.now();\n this.samples = this.samples.filter((s) => now - s.timestamp < this.maxAge);\n\n if (this.samples.length < 2) return 0;\n\n let totalWeight = 0;\n let weightedVelocity = 0;\n\n for (let i = 1; i < this.samples.length; i++) {\n const prev = this.samples[i - 1];\n const curr = this.samples[i];\n const dt = (curr.timestamp - prev.timestamp) / 1000;\n\n if (dt <= 0) continue;\n\n const instantVelocity = (curr.value - prev.value) / dt;\n const age = now - curr.timestamp;\n const weight = Math.exp(-age / this.maxAge);\n\n weightedVelocity += instantVelocity * weight;\n totalWeight += weight;\n }\n\n return totalWeight > 0 ? weightedVelocity / totalWeight : 0;\n }\n\n reset(): void {\n this.samples = [];\n }\n}\n","import { Vector2 } from './Vector2';\n\nexport interface FrictionConfig {\n /** Friction coefficient (0.9-0.99, higher = less friction) */\n decay: number;\n /** Minimum velocity before stopping (default: 0.1) */\n stopThreshold: number;\n /** Maximum velocity cap (default: 5000 px/s) */\n maxVelocity: number;\n}\n\nexport const DEFAULT_FRICTION_CONFIG: FrictionConfig = {\n decay: 0.95,\n stopThreshold: 0.1,\n maxVelocity: 2000,\n};\n\n/**\n * Momentum system with exponential friction decay\n * Provides natural deceleration after flick gestures\n */\nexport class Momentum {\n private position: Vector2;\n private velocity: Vector2;\n private config: FrictionConfig;\n private isActive: boolean = false;\n\n constructor(\n initialPosition: Vector2 = Vector2.zero(),\n config: Partial<FrictionConfig> = {}\n ) {\n this.position = initialPosition;\n this.velocity = Vector2.zero();\n this.config = { ...DEFAULT_FRICTION_CONFIG, ...config };\n }\n\n /**\n * Start momentum with initial velocity\n */\n start(position: Vector2, velocity: Vector2): void {\n this.position = position;\n // Clamp velocity to max\n this.velocity = velocity.clamp(this.config.maxVelocity);\n this.isActive = true;\n }\n\n /**\n * Stop momentum immediately\n */\n stop(): void {\n this.velocity = Vector2.zero();\n this.isActive = false;\n }\n\n /**\n * Update momentum simulation\n * @param deltaTime Time in seconds\n */\n step(deltaTime: number): {\n position: Vector2;\n velocity: Vector2;\n isActive: boolean;\n } {\n if (!this.isActive) {\n return {\n position: this.position,\n velocity: Vector2.zero(),\n isActive: false,\n };\n }\n\n // Apply velocity to position\n this.position = this.position.add(this.velocity.multiply(deltaTime));\n\n // Apply exponential friction decay\n // Adjust decay for frame rate independence\n const frameDecay = Math.pow(this.config.decay, deltaTime * 60);\n this.velocity = this.velocity.multiply(frameDecay);\n\n // Check if velocity is below threshold\n if (this.velocity.magnitude < this.config.stopThreshold) {\n this.velocity = Vector2.zero();\n this.isActive = false;\n }\n\n return {\n position: this.position,\n velocity: this.velocity,\n isActive: this.isActive,\n };\n }\n\n /**\n * Apply rubber band effect at boundaries\n */\n applyRubberBand(\n bounds: { min: Vector2; max: Vector2 },\n rubberBandFactor: number = 0.55\n ): void {\n let newX = this.position.x;\n let newY = this.position.y;\n\n // Calculate rubber band displacement\n if (this.position.x < bounds.min.x) {\n const overshoot = bounds.min.x - this.position.x;\n newX = bounds.min.x - overshoot * rubberBandFactor;\n } else if (this.position.x > bounds.max.x) {\n const overshoot = this.position.x - bounds.max.x;\n newX = bounds.max.x + overshoot * rubberBandFactor;\n }\n\n if (this.position.y < bounds.min.y) {\n const overshoot = bounds.min.y - this.position.y;\n newY = bounds.min.y - overshoot * rubberBandFactor;\n } else if (this.position.y > bounds.max.y) {\n const overshoot = this.position.y - bounds.max.y;\n newY = bounds.max.y + overshoot * rubberBandFactor;\n }\n\n this.position = new Vector2(newX, newY);\n }\n\n getPosition(): Vector2 {\n return this.position;\n }\n\n getVelocity(): Vector2 {\n return this.velocity;\n }\n\n getIsActive(): boolean {\n return this.isActive;\n }\n\n setPosition(position: Vector2): void {\n this.position = position;\n }\n\n updateConfig(config: Partial<FrictionConfig>): void {\n this.config = { ...this.config, ...config };\n }\n}\n\n/**\n * 1D Momentum for single-axis motion\n */\nexport class Momentum1D {\n private position: number;\n private velocity: number;\n private config: FrictionConfig;\n private isActive: boolean = false;\n\n constructor(initialPosition: number = 0, config: Partial<FrictionConfig> = {}) {\n this.position = initialPosition;\n this.velocity = 0;\n this.config = { ...DEFAULT_FRICTION_CONFIG, ...config };\n }\n\n start(position: number, velocity: number): void {\n this.position = position;\n this.velocity = Math.sign(velocity) * Math.min(Math.abs(velocity), this.config.maxVelocity);\n this.isActive = true;\n }\n\n stop(): void {\n this.velocity = 0;\n this.isActive = false;\n }\n\n step(deltaTime: number): { position: number; velocity: number; isActive: boolean } {\n if (!this.isActive) {\n return { position: this.position, velocity: 0, isActive: false };\n }\n\n this.position += this.velocity * deltaTime;\n const frameDecay = Math.pow(this.config.decay, deltaTime * 60);\n this.velocity *= frameDecay;\n\n if (Math.abs(this.velocity) < this.config.stopThreshold) {\n this.velocity = 0;\n this.isActive = false;\n }\n\n return {\n position: this.position,\n velocity: this.velocity,\n isActive: this.isActive,\n };\n }\n\n getPosition(): number {\n return this.position;\n }\n\n setPosition(position: number): void {\n this.position = position;\n }\n}\n","type UpdateCallback = (deltaTime: number) => void;\n\ninterface PhysicsBody {\n id: string;\n update: UpdateCallback;\n priority: number;\n}\n\n/**\n * Central physics engine with shared RAF loop\n * Manages all physics simulations efficiently\n */\nclass PhysicsEngineCore {\n private bodies: Map<string, PhysicsBody> = new Map();\n private rafId: number | null = null;\n private lastTime: number = 0;\n private isRunning: boolean = false;\n\n // Cap deltaTime to prevent spiral of death (max ~30fps frame time)\n private readonly maxDelta = 1 / 30;\n\n /**\n * Register a physics body to receive updates\n */\n register(id: string, update: UpdateCallback, priority: number = 0): void {\n this.bodies.set(id, { id, update, priority });\n this.start();\n }\n\n /**\n * Unregister a physics body\n */\n unregister(id: string): void {\n this.bodies.delete(id);\n\n // Auto-pause when no bodies are registered\n if (this.bodies.size === 0) {\n this.stop();\n }\n }\n\n /**\n * Check if a body is registered\n */\n has(id: string): boolean {\n return this.bodies.has(id);\n }\n\n /**\n * Start the physics loop\n */\n private start(): void {\n if (this.isRunning) return;\n\n this.isRunning = true;\n this.lastTime = performance.now();\n this.loop();\n }\n\n /**\n * Stop the physics loop\n */\n private stop(): void {\n if (!this.isRunning) return;\n\n this.isRunning = false;\n if (this.rafId !== null) {\n cancelAnimationFrame(this.rafId);\n this.rafId = null;\n }\n }\n\n /**\n * Main RAF loop\n */\n private loop = (): void => {\n if (!this.isRunning) return;\n\n const currentTime = performance.now();\n let deltaTime = (currentTime - this.lastTime) / 1000;\n this.lastTime = currentTime;\n\n // Cap delta time to prevent instability\n deltaTime = Math.min(deltaTime, this.maxDelta);\n\n // Sort bodies by priority and update\n const sortedBodies = Array.from(this.bodies.values()).sort(\n (a, b) => b.priority - a.priority\n );\n\n for (const body of sortedBodies) {\n body.update(deltaTime);\n }\n\n this.rafId = requestAnimationFrame(this.loop);\n };\n\n /**\n * Get current number of active bodies\n */\n getActiveCount(): number {\n return this.bodies.size;\n }\n\n /**\n * Check if engine is running\n */\n getIsRunning(): boolean {\n return this.isRunning;\n }\n}\n\n// Singleton instance\nexport const PhysicsEngine = new PhysicsEngineCore();\n\n/**\n * Generate unique ID for physics bodies\n */\nlet idCounter = 0;\nexport function generatePhysicsId(prefix: string = 'physics'): string {\n return `${prefix}_${++idCounter}_${Date.now().toString(36)}`;\n}\n","import { SpringConfig } from '../core/Spring';\nimport { FrictionConfig } from '../core/Friction';\n\nexport interface PhysicsPreset {\n name: string;\n description: string;\n spring: SpringConfig;\n friction: FrictionConfig;\n stretch: {\n intensity: number;\n maxVelocity: number;\n };\n lift: {\n scale: number;\n shadowIntensity: number;\n };\n}\n\n/**\n * iOS-like feel\n * Smooth, natural, slightly bouncy response\n * Premium Apple-style interactions\n */\nexport const ios: PhysicsPreset = {\n name: 'ios',\n description: 'iOS-like smooth, natural feel',\n spring: {\n tension: 170,\n friction: 26,\n mass: 1,\n precision: 0.01,\n },\n friction: {\n decay: 0.95,\n stopThreshold: 0.1,\n maxVelocity: 2000,\n },\n stretch: {\n intensity: 0.08,\n maxVelocity: 1500,\n },\n lift: {\n scale: 1.02,\n shadowIntensity: 0.8,\n },\n};\n\n/**\n * Snappy preset\n * Ultra-responsive, minimal lag\n * For UI that needs to feel instant\n */\nexport const snappy: PhysicsPreset = {\n name: 'snappy',\n description: 'Ultra-responsive, instant feedback',\n spring: {\n tension: 400,\n friction: 30,\n mass: 0.8,\n precision: 0.01,\n },\n friction: {\n decay: 0.92,\n stopThreshold: 0.5,\n maxVelocity: 3000,\n },\n stretch: {\n intensity: 0.06,\n maxVelocity: 2000,\n },\n lift: {\n scale: 1.015,\n shadowIntensity: 0.6,\n },\n};\n\n/**\n * Smooth preset\n * Slow, deliberate, luxurious feel\n * For premium, elegant interfaces\n */\nexport const smooth: PhysicsPreset = {\n name: 'smooth',\n description: 'Slow, luxurious, elegant motion',\n spring: {\n tension: 120,\n friction: 20,\n mass: 1.5,\n precision: 0.005,\n },\n friction: {\n decay: 0.97,\n stopThreshold: 0.05,\n maxVelocity: 1500,\n },\n stretch: {\n intensity: 0.1,\n maxVelocity: 1200,\n },\n lift: {\n scale: 1.04,\n shadowIntensity: 1.2,\n },\n};\n\n/**\n * Stiff preset\n * Minimal overshoot, direct response\n * For precision interfaces\n */\nexport const stiff: PhysicsPreset = {\n name: 'stiff',\n description: 'Direct, precise, no overshoot',\n spring: {\n tension: 300,\n friction: 35,\n mass: 1,\n precision: 0.01,\n },\n friction: {\n decay: 0.9,\n stopThreshold: 0.2,\n maxVelocity: 2500,\n },\n stretch: {\n intensity: 0.04,\n maxVelocity: 2500,\n },\n lift: {\n scale: 1.01,\n shadowIntensity: 0.5,\n },\n};\n\n/**\n * Gentle preset\n * Soft, forgiving, approachable\n * For friendly, accessible interfaces\n */\nexport const gentle: PhysicsPreset = {\n name: 'gentle',\n description: 'Soft, forgiving, approachable',\n spring: {\n tension: 150,\n friction: 22,\n mass: 1.2,\n precision: 0.01,\n },\n friction: {\n decay: 0.96,\n stopThreshold: 0.1,\n maxVelocity: 1800,\n },\n stretch: {\n intensity: 0.12,\n maxVelocity: 1400,\n },\n lift: {\n scale: 1.03,\n shadowIntensity: 1,\n },\n};\n\n// Preset map for easy lookup\nexport const presets: Record<string, PhysicsPreset> = {\n ios,\n snappy,\n smooth,\n stiff,\n gentle,\n};\n\n/**\n * Get a preset by name\n */\nexport function getPreset(name: string): PhysicsPreset | undefined {\n return presets[name];\n}\n\n/**\n * Get spring config from preset name\n */\nexport function getSpringConfig(preset: string | SpringConfig): SpringConfig {\n if (typeof preset === 'string') {\n return presets[preset]?.spring ?? ios.spring;\n }\n return preset;\n}\n\n/**\n * Get friction config from preset name\n */\nexport function getFrictionConfig(preset: string | FrictionConfig): FrictionConfig {\n if (typeof preset === 'string') {\n return presets[preset]?.friction ?? ios.friction;\n }\n return preset;\n}\n","import React, { createContext, useContext, useMemo } from 'react';\nimport { SpringConfig, DEFAULT_SPRING_CONFIG } from '../core/Spring';\nimport { FrictionConfig, DEFAULT_FRICTION_CONFIG } from '../core/Friction';\nimport { PhysicsPreset, presets, ios } from '../presets';\n\nexport interface PhysicsContextValue {\n spring: SpringConfig;\n friction: FrictionConfig;\n stretch: {\n intensity: number;\n maxVelocity: number;\n };\n lift: {\n scale: number;\n shadowIntensity: number;\n };\n}\n\nconst defaultContext: PhysicsContextValue = {\n spring: DEFAULT_SPRING_CONFIG,\n friction: DEFAULT_FRICTION_CONFIG,\n stretch: {\n intensity: 0.12,\n maxVelocity: 2000,\n },\n lift: {\n scale: 1.03,\n shadowIntensity: 1,\n },\n};\n\nconst PhysicsContext = createContext<PhysicsContextValue>(defaultContext);\n\nexport interface PhysicsProviderProps {\n children: React.ReactNode;\n /** Preset name or custom configuration */\n preset?: keyof typeof presets | PhysicsPreset;\n /** Override spring config */\n spring?: Partial<SpringConfig>;\n /** Override friction config */\n friction?: Partial<FrictionConfig>;\n /** Override stretch config */\n stretch?: Partial<{ intensity: number; maxVelocity: number }>;\n /** Override lift config */\n lift?: Partial<{ scale: number; shadowIntensity: number }>;\n}\n\n/**\n * Provider for global physics configuration\n * Wrap your app or component tree to set defaults\n */\nexport function PhysicsProvider({\n children,\n preset = 'ios',\n spring,\n friction,\n stretch,\n lift,\n}: PhysicsProviderProps) {\n const value = useMemo(() => {\n // Resolve preset\n const basePreset: PhysicsPreset =\n typeof preset === 'string' ? presets[preset] ?? ios : preset;\n\n return {\n spring: { ...basePreset.spring, ...spring },\n friction: { ...basePreset.friction, ...friction },\n stretch: { ...basePreset.stretch, ...stretch },\n lift: { ...basePreset.lift, ...lift },\n };\n }, [preset, spring, friction, stretch, lift]);\n\n return (\n <PhysicsContext.Provider value={value}>\n {children}\n </PhysicsContext.Provider>\n );\n}\n\n/**\n * Hook to access physics configuration\n */\nexport function usePhysicsContext(): PhysicsContextValue {\n return useContext(PhysicsContext);\n}\n\n/**\n * Hook to get spring config from context\n */\nexport function usePhysicsConfig(): Partial<SpringConfig> {\n const context = useContext(PhysicsContext);\n return context.spring;\n}\n\n/**\n * Hook to get friction config from context\n */\nexport function useFrictionConfig(): Partial<FrictionConfig> {\n const context = useContext(PhysicsContext);\n return context.friction;\n}\n\n/**\n * Hook to get stretch config from context\n */\nexport function useStretchConfig(): { intensity: number; maxVelocity: number } {\n const context = useContext(PhysicsContext);\n return context.stretch;\n}\n\n/**\n * Hook to get lift config from context\n */\nexport function useLiftConfig(): { scale: number; shadowIntensity: number } {\n const context = useContext(PhysicsContext);\n return context.lift;\n}\n","import { useRef, useState, useEffect, useCallback, useMemo } from 'react';\nimport { Spring, Spring1D, SpringConfig, DEFAULT_SPRING_CONFIG } from '../core/Spring';\nimport { Vector2 } from '../core/Vector2';\nimport { PhysicsEngine, generatePhysicsId } from '../core/PhysicsEngine';\nimport { usePhysicsConfig } from '../components/PhysicsProvider';\n\nexport interface UseSpringOptions {\n /** Initial position */\n from?: { x: number; y: number };\n /** Target position */\n to: { x: number; y: number };\n /** Spring configuration or preset name */\n config?: Partial<SpringConfig> | 'ios' | 'snappy' | 'smooth';\n /** Callback when animation completes */\n onRest?: () => void;\n /** Start immediately (default: true) */\n immediate?: boolean;\n}\n\nexport interface UseSpringReturn {\n /** Current x position */\n x: number;\n /** Current y position */\n y: number;\n /** CSS style object ready to apply */\n style: React.CSSProperties;\n /** Whether animation is currently running */\n isAnimating: boolean;\n /** Whether animation has reached target */\n isSettled: boolean;\n /** Set new target position */\n setTarget: (target: { x: number; y: number }) => void;\n /** Immediately snap to position */\n snapTo: (position: { x: number; y: number }) => void;\n /** Add impulse velocity */\n impulse: (velocity: { x: number; y: number }) => void;\n}\n\nexport function useSpring(options: UseSpringOptions): UseSpringReturn {\n const { to, from, config, onRest, immediate = true } = options;\n const globalConfig = usePhysicsConfig();\n\n // Resolve config from presets or custom\n const resolvedConfig = useMemo(() => {\n if (!config) return { ...DEFAULT_SPRING_CONFIG, ...globalConfig };\n if (typeof config === 'string') {\n // Preset names resolved elsewhere\n return { ...DEFAULT_SPRING_CONFIG, ...globalConfig };\n }\n return { ...DEFAULT_SPRING_CONFIG, ...globalConfig, ...config };\n }, [config, globalConfig]);\n\n const springRef = useRef<Spring | null>(null);\n const idRef = useRef<string>(generatePhysicsId('spring'));\n const onRestRef = useRef(onRest);\n onRestRef.current = onRest;\n\n const [state, setState] = useState({\n x: from?.x ?? to.x,\n y: from?.y ?? to.y,\n isAnimating: false,\n isSettled: true,\n });\n\n // Initialize spring\n useEffect(() => {\n const initialPos = from ? Vector2.from(from.x, from.y) : Vector2.from(to.x, to.y);\n springRef.current = new Spring(initialPos, resolvedConfig);\n\n if (immediate) {\n springRef.current.setTarget(Vector2.from(to.x, to.y));\n }\n\n return () => {\n PhysicsEngine.unregister(idRef.current);\n };\n }, []);\n\n // Update target when 'to' changes\n useEffect(() => {\n if (springRef.current && immediate) {\n springRef.current.setTarget(Vector2.from(to.x, to.y));\n\n // Register for updates if not already\n if (!PhysicsEngine.has(idRef.current)) {\n PhysicsEngine.register(idRef.current, (deltaTime) => {\n if (!springRef.current) return;\n\n const result = springRef.current.step(deltaTime);\n setState({\n x: result.position.x,\n y: result.position.y,\n isAnimating: !result.isSettled,\n isSettled: result.isSettled,\n });\n\n if (result.isSettled) {\n PhysicsEngine.unregister(idRef.current);\n onRestRef.current?.();\n }\n });\n }\n }\n }, [to.x, to.y, immediate]);\n\n // Update config when it changes\n useEffect(() => {\n springRef.current?.updateConfig(resolvedConfig);\n }, [resolvedConfig]);\n\n const setTarget = useCallback((target: { x: number; y: number }) => {\n if (!springRef.current) return;\n\n springRef.current.setTarget(Vector2.from(target.x, target.y));\n\n if (!PhysicsEngine.has(idRef.current)) {\n PhysicsEngine.register(idRef.current, (deltaTime) => {\n if (!springRef.current) return;\n\n const result = springRef.current.step(deltaTime);\n setState({\n x: result.position.x,\n y: result.position.y,\n isAnimating: !result.isSettled,\n isSettled: result.isSettled,\n });\n\n if (result.isSettled) {\n PhysicsEngine.unregister(idRef.current);\n onRestRef.current?.();\n }\n });\n }\n }, []);\n\n const snapTo = useCallback((position: { x: number; y: number }) => {\n if (!springRef.current) return;\n\n springRef.current.setPosition(Vector2.from(position.x, position.y));\n springRef.current.setTarget(Vector2.from(position.x, position.y));\n springRef.current.snapToTarget();\n\n setState({\n x: position.x,\n y: position.y,\n isAnimating: false,\n isSettled: true,\n });\n\n PhysicsEngine.unregister(idRef.current);\n }, []);\n\n const impulse = useCallback((velocity: { x: number; y: number }) => {\n if (!springRef.current) return;\n\n const currentState = springRef.current.getState();\n springRef.current.setVelocity(\n currentState.velocity.add(Vector2.from(velocity.x, velocity.y))\n );\n\n if (!PhysicsEngine.has(idRef.current)) {\n PhysicsEngine.register(idRef.current, (deltaTime) => {\n if (!springRef.current) return;\n\n const result = springRef.current.step(deltaTime);\n setState({\n x: result.position.x,\n y: result.position.y,\n isAnimating: !result.isSettled,\n isSettled: result.isSettled,\n });\n\n if (result.isSettled) {\n PhysicsEngine.unregister(idRef.current);\n onRestRef.current?.();\n }\n });\n }\n }, []);\n\n const style: React.CSSProperties = useMemo(\n () => ({\n transform: `translate3d(${state.x}px, ${state.y}px, 0)`,\n willChange: state.isAnimating ? 'transform' : 'auto',\n }),\n [state.x, state.y, state.isAnimating]\n );\n\n return {\n x: state.x,\n y: state.y,\n style,\n isAnimating: state.isAnimating,\n isSettled: state.isSettled,\n setTarget,\n snapTo,\n impulse,\n };\n}\n\n/**\n * 1D Spring hook for single values (scale, opacity, rotation, etc.)\n */\nexport interface UseSpring1DOptions {\n from?: number;\n to: number;\n config?: Partial<SpringConfig>;\n onRest?: () => void;\n immediate?: boolean;\n}\n\nexport function useSpring1D(options: UseSpring1DOptions) {\n const { to, from, config, onRest, immediate = true } = options;\n const globalConfig = usePhysicsConfig();\n\n const resolvedConfig = useMemo(\n () => ({ ...DEFAULT_SPRING_CONFIG, ...globalConfig, ...config }),\n [config, globalConfig]\n );\n\n const springRef = useRef<Spring1D | null>(null);\n const idRef = useRef<string>(generatePhysicsId('spring1d'));\n const onRestRef = useRef(onRest);\n onRestRef.current = onRest;\n\n const [state, setState] = useState({\n value: from ?? to,\n isAnimating: false,\n isSettled: true,\n });\n\n useEffect(() => {\n springRef.current = new Spring1D(from ?? to, resolvedConfig);\n\n if (immediate) {\n springRef.current.setTarget(to);\n }\n\n return () => {\n PhysicsEngine.unregister(idRef.current);\n };\n }, []);\n\n useEffect(() => {\n if (springRef.current && immediate) {\n springRef.current.setTarget(to);\n\n if (!PhysicsEngine.has(idRef.current)) {\n PhysicsEngine.register(idRef.current, (deltaTime) => {\n if (!springRef.current) return;\n\n const result = springRef.current.step(deltaTime);\n setState({\n value: result.value,\n isAnimating: !result.isSettled,\n isSettled: result.isSettled,\n });\n\n if (result.isSettled) {\n PhysicsEngine.unregister(idRef.current);\n onRestRef.current?.();\n }\n });\n }\n }\n }, [to, immediate]);\n\n const setTarget = useCallback((target: number) => {\n if (!springRef.current) return;\n springRef.current.setTarget(target);\n\n if (!PhysicsEngine.has(idRef.current)) {\n PhysicsEngine.register(idRef.current, (deltaTime) => {\n if (!springRef.current) return;\n\n const result = springRef.current.step(deltaTime);\n setState({\n value: result.value,\n isAnimating: !result.isSettled,\n isSettled: result.isSettled,\n });\n\n if (result.isSettled) {\n PhysicsEngine.unregister(idRef.current);\n onRestRef.current?.();\n }\n });\n }\n }, []);\n\n return {\n value: state.value,\n isAnimating: state.isAnimating,\n isSettled: state.isSettled,\n setTarget,\n };\n}\n","import { useRef, useCallback, useEffect } from 'react';\nimport { Vector2 } from '../core/Vector2';\nimport { VelocityTracker } from '../core/Velocity';\n\nexport interface GestureState {\n /** Current position relative to element */\n position: Vector2;\n /** Delta from last event */\n delta: Vector2;\n /** Delta from start of gesture */\n offset: Vector2;\n /** Current velocity in px/s */\n velocity: Vector2;\n /** Dominant movement direction */\n direction: 'up' | 'down' | 'left' | 'right' | 'none';\n /** Whether gesture is currently active */\n active: boolean;\n /** Whether this is first event of gesture */\n first: boolean;\n /** Whether this is last event of gesture */\n last: boolean;\n /** Original event */\n event: PointerEvent;\n}\n\nexport interface GestureHandlers {\n onDragStart?: (state: GestureState) => void;\n onDrag?: (state: GestureState) => void;\n onDragEnd?: (state: GestureState) => void;\n onFlick?: (state: GestureState & { flickVelocity: Vector2 }) => void;\n onHover?: (hovering: boolean) => void;\n onFocus?: (focused: boolean) => void;\n}\n\nexport interface UseGestureOptions extends GestureHandlers {\n /** Minimum distance before drag starts (default: 3) */\n threshold?: number;\n /** Minimum velocity for flick detection (default: 500 px/s) */\n flickThreshold?: number;\n /** Enable touch action prevention */\n preventTouch?: boolean;\n}\n\nexport interface GestureBindings {\n onPointerDown: (e: React.PointerEvent) => void;\n onPointerEnter: (e: React.PointerEvent) => void;\n onPointerLeave: (e: React.PointerEvent) => void;\n onFocus: (e: React.FocusEvent) => void;\n onBlur: (e: React.FocusEvent) => void;\n style: React.CSSProperties;\n}\n\nexport function useGesture(options: UseGestureOptions): GestureBindings {\n const {\n onDragStart,\n onDrag,\n onDragEnd,\n onFlick,\n onHover,\n onFocus,\n threshold = 3,\n flickThreshold = 500,\n preventTouch = true,\n } = options;\n\n const velocityTracker = useRef(new VelocityTracker());\n const startPosition = useRef<Vector2>(Vector2.zero());\n const lastPosition = useRef<Vector2>(Vector2.zero());\n const isDragging = useRef(false);\n const hasExceededThreshold = useRef(false);\n const pointerId = useRef<number | null>(null);\n const elementRef = useRef<HTMLElement | null>(null);\n\n // Store handlers in refs to avoid stale closures\n const handlersRef = useRef({ onDragStart, onDrag, onDragEnd, onFlick });\n handlersRef.current = { onDragStart, onDrag, onDragEnd, onFlick };\n\n const createGestureState = useCallback(\n (event: PointerEvent, first: boolean, last: boolean): GestureState => {\n const position = Vector2.from(event.clientX, event.clientY);\n const delta = position.subtract(lastPosition.current);\n const offset = position.subtract(startPosition.current);\n const velocity = velocityTracker.current.getVelocity();\n const direction = velocityTracker.current.getDirection();\n\n return {\n position,\n delta,\n offset,\n velocity,\n direction,\n active: !last,\n first,\n last,\n event,\n };\n },\n []\n );\n\n const handlePointerMove = useCallback(\n (event: PointerEvent) => {\n if (!isDragging.current || pointerId.current !== event.pointerId) return;\n\n const position = Vector2.from(event.clientX, event.clientY);\n velocityTracker.current.addSample(position);\n\n // Check threshold\n if (!hasExceededThreshold.current) {\n const distance = position.distanceTo(startPosition.current);\n if (distance < threshold) return;\n\n hasExceededThreshold.current = true;\n const state = createGestureState(event, true, false);\n handlersRef.current.onDragStart?.(state);\n }\n\n const state = createGestureState(event, false, false);\n handlersRef.current.onDrag?.(state);\n lastPosition.current = position;\n },\n [threshold, createGestureState]\n );\n\n const handlePointerUp = useCallback(\n (event: PointerEvent) => {\n if (!isDragging.current || pointerId.current !== event.pointerId) return;\n\n isDragging.current = false;\n pointerId.current = null;\n\n document.removeEventListener('pointermove', handlePointerMove);\n document.removeEventListener('pointerup', handlePointerUp);\n document.removeEventListener('pointercancel', handlePointerUp);\n\n if (hasExceededThreshold.current) {\n const state = createGestureState(event, false, true);\n handlersRef.current.onDragEnd?.(state);\n\n // Check for flick\n const velocity = velocityTracker.current.getVelocity();\n if (velocity.magnitude > flickThreshold) {\n handlersRef.current.onFlick?.({ ...state, flickVelocity: velocity });\n }\n }\n\n velocityTracker.current.reset();\n hasExceededThreshold.current = false;\n },\n [handlePointerMove, createGestureState, flickThreshold]\n );\n\n const onPointerDown = useCallback(\n (e: React.PointerEvent) => {\n if (isDragging.current) return;\n\n const element = e.currentTarget as HTMLElement;\n elementRef.current = element;\n element.setPointerCapture(e.pointerId);\n\n pointerId.current = e.pointerId;\n isDragging.current = true;\n hasExceededThreshold.current = false;\n\n const position = Vector2.from(e.clientX, e.clientY);\n startPosition.current = position;\n lastPosition.current = position;\n velocityTracker.current.reset();\n velocityTracker.current.addSample(position);\n\n document.addEventListener('pointermove', handlePointerMove);\n document.addEventListener('pointerup', handlePointerUp);\n document.addEventListener('pointercancel', handlePointerUp);\n },\n [handlePointerMove, handlePointerUp]\n );\n\n const onPointerEnter = useCallback(() => {\n onHover?.(true);\n }, [onHover]);\n\n const onPointerLeave = useCallback(() => {\n onHover?.(false);\n }, [onHover]);\n\n const handleFocus = useCallback(() => {\n onFocus?.(true);\n }, [onFocus]);\n\n const handleBlur = useCallback(() => {\n onFocus?.(false);\n }, [onFocus]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n document.removeEventListener('pointermove', handlePointerMove);\n document.removeEventListener('pointerup', handlePointerUp);\n document.removeEventListener('pointercancel', handlePointerUp);\n };\n }, [handlePointerMove, handlePointerUp]);\n\n return {\n onPointerDown,\n onPointerEnter,\n onPointerLeave,\n onFocus: handleFocus,\n onBlur: handleBlur,\n style: preventTouch ? { touchAction: 'none' } : {},\n };\n}\n","import { useRef, useState, useCallback, useEffect, useMemo } from 'react';\nimport { Vector2 } from '../core/Vector2';\nimport { Spring, SpringConfig, DEFAULT_SPRING_CONFIG } from '../core/Spring';\nimport { Momentum, FrictionConfig, DEFAULT_FRICTION_CONFIG } from '../core/Friction';\nimport { VelocityTracker } from '../core/Velocity';\nimport { PhysicsEngine, generatePhysicsId } from '../core/PhysicsEngine';\nimport { usePhysicsConfig } from '../components/PhysicsProvider';\n\nexport interface Bounds {\n left?: number;\n right?: number;\n top?: number;\n bottom?: number;\n}\n\nexport interface UseDragOptions {\n /** Initial position */\n initial?: { x: number; y: number };\n /** Movement bounds */\n bounds?: Bounds;\n /** Enable rubber band effect at bounds (default: true) */\n rubberBand?: boolean;\n /** Rubber band resistance (0-1, default: 0.55) */\n rubberBandFactor?: number;\n /** Enable momentum after release (default: true) */\n momentum?: boolean;\n /** Snap to positions after release */\n snapTo?: { x: number; y: number }[];\n /** Snap threshold distance (default: 50) */\n snapThreshold?: number;\n /** Lock to single axis */\n axis?: 'x' | 'y' | 'both';\n /** Spring configuration for snap */\n springConfig?: Partial<SpringConfig>;\n /** Friction configuration for momentum */\n frictionConfig?: Partial<FrictionConfig>;\n /** Callback on drag start */\n onDragStart?: (position: Vector2) => void;\n /** Callback during drag */\n onDrag?: (position: Vector2) => void;\n /** Callback on drag end */\n onDragEnd?: (position: Vector2, velocity: Vector2) => void;\n /** Callback when settled */\n onRest?: (position: Vector2) => void;\n}\n\nexport interface UseDragReturn {\n /** Current x position */\n x: number;\n /** Current y position */\n y: number;\n /** Whether currently dragging */\n isDragging: boolean;\n /** Whether momentum is active */\n isMomentum: boolean;\n /** CSS style object */\n style: React.CSSProperties;\n /** Bind to element */\n bind: {\n onPointerDown: (e: React.PointerEvent) => void;\n style: React.CSSProperties;\n };\n /** Set position programmatically */\n setPosition: (position: { x: number; y: number }) => void;\n /** Snap to position with spring */\n snapToPosition: (position: { x: number; y: number }) => void;\n}\n\nexport function useDrag(options: UseDragOptions = {}): UseDragReturn {\n const {\n initial = { x: 0, y: 0 },\n bounds,\n rubberBand = true,\n rubberBandFactor = 0.55,\n momentum = true,\n snapTo,\n snapThreshold = 50,\n axis = 'both',\n springConfig,\n frictionConfig,\n onDragStart,\n onDrag,\n onDragEnd,\n onRest,\n } = options;\n\n const globalConfig = usePhysicsConfig();\n const resolvedSpringConfig = useMemo(\n () => ({ ...DEFAULT_SPRING_CONFIG, ...globalConfig, ...springConfig }),\n [globalConfig, springConfig]\n );\n const resolvedFrictionConfig = useMemo(\n () => ({ ...DEFAULT_FRICTION_CONFIG, ...frictionConfig }),\n [frictionConfig]\n );\n\n const [state, setState] = useState({\n x: initial.x,\n y: initial.y,\n isDragging: false,\n isMomentum: false,\n });\n\n const positionRef = useRef(Vector2.from(initial.x, initial.y));\n const startPositionRef = useRef(Vector2.zero());\n const dragOffsetRef = useRef(Vector2.zero());\n const velocityTracker = useRef(new VelocityTracker());\n const springRef = useRef<Spring | null>(null);\n const momentumRef = useRef<Momentum | null>(null);\n const idRef = useRef(generatePhysicsId('drag'));\n const pointerIdRef = useRef<number | null>(null);\n\n const handlersRef = useRef({ onDragStart, onDrag, onDragEnd, onRest });\n handlersRef.current = { onDragStart, onDrag, onDragEnd, onRest };\n\n // Convert bounds to Vector2 format\n const boundsVec = useMemo(() => {\n if (!bounds) return null;\n return {\n min: Vector2.from(bounds.left ?? -Infinity, bounds.top ?? -Infinity),\n max: Vector2.from(bounds.right ?? Infinity, bounds.bottom ?? Infinity),\n };\n }, [bounds]);\n\n // Apply rubber band at bounds\n const applyRubberBand = useCallback(\n (pos: Vector2): Vector2 => {\n if (!boundsVec || !rubberBand) return pos;\n\n let x = pos.x;\n let y = pos.y;\n\n if (pos.x < boundsVec.min.x) {\n const over = boundsVec.min.x - pos.x;\n x = boundsVec.min.x - over * rubberBandFactor;\n } else if (pos.x > boundsVec.max.x) {\n const over = pos.x - boundsVec.max.x;\n x = boundsVec.max.x + over * rubberBandFactor;\n }\n\n if (pos.y < boundsVec.min.y) {\n const over = boundsVec.min.y - pos.y;\n y = boundsVec.min.y - over * rubberBandFactor;\n } else if (pos.y > boundsVec.max.y) {\n const over = pos.y - boundsVec.max.y;\n y = boundsVec.max.y + over * rubberBandFactor;\n }\n\n return Vector2.from(x, y);\n },\n [boundsVec, rubberBand, rubberBandFactor]\n );\n\n // Clamp to bounds\n const clampToBounds = useCallback(\n (pos: Vector2): Vector2 => {\n if (!boundsVec) return pos;\n return pos.clampComponents(boundsVec.min, boundsVec.max);\n },\n [boundsVec]\n );\n\n // Find nearest snap point\n const findSnapPoint = useCallback(\n (pos: Vector2, velocity: Vector2): Vector2 | null => {\n if (!snapTo || snapTo.length === 0) return null;\n\n // Project position based on velocity\n const projectedPos = pos.add(velocity.multiply(0.1));\n\n let nearestPoint: Vector2 | null = null;\n let nearestDistance = Infinity;\n\n for (const point of snapTo) {\n const snapVec = Vector2.from(point.x, point.y);\n const distance = projectedPos.distanceTo(snapVec);\n\n if (distance < nearestDistance && distance < snapThreshold) {\n nearestDistance = distance;\n nearestPoint = snapVec;\n }\n }\n\n return nearestPoint;\n },\n [snapTo, snapThreshold]\n );\n\n // Spring animation to target\n const animateToTarget = useCallback(\n (target: Vector2) => {\n springRef.current = new Spring(positionRef.current, resolvedSpringConfig);\n springRef.current.setTarget(target);\n\n PhysicsEngine.register(idRef.current, (deltaTime) => {\n if (!springRef.current) return;\n\n const result = springRef.current.step(deltaTime);\n positionRef.current = result.position;\n\n setState((prev) => ({\n ...prev,\n x: result.position.x,\n y: result.position.y,\n isMomentum: false,\n }));\n\n if (result.isSettled) {\n PhysicsEngine.unregister(idRef.current);\n handlersRef.current.onRest?.(result.position);\n }\n });\n },\n [resolvedSpringConfig]\n );\n\n const handlePointerMove = useCallback(\n (e: PointerEvent) => {\n if (pointerIdRef.current !== e.pointerId) return;\n\n const currentPos = Vector2.from(e.clientX, e.clientY);\n velocityTracker.current.addSample(currentPos);\n\n let newPos = currentPos.subtract(dragOffsetRef.current);\n\n // Apply axis lock\n if (axis === 'x') {\n newPos = Vector2.from(newPos.x, startPositionRef.current.y);\n } else if (axis === 'y') {\n newPos = Vector2.from(startPositionRef.current.x, newPos.y);\n }\n\n // Apply rubber band\n newPos = applyRubberBand(newPos);\n\n positionRef.current = newPos;\n setState((prev) => ({\n ...prev,\n x: newPos.x,\n y: newPos.y,\n }));\n\n handlersRef.current.onDrag?.(newPos);\n },\n [axis, applyRubberBand]\n );\n\n const handlePointerUp = useCallback(\n (e: PointerEvent) => {\n if (pointerIdRef.current !== e.pointerId) return;\n\n pointerIdRef.current = null;\n document.removeEventListener('pointermove', handlePointerMove);\n document.removeEventListener('pointerup', handlePointerUp);\n document.removeEventListener('pointercancel', handlePointerUp);\n\n const velocity = velocityTracker.current.getVelocity();\n velocityTracker.current.reset();\n\n setState((prev) => ({ ...prev, isDragging: false }));\n handlersRef.current.onDragEnd?.(positionRef.current, velocity);\n\n // Check for snap point\n const snapPoint = findSnapPoint(positionRef.current, velocity);\n if (snapPoint) {\n animateToTarget(snapPoint);\n return;\n }\n\n // Check if out of bounds - spring back\n if (boundsVec) {\n const clamped = clampToBounds(positionRef.current);\n if (!clamped.equals(positionRef.current)) {\n animateToTarget(clamped);\n return;\n }\n }\n\n // Apply momentum if enabled and velocity is significant\n if (momentum && velocity.magnitude > 100) {\n setState((prev) => ({ ...prev, isMomentum: true }));\n\n momentumRef.current = new Momentum(positionRef.current, resolvedFrictionConfig);\n momentumRef.current.start(positionRef.current, velocity);\n\n PhysicsEngine.register(idRef.current, (deltaTime) => {\n if (!momentumRef.current) return;\n\n const result = momentumRef.current.step(deltaTime);\n\n // Check bounds during momentum\n let newPos = result.position;\n if (boundsVec) {\n const clamped = clampToBounds(newPos);\n if (!clamped.equals(newPos)) {\n // Hit boundary, spring back\n momentumRef.current.stop();\n PhysicsEngine.unregister(idRef.current);\n positionRef.current = newPos;\n animateToTarget(clamped);\n return;\n }\n }\n\n positionRef.current = newPos;\n setState((prev) => ({\n ...prev,\n x: newPos.x,\n y: newPos.y,\n isMomentum: result.isActive,\n }));\n\n if (!result.isActive) {\n PhysicsEngine.unregister(idRef.current);\n handlersRef.current.onRest?.(newPos);\n }\n });\n } else {\n handlersRef.current.onRest?.(positionRef.current);\n }\n },\n [\n handlePointerMove,\n momentum,\n boundsVec,\n clampToBounds,\n findSnapPoint,\n animateToTarget,\n resolvedFrictionConfig,\n ]\n );\n\n const onPointerDown = useCallback(\n (e: React.PointerEvent) => {\n if (pointerIdRef.current !== null) return;\n\n // Stop any ongoing animation\n PhysicsEngine.unregister(idRef.current);\n\n pointerIdRef.current = e.pointerId;\n const element = e.currentTarget as HTMLElement;\n element.setPointerCapture(e.pointerId);\n\n const pointerPos = Vector2.from(e.clientX, e.clientY);\n dragOffsetRef.current = pointerPos.subtract(positionRef.current);\n startPositionRef.current = positionRef.current;\n\n velocityTracker.current.reset();\n velocityTracker.current.addSample(pointerPos);\n\n setState((prev) => ({ ...prev, isDragging: true, isMomentum: false }));\n handlersRef.current.onDragStart?.(positionRef.current);\n\n document.addEventListener('pointermove', handlePointerMove);\n document.addEventListener('pointerup', handlePointerUp);\n document.addEventListener('pointercancel', handlePointerUp);\n },\n [handlePointerMove, handlePointerUp]\n );\n\n const setPosition = useCallback((position: { x: number; y: number }) => {\n PhysicsEngine.unregister(idRef.current);\n positionRef.current = Vector2.from(position.x, position.y);\n setState((prev) => ({\n ...prev,\n x: position.x,\n y: position.y,\n isDragging: false,\n isMomentum: false,\n }));\n }, []);\n\n const snapToPosition = useCallback(\n (position: { x: number; y: number }) => {\n animateToTarget(Vector2.from(position.x, position.y));\n },\n [animateToTarget]\n );\n\n // Cleanup\n useEffect(() => {\n return () => {\n PhysicsEngine.unregister(idRef.current);\n document.removeEventListener('pointermove', handlePointerMove);\n document.removeEventListener('pointerup', handlePointerUp);\n document.removeEventListener('pointercancel', handlePointerUp);\n };\n }, [handlePointerMove, handlePointerUp]);\n\n const style: React.CSSProperties = useMemo(\n () => ({\n transform: `translate3d(${state.x}px, ${state.y}px, 0)`,\n willChange: state.isDragging || state.isMomentum ? 'transform' : 'auto',\n cursor: state.isDragging ? 'grabbing' : 'grab',\n }),\n [state.x, state.y, state.isDragging, state.isMomentum]\n );\n\n return {\n x: state.x,\n y: state.y,\n isDragging: state.isDragging,\n isMomentum: state.isMomentum,\n style,\n bind: {\n onPointerDown,\n style: { touchAction: 'none' },\n },\n setPosition,\n snapToPosition,\n };\n}\n","import { useMemo } from 'react';\nimport { Vector2 } from '../core/Vector2';\n\nexport interface UseStretchOptions {\n /** Current velocity vector */\n velocity: Vector2 | { x: number; y: number };\n /** Axis to apply stretch ('x', 'y', or 'both') */\n axis?: 'x' | 'y' | 'both';\n /** Maximum stretch intensity (0-0.3, default: 0.12) */\n intensity?: number;\n /** Velocity at which max stretch is reached (default: 2000) */\n maxVelocity?: number;\n}\n\nexport interface UseStretchReturn {\n /** Scale X value */\n scaleX: number;\n /** Scale Y value */\n scaleY: number;\n /** CSS style object with transform */\n style: React.CSSProperties;\n}\n\n/**\n * Calculate stretch deformation based on velocity\n * Subtle, directional stretch - never cartoon-like\n */\nexport function useStretch(options: UseStretchOptions): UseStretchReturn {\n const {\n velocity,\n axis = 'both',\n intensity = 0.12,\n maxVelocity = 2000,\n } = options;\n\n return useMemo(() => {\n const vel = velocity instanceof Vector2 ? velocity : Vector2.from(velocity.x, velocity.y);\n\n // Normalize velocity to 0-1 range\n const normalizedX = Math.min(Math.abs(vel.x) / maxVelocity, 1);\n const normalizedY = Math.min(Math.abs(vel.y) / maxVelocity, 1);\n\n // Apply easing for more natural feel\n const easedX = easeOutQuad(normalizedX);\n const easedY = easeOutQuad(normalizedY);\n\n let scaleX = 1;\n let scaleY = 1;\n\n if (axis === 'x' || axis === 'both') {\n // Stretch in direction of movement, compress perpendicular\n const stretchX = 1 + easedX * intensity;\n const compressY = 1 - easedX * intensity * 0.5; // Less compression than stretch\n\n if (axis === 'x') {\n scaleX = stretchX;\n scaleY = compressY;\n } else {\n scaleX = stretchX;\n }\n }\n\n if (axis === 'y' || axis === 'both') {\n const stretchY = 1 + easedY * intensity;\n const compressX = 1 - easedY * intensity * 0.5;\n\n if (axis === 'y') {\n scaleY = stretchY;\n scaleX = compressX;\n } else {\n scaleY = stretchY;\n }\n }\n\n // When both axes have velocity, blend the effects\n if (axis === 'both' && normalizedX > 0 && normalizedY > 0) {\n // Dominant axis gets stretch, other gets slight compression\n if (normalizedX > normalizedY) {\n scaleX = 1 + easedX * intensity;\n scaleY = 1 - easedX * intensity * 0.3 + easedY * intensity * 0.5;\n } else {\n scaleY = 1 + easedY * intensity;\n scaleX = 1 - easedY * intensity * 0.3 + easedX * intensity * 0.5;\n }\n }\n\n // Clamp to prevent excessive deformation\n scaleX = Math.max(0.85, Math.min(1.15, scaleX));\n scaleY = Math.max(0.85, Math.min(1.15, scaleY));\n\n return {\n scaleX,\n scaleY,\n style: {\n transform: `scale3d(${scaleX}, ${scaleY}, 1)`,\n willChange: scaleX !== 1 || scaleY !== 1 ? 'transform' : 'auto',\n },\n };\n }, [velocity, axis, intensity, maxVelocity]);\n}\n\n// Easing function for natural stretch feel\nfunction easeOutQuad(t: number): number {\n return t * (2 - t);\n}\n\n/**\n * Combine stretch with position transform\n */\nexport function combineStretchStyle(\n positionStyle: React.CSSProperties,\n stretchStyle: React.CSSProperties\n): React.CSSProperties {\n const positionTransform = positionStyle.transform || '';\n const stretchTransform = stretchStyle.transform || '';\n\n return {\n ...positionStyle,\n transform: `${positionTransform} ${stretchTransform}`.trim(),\n willChange:\n positionStyle.willChange === 'transform' || stretchStyle.willChange === 'transform'\n ? 'transform'\n : 'auto',\n };\n}\n","import { useState, useCallback, useMemo } from 'react';\nimport { useSpring1D } from './useSpring';\nimport { SpringConfig } from '../core/Spring';\n\nexport interface UseLiftOptions {\n /** When to activate lift effect */\n trigger?: 'hover' | 'drag' | 'focus' | 'active';\n /** Scale factor when lifted (default: 1.03) */\n scale?: number;\n /** Enable dynamic shadow (default: true) */\n shadow?: boolean;\n /** Shadow intensity multiplier (default: 1) */\n shadowIntensity?: number;\n /** Spring configuration */\n springConfig?: Partial<SpringConfig>;\n /** Callback when lift state changes */\n onLift?: (isLifted: boolean) => void;\n}\n\nexport interface UseLiftReturn {\n /** Whether element is currently lifted */\n isLifted: boolean;\n /** Current scale value */\n scale: number;\n /** CSS style object */\n style: React.CSSProperties;\n /** Event handlers to bind */\n bind: {\n onPointerEnter?: () => void;\n onPointerLeave?: () => void;\n onPointerDown?: () => void;\n onPointerUp?: () => void;\n onFocus?: () => void;\n onBlur?: () => void;\n };\n /** Manually set lift state */\n setLifted: (lifted: boolean) => void;\n}\n\nexport function useLift(options: UseLiftOptions = {}): UseLiftReturn {\n const {\n trigger = 'hover',\n scale: targetScale = 1.03,\n shadow = true,\n shadowIntensity = 1,\n springConfig,\n onLift,\n } = options;\n\n const [isLifted, setIsLifted] = useState(false);\n\n // Spring for smooth scale animation\n const { value: scale } = useSpring1D({\n to: isLifted ? targetScale : 1,\n config: {\n tension: 300,\n friction: 20,\n ...springConfig,\n },\n });\n\n const handleLift = useCallback(\n (lifted: boolean) => {\n setIsLifted(lifted);\n onLift?.(lifted);\n },\n [onLift]\n );\n\n // Generate event bindings based on trigger\n const bind = useMemo(() => {\n switch (trigger) {\n case 'hover':\n return {\n onPointerEnter: () => handleLift(true),\n onPointerLeave: () => handleLift(false),\n };\n case 'drag':\n return {\n onPointerDown: () => handleLift(true),\n onPointerUp: () => handleLift(false),\n };\n case 'focus':\n return {\n onFocus: () => handleLift(true),\n onBlur: () => handleLift(false),\n };\n case 'active':\n return {\n onPointerDown: () => handleLift(true),\n onPointerUp: () => handleLift(false),\n onPointerLeave: () => handleLift(false),\n };\n default:\n return {};\n }\n }, [trigger, handleLift]);\n\n // Calculate shadow based on lift amount\n const shadowStyle = useMemo(() => {\n if (!shadow) return {};\n\n const liftAmount = (scale - 1) / (targetScale - 1);\n const clampedLift = Math.max(0, Math.min(1, liftAmount));\n\n // Progressive shadow - subtle at rest, more pronounced when lifted\n const blur = 8 + clampedLift * 24 * shadowIntensity;\n const spread = clampedLift * 4 * shadowIntensity;\n const yOffset = 2 + clampedLift * 12 * shadowIntensity;\n const opacity = 0.08 + clampedLift * 0.12 * shadowIntensity;\n\n return {\n boxShadow: `0 ${yOffset}px ${blur}px ${spread}px rgba(0, 0, 0, ${opacity})`,\n };\n }, [scale, targetScale, shadow, shadowIntensity]);\n\n const style: React.CSSProperties = useMemo(\n () => ({\n transform: `scale3d(${scale}, ${scale}, 1)`,\n transformOrigin: 'center center',\n willChange: scale !== 1 ? 'transform, box-shadow' : 'auto',\n ...shadowStyle,\n }),\n [scale, shadowStyle]\n );\n\n return {\n isLifted,\n scale,\n style,\n bind,\n setLifted: handleLift,\n };\n}\n\n/**\n * Combine lift style with other transforms\n */\nexport function combineLiftStyle(\n baseStyle: React.CSSProperties,\n liftStyle: React.CSSProperties\n): React.CSSProperties {\n const baseTransform = baseStyle.transform || '';\n const liftTransform = liftStyle.transform || '';\n\n // Extract scale from lift and apply after position transforms\n return {\n ...baseStyle,\n ...liftStyle,\n transform: `${baseTransform} ${liftTransform}`.trim(),\n };\n}\n","import { useRef, useState, useCallback, useEffect, useMemo } from 'react';\nimport { Vector2 } from '../core/Vector2';\nimport { VelocityTracker } from '../core/Velocity';\nimport { Momentum, FrictionConfig, DEFAULT_FRICTION_CONFIG } from '../core/Friction';\nimport { PhysicsEngine, generatePhysicsId } from '../core/PhysicsEngine';\n\nexport interface UseFlickOptions {\n /** Initial position */\n initial?: { x: number; y: number };\n /** Minimum velocity to trigger flick (default: 500 px/s) */\n threshold?: number;\n /** Friction configuration */\n friction?: Partial<FrictionConfig>;\n /** Lock to single axis */\n axis?: 'x' | 'y' | 'both';\n /** Callback when flick starts */\n onFlickStart?: (velocity: Vector2) => void;\n /** Callback during flick momentum */\n onFlick?: (position: Vector2, velocity: Vector2) => void;\n /** Callback when flick ends */\n onFlickEnd?: (position: Vector2) => void;\n}\n\nexport interface UseFlickReturn {\n /** Current x position */\n x: number;\n /** Current y position */\n y: number;\n /** Whether flick momentum is active */\n isFlicking: boolean;\n /** Current velocity */\n velocity: Vector2;\n /** CSS style object */\n style: React.CSSProperties;\n /** Trigger a flick with given velocity */\n flick: (velocity: { x: number; y: number }) => void;\n /** Stop current flick */\n stop: () => void;\n /** Set position (stops any active flick) */\n setPosition: (position: { x: number; y: number }) => void;\n /** Record position sample for velocity tracking */\n recordSample: (position: { x: number; y: number }) => void;\n /** Get current velocity from samples */\n getCurrentVelocity: () => Vector2;\n /** Release with current velocity (triggers flick if above threshold) */\n release: (position: { x: number; y: number }) => boolean;\n}\n\nexport function useFlick(options: UseFlickOptions = {}): UseFlickReturn {\n const {\n initial = { x: 0, y: 0 },\n threshold = 500,\n friction,\n axis = 'both',\n onFlickStart,\n onFlick,\n onFlickEnd,\n } = options;\n\n const resolvedFriction = useMemo(\n () => ({ ...DEFAULT_FRICTION_CONFIG, ...friction }),\n [friction]\n );\n\n const [state, setState] = useState({\n x: initial.x,\n y: initial.y,\n isFlicking: false,\n velocity: Vector2.zero(),\n });\n\n const positionRef = useRef(Vector2.from(initial.x, initial.y));\n const momentumRef = useRef<Momentum | null>(null);\n const velocityTracker = useRef(new VelocityTracker());\n const idRef = useRef(generatePhysicsId('flick'));\n\n const handlersRef = useRef({ onFlickStart, onFlick, onFlickEnd });\n handlersRef.current = { onFlickStart, onFlick, onFlickEnd };\n\n const startMomentum = useCallback(\n (velocity: Vector2) => {\n // Apply axis constraint\n let constrainedVelocity = velocity;\n if (axis === 'x') {\n constrainedVelocity = Vector2.from(velocity.x, 0);\n } else if (axis === 'y') {\n constrainedVelocity = Vector2.from(0, velocity.y);\n }\n\n momentumRef.current = new Momentum(positionRef.current, resolvedFriction);\n momentumRef.current.start(positionRef.current, constrainedVelocity);\n\n setState((prev) => ({\n ...prev,\n isFlicking: true,\n velocity: constrainedVelocity,\n }));\n\n handlersRef.current.onFlickStart?.(constrainedVelocity);\n\n PhysicsEngine.register(idRef.current, (deltaTime) => {\n if (!momentumRef.current) return;\n\n const result = momentumRef.current.step(deltaTime);\n\n // Apply axis constraint to position\n let newPos = result.position;\n if (axis === 'x') {\n newPos = Vector2.from(newPos.x, positionRef.current.y);\n } else if (axis === 'y') {\n newPos = Vector2.from(positionRef.current.x, newPos.y);\n }\n\n positionRef.current = newPos;\n\n setState({\n x: newPos.x,\n y: newPos.y,\n isFlicking: result.isActive,\n velocity: result.velocity,\n });\n\n handlersRef.current.onFlick?.(newPos, result.velocity);\n\n if (!result.isActive) {\n PhysicsEngine.unregister(idRef.current);\n handlersRef.current.onFlickEnd?.(newPos);\n }\n });\n },\n [axis, resolvedFriction]\n );\n\n const flick = useCallback(\n (velocity: { x: number; y: number }) => {\n PhysicsEngine.unregister(idRef.current);\n velocityTracker.current.reset();\n startMomentum(Vector2.from(velocity.x, velocity.y));\n },\n [startMomentum]\n );\n\n const stop = useCallback(() => {\n PhysicsEngine.unregister(idRef.current);\n momentumRef.current?.stop();\n velocityTracker.current.reset();\n\n setState((prev) => ({\n ...prev,\n isFlicking: false,\n velocity: Vector2.zero(),\n }));\n }, []);\n\n const setPosition = useCallback(\n (position: { x: number; y: number }) => {\n stop();\n positionRef.current = Vector2.from(position.x, position.y);\n setState({\n x: position.x,\n y: position.y,\n isFlicking: false,\n velocity: Vector2.zero(),\n });\n },\n [stop]\n );\n\n const recordSample = useCallback((position: { x: number; y: number }) => {\n velocityTracker.current.addSample(Vector2.from(position.x, position.y));\n positionRef.current = Vector2.from(position.x, position.y);\n setState((prev) => ({\n ...prev,\n x: position.x,\n y: position.y,\n }));\n }, []);\n\n const getCurrentVelocity = useCallback(() => {\n return velocityTracker.current.getVelocity();\n }, []);\n\n const release = useCallback(\n (position: { x: number; y: number }): boolean => {\n positionRef.current = Vector2.from(position.x, position.y);\n const velocity = velocityTracker.current.getVelocity();\n velocityTracker.current.reset();\n\n if (velocity.magnitude >= threshold) {\n startMomentum(velocity);\n return true;\n }\n\n setState((prev) => ({\n ...prev,\n x: position.x,\n y: position.y,\n isFlicking: false,\n velocity: Vector2.zero(),\n }));\n\n return false;\n },\n [threshold, startMomentum]\n );\n\n // Cleanup\n useEffect(() => {\n return () => {\n PhysicsEngine.unregister(idRef.current);\n };\n }, []);\n\n const style: React.CSSProperties = useMemo(\n () => ({\n transform: `translate3d(${state.x}px, ${state.y}px, 0)`,\n willChange: state.isFlicking ? 'transform' : 'auto',\n }),\n [state.x, state.y, state.isFlicking]\n );\n\n return {\n x: state.x,\n y: state.y,\n isFlicking: state.isFlicking,\n velocity: state.velocity,\n style,\n flick,\n stop,\n setPosition,\n recordSample,\n getCurrentVelocity,\n release,\n };\n}\n","import React, { useMemo, forwardRef } from 'react';\nimport { useDrag, Bounds } from '../hooks/useDrag';\nimport { useLift } from '../hooks/useLift';\nimport { useStretch, combineStretchStyle } from '../hooks/useStretch';\nimport { combineLiftStyle } from '../hooks/useLift';\nimport { usePhysicsContext } from './PhysicsProvider';\nimport { Vector2 } from '../core/Vector2';\nimport { SpringConfig } from '../core/Spring';\n\nexport interface DraggableProps {\n children: React.ReactNode;\n /** Initial position */\n initial?: { x: number; y: number };\n /** Movement bounds */\n bounds?: Bounds;\n /** Enable rubber band at bounds (default: true) */\n rubberBand?: boolean;\n /** Enable momentum after release (default: true) */\n momentum?: boolean;\n /** Enable lift effect on drag (default: true) */\n lift?: boolean;\n /** Enable velocity stretch (default: true) */\n stretch?: boolean;\n /** Snap points after release */\n snapTo?: { x: number; y: number }[];\n /** Lock to axis */\n axis?: 'x' | 'y' | 'both';\n /** Spring configuration override */\n springConfig?: Partial<SpringConfig>;\n /** Additional class name */\n className?: string;\n /** Additional inline styles */\n style?: React.CSSProperties;\n /** Callback on drag start */\n onDragStart?: (position: { x: number; y: number }) => void;\n /** Callback during drag */\n onDrag?: (position: { x: number; y: number }) => void;\n /** Callback on drag end */\n onDragEnd?: (position: { x: number; y: number }, velocity: { x: number; y: number }) => void;\n /** Callback when animation settles */\n onRest?: (position: { x: number; y: number }) => void;\n}\n\n/**\n * Draggable component with physics-based motion\n * Combines drag, lift, and stretch effects\n */\nexport const Draggable = forwardRef<HTMLDivElement, DraggableProps>(\n (\n {\n children,\n initial = { x: 0, y: 0 },\n bounds,\n rubberBand = true,\n momentum = true,\n lift: enableLift = true,\n stretch: enableStretch = true,\n snapTo,\n axis = 'both',\n springConfig,\n className,\n style: customStyle,\n onDragStart,\n onDrag,\n onDragEnd,\n onRest,\n },\n ref\n ) => {\n const physicsContext = usePhysicsContext();\n\n const {\n isDragging,\n isMomentum,\n style: dragStyle,\n bind,\n } = useDrag({\n initial,\n bounds,\n rubberBand,\n momentum,\n snapTo,\n axis,\n springConfig: { ...physicsContext.spring, ...springConfig },\n onDragStart: (pos) => onDragStart?.(pos.toObject()),\n onDrag: (pos) => onDrag?.(pos.toObject()),\n onDragEnd: (pos, vel) => onDragEnd?.(pos.toObject(), vel.toObject()),\n onRest: (pos) => onRest?.(pos.toObject()),\n });\n\n // Lift effect\n const { style: liftStyle, bind: liftBind } = useLift({\n trigger: 'drag',\n scale: physicsContext.lift.scale,\n shadowIntensity: physicsContext.lift.shadowIntensity,\n });\n\n // Stretch effect - estimate velocity from recent movement\n const velocity = useMemo(() => {\n if (!isDragging && !isMomentum) return Vector2.zero();\n // Use a small velocity for visual feedback during drag\n return Vector2.from(0, 0);\n }, [isDragging, isMomentum]);\n\n const { style: stretchStyle } = useStretch({\n velocity,\n intensity: physicsContext.stretch.intensity,\n maxVelocity: physicsContext.stretch.maxVelocity,\n });\n\n // Combine all styles\n const combinedStyle = useMemo(() => {\n let result = { ...dragStyle };\n\n if (enableLift && isDragging) {\n result = combineLiftStyle(result, liftStyle);\n }\n\n if (enableStretch) {\n result = combineStretchStyle(result, stretchStyle);\n }\n\n return {\n ...result,\n ...customStyle,\n position: 'relative' as const,\n userSelect: 'none' as const,\n };\n }, [dragStyle, liftStyle, stretchStyle, enableLift, enableStretch, isDragging, customStyle]);\n\n // Combine bindings\n const combinedBind = useMemo(() => {\n return {\n ...bind,\n onPointerDown: (e: React.PointerEvent) => {\n bind.onPointerDown(e);\n if (enableLift) {\n liftBind.onPointerDown?.();\n }\n },\n onPointerUp: () => {\n if (enableLift) {\n liftBind.onPointerUp?.();\n }\n },\n };\n }, [bind, liftBind, enableLift]);\n\n return (\n <div\n ref={ref}\n className={className}\n {...combinedBind}\n style={combinedStyle}\n >\n {children}\n </div>\n );\n }\n);\n\nDraggable.displayName = 'Draggable';\n","import React, { forwardRef, useMemo, useState, useCallback } from 'react';\nimport { useLift } from '../hooks/useLift';\nimport { useSpring1D } from '../hooks/useSpring';\nimport { usePhysicsContext } from './PhysicsProvider';\nimport { SpringConfig } from '../core/Spring';\n\nexport interface CardProps {\n children: React.ReactNode;\n /** Enable hover lift effect (default: true) */\n lift?: boolean;\n /** Enable press feedback (default: true) */\n pressable?: boolean;\n /** Scale on lift (overrides context) */\n liftScale?: number;\n /** Scale reduction on press (default: 0.98) */\n pressScale?: number;\n /** Enable glassmorphism background */\n glass?: boolean;\n /** Glass blur intensity (default: 20) */\n glassBlur?: number;\n /** Spring configuration override */\n springConfig?: Partial<SpringConfig>;\n /** Additional class name */\n className?: string;\n /** Additional inline styles */\n style?: React.CSSProperties;\n /** Click handler */\n onClick?: (e: React.MouseEvent) => void;\n /** Callback when hover state changes */\n onHover?: (isHovered: boolean) => void;\n /** Callback when press state changes */\n onPress?: (isPressed: boolean) => void;\n}\n\n/**\n * Premium card component with physics-based interactions\n * Features lift on hover, press feedback, and optional glassmorphism\n */\nexport const Card = forwardRef<HTMLDivElement, CardProps>(\n (\n {\n children,\n lift: enableLift = true,\n pressable = true,\n liftScale,\n pressScale = 0.98,\n glass = false,\n glassBlur = 20,\n springConfig,\n className,\n style: customStyle,\n onClick,\n onHover,\n onPress,\n },\n ref\n ) => {\n const physicsContext = usePhysicsContext();\n const [isPressed, setIsPressed] = useState(false);\n\n const resolvedLiftScale = liftScale ?? physicsContext.lift.scale;\n\n // Lift effect for hover\n const { style: liftStyle, bind: liftBind, isLifted } = useLift({\n trigger: 'hover',\n scale: resolvedLiftScale,\n shadowIntensity: physicsContext.lift.shadowIntensity,\n springConfig: { ...physicsContext.spring, ...springConfig },\n onLift: onHover,\n });\n\n // Press scale animation\n const { value: pressScaleValue } = useSpring1D({\n to: isPressed ? pressScale : 1,\n config: {\n tension: 400,\n friction: 25,\n ...springConfig,\n },\n });\n\n const handlePointerDown = useCallback(() => {\n if (pressable) {\n setIsPressed(true);\n onPress?.(true);\n }\n }, [pressable, onPress]);\n\n const handlePointerUp = useCallback(() => {\n if (pressable) {\n setIsPressed(false);\n onPress?.(false);\n }\n }, [pressable, onPress]);\n\n const handlePointerLeave = useCallback(() => {\n if (isPressed) {\n setIsPressed(false);\n onPress?.(false);\n }\n }, [isPressed, onPress]);\n\n // Glassmorphism styles\n const glassStyles: React.CSSProperties = glass\n ? {\n background: 'rgba(255, 255, 255, 0.1)',\n backdropFilter: `blur(${glassBlur}px)`,\n WebkitBackdropFilter: `blur(${glassBlur}px)`,\n border: '1px solid rgba(255, 255, 255, 0.18)',\n }\n : {};\n\n // Combine transforms\n const combinedStyle = useMemo(() => {\n const liftTransform = enableLift ? liftStyle.transform || '' : '';\n const pressTransform = pressable ? `scale(${pressScaleValue})` : '';\n const transform = `${liftTransform} ${pressTransform}`.trim() || undefined;\n\n return {\n ...glassStyles,\n ...liftStyle,\n ...customStyle,\n transform,\n transformOrigin: 'center center',\n cursor: onClick ? 'pointer' : 'default',\n willChange: isLifted || isPressed ? 'transform, box-shadow' : 'auto',\n };\n }, [\n liftStyle,\n pressScaleValue,\n enableLift,\n pressable,\n glassStyles,\n customStyle,\n onClick,\n isLifted,\n isPressed,\n ]);\n\n return (\n <div\n ref={ref}\n className={className}\n style={combinedStyle}\n onClick={onClick}\n onPointerEnter={liftBind.onPointerEnter}\n onPointerLeave={() => {\n liftBind.onPointerLeave?.();\n handlePointerLeave();\n }}\n onPointerDown={handlePointerDown}\n onPointerUp={handlePointerUp}\n >\n {children}\n </div>\n );\n }\n);\n\nCard.displayName = 'Card';\n\n/**\n * Default card styles (optional, can be applied via className)\n */\nexport const cardBaseStyles: React.CSSProperties = {\n padding: '24px',\n borderRadius: '16px',\n background: 'white',\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.08)',\n};\n","import React, { useRef, useCallback, useEffect } from 'react';\nimport { Spring1D } from '../../core/Spring';\nimport { VelocityTracker1D } from '../../core/Velocity';\nimport { Momentum1D } from '../../core/Friction';\nimport { PhysicsEngine, generatePhysicsId } from '../../core/PhysicsEngine';\nimport { SliderConfig } from './types';\n\nexport interface PhysicsSliderProps {\n label: string;\n description?: string;\n value: number;\n min: number;\n max: number;\n step: number;\n config: SliderConfig;\n onChange: (value: number) => void;\n decimals?: number;\n forceDrag?: boolean;\n className?: string;\n}\n\nexport function PhysicsSlider({\n label,\n description,\n value,\n min,\n max,\n step,\n config,\n onChange,\n decimals = 3,\n forceDrag = false,\n className = '',\n}: PhysicsSliderProps) {\n const trackRef = useRef<HTMLDivElement>(null);\n const thumbRef = useRef<HTMLDivElement>(null);\n\n const state = useRef({\n isDragging: false,\n displayPercent: ((value - min) / (max - min)) * 100,\n thumbScale: 1,\n verticalOffset: 0,\n stretchX: 1,\n stretchY: 1,\n stretchOriginPercent: 50,\n targetOriginPercent: 50,\n shadowY: 2,\n shadowBlur: 6,\n shadowOpacity: 0.12,\n lastPercent: ((value - min) / (max - min)) * 100,\n currentVelocity: 0,\n pointerStart: null as { x: number; y: number } | null,\n });\n\n const [, forceRender] = React.useState(0);\n const rerender = useCallback(() => forceRender(n => n + 1), []);\n\n const springRef = useRef<Spring1D | null>(null);\n const momentumRef = useRef<Momentum1D | null>(null);\n const scaleSpringRef = useRef<Spring1D | null>(null);\n const verticalSpringRef = useRef<Spring1D | null>(null);\n const stretchXSpringRef = useRef<Spring1D | null>(null);\n const stretchYSpringRef = useRef<Spring1D | null>(null);\n const stretchOriginSpringRef = useRef<Spring1D | null>(null);\n const shadowSpringRef = useRef<Spring1D | null>(null);\n const velocityTracker = useRef(new VelocityTracker1D());\n\n const physicsIdRef = useRef(generatePhysicsId('slider'));\n const scaleIdRef = useRef(generatePhysicsId('scale'));\n const verticalIdRef = useRef(generatePhysicsId('sliderVertical'));\n const stretchXIdRef = useRef(generatePhysicsId('stretchX'));\n const stretchYIdRef = useRef(generatePhysicsId('stretchY'));\n const stretchOriginIdRef = useRef(generatePhysicsId('stretchOrigin'));\n const shadowIdRef = useRef(generatePhysicsId('shadow'));\n const dragDecayIdRef = useRef(generatePhysicsId('dragDecay'));\n\n useEffect(() => {\n if (!state.current.isDragging && !forceDrag) {\n const targetPercent = ((value - min) / (max - min)) * 100;\n animateToPercent(targetPercent);\n }\n }, [value, min, max]);\n\n const lastValueRef = useRef(value);\n\n useEffect(() => {\n if (!forceDrag) {\n lastValueRef.current = value;\n return;\n }\n\n const s = state.current;\n const targetPercent = ((value - min) / (max - min)) * 100;\n const lastPercent = ((lastValueRef.current - min) / (max - min)) * 100;\n const velocity = targetPercent - lastPercent;\n lastValueRef.current = value;\n\n s.thumbScale = config.liftScale;\n const absVelocity = Math.abs(velocity);\n const velStretch = Math.min(absVelocity * config.velocityStretch * 15, 1.2);\n s.stretchX = 1 + velStretch;\n s.stretchY = 1 - (velStretch * 0.4);\n\n if (Math.abs(velocity) > 0.1) {\n s.stretchOriginPercent = velocity > 0 ? 100 : 0;\n }\n\n s.shadowY = 2 + absVelocity * 0.4;\n s.shadowBlur = 6 + absVelocity * 0.6;\n s.shadowOpacity = 0.12 + absVelocity * 0.015;\n s.displayPercent = targetPercent;\n s.isDragging = true;\n\n rerender();\n }, [forceDrag, value, min, max, config.liftScale, config.velocityStretch, rerender]);\n\n const animateToPercent = useCallback((targetPercent: number) => {\n const s = state.current;\n PhysicsEngine.unregister(physicsIdRef.current);\n\n springRef.current = new Spring1D(s.displayPercent, {\n tension: config.springTension * 400,\n friction: 26,\n mass: 1,\n precision: 0.01,\n });\n springRef.current.setTarget(targetPercent);\n\n PhysicsEngine.register(physicsIdRef.current, (dt) => {\n if (!springRef.current) return;\n const result = springRef.current.step(dt);\n s.displayPercent = result.value;\n rerender();\n\n if (result.isSettled) {\n PhysicsEngine.unregister(physicsIdRef.current);\n }\n });\n }, [config.springTension, rerender]);\n\n const percentToValue = useCallback((percent: number) => {\n const raw = min + (percent / 100) * (max - min);\n return Math.round(raw / step) * step;\n }, [min, max, step]);\n\n const animateScaleTo = useCallback((targetScale: number) => {\n const s = state.current;\n PhysicsEngine.unregister(scaleIdRef.current);\n\n scaleSpringRef.current = new Spring1D(s.thumbScale, {\n tension: 400,\n friction: 20,\n mass: 0.6,\n precision: 0.001,\n });\n scaleSpringRef.current.setTarget(targetScale);\n\n PhysicsEngine.register(scaleIdRef.current, (dt) => {\n if (!scaleSpringRef.current) return;\n const result = scaleSpringRef.current.step(dt);\n s.thumbScale = result.value;\n rerender();\n\n if (result.isSettled) {\n PhysicsEngine.unregister(scaleIdRef.current);\n }\n });\n }, [rerender]);\n\n const getMomentumDecay = useCallback((flickMs: number) => {\n const clamped = Math.max(100, Math.min(2000, flickMs));\n const seconds = clamped / 1000;\n const targetRatio = 0.05;\n return Math.exp(Math.log(targetRatio) / (seconds * 60));\n }, []);\n\n const animateStretchRelax = useCallback(() => {\n const s = state.current;\n\n PhysicsEngine.unregister(stretchXIdRef.current);\n stretchXSpringRef.current = new Spring1D(s.stretchX, {\n tension: 300,\n friction: 14,\n mass: 0.5,\n precision: 0.001,\n });\n stretchXSpringRef.current.setTarget(1);\n\n PhysicsEngine.register(stretchXIdRef.current, (dt) => {\n if (!stretchXSpringRef.current) return;\n const result = stretchXSpringRef.current.step(dt);\n s.stretchX = result.value;\n rerender();\n\n if (result.isSettled) {\n s.stretchX = 1;\n PhysicsEngine.unregister(stretchXIdRef.current);\n }\n });\n\n PhysicsEngine.unregister(stretchYIdRef.current);\n stretchYSpringRef.current = new Spring1D(s.stretchY, {\n tension: 300,\n friction: 14,\n mass: 0.5,\n precision: 0.001,\n });\n stretchYSpringRef.current.setTarget(1);\n\n PhysicsEngine.register(stretchYIdRef.current, (dt) => {\n if (!stretchYSpringRef.current) return;\n const result = stretchYSpringRef.current.step(dt);\n s.stretchY = result.value;\n rerender();\n\n if (result.isSettled) {\n s.stretchY = 1;\n PhysicsEngine.unregister(stretchYIdRef.current);\n }\n });\n\n PhysicsEngine.unregister(shadowIdRef.current);\n shadowSpringRef.current = new Spring1D(s.shadowY, {\n tension: 250,\n friction: 20,\n mass: 0.5,\n precision: 0.01,\n });\n shadowSpringRef.current.setTarget(2);\n\n PhysicsEngine.register(shadowIdRef.current, (dt) => {\n if (!shadowSpringRef.current) return;\n const result = shadowSpringRef.current.step(dt);\n const t = (result.value - 2) / 10;\n s.shadowY = result.value;\n s.shadowBlur = 6 + t * 4;\n s.shadowOpacity = 0.12 + t * 0.03;\n rerender();\n\n if (result.isSettled) {\n s.shadowY = 2;\n s.shadowBlur = 6;\n s.shadowOpacity = 0.12;\n PhysicsEngine.unregister(shadowIdRef.current);\n }\n });\n\n PhysicsEngine.unregister(stretchOriginIdRef.current);\n stretchOriginSpringRef.current = new Spring1D(s.stretchOriginPercent, {\n tension: 300,\n friction: 18,\n mass: 0.5,\n precision: 0.1,\n });\n stretchOriginSpringRef.current.setTarget(50);\n\n PhysicsEngine.register(stretchOriginIdRef.current, (dt) => {\n if (!stretchOriginSpringRef.current) return;\n const result = stretchOriginSpringRef.current.step(dt);\n s.stretchOriginPercent = result.value;\n s.targetOriginPercent = 50;\n rerender();\n\n if (result.isSettled) {\n s.stretchOriginPercent = 50;\n s.targetOriginPercent = 50;\n PhysicsEngine.unregister(stretchOriginIdRef.current);\n }\n });\n }, [rerender]);\n\n const handlePointerDown = useCallback((e: React.PointerEvent) => {\n if (!trackRef.current) return;\n const s = state.current;\n\n e.preventDefault();\n (e.target as HTMLElement).setPointerCapture(e.pointerId);\n\n s.pointerStart = { x: e.clientX, y: e.clientY };\n s.isDragging = true;\n PhysicsEngine.unregister(physicsIdRef.current);\n PhysicsEngine.unregister(verticalIdRef.current);\n PhysicsEngine.unregister(stretchXIdRef.current);\n PhysicsEngine.unregister(stretchYIdRef.current);\n PhysicsEngine.unregister(stretchOriginIdRef.current);\n PhysicsEngine.unregister(shadowIdRef.current);\n velocityTracker.current.reset();\n\n animateScaleTo(config.liftScale);\n\n const rect = trackRef.current.getBoundingClientRect();\n const x = Math.max(0, Math.min(rect.width, e.clientX - rect.left));\n const percent = (x / rect.width) * 100;\n\n s.displayPercent = percent;\n s.lastPercent = percent;\n velocityTracker.current.addSample(percent);\n onChange(percentToValue(percent));\n\n PhysicsEngine.register(dragDecayIdRef.current, () => {\n if (!s.isDragging) return;\n\n const decayLerp = 0.08;\n const threshold = 0.001;\n\n if (Math.abs(s.stretchX - 1) > threshold) {\n s.stretchX += (1 - s.stretchX) * decayLerp;\n }\n if (Math.abs(s.stretchY - 1) > threshold) {\n s.stretchY += (1 - s.stretchY) * decayLerp;\n }\n if (Math.abs(s.stretchOriginPercent - 50) > threshold) {\n s.stretchOriginPercent += (50 - s.stretchOriginPercent) * decayLerp;\n }\n s.shadowY += (2 - s.shadowY) * decayLerp;\n s.shadowBlur += (6 - s.shadowBlur) * decayLerp;\n s.shadowOpacity += (0.12 - s.shadowOpacity) * decayLerp;\n\n rerender();\n });\n\n rerender();\n }, [onChange, percentToValue, animateScaleTo, config.liftScale, rerender]);\n\n const handlePointerMove = useCallback((e: React.PointerEvent) => {\n const s = state.current;\n if (!s.isDragging || !trackRef.current || !s.pointerStart) return;\n\n const rect = trackRef.current.getBoundingClientRect();\n const rawX = e.clientX - rect.left;\n const rawPercent = (rawX / rect.width) * 100;\n\n let percent = rawPercent;\n let edgeStretchH = 0;\n\n if (rawPercent < 0) {\n edgeStretchH = -rawPercent / 100;\n percent = rawPercent * 0.15;\n s.targetOriginPercent = 100;\n } else if (rawPercent > 100) {\n edgeStretchH = (rawPercent - 100) / 100;\n percent = 100 + (rawPercent - 100) * 0.15;\n s.targetOriginPercent = 0;\n }\n\n const velocity = percent - s.lastPercent;\n s.lastPercent = percent;\n s.currentVelocity = velocity;\n\n if (Math.abs(velocity) > 0.3 && edgeStretchH === 0) {\n s.targetOriginPercent = velocity > 0 ? 100 : 0;\n }\n\n const originLerpSpeed = 0.15;\n s.stretchOriginPercent += (s.targetOriginPercent - s.stretchOriginPercent) * originLerpSpeed;\n\n const rawVerticalOffset = e.clientY - s.pointerStart.y;\n const rubberBandedOffset = rawVerticalOffset * 0.06;\n s.verticalOffset = Math.max(-5, Math.min(5, rubberBandedOffset));\n\n const absVelocity = Math.abs(velocity);\n const velStretch = Math.min(absVelocity * config.velocityStretch * 15, 1.2);\n\n const edgeStretchFactorH = Math.min(Math.abs(edgeStretchH) * 0.6, 0.12);\n const edgeStretchFactorV = Math.abs(s.verticalOffset) / 5 * 0.06;\n\n const targetStretchX = 1 + velStretch + edgeStretchFactorH;\n const targetStretchY = 1 - (velStretch * 0.4) + edgeStretchFactorV;\n\n const baseLerp = 0.35;\n const decayLerp = 0.15;\n const velocityThreshold = 0.5;\n\n if (absVelocity < velocityThreshold) {\n const decayFactor = 1 - (absVelocity / velocityThreshold);\n s.stretchX += (1 - s.stretchX) * decayLerp * decayFactor;\n s.stretchY += (1 - s.stretchY) * decayLerp * decayFactor;\n s.stretchOriginPercent += (50 - s.stretchOriginPercent) * decayLerp * decayFactor;\n }\n\n s.stretchX += (targetStretchX - s.stretchX) * baseLerp;\n s.stretchY += (targetStretchY - s.stretchY) * baseLerp;\n\n const targetShadowY = 2 + absVelocity * 0.4;\n const targetShadowBlur = 6 + absVelocity * 0.6;\n const targetShadowOpacity = 0.12 + absVelocity * 0.015;\n\n const shadowLerp = 0.3;\n s.shadowY += (targetShadowY - s.shadowY) * shadowLerp;\n s.shadowBlur += (targetShadowBlur - s.shadowBlur) * shadowLerp;\n s.shadowOpacity += (targetShadowOpacity - s.shadowOpacity) * shadowLerp;\n\n s.displayPercent = Math.max(0, Math.min(100, percent));\n velocityTracker.current.addSample(percent);\n onChange(percentToValue(Math.max(0, Math.min(100, percent))));\n rerender();\n }, [onChange, percentToValue, config.velocityStretch, rerender]);\n\n const handlePointerUp = useCallback(() => {\n const s = state.current;\n if (!s.isDragging) return;\n\n s.isDragging = false;\n s.pointerStart = null;\n\n PhysicsEngine.unregister(dragDecayIdRef.current);\n animateScaleTo(1);\n animateStretchRelax();\n\n if (s.verticalOffset !== 0) {\n PhysicsEngine.unregister(verticalIdRef.current);\n verticalSpringRef.current = new Spring1D(s.verticalOffset, {\n tension: 400,\n friction: 18,\n mass: 0.5,\n precision: 0.1,\n });\n verticalSpringRef.current.setTarget(0);\n\n PhysicsEngine.register(verticalIdRef.current, (dt) => {\n if (!verticalSpringRef.current) return;\n const result = verticalSpringRef.current.step(dt);\n s.verticalOffset = result.value;\n rerender();\n\n if (result.isSettled) {\n s.verticalOffset = 0;\n PhysicsEngine.unregister(verticalIdRef.current);\n }\n });\n }\n\n const velocity = velocityTracker.current.getVelocity();\n velocityTracker.current.reset();\n\n if (Math.abs(velocity) > 30) {\n const decay = getMomentumDecay(config.flickMomentum);\n momentumRef.current = new Momentum1D(s.displayPercent, {\n decay,\n stopThreshold: 0.3,\n maxVelocity: config.maxVelocity * 100,\n });\n momentumRef.current.start(s.displayPercent, velocity * 0.4);\n\n PhysicsEngine.register(physicsIdRef.current, (dt) => {\n if (!momentumRef.current) return;\n const result = momentumRef.current.step(dt);\n\n const momentumVel = Math.abs(result.velocity || 0) / 100;\n if (momentumVel > 0.1) {\n const stretch = Math.min(momentumVel * config.velocityStretch * 5, 0.8);\n s.stretchX = 1 + stretch;\n s.stretchY = 1 - stretch * 0.5;\n s.targetOriginPercent = (result.velocity || 0) > 0 ? 100 : 0;\n s.stretchOriginPercent += (s.targetOriginPercent - s.stretchOriginPercent) * 0.1;\n }\n\n let newPercent = Math.max(0, Math.min(100, result.position));\n\n if (result.position < 0 || result.position > 100) {\n momentumRef.current.stop();\n const targetPercent = result.position < 0 ? 0 : 100;\n\n animateStretchRelax();\n\n springRef.current = new Spring1D(newPercent, {\n tension: config.springTension * 400,\n friction: 26,\n });\n springRef.current.setTarget(targetPercent);\n\n PhysicsEngine.register(physicsIdRef.current, (dt2) => {\n if (!springRef.current) return;\n const springResult = springRef.current.step(dt2);\n s.displayPercent = springResult.value;\n onChange(percentToValue(springResult.value));\n rerender();\n\n if (springResult.isSettled) {\n PhysicsEngine.unregister(physicsIdRef.current);\n }\n });\n return;\n }\n\n s.displayPercent = newPercent;\n onChange(percentToValue(newPercent));\n rerender();\n\n if (!result.isActive) {\n animateStretchRelax();\n PhysicsEngine.unregister(physicsIdRef.current);\n }\n });\n }\n\n rerender();\n }, [config, onChange, percentToValue, animateScaleTo, animateStretchRelax, getMomentumDecay, rerender]);\n\n const handleTrackClick = useCallback((e: React.MouseEvent) => {\n const s = state.current;\n if (!trackRef.current || s.isDragging) return;\n\n const rect = trackRef.current.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const percent = Math.max(0, Math.min(100, (x / rect.width) * 100));\n\n onChange(percentToValue(percent));\n animateToPercent(percent);\n }, [onChange, percentToValue, animateToPercent]);\n\n useEffect(() => {\n return () => {\n PhysicsEngine.unregister(physicsIdRef.current);\n PhysicsEngine.unregister(scaleIdRef.current);\n PhysicsEngine.unregister(verticalIdRef.current);\n PhysicsEngine.unregister(stretchXIdRef.current);\n PhysicsEngine.unregister(stretchYIdRef.current);\n PhysicsEngine.unregister(stretchOriginIdRef.current);\n PhysicsEngine.unregister(shadowIdRef.current);\n PhysicsEngine.unregister(dragDecayIdRef.current);\n };\n }, []);\n\n const s = state.current;\n\n return (\n <div className={`tekiyo-slider-container ${className}`}>\n <div className=\"tekiyo-slider-header\">\n <div className=\"tekiyo-slider-label-group\">\n <span className=\"tekiyo-slider-label\">{label}</span>\n {description && <span className=\"tekiyo-slider-description\">{description}</span>}\n </div>\n <span className=\"tekiyo-slider-value\">{value.toFixed(decimals)}</span>\n </div>\n <div\n className=\"tekiyo-slider-track\"\n ref={trackRef}\n onClick={handleTrackClick}\n >\n <div\n className=\"tekiyo-slider-fill\"\n style={{ width: `${s.displayPercent}%` }}\n />\n <div\n ref={thumbRef}\n className={`tekiyo-slider-thumb ${s.isDragging ? 'active' : ''}`}\n style={{\n left: `${s.displayPercent}%`,\n transform: `translate(-50%, calc(-50% + ${s.verticalOffset}px)) scale(${s.thumbScale}) scaleX(${s.stretchX}) scaleY(${s.stretchY})`,\n transformOrigin: `${s.stretchOriginPercent}% center`,\n boxShadow: `0 ${s.shadowY}px ${s.shadowBlur}px rgba(0, 0, 0, ${s.shadowOpacity})`,\n }}\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n onPointerCancel={handlePointerUp}\n />\n </div>\n </div>\n );\n}\n\nexport default PhysicsSlider;\n","import React, { useRef, useCallback, useEffect } from 'react';\nimport { Spring1D } from '../../core/Spring';\nimport { PhysicsEngine, generatePhysicsId } from '../../core/PhysicsEngine';\nimport { SliderConfig } from './types';\n\nexport interface PhysicsRangeSliderProps {\n label: string;\n description?: string;\n minValue: number;\n maxValue: number;\n min: number;\n max: number;\n step: number;\n config: SliderConfig;\n onChange: (min: number, max: number) => void;\n formatValue?: (value: number) => string;\n className?: string;\n}\n\ninterface ThumbState {\n displayPercent: number;\n thumbScale: number;\n verticalOffset: number;\n stretchX: number;\n stretchY: number;\n stretchOriginPercent: number;\n targetOriginPercent: number;\n shadowY: number;\n shadowBlur: number;\n shadowOpacity: number;\n lastPercent: number;\n isDragging: boolean;\n}\n\nfunction createThumbState(percent: number): ThumbState {\n return {\n displayPercent: percent,\n thumbScale: 1,\n verticalOffset: 0,\n stretchX: 1,\n stretchY: 1,\n stretchOriginPercent: 50,\n targetOriginPercent: 50,\n shadowY: 2,\n shadowBlur: 6,\n shadowOpacity: 0.12,\n lastPercent: percent,\n isDragging: false,\n };\n}\n\nexport function PhysicsRangeSlider({\n label,\n description,\n minValue,\n maxValue,\n min,\n max,\n step,\n config,\n onChange,\n formatValue = (v) => v.toFixed(0),\n className = '',\n}: PhysicsRangeSliderProps) {\n const trackRef = useRef<HTMLDivElement>(null);\n\n const minPercent = ((minValue - min) / (max - min)) * 100;\n const maxPercent = ((maxValue - min) / (max - min)) * 100;\n\n const minThumb = useRef<ThumbState>(createThumbState(minPercent));\n const maxThumb = useRef<ThumbState>(createThumbState(maxPercent));\n const activeThumb = useRef<'min' | 'max' | null>(null);\n const pointerStart = useRef<{ x: number; y: number } | null>(null);\n\n const [, forceRender] = React.useState(0);\n const rerender = useCallback(() => forceRender((n) => n + 1), []);\n\n const minScaleId = useRef(generatePhysicsId('rangeMinScale'));\n const maxScaleId = useRef(generatePhysicsId('rangeMaxScale'));\n const minDecayId = useRef(generatePhysicsId('rangeMinDecay'));\n const maxDecayId = useRef(generatePhysicsId('rangeMaxDecay'));\n const minRelaxId = useRef(generatePhysicsId('rangeMinRelax'));\n const maxRelaxId = useRef(generatePhysicsId('rangeMaxRelax'));\n\n const minScaleSpring = useRef<Spring1D | null>(null);\n const maxScaleSpring = useRef<Spring1D | null>(null);\n\n useEffect(() => {\n if (!minThumb.current.isDragging) {\n minThumb.current.displayPercent = ((minValue - min) / (max - min)) * 100;\n }\n if (!maxThumb.current.isDragging) {\n maxThumb.current.displayPercent = ((maxValue - min) / (max - min)) * 100;\n }\n rerender();\n }, [minValue, maxValue, min, max, rerender]);\n\n const percentToValue = useCallback(\n (percent: number) => {\n const raw = min + (percent / 100) * (max - min);\n return Math.round(raw / step) * step;\n },\n [min, max, step]\n );\n\n const animateScaleTo = useCallback(\n (thumb: 'min' | 'max', targetScale: number) => {\n const state = thumb === 'min' ? minThumb.current : maxThumb.current;\n const springRef = thumb === 'min' ? minScaleSpring : maxScaleSpring;\n const scaleId = thumb === 'min' ? minScaleId : maxScaleId;\n\n PhysicsEngine.unregister(scaleId.current);\n\n springRef.current = new Spring1D(state.thumbScale, {\n tension: 400,\n friction: 20,\n mass: 0.6,\n precision: 0.001,\n });\n springRef.current.setTarget(targetScale);\n\n PhysicsEngine.register(scaleId.current, (dt) => {\n if (!springRef.current) return;\n const result = springRef.current.step(dt);\n state.thumbScale = result.value;\n rerender();\n\n if (result.isSettled) {\n PhysicsEngine.unregister(scaleId.current);\n }\n });\n },\n [rerender]\n );\n\n const animateStretchRelax = useCallback(\n (thumb: 'min' | 'max') => {\n const state = thumb === 'min' ? minThumb.current : maxThumb.current;\n const relaxId = thumb === 'min' ? minRelaxId : maxRelaxId;\n\n PhysicsEngine.unregister(relaxId.current);\n\n const spring = new Spring1D(state.stretchX, {\n tension: 300,\n friction: 14,\n mass: 0.5,\n precision: 0.001,\n });\n spring.setTarget(1);\n\n PhysicsEngine.register(relaxId.current, (dt) => {\n const result = spring.step(dt);\n state.stretchX = result.value;\n state.stretchY = 1 - (result.value - 1) * 0.4;\n state.stretchOriginPercent += (50 - state.stretchOriginPercent) * 0.15;\n state.shadowY += (2 - state.shadowY) * 0.15;\n state.shadowBlur += (6 - state.shadowBlur) * 0.15;\n state.shadowOpacity += (0.12 - state.shadowOpacity) * 0.15;\n rerender();\n\n if (result.isSettled) {\n state.stretchX = 1;\n state.stretchY = 1;\n state.stretchOriginPercent = 50;\n PhysicsEngine.unregister(relaxId.current);\n }\n });\n },\n [rerender]\n );\n\n const handlePointerDown = useCallback(\n (e: React.PointerEvent, thumb: 'min' | 'max') => {\n if (!trackRef.current) return;\n const state = thumb === 'min' ? minThumb.current : maxThumb.current;\n const decayId = thumb === 'min' ? minDecayId : maxDecayId;\n\n e.preventDefault();\n e.stopPropagation();\n (e.target as HTMLElement).setPointerCapture(e.pointerId);\n\n pointerStart.current = { x: e.clientX, y: e.clientY };\n activeThumb.current = thumb;\n state.isDragging = true;\n\n animateScaleTo(thumb, config.liftScale);\n\n PhysicsEngine.register(decayId.current, () => {\n if (!state.isDragging) return;\n\n const decayLerp = 0.08;\n const threshold = 0.001;\n\n if (Math.abs(state.stretchX - 1) > threshold) {\n state.stretchX += (1 - state.stretchX) * decayLerp;\n }\n if (Math.abs(state.stretchY - 1) > threshold) {\n state.stretchY += (1 - state.stretchY) * decayLerp;\n }\n if (Math.abs(state.stretchOriginPercent - 50) > threshold) {\n state.stretchOriginPercent += (50 - state.stretchOriginPercent) * decayLerp;\n }\n state.shadowY += (2 - state.shadowY) * decayLerp;\n state.shadowBlur += (6 - state.shadowBlur) * decayLerp;\n state.shadowOpacity += (0.12 - state.shadowOpacity) * decayLerp;\n\n rerender();\n });\n\n rerender();\n },\n [config.liftScale, animateScaleTo, rerender]\n );\n\n const handlePointerMove = useCallback(\n (e: React.PointerEvent) => {\n if (!activeThumb.current || !trackRef.current || !pointerStart.current) return;\n\n const thumb = activeThumb.current;\n const state = thumb === 'min' ? minThumb.current : maxThumb.current;\n\n const rect = trackRef.current.getBoundingClientRect();\n const rawX = e.clientX - rect.left;\n let percent = (rawX / rect.width) * 100;\n\n if (thumb === 'min') {\n percent = Math.max(0, Math.min(maxThumb.current.displayPercent - 5, percent));\n } else {\n percent = Math.min(100, Math.max(minThumb.current.displayPercent + 5, percent));\n }\n\n const velocity = percent - state.lastPercent;\n state.lastPercent = percent;\n\n if (Math.abs(velocity) > 0.3) {\n state.targetOriginPercent = velocity > 0 ? 100 : 0;\n }\n state.stretchOriginPercent += (state.targetOriginPercent - state.stretchOriginPercent) * 0.15;\n\n const absVelocity = Math.abs(velocity);\n const velStretch = Math.min(absVelocity * config.velocityStretch * 15, 1.2);\n\n const targetStretchX = 1 + velStretch;\n const targetStretchY = 1 - velStretch * 0.4;\n\n const baseLerp = 0.35;\n const decayLerp = 0.15;\n const velocityThreshold = 0.5;\n\n if (absVelocity < velocityThreshold) {\n const decayFactor = 1 - absVelocity / velocityThreshold;\n state.stretchX += (1 - state.stretchX) * decayLerp * decayFactor;\n state.stretchY += (1 - state.stretchY) * decayLerp * decayFactor;\n state.stretchOriginPercent += (50 - state.stretchOriginPercent) * decayLerp * decayFactor;\n }\n\n state.stretchX += (targetStretchX - state.stretchX) * baseLerp;\n state.stretchY += (targetStretchY - state.stretchY) * baseLerp;\n\n const targetShadowY = 2 + absVelocity * 0.4;\n const targetShadowBlur = 6 + absVelocity * 0.6;\n const targetShadowOpacity = 0.12 + absVelocity * 0.015;\n\n state.shadowY += (targetShadowY - state.shadowY) * 0.3;\n state.shadowBlur += (targetShadowBlur - state.shadowBlur) * 0.3;\n state.shadowOpacity += (targetShadowOpacity - state.shadowOpacity) * 0.3;\n\n state.displayPercent = percent;\n\n const newMin = thumb === 'min' ? percentToValue(percent) : minValue;\n const newMax = thumb === 'max' ? percentToValue(percent) : maxValue;\n onChange(newMin, newMax);\n\n rerender();\n },\n [config.velocityStretch, minValue, maxValue, percentToValue, onChange, rerender]\n );\n\n const handlePointerUp = useCallback(() => {\n if (!activeThumb.current) return;\n\n const thumb = activeThumb.current;\n const state = thumb === 'min' ? minThumb.current : maxThumb.current;\n const decayId = thumb === 'min' ? minDecayId : maxDecayId;\n\n state.isDragging = false;\n pointerStart.current = null;\n activeThumb.current = null;\n\n PhysicsEngine.unregister(decayId.current);\n animateScaleTo(thumb, 1);\n animateStretchRelax(thumb);\n\n rerender();\n }, [animateScaleTo, animateStretchRelax, rerender]);\n\n useEffect(() => {\n return () => {\n PhysicsEngine.unregister(minScaleId.current);\n PhysicsEngine.unregister(maxScaleId.current);\n PhysicsEngine.unregister(minDecayId.current);\n PhysicsEngine.unregister(maxDecayId.current);\n PhysicsEngine.unregister(minRelaxId.current);\n PhysicsEngine.unregister(maxRelaxId.current);\n };\n }, []);\n\n const minS = minThumb.current;\n const maxS = maxThumb.current;\n\n return (\n <div className={`tekiyo-range-slider ${className}`}>\n <div className=\"tekiyo-slider-header\">\n <div className=\"tekiyo-slider-label-group\">\n <span className=\"tekiyo-slider-label\">{label}</span>\n {description && <span className=\"tekiyo-slider-description\">{description}</span>}\n </div>\n <span className=\"tekiyo-slider-value\">\n {formatValue(minValue)} - {formatValue(maxValue)}\n </span>\n </div>\n <div\n className=\"tekiyo-slider-track\"\n ref={trackRef}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n onPointerCancel={handlePointerUp}\n >\n <div className=\"tekiyo-slider-track-bg\" />\n <div\n className=\"tekiyo-range-fill\"\n style={{\n left: `${minS.displayPercent}%`,\n width: `${maxS.displayPercent - minS.displayPercent}%`,\n }}\n />\n <div\n className={`tekiyo-slider-thumb tekiyo-range-thumb-min ${minS.isDragging ? 'active' : ''}`}\n style={{\n left: `${minS.displayPercent}%`,\n transform: `translate(-50%, calc(-50% + ${minS.verticalOffset}px)) scale(${minS.thumbScale}) scaleX(${minS.stretchX}) scaleY(${minS.stretchY})`,\n transformOrigin: `${minS.stretchOriginPercent}% center`,\n boxShadow: `0 ${minS.shadowY}px ${minS.shadowBlur}px rgba(0, 0, 0, ${minS.shadowOpacity})`,\n }}\n onPointerDown={(e) => handlePointerDown(e, 'min')}\n />\n <div\n className={`tekiyo-slider-thumb tekiyo-range-thumb-max ${maxS.isDragging ? 'active' : ''}`}\n style={{\n left: `${maxS.displayPercent}%`,\n transform: `translate(-50%, calc(-50% + ${maxS.verticalOffset}px)) scale(${maxS.thumbScale}) scaleX(${maxS.stretchX}) scaleY(${maxS.stretchY})`,\n transformOrigin: `${maxS.stretchOriginPercent}% center`,\n boxShadow: `0 ${maxS.shadowY}px ${maxS.shadowBlur}px rgba(0, 0, 0, ${maxS.shadowOpacity})`,\n }}\n onPointerDown={(e) => handlePointerDown(e, 'max')}\n />\n </div>\n </div>\n );\n}\n\nexport default PhysicsRangeSlider;\n","import React, { useRef, useCallback, useEffect } from 'react';\nimport { Spring1D } from '../../core/Spring';\nimport { PhysicsEngine, generatePhysicsId } from '../../core/PhysicsEngine';\nimport { SliderConfig } from './types';\n\nexport interface StepOption {\n label: string;\n value: string | number;\n color?: string;\n}\n\nexport interface PhysicsStepSliderProps {\n label: string;\n description?: string;\n options: StepOption[];\n value: string | number;\n config: SliderConfig;\n onChange: (value: string | number) => void;\n className?: string;\n}\n\nexport function PhysicsStepSlider({\n label,\n description,\n options,\n value,\n config,\n onChange,\n className = '',\n}: PhysicsStepSliderProps) {\n const trackRef = useRef<HTMLDivElement>(null);\n\n const currentIndex = options.findIndex((opt) => opt.value === value);\n const stepPercent = 100 / (options.length - 1);\n const targetPercent = currentIndex * stepPercent;\n\n const state = useRef({\n isDragging: false,\n displayPercent: targetPercent,\n thumbScale: 1,\n verticalOffset: 0,\n stretchX: 1,\n stretchY: 1,\n stretchOriginPercent: 50,\n targetOriginPercent: 50,\n shadowY: 2,\n shadowBlur: 6,\n shadowOpacity: 0.12,\n lastPercent: targetPercent,\n pointerStart: null as { x: number; y: number } | null,\n });\n\n const [, forceRender] = React.useState(0);\n const rerender = useCallback(() => forceRender((n) => n + 1), []);\n\n const scaleIdRef = useRef(generatePhysicsId('stepScale'));\n const snapIdRef = useRef(generatePhysicsId('stepSnap'));\n const decayIdRef = useRef(generatePhysicsId('stepDecay'));\n const relaxIdRef = useRef(generatePhysicsId('stepRelax'));\n\n const scaleSpring = useRef<Spring1D | null>(null);\n const snapSpring = useRef<Spring1D | null>(null);\n\n useEffect(() => {\n if (!state.current.isDragging) {\n const idx = options.findIndex((opt) => opt.value === value);\n const percent = idx * stepPercent;\n animateToPercent(percent);\n }\n }, [value, options, stepPercent]);\n\n const animateToPercent = useCallback(\n (targetPercent: number) => {\n const s = state.current;\n PhysicsEngine.unregister(snapIdRef.current);\n\n snapSpring.current = new Spring1D(s.displayPercent, {\n tension: config.springTension * 500,\n friction: 22,\n mass: 0.8,\n precision: 0.01,\n });\n snapSpring.current.setTarget(targetPercent);\n\n PhysicsEngine.register(snapIdRef.current, (dt) => {\n if (!snapSpring.current) return;\n const result = snapSpring.current.step(dt);\n s.displayPercent = result.value;\n rerender();\n\n if (result.isSettled) {\n PhysicsEngine.unregister(snapIdRef.current);\n }\n });\n },\n [config.springTension, rerender]\n );\n\n const animateScaleTo = useCallback(\n (targetScale: number) => {\n const s = state.current;\n PhysicsEngine.unregister(scaleIdRef.current);\n\n scaleSpring.current = new Spring1D(s.thumbScale, {\n tension: 400,\n friction: 20,\n mass: 0.6,\n precision: 0.001,\n });\n scaleSpring.current.setTarget(targetScale);\n\n PhysicsEngine.register(scaleIdRef.current, (dt) => {\n if (!scaleSpring.current) return;\n const result = scaleSpring.current.step(dt);\n s.thumbScale = result.value;\n rerender();\n\n if (result.isSettled) {\n PhysicsEngine.unregister(scaleIdRef.current);\n }\n });\n },\n [rerender]\n );\n\n const animateStretchRelax = useCallback(() => {\n const s = state.current;\n PhysicsEngine.unregister(relaxIdRef.current);\n\n const spring = new Spring1D(s.stretchX, {\n tension: 300,\n friction: 14,\n mass: 0.5,\n precision: 0.001,\n });\n spring.setTarget(1);\n\n PhysicsEngine.register(relaxIdRef.current, (dt) => {\n const result = spring.step(dt);\n s.stretchX = result.value;\n s.stretchY = 1 - (result.value - 1) * 0.4;\n s.stretchOriginPercent += (50 - s.stretchOriginPercent) * 0.15;\n s.shadowY += (2 - s.shadowY) * 0.15;\n s.shadowBlur += (6 - s.shadowBlur) * 0.15;\n s.shadowOpacity += (0.12 - s.shadowOpacity) * 0.15;\n rerender();\n\n if (result.isSettled) {\n s.stretchX = 1;\n s.stretchY = 1;\n s.stretchOriginPercent = 50;\n PhysicsEngine.unregister(relaxIdRef.current);\n }\n });\n }, [rerender]);\n\n const getClosestStepIndex = useCallback(\n (percent: number) => {\n const stepSize = 100 / (options.length - 1);\n return Math.round(percent / stepSize);\n },\n [options.length]\n );\n\n const handlePointerDown = useCallback(\n (e: React.PointerEvent) => {\n if (!trackRef.current) return;\n const s = state.current;\n\n e.preventDefault();\n (e.target as HTMLElement).setPointerCapture(e.pointerId);\n\n s.pointerStart = { x: e.clientX, y: e.clientY };\n s.isDragging = true;\n\n PhysicsEngine.unregister(snapIdRef.current);\n animateScaleTo(config.liftScale);\n\n PhysicsEngine.register(decayIdRef.current, () => {\n if (!s.isDragging) return;\n\n const decayLerp = 0.08;\n const threshold = 0.001;\n\n if (Math.abs(s.stretchX - 1) > threshold) {\n s.stretchX += (1 - s.stretchX) * decayLerp;\n }\n if (Math.abs(s.stretchY - 1) > threshold) {\n s.stretchY += (1 - s.stretchY) * decayLerp;\n }\n if (Math.abs(s.stretchOriginPercent - 50) > threshold) {\n s.stretchOriginPercent += (50 - s.stretchOriginPercent) * decayLerp;\n }\n s.shadowY += (2 - s.shadowY) * decayLerp;\n s.shadowBlur += (6 - s.shadowBlur) * decayLerp;\n s.shadowOpacity += (0.12 - s.shadowOpacity) * decayLerp;\n\n rerender();\n });\n\n const rect = trackRef.current.getBoundingClientRect();\n const x = Math.max(0, Math.min(rect.width, e.clientX - rect.left));\n const percent = (x / rect.width) * 100;\n\n s.displayPercent = percent;\n s.lastPercent = percent;\n rerender();\n },\n [config.liftScale, animateScaleTo, rerender]\n );\n\n const handlePointerMove = useCallback(\n (e: React.PointerEvent) => {\n const s = state.current;\n if (!s.isDragging || !trackRef.current || !s.pointerStart) return;\n\n const rect = trackRef.current.getBoundingClientRect();\n const rawX = e.clientX - rect.left;\n const percent = Math.max(0, Math.min(100, (rawX / rect.width) * 100));\n\n const velocity = percent - s.lastPercent;\n s.lastPercent = percent;\n\n if (Math.abs(velocity) > 0.3) {\n s.targetOriginPercent = velocity > 0 ? 100 : 0;\n }\n s.stretchOriginPercent += (s.targetOriginPercent - s.stretchOriginPercent) * 0.15;\n\n const absVelocity = Math.abs(velocity);\n const velStretch = Math.min(absVelocity * config.velocityStretch * 15, 1.2);\n\n const targetStretchX = 1 + velStretch;\n const targetStretchY = 1 - velStretch * 0.4;\n\n const baseLerp = 0.35;\n const decayLerp = 0.15;\n const velocityThreshold = 0.5;\n\n if (absVelocity < velocityThreshold) {\n const decayFactor = 1 - absVelocity / velocityThreshold;\n s.stretchX += (1 - s.stretchX) * decayLerp * decayFactor;\n s.stretchY += (1 - s.stretchY) * decayLerp * decayFactor;\n }\n\n s.stretchX += (targetStretchX - s.stretchX) * baseLerp;\n s.stretchY += (targetStretchY - s.stretchY) * baseLerp;\n\n const targetShadowY = 2 + absVelocity * 0.4;\n const targetShadowBlur = 6 + absVelocity * 0.6;\n const targetShadowOpacity = 0.12 + absVelocity * 0.015;\n\n s.shadowY += (targetShadowY - s.shadowY) * 0.3;\n s.shadowBlur += (targetShadowBlur - s.shadowBlur) * 0.3;\n s.shadowOpacity += (targetShadowOpacity - s.shadowOpacity) * 0.3;\n\n s.displayPercent = percent;\n rerender();\n },\n [config.velocityStretch, rerender]\n );\n\n const handlePointerUp = useCallback(() => {\n const s = state.current;\n if (!s.isDragging) return;\n\n s.isDragging = false;\n s.pointerStart = null;\n\n PhysicsEngine.unregister(decayIdRef.current);\n animateScaleTo(1);\n animateStretchRelax();\n\n const closestIndex = getClosestStepIndex(s.displayPercent);\n const snapPercent = closestIndex * stepPercent;\n animateToPercent(snapPercent);\n\n const newValue = options[closestIndex]?.value;\n if (newValue !== undefined && newValue !== value) {\n onChange(newValue);\n }\n\n rerender();\n }, [animateScaleTo, animateStretchRelax, animateToPercent, getClosestStepIndex, stepPercent, options, value, onChange, rerender]);\n\n const handleStepClick = useCallback(\n (index: number) => {\n if (state.current.isDragging) return;\n const newValue = options[index].value;\n if (newValue !== value) {\n onChange(newValue);\n }\n },\n [options, value, onChange]\n );\n\n useEffect(() => {\n return () => {\n PhysicsEngine.unregister(scaleIdRef.current);\n PhysicsEngine.unregister(snapIdRef.current);\n PhysicsEngine.unregister(decayIdRef.current);\n PhysicsEngine.unregister(relaxIdRef.current);\n };\n }, []);\n\n const s = state.current;\n const currentOption = options[currentIndex];\n\n return (\n <div className={`tekiyo-step-slider ${className}`}>\n <div className=\"tekiyo-slider-header\">\n <div className=\"tekiyo-slider-label-group\">\n <span className=\"tekiyo-slider-label\">{label}</span>\n {description && <span className=\"tekiyo-slider-description\">{description}</span>}\n </div>\n <span\n className=\"tekiyo-step-value\"\n style={{ color: currentOption?.color }}\n >\n {currentOption?.label}\n </span>\n </div>\n <div\n className=\"tekiyo-step-track\"\n ref={trackRef}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n onPointerCancel={handlePointerUp}\n >\n <div className=\"tekiyo-step-track-bg\" />\n <div\n className=\"tekiyo-step-track-fill\"\n style={{\n width: `${s.displayPercent}%`,\n background: currentOption?.color || '#007aff',\n }}\n />\n <div className=\"tekiyo-step-dots\">\n {options.map((option, index) => {\n const dotPercent = index * stepPercent;\n const isActive = s.displayPercent >= dotPercent - 1;\n return (\n <div\n key={option.value}\n className={`tekiyo-step-dot ${isActive ? 'active' : ''}`}\n style={{\n left: `${dotPercent}%`,\n background: isActive ? (option.color || '#007aff') : undefined,\n }}\n onClick={() => handleStepClick(index)}\n />\n );\n })}\n </div>\n <div\n className={`tekiyo-slider-thumb tekiyo-step-thumb ${s.isDragging ? 'active' : ''}`}\n style={{\n left: `${s.displayPercent}%`,\n transform: `translate(-50%, calc(-50% + ${s.verticalOffset}px)) scale(${s.thumbScale}) scaleX(${s.stretchX}) scaleY(${s.stretchY})`,\n transformOrigin: `${s.stretchOriginPercent}% center`,\n boxShadow: `0 ${s.shadowY}px ${s.shadowBlur}px rgba(0, 0, 0, ${s.shadowOpacity})`,\n }}\n onPointerDown={handlePointerDown}\n />\n </div>\n <div className=\"tekiyo-step-labels\">\n {options.map((option, index) => {\n const labelPercent = index * stepPercent;\n const isSelected = currentIndex === index;\n return (\n <span\n key={option.value}\n className={`tekiyo-step-label ${isSelected ? 'selected' : ''}`}\n style={{\n left: `${labelPercent}%`,\n color: isSelected ? (option.color || '#007aff') : undefined,\n }}\n onClick={() => handleStepClick(index)}\n >\n {option.label}\n </span>\n );\n })}\n </div>\n </div>\n );\n}\n\nexport default PhysicsStepSlider;\n","import React, { useRef, useCallback, useEffect } from 'react';\nimport { Spring1D } from '../../core/Spring';\nimport { PhysicsEngine, generatePhysicsId } from '../../core/PhysicsEngine';\nimport { SliderConfig } from './types';\n\nexport interface PhysicsVerticalSliderProps {\n label: string;\n icon?: React.ReactNode;\n value: number;\n min: number;\n max: number;\n step: number;\n config: SliderConfig;\n onChange: (value: number) => void;\n height?: number;\n color?: string;\n className?: string;\n}\n\nexport function PhysicsVerticalSlider({\n label,\n icon,\n value,\n min,\n max,\n step,\n config,\n onChange,\n height = 160,\n color = '#007aff',\n className = '',\n}: PhysicsVerticalSliderProps) {\n const trackRef = useRef<HTMLDivElement>(null);\n\n const state = useRef({\n isDragging: false,\n displayPercent: ((value - min) / (max - min)) * 100,\n thumbScale: 1,\n horizontalOffset: 0,\n stretchX: 1,\n stretchY: 1,\n stretchOriginPercent: 50,\n targetOriginPercent: 50,\n shadowX: 0,\n shadowY: 2,\n shadowBlur: 6,\n shadowOpacity: 0.12,\n lastPercent: ((value - min) / (max - min)) * 100,\n pointerStart: null as { x: number; y: number } | null,\n });\n\n const [, forceRender] = React.useState(0);\n const rerender = useCallback(() => forceRender((n) => n + 1), []);\n\n const physicsIdRef = useRef(generatePhysicsId('vslider'));\n const scaleIdRef = useRef(generatePhysicsId('vscale'));\n const decayIdRef = useRef(generatePhysicsId('vdecay'));\n const relaxIdRef = useRef(generatePhysicsId('vrelax'));\n const horizontalIdRef = useRef(generatePhysicsId('vhorizontal'));\n\n const springRef = useRef<Spring1D | null>(null);\n const scaleSpringRef = useRef<Spring1D | null>(null);\n const horizontalSpringRef = useRef<Spring1D | null>(null);\n\n useEffect(() => {\n if (!state.current.isDragging) {\n const targetPercent = ((value - min) / (max - min)) * 100;\n animateToPercent(targetPercent);\n }\n }, [value, min, max]);\n\n const animateToPercent = useCallback(\n (targetPercent: number) => {\n const s = state.current;\n PhysicsEngine.unregister(physicsIdRef.current);\n\n springRef.current = new Spring1D(s.displayPercent, {\n tension: config.springTension * 400,\n friction: 26,\n mass: 1,\n precision: 0.01,\n });\n springRef.current.setTarget(targetPercent);\n\n PhysicsEngine.register(physicsIdRef.current, (dt) => {\n if (!springRef.current) return;\n const result = springRef.current.step(dt);\n s.displayPercent = result.value;\n rerender();\n\n if (result.isSettled) {\n PhysicsEngine.unregister(physicsIdRef.current);\n }\n });\n },\n [config.springTension, rerender]\n );\n\n const percentToValue = useCallback(\n (percent: number) => {\n const raw = min + (percent / 100) * (max - min);\n return Math.round(raw / step) * step;\n },\n [min, max, step]\n );\n\n const animateScaleTo = useCallback(\n (targetScale: number) => {\n const s = state.current;\n PhysicsEngine.unregister(scaleIdRef.current);\n\n scaleSpringRef.current = new Spring1D(s.thumbScale, {\n tension: 400,\n friction: 20,\n mass: 0.6,\n precision: 0.001,\n });\n scaleSpringRef.current.setTarget(targetScale);\n\n PhysicsEngine.register(scaleIdRef.current, (dt) => {\n if (!scaleSpringRef.current) return;\n const result = scaleSpringRef.current.step(dt);\n s.thumbScale = result.value;\n rerender();\n\n if (result.isSettled) {\n PhysicsEngine.unregister(scaleIdRef.current);\n }\n });\n },\n [rerender]\n );\n\n const animateStretchRelax = useCallback(() => {\n const s = state.current;\n PhysicsEngine.unregister(relaxIdRef.current);\n\n const spring = new Spring1D(s.stretchY, {\n tension: 300,\n friction: 14,\n mass: 0.5,\n precision: 0.001,\n });\n spring.setTarget(1);\n\n PhysicsEngine.register(relaxIdRef.current, (dt) => {\n const result = spring.step(dt);\n s.stretchY = result.value;\n s.stretchX = 1 - (result.value - 1) * 0.4;\n s.stretchOriginPercent += (50 - s.stretchOriginPercent) * 0.15;\n s.shadowY += (2 - s.shadowY) * 0.15;\n s.shadowBlur += (6 - s.shadowBlur) * 0.15;\n s.shadowOpacity += (0.12 - s.shadowOpacity) * 0.15;\n rerender();\n\n if (result.isSettled) {\n s.stretchX = 1;\n s.stretchY = 1;\n s.stretchOriginPercent = 50;\n PhysicsEngine.unregister(relaxIdRef.current);\n }\n });\n }, [rerender]);\n\n const handlePointerDown = useCallback(\n (e: React.PointerEvent) => {\n if (!trackRef.current) return;\n const s = state.current;\n\n e.preventDefault();\n (e.target as HTMLElement).setPointerCapture(e.pointerId);\n\n s.pointerStart = { x: e.clientX, y: e.clientY };\n s.isDragging = true;\n\n PhysicsEngine.unregister(physicsIdRef.current);\n PhysicsEngine.unregister(horizontalIdRef.current);\n PhysicsEngine.unregister(relaxIdRef.current);\n\n animateScaleTo(config.liftScale);\n\n PhysicsEngine.register(decayIdRef.current, () => {\n if (!s.isDragging) return;\n\n const decayLerp = 0.08;\n const threshold = 0.001;\n\n if (Math.abs(s.stretchY - 1) > threshold) {\n s.stretchY += (1 - s.stretchY) * decayLerp;\n }\n if (Math.abs(s.stretchX - 1) > threshold) {\n s.stretchX += (1 - s.stretchX) * decayLerp;\n }\n if (Math.abs(s.stretchOriginPercent - 50) > threshold) {\n s.stretchOriginPercent += (50 - s.stretchOriginPercent) * decayLerp;\n }\n s.shadowY += (2 - s.shadowY) * decayLerp;\n s.shadowBlur += (6 - s.shadowBlur) * decayLerp;\n s.shadowOpacity += (0.12 - s.shadowOpacity) * decayLerp;\n\n rerender();\n });\n\n const rect = trackRef.current.getBoundingClientRect();\n const y = Math.max(0, Math.min(rect.height, e.clientY - rect.top));\n const percent = 100 - (y / rect.height) * 100;\n\n s.displayPercent = percent;\n s.lastPercent = percent;\n onChange(percentToValue(percent));\n rerender();\n },\n [config.liftScale, animateScaleTo, percentToValue, onChange, rerender]\n );\n\n const handlePointerMove = useCallback(\n (e: React.PointerEvent) => {\n const s = state.current;\n if (!s.isDragging || !trackRef.current || !s.pointerStart) return;\n\n const rect = trackRef.current.getBoundingClientRect();\n const rawY = e.clientY - rect.top;\n const rawPercent = 100 - (rawY / rect.height) * 100;\n\n let percent = rawPercent;\n let edgeStretchV = 0;\n\n if (rawPercent < 0) {\n edgeStretchV = -rawPercent / 100;\n percent = rawPercent * 0.15;\n s.targetOriginPercent = 0;\n } else if (rawPercent > 100) {\n edgeStretchV = (rawPercent - 100) / 100;\n percent = 100 + (rawPercent - 100) * 0.15;\n s.targetOriginPercent = 100;\n }\n\n const velocity = percent - s.lastPercent;\n s.lastPercent = percent;\n\n if (Math.abs(velocity) > 0.3 && edgeStretchV === 0) {\n s.targetOriginPercent = velocity > 0 ? 0 : 100;\n }\n s.stretchOriginPercent += (s.targetOriginPercent - s.stretchOriginPercent) * 0.15;\n\n const rawHorizontalOffset = e.clientX - s.pointerStart.x;\n const rubberBandedOffset = rawHorizontalOffset * 0.06;\n s.horizontalOffset = Math.max(-5, Math.min(5, rubberBandedOffset));\n\n const absVelocity = Math.abs(velocity);\n const velStretch = Math.min(absVelocity * config.velocityStretch * 15, 1.2);\n\n const edgeStretchFactorV = Math.min(Math.abs(edgeStretchV) * 0.6, 0.12);\n const edgeStretchFactorH = Math.abs(s.horizontalOffset) / 5 * 0.06;\n\n const targetStretchY = 1 + velStretch + edgeStretchFactorV;\n const targetStretchX = 1 - velStretch * 0.4 + edgeStretchFactorH;\n\n const baseLerp = 0.35;\n const decayLerp = 0.15;\n const velocityThreshold = 0.5;\n\n if (absVelocity < velocityThreshold) {\n const decayFactor = 1 - absVelocity / velocityThreshold;\n s.stretchY += (1 - s.stretchY) * decayLerp * decayFactor;\n s.stretchX += (1 - s.stretchX) * decayLerp * decayFactor;\n s.stretchOriginPercent += (50 - s.stretchOriginPercent) * decayLerp * decayFactor;\n }\n\n s.stretchY += (targetStretchY - s.stretchY) * baseLerp;\n s.stretchX += (targetStretchX - s.stretchX) * baseLerp;\n\n const targetShadowY = 2 + absVelocity * 0.4;\n const targetShadowBlur = 6 + absVelocity * 0.6;\n const targetShadowOpacity = 0.12 + absVelocity * 0.015;\n\n s.shadowY += (targetShadowY - s.shadowY) * 0.3;\n s.shadowBlur += (targetShadowBlur - s.shadowBlur) * 0.3;\n s.shadowOpacity += (targetShadowOpacity - s.shadowOpacity) * 0.3;\n\n s.displayPercent = Math.max(0, Math.min(100, percent));\n onChange(percentToValue(Math.max(0, Math.min(100, percent))));\n rerender();\n },\n [config.velocityStretch, percentToValue, onChange, rerender]\n );\n\n const handlePointerUp = useCallback(() => {\n const s = state.current;\n if (!s.isDragging) return;\n\n s.isDragging = false;\n s.pointerStart = null;\n\n PhysicsEngine.unregister(decayIdRef.current);\n animateScaleTo(1);\n animateStretchRelax();\n\n if (s.horizontalOffset !== 0) {\n PhysicsEngine.unregister(horizontalIdRef.current);\n horizontalSpringRef.current = new Spring1D(s.horizontalOffset, {\n tension: 400,\n friction: 18,\n mass: 0.5,\n precision: 0.1,\n });\n horizontalSpringRef.current.setTarget(0);\n\n PhysicsEngine.register(horizontalIdRef.current, (dt) => {\n if (!horizontalSpringRef.current) return;\n const result = horizontalSpringRef.current.step(dt);\n s.horizontalOffset = result.value;\n rerender();\n\n if (result.isSettled) {\n s.horizontalOffset = 0;\n PhysicsEngine.unregister(horizontalIdRef.current);\n }\n });\n }\n\n rerender();\n }, [animateScaleTo, animateStretchRelax, rerender]);\n\n const handleTrackClick = useCallback(\n (e: React.MouseEvent) => {\n const s = state.current;\n if (!trackRef.current || s.isDragging) return;\n\n const rect = trackRef.current.getBoundingClientRect();\n const y = e.clientY - rect.top;\n const percent = 100 - Math.max(0, Math.min(100, (y / rect.height) * 100));\n\n onChange(percentToValue(percent));\n animateToPercent(percent);\n },\n [percentToValue, onChange, animateToPercent]\n );\n\n useEffect(() => {\n return () => {\n PhysicsEngine.unregister(physicsIdRef.current);\n PhysicsEngine.unregister(scaleIdRef.current);\n PhysicsEngine.unregister(decayIdRef.current);\n PhysicsEngine.unregister(relaxIdRef.current);\n PhysicsEngine.unregister(horizontalIdRef.current);\n };\n }, []);\n\n const s = state.current;\n const displayValue = Math.round(value);\n\n return (\n <div className={`tekiyo-vertical-slider ${className}`} style={{ height }}>\n <div\n className=\"tekiyo-vertical-track\"\n ref={trackRef}\n onClick={handleTrackClick}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n onPointerCancel={handlePointerUp}\n style={{ height }}\n >\n <div className=\"tekiyo-vertical-track-bg\" />\n <div\n className=\"tekiyo-vertical-track-fill\"\n style={{\n height: `${s.displayPercent}%`,\n background: color,\n }}\n />\n <div\n className={`tekiyo-slider-thumb tekiyo-vertical-thumb ${s.isDragging ? 'active' : ''}`}\n style={{\n bottom: `${s.displayPercent}%`,\n transform: `translate(calc(-50% + ${s.horizontalOffset}px), 50%) scale(${s.thumbScale}) scaleX(${s.stretchX}) scaleY(${s.stretchY})`,\n transformOrigin: `center ${s.stretchOriginPercent}%`,\n boxShadow: `0 ${s.shadowY}px ${s.shadowBlur}px rgba(0, 0, 0, ${s.shadowOpacity})`,\n }}\n onPointerDown={handlePointerDown}\n />\n </div>\n <div className=\"tekiyo-vertical-slider-info\">\n {icon && <div className=\"tekiyo-vertical-slider-icon\" style={{ color }}>{icon}</div>}\n <span className=\"tekiyo-vertical-slider-value\" style={{ color }}>{displayValue}%</span>\n <span className=\"tekiyo-vertical-slider-label\">{label}</span>\n </div>\n </div>\n );\n}\n\nexport default PhysicsVerticalSlider;\n","export interface SliderConfig {\n springTension: number;\n velocityStretch: number;\n liftScale: number;\n flickMomentum: number;\n maxVelocity: number;\n}\n\nexport interface SliderPreset {\n name: string;\n description: string;\n config: SliderConfig;\n}\n\nexport const sliderPresets: SliderPreset[] = [\n {\n name: 'Buttery Smooth',\n description: 'iOS classic feel',\n config: {\n springTension: 0.8,\n velocityStretch: 0.02,\n liftScale: 1.5,\n flickMomentum: 800,\n maxVelocity: 3.0,\n },\n },\n {\n name: 'Snappy',\n description: 'Responsive & precise',\n config: {\n springTension: 1.4,\n velocityStretch: 0.01,\n liftScale: 1.05,\n flickMomentum: 400,\n maxVelocity: 5.0,\n },\n },\n {\n name: 'Playful',\n description: 'Fun & elastic',\n config: {\n springTension: 0.5,\n velocityStretch: 0.08,\n liftScale: 1.5,\n flickMomentum: 1500,\n maxVelocity: 6.0,\n },\n },\n];\n\nexport const defaultSliderConfig: SliderConfig = sliderPresets[0].config;\n","import React, { useState, useRef, useCallback, useEffect } from 'react';\nimport { Spring1D } from '../../core/Spring';\nimport { PhysicsEngine, generatePhysicsId } from '../../core/PhysicsEngine';\nimport { SegmentedControlConfig } from './types';\n\nexport interface SegmentedControlProps {\n options: string[];\n defaultIndex?: number;\n value?: number;\n config: SegmentedControlConfig;\n showIndicator?: boolean;\n onChange?: (index: number) => void;\n className?: string;\n}\n\nexport function SegmentedControl({\n options,\n defaultIndex = 0,\n value,\n config,\n showIndicator,\n onChange,\n className = '',\n}: SegmentedControlProps) {\n const [, forceRender] = useState(0);\n const rerender = useCallback(() => forceRender(n => n + 1), []);\n\n const initialIndex = value !== undefined ? value : defaultIndex;\n\n const state = useRef({\n selected: initialIndex,\n indicatorPos: initialIndex,\n stretchX: 1,\n stretchY: 1,\n pressScale: 1,\n verticalOffset: 0,\n isDragging: false,\n isPressed: false,\n stretchOriginPercent: 50,\n targetOriginPercent: 50,\n velocity: 0,\n shadowY: 4,\n shadowBlur: 12,\n shadowOpacity: 0.15,\n });\n\n const containerRef = useRef<HTMLDivElement>(null);\n const springRef = useRef<Spring1D | null>(null);\n const pressSpringRef = useRef<Spring1D | null>(null);\n const verticalSpringRef = useRef<Spring1D | null>(null);\n const stretchOriginSpringRef = useRef<Spring1D | null>(null);\n const physicsId = useRef(generatePhysicsId('seg'));\n const pressId = useRef(generatePhysicsId('press'));\n const verticalId = useRef(generatePhysicsId('vert'));\n const stretchOriginId = useRef(generatePhysicsId('segOrigin'));\n const pointerStart = useRef<{ x: number; y: number } | null>(null);\n const lastPos = useRef(initialIndex);\n const hasDragged = useRef(false);\n const velocitySamples = useRef<number[]>([]);\n\n // Sync with controlled value\n useEffect(() => {\n if (value !== undefined && value !== state.current.selected && !state.current.isDragging) {\n animateTo(value);\n }\n }, [value]);\n\n const getIndexFromX = useCallback((clientX: number): number => {\n if (!containerRef.current) return state.current.selected;\n const rect = containerRef.current.getBoundingClientRect();\n const x = Math.max(0, Math.min(rect.width, clientX - rect.left));\n return Math.min(options.length - 1, Math.floor((x / rect.width) * options.length));\n }, [options.length]);\n\n const getPosFromX = useCallback((clientX: number, allowOverdrag = false): number => {\n if (!containerRef.current) return state.current.indicatorPos;\n const rect = containerRef.current.getBoundingClientRect();\n const x = clientX - rect.left;\n const rel = allowOverdrag ? x / rect.width : Math.max(0, Math.min(1, x / rect.width));\n return rel * (options.length - 1);\n }, [options.length]);\n\n const animateTo = useCallback((target: number, initialVelocity = 0) => {\n const s = state.current;\n s.targetOriginPercent = target > s.indicatorPos ? 0 : 100;\n s.selected = target;\n\n PhysicsEngine.unregister(physicsId.current);\n PhysicsEngine.unregister(stretchOriginId.current);\n\n if (s.pressScale !== 1) {\n PhysicsEngine.unregister(pressId.current);\n const releaseSpring = new Spring1D(s.pressScale, {\n tension: 200,\n friction: 18,\n mass: 0.8,\n precision: 0.01,\n });\n releaseSpring.setTarget(1);\n PhysicsEngine.register(pressId.current, (dt2) => {\n const pr = releaseSpring.step(dt2);\n s.pressScale = pr.value;\n rerender();\n if (pr.isSettled) {\n s.pressScale = 1;\n PhysicsEngine.unregister(pressId.current);\n }\n });\n }\n\n springRef.current = new Spring1D(s.indicatorPos, {\n tension: config.springTension * 280,\n friction: 18,\n mass: 0.8,\n precision: 0.001,\n });\n springRef.current.setTarget(target);\n if (initialVelocity) springRef.current.setVelocity(initialVelocity);\n\n PhysicsEngine.register(physicsId.current, (dt) => {\n if (!springRef.current) return;\n const r = springRef.current.step(dt);\n const vel = Math.abs(r.velocity || 0);\n const stretch = Math.min(vel * config.velocityStretch * 6, 0.25);\n\n s.indicatorPos = r.value;\n s.velocity = vel;\n s.stretchX = 1 + stretch;\n s.stretchY = 1 - stretch * 0.5;\n\n s.stretchOriginPercent += (s.targetOriginPercent - s.stretchOriginPercent) * 0.12;\n\n s.shadowY = 4 + vel * 2;\n s.shadowBlur = 12 + vel * 4;\n s.shadowOpacity = 0.15 + vel * 0.05;\n\n rerender();\n\n if (r.isSettled) {\n s.stretchX = 1;\n s.stretchY = 1;\n s.velocity = 0;\n s.shadowY = 4;\n s.shadowBlur = 12;\n s.shadowOpacity = 0.15;\n PhysicsEngine.unregister(physicsId.current);\n\n stretchOriginSpringRef.current = new Spring1D(s.stretchOriginPercent, {\n tension: 300,\n friction: 18,\n mass: 0.5,\n precision: 0.1,\n });\n stretchOriginSpringRef.current.setTarget(50);\n\n PhysicsEngine.register(stretchOriginId.current, (dt2) => {\n if (!stretchOriginSpringRef.current) return;\n const or = stretchOriginSpringRef.current.step(dt2);\n s.stretchOriginPercent = or.value;\n s.targetOriginPercent = 50;\n rerender();\n if (or.isSettled) {\n s.stretchOriginPercent = 50;\n s.targetOriginPercent = 50;\n PhysicsEngine.unregister(stretchOriginId.current);\n }\n });\n\n rerender();\n }\n });\n\n onChange?.(target);\n }, [config.springTension, config.velocityStretch, onChange, rerender]);\n\n const animatePress = useCallback((pressed: boolean) => {\n const s = state.current;\n PhysicsEngine.unregister(pressId.current);\n pressSpringRef.current = new Spring1D(s.pressScale, {\n tension: 400,\n friction: 22,\n mass: 0.6,\n precision: 0.01,\n });\n pressSpringRef.current.setTarget(pressed ? 1.4 : 1);\n\n PhysicsEngine.register(pressId.current, (dt) => {\n if (!pressSpringRef.current) return;\n const r = pressSpringRef.current.step(dt);\n s.pressScale = r.value;\n rerender();\n if (r.isSettled) PhysicsEngine.unregister(pressId.current);\n });\n }, [rerender]);\n\n const animateVerticalBack = useCallback(() => {\n const s = state.current;\n if (Math.abs(s.verticalOffset) < 0.5) {\n s.verticalOffset = 0;\n return;\n }\n\n PhysicsEngine.unregister(verticalId.current);\n verticalSpringRef.current = new Spring1D(s.verticalOffset, {\n tension: 400,\n friction: 20,\n mass: 0.5,\n precision: 0.1,\n });\n verticalSpringRef.current.setTarget(0);\n\n PhysicsEngine.register(verticalId.current, (dt) => {\n if (!verticalSpringRef.current) return;\n const r = verticalSpringRef.current.step(dt);\n s.verticalOffset = r.value;\n rerender();\n if (r.isSettled) {\n s.verticalOffset = 0;\n PhysicsEngine.unregister(verticalId.current);\n }\n });\n }, [rerender]);\n\n const animateOriginBack = useCallback(() => {\n const s = state.current;\n if (Math.abs(s.stretchOriginPercent - 50) < 1) {\n s.stretchOriginPercent = 50;\n s.targetOriginPercent = 50;\n return;\n }\n\n PhysicsEngine.unregister(stretchOriginId.current);\n stretchOriginSpringRef.current = new Spring1D(s.stretchOriginPercent, {\n tension: 300,\n friction: 18,\n mass: 0.5,\n precision: 0.1,\n });\n stretchOriginSpringRef.current.setTarget(50);\n\n PhysicsEngine.register(stretchOriginId.current, (dt) => {\n if (!stretchOriginSpringRef.current) return;\n const r = stretchOriginSpringRef.current.step(dt);\n s.stretchOriginPercent = r.value;\n s.targetOriginPercent = 50;\n rerender();\n if (r.isSettled) {\n s.stretchOriginPercent = 50;\n s.targetOriginPercent = 50;\n PhysicsEngine.unregister(stretchOriginId.current);\n }\n });\n }, [rerender]);\n\n const onPointerDown = useCallback((e: React.PointerEvent) => {\n const s = state.current;\n pointerStart.current = { x: e.clientX, y: e.clientY };\n hasDragged.current = false;\n velocitySamples.current = [];\n (e.currentTarget as HTMLElement).setPointerCapture(e.pointerId);\n PhysicsEngine.unregister(stretchOriginId.current);\n\n if (containerRef.current) {\n const rect = containerRef.current.getBoundingClientRect();\n const segW = rect.width / options.length;\n const indLeft = rect.left + s.indicatorPos * segW;\n const grabX = e.clientX - indLeft;\n const pct = Math.max(0, Math.min(100, (grabX / segW) * 100));\n s.targetOriginPercent = pct;\n s.stretchOriginPercent = pct;\n }\n\n s.isPressed = true;\n animatePress(true);\n lastPos.current = getPosFromX(e.clientX);\n rerender();\n }, [options.length, getPosFromX, animatePress, rerender]);\n\n const onPointerMove = useCallback((e: React.PointerEvent) => {\n if (!pointerStart.current) return;\n const s = state.current;\n\n const dx = e.clientX - pointerStart.current.x;\n const dy = e.clientY - pointerStart.current.y;\n\n if (!hasDragged.current && (Math.abs(dx) > 5 || Math.abs(dy) > 5)) {\n hasDragged.current = true;\n s.isDragging = true;\n PhysicsEngine.unregister(physicsId.current);\n }\n\n if (!hasDragged.current) return;\n\n let pos = getPosFromX(e.clientX, true);\n const minPos = 0;\n const maxPos = options.length - 1;\n let edgeStretch = 0;\n\n if (pos < minPos) {\n const over = minPos - pos;\n edgeStretch = -over;\n pos = minPos - over * 0.15;\n s.targetOriginPercent = 100;\n } else if (pos > maxPos) {\n const over = pos - maxPos;\n edgeStretch = over;\n pos = maxPos + over * 0.15;\n s.targetOriginPercent = 0;\n }\n\n const vel = pos - lastPos.current;\n\n if (Math.abs(vel) > 0.01 && edgeStretch === 0) {\n s.targetOriginPercent = vel > 0 ? 100 : 0;\n }\n\n s.stretchOriginPercent += (s.targetOriginPercent - s.stretchOriginPercent) * 0.15;\n velocitySamples.current.push(vel);\n if (velocitySamples.current.length > 5) velocitySamples.current.shift();\n lastPos.current = pos;\n\n const vOff = Math.max(-12, Math.min(12, dy * 0.12));\n s.verticalOffset = vOff;\n\n const vFactor = Math.min(Math.abs(vel) * config.velocityStretch * 80, 0.6);\n const edgeFactor = Math.min(Math.abs(edgeStretch) * 0.2, 0.2);\n\n s.stretchX = 1 + vFactor + edgeFactor;\n s.stretchY = 1 - vFactor * 0.5 - edgeFactor * 0.4;\n s.indicatorPos = pos;\n\n const idx = getIndexFromX(e.clientX);\n if (idx !== s.selected) s.selected = idx;\n\n rerender();\n }, [getPosFromX, getIndexFromX, options.length, config.velocityStretch, rerender]);\n\n const onPointerUp = useCallback((e: React.PointerEvent) => {\n const s = state.current;\n pointerStart.current = null;\n s.isPressed = false;\n\n if (!hasDragged.current) {\n const idx = getIndexFromX(e.clientX);\n if (idx !== s.selected) {\n const dir = idx > s.indicatorPos ? 1 : -1;\n animateTo(idx, dir * 3);\n } else {\n animatePress(false);\n animateOriginBack();\n }\n rerender();\n return;\n }\n\n s.isDragging = false;\n hasDragged.current = false;\n animatePress(false);\n\n const avgVel = velocitySamples.current.length > 0\n ? velocitySamples.current.reduce((a, b) => a + b, 0) / velocitySamples.current.length\n : 0;\n velocitySamples.current = [];\n\n animateVerticalBack();\n animateTo(s.selected, avgVel * 0.5);\n }, [getIndexFromX, animateTo, animatePress, animateVerticalBack, animateOriginBack, rerender]);\n\n const onPointerLeave = useCallback(() => {\n if (pointerStart.current) {\n const s = state.current;\n pointerStart.current = null;\n s.isPressed = false;\n s.isDragging = false;\n hasDragged.current = false;\n velocitySamples.current = [];\n animatePress(false);\n animateVerticalBack();\n animateTo(s.selected);\n }\n }, [animatePress, animateVerticalBack, animateTo]);\n\n useEffect(() => {\n return () => {\n PhysicsEngine.unregister(physicsId.current);\n PhysicsEngine.unregister(pressId.current);\n PhysicsEngine.unregister(verticalId.current);\n PhysicsEngine.unregister(stretchOriginId.current);\n };\n }, []);\n\n const s = state.current;\n const dragClass = s.isPressed || s.isDragging ? 'dragging' : '';\n\n return (\n <div\n ref={containerRef}\n className={`tekiyo-segmented-control ${s.isDragging ? 'dragging' : ''} ${className}`}\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={onPointerUp}\n onPointerCancel={onPointerUp}\n onPointerLeave={onPointerLeave}\n >\n <div\n className={`tekiyo-segmented-indicator ${s.isPressed ? 'active' : ''} ${dragClass}`}\n style={{\n width: `calc((100% - 6px) / ${options.length})`,\n left: `calc(${s.indicatorPos} * (100% - 6px) / ${options.length} + 3px)`,\n transform: `translateY(${s.verticalOffset}px) scaleX(${s.stretchX * s.pressScale}) scaleY(${s.stretchY * s.pressScale})`,\n transformOrigin: `${s.stretchOriginPercent}% center`,\n }}\n />\n {options.map((option, index) => (\n <div\n key={option}\n className={`tekiyo-segmented-option ${s.selected === index ? 'active' : ''} ${dragClass}`}\n >\n {option}\n {showIndicator && s.selected === index && (\n <span className={`tekiyo-option-dot ${dragClass}`} />\n )}\n </div>\n ))}\n </div>\n );\n}\n\nexport default SegmentedControl;\n","export interface SegmentedControlConfig {\n springTension: number;\n velocityStretch: number;\n liftScale: number;\n flickMomentum: number;\n maxVelocity: number;\n}\n\nexport interface SegmentedControlPreset {\n name: string;\n description: string;\n config: SegmentedControlConfig;\n}\n\nexport const segmentedControlPresets: SegmentedControlPreset[] = [\n {\n name: 'Buttery Smooth',\n description: 'iOS classic feel',\n config: {\n springTension: 0.8,\n velocityStretch: 0.02,\n liftScale: 1.5,\n flickMomentum: 800,\n maxVelocity: 3.0,\n },\n },\n {\n name: 'Snappy',\n description: 'Responsive & precise',\n config: {\n springTension: 1.4,\n velocityStretch: 0.01,\n liftScale: 1.05,\n flickMomentum: 400,\n maxVelocity: 5.0,\n },\n },\n {\n name: 'Playful',\n description: 'Fun & elastic',\n config: {\n springTension: 0.5,\n velocityStretch: 0.08,\n liftScale: 1.5,\n flickMomentum: 1500,\n maxVelocity: 6.0,\n },\n },\n];\n\nexport const defaultSegmentedControlConfig: SegmentedControlConfig = segmentedControlPresets[0].config;\n","/**\n * Liquid Glass Effect - Types\n *\n * Physics-based optical refraction using Snell's Law\n */\n\n/** Surface profile for the glass shape */\nexport type SurfaceProfile = 'convex' | 'squircle' | 'concave' | 'lip';\n\n/** Configuration for the liquid glass effect */\nexport interface LiquidGlassConfig {\n /** Width of the element in pixels */\n width: number;\n /** Height of the element in pixels */\n height: number;\n /** Width of the refraction zone at edges (px) */\n bezelWidth: number;\n /** Thickness of the glass effect (0-1) */\n glassThickness: number;\n /** Refractive index (~1.5 for glass, 1.0 for air) */\n refractiveIndex: number;\n /** Surface profile shape */\n profile: SurfaceProfile;\n /** Scale multiplier for the effect (animatable) */\n scale: number;\n}\n\n/** Displacement vector for a single pixel */\nexport interface DisplacementVector {\n /** Direction of displacement in radians */\n angle: number;\n /** Intensity of displacement (0-1 normalized) */\n magnitude: number;\n}\n\n/** Default configuration values */\nexport const DEFAULT_LIQUID_GLASS_CONFIG: LiquidGlassConfig = {\n width: 200,\n height: 60,\n bezelWidth: 20,\n glassThickness: 0.5,\n refractiveIndex: 1.5,\n profile: 'squircle',\n scale: 70,\n};\n\n/** Options for the useLiquidGlass hook */\nexport interface UseLiquidGlassOptions {\n /** Width of the element */\n width: number;\n /** Height of the element */\n height: number;\n /** Surface profile (default: 'squircle') */\n profile?: SurfaceProfile;\n /** Bezel width in pixels (default: 20) */\n bezelWidth?: number;\n /** Glass thickness 0-1 (default: 0.5) */\n glassThickness?: number;\n /** Refractive index (default: 1.5) */\n refractiveIndex?: number;\n /** Whether to animate with physics (default: true) */\n animated?: boolean;\n /** Saturation boost (default: 1.3) */\n saturation?: number;\n /** Blur amount for frosted effect (default: 1) */\n blurAmount?: number;\n /** Specular highlight intensity (default: 0.3) */\n specularIntensity?: number;\n}\n\n/** Return type for the useLiquidGlass hook */\nexport interface UseLiquidGlassReturn {\n /** SVG filter component to render in the DOM */\n filterComponent: React.ReactNode;\n /** Style object with backdropFilter */\n style: React.CSSProperties;\n /** Manually set the scale (triggers animation if animated=true) */\n setScale: (scale: number) => void;\n /** Current scale value */\n scale: number;\n /** Whether the browser supports backdrop-filter with SVG */\n isSupported: boolean;\n}\n","/**\n * Displacement Map Generator\n *\n * Generates displacement maps using Snell's Law of refraction\n * for realistic liquid glass optical effects.\n *\n * Physics:\n * - Snell's Law: n₁ × sin(θ₁) = n₂ × sin(θ₂)\n * - Surface profiles define the glass shape\n * - Displacement vectors are encoded as RGB (R=dx, G=dy, 128=neutral)\n */\n\nimport { SurfaceProfile, LiquidGlassConfig } from './types';\n\n// ============================================================\n// Map Cache for Performance\n// ============================================================\n\ninterface CacheKey {\n width: number;\n height: number;\n bezelWidth: number;\n glassThickness: number;\n refractiveIndex: number;\n profile: SurfaceProfile;\n}\n\ninterface CachedMaps {\n displacement: string;\n specular: string;\n}\n\nconst mapCache = new Map<string, CachedMaps>();\n\nfunction getCacheKey(config: CacheKey): string {\n return `${config.width}-${config.height}-${config.bezelWidth}-${config.glassThickness}-${config.refractiveIndex}-${config.profile}`;\n}\n\n/**\n * Pre-generate maps for all profiles at a given size\n * Call this at app startup for instant profile switching\n */\nexport function preloadMaps(\n width: number,\n height: number,\n bezelWidth: number = 20,\n glassThickness: number = 0.5,\n refractiveIndex: number = 1.5\n): void {\n const profiles: SurfaceProfile[] = ['convex', 'squircle', 'concave', 'lip'];\n\n profiles.forEach((profile) => {\n const config: LiquidGlassConfig = {\n width,\n height,\n bezelWidth,\n glassThickness,\n refractiveIndex,\n profile,\n scale: 70,\n };\n\n const key = getCacheKey(config);\n if (!mapCache.has(key)) {\n mapCache.set(key, {\n displacement: generateDisplacementMapUncached(config),\n specular: generateSpecularMapUncached(config),\n });\n }\n });\n}\n\n/**\n * Get cached maps or generate new ones\n */\nexport function getCachedMaps(config: LiquidGlassConfig): CachedMaps {\n const key = getCacheKey(config);\n\n if (mapCache.has(key)) {\n return mapCache.get(key)!;\n }\n\n const maps: CachedMaps = {\n displacement: generateDisplacementMapUncached(config),\n specular: generateSpecularMapUncached(config),\n };\n\n mapCache.set(key, maps);\n return maps;\n}\n\n/**\n * Clear the map cache (useful for memory management)\n */\nexport function clearMapCache(): void {\n mapCache.clear();\n}\n\n// ============================================================\n// Surface Profile Functions\n// ============================================================\n\n/**\n * Smootherstep interpolation (Ken Perlin's improved smoothstep)\n * Gives smoother transitions than smoothstep\n */\nfunction smootherstep(x: number): number {\n const t = Math.max(0, Math.min(1, x));\n return t * t * t * (t * (t * 6 - 15) + 10);\n}\n\n/**\n * Get the height function for a given surface profile\n * @param profile - The surface profile type\n * @returns A function that maps normalized distance (0-1) to height (0-1)\n */\nfunction getProfileFunction(profile: SurfaceProfile): (x: number) => number {\n switch (profile) {\n case 'convex':\n // Spherical dome - sharp edges\n return (x) => Math.sqrt(Math.max(0, 1 - Math.pow(1 - x, 2)));\n\n case 'squircle':\n // Apple-style smooth transition (quartic superellipse)\n return (x) => Math.pow(Math.max(0, 1 - Math.pow(1 - x, 4)), 0.25);\n\n case 'concave':\n // Concave surface - diverges light\n return (x) => 1 - Math.sqrt(Math.max(0, 1 - Math.pow(1 - x, 2)));\n\n case 'lip':\n // Raised lip at edges, concave center\n return (x) => {\n const convex = Math.sqrt(Math.max(0, 1 - Math.pow(1 - x, 2)));\n const concave = 1 - convex;\n const t = smootherstep(x);\n return convex * (1 - t) + concave * t;\n };\n\n default:\n return (x) => x;\n }\n}\n\n// ============================================================\n// Snell's Law Calculations\n// ============================================================\n\n/**\n * Calculate the surface normal at a given point\n * @param f - The profile height function\n * @param x - Normalized position (0-1)\n * @returns Normal vector { nx, ny }\n */\nfunction calculateNormal(\n f: (x: number) => number,\n x: number\n): { nx: number; ny: number } {\n const delta = 0.001;\n const x1 = Math.max(0, x - delta);\n const x2 = Math.min(1, x + delta);\n const y1 = f(x1);\n const y2 = f(x2);\n const derivative = (y2 - y1) / (x2 - x1);\n\n // Normal is perpendicular to the tangent\n const length = Math.sqrt(derivative * derivative + 1);\n return {\n nx: -derivative / length,\n ny: 1 / length,\n };\n}\n\n/**\n * Apply Snell's Law to calculate refracted angle\n * @param incidentAngle - Angle of incident ray (radians)\n * @param n1 - Refractive index of first medium (air = 1)\n * @param n2 - Refractive index of second medium (glass ~1.5)\n * @returns Refracted angle (radians)\n */\nfunction applySnellLaw(incidentAngle: number, n1: number, n2: number): number {\n const sinTheta1 = Math.sin(incidentAngle);\n const sinTheta2 = (n1 / n2) * sinTheta1;\n\n // Total internal reflection if |sinTheta2| > 1\n if (Math.abs(sinTheta2) > 1) {\n return incidentAngle; // No refraction\n }\n\n return Math.asin(sinTheta2);\n}\n\n/**\n * Calculate displacement vector at a given position\n * @param normalizedDist - Distance from edge (0=edge, 1=center)\n * @param angle - Angle from center to this point (radians)\n * @param profile - Surface profile function\n * @param glassThickness - Glass thickness (0-1)\n * @param refractiveIndex - Refractive index of glass\n * @returns Displacement vector { dx, dy } in range [-1, 1]\n */\nfunction calculateDisplacement(\n normalizedDist: number,\n angle: number,\n profile: (x: number) => number,\n glassThickness: number,\n refractiveIndex: number\n): { dx: number; dy: number } {\n if (normalizedDist >= 1) {\n // Inside the flat center - no displacement\n return { dx: 0, dy: 0 };\n }\n\n // Get surface height and normal\n const height = profile(normalizedDist) * glassThickness;\n const normal = calculateNormal(profile, normalizedDist);\n\n // Calculate incident angle (light coming from above, perpendicular to surface)\n const incidentAngle = Math.atan2(normal.nx, normal.ny);\n\n // Apply Snell's law\n const refractedAngle = applySnellLaw(incidentAngle, 1.0, refractiveIndex);\n\n // Calculate displacement magnitude based on angle difference\n const angleDiff = refractedAngle - incidentAngle;\n const magnitude = Math.sin(angleDiff) * height;\n\n // Convert to cartesian displacement, rotated by the edge angle\n const dx = magnitude * Math.cos(angle);\n const dy = magnitude * Math.sin(angle);\n\n return { dx, dy };\n}\n\n// ============================================================\n// Displacement Map Generation\n// ============================================================\n\n/**\n * Encode displacement vector to RGB color\n * @param dx - X displacement in range [-1, 1]\n * @param dy - Y displacement in range [-1, 1]\n * @returns RGB values in range [0, 255]\n */\nfunction vectorToRGB(\n dx: number,\n dy: number\n): { r: number; g: number; b: number } {\n return {\n r: Math.round(128 + dx * 127),\n g: Math.round(128 + dy * 127),\n b: 128, // Unused channel\n };\n}\n\n/**\n * Calculate distance to the nearest edge of a rounded rectangle\n * @param x - X position in pixels\n * @param y - Y position in pixels\n * @param width - Rectangle width\n * @param height - Rectangle height\n * @param cornerRadius - Corner radius\n * @returns Distance to edge and angle from edge\n */\nfunction distanceToRoundedRectEdge(\n x: number,\n y: number,\n width: number,\n height: number,\n cornerRadius: number\n): { distance: number; angle: number } {\n const halfW = width / 2;\n const halfH = height / 2;\n const cx = x - halfW;\n const cy = y - halfH;\n const r = Math.min(cornerRadius, halfW, halfH);\n\n // Quadrant determination\n const absX = Math.abs(cx);\n const absY = Math.abs(cy);\n\n // Inside corner regions\n const cornerX = halfW - r;\n const cornerY = halfH - r;\n\n if (absX > cornerX && absY > cornerY) {\n // Corner region - distance to corner circle\n const cornerCenterX = cornerX * Math.sign(cx);\n const cornerCenterY = cornerY * Math.sign(cy);\n const dx = cx - cornerCenterX;\n const dy = cy - cornerCenterY;\n const distFromCorner = Math.sqrt(dx * dx + dy * dy);\n const distToEdge = r - distFromCorner;\n const angle = Math.atan2(dy, dx);\n return { distance: Math.max(0, distToEdge), angle };\n }\n\n // Straight edge regions\n if (absX > absY * (halfW / halfH)) {\n // Left or right edge\n const distToEdge = halfW - absX;\n const angle = cx > 0 ? 0 : Math.PI;\n return { distance: Math.max(0, distToEdge), angle };\n } else {\n // Top or bottom edge\n const distToEdge = halfH - absY;\n const angle = cy > 0 ? Math.PI / 2 : -Math.PI / 2;\n return { distance: Math.max(0, distToEdge), angle };\n }\n}\n\n/**\n * Generate a displacement map as a canvas data URL (uncached version)\n * @param config - Liquid glass configuration\n * @returns Data URL of the displacement map image\n */\nfunction generateDisplacementMapUncached(config: LiquidGlassConfig): string {\n const { width, height, bezelWidth, glassThickness, refractiveIndex, profile } =\n config;\n\n // Create offscreen canvas\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext('2d');\n\n if (!ctx) {\n console.error('Failed to get canvas context');\n return '';\n }\n\n // Get profile function\n const profileFn = getProfileFunction(profile);\n\n // Get image data for direct pixel manipulation\n const imageData = ctx.createImageData(width, height);\n const data = imageData.data;\n\n // Corner radius (auto-calculated based on size)\n const cornerRadius = Math.min(width, height) / 2;\n\n // Generate displacement for each pixel\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const { distance, angle } = distanceToRoundedRectEdge(\n x,\n y,\n width,\n height,\n cornerRadius\n );\n\n // Normalize distance by bezel width\n const normalizedDist = Math.min(1, distance / bezelWidth);\n\n // Calculate displacement\n const { dx, dy } = calculateDisplacement(\n normalizedDist,\n angle,\n profileFn,\n glassThickness,\n refractiveIndex\n );\n\n // Convert to RGB\n const { r, g, b } = vectorToRGB(dx, dy);\n\n // Write to image data\n const idx = (y * width + x) * 4;\n data[idx] = r;\n data[idx + 1] = g;\n data[idx + 2] = b;\n data[idx + 3] = 255; // Alpha\n }\n }\n\n // Put image data and return as data URL\n ctx.putImageData(imageData, 0, 0);\n return canvas.toDataURL('image/png');\n}\n\n/**\n * Generate a specular highlight map as a canvas data URL (uncached version)\n * This map shows where light reflects on the glass surface edges\n * @param config - Liquid glass configuration\n * @returns Data URL of the specular map image\n */\nfunction generateSpecularMapUncached(config: LiquidGlassConfig): string {\n const { width, height, bezelWidth, glassThickness, profile } = config;\n\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext('2d');\n\n if (!ctx) {\n console.error('Failed to get canvas context');\n return '';\n }\n\n const profileFn = getProfileFunction(profile);\n const imageData = ctx.createImageData(width, height);\n const data = imageData.data;\n\n const cornerRadius = Math.min(width, height) / 2;\n\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const { distance } = distanceToRoundedRectEdge(\n x,\n y,\n width,\n height,\n cornerRadius\n );\n\n const normalizedDist = Math.min(1, distance / bezelWidth);\n\n // Calculate surface gradient (derivative) for specular\n let specularIntensity = 0;\n\n if (normalizedDist < 1) {\n const delta = 0.02; // Larger delta for smoother gradient\n const h1 = profileFn(Math.max(0, normalizedDist - delta));\n const h2 = profileFn(Math.min(1, normalizedDist + delta));\n const gradient = Math.abs((h2 - h1) / (2 * delta));\n\n // Specular is strongest where the surface curves most (high gradient)\n // Use smooth falloff with power curve\n specularIntensity = Math.pow(gradient, 0.7) * glassThickness * 0.6;\n\n // Smooth rim highlight using smoothstep instead of linear\n const rimStart = 0.25;\n if (normalizedDist < rimStart) {\n const rimT = 1 - (normalizedDist / rimStart);\n // Smoothstep for soft falloff\n const smoothRim = rimT * rimT * (3 - 2 * rimT);\n specularIntensity += smoothRim * 0.3;\n }\n\n specularIntensity = Math.min(1, specularIntensity);\n }\n\n // Encode as grayscale (white = specular highlight)\n const value = Math.round(specularIntensity * 255);\n const idx = (y * width + x) * 4;\n data[idx] = value;\n data[idx + 1] = value;\n data[idx + 2] = value;\n data[idx + 3] = 255;\n }\n }\n\n ctx.putImageData(imageData, 0, 0);\n return canvas.toDataURL('image/png');\n}\n\n// ============================================================\n// Cached Public API\n// ============================================================\n\n/**\n * Generate a displacement map (with caching)\n * @param config - Liquid glass configuration\n * @returns Data URL of the displacement map image\n */\nexport function generateDisplacementMap(config: LiquidGlassConfig): string {\n return getCachedMaps(config).displacement;\n}\n\n/**\n * Generate a specular map (with caching)\n * @param config - Liquid glass configuration\n * @returns Data URL of the specular map image\n */\nexport function generateSpecularMap(config: LiquidGlassConfig): string {\n return getCachedMaps(config).specular;\n}\n\n/**\n * Check if the browser supports backdrop-filter with SVG filters\n * @returns true if supported (Chrome only), false otherwise (Safari, Firefox)\n */\nexport function supportsBackdropSvgFilter(): boolean {\n if (typeof window === 'undefined' || typeof navigator === 'undefined') {\n return false;\n }\n\n const ua = navigator.userAgent;\n\n // Chrome/Chromium-based browsers only (not Safari, not Firefox)\n // Safari's UA includes both \"Safari\" and may include \"Chrome\" in some cases\n // Firefox has \"Firefox\" in UA\n const isSafari = /Safari\\//.test(ua) && !/Chrome\\//.test(ua);\n const isFirefox = /Firefox\\//.test(ua);\n\n // Real Chrome: has \"Chrome/\" and is not Safari or Firefox\n // (Chrome's UA contains \"Safari\" but also \"Chrome\", pure Safari doesn't have \"Chrome\")\n const isChrome = /Chrome\\//.test(ua) && !isSafari && !isFirefox;\n\n return isChrome;\n}\n\nexport { getProfileFunction, smootherstep };\n","/**\n * LiquidGlassFilter Component\n *\n * Renders an SVG filter that applies the displacement map\n * for the liquid glass refraction effect.\n */\n\nimport React, { useMemo } from 'react';\n\nexport interface LiquidGlassFilterProps {\n /** Unique ID for the filter */\n filterId: string;\n /** Data URL of the displacement map image */\n displacementMapUrl: string;\n /** Data URL of the specular highlight map */\n specularMapUrl: string;\n /** Width of the element */\n width: number;\n /** Height of the element */\n height: number;\n /** Scale of the displacement effect (animatable) */\n scale: number;\n /** Saturation boost (default: 1.2) */\n saturation?: number;\n /** Blur amount for frosted glass effect (default: 1) */\n blurAmount?: number;\n /** Specular highlight intensity (default: 0.25) */\n specularIntensity?: number;\n}\n\n/**\n * SVG filter component that creates the liquid glass displacement effect.\n * Must be rendered in the DOM for the backdrop-filter to reference it.\n *\n * Filter chain:\n * 1. Blur source for frosted glass\n * 2. Apply displacement map for refraction\n * 3. Boost saturation\n * 4. Add specular highlights\n */\nexport const LiquidGlassFilter: React.FC<LiquidGlassFilterProps> = ({\n filterId,\n displacementMapUrl,\n specularMapUrl,\n width,\n height,\n scale,\n saturation = 1.2,\n blurAmount = 1,\n specularIntensity = 0.25,\n}) => {\n // Memoize the SVG to prevent unnecessary re-renders\n const filterSvg = useMemo(\n () => (\n <svg\n style={{\n position: 'absolute',\n width: 0,\n height: 0,\n overflow: 'hidden',\n pointerEvents: 'none',\n }}\n aria-hidden=\"true\"\n >\n <defs>\n <filter\n id={filterId}\n x=\"-50%\"\n y=\"-50%\"\n width=\"200%\"\n height=\"200%\"\n colorInterpolationFilters=\"sRGB\"\n >\n {/* 1. Light blur for frosted glass (kept minimal for refraction clarity) */}\n <feGaussianBlur in=\"SourceGraphic\" stdDeviation={blurAmount} result=\"blurred\" />\n\n {/* 2. Load the displacement map */}\n <feImage\n href={displacementMapUrl}\n x=\"0\"\n y=\"0\"\n width={width}\n height={height}\n result=\"displacement_map\"\n preserveAspectRatio=\"none\"\n />\n\n {/* 3. Apply displacement map for refraction */}\n <feDisplacementMap\n in=\"blurred\"\n in2=\"displacement_map\"\n scale={scale}\n xChannelSelector=\"R\"\n yChannelSelector=\"G\"\n result=\"displaced\"\n />\n\n {/* 4. Boost saturation for vivid glass effect */}\n <feColorMatrix\n in=\"displaced\"\n type=\"saturate\"\n values={String(saturation)}\n result=\"saturated\"\n />\n\n {/* 5. Load dedicated specular map */}\n <feImage\n href={specularMapUrl}\n x=\"0\"\n y=\"0\"\n width={width}\n height={height}\n result=\"specular_map_raw\"\n preserveAspectRatio=\"none\"\n />\n\n {/* 6. Blur the specular map to soften hard edges/triangles */}\n <feGaussianBlur in=\"specular_map_raw\" stdDeviation=\"3\" result=\"specular_map\" />\n\n {/* 7. Apply white specular highlight using softened map */}\n <feFlood floodColor=\"white\" floodOpacity={specularIntensity * 0.5} result=\"white\" />\n <feComposite in=\"white\" in2=\"specular_map\" operator=\"in\" result=\"highlight\" />\n\n {/* 8. Blend specular with saturated image */}\n <feBlend in=\"highlight\" in2=\"saturated\" mode=\"screen\" result=\"final\" />\n </filter>\n </defs>\n </svg>\n ),\n [filterId, displacementMapUrl, specularMapUrl, width, height, scale, saturation, blurAmount, specularIntensity]\n );\n\n return filterSvg;\n};\n\n/**\n * Generate a unique filter ID\n * @param prefix - Optional prefix for the ID\n * @returns Unique filter ID string\n */\nexport function generateFilterId(prefix: string = 'liquid-glass'): string {\n return `${prefix}-${Math.random().toString(36).substr(2, 9)}`;\n}\n\nexport default LiquidGlassFilter;\n","/**\n * useLiquidGlass Hook\n *\n * React hook for applying physics-based liquid glass refraction effect.\n * Integrates with TekiyoPhysics engine for smooth animations.\n */\n\nimport { useState, useEffect, useCallback, useRef, useMemo } from 'react';\nimport React from 'react';\nimport { PhysicsEngine, generatePhysicsId } from '../../core/PhysicsEngine';\nimport { Spring1D } from '../../core/Spring';\nimport {\n UseLiquidGlassOptions,\n UseLiquidGlassReturn,\n DEFAULT_LIQUID_GLASS_CONFIG,\n LiquidGlassConfig,\n} from './types';\nimport {\n generateDisplacementMap,\n generateSpecularMap,\n supportsBackdropSvgFilter,\n} from './DisplacementMapGenerator';\nimport { LiquidGlassFilter, generateFilterId } from './LiquidGlassFilter';\n\n/**\n * Hook for applying liquid glass refraction effect to an element.\n *\n * @param options - Configuration options\n * @returns Filter component, styles, and control functions\n *\n * @example\n * ```tsx\n * const { filterComponent, style, setScale } = useLiquidGlass({\n * width: 200,\n * height: 60,\n * profile: 'squircle'\n * });\n *\n * return (\n * <>\n * {filterComponent}\n * <button\n * style={style}\n * onMouseEnter={() => setScale(100)}\n * onMouseLeave={() => setScale(70)}\n * >\n * Click Me\n * </button>\n * </>\n * );\n * ```\n */\nexport function useLiquidGlass(options: UseLiquidGlassOptions): UseLiquidGlassReturn {\n const {\n width,\n height,\n profile = DEFAULT_LIQUID_GLASS_CONFIG.profile,\n bezelWidth = DEFAULT_LIQUID_GLASS_CONFIG.bezelWidth,\n glassThickness = DEFAULT_LIQUID_GLASS_CONFIG.glassThickness,\n refractiveIndex = DEFAULT_LIQUID_GLASS_CONFIG.refractiveIndex,\n animated = true,\n saturation = 1.3,\n blurAmount = 1,\n specularIntensity = 0.3,\n } = options;\n\n // State\n const [scale, setScaleState] = useState(DEFAULT_LIQUID_GLASS_CONFIG.scale);\n const [displacementMapUrl, setDisplacementMapUrl] = useState<string>('');\n const [specularMapUrl, setSpecularMapUrl] = useState<string>('');\n\n // Refs for physics\n const scaleSpringRef = useRef<Spring1D | null>(null);\n const physicsIdRef = useRef(generatePhysicsId('liquid-glass'));\n const filterIdRef = useRef(generateFilterId());\n\n // Check browser support\n const isSupported = useMemo(() => supportsBackdropSvgFilter(), []);\n\n // Generate displacement and specular maps when config changes\n useEffect(() => {\n const config: LiquidGlassConfig = {\n width,\n height,\n bezelWidth,\n glassThickness,\n refractiveIndex,\n profile,\n scale,\n };\n\n const dispMapUrl = generateDisplacementMap(config);\n const specMapUrl = generateSpecularMap(config);\n setDisplacementMapUrl(dispMapUrl);\n setSpecularMapUrl(specMapUrl);\n }, [width, height, bezelWidth, glassThickness, refractiveIndex, profile]);\n\n // Initialize spring\n useEffect(() => {\n scaleSpringRef.current = new Spring1D(scale, {\n tension: 200,\n friction: 20,\n mass: 1,\n precision: 0.5,\n });\n\n return () => {\n PhysicsEngine.unregister(physicsIdRef.current);\n };\n }, []);\n\n // Animate scale with physics\n const setScale = useCallback(\n (targetScale: number) => {\n if (!animated) {\n setScaleState(targetScale);\n return;\n }\n\n if (!scaleSpringRef.current) {\n scaleSpringRef.current = new Spring1D(scale, {\n tension: 200,\n friction: 20,\n mass: 1,\n precision: 0.5,\n });\n }\n\n scaleSpringRef.current.setTarget(targetScale);\n\n if (!PhysicsEngine.has(physicsIdRef.current)) {\n PhysicsEngine.register(physicsIdRef.current, (dt) => {\n if (!scaleSpringRef.current) return;\n\n const result = scaleSpringRef.current.step(dt);\n setScaleState(result.value);\n\n if (result.isSettled) {\n PhysicsEngine.unregister(physicsIdRef.current);\n }\n });\n }\n },\n [animated, scale]\n );\n\n // Create filter component (only for Chrome)\n const filterComponent = useMemo(() => {\n // Only render SVG filter for Chrome - other browsers don't support SVG in backdrop-filter\n if (!displacementMapUrl || !specularMapUrl || !isSupported) {\n return null;\n }\n\n return React.createElement(LiquidGlassFilter, {\n filterId: filterIdRef.current,\n displacementMapUrl,\n specularMapUrl,\n width,\n height,\n scale,\n saturation,\n blurAmount,\n specularIntensity,\n });\n }, [displacementMapUrl, specularMapUrl, width, height, scale, isSupported, saturation, blurAmount, specularIntensity]);\n\n // Create style object\n // Chrome: backdrop-filter with SVG for true liquid glass refraction\n // Safari/Firefox: simple blur fallback (no SVG filter support in backdrop-filter)\n const style: React.CSSProperties = useMemo(() => {\n if (!isSupported) {\n // Fallback for unsupported browsers (Safari, Firefox)\n // Just use simple glassmorphism blur - no refraction possible\n return {\n backdropFilter: 'blur(12px) saturate(1.2)',\n WebkitBackdropFilter: 'blur(12px) saturate(1.2)',\n };\n }\n\n // Chrome: use SVG filter in backdrop-filter for true liquid glass\n return {\n backdropFilter: `url(#${filterIdRef.current})`,\n WebkitBackdropFilter: `url(#${filterIdRef.current})`,\n };\n }, [isSupported]);\n\n return {\n filterComponent,\n style,\n setScale,\n scale,\n isSupported,\n };\n}\n\nexport default useLiquidGlass;\n"],"names":["createContext","useMemo","jsx","useContext","useRef","useState","useEffect","useCallback","state","_b","_a","forwardRef","s","jsxs","targetPercent"],"mappings":"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"}
|