tekiyo-physics 1.0.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.
@@ -0,0 +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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"}