@hapticjs/core 0.2.0 → 0.3.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types/config.ts","../src/adapters/noop.adapter.ts","../src/utils/scheduling.ts","../src/adapters/web-vibration.adapter.ts","../src/adapters/ios-audio.adapter.ts","../src/utils/platform.ts","../src/engine/capability-detector.ts","../src/engine/adaptive-engine.ts","../src/engine/fallback-manager.ts","../src/composer/pattern-composer.ts","../src/patterns/tokenizer.ts","../src/patterns/parser.ts","../src/patterns/compiler.ts","../src/engine/haptic-engine.ts","../src/patterns/validator.ts","../src/patterns/sharing.ts","../src/presets/ui.ts","../src/presets/notifications.ts","../src/presets/gaming.ts","../src/presets/accessibility.ts","../src/presets/system.ts","../src/presets/index.ts","../src/index.ts"],"names":["totalDuration","presets"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { HapticAdapter } from './adapter';\n\n/** Visual fallback style when haptics are unavailable */\nexport type VisualFallbackStyle = 'flash' | 'shake' | 'pulse';\n\n/** Fallback configuration for non-haptic feedback */\nexport interface FallbackConfig {\n type: 'none' | 'visual' | 'audio' | 'both';\n visual?: {\n /** Element to animate */\n element?: HTMLElement;\n /** CSS class to toggle */\n className?: string;\n /** Animation style */\n style?: VisualFallbackStyle;\n };\n audio?: {\n enabled: boolean;\n /** Volume from 0 to 1 */\n volume: number;\n };\n}\n\n/** Main configuration for the haptic engine */\nexport interface HapticConfig {\n /** Explicitly set an adapter (overrides auto-detection) */\n adapter?: HapticAdapter;\n /** Global intensity multiplier (0.0 to 1.0) */\n intensity: number;\n /** Whether haptics are enabled */\n enabled: boolean;\n /** Fallback when haptics are unavailable */\n fallback: FallbackConfig;\n /** Respect system haptic settings */\n respectSystemSettings: boolean;\n}\n\n/** Default configuration */\nexport const DEFAULT_CONFIG: HapticConfig = {\n intensity: 1.0,\n enabled: true,\n fallback: { type: 'none' },\n respectSystemSettings: true,\n};\n","import type { HapticAdapter, AdapterCapabilities, HapticStep } from '../types';\n\n/**\n * No-op adapter — used in SSR, Node, or when no haptic hardware is available.\n * Silently accepts all calls without doing anything.\n */\nexport class NoopAdapter implements HapticAdapter {\n readonly name = 'noop';\n readonly supported = false;\n\n capabilities(): AdapterCapabilities {\n return {\n maxIntensityLevels: 0,\n minDuration: 0,\n maxDuration: 0,\n supportsPattern: false,\n supportsIntensity: false,\n dualMotor: false,\n };\n }\n\n async pulse(_intensity: number, _duration: number): Promise<void> {\n // No-op\n }\n\n async playSequence(_steps: HapticStep[]): Promise<void> {\n // No-op\n }\n\n cancel(): void {\n // No-op\n }\n\n dispose(): void {\n // No-op\n }\n}\n","/** Scheduling utilities for timed haptic playback */\n\nexport function delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n}\n\nexport function normalizeIntensity(intensity: number): number {\n return clamp(intensity, 0, 1);\n}\n","import type { HapticAdapter, AdapterCapabilities, HapticStep } from '../types';\nimport { delay } from '../utils/scheduling';\n\n/**\n * Web Vibration API adapter.\n * Uses navigator.vibrate() — supported on Android browsers.\n * Intensity is simulated via PWM (rapid on/off) since the API only supports on/off.\n */\nexport class WebVibrationAdapter implements HapticAdapter {\n readonly name = 'web-vibration';\n readonly supported: boolean;\n\n private _cancelled = false;\n\n constructor() {\n this.supported =\n typeof navigator !== 'undefined' && 'vibrate' in navigator;\n }\n\n capabilities(): AdapterCapabilities {\n return {\n maxIntensityLevels: 1, // on/off only\n minDuration: 10,\n maxDuration: 10000,\n supportsPattern: true,\n supportsIntensity: false,\n dualMotor: false,\n };\n }\n\n async pulse(_intensity: number, duration: number): Promise<void> {\n if (!this.supported) return;\n navigator.vibrate(duration);\n }\n\n async playSequence(steps: HapticStep[]): Promise<void> {\n if (!this.supported || steps.length === 0) return;\n\n this._cancelled = false;\n\n // Convert to Vibration API pattern: [vibrate, pause, vibrate, pause, ...]\n const pattern = this._toVibrationPattern(steps);\n\n // If it's a simple pattern, use native pattern support\n if (this._canUseNativePattern(steps)) {\n navigator.vibrate(pattern);\n return;\n }\n\n // For complex patterns (intensity variation), play step by step\n for (const step of steps) {\n if (this._cancelled) break;\n\n if (step.type === 'vibrate') {\n if (step.intensity > 0.1) {\n // Simulate intensity via PWM for lower intensities\n if (step.intensity < 0.5) {\n await this._pwmVibrate(step.duration, step.intensity);\n } else {\n navigator.vibrate(step.duration);\n await delay(step.duration);\n }\n } else {\n await delay(step.duration);\n }\n } else {\n await delay(step.duration);\n }\n }\n }\n\n cancel(): void {\n this._cancelled = true;\n if (this.supported) {\n navigator.vibrate(0);\n }\n }\n\n dispose(): void {\n this.cancel();\n }\n\n /** Convert steps to Vibration API pattern array */\n private _toVibrationPattern(steps: HapticStep[]): number[] {\n const pattern: number[] = [];\n for (const step of steps) {\n pattern.push(step.duration);\n }\n return pattern;\n }\n\n /** Check if all steps can be played with native pattern (no intensity variation) */\n private _canUseNativePattern(steps: HapticStep[]): boolean {\n return steps.every(\n (s) =>\n (s.type === 'pause') ||\n (s.type === 'vibrate' && s.intensity >= 0.5)\n );\n }\n\n /** Simulate lower intensity via pulse-width modulation */\n private async _pwmVibrate(duration: number, intensity: number): Promise<void> {\n const cycleTime = 20; // ms per PWM cycle\n const onTime = Math.round(cycleTime * intensity);\n const offTime = cycleTime - onTime;\n const cycles = Math.floor(duration / cycleTime);\n\n const pattern: number[] = [];\n for (let i = 0; i < cycles; i++) {\n pattern.push(onTime, offTime);\n }\n\n if (pattern.length > 0) {\n navigator.vibrate(pattern);\n await delay(duration);\n }\n }\n}\n","import type { HapticAdapter, AdapterCapabilities, HapticStep } from '../types';\nimport { delay } from '../utils/scheduling';\n\n/**\n * iOS Audio workaround adapter.\n * Uses AudioContext to generate short, low-frequency oscillator tones (20-60 Hz)\n * that create a subtle physical sensation through device speakers.\n * This is a fallback for iOS Safari, which does not support the Vibration API.\n */\nexport class IoSAudioAdapter implements HapticAdapter {\n readonly name = 'ios-audio';\n readonly supported: boolean;\n\n private _audioCtx: AudioContext | null = null;\n private _activeOscillator: OscillatorNode | null = null;\n private _activeGain: GainNode | null = null;\n private _cancelled = false;\n\n constructor() {\n this.supported = this._detectSupport();\n }\n\n capabilities(): AdapterCapabilities {\n return {\n maxIntensityLevels: 100,\n minDuration: 5,\n maxDuration: 5000,\n supportsPattern: true,\n supportsIntensity: true,\n dualMotor: false,\n };\n }\n\n async pulse(intensity: number, duration: number): Promise<void> {\n if (!this.supported) return;\n await this._playTone(intensity, duration);\n }\n\n async playSequence(steps: HapticStep[]): Promise<void> {\n if (!this.supported || steps.length === 0) return;\n\n this._cancelled = false;\n\n for (const step of steps) {\n if (this._cancelled) break;\n\n if (step.type === 'vibrate' && step.intensity > 0) {\n await this._playTone(step.intensity, step.duration);\n } else {\n await delay(step.duration);\n }\n }\n }\n\n cancel(): void {\n this._cancelled = true;\n this._stopOscillator();\n }\n\n dispose(): void {\n this.cancel();\n if (this._audioCtx) {\n void this._audioCtx.close();\n this._audioCtx = null;\n }\n }\n\n // ─── Internal ──────────────────────────────────────────────\n\n private _detectSupport(): boolean {\n if (typeof window === 'undefined') return false;\n\n const hasAudioContext =\n typeof AudioContext !== 'undefined' ||\n typeof (window as unknown as Record<string, unknown>).webkitAudioContext !== 'undefined';\n\n if (!hasAudioContext) return false;\n\n // Check for iOS platform\n const ua = navigator.userAgent;\n const isIOS =\n /iPad|iPhone|iPod/.test(ua) ||\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1);\n\n return isIOS;\n }\n\n /** Get or create the AudioContext, resuming if suspended */\n private async _getAudioContext(): Promise<AudioContext> {\n if (!this._audioCtx) {\n const Ctor =\n typeof AudioContext !== 'undefined'\n ? AudioContext\n : ((window as unknown as Record<string, unknown>).webkitAudioContext as typeof AudioContext);\n this._audioCtx = new Ctor();\n }\n\n if (this._audioCtx.state === 'suspended') {\n await this._audioCtx.resume();\n }\n\n return this._audioCtx;\n }\n\n /** Map intensity (0-1) to frequency in the 20-60 Hz sub-bass range */\n private _intensityToFrequency(intensity: number): number {\n return 20 + intensity * 40; // 20 Hz at 0 intensity, 60 Hz at full\n }\n\n /** Play a single oscillator tone for the given duration */\n private async _playTone(intensity: number, duration: number): Promise<void> {\n const ctx = await this._getAudioContext();\n\n const oscillator = ctx.createOscillator();\n const gainNode = ctx.createGain();\n\n oscillator.type = 'sine';\n oscillator.frequency.setValueAtTime(\n this._intensityToFrequency(intensity),\n ctx.currentTime,\n );\n\n gainNode.gain.setValueAtTime(intensity, ctx.currentTime);\n\n oscillator.connect(gainNode);\n gainNode.connect(ctx.destination);\n\n this._activeOscillator = oscillator;\n this._activeGain = gainNode;\n\n oscillator.start(ctx.currentTime);\n oscillator.stop(ctx.currentTime + duration / 1000);\n\n await new Promise<void>((resolve) => {\n oscillator.onended = () => {\n oscillator.disconnect();\n gainNode.disconnect();\n this._activeOscillator = null;\n this._activeGain = null;\n resolve();\n };\n });\n }\n\n /** Immediately stop the active oscillator if any */\n private _stopOscillator(): void {\n if (this._activeOscillator) {\n try {\n this._activeOscillator.stop();\n this._activeOscillator.disconnect();\n } catch {\n // Already stopped — ignore\n }\n this._activeOscillator = null;\n }\n\n if (this._activeGain) {\n try {\n this._activeGain.disconnect();\n } catch {\n // Already disconnected — ignore\n }\n this._activeGain = null;\n }\n }\n}\n","/** Platform detection utilities */\n\nexport interface PlatformInfo {\n isWeb: boolean;\n isNode: boolean;\n isReactNative: boolean;\n hasVibrationAPI: boolean;\n hasGamepadAPI: boolean;\n isIOS: boolean;\n isAndroid: boolean;\n isMobile: boolean;\n}\n\nexport function detectPlatform(): PlatformInfo {\n const isWeb = typeof window !== 'undefined' && typeof document !== 'undefined';\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n const isNode =\n typeof globalThis !== 'undefined' &&\n typeof (globalThis as Record<string, unknown>).process === 'object' &&\n typeof ((globalThis as Record<string, unknown>).process as Record<string, unknown>)?.versions === 'object';\n const isReactNative =\n typeof navigator !== 'undefined' && navigator.product === 'ReactNative';\n\n const hasVibrationAPI = isWeb && 'vibrate' in navigator;\n const hasGamepadAPI = isWeb && 'getGamepads' in navigator;\n\n const ua = isWeb ? navigator.userAgent : '';\n const isIOS = /iPad|iPhone|iPod/.test(ua) || (isWeb && navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1);\n const isAndroid = /Android/.test(ua);\n const isMobile = isIOS || isAndroid;\n\n return {\n isWeb,\n isNode,\n isReactNative,\n hasVibrationAPI,\n hasGamepadAPI,\n isIOS,\n isAndroid,\n isMobile,\n };\n}\n","import type { HapticAdapter } from '../types';\nimport { NoopAdapter } from '../adapters/noop.adapter';\nimport { WebVibrationAdapter } from '../adapters/web-vibration.adapter';\nimport { IoSAudioAdapter } from '../adapters/ios-audio.adapter';\nimport { detectPlatform } from '../utils/platform';\n\n/**\n * Auto-detect the best available haptic adapter for the current platform.\n */\nexport function detectAdapter(): HapticAdapter {\n const platform = detectPlatform();\n\n // Web browser with Vibration API support\n if (platform.hasVibrationAPI) {\n return new WebVibrationAdapter();\n }\n\n // iOS fallback: use AudioContext to simulate haptic feedback\n if (platform.isIOS && platform.isWeb) {\n const iosAdapter = new IoSAudioAdapter();\n if (iosAdapter.supported) {\n return iosAdapter;\n }\n }\n\n // Fallback to no-op (SSR, Node, unsupported browsers)\n return new NoopAdapter();\n}\n","import type { HapticStep, AdapterCapabilities } from '../types';\nimport { clamp } from '../utils/scheduling';\n\n/**\n * Adapts ideal haptic patterns to what the device can actually produce.\n * Handles intensity quantization, duration clamping, and step merging.\n */\nexport class AdaptiveEngine {\n adapt(steps: HapticStep[], capabilities: AdapterCapabilities): HapticStep[] {\n return steps.map((step) => this._adaptStep(step, capabilities));\n }\n\n private _adaptStep(step: HapticStep, caps: AdapterCapabilities): HapticStep {\n const adapted = { ...step };\n\n // Clamp duration\n if (adapted.type === 'vibrate') {\n adapted.duration = clamp(adapted.duration, caps.minDuration, caps.maxDuration);\n }\n\n // Quantize intensity if device has limited levels\n if (!caps.supportsIntensity && adapted.type === 'vibrate') {\n // On/off only — threshold at 0.1\n adapted.intensity = adapted.intensity > 0.1 ? 1.0 : 0;\n } else if (caps.maxIntensityLevels > 1 && caps.maxIntensityLevels < 100) {\n // Quantize to available levels\n const levels = caps.maxIntensityLevels;\n adapted.intensity = Math.round(adapted.intensity * levels) / levels;\n }\n\n return adapted;\n }\n}\n","import type { FallbackConfig, HapticStep } from '../types';\n\n/**\n * Provides visual/audio fallback when haptic hardware is unavailable.\n */\nexport class FallbackManager {\n private config: FallbackConfig;\n\n constructor(config: FallbackConfig) {\n this.config = config;\n }\n\n updateConfig(config: FallbackConfig): void {\n this.config = config;\n }\n\n /** Execute fallback feedback for the given steps */\n async execute(steps: HapticStep[]): Promise<void> {\n if (this.config.type === 'none') return;\n\n const totalDuration = steps.reduce((sum, s) => sum + s.duration, 0);\n const maxIntensity = Math.max(...steps.filter((s) => s.type === 'vibrate').map((s) => s.intensity), 0);\n\n if (this.config.type === 'visual' || this.config.type === 'both') {\n await this._visualFallback(totalDuration, maxIntensity);\n }\n\n if (this.config.type === 'audio' || this.config.type === 'both') {\n await this._audioFallback(totalDuration, maxIntensity);\n }\n }\n\n private async _visualFallback(duration: number, intensity: number): Promise<void> {\n const visual = this.config.visual;\n if (!visual || typeof document === 'undefined') return;\n\n const element = visual.element ?? document.body;\n const style = visual.style ?? 'pulse';\n const className = visual.className;\n\n if (className) {\n element.classList.add(className);\n setTimeout(() => element.classList.remove(className), duration);\n return;\n }\n\n // Built-in visual feedback\n switch (style) {\n case 'flash': {\n const opacity = 0.1 + intensity * 0.3;\n const overlay = document.createElement('div');\n Object.assign(overlay.style, {\n position: 'fixed',\n inset: '0',\n backgroundColor: `rgba(0, 0, 0, ${opacity})`,\n pointerEvents: 'none',\n zIndex: '99999',\n transition: `opacity ${duration}ms ease-out`,\n });\n document.body.appendChild(overlay);\n requestAnimationFrame(() => {\n overlay.style.opacity = '0';\n });\n setTimeout(() => overlay.remove(), duration + 100);\n break;\n }\n case 'shake': {\n const magnitude = Math.round(intensity * 5);\n element.style.transition = 'none';\n element.style.transform = `translateX(${magnitude}px)`;\n setTimeout(() => {\n element.style.transition = `transform ${duration}ms ease-out`;\n element.style.transform = '';\n }, 50);\n break;\n }\n case 'pulse': {\n const scale = 1 + intensity * 0.02;\n element.style.transition = `transform ${duration}ms ease-out`;\n element.style.transform = `scale(${scale})`;\n setTimeout(() => {\n element.style.transform = '';\n }, duration);\n break;\n }\n }\n }\n\n private async _audioFallback(duration: number, intensity: number): Promise<void> {\n const audio = this.config.audio;\n if (!audio?.enabled || typeof AudioContext === 'undefined') return;\n\n try {\n const ctx = new AudioContext();\n const oscillator = ctx.createOscillator();\n const gainNode = ctx.createGain();\n\n oscillator.connect(gainNode);\n gainNode.connect(ctx.destination);\n\n oscillator.frequency.value = 200 + intensity * 200;\n gainNode.gain.value = audio.volume * intensity * 0.1;\n\n oscillator.start();\n oscillator.stop(ctx.currentTime + duration / 1000);\n\n await new Promise<void>((resolve) => {\n oscillator.onended = () => {\n ctx.close();\n resolve();\n };\n });\n } catch {\n // Audio fallback is best-effort\n }\n }\n}\n","import type { HapticStep, EasingFunction } from '../types';\n\n/**\n * Fluent builder for composing haptic patterns programmatically.\n *\n * Usage:\n * const pattern = new PatternComposer()\n * .tap(0.5)\n * .pause(100)\n * .ramp(0.2, 1.0, 300)\n * .buzz(200)\n * .build();\n */\nexport class PatternComposer {\n private steps: HapticStep[] = [];\n private _onPlay?: (steps: HapticStep[]) => Promise<void>;\n\n /** Register a play callback (used by HapticEngine) */\n onPlay(fn: (steps: HapticStep[]) => Promise<void>): this {\n this._onPlay = fn;\n return this;\n }\n\n /** Add a short tap vibration */\n tap(intensity = 0.6): this {\n this.steps.push({ type: 'vibrate', duration: 10, intensity });\n return this;\n }\n\n /** Add a vibration with specified duration and intensity */\n vibrate(duration: number, intensity = 1.0): this {\n this.steps.push({ type: 'vibrate', duration, intensity });\n return this;\n }\n\n /** Add a buzz (medium-length vibration) */\n buzz(duration = 100, intensity = 0.7): this {\n this.steps.push({ type: 'vibrate', duration, intensity });\n return this;\n }\n\n /** Add a pause */\n pause(duration = 50): this {\n this.steps.push({ type: 'pause', duration, intensity: 0 });\n return this;\n }\n\n /** Add an intensity ramp from start to end intensity over duration */\n ramp(\n startIntensity: number,\n endIntensity: number,\n duration: number,\n easing: EasingFunction = 'linear',\n ): this {\n const stepCount = Math.max(1, Math.floor(duration / 20));\n const stepDuration = duration / stepCount;\n\n for (let i = 0; i < stepCount; i++) {\n const t = i / (stepCount - 1 || 1);\n const easedT = applyEasing(t, easing);\n const intensity = startIntensity + (endIntensity - startIntensity) * easedT;\n this.steps.push({ type: 'vibrate', duration: stepDuration, intensity });\n }\n\n return this;\n }\n\n /** Add a pulse pattern (on-off-on-off) */\n pulse(count: number, onDuration = 50, offDuration = 50, intensity = 0.8): this {\n for (let i = 0; i < count; i++) {\n this.steps.push({ type: 'vibrate', duration: onDuration, intensity });\n if (i < count - 1) {\n this.steps.push({ type: 'pause', duration: offDuration, intensity: 0 });\n }\n }\n return this;\n }\n\n /** Repeat the entire current sequence N times */\n repeat(times: number): this {\n const original = [...this.steps];\n for (let i = 1; i < times; i++) {\n this.steps.push(...original.map((s) => ({ ...s })));\n }\n return this;\n }\n\n /** Build and return the step array */\n build(): HapticStep[] {\n return [...this.steps];\n }\n\n /** Build and immediately play the pattern */\n async play(): Promise<void> {\n if (this._onPlay) {\n await this._onPlay(this.steps);\n }\n }\n\n /** Reset the composer */\n clear(): this {\n this.steps = [];\n return this;\n }\n\n /** Get total duration in ms */\n get duration(): number {\n return this.steps.reduce((sum, s) => sum + s.duration, 0);\n }\n}\n\nfunction applyEasing(t: number, easing: EasingFunction): number {\n switch (easing) {\n case 'linear':\n return t;\n case 'ease-in':\n return t * t;\n case 'ease-out':\n return t * (2 - t);\n case 'ease-in-out':\n return t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t;\n }\n}\n","import type { HPLToken, HPLTokenType } from '../types';\n\nconst TOKEN_MAP: Record<string, HPLTokenType> = {\n '~': 'LIGHT',\n '#': 'MEDIUM',\n '@': 'HEAVY',\n '.': 'PAUSE',\n '|': 'TAP',\n '-': 'SUSTAIN',\n '[': 'GROUP_START',\n ']': 'GROUP_END',\n};\n\nexport class HPLTokenizerError extends Error {\n constructor(\n message: string,\n public readonly position: number,\n ) {\n super(`HPL Tokenizer Error at position ${position}: ${message}`);\n this.name = 'HPLTokenizerError';\n }\n}\n\n/** Tokenize an HPL pattern string into tokens */\nexport function tokenize(input: string): HPLToken[] {\n const tokens: HPLToken[] = [];\n let i = 0;\n\n while (i < input.length) {\n const char = input[i]!;\n\n // Skip whitespace\n if (char === ' ' || char === '\\t' || char === '\\n') {\n i++;\n continue;\n }\n\n // Check for repeat modifier: xN\n if (char === 'x' && i + 1 < input.length) {\n let numStr = '';\n let j = i + 1;\n while (j < input.length && input[j]! >= '0' && input[j]! <= '9') {\n numStr += input[j];\n j++;\n }\n if (numStr.length > 0) {\n tokens.push({\n type: 'REPEAT',\n value: `x${numStr}`,\n repeatCount: parseInt(numStr, 10),\n });\n i = j;\n continue;\n }\n }\n\n // Check known tokens\n const tokenType = TOKEN_MAP[char];\n if (tokenType) {\n tokens.push({ type: tokenType, value: char });\n i++;\n continue;\n }\n\n throw new HPLTokenizerError(`Unexpected character '${char}'`, i);\n }\n\n return tokens;\n}\n","import type {\n HPLToken,\n HPLNode,\n HPLSequenceNode,\n HPLGroupNode,\n HPLVibrateNode,\n HPLPauseNode,\n HPLTapNode,\n HPLSustainNode,\n} from '../types';\nimport { tokenize } from './tokenizer';\n\n/** Duration constants in milliseconds */\nconst UNIT_DURATION = 50;\nconst TAP_DURATION = 10;\n\n/** Intensity levels for vibrate tokens */\nconst INTENSITY_MAP: Record<string, number> = {\n LIGHT: 0.3,\n MEDIUM: 0.6,\n HEAVY: 1.0,\n};\n\nexport class HPLParserError extends Error {\n constructor(message: string) {\n super(`HPL Parser Error: ${message}`);\n this.name = 'HPLParserError';\n }\n}\n\n/**\n * Recursive descent parser for the Haptic Pattern Language (HPL).\n *\n * Grammar:\n * Pattern := Segment+\n * Segment := Group | Atom\n * Group := '[' Segment+ ']' Repeat?\n * Atom := '~' | '#' | '@' | '.' | '|' | '-'\n * Repeat := 'x' Number\n */\nexport class HPLParser {\n private tokens: HPLToken[] = [];\n private pos = 0;\n\n parse(input: string): HPLSequenceNode {\n this.tokens = tokenize(input);\n this.pos = 0;\n\n if (this.tokens.length === 0) {\n return { type: 'sequence', children: [] };\n }\n\n const children = this._parseSegments();\n\n if (this.pos < this.tokens.length) {\n throw new HPLParserError(\n `Unexpected token '${this.tokens[this.pos]!.value}' at position ${this.pos}`,\n );\n }\n\n return { type: 'sequence', children };\n }\n\n private _parseSegments(): HPLNode[] {\n const nodes: HPLNode[] = [];\n while (this.pos < this.tokens.length) {\n const token = this.tokens[this.pos]!;\n\n if (token.type === 'GROUP_END') {\n break; // Let parent group handle this\n }\n\n nodes.push(this._parseSegment());\n }\n return nodes;\n }\n\n private _parseSegment(): HPLNode {\n const token = this.tokens[this.pos]!;\n\n if (token.type === 'GROUP_START') {\n return this._parseGroup();\n }\n\n return this._parseAtom();\n }\n\n private _parseGroup(): HPLGroupNode {\n this.pos++; // consume '['\n\n const children = this._parseSegments();\n\n if (this.pos >= this.tokens.length || this.tokens[this.pos]!.type !== 'GROUP_END') {\n throw new HPLParserError('Unclosed group — expected \"]\"');\n }\n this.pos++; // consume ']'\n\n // Check for repeat modifier\n let repeat = 1;\n if (this.pos < this.tokens.length && this.tokens[this.pos]!.type === 'REPEAT') {\n repeat = this.tokens[this.pos]!.repeatCount ?? 1;\n this.pos++;\n }\n\n return { type: 'group', children, repeat };\n }\n\n private _parseAtom(): HPLNode {\n const token = this.tokens[this.pos]!;\n this.pos++;\n\n switch (token.type) {\n case 'LIGHT':\n case 'MEDIUM':\n case 'HEAVY':\n return this._makeVibrate(token.type);\n case 'PAUSE':\n return this._makePause();\n case 'TAP':\n return this._makeTap();\n case 'SUSTAIN':\n return this._makeSustain();\n default:\n throw new HPLParserError(`Unexpected token type '${token.type}'`);\n }\n }\n\n private _makeVibrate(level: string): HPLVibrateNode {\n return {\n type: 'vibrate',\n intensity: INTENSITY_MAP[level] ?? 0.5,\n duration: UNIT_DURATION,\n };\n }\n\n private _makePause(): HPLPauseNode {\n return { type: 'pause', duration: UNIT_DURATION };\n }\n\n private _makeTap(): HPLTapNode {\n return { type: 'tap', duration: TAP_DURATION, intensity: 1.0 };\n }\n\n private _makeSustain(): HPLSustainNode {\n return { type: 'sustain', extension: UNIT_DURATION };\n }\n}\n\n/** Convenience function to parse an HPL string */\nexport function parseHPL(input: string): HPLSequenceNode {\n const parser = new HPLParser();\n return parser.parse(input);\n}\n","import type { HapticStep } from '../types/haptic-effect';\nimport type { HPLNode, HPLSequenceNode } from '../types/pattern';\n\n/**\n * Compiles an HPL AST into a flat array of HapticSteps.\n * Handles group expansion, sustain merging, and repeat unrolling.\n */\nexport function compile(ast: HPLSequenceNode): HapticStep[] {\n const raw = compileNode(ast);\n return mergeSustains(raw);\n}\n\nfunction compileNode(node: HPLNode): HapticStep[] {\n switch (node.type) {\n case 'vibrate':\n return [{ type: 'vibrate', duration: node.duration, intensity: node.intensity }];\n\n case 'pause':\n return [{ type: 'pause', duration: node.duration, intensity: 0 }];\n\n case 'tap':\n return [{ type: 'vibrate', duration: node.duration, intensity: node.intensity }];\n\n case 'sustain':\n // Sustain is a marker — it extends the previous step during merge\n return [{ type: 'vibrate', duration: node.extension, intensity: -1 }]; // sentinel\n\n case 'group': {\n const groupSteps = node.children.flatMap(compileNode);\n const result: HapticStep[] = [];\n for (let i = 0; i < node.repeat; i++) {\n result.push(...groupSteps.map((s) => ({ ...s })));\n }\n return result;\n }\n\n case 'sequence':\n return node.children.flatMap(compileNode);\n }\n}\n\n/**\n * Merge sustain markers (-) into the preceding step.\n * A sustain with intensity=-1 extends the previous vibrate's duration.\n */\nfunction mergeSustains(steps: HapticStep[]): HapticStep[] {\n const result: HapticStep[] = [];\n\n for (const step of steps) {\n if (step.intensity === -1 && result.length > 0) {\n // Sustain — extend previous step\n const prev = result[result.length - 1]!;\n prev.duration += step.duration;\n } else {\n result.push({ ...step });\n }\n }\n\n return result;\n}\n\n/**\n * Optimize a step sequence by merging adjacent same-type steps.\n */\nexport function optimizeSteps(steps: HapticStep[]): HapticStep[] {\n if (steps.length === 0) return [];\n\n const result: HapticStep[] = [{ ...steps[0]! }];\n\n for (let i = 1; i < steps.length; i++) {\n const current = steps[i]!;\n const prev = result[result.length - 1]!;\n\n // Merge adjacent pauses\n if (current.type === 'pause' && prev.type === 'pause') {\n prev.duration += current.duration;\n continue;\n }\n\n // Merge adjacent vibrates with same intensity\n if (\n current.type === 'vibrate' &&\n prev.type === 'vibrate' &&\n Math.abs(current.intensity - prev.intensity) < 0.01\n ) {\n prev.duration += current.duration;\n continue;\n }\n\n result.push({ ...current });\n }\n\n return result;\n}\n","import type {\n HapticAdapter,\n HapticConfig,\n HapticStep,\n HapticPattern,\n ImpactStyle,\n} from '../types';\nimport { DEFAULT_CONFIG } from '../types';\nimport { detectAdapter } from './capability-detector';\nimport { AdaptiveEngine } from './adaptive-engine';\nimport { FallbackManager } from './fallback-manager';\nimport { PatternComposer } from '../composer/pattern-composer';\nimport { parseHPL } from '../patterns/parser';\nimport { compile, optimizeSteps } from '../patterns/compiler';\nimport { normalizeIntensity } from '../utils/scheduling';\n\n/**\n * The main haptic engine — orchestrates adapters, patterns, and fallbacks.\n *\n * Usage:\n * const engine = HapticEngine.create();\n * engine.tap();\n * engine.success();\n * engine.play('~~..##..@@');\n */\nexport class HapticEngine {\n private adapter: HapticAdapter;\n private config: HapticConfig;\n private adaptive: AdaptiveEngine;\n private fallback: FallbackManager;\n\n constructor(config?: Partial<HapticConfig>) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n this.adapter = this.config.adapter ?? detectAdapter();\n this.adaptive = new AdaptiveEngine();\n this.fallback = new FallbackManager(this.config.fallback);\n }\n\n /** Create a new engine with auto-detected adapter */\n static create(config?: Partial<HapticConfig>): HapticEngine {\n return new HapticEngine(config);\n }\n\n // ─── Semantic API ──────────────────────────────────────────\n\n /** Light tap feedback */\n async tap(intensity = 0.6): Promise<void> {\n await this._playSteps([{ type: 'vibrate', duration: 30, intensity }]);\n }\n\n /** Double tap */\n async doubleTap(intensity = 0.6): Promise<void> {\n await this._playSteps([\n { type: 'vibrate', duration: 10, intensity },\n { type: 'pause', duration: 80, intensity: 0 },\n { type: 'vibrate', duration: 10, intensity },\n ]);\n }\n\n /** Long press feedback */\n async longPress(intensity = 0.8): Promise<void> {\n await this._playSteps([{ type: 'vibrate', duration: 50, intensity }]);\n }\n\n /** Success notification */\n async success(): Promise<void> {\n await this._playSteps([\n { type: 'vibrate', duration: 30, intensity: 0.5 },\n { type: 'pause', duration: 60, intensity: 0 },\n { type: 'vibrate', duration: 40, intensity: 0.8 },\n ]);\n }\n\n /** Warning notification */\n async warning(): Promise<void> {\n await this._playSteps([\n { type: 'vibrate', duration: 40, intensity: 0.7 },\n { type: 'pause', duration: 50, intensity: 0 },\n { type: 'vibrate', duration: 40, intensity: 0.7 },\n { type: 'pause', duration: 50, intensity: 0 },\n { type: 'vibrate', duration: 40, intensity: 0.7 },\n ]);\n }\n\n /** Error notification */\n async error(): Promise<void> {\n await this._playSteps([\n { type: 'vibrate', duration: 80, intensity: 1.0 },\n { type: 'pause', duration: 100, intensity: 0 },\n { type: 'vibrate', duration: 80, intensity: 1.0 },\n ]);\n }\n\n /** Selection change feedback */\n async selection(): Promise<void> {\n await this._playSteps([{ type: 'vibrate', duration: 8, intensity: 0.4 }]);\n }\n\n /** Toggle feedback */\n async toggle(on: boolean): Promise<void> {\n if (on) {\n await this._playSteps([{ type: 'vibrate', duration: 15, intensity: 0.6 }]);\n } else {\n await this._playSteps([{ type: 'vibrate', duration: 10, intensity: 0.3 }]);\n }\n }\n\n /** Impact with style (matches iOS UIImpactFeedbackGenerator) */\n async impact(style: ImpactStyle = 'medium'): Promise<void> {\n const presets: Record<ImpactStyle, HapticStep[]> = {\n light: [{ type: 'vibrate', duration: 10, intensity: 0.3 }],\n medium: [{ type: 'vibrate', duration: 15, intensity: 0.6 }],\n heavy: [{ type: 'vibrate', duration: 25, intensity: 1.0 }],\n rigid: [{ type: 'vibrate', duration: 8, intensity: 0.9 }],\n soft: [{ type: 'vibrate', duration: 30, intensity: 0.4 }],\n };\n await this._playSteps(presets[style]);\n }\n\n // ─── Parametric API ────────────────────────────────────────\n\n /** Vibrate for a specified duration */\n async vibrate(duration: number, intensity = 1.0): Promise<void> {\n await this._playSteps([\n { type: 'vibrate', duration, intensity: normalizeIntensity(intensity) },\n ]);\n }\n\n /**\n * Play a haptic pattern.\n * Accepts:\n * - HPL string: \"~~..##..@@\"\n * - HapticPattern object\n * - Raw HapticStep array\n */\n async play(pattern: string | HapticPattern | HapticStep[]): Promise<void> {\n let steps: HapticStep[];\n\n if (typeof pattern === 'string') {\n const ast = parseHPL(pattern);\n steps = compile(ast);\n } else if (Array.isArray(pattern)) {\n steps = pattern;\n } else {\n steps = pattern.steps;\n }\n\n await this._playSteps(steps);\n }\n\n // ─── Composer ──────────────────────────────────────────────\n\n /** Create a new pattern composer */\n compose(): PatternComposer {\n const composer = new PatternComposer();\n composer.onPlay((steps) => this._playSteps(steps));\n return composer;\n }\n\n // ─── Configuration ─────────────────────────────────────────\n\n /** Update engine configuration */\n configure(config: Partial<HapticConfig>): void {\n Object.assign(this.config, config);\n\n if (config.adapter) {\n this.adapter = config.adapter;\n }\n\n if (config.fallback) {\n this.fallback.updateConfig(this.config.fallback);\n }\n }\n\n /** Check if haptics are supported on this device */\n get isSupported(): boolean {\n return this.adapter.supported;\n }\n\n /** Get the current adapter name */\n get adapterName(): string {\n return this.adapter.name;\n }\n\n // ─── Lifecycle ─────────────────────────────────────────────\n\n /** Cancel any ongoing haptic effect */\n cancel(): void {\n this.adapter.cancel();\n }\n\n /** Clean up resources */\n dispose(): void {\n this.adapter.dispose();\n }\n\n // ─── Internal ──────────────────────────────────────────────\n\n private async _playSteps(steps: HapticStep[]): Promise<void> {\n if (!this.config.enabled || steps.length === 0) return;\n\n // Apply global intensity multiplier\n let adjusted = steps.map((s) => ({\n ...s,\n intensity:\n s.type === 'vibrate'\n ? normalizeIntensity(s.intensity * this.config.intensity)\n : 0,\n }));\n\n // Adapt to device capabilities\n const caps = this.adapter.capabilities();\n adjusted = this.adaptive.adapt(adjusted, caps);\n\n // Optimize\n adjusted = optimizeSteps(adjusted);\n\n if (this.adapter.supported) {\n await this.adapter.playSequence(adjusted);\n } else {\n await this.fallback.execute(adjusted);\n }\n }\n}\n","/** Validate an HPL pattern string and return human-readable errors */\nexport interface ValidationResult {\n valid: boolean;\n errors: string[];\n}\n\nconst VALID_CHARS = new Set('~#@.|\\\\-[] \\t\\nx0123456789');\n\nexport function validateHPL(input: string): ValidationResult {\n const errors: string[] = [];\n\n if (input.length === 0) {\n return { valid: true, errors: [] };\n }\n\n // Check for invalid characters\n for (let i = 0; i < input.length; i++) {\n if (!VALID_CHARS.has(input[i]!)) {\n errors.push(`Invalid character '${input[i]}' at position ${i}`);\n }\n }\n\n // Check bracket matching\n let depth = 0;\n for (let i = 0; i < input.length; i++) {\n if (input[i] === '[') depth++;\n if (input[i] === ']') depth--;\n if (depth < 0) {\n errors.push(`Unmatched ']' at position ${i}`);\n }\n }\n if (depth > 0) {\n errors.push(`${depth} unclosed '[' bracket(s)`);\n }\n\n // Check for empty groups\n for (let i = 0; i < input.length - 1; i++) {\n if (input[i] === '[' && input[i + 1] === ']') {\n errors.push(`Empty group at position ${i}`);\n }\n }\n\n // Check repeat modifiers are after groups or atoms\n for (let i = 0; i < input.length; i++) {\n if (input[i] === 'x' && i + 1 < input.length && /\\d/.test(input[i + 1]!)) {\n if (i === 0) {\n errors.push(`Repeat modifier 'x' at position ${i} must follow a group or atom`);\n }\n }\n }\n\n return { valid: errors.length === 0, errors };\n}\n","import type { HapticStep, HapticPattern } from '../types/haptic-effect';\nimport { parseHPL } from './parser';\nimport { compile } from './compiler';\n\n/** Portable JSON-serializable format for sharing haptic patterns */\nexport interface HapticPatternExport {\n version: 1;\n name: string;\n description?: string;\n /** Original HPL string if pattern was created from HPL */\n hpl?: string;\n /** Compiled haptic steps */\n steps: HapticStep[];\n metadata?: {\n /** Total duration in milliseconds */\n duration: number;\n author?: string;\n tags?: string[];\n /** ISO date string */\n createdAt?: string;\n };\n}\n\n/** Options for exporting a pattern */\nexport interface ExportOptions {\n name?: string;\n description?: string;\n author?: string;\n tags?: string[];\n}\n\n/** Input types accepted by exportPattern */\ntype ExportInput = HapticPattern | HapticStep[] | string;\n\n/**\n * Calculate total duration of a step sequence.\n */\nfunction totalDuration(steps: HapticStep[]): number {\n return steps.reduce((sum, s) => sum + s.duration, 0);\n}\n\n/**\n * Resolve input to steps and optional HPL source string.\n */\nfunction resolveInput(input: ExportInput): { steps: HapticStep[]; hpl?: string; name?: string } {\n // HPL string\n if (typeof input === 'string') {\n const ast = parseHPL(input);\n return { steps: compile(ast), hpl: input };\n }\n\n // HapticStep[]\n if (Array.isArray(input)) {\n return { steps: input };\n }\n\n // HapticPattern\n return { steps: input.steps, name: input.name };\n}\n\n/**\n * Export a haptic pattern as a portable JSON-serializable object.\n *\n * Accepts a HapticPattern, HapticStep[], or HPL string.\n */\nexport function exportPattern(\n input: ExportInput,\n options: ExportOptions = {},\n): HapticPatternExport {\n const resolved = resolveInput(input);\n const steps = resolved.steps;\n const name = options.name ?? resolved.name ?? 'Untitled Pattern';\n\n const result: HapticPatternExport = {\n version: 1,\n name,\n steps,\n };\n\n if (options.description) {\n result.description = options.description;\n }\n\n if (resolved.hpl) {\n result.hpl = resolved.hpl;\n }\n\n const hasMetadataFields = options.author || options.tags;\n if (hasMetadataFields || steps.length > 0) {\n result.metadata = {\n duration: totalDuration(steps),\n createdAt: new Date().toISOString(),\n };\n\n if (options.author) {\n result.metadata.author = options.author;\n }\n\n if (options.tags) {\n result.metadata.tags = options.tags;\n }\n }\n\n return result;\n}\n\n/**\n * Validate that a value looks like a valid HapticPatternExport.\n * Throws descriptive errors for invalid data.\n */\nfunction validateExport(data: unknown): asserts data is HapticPatternExport {\n if (data === null || typeof data !== 'object') {\n throw new Error('Invalid pattern data: expected an object');\n }\n\n const obj = data as Record<string, unknown>;\n\n if (obj.version !== 1) {\n throw new Error(\n `Unsupported pattern version: ${String(obj.version)}. Expected version 1`,\n );\n }\n\n if (typeof obj.name !== 'string' || obj.name.length === 0) {\n throw new Error('Invalid pattern data: \"name\" must be a non-empty string');\n }\n\n if (!Array.isArray(obj.steps)) {\n throw new Error('Invalid pattern data: \"steps\" must be an array');\n }\n\n for (let i = 0; i < obj.steps.length; i++) {\n const step = obj.steps[i] as Record<string, unknown>;\n\n if (step.type !== 'vibrate' && step.type !== 'pause') {\n throw new Error(\n `Invalid step at index ${i}: \"type\" must be \"vibrate\" or \"pause\"`,\n );\n }\n\n if (typeof step.duration !== 'number' || step.duration < 0) {\n throw new Error(\n `Invalid step at index ${i}: \"duration\" must be a non-negative number`,\n );\n }\n\n if (typeof step.intensity !== 'number' || step.intensity < 0 || step.intensity > 1) {\n throw new Error(\n `Invalid step at index ${i}: \"intensity\" must be a number between 0 and 1`,\n );\n }\n }\n}\n\n/**\n * Import a pattern from a HapticPatternExport object or JSON string.\n * Validates the data and returns a HapticPattern.\n */\nexport function importPattern(data: HapticPatternExport | string): HapticPattern {\n const parsed = typeof data === 'string' ? JSON.parse(data) : data;\n validateExport(parsed);\n\n const pattern: HapticPattern = {\n name: parsed.name,\n steps: parsed.steps.map((s) => ({ ...s })),\n };\n\n if (parsed.metadata) {\n pattern.metadata = { ...parsed.metadata };\n }\n\n return pattern;\n}\n\n/**\n * Serialize a pattern to a pretty-printed JSON string.\n */\nexport function patternToJSON(\n input: ExportInput,\n options: ExportOptions = {},\n): string {\n const exported = exportPattern(input, options);\n return JSON.stringify(exported, null, 2);\n}\n\n/**\n * Parse a JSON string into a HapticPattern.\n */\nexport function patternFromJSON(json: string): HapticPattern {\n return importPattern(json);\n}\n\n/**\n * Encode a pattern as a data: URL for easy sharing via links.\n */\nexport function patternToDataURL(\n input: ExportInput,\n options: ExportOptions = {},\n): string {\n const json = patternToJSON(input, options);\n const encoded = btoa(json);\n return `data:application/haptic+json;base64,${encoded}`;\n}\n\n/**\n * Decode a data: URL back to a HapticPattern.\n */\nexport function patternFromDataURL(url: string): HapticPattern {\n const prefix = 'data:application/haptic+json;base64,';\n\n if (!url.startsWith(prefix)) {\n throw new Error(\n 'Invalid haptic data URL: expected \"data:application/haptic+json;base64,\" prefix',\n );\n }\n\n const encoded = url.slice(prefix.length);\n const json = atob(encoded);\n return patternFromJSON(json);\n}\n","import type { HapticPattern } from '../types';\n\n/** UI interaction presets */\nexport const ui = {\n /** Light button tap */\n tap: {\n name: 'ui.tap',\n steps: [{ type: 'vibrate' as const, duration: 10, intensity: 0.6 }],\n },\n\n /** Double tap */\n doubleTap: {\n name: 'ui.doubleTap',\n steps: [\n { type: 'vibrate' as const, duration: 10, intensity: 0.6 },\n { type: 'pause' as const, duration: 80, intensity: 0 },\n { type: 'vibrate' as const, duration: 10, intensity: 0.6 },\n ],\n },\n\n /** Long press acknowledgment */\n longPress: {\n name: 'ui.longPress',\n steps: [{ type: 'vibrate' as const, duration: 50, intensity: 0.8 }],\n },\n\n /** Toggle switch on */\n toggleOn: {\n name: 'ui.toggleOn',\n steps: [{ type: 'vibrate' as const, duration: 15, intensity: 0.6 }],\n },\n\n /** Toggle switch off */\n toggleOff: {\n name: 'ui.toggleOff',\n steps: [{ type: 'vibrate' as const, duration: 10, intensity: 0.3 }],\n },\n\n /** Slider snap to value */\n sliderSnap: {\n name: 'ui.sliderSnap',\n steps: [{ type: 'vibrate' as const, duration: 5, intensity: 0.4 }],\n },\n\n /** Selection changed */\n selection: {\n name: 'ui.selection',\n steps: [{ type: 'vibrate' as const, duration: 8, intensity: 0.4 }],\n },\n\n /** Pull to refresh threshold reached */\n pullToRefresh: {\n name: 'ui.pullToRefresh',\n steps: [\n { type: 'vibrate' as const, duration: 20, intensity: 0.5 },\n { type: 'pause' as const, duration: 40, intensity: 0 },\n { type: 'vibrate' as const, duration: 30, intensity: 0.7 },\n ],\n },\n\n /** Swipe action triggered */\n swipe: {\n name: 'ui.swipe',\n steps: [\n { type: 'vibrate' as const, duration: 12, intensity: 0.4 },\n { type: 'pause' as const, duration: 30, intensity: 0 },\n { type: 'vibrate' as const, duration: 8, intensity: 0.3 },\n ],\n },\n\n /** Context menu appearance */\n contextMenu: {\n name: 'ui.contextMenu',\n steps: [{ type: 'vibrate' as const, duration: 20, intensity: 0.7 }],\n },\n\n /** Drag start */\n dragStart: {\n name: 'ui.dragStart',\n steps: [{ type: 'vibrate' as const, duration: 12, intensity: 0.5 }],\n },\n\n /** Drag drop */\n drop: {\n name: 'ui.drop',\n steps: [\n { type: 'vibrate' as const, duration: 20, intensity: 0.8 },\n { type: 'pause' as const, duration: 30, intensity: 0 },\n { type: 'vibrate' as const, duration: 10, intensity: 0.4 },\n ],\n },\n} satisfies Record<string, HapticPattern>;\n","import type { HapticPattern } from '../types';\n\n/** Notification feedback presets */\nexport const notifications = {\n /** Success — two ascending pulses */\n success: {\n name: 'notifications.success',\n steps: [\n { type: 'vibrate' as const, duration: 30, intensity: 0.5 },\n { type: 'pause' as const, duration: 60, intensity: 0 },\n { type: 'vibrate' as const, duration: 40, intensity: 0.8 },\n ],\n },\n\n /** Warning — three even pulses */\n warning: {\n name: 'notifications.warning',\n steps: [\n { type: 'vibrate' as const, duration: 40, intensity: 0.7 },\n { type: 'pause' as const, duration: 50, intensity: 0 },\n { type: 'vibrate' as const, duration: 40, intensity: 0.7 },\n { type: 'pause' as const, duration: 50, intensity: 0 },\n { type: 'vibrate' as const, duration: 40, intensity: 0.7 },\n ],\n },\n\n /** Error — two heavy pulses */\n error: {\n name: 'notifications.error',\n steps: [\n { type: 'vibrate' as const, duration: 80, intensity: 1.0 },\n { type: 'pause' as const, duration: 100, intensity: 0 },\n { type: 'vibrate' as const, duration: 80, intensity: 1.0 },\n ],\n },\n\n /** Info — soft single pulse */\n info: {\n name: 'notifications.info',\n steps: [\n { type: 'vibrate' as const, duration: 20, intensity: 0.4 },\n ],\n },\n\n /** Message received */\n messageReceived: {\n name: 'notifications.messageReceived',\n steps: [\n { type: 'vibrate' as const, duration: 15, intensity: 0.5 },\n { type: 'pause' as const, duration: 100, intensity: 0 },\n { type: 'vibrate' as const, duration: 15, intensity: 0.5 },\n ],\n },\n\n /** Alarm — urgent repeating pattern */\n alarm: {\n name: 'notifications.alarm',\n steps: [\n { type: 'vibrate' as const, duration: 100, intensity: 1.0 },\n { type: 'pause' as const, duration: 50, intensity: 0 },\n { type: 'vibrate' as const, duration: 100, intensity: 1.0 },\n { type: 'pause' as const, duration: 50, intensity: 0 },\n { type: 'vibrate' as const, duration: 100, intensity: 1.0 },\n { type: 'pause' as const, duration: 200, intensity: 0 },\n { type: 'vibrate' as const, duration: 100, intensity: 1.0 },\n { type: 'pause' as const, duration: 50, intensity: 0 },\n { type: 'vibrate' as const, duration: 100, intensity: 1.0 },\n { type: 'pause' as const, duration: 50, intensity: 0 },\n { type: 'vibrate' as const, duration: 100, intensity: 1.0 },\n ],\n },\n\n /** Reminder — gentle nudge */\n reminder: {\n name: 'notifications.reminder',\n steps: [\n { type: 'vibrate' as const, duration: 25, intensity: 0.5 },\n { type: 'pause' as const, duration: 150, intensity: 0 },\n { type: 'vibrate' as const, duration: 25, intensity: 0.5 },\n ],\n },\n} satisfies Record<string, HapticPattern>;\n","import type { HapticPattern } from '../types';\n\n/** Gaming haptic presets */\nexport const gaming = {\n /** Explosion — heavy descending */\n explosion: {\n name: 'gaming.explosion',\n steps: [\n { type: 'vibrate' as const, duration: 100, intensity: 1.0 },\n { type: 'vibrate' as const, duration: 80, intensity: 0.8 },\n { type: 'vibrate' as const, duration: 60, intensity: 0.5 },\n { type: 'vibrate' as const, duration: 40, intensity: 0.3 },\n { type: 'vibrate' as const, duration: 30, intensity: 0.1 },\n ],\n },\n\n /** Collision — sharp impact */\n collision: {\n name: 'gaming.collision',\n steps: [\n { type: 'vibrate' as const, duration: 30, intensity: 1.0 },\n { type: 'pause' as const, duration: 20, intensity: 0 },\n { type: 'vibrate' as const, duration: 15, intensity: 0.5 },\n ],\n },\n\n /** Heartbeat — rhythmic pulse */\n heartbeat: {\n name: 'gaming.heartbeat',\n steps: [\n { type: 'vibrate' as const, duration: 20, intensity: 0.8 },\n { type: 'pause' as const, duration: 80, intensity: 0 },\n { type: 'vibrate' as const, duration: 30, intensity: 1.0 },\n { type: 'pause' as const, duration: 400, intensity: 0 },\n ],\n },\n\n /** Gunshot — sharp burst */\n gunshot: {\n name: 'gaming.gunshot',\n steps: [\n { type: 'vibrate' as const, duration: 15, intensity: 1.0 },\n { type: 'vibrate' as const, duration: 30, intensity: 0.4 },\n ],\n },\n\n /** Sword clash — metallic ring */\n swordClash: {\n name: 'gaming.swordClash',\n steps: [\n { type: 'vibrate' as const, duration: 10, intensity: 1.0 },\n { type: 'pause' as const, duration: 10, intensity: 0 },\n { type: 'vibrate' as const, duration: 30, intensity: 0.6 },\n { type: 'vibrate' as const, duration: 50, intensity: 0.3 },\n ],\n },\n\n /** Power up — ascending intensity */\n powerUp: {\n name: 'gaming.powerUp',\n steps: [\n { type: 'vibrate' as const, duration: 40, intensity: 0.2 },\n { type: 'vibrate' as const, duration: 40, intensity: 0.4 },\n { type: 'vibrate' as const, duration: 40, intensity: 0.6 },\n { type: 'vibrate' as const, duration: 40, intensity: 0.8 },\n { type: 'vibrate' as const, duration: 60, intensity: 1.0 },\n ],\n },\n\n /** Damage taken — heavy stutter */\n damage: {\n name: 'gaming.damage',\n steps: [\n { type: 'vibrate' as const, duration: 40, intensity: 0.9 },\n { type: 'pause' as const, duration: 20, intensity: 0 },\n { type: 'vibrate' as const, duration: 30, intensity: 0.6 },\n { type: 'pause' as const, duration: 20, intensity: 0 },\n { type: 'vibrate' as const, duration: 20, intensity: 0.3 },\n ],\n },\n\n /** Item pickup — light cheerful */\n pickup: {\n name: 'gaming.pickup',\n steps: [\n { type: 'vibrate' as const, duration: 10, intensity: 0.3 },\n { type: 'pause' as const, duration: 40, intensity: 0 },\n { type: 'vibrate' as const, duration: 15, intensity: 0.6 },\n ],\n },\n\n /** Level complete — celebratory */\n levelComplete: {\n name: 'gaming.levelComplete',\n steps: [\n { type: 'vibrate' as const, duration: 20, intensity: 0.5 },\n { type: 'pause' as const, duration: 60, intensity: 0 },\n { type: 'vibrate' as const, duration: 20, intensity: 0.5 },\n { type: 'pause' as const, duration: 60, intensity: 0 },\n { type: 'vibrate' as const, duration: 30, intensity: 0.7 },\n { type: 'pause' as const, duration: 60, intensity: 0 },\n { type: 'vibrate' as const, duration: 50, intensity: 1.0 },\n ],\n },\n\n /** Engine rumble — continuous vibration */\n engineRumble: {\n name: 'gaming.engineRumble',\n steps: [\n { type: 'vibrate' as const, duration: 30, intensity: 0.4 },\n { type: 'pause' as const, duration: 10, intensity: 0 },\n { type: 'vibrate' as const, duration: 30, intensity: 0.5 },\n { type: 'pause' as const, duration: 10, intensity: 0 },\n { type: 'vibrate' as const, duration: 30, intensity: 0.4 },\n { type: 'pause' as const, duration: 10, intensity: 0 },\n { type: 'vibrate' as const, duration: 30, intensity: 0.5 },\n ],\n },\n} satisfies Record<string, HapticPattern>;\n","import type { HapticPattern } from '../types';\n\n/** Accessibility-focused haptic presets — rhythmic patterns for non-visual feedback */\nexport const accessibility = {\n /** Confirm action — clear double pulse */\n confirm: {\n name: 'accessibility.confirm',\n steps: [\n { type: 'vibrate' as const, duration: 30, intensity: 0.7 },\n { type: 'pause' as const, duration: 100, intensity: 0 },\n { type: 'vibrate' as const, duration: 30, intensity: 0.7 },\n ],\n },\n\n /** Deny/reject — long single buzz */\n deny: {\n name: 'accessibility.deny',\n steps: [\n { type: 'vibrate' as const, duration: 200, intensity: 0.8 },\n ],\n },\n\n /** Boundary reached (e.g., scroll limit, min/max value) */\n boundary: {\n name: 'accessibility.boundary',\n steps: [\n { type: 'vibrate' as const, duration: 15, intensity: 1.0 },\n ],\n },\n\n /** Focus change — subtle tick */\n focusChange: {\n name: 'accessibility.focusChange',\n steps: [\n { type: 'vibrate' as const, duration: 5, intensity: 0.3 },\n ],\n },\n\n /** Counting rhythm — one tick per count */\n countTick: {\n name: 'accessibility.countTick',\n steps: [\n { type: 'vibrate' as const, duration: 8, intensity: 0.5 },\n ],\n },\n\n /** Navigation landmark reached */\n landmark: {\n name: 'accessibility.landmark',\n steps: [\n { type: 'vibrate' as const, duration: 15, intensity: 0.6 },\n { type: 'pause' as const, duration: 40, intensity: 0 },\n { type: 'vibrate' as const, duration: 15, intensity: 0.6 },\n { type: 'pause' as const, duration: 40, intensity: 0 },\n { type: 'vibrate' as const, duration: 15, intensity: 0.6 },\n ],\n },\n\n /** Progress checkpoint — escalating feedback */\n progressCheckpoint: {\n name: 'accessibility.progressCheckpoint',\n steps: [\n { type: 'vibrate' as const, duration: 20, intensity: 0.4 },\n { type: 'pause' as const, duration: 60, intensity: 0 },\n { type: 'vibrate' as const, duration: 25, intensity: 0.7 },\n ],\n },\n} satisfies Record<string, HapticPattern>;\n","import type { HapticPattern } from '../types';\n\n/** System-level haptic presets */\nexport const system = {\n /** Keyboard key press */\n keyPress: {\n name: 'system.keyPress',\n steps: [{ type: 'vibrate' as const, duration: 5, intensity: 0.3 }],\n },\n\n /** Scroll tick (detent-like) */\n scrollTick: {\n name: 'system.scrollTick',\n steps: [{ type: 'vibrate' as const, duration: 3, intensity: 0.2 }],\n },\n\n /** Scroll boundary reached */\n scrollBounce: {\n name: 'system.scrollBounce',\n steps: [\n { type: 'vibrate' as const, duration: 10, intensity: 0.5 },\n { type: 'vibrate' as const, duration: 20, intensity: 0.3 },\n ],\n },\n\n /** Delete action */\n delete: {\n name: 'system.delete',\n steps: [\n { type: 'vibrate' as const, duration: 15, intensity: 0.5 },\n { type: 'pause' as const, duration: 50, intensity: 0 },\n { type: 'vibrate' as const, duration: 25, intensity: 0.8 },\n ],\n },\n\n /** Undo action */\n undo: {\n name: 'system.undo',\n steps: [\n { type: 'vibrate' as const, duration: 20, intensity: 0.5 },\n { type: 'pause' as const, duration: 80, intensity: 0 },\n { type: 'vibrate' as const, duration: 10, intensity: 0.3 },\n ],\n },\n\n /** Copy to clipboard */\n copy: {\n name: 'system.copy',\n steps: [{ type: 'vibrate' as const, duration: 12, intensity: 0.4 }],\n },\n\n /** Paste from clipboard */\n paste: {\n name: 'system.paste',\n steps: [\n { type: 'vibrate' as const, duration: 8, intensity: 0.3 },\n { type: 'pause' as const, duration: 30, intensity: 0 },\n { type: 'vibrate' as const, duration: 12, intensity: 0.5 },\n ],\n },\n} satisfies Record<string, HapticPattern>;\n","export { ui } from './ui';\nexport { notifications } from './notifications';\nexport { gaming } from './gaming';\nexport { accessibility } from './accessibility';\nexport { system } from './system';\n\nimport { ui } from './ui';\nimport { notifications } from './notifications';\nimport { gaming } from './gaming';\nimport { accessibility } from './accessibility';\nimport { system } from './system';\n\n/** All presets grouped by category */\nexport const presets = {\n ui,\n notifications,\n gaming,\n accessibility,\n system,\n} as const;\n","// Types\nexport type {\n HapticStep,\n HapticPattern,\n EasingFunction,\n ImpactStyle,\n NotificationType,\n SemanticEffect,\n AdapterCapabilities,\n HapticAdapter,\n HapticConfig,\n FallbackConfig,\n VisualFallbackStyle,\n HPLToken,\n HPLTokenType,\n HPLNode,\n HPLNodeType,\n} from './types';\n\n// Engine\nexport { HapticEngine } from './engine';\nexport { AdaptiveEngine, FallbackManager, detectAdapter } from './engine';\n\n// Adapters\nexport { NoopAdapter, WebVibrationAdapter, IoSAudioAdapter } from './adapters';\n\n// Patterns\nexport { parseHPL, HPLParser, HPLParserError } from './patterns';\nexport { compile, optimizeSteps } from './patterns';\nexport { tokenize, HPLTokenizerError } from './patterns';\nexport { validateHPL } from './patterns';\nexport type { ValidationResult } from './patterns';\nexport {\n exportPattern,\n importPattern,\n patternToJSON,\n patternFromJSON,\n patternToDataURL,\n patternFromDataURL,\n} from './patterns';\nexport type { HapticPatternExport, ExportOptions } from './patterns';\n\n// Composer\nexport { PatternComposer } from './composer';\n\n// Presets\nexport { presets, ui, notifications, gaming, accessibility, system } from './presets';\n\n// Utils\nexport { detectPlatform } from './utils';\nexport type { PlatformInfo } from './utils';\n\n// ─── Default singleton ──────────────────────────────────────\n\nimport { HapticEngine } from './engine';\n\n/**\n * Pre-configured haptic engine singleton.\n * Import and use directly for quick haptic feedback:\n *\n * import { haptic } from '@hapticjs/core';\n * haptic.tap();\n * haptic.success();\n * haptic.play('~~..##..@@');\n */\nexport const haptic = HapticEngine.create();\n"]}
1
+ {"version":3,"sources":["../src/types/config.ts","../src/adapters/noop.adapter.ts","../src/adapters/web-vibration.adapter.ts","../src/utils/scheduling.ts","../src/adapters/ios-audio.adapter.ts","../src/utils/platform.ts","../src/engine/capability-detector.ts","../src/engine/adaptive-engine.ts","../src/engine/fallback-manager.ts","../src/composer/pattern-composer.ts","../src/patterns/tokenizer.ts","../src/patterns/parser.ts","../src/patterns/compiler.ts","../src/engine/haptic-engine.ts","../src/sound/sound-engine.ts","../src/visual/visual-engine.ts","../src/themes/theme-manager.ts","../src/engine/sensory-engine.ts","../src/patterns/validator.ts","../src/patterns/sharing.ts","../src/recorder/pattern-recorder.ts","../src/presets/ui.ts","../src/presets/notifications.ts","../src/presets/gaming.ts","../src/presets/accessibility.ts","../src/presets/system.ts","../src/presets/emotions.ts","../src/presets/index.ts","../src/physics/physics-patterns.ts","../src/physics/index.ts","../src/index.ts"],"names":["step","totalDuration","presets","clamp"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { HapticAdapter } from './adapter';\n\n/** Visual fallback style when haptics are unavailable */\nexport type VisualFallbackStyle = 'flash' | 'shake' | 'pulse';\n\n/** Fallback configuration for non-haptic feedback */\nexport interface FallbackConfig {\n type: 'none' | 'visual' | 'audio' | 'both';\n visual?: {\n /** Element to animate */\n element?: HTMLElement;\n /** CSS class to toggle */\n className?: string;\n /** Animation style */\n style?: VisualFallbackStyle;\n };\n audio?: {\n enabled: boolean;\n /** Volume from 0 to 1 */\n volume: number;\n };\n}\n\n/** Main configuration for the haptic engine */\nexport interface HapticConfig {\n /** Explicitly set an adapter (overrides auto-detection) */\n adapter?: HapticAdapter;\n /** Global intensity multiplier (0.0 to 1.0) */\n intensity: number;\n /** Whether haptics are enabled */\n enabled: boolean;\n /** Fallback when haptics are unavailable */\n fallback: FallbackConfig;\n /** Respect system haptic settings */\n respectSystemSettings: boolean;\n}\n\n/** Default configuration */\nexport const DEFAULT_CONFIG: HapticConfig = {\n intensity: 1.0,\n enabled: true,\n fallback: { type: 'none' },\n respectSystemSettings: true,\n};\n","import type { HapticAdapter, AdapterCapabilities, HapticStep } from '../types';\n\n/**\n * No-op adapter — used in SSR, Node, or when no haptic hardware is available.\n * Silently accepts all calls without doing anything.\n */\nexport class NoopAdapter implements HapticAdapter {\n readonly name = 'noop';\n readonly supported = false;\n\n capabilities(): AdapterCapabilities {\n return {\n maxIntensityLevels: 0,\n minDuration: 0,\n maxDuration: 0,\n supportsPattern: false,\n supportsIntensity: false,\n dualMotor: false,\n };\n }\n\n async pulse(_intensity: number, _duration: number): Promise<void> {\n // No-op\n }\n\n async playSequence(_steps: HapticStep[]): Promise<void> {\n // No-op\n }\n\n cancel(): void {\n // No-op\n }\n\n dispose(): void {\n // No-op\n }\n}\n","import type { HapticAdapter, AdapterCapabilities, HapticStep } from '../types';\n\n/**\n * Web Vibration API adapter.\n * Uses navigator.vibrate() — supported on Android browsers.\n * Android Vibration API is on/off only — no intensity control.\n * We ignore intensity and just vibrate for the requested duration.\n */\nexport class WebVibrationAdapter implements HapticAdapter {\n readonly name = 'web-vibration';\n readonly supported: boolean;\n\n constructor() {\n this.supported =\n typeof navigator !== 'undefined' && 'vibrate' in navigator;\n }\n\n capabilities(): AdapterCapabilities {\n return {\n maxIntensityLevels: 1,\n minDuration: 20,\n maxDuration: 10000,\n supportsPattern: true,\n supportsIntensity: false,\n dualMotor: false,\n };\n }\n\n async pulse(_intensity: number, duration: number): Promise<void> {\n if (!this.supported) return;\n navigator.vibrate(Math.max(duration, 20));\n }\n\n async playSequence(steps: HapticStep[]): Promise<void> {\n if (!this.supported || steps.length === 0) return;\n\n // Build native vibration pattern: [vibrate, pause, vibrate, pause, ...]\n // Merge consecutive vibrate steps and enforce minimum durations\n const pattern: number[] = [];\n let lastType: 'vibrate' | 'pause' | null = null;\n\n for (const step of steps) {\n if (step.type === 'vibrate' && step.intensity > 0.05) {\n const dur = Math.max(step.duration, 20);\n if (lastType === 'vibrate') {\n // Merge consecutive vibrations\n pattern[pattern.length - 1]! += dur;\n } else {\n pattern.push(dur);\n }\n lastType = 'vibrate';\n } else {\n const dur = Math.max(step.duration, 10);\n if (lastType === 'pause') {\n pattern[pattern.length - 1]! += dur;\n } else {\n pattern.push(dur);\n }\n lastType = 'pause';\n }\n }\n\n if (pattern.length > 0) {\n // If pattern starts with a pause, the first value is a wait\n // navigator.vibrate expects [vibrate, pause, vibrate, pause, ...]\n // If first step was a pause, prepend a 0ms vibrate\n if (steps[0]?.type === 'pause' || (steps[0]?.type === 'vibrate' && steps[0]?.intensity <= 0.05)) {\n pattern.unshift(0);\n }\n\n navigator.vibrate(pattern);\n }\n }\n\n cancel(): void {\n if (this.supported) {\n navigator.vibrate(0);\n }\n }\n\n dispose(): void {\n this.cancel();\n }\n}\n","/** Scheduling utilities for timed haptic playback */\n\nexport function delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n}\n\nexport function normalizeIntensity(intensity: number): number {\n return clamp(intensity, 0, 1);\n}\n","import type { HapticAdapter, AdapterCapabilities, HapticStep } from '../types';\nimport { delay } from '../utils/scheduling';\n\n/**\n * iOS Audio workaround adapter.\n * Uses AudioContext to generate short, low-frequency oscillator tones (20-60 Hz)\n * that create a subtle physical sensation through device speakers.\n * This is a fallback for iOS Safari, which does not support the Vibration API.\n */\nexport class IoSAudioAdapter implements HapticAdapter {\n readonly name = 'ios-audio';\n readonly supported: boolean;\n\n private _audioCtx: AudioContext | null = null;\n private _activeOscillator: OscillatorNode | null = null;\n private _activeGain: GainNode | null = null;\n private _cancelled = false;\n\n constructor() {\n this.supported = this._detectSupport();\n }\n\n capabilities(): AdapterCapabilities {\n return {\n maxIntensityLevels: 100,\n minDuration: 5,\n maxDuration: 5000,\n supportsPattern: true,\n supportsIntensity: true,\n dualMotor: false,\n };\n }\n\n async pulse(intensity: number, duration: number): Promise<void> {\n if (!this.supported) return;\n await this._playTone(intensity, duration);\n }\n\n async playSequence(steps: HapticStep[]): Promise<void> {\n if (!this.supported || steps.length === 0) return;\n\n this._cancelled = false;\n\n for (const step of steps) {\n if (this._cancelled) break;\n\n if (step.type === 'vibrate' && step.intensity > 0) {\n await this._playTone(step.intensity, step.duration);\n } else {\n await delay(step.duration);\n }\n }\n }\n\n cancel(): void {\n this._cancelled = true;\n this._stopOscillator();\n }\n\n dispose(): void {\n this.cancel();\n if (this._audioCtx) {\n void this._audioCtx.close();\n this._audioCtx = null;\n }\n }\n\n // ─── Internal ──────────────────────────────────────────────\n\n private _detectSupport(): boolean {\n if (typeof window === 'undefined') return false;\n\n const hasAudioContext =\n typeof AudioContext !== 'undefined' ||\n typeof (window as unknown as Record<string, unknown>).webkitAudioContext !== 'undefined';\n\n if (!hasAudioContext) return false;\n\n // Check for iOS platform\n const ua = navigator.userAgent;\n const isIOS =\n /iPad|iPhone|iPod/.test(ua) ||\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1);\n\n return isIOS;\n }\n\n /** Get or create the AudioContext, resuming if suspended */\n private async _getAudioContext(): Promise<AudioContext> {\n if (!this._audioCtx) {\n const Ctor =\n typeof AudioContext !== 'undefined'\n ? AudioContext\n : ((window as unknown as Record<string, unknown>).webkitAudioContext as typeof AudioContext);\n this._audioCtx = new Ctor();\n }\n\n if (this._audioCtx.state === 'suspended') {\n await this._audioCtx.resume();\n }\n\n return this._audioCtx;\n }\n\n /** Map intensity (0-1) to frequency in the 20-60 Hz sub-bass range */\n private _intensityToFrequency(intensity: number): number {\n return 20 + intensity * 40; // 20 Hz at 0 intensity, 60 Hz at full\n }\n\n /** Play a single oscillator tone for the given duration */\n private async _playTone(intensity: number, duration: number): Promise<void> {\n const ctx = await this._getAudioContext();\n\n const oscillator = ctx.createOscillator();\n const gainNode = ctx.createGain();\n\n oscillator.type = 'sine';\n oscillator.frequency.setValueAtTime(\n this._intensityToFrequency(intensity),\n ctx.currentTime,\n );\n\n gainNode.gain.setValueAtTime(intensity, ctx.currentTime);\n\n oscillator.connect(gainNode);\n gainNode.connect(ctx.destination);\n\n this._activeOscillator = oscillator;\n this._activeGain = gainNode;\n\n oscillator.start(ctx.currentTime);\n oscillator.stop(ctx.currentTime + duration / 1000);\n\n await new Promise<void>((resolve) => {\n oscillator.onended = () => {\n oscillator.disconnect();\n gainNode.disconnect();\n this._activeOscillator = null;\n this._activeGain = null;\n resolve();\n };\n });\n }\n\n /** Immediately stop the active oscillator if any */\n private _stopOscillator(): void {\n if (this._activeOscillator) {\n try {\n this._activeOscillator.stop();\n this._activeOscillator.disconnect();\n } catch {\n // Already stopped — ignore\n }\n this._activeOscillator = null;\n }\n\n if (this._activeGain) {\n try {\n this._activeGain.disconnect();\n } catch {\n // Already disconnected — ignore\n }\n this._activeGain = null;\n }\n }\n}\n","/** Platform detection utilities */\n\nexport interface PlatformInfo {\n isWeb: boolean;\n isNode: boolean;\n isReactNative: boolean;\n hasVibrationAPI: boolean;\n hasGamepadAPI: boolean;\n isIOS: boolean;\n isAndroid: boolean;\n isMobile: boolean;\n}\n\nexport function detectPlatform(): PlatformInfo {\n const isWeb = typeof window !== 'undefined' && typeof document !== 'undefined';\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n const isNode =\n typeof globalThis !== 'undefined' &&\n typeof (globalThis as Record<string, unknown>).process === 'object' &&\n typeof ((globalThis as Record<string, unknown>).process as Record<string, unknown>)?.versions === 'object';\n const isReactNative =\n typeof navigator !== 'undefined' && navigator.product === 'ReactNative';\n\n const hasVibrationAPI = isWeb && 'vibrate' in navigator;\n const hasGamepadAPI = isWeb && 'getGamepads' in navigator;\n\n const ua = isWeb ? navigator.userAgent : '';\n const isIOS = /iPad|iPhone|iPod/.test(ua) || (isWeb && navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1);\n const isAndroid = /Android/.test(ua);\n const isMobile = isIOS || isAndroid;\n\n return {\n isWeb,\n isNode,\n isReactNative,\n hasVibrationAPI,\n hasGamepadAPI,\n isIOS,\n isAndroid,\n isMobile,\n };\n}\n","import type { HapticAdapter } from '../types';\nimport { NoopAdapter } from '../adapters/noop.adapter';\nimport { WebVibrationAdapter } from '../adapters/web-vibration.adapter';\nimport { IoSAudioAdapter } from '../adapters/ios-audio.adapter';\nimport { detectPlatform } from '../utils/platform';\n\n/**\n * Auto-detect the best available haptic adapter for the current platform.\n */\nexport function detectAdapter(): HapticAdapter {\n const platform = detectPlatform();\n\n // Web browser with Vibration API support\n if (platform.hasVibrationAPI) {\n return new WebVibrationAdapter();\n }\n\n // iOS fallback: use AudioContext to simulate haptic feedback\n if (platform.isIOS && platform.isWeb) {\n const iosAdapter = new IoSAudioAdapter();\n if (iosAdapter.supported) {\n return iosAdapter;\n }\n }\n\n // Fallback to no-op (SSR, Node, unsupported browsers)\n return new NoopAdapter();\n}\n","import type { HapticStep, AdapterCapabilities } from '../types';\nimport { clamp } from '../utils/scheduling';\n\n/**\n * Adapts ideal haptic patterns to what the device can actually produce.\n * Handles intensity quantization, duration clamping, and step merging.\n */\nexport class AdaptiveEngine {\n adapt(steps: HapticStep[], capabilities: AdapterCapabilities): HapticStep[] {\n return steps.map((step) => this._adaptStep(step, capabilities));\n }\n\n private _adaptStep(step: HapticStep, caps: AdapterCapabilities): HapticStep {\n const adapted = { ...step };\n\n // Clamp duration\n if (adapted.type === 'vibrate') {\n adapted.duration = clamp(adapted.duration, caps.minDuration, caps.maxDuration);\n }\n\n // Quantize intensity if device has limited levels\n if (!caps.supportsIntensity && adapted.type === 'vibrate') {\n // On/off only — threshold at 0.1\n adapted.intensity = adapted.intensity > 0.1 ? 1.0 : 0;\n } else if (caps.maxIntensityLevels > 1 && caps.maxIntensityLevels < 100) {\n // Quantize to available levels\n const levels = caps.maxIntensityLevels;\n adapted.intensity = Math.round(adapted.intensity * levels) / levels;\n }\n\n return adapted;\n }\n}\n","import type { FallbackConfig, HapticStep } from '../types';\n\n/**\n * Provides visual/audio fallback when haptic hardware is unavailable.\n */\nexport class FallbackManager {\n private config: FallbackConfig;\n\n constructor(config: FallbackConfig) {\n this.config = config;\n }\n\n updateConfig(config: FallbackConfig): void {\n this.config = config;\n }\n\n /** Execute fallback feedback for the given steps */\n async execute(steps: HapticStep[]): Promise<void> {\n if (this.config.type === 'none') return;\n\n const totalDuration = steps.reduce((sum, s) => sum + s.duration, 0);\n const maxIntensity = Math.max(...steps.filter((s) => s.type === 'vibrate').map((s) => s.intensity), 0);\n\n if (this.config.type === 'visual' || this.config.type === 'both') {\n await this._visualFallback(totalDuration, maxIntensity);\n }\n\n if (this.config.type === 'audio' || this.config.type === 'both') {\n await this._audioFallback(totalDuration, maxIntensity);\n }\n }\n\n private async _visualFallback(duration: number, intensity: number): Promise<void> {\n const visual = this.config.visual;\n if (!visual || typeof document === 'undefined') return;\n\n const element = visual.element ?? document.body;\n const style = visual.style ?? 'pulse';\n const className = visual.className;\n\n if (className) {\n element.classList.add(className);\n setTimeout(() => element.classList.remove(className), duration);\n return;\n }\n\n // Built-in visual feedback\n switch (style) {\n case 'flash': {\n const opacity = 0.1 + intensity * 0.3;\n const overlay = document.createElement('div');\n Object.assign(overlay.style, {\n position: 'fixed',\n inset: '0',\n backgroundColor: `rgba(0, 0, 0, ${opacity})`,\n pointerEvents: 'none',\n zIndex: '99999',\n transition: `opacity ${duration}ms ease-out`,\n });\n document.body.appendChild(overlay);\n requestAnimationFrame(() => {\n overlay.style.opacity = '0';\n });\n setTimeout(() => overlay.remove(), duration + 100);\n break;\n }\n case 'shake': {\n const magnitude = Math.round(intensity * 5);\n element.style.transition = 'none';\n element.style.transform = `translateX(${magnitude}px)`;\n setTimeout(() => {\n element.style.transition = `transform ${duration}ms ease-out`;\n element.style.transform = '';\n }, 50);\n break;\n }\n case 'pulse': {\n const scale = 1 + intensity * 0.02;\n element.style.transition = `transform ${duration}ms ease-out`;\n element.style.transform = `scale(${scale})`;\n setTimeout(() => {\n element.style.transform = '';\n }, duration);\n break;\n }\n }\n }\n\n private async _audioFallback(duration: number, intensity: number): Promise<void> {\n const audio = this.config.audio;\n if (!audio?.enabled || typeof AudioContext === 'undefined') return;\n\n try {\n const ctx = new AudioContext();\n const oscillator = ctx.createOscillator();\n const gainNode = ctx.createGain();\n\n oscillator.connect(gainNode);\n gainNode.connect(ctx.destination);\n\n oscillator.frequency.value = 200 + intensity * 200;\n gainNode.gain.value = audio.volume * intensity * 0.1;\n\n oscillator.start();\n oscillator.stop(ctx.currentTime + duration / 1000);\n\n await new Promise<void>((resolve) => {\n oscillator.onended = () => {\n ctx.close();\n resolve();\n };\n });\n } catch {\n // Audio fallback is best-effort\n }\n }\n}\n","import type { HapticStep, EasingFunction } from '../types';\n\n/**\n * Fluent builder for composing haptic patterns programmatically.\n *\n * Usage:\n * const pattern = new PatternComposer()\n * .tap(0.5)\n * .pause(100)\n * .ramp(0.2, 1.0, 300)\n * .buzz(200)\n * .build();\n */\nexport class PatternComposer {\n private steps: HapticStep[] = [];\n private _onPlay?: (steps: HapticStep[]) => Promise<void>;\n\n /** Register a play callback (used by HapticEngine) */\n onPlay(fn: (steps: HapticStep[]) => Promise<void>): this {\n this._onPlay = fn;\n return this;\n }\n\n /** Add a short tap vibration */\n tap(intensity = 0.6): this {\n this.steps.push({ type: 'vibrate', duration: 10, intensity });\n return this;\n }\n\n /** Add a vibration with specified duration and intensity */\n vibrate(duration: number, intensity = 1.0): this {\n this.steps.push({ type: 'vibrate', duration, intensity });\n return this;\n }\n\n /** Add a buzz (medium-length vibration) */\n buzz(duration = 100, intensity = 0.7): this {\n this.steps.push({ type: 'vibrate', duration, intensity });\n return this;\n }\n\n /** Add a pause */\n pause(duration = 50): this {\n this.steps.push({ type: 'pause', duration, intensity: 0 });\n return this;\n }\n\n /** Add an intensity ramp from start to end intensity over duration */\n ramp(\n startIntensity: number,\n endIntensity: number,\n duration: number,\n easing: EasingFunction = 'linear',\n ): this {\n const stepCount = Math.max(1, Math.floor(duration / 20));\n const stepDuration = duration / stepCount;\n\n for (let i = 0; i < stepCount; i++) {\n const t = i / (stepCount - 1 || 1);\n const easedT = applyEasing(t, easing);\n const intensity = startIntensity + (endIntensity - startIntensity) * easedT;\n this.steps.push({ type: 'vibrate', duration: stepDuration, intensity });\n }\n\n return this;\n }\n\n /** Add a pulse pattern (on-off-on-off) */\n pulse(count: number, onDuration = 50, offDuration = 50, intensity = 0.8): this {\n for (let i = 0; i < count; i++) {\n this.steps.push({ type: 'vibrate', duration: onDuration, intensity });\n if (i < count - 1) {\n this.steps.push({ type: 'pause', duration: offDuration, intensity: 0 });\n }\n }\n return this;\n }\n\n /** Repeat the entire current sequence N times */\n repeat(times: number): this {\n const original = [...this.steps];\n for (let i = 1; i < times; i++) {\n this.steps.push(...original.map((s) => ({ ...s })));\n }\n return this;\n }\n\n /** Build and return the step array */\n build(): HapticStep[] {\n return [...this.steps];\n }\n\n /** Build and immediately play the pattern */\n async play(): Promise<void> {\n if (this._onPlay) {\n await this._onPlay(this.steps);\n }\n }\n\n /** Reset the composer */\n clear(): this {\n this.steps = [];\n return this;\n }\n\n /** Get total duration in ms */\n get duration(): number {\n return this.steps.reduce((sum, s) => sum + s.duration, 0);\n }\n}\n\nfunction applyEasing(t: number, easing: EasingFunction): number {\n switch (easing) {\n case 'linear':\n return t;\n case 'ease-in':\n return t * t;\n case 'ease-out':\n return t * (2 - t);\n case 'ease-in-out':\n return t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t;\n }\n}\n","import type { HPLToken, HPLTokenType } from '../types';\n\nconst TOKEN_MAP: Record<string, HPLTokenType> = {\n '~': 'LIGHT',\n '#': 'MEDIUM',\n '@': 'HEAVY',\n '.': 'PAUSE',\n '|': 'TAP',\n '-': 'SUSTAIN',\n '[': 'GROUP_START',\n ']': 'GROUP_END',\n};\n\nexport class HPLTokenizerError extends Error {\n constructor(\n message: string,\n public readonly position: number,\n ) {\n super(`HPL Tokenizer Error at position ${position}: ${message}`);\n this.name = 'HPLTokenizerError';\n }\n}\n\n/** Tokenize an HPL pattern string into tokens */\nexport function tokenize(input: string): HPLToken[] {\n const tokens: HPLToken[] = [];\n let i = 0;\n\n while (i < input.length) {\n const char = input[i]!;\n\n // Skip whitespace\n if (char === ' ' || char === '\\t' || char === '\\n') {\n i++;\n continue;\n }\n\n // Check for repeat modifier: xN\n if (char === 'x' && i + 1 < input.length) {\n let numStr = '';\n let j = i + 1;\n while (j < input.length && input[j]! >= '0' && input[j]! <= '9') {\n numStr += input[j];\n j++;\n }\n if (numStr.length > 0) {\n tokens.push({\n type: 'REPEAT',\n value: `x${numStr}`,\n repeatCount: parseInt(numStr, 10),\n });\n i = j;\n continue;\n }\n }\n\n // Check known tokens\n const tokenType = TOKEN_MAP[char];\n if (tokenType) {\n tokens.push({ type: tokenType, value: char });\n i++;\n continue;\n }\n\n throw new HPLTokenizerError(`Unexpected character '${char}'`, i);\n }\n\n return tokens;\n}\n","import type {\n HPLToken,\n HPLNode,\n HPLSequenceNode,\n HPLGroupNode,\n HPLVibrateNode,\n HPLPauseNode,\n HPLTapNode,\n HPLSustainNode,\n} from '../types';\nimport { tokenize } from './tokenizer';\n\n/** Duration constants in milliseconds */\nconst UNIT_DURATION = 50;\nconst TAP_DURATION = 10;\n\n/** Intensity levels for vibrate tokens */\nconst INTENSITY_MAP: Record<string, number> = {\n LIGHT: 0.3,\n MEDIUM: 0.6,\n HEAVY: 1.0,\n};\n\nexport class HPLParserError extends Error {\n constructor(message: string) {\n super(`HPL Parser Error: ${message}`);\n this.name = 'HPLParserError';\n }\n}\n\n/**\n * Recursive descent parser for the Haptic Pattern Language (HPL).\n *\n * Grammar:\n * Pattern := Segment+\n * Segment := Group | Atom\n * Group := '[' Segment+ ']' Repeat?\n * Atom := '~' | '#' | '@' | '.' | '|' | '-'\n * Repeat := 'x' Number\n */\nexport class HPLParser {\n private tokens: HPLToken[] = [];\n private pos = 0;\n\n parse(input: string): HPLSequenceNode {\n this.tokens = tokenize(input);\n this.pos = 0;\n\n if (this.tokens.length === 0) {\n return { type: 'sequence', children: [] };\n }\n\n const children = this._parseSegments();\n\n if (this.pos < this.tokens.length) {\n throw new HPLParserError(\n `Unexpected token '${this.tokens[this.pos]!.value}' at position ${this.pos}`,\n );\n }\n\n return { type: 'sequence', children };\n }\n\n private _parseSegments(): HPLNode[] {\n const nodes: HPLNode[] = [];\n while (this.pos < this.tokens.length) {\n const token = this.tokens[this.pos]!;\n\n if (token.type === 'GROUP_END') {\n break; // Let parent group handle this\n }\n\n nodes.push(this._parseSegment());\n }\n return nodes;\n }\n\n private _parseSegment(): HPLNode {\n const token = this.tokens[this.pos]!;\n\n if (token.type === 'GROUP_START') {\n return this._parseGroup();\n }\n\n return this._parseAtom();\n }\n\n private _parseGroup(): HPLGroupNode {\n this.pos++; // consume '['\n\n const children = this._parseSegments();\n\n if (this.pos >= this.tokens.length || this.tokens[this.pos]!.type !== 'GROUP_END') {\n throw new HPLParserError('Unclosed group — expected \"]\"');\n }\n this.pos++; // consume ']'\n\n // Check for repeat modifier\n let repeat = 1;\n if (this.pos < this.tokens.length && this.tokens[this.pos]!.type === 'REPEAT') {\n repeat = this.tokens[this.pos]!.repeatCount ?? 1;\n this.pos++;\n }\n\n return { type: 'group', children, repeat };\n }\n\n private _parseAtom(): HPLNode {\n const token = this.tokens[this.pos]!;\n this.pos++;\n\n switch (token.type) {\n case 'LIGHT':\n case 'MEDIUM':\n case 'HEAVY':\n return this._makeVibrate(token.type);\n case 'PAUSE':\n return this._makePause();\n case 'TAP':\n return this._makeTap();\n case 'SUSTAIN':\n return this._makeSustain();\n default:\n throw new HPLParserError(`Unexpected token type '${token.type}'`);\n }\n }\n\n private _makeVibrate(level: string): HPLVibrateNode {\n return {\n type: 'vibrate',\n intensity: INTENSITY_MAP[level] ?? 0.5,\n duration: UNIT_DURATION,\n };\n }\n\n private _makePause(): HPLPauseNode {\n return { type: 'pause', duration: UNIT_DURATION };\n }\n\n private _makeTap(): HPLTapNode {\n return { type: 'tap', duration: TAP_DURATION, intensity: 1.0 };\n }\n\n private _makeSustain(): HPLSustainNode {\n return { type: 'sustain', extension: UNIT_DURATION };\n }\n}\n\n/** Convenience function to parse an HPL string */\nexport function parseHPL(input: string): HPLSequenceNode {\n const parser = new HPLParser();\n return parser.parse(input);\n}\n","import type { HapticStep } from '../types/haptic-effect';\nimport type { HPLNode, HPLSequenceNode } from '../types/pattern';\n\n/**\n * Compiles an HPL AST into a flat array of HapticSteps.\n * Handles group expansion, sustain merging, and repeat unrolling.\n */\nexport function compile(ast: HPLSequenceNode): HapticStep[] {\n const raw = compileNode(ast);\n return mergeSustains(raw);\n}\n\nfunction compileNode(node: HPLNode): HapticStep[] {\n switch (node.type) {\n case 'vibrate':\n return [{ type: 'vibrate', duration: node.duration, intensity: node.intensity }];\n\n case 'pause':\n return [{ type: 'pause', duration: node.duration, intensity: 0 }];\n\n case 'tap':\n return [{ type: 'vibrate', duration: node.duration, intensity: node.intensity }];\n\n case 'sustain':\n // Sustain is a marker — it extends the previous step during merge\n return [{ type: 'vibrate', duration: node.extension, intensity: -1 }]; // sentinel\n\n case 'group': {\n const groupSteps = node.children.flatMap(compileNode);\n const result: HapticStep[] = [];\n for (let i = 0; i < node.repeat; i++) {\n result.push(...groupSteps.map((s) => ({ ...s })));\n }\n return result;\n }\n\n case 'sequence':\n return node.children.flatMap(compileNode);\n }\n}\n\n/**\n * Merge sustain markers (-) into the preceding step.\n * A sustain with intensity=-1 extends the previous vibrate's duration.\n */\nfunction mergeSustains(steps: HapticStep[]): HapticStep[] {\n const result: HapticStep[] = [];\n\n for (const step of steps) {\n if (step.intensity === -1 && result.length > 0) {\n // Sustain — extend previous step\n const prev = result[result.length - 1]!;\n prev.duration += step.duration;\n } else {\n result.push({ ...step });\n }\n }\n\n return result;\n}\n\n/**\n * Optimize a step sequence by merging adjacent same-type steps.\n */\nexport function optimizeSteps(steps: HapticStep[]): HapticStep[] {\n if (steps.length === 0) return [];\n\n const result: HapticStep[] = [{ ...steps[0]! }];\n\n for (let i = 1; i < steps.length; i++) {\n const current = steps[i]!;\n const prev = result[result.length - 1]!;\n\n // Merge adjacent pauses\n if (current.type === 'pause' && prev.type === 'pause') {\n prev.duration += current.duration;\n continue;\n }\n\n // Merge adjacent vibrates with same intensity\n if (\n current.type === 'vibrate' &&\n prev.type === 'vibrate' &&\n Math.abs(current.intensity - prev.intensity) < 0.01\n ) {\n prev.duration += current.duration;\n continue;\n }\n\n result.push({ ...current });\n }\n\n return result;\n}\n","import type {\n HapticAdapter,\n HapticConfig,\n HapticStep,\n HapticPattern,\n ImpactStyle,\n} from '../types';\nimport { DEFAULT_CONFIG } from '../types';\nimport { detectAdapter } from './capability-detector';\nimport { AdaptiveEngine } from './adaptive-engine';\nimport { FallbackManager } from './fallback-manager';\nimport { PatternComposer } from '../composer/pattern-composer';\nimport { parseHPL } from '../patterns/parser';\nimport { compile, optimizeSteps } from '../patterns/compiler';\nimport { normalizeIntensity } from '../utils/scheduling';\n\n/**\n * The main haptic engine — orchestrates adapters, patterns, and fallbacks.\n *\n * Usage:\n * const engine = HapticEngine.create();\n * engine.tap();\n * engine.success();\n * engine.play('~~..##..@@');\n */\nexport class HapticEngine {\n private adapter: HapticAdapter;\n private config: HapticConfig;\n private adaptive: AdaptiveEngine;\n private fallback: FallbackManager;\n\n constructor(config?: Partial<HapticConfig>) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n this.adapter = this.config.adapter ?? detectAdapter();\n this.adaptive = new AdaptiveEngine();\n this.fallback = new FallbackManager(this.config.fallback);\n }\n\n /** Create a new engine with auto-detected adapter */\n static create(config?: Partial<HapticConfig>): HapticEngine {\n return new HapticEngine(config);\n }\n\n // ─── Semantic API ──────────────────────────────────────────\n\n /** Light tap feedback */\n async tap(intensity = 0.6): Promise<void> {\n await this._playSteps([{ type: 'vibrate', duration: 30, intensity }]);\n }\n\n /** Double tap */\n async doubleTap(intensity = 0.6): Promise<void> {\n await this._playSteps([\n { type: 'vibrate', duration: 25, intensity },\n { type: 'pause', duration: 80, intensity: 0 },\n { type: 'vibrate', duration: 25, intensity },\n ]);\n }\n\n /** Long press feedback */\n async longPress(intensity = 0.8): Promise<void> {\n await this._playSteps([{ type: 'vibrate', duration: 50, intensity }]);\n }\n\n /** Success notification */\n async success(): Promise<void> {\n await this._playSteps([\n { type: 'vibrate', duration: 30, intensity: 0.5 },\n { type: 'pause', duration: 60, intensity: 0 },\n { type: 'vibrate', duration: 40, intensity: 0.8 },\n ]);\n }\n\n /** Warning notification */\n async warning(): Promise<void> {\n await this._playSteps([\n { type: 'vibrate', duration: 40, intensity: 0.7 },\n { type: 'pause', duration: 50, intensity: 0 },\n { type: 'vibrate', duration: 40, intensity: 0.7 },\n { type: 'pause', duration: 50, intensity: 0 },\n { type: 'vibrate', duration: 40, intensity: 0.7 },\n ]);\n }\n\n /** Error notification */\n async error(): Promise<void> {\n await this._playSteps([\n { type: 'vibrate', duration: 80, intensity: 1.0 },\n { type: 'pause', duration: 100, intensity: 0 },\n { type: 'vibrate', duration: 80, intensity: 1.0 },\n ]);\n }\n\n /** Selection change feedback */\n async selection(): Promise<void> {\n await this._playSteps([{ type: 'vibrate', duration: 25, intensity: 0.5 }]);\n }\n\n /** Toggle feedback */\n async toggle(on: boolean): Promise<void> {\n if (on) {\n await this._playSteps([{ type: 'vibrate', duration: 30, intensity: 0.6 }]);\n } else {\n await this._playSteps([{ type: 'vibrate', duration: 25, intensity: 0.4 }]);\n }\n }\n\n /** Impact with style (matches iOS UIImpactFeedbackGenerator) */\n async impact(style: ImpactStyle = 'medium'): Promise<void> {\n const presets: Record<ImpactStyle, HapticStep[]> = {\n light: [{ type: 'vibrate', duration: 25, intensity: 0.4 }],\n medium: [{ type: 'vibrate', duration: 35, intensity: 0.7 }],\n heavy: [{ type: 'vibrate', duration: 50, intensity: 1.0 }],\n rigid: [{ type: 'vibrate', duration: 30, intensity: 0.9 }],\n soft: [{ type: 'vibrate', duration: 35, intensity: 0.5 }],\n };\n await this._playSteps(presets[style]);\n }\n\n // ─── Parametric API ────────────────────────────────────────\n\n /** Vibrate for a specified duration */\n async vibrate(duration: number, intensity = 1.0): Promise<void> {\n await this._playSteps([\n { type: 'vibrate', duration, intensity: normalizeIntensity(intensity) },\n ]);\n }\n\n /**\n * Play a haptic pattern.\n * Accepts:\n * - HPL string: \"~~..##..@@\"\n * - HapticPattern object\n * - Raw HapticStep array\n */\n async play(pattern: string | HapticPattern | HapticStep[]): Promise<void> {\n let steps: HapticStep[];\n\n if (typeof pattern === 'string') {\n const ast = parseHPL(pattern);\n steps = compile(ast);\n } else if (Array.isArray(pattern)) {\n steps = pattern;\n } else {\n steps = pattern.steps;\n }\n\n await this._playSteps(steps);\n }\n\n // ─── Composer ──────────────────────────────────────────────\n\n /** Create a new pattern composer */\n compose(): PatternComposer {\n const composer = new PatternComposer();\n composer.onPlay((steps) => this._playSteps(steps));\n return composer;\n }\n\n // ─── Configuration ─────────────────────────────────────────\n\n /** Update engine configuration */\n configure(config: Partial<HapticConfig>): void {\n Object.assign(this.config, config);\n\n if (config.adapter) {\n this.adapter = config.adapter;\n }\n\n if (config.fallback) {\n this.fallback.updateConfig(this.config.fallback);\n }\n }\n\n /** Check if haptics are supported on this device */\n get isSupported(): boolean {\n return this.adapter.supported;\n }\n\n /** Get the current adapter name */\n get adapterName(): string {\n return this.adapter.name;\n }\n\n // ─── Lifecycle ─────────────────────────────────────────────\n\n /** Cancel any ongoing haptic effect */\n cancel(): void {\n this.adapter.cancel();\n }\n\n /** Clean up resources */\n dispose(): void {\n this.adapter.dispose();\n }\n\n // ─── Internal ──────────────────────────────────────────────\n\n private async _playSteps(steps: HapticStep[]): Promise<void> {\n if (!this.config.enabled || steps.length === 0) return;\n\n // Apply global intensity multiplier\n let adjusted = steps.map((s) => ({\n ...s,\n intensity:\n s.type === 'vibrate'\n ? normalizeIntensity(s.intensity * this.config.intensity)\n : 0,\n }));\n\n // Adapt to device capabilities\n const caps = this.adapter.capabilities();\n adjusted = this.adaptive.adapt(adjusted, caps);\n\n // Optimize\n adjusted = optimizeSteps(adjusted);\n\n if (this.adapter.supported) {\n await this.adapter.playSequence(adjusted);\n } else {\n await this.fallback.execute(adjusted);\n }\n }\n}\n","/** Note names mapped to frequencies (Hz) */\nconst NOTE_FREQUENCIES: Record<string, number> = {\n C4: 261.63,\n E4: 329.63,\n G4: 392.0,\n C5: 523.25,\n};\n\n/** Options for SoundEngine construction */\nexport interface SoundEngineOptions {\n enabled?: boolean;\n volume?: number;\n muted?: boolean;\n}\n\n/** Options for the click sound */\nexport interface ClickOptions {\n pitch?: 'low' | 'mid' | 'high';\n volume?: number;\n}\n\n/** Options for the generic tone player */\nexport interface ToneOptions {\n waveform?: OscillatorType;\n volume?: number;\n decay?: boolean;\n}\n\n/**\n * Lightweight audio feedback engine using Web Audio API.\n * Produces tiny UI sounds synced with haptics — all procedurally generated.\n */\nexport class SoundEngine {\n private ctx: AudioContext | null = null;\n private masterVolume: number;\n private _muted: boolean;\n private _enabled: boolean;\n\n constructor(options?: SoundEngineOptions) {\n this._enabled = options?.enabled ?? true;\n this.masterVolume = options?.volume ?? 0.5;\n this._muted = options?.muted ?? false;\n }\n\n // ─── Public API ──────────────────────────────────────────\n\n /** Short click sound */\n async click(options?: ClickOptions): Promise<void> {\n const pitchMap = { low: 800, mid: 1200, high: 2000 };\n const freq = pitchMap[options?.pitch ?? 'mid'];\n const vol = options?.volume ?? 0.3;\n await this.playTone(freq, 4, { waveform: 'sine', volume: vol, decay: true });\n }\n\n /** Ultra-short tick sound */\n async tick(): Promise<void> {\n await this.playTone(4000, 2, { waveform: 'sine', volume: 0.15, decay: true });\n }\n\n /** Bubbly pop sound — quick frequency sweep high to low */\n async pop(): Promise<void> {\n const ctx = this._getContext();\n if (!ctx) return;\n\n const osc = ctx.createOscillator();\n const gain = ctx.createGain();\n\n osc.connect(gain);\n gain.connect(ctx.destination);\n\n const now = ctx.currentTime;\n const vol = this._effectiveVolume(0.25);\n\n osc.type = 'sine';\n osc.frequency.setValueAtTime(1600, now);\n osc.frequency.exponentialRampToValueAtTime(300, now + 0.04);\n\n gain.gain.setValueAtTime(vol, now);\n gain.gain.exponentialRampToValueAtTime(0.001, now + 0.06);\n\n osc.start(now);\n osc.stop(now + 0.06);\n }\n\n /** Swipe/swoosh sound — noise with quick fade */\n async whoosh(): Promise<void> {\n const ctx = this._getContext();\n if (!ctx) return;\n\n const bufferSize = ctx.sampleRate * 0.08;\n const buffer = ctx.createBuffer(1, bufferSize, ctx.sampleRate);\n const data = buffer.getChannelData(0);\n\n for (let i = 0; i < bufferSize; i++) {\n data[i] = (Math.random() * 2 - 1) * (1 - i / bufferSize);\n }\n\n const source = ctx.createBufferSource();\n const gain = ctx.createGain();\n const filter = ctx.createBiquadFilter();\n\n source.buffer = buffer;\n filter.type = 'bandpass';\n filter.frequency.value = 2000;\n filter.Q.value = 0.5;\n\n source.connect(filter);\n filter.connect(gain);\n gain.connect(ctx.destination);\n\n const now = ctx.currentTime;\n const vol = this._effectiveVolume(0.2);\n\n gain.gain.setValueAtTime(vol, now);\n gain.gain.exponentialRampToValueAtTime(0.001, now + 0.08);\n\n source.start(now);\n }\n\n /** Musical chime */\n async chime(note: 'C4' | 'E4' | 'G4' | 'C5' = 'C5'): Promise<void> {\n const freq = NOTE_FREQUENCIES[note] ?? 523;\n await this.playTone(freq, 100, { waveform: 'sine', volume: 0.2, decay: true });\n }\n\n /** Low buzzer/error tone — two descending tones */\n async error(): Promise<void> {\n const ctx = this._getContext();\n if (!ctx) return;\n\n const now = ctx.currentTime;\n this._scheduleTone(ctx, 400, now, 0.08, 'square', 0.15);\n this._scheduleTone(ctx, 280, now + 0.1, 0.1, 'square', 0.15);\n }\n\n /** Ascending two-tone success sound */\n async success(): Promise<void> {\n const ctx = this._getContext();\n if (!ctx) return;\n\n const now = ctx.currentTime;\n this._scheduleTone(ctx, 880, now, 0.06, 'sine', 0.15);\n this._scheduleTone(ctx, 1320, now + 0.08, 0.08, 'sine', 0.15);\n }\n\n /** Subtle tap sound */\n async tap(): Promise<void> {\n await this.playTone(1000, 3, { waveform: 'sine', volume: 0.2, decay: true });\n }\n\n /** Toggle sound — ascending for on, descending for off */\n async toggle(on: boolean): Promise<void> {\n const ctx = this._getContext();\n if (!ctx) return;\n\n const now = ctx.currentTime;\n if (on) {\n this._scheduleTone(ctx, 600, now, 0.04, 'sine', 0.15);\n this._scheduleTone(ctx, 900, now + 0.06, 0.04, 'sine', 0.15);\n } else {\n this._scheduleTone(ctx, 900, now, 0.04, 'sine', 0.15);\n this._scheduleTone(ctx, 600, now + 0.06, 0.04, 'sine', 0.15);\n }\n }\n\n /** Generic tone player */\n async playTone(\n frequency: number,\n duration: number,\n options?: ToneOptions,\n ): Promise<void> {\n const ctx = this._getContext();\n if (!ctx) return;\n\n const waveform = options?.waveform ?? 'sine';\n const vol = this._effectiveVolume(options?.volume ?? 0.3);\n const decay = options?.decay ?? false;\n\n const osc = ctx.createOscillator();\n const gain = ctx.createGain();\n\n osc.connect(gain);\n gain.connect(ctx.destination);\n\n osc.type = waveform;\n osc.frequency.value = frequency;\n\n const now = ctx.currentTime;\n const durSec = duration / 1000;\n\n gain.gain.setValueAtTime(vol, now);\n if (decay) {\n gain.gain.exponentialRampToValueAtTime(0.001, now + durSec);\n }\n\n osc.start(now);\n osc.stop(now + durSec);\n }\n\n /** Set master volume (0-1) */\n setVolume(volume: number): void {\n this.masterVolume = Math.max(0, Math.min(1, volume));\n }\n\n /** Mute all sounds */\n mute(): void {\n this._muted = true;\n }\n\n /** Unmute sounds */\n unmute(): void {\n this._muted = false;\n }\n\n /** Whether sounds are currently muted */\n get muted(): boolean {\n return this._muted;\n }\n\n /** Current master volume */\n get volume(): number {\n return this.masterVolume;\n }\n\n /** Whether the engine is enabled */\n get enabled(): boolean {\n return this._enabled;\n }\n\n /** Close AudioContext and release resources */\n dispose(): void {\n if (this.ctx) {\n this.ctx.close().catch(() => {});\n this.ctx = null;\n }\n }\n\n // ─── Internal ──────────────────────────────────────────────\n\n /** Lazily create and return AudioContext, handling autoplay policy */\n private _getContext(): AudioContext | null {\n if (!this._enabled || this._muted) return null;\n if (typeof AudioContext === 'undefined') return null;\n\n if (!this.ctx) {\n this.ctx = new AudioContext();\n }\n\n // Resume if suspended (autoplay policy)\n if (this.ctx.state === 'suspended') {\n this.ctx.resume().catch(() => {});\n }\n\n return this.ctx;\n }\n\n /** Compute effective volume from master + per-sound volume */\n private _effectiveVolume(soundVolume: number): number {\n return this.masterVolume * soundVolume;\n }\n\n /** Schedule a tone at a specific AudioContext time */\n private _scheduleTone(\n ctx: AudioContext,\n frequency: number,\n startTime: number,\n durationSec: number,\n waveform: OscillatorType,\n volume: number,\n ): void {\n const osc = ctx.createOscillator();\n const gain = ctx.createGain();\n\n osc.connect(gain);\n gain.connect(ctx.destination);\n\n osc.type = waveform;\n osc.frequency.value = frequency;\n\n const vol = this._effectiveVolume(volume);\n gain.gain.setValueAtTime(vol, startTime);\n gain.gain.exponentialRampToValueAtTime(0.001, startTime + durationSec);\n\n osc.start(startTime);\n osc.stop(startTime + durationSec);\n }\n}\n","/** Options for VisualEngine construction */\nexport interface VisualEngineOptions {\n enabled?: boolean;\n target?: HTMLElement;\n intensity?: number;\n}\n\nexport interface FlashOptions {\n color?: string;\n duration?: number;\n opacity?: number;\n}\n\nexport interface ShakeOptions {\n intensity?: number;\n duration?: number;\n}\n\nexport interface PulseOptions {\n scale?: number;\n duration?: number;\n}\n\nexport interface RippleOptions {\n color?: string;\n size?: number;\n duration?: number;\n}\n\nexport interface GlowOptions {\n color?: string;\n duration?: number;\n size?: number;\n}\n\nexport interface BounceOptions {\n height?: number;\n duration?: number;\n}\n\nexport interface JelloOptions {\n intensity?: number;\n duration?: number;\n}\n\nexport interface RubberOptions {\n scaleX?: number;\n scaleY?: number;\n duration?: number;\n}\n\nexport interface HighlightOptions {\n color?: string;\n duration?: number;\n}\n\nconst STYLE_ID = '__hapticjs_visual_keyframes__';\n\n/**\n * CSS-based visual feedback effects that complement haptic patterns.\n * Works everywhere including desktop/iOS where vibration is unavailable.\n */\nexport class VisualEngine {\n private _enabled: boolean;\n private _target: HTMLElement | null;\n private _intensity: number;\n private _styleInjected = false;\n private _cleanups: Array<() => void> = [];\n\n constructor(options?: VisualEngineOptions) {\n this._enabled = options?.enabled ?? true;\n this._target = options?.target ?? null;\n this._intensity = options?.intensity ?? 1.0;\n }\n\n // ─── Public API ──────────────────────────────────────────\n\n /** Quick screen flash overlay */\n flash(options?: FlashOptions): void {\n if (!this._canRun()) return;\n\n const color = options?.color ?? 'white';\n const duration = options?.duration ?? 100;\n const opacity = options?.opacity ?? 0.15;\n\n const overlay = document.createElement('div');\n Object.assign(overlay.style, {\n position: 'fixed',\n inset: '0',\n backgroundColor: color,\n opacity: String(opacity * this._intensity),\n pointerEvents: 'none',\n zIndex: '99999',\n transition: `opacity ${duration}ms ease-out`,\n });\n\n document.body.appendChild(overlay);\n\n requestAnimationFrame(() => {\n overlay.style.opacity = '0';\n });\n\n const timer = setTimeout(() => {\n overlay.remove();\n this._removeCleanup(cleanup);\n }, duration + 50);\n\n const cleanup = () => {\n clearTimeout(timer);\n overlay.remove();\n };\n this._cleanups.push(cleanup);\n }\n\n /** CSS shake animation on target */\n shake(options?: ShakeOptions): void {\n if (!this._canRun()) return;\n this._injectStyles();\n\n const target = this._getTarget();\n const intensity = (options?.intensity ?? 3) * this._intensity;\n const duration = options?.duration ?? 200;\n\n const magnitude = Math.round(intensity);\n const name = `hapticjs-shake-${magnitude}`;\n\n this._ensureKeyframes(\n name,\n `0%,100%{transform:translateX(0)}` +\n `10%,30%,50%,70%,90%{transform:translateX(-${magnitude}px)}` +\n `20%,40%,60%,80%{transform:translateX(${magnitude}px)}`,\n );\n\n this._applyAnimation(target, name, duration);\n }\n\n /** Scale pulse animation */\n pulse(options?: PulseOptions): void {\n if (!this._canRun()) return;\n this._injectStyles();\n\n const target = this._getTarget();\n const scale = options?.scale ?? 1.02;\n const duration = options?.duration ?? 150;\n\n const adjusted = 1 + (scale - 1) * this._intensity;\n const name = `hapticjs-pulse-${Math.round(adjusted * 1000)}`;\n\n this._ensureKeyframes(\n name,\n `0%,100%{transform:scale(1)}50%{transform:scale(${adjusted})}`,\n );\n\n this._applyAnimation(target, name, duration);\n }\n\n /** Material Design style ripple at coordinates */\n ripple(x: number, y: number, options?: RippleOptions): void {\n if (!this._canRun()) return;\n this._injectStyles();\n\n const color = options?.color ?? 'rgba(255,255,255,0.4)';\n const size = options?.size ?? 100;\n const duration = options?.duration ?? 400;\n\n this._ensureKeyframes(\n 'hapticjs-ripple',\n `0%{transform:scale(0);opacity:1}100%{transform:scale(4);opacity:0}`,\n );\n\n const el = document.createElement('div');\n const half = size / 2;\n\n Object.assign(el.style, {\n position: 'fixed',\n left: `${x - half}px`,\n top: `${y - half}px`,\n width: `${size}px`,\n height: `${size}px`,\n borderRadius: '50%',\n backgroundColor: color,\n pointerEvents: 'none',\n zIndex: '99999',\n animation: `hapticjs-ripple ${duration}ms ease-out forwards`,\n });\n\n document.body.appendChild(el);\n\n const timer = setTimeout(() => {\n el.remove();\n this._removeCleanup(cleanup);\n }, duration + 50);\n\n const cleanup = () => {\n clearTimeout(timer);\n el.remove();\n };\n this._cleanups.push(cleanup);\n }\n\n /** Box shadow glow effect */\n glow(options?: GlowOptions): void {\n if (!this._canRun()) return;\n\n const target = this._getTarget();\n const color = options?.color ?? 'rgba(59,130,246,0.5)';\n const duration = options?.duration ?? 300;\n const size = (options?.size ?? 15) * this._intensity;\n\n const prev = target.style.boxShadow;\n const prevTransition = target.style.transition;\n\n target.style.transition = `box-shadow ${duration / 2}ms ease-in-out`;\n target.style.boxShadow = `0 0 ${size}px ${color}`;\n\n const timer = setTimeout(() => {\n target.style.boxShadow = prev;\n setTimeout(() => {\n target.style.transition = prevTransition;\n this._removeCleanup(cleanup);\n }, duration / 2);\n }, duration / 2);\n\n const cleanup = () => {\n clearTimeout(timer);\n target.style.boxShadow = prev;\n target.style.transition = prevTransition;\n };\n this._cleanups.push(cleanup);\n }\n\n /** Bounce animation on target */\n bounce(options?: BounceOptions): void {\n if (!this._canRun()) return;\n this._injectStyles();\n\n const target = this._getTarget();\n const height = (options?.height ?? 8) * this._intensity;\n const duration = options?.duration ?? 300;\n\n const name = `hapticjs-bounce-${Math.round(height)}`;\n\n this._ensureKeyframes(\n name,\n `0%,100%{transform:translateY(0)}` +\n `40%{transform:translateY(-${height}px)}` +\n `60%{transform:translateY(-${Math.round(height * 0.4)}px)}`,\n );\n\n this._applyAnimation(target, name, duration);\n }\n\n /** Jello/wobble animation */\n jello(options?: JelloOptions): void {\n if (!this._canRun()) return;\n this._injectStyles();\n\n const target = this._getTarget();\n const intensity = (options?.intensity ?? 5) * this._intensity;\n const duration = options?.duration ?? 400;\n\n const skew = intensity;\n const name = `hapticjs-jello-${Math.round(skew)}`;\n\n this._ensureKeyframes(\n name,\n `0%,100%{transform:skew(0)}` +\n `20%{transform:skew(-${skew}deg)}` +\n `40%{transform:skew(${skew * 0.6}deg)}` +\n `60%{transform:skew(-${skew * 0.3}deg)}` +\n `80%{transform:skew(${skew * 0.1}deg)}`,\n );\n\n this._applyAnimation(target, name, duration);\n }\n\n /** Rubber band scale effect */\n rubber(options?: RubberOptions): void {\n if (!this._canRun()) return;\n this._injectStyles();\n\n const target = this._getTarget();\n const scaleX = options?.scaleX ?? 1.15;\n const scaleY = options?.scaleY ?? 0.85;\n const duration = options?.duration ?? 300;\n\n const name = `hapticjs-rubber-${Math.round(scaleX * 100)}-${Math.round(scaleY * 100)}`;\n\n this._ensureKeyframes(\n name,\n `0%,100%{transform:scale(1,1)}` +\n `30%{transform:scale(${scaleX},${scaleY})}` +\n `60%{transform:scale(${2 - scaleX},${2 - scaleY})}`,\n );\n\n this._applyAnimation(target, name, duration);\n }\n\n /** Brief background color highlight */\n highlight(options?: HighlightOptions): void {\n if (!this._canRun()) return;\n\n const target = this._getTarget();\n const color = options?.color ?? 'rgba(255,255,0,0.2)';\n const duration = options?.duration ?? 300;\n\n const prev = target.style.backgroundColor;\n const prevTransition = target.style.transition;\n\n target.style.transition = `background-color ${duration / 2}ms ease-in-out`;\n target.style.backgroundColor = color;\n\n const timer = setTimeout(() => {\n target.style.backgroundColor = prev;\n setTimeout(() => {\n target.style.transition = prevTransition;\n this._removeCleanup(cleanup);\n }, duration / 2);\n }, duration / 2);\n\n const cleanup = () => {\n clearTimeout(timer);\n target.style.backgroundColor = prev;\n target.style.transition = prevTransition;\n };\n this._cleanups.push(cleanup);\n }\n\n /** Change the target element for animations */\n setTarget(element: HTMLElement): void {\n this._target = element;\n }\n\n /** Whether the engine is enabled */\n get enabled(): boolean {\n return this._enabled;\n }\n\n /** Current intensity multiplier */\n get intensity(): number {\n return this._intensity;\n }\n\n /** Remove all active animations and clean up */\n dispose(): void {\n for (const cleanup of this._cleanups) {\n cleanup();\n }\n this._cleanups = [];\n }\n\n // ─── Internal ──────────────────────────────────────────────\n\n private _canRun(): boolean {\n return this._enabled && typeof document !== 'undefined';\n }\n\n private _getTarget(): HTMLElement {\n return this._target ?? document.body;\n }\n\n /** Inject a <style> tag for keyframes on first use */\n private _injectStyles(): void {\n if (this._styleInjected) return;\n if (typeof document === 'undefined') return;\n\n if (!document.getElementById(STYLE_ID)) {\n const style = document.createElement('style');\n style.id = STYLE_ID;\n style.textContent = ''; // keyframes added dynamically\n document.head.appendChild(style);\n }\n\n this._styleInjected = true;\n }\n\n /** Ensure a @keyframes rule exists in our style tag */\n private _ensureKeyframes(name: string, frames: string): void {\n const style = document.getElementById(STYLE_ID) as HTMLStyleElement | null;\n if (!style) return;\n\n // Check if already defined\n if (style.textContent?.includes(`@keyframes ${name}`)) return;\n\n style.textContent += `@keyframes ${name}{${frames}}`;\n }\n\n /** Apply a CSS animation to an element and clean up after */\n private _applyAnimation(\n target: HTMLElement,\n animationName: string,\n duration: number,\n ): void {\n const prev = target.style.animation;\n target.style.animation = `${animationName} ${duration}ms ease-in-out`;\n\n const timer = setTimeout(() => {\n target.style.animation = prev;\n this._removeCleanup(cleanup);\n }, duration + 50);\n\n const cleanup = () => {\n clearTimeout(timer);\n target.style.animation = prev;\n };\n this._cleanups.push(cleanup);\n }\n\n private _removeCleanup(fn: () => void): void {\n const idx = this._cleanups.indexOf(fn);\n if (idx !== -1) this._cleanups.splice(idx, 1);\n }\n}\n","/** Multi-sensory theme preset — configures haptic, sound, and visual behavior */\nexport interface ThemePreset {\n name: string;\n hapticIntensity: number;\n soundEnabled: boolean;\n soundVolume: number;\n visualEnabled: boolean;\n visualStyle: 'flash' | 'ripple' | 'shake' | 'glow' | 'pulse';\n colors: {\n primary: string;\n success: string;\n error: string;\n warning: string;\n };\n}\n\n/** Built-in theme presets */\nexport const themes: Record<string, ThemePreset> = {\n default: {\n name: 'default',\n hapticIntensity: 0.7,\n soundEnabled: true,\n soundVolume: 0.3,\n visualEnabled: true,\n visualStyle: 'flash',\n colors: {\n primary: '#3b82f6',\n success: '#22c55e',\n error: '#ef4444',\n warning: '#eab308',\n },\n },\n gaming: {\n name: 'gaming',\n hapticIntensity: 1.0,\n soundEnabled: true,\n soundVolume: 0.8,\n visualEnabled: true,\n visualStyle: 'shake',\n colors: {\n primary: '#a855f7',\n success: '#00ff88',\n error: '#ff2222',\n warning: '#ff8800',\n },\n },\n minimal: {\n name: 'minimal',\n hapticIntensity: 0.4,\n soundEnabled: false,\n soundVolume: 0,\n visualEnabled: true,\n visualStyle: 'pulse',\n colors: {\n primary: '#6b7280',\n success: '#9ca3af',\n error: '#4b5563',\n warning: '#d1d5db',\n },\n },\n luxury: {\n name: 'luxury',\n hapticIntensity: 0.6,\n soundEnabled: true,\n soundVolume: 0.25,\n visualEnabled: true,\n visualStyle: 'glow',\n colors: {\n primary: '#d4af37',\n success: '#50c878',\n error: '#8b0000',\n warning: '#cd853f',\n },\n },\n retro: {\n name: 'retro',\n hapticIntensity: 0.9,\n soundEnabled: true,\n soundVolume: 0.5,\n visualEnabled: true,\n visualStyle: 'flash',\n colors: {\n primary: '#00ff00',\n success: '#00ffff',\n error: '#ff0000',\n warning: '#ffff00',\n },\n },\n nature: {\n name: 'nature',\n hapticIntensity: 0.5,\n soundEnabled: true,\n soundVolume: 0.2,\n visualEnabled: true,\n visualStyle: 'pulse',\n colors: {\n primary: '#2d6a4f',\n success: '#40916c',\n error: '#9b2226',\n warning: '#ee9b00',\n },\n },\n silent: {\n name: 'silent',\n hapticIntensity: 0.7,\n soundEnabled: false,\n soundVolume: 0,\n visualEnabled: false,\n visualStyle: 'flash',\n colors: {\n primary: '#3b82f6',\n success: '#22c55e',\n error: '#ef4444',\n warning: '#eab308',\n },\n },\n accessible: {\n name: 'accessible',\n hapticIntensity: 1.0,\n soundEnabled: true,\n soundVolume: 0.6,\n visualEnabled: true,\n visualStyle: 'flash',\n colors: {\n primary: '#0000ff',\n success: '#008000',\n error: '#ff0000',\n warning: '#ff8c00',\n },\n },\n};\n\n/**\n * Manages multi-sensory themes that configure haptic, sound, and visual behavior.\n */\nexport class ThemeManager {\n private _current: ThemePreset;\n private _registry: Map<string, ThemePreset>;\n\n constructor() {\n this._registry = new Map(Object.entries(themes));\n this._current = themes.default!;\n }\n\n /** Apply a theme by name or provide a custom preset */\n setTheme(name: string | ThemePreset): void {\n if (typeof name === 'string') {\n const preset = this._registry.get(name);\n if (!preset) {\n throw new Error(`Unknown theme: \"${name}\". Available: ${this.listThemes().join(', ')}`);\n }\n this._current = preset;\n } else {\n this._registry.set(name.name, name);\n this._current = name;\n }\n }\n\n /** Get the current theme preset */\n getTheme(): ThemePreset {\n return this._current;\n }\n\n /** Current theme name */\n get current(): string {\n return this._current.name;\n }\n\n /** List all available theme names */\n listThemes(): string[] {\n return Array.from(this._registry.keys());\n }\n\n /** Register a custom theme preset */\n registerTheme(preset: ThemePreset): void {\n this._registry.set(preset.name, preset);\n }\n}\n","import type { HapticConfig, HapticStep, HapticPattern } from '../types';\nimport { HapticEngine } from './haptic-engine';\nimport { SoundEngine } from '../sound/sound-engine';\nimport { VisualEngine } from '../visual/visual-engine';\nimport { ThemeManager } from '../themes/theme-manager';\nimport type { ThemePreset } from '../themes/theme-manager';\n\n/** Options for the SensoryEngine */\nexport interface SensoryEngineOptions {\n haptic?: Partial<HapticConfig>;\n sound?: { enabled?: boolean; volume?: number; muted?: boolean };\n visual?: { enabled?: boolean; target?: HTMLElement; intensity?: number };\n theme?: string | ThemePreset;\n}\n\n/**\n * Higher-level engine that combines haptic + sound + visual feedback.\n * Ties HapticEngine, SoundEngine, VisualEngine, and ThemeManager together.\n *\n * Usage:\n * const engine = SensoryEngine.create();\n * engine.tap();\n * engine.success();\n * engine.setTheme('gaming');\n */\nexport class SensoryEngine {\n private _haptic: HapticEngine;\n private _sound: SoundEngine;\n private _visual: VisualEngine;\n private _themes: ThemeManager;\n\n constructor(options?: SensoryEngineOptions) {\n this._haptic = new HapticEngine(options?.haptic);\n this._sound = new SoundEngine(options?.sound);\n this._visual = new VisualEngine(options?.visual);\n this._themes = new ThemeManager();\n\n if (options?.theme) {\n this.setTheme(options.theme);\n }\n }\n\n /** Factory method */\n static create(options?: SensoryEngineOptions): SensoryEngine {\n return new SensoryEngine(options);\n }\n\n // ─── Multi-sensory API ─────────────────────────────────────\n\n /** Tap: vibrate + click sound + pulse visual */\n async tap(): Promise<void> {\n const theme = this._themes.getTheme();\n\n await Promise.all([\n this._haptic.tap(),\n theme.soundEnabled ? this._sound.click({ pitch: 'mid' }) : Promise.resolve(),\n theme.visualEnabled ? this._runVisual(theme, 'tap') : Promise.resolve(),\n ]);\n }\n\n /** Success: haptic success + success sound + green glow */\n async success(): Promise<void> {\n const theme = this._themes.getTheme();\n\n await Promise.all([\n this._haptic.success(),\n theme.soundEnabled ? this._sound.success() : Promise.resolve(),\n theme.visualEnabled\n ? this._visual.glow({ color: theme.colors.success, duration: 300 })\n : Promise.resolve(),\n ]);\n }\n\n /** Error: haptic error + error sound + red flash */\n async error(): Promise<void> {\n const theme = this._themes.getTheme();\n\n await Promise.all([\n this._haptic.error(),\n theme.soundEnabled ? this._sound.error() : Promise.resolve(),\n theme.visualEnabled\n ? this._visual.flash({ color: theme.colors.error, duration: 150, opacity: 0.2 })\n : Promise.resolve(),\n ]);\n }\n\n /** Warning: haptic warning + warning sound + yellow flash */\n async warning(): Promise<void> {\n const theme = this._themes.getTheme();\n\n await Promise.all([\n this._haptic.warning(),\n theme.soundEnabled ? this._sound.chime('E4') : Promise.resolve(),\n theme.visualEnabled\n ? this._visual.flash({ color: theme.colors.warning, duration: 150, opacity: 0.2 })\n : Promise.resolve(),\n ]);\n }\n\n /** Selection: haptic selection + tick sound + subtle pulse */\n async selection(): Promise<void> {\n const theme = this._themes.getTheme();\n\n await Promise.all([\n this._haptic.selection(),\n theme.soundEnabled ? this._sound.tick() : Promise.resolve(),\n theme.visualEnabled\n ? this._visual.pulse({ scale: 1.01, duration: 100 })\n : Promise.resolve(),\n ]);\n }\n\n /** Toggle: haptic toggle + toggle sound + pulse */\n async toggle(on: boolean): Promise<void> {\n const theme = this._themes.getTheme();\n\n await Promise.all([\n this._haptic.toggle(on),\n theme.soundEnabled ? this._sound.toggle(on) : Promise.resolve(),\n theme.visualEnabled\n ? this._visual.pulse({ scale: on ? 1.03 : 0.98, duration: 150 })\n : Promise.resolve(),\n ]);\n }\n\n /** Play a haptic pattern (sound/visual auto-mapped from theme) */\n async play(pattern: string | HapticPattern | HapticStep[]): Promise<void> {\n const theme = this._themes.getTheme();\n\n await Promise.all([\n this._haptic.play(pattern),\n theme.soundEnabled ? this._sound.tap() : Promise.resolve(),\n theme.visualEnabled ? this._runVisual(theme, 'play') : Promise.resolve(),\n ]);\n }\n\n // ─── Theme ─────────────────────────────────────────────────\n\n /** Apply a theme by name or preset */\n setTheme(name: string | ThemePreset): void {\n this._themes.setTheme(name);\n\n const theme = this._themes.getTheme();\n\n // Sync engines to theme settings\n this._haptic.configure({ intensity: theme.hapticIntensity });\n this._sound.setVolume(theme.soundVolume);\n\n if (!theme.soundEnabled) {\n this._sound.mute();\n } else {\n this._sound.unmute();\n }\n }\n\n // ─── Accessors ─────────────────────────────────────────────\n\n /** Access the underlying HapticEngine */\n get haptic(): HapticEngine {\n return this._haptic;\n }\n\n /** Access the SoundEngine */\n get sound(): SoundEngine {\n return this._sound;\n }\n\n /** Access the VisualEngine */\n get visual(): VisualEngine {\n return this._visual;\n }\n\n /** Access the ThemeManager */\n get themes(): ThemeManager {\n return this._themes;\n }\n\n // ─── Configuration ─────────────────────────────────────────\n\n /** Configure all engines */\n configure(options: SensoryEngineOptions): void {\n if (options.haptic) {\n this._haptic.configure(options.haptic);\n }\n if (options.sound) {\n this._sound = new SoundEngine(options.sound);\n }\n if (options.visual) {\n this._visual = new VisualEngine(options.visual);\n }\n if (options.theme) {\n this.setTheme(options.theme);\n }\n }\n\n // ─── Lifecycle ─────────────────────────────────────────────\n\n /** Clean up all engines */\n dispose(): void {\n this._haptic.dispose();\n this._sound.dispose();\n this._visual.dispose();\n }\n\n // ─── Internal ──────────────────────────────────────────────\n\n /** Run the appropriate visual effect based on theme style */\n private _runVisual(theme: ThemePreset, context: string): void {\n switch (theme.visualStyle) {\n case 'flash':\n this._visual.flash({ color: theme.colors.primary });\n break;\n case 'ripple':\n // Ripple at center of viewport when no coordinates available\n if (typeof window !== 'undefined') {\n this._visual.ripple(window.innerWidth / 2, window.innerHeight / 2, {\n color: theme.colors.primary,\n });\n }\n break;\n case 'shake':\n this._visual.shake({ intensity: context === 'play' ? 5 : 3 });\n break;\n case 'glow':\n this._visual.glow({ color: theme.colors.primary });\n break;\n case 'pulse':\n this._visual.pulse();\n break;\n }\n }\n}\n","/** Validate an HPL pattern string and return human-readable errors */\nexport interface ValidationResult {\n valid: boolean;\n errors: string[];\n}\n\nconst VALID_CHARS = new Set('~#@.|\\\\-[] \\t\\nx0123456789');\n\nexport function validateHPL(input: string): ValidationResult {\n const errors: string[] = [];\n\n if (input.length === 0) {\n return { valid: true, errors: [] };\n }\n\n // Check for invalid characters\n for (let i = 0; i < input.length; i++) {\n if (!VALID_CHARS.has(input[i]!)) {\n errors.push(`Invalid character '${input[i]}' at position ${i}`);\n }\n }\n\n // Check bracket matching\n let depth = 0;\n for (let i = 0; i < input.length; i++) {\n if (input[i] === '[') depth++;\n if (input[i] === ']') depth--;\n if (depth < 0) {\n errors.push(`Unmatched ']' at position ${i}`);\n }\n }\n if (depth > 0) {\n errors.push(`${depth} unclosed '[' bracket(s)`);\n }\n\n // Check for empty groups\n for (let i = 0; i < input.length - 1; i++) {\n if (input[i] === '[' && input[i + 1] === ']') {\n errors.push(`Empty group at position ${i}`);\n }\n }\n\n // Check repeat modifiers are after groups or atoms\n for (let i = 0; i < input.length; i++) {\n if (input[i] === 'x' && i + 1 < input.length && /\\d/.test(input[i + 1]!)) {\n if (i === 0) {\n errors.push(`Repeat modifier 'x' at position ${i} must follow a group or atom`);\n }\n }\n }\n\n return { valid: errors.length === 0, errors };\n}\n","import type { HapticStep, HapticPattern } from '../types/haptic-effect';\nimport { parseHPL } from './parser';\nimport { compile } from './compiler';\n\n/** Portable JSON-serializable format for sharing haptic patterns */\nexport interface HapticPatternExport {\n version: 1;\n name: string;\n description?: string;\n /** Original HPL string if pattern was created from HPL */\n hpl?: string;\n /** Compiled haptic steps */\n steps: HapticStep[];\n metadata?: {\n /** Total duration in milliseconds */\n duration: number;\n author?: string;\n tags?: string[];\n /** ISO date string */\n createdAt?: string;\n };\n}\n\n/** Options for exporting a pattern */\nexport interface ExportOptions {\n name?: string;\n description?: string;\n author?: string;\n tags?: string[];\n}\n\n/** Input types accepted by exportPattern */\ntype ExportInput = HapticPattern | HapticStep[] | string;\n\n/**\n * Calculate total duration of a step sequence.\n */\nfunction totalDuration(steps: HapticStep[]): number {\n return steps.reduce((sum, s) => sum + s.duration, 0);\n}\n\n/**\n * Resolve input to steps and optional HPL source string.\n */\nfunction resolveInput(input: ExportInput): { steps: HapticStep[]; hpl?: string; name?: string } {\n // HPL string\n if (typeof input === 'string') {\n const ast = parseHPL(input);\n return { steps: compile(ast), hpl: input };\n }\n\n // HapticStep[]\n if (Array.isArray(input)) {\n return { steps: input };\n }\n\n // HapticPattern\n return { steps: input.steps, name: input.name };\n}\n\n/**\n * Export a haptic pattern as a portable JSON-serializable object.\n *\n * Accepts a HapticPattern, HapticStep[], or HPL string.\n */\nexport function exportPattern(\n input: ExportInput,\n options: ExportOptions = {},\n): HapticPatternExport {\n const resolved = resolveInput(input);\n const steps = resolved.steps;\n const name = options.name ?? resolved.name ?? 'Untitled Pattern';\n\n const result: HapticPatternExport = {\n version: 1,\n name,\n steps,\n };\n\n if (options.description) {\n result.description = options.description;\n }\n\n if (resolved.hpl) {\n result.hpl = resolved.hpl;\n }\n\n const hasMetadataFields = options.author || options.tags;\n if (hasMetadataFields || steps.length > 0) {\n result.metadata = {\n duration: totalDuration(steps),\n createdAt: new Date().toISOString(),\n };\n\n if (options.author) {\n result.metadata.author = options.author;\n }\n\n if (options.tags) {\n result.metadata.tags = options.tags;\n }\n }\n\n return result;\n}\n\n/**\n * Validate that a value looks like a valid HapticPatternExport.\n * Throws descriptive errors for invalid data.\n */\nfunction validateExport(data: unknown): asserts data is HapticPatternExport {\n if (data === null || typeof data !== 'object') {\n throw new Error('Invalid pattern data: expected an object');\n }\n\n const obj = data as Record<string, unknown>;\n\n if (obj.version !== 1) {\n throw new Error(\n `Unsupported pattern version: ${String(obj.version)}. Expected version 1`,\n );\n }\n\n if (typeof obj.name !== 'string' || obj.name.length === 0) {\n throw new Error('Invalid pattern data: \"name\" must be a non-empty string');\n }\n\n if (!Array.isArray(obj.steps)) {\n throw new Error('Invalid pattern data: \"steps\" must be an array');\n }\n\n for (let i = 0; i < obj.steps.length; i++) {\n const step = obj.steps[i] as Record<string, unknown>;\n\n if (step.type !== 'vibrate' && step.type !== 'pause') {\n throw new Error(\n `Invalid step at index ${i}: \"type\" must be \"vibrate\" or \"pause\"`,\n );\n }\n\n if (typeof step.duration !== 'number' || step.duration < 0) {\n throw new Error(\n `Invalid step at index ${i}: \"duration\" must be a non-negative number`,\n );\n }\n\n if (typeof step.intensity !== 'number' || step.intensity < 0 || step.intensity > 1) {\n throw new Error(\n `Invalid step at index ${i}: \"intensity\" must be a number between 0 and 1`,\n );\n }\n }\n}\n\n/**\n * Import a pattern from a HapticPatternExport object or JSON string.\n * Validates the data and returns a HapticPattern.\n */\nexport function importPattern(data: HapticPatternExport | string): HapticPattern {\n const parsed = typeof data === 'string' ? JSON.parse(data) : data;\n validateExport(parsed);\n\n const pattern: HapticPattern = {\n name: parsed.name,\n steps: parsed.steps.map((s) => ({ ...s })),\n };\n\n if (parsed.metadata) {\n pattern.metadata = { ...parsed.metadata };\n }\n\n return pattern;\n}\n\n/**\n * Serialize a pattern to a pretty-printed JSON string.\n */\nexport function patternToJSON(\n input: ExportInput,\n options: ExportOptions = {},\n): string {\n const exported = exportPattern(input, options);\n return JSON.stringify(exported, null, 2);\n}\n\n/**\n * Parse a JSON string into a HapticPattern.\n */\nexport function patternFromJSON(json: string): HapticPattern {\n return importPattern(json);\n}\n\n/**\n * Encode a pattern as a data: URL for easy sharing via links.\n */\nexport function patternToDataURL(\n input: ExportInput,\n options: ExportOptions = {},\n): string {\n const json = patternToJSON(input, options);\n const encoded = btoa(json);\n return `data:application/haptic+json;base64,${encoded}`;\n}\n\n/**\n * Decode a data: URL back to a HapticPattern.\n */\nexport function patternFromDataURL(url: string): HapticPattern {\n const prefix = 'data:application/haptic+json;base64,';\n\n if (!url.startsWith(prefix)) {\n throw new Error(\n 'Invalid haptic data URL: expected \"data:application/haptic+json;base64,\" prefix',\n );\n }\n\n const encoded = url.slice(prefix.length);\n const json = atob(encoded);\n return patternFromJSON(json);\n}\n","import type { HapticStep, HapticPattern } from '../types/haptic-effect';\n\n/** A single recorded tap event */\ninterface RecordedTap {\n /** Timestamp in ms relative to recording start */\n time: number;\n /** Intensity from 0.0 to 1.0 */\n intensity: number;\n}\n\n/** Callback invoked on each tap during recording */\ntype TapCallback = (tap: RecordedTap, index: number) => void;\n\n/** Default tap duration in ms */\nconst DEFAULT_TAP_DURATION = 10;\n\n/** Default grid size for quantization in ms */\nconst DEFAULT_GRID_MS = 50;\n\n/** Default tap intensity */\nconst DEFAULT_INTENSITY = 0.6;\n\n/**\n * Records tap rhythms and converts them to HPL pattern strings or HapticSteps.\n *\n * Usage:\n * const recorder = new PatternRecorder();\n * recorder.start();\n * recorder.tap(); // user taps...\n * recorder.tap(0.9); // heavy tap\n * recorder.stop();\n * console.log(recorder.toHPL()); // '##..@@'\n */\nexport class PatternRecorder {\n private taps: RecordedTap[] = [];\n private recording = false;\n private startTime = 0;\n private stopTime = 0;\n private tapCallbacks: TapCallback[] = [];\n private nowFn: () => number;\n\n constructor(options?: { now?: () => number }) {\n this.nowFn = options?.now ?? (() => Date.now());\n }\n\n /** Whether the recorder is currently recording */\n get isRecording(): boolean {\n return this.recording;\n }\n\n /** Total duration of the recording in ms */\n get duration(): number {\n if (this.taps.length === 0) return 0;\n if (this.recording) {\n return this.nowFn() - this.startTime;\n }\n return this.stopTime - this.startTime;\n }\n\n /** Number of taps recorded */\n get tapCount(): number {\n return this.taps.length;\n }\n\n /** Begin recording. Records timestamps of tap events. */\n start(): void {\n this.taps = [];\n this.recording = true;\n this.startTime = this.nowFn();\n this.stopTime = 0;\n }\n\n /** Register a tap at current time. */\n tap(intensity: number = DEFAULT_INTENSITY): void {\n if (!this.recording) return;\n\n const now = this.nowFn();\n const time = now - this.startTime;\n const clamped = Math.max(0, Math.min(1, intensity));\n const recorded: RecordedTap = { time, intensity: clamped };\n\n this.taps.push(recorded);\n\n for (const cb of this.tapCallbacks) {\n cb(recorded, this.taps.length - 1);\n }\n }\n\n /** Stop recording, return the recorded taps. */\n stop(): RecordedTap[] {\n this.recording = false;\n this.stopTime = this.nowFn();\n return [...this.taps];\n }\n\n /** Register a callback for each tap (for visual feedback during recording). */\n onTap(callback: TapCallback): void {\n this.tapCallbacks.push(callback);\n }\n\n /** Reset the recorder. */\n clear(): void {\n this.taps = [];\n this.recording = false;\n this.startTime = 0;\n this.stopTime = 0;\n }\n\n /**\n * Snap taps to a grid for cleaner patterns.\n * @param gridMs Grid size in ms (default 50ms)\n */\n quantize(gridMs: number = DEFAULT_GRID_MS): void {\n this.taps = this.taps.map((tap) => ({\n ...tap,\n time: Math.round(tap.time / gridMs) * gridMs,\n }));\n }\n\n /**\n * Convert recorded taps to an HPL string.\n *\n * Maps gaps between taps to `.` characters (each 50ms),\n * and tap intensities to `~` (light), `#` (medium), `@` (heavy).\n */\n toHPL(): string {\n if (this.taps.length === 0) return '';\n\n const sorted = [...this.taps].sort((a, b) => a.time - b.time);\n let hpl = '';\n\n for (let i = 0; i < sorted.length; i++) {\n // Add gap pauses before this tap (skip for the first tap)\n if (i > 0) {\n const gap = sorted[i]!.time - sorted[i - 1]!.time;\n\n // Merge very short gaps (<25ms) as consecutive taps\n if (gap >= 25) {\n const pauses = Math.round(gap / DEFAULT_GRID_MS);\n hpl += '.'.repeat(pauses);\n }\n }\n\n // Map intensity to HPL character\n hpl += intensityToChar(sorted[i]!.intensity);\n }\n\n return hpl;\n }\n\n /** Convert recorded taps to HapticStep[]. */\n toSteps(): HapticStep[] {\n if (this.taps.length === 0) return [];\n\n const sorted = [...this.taps].sort((a, b) => a.time - b.time);\n const steps: HapticStep[] = [];\n\n for (let i = 0; i < sorted.length; i++) {\n // Add pause step for the gap before this tap\n if (i > 0) {\n const gap = sorted[i]!.time - sorted[i - 1]!.time;\n\n if (gap >= 25) {\n const quantized = Math.round(gap / DEFAULT_GRID_MS) * DEFAULT_GRID_MS;\n steps.push({ type: 'pause', duration: quantized, intensity: 0 });\n }\n }\n\n // Add vibrate step for the tap\n steps.push({\n type: 'vibrate',\n duration: DEFAULT_TAP_DURATION,\n intensity: sorted[i]!.intensity,\n });\n }\n\n return steps;\n }\n\n /** Convert recorded taps to a HapticPattern. */\n toPattern(name?: string): HapticPattern {\n return {\n name: name ?? 'recorded-pattern',\n steps: this.toSteps(),\n };\n }\n}\n\n/** Map intensity value to HPL character */\nfunction intensityToChar(intensity: number): string {\n if (intensity < 0.35) return '~';\n if (intensity <= 0.7) return '#';\n return '@';\n}\n","import type { HapticPattern } from '../types';\n\n/** UI interaction presets */\nexport const ui = {\n /** Light button tap */\n tap: {\n name: 'ui.tap',\n steps: [{ type: 'vibrate' as const, duration: 30, intensity: 0.6 }],\n },\n\n /** Double tap */\n doubleTap: {\n name: 'ui.doubleTap',\n steps: [\n { type: 'vibrate' as const, duration: 25, intensity: 0.6 },\n { type: 'pause' as const, duration: 80, intensity: 0 },\n { type: 'vibrate' as const, duration: 25, intensity: 0.6 },\n ],\n },\n\n /** Long press acknowledgment */\n longPress: {\n name: 'ui.longPress',\n steps: [{ type: 'vibrate' as const, duration: 50, intensity: 0.8 }],\n },\n\n /** Toggle switch on */\n toggleOn: {\n name: 'ui.toggleOn',\n steps: [{ type: 'vibrate' as const, duration: 30, intensity: 0.6 }],\n },\n\n /** Toggle switch off */\n toggleOff: {\n name: 'ui.toggleOff',\n steps: [{ type: 'vibrate' as const, duration: 25, intensity: 0.4 }],\n },\n\n /** Slider snap to value */\n sliderSnap: {\n name: 'ui.sliderSnap',\n steps: [{ type: 'vibrate' as const, duration: 25, intensity: 0.5 }],\n },\n\n /** Selection changed */\n selection: {\n name: 'ui.selection',\n steps: [{ type: 'vibrate' as const, duration: 25, intensity: 0.5 }],\n },\n\n /** Pull to refresh threshold reached */\n pullToRefresh: {\n name: 'ui.pullToRefresh',\n steps: [\n { type: 'vibrate' as const, duration: 30, intensity: 0.5 },\n { type: 'pause' as const, duration: 40, intensity: 0 },\n { type: 'vibrate' as const, duration: 40, intensity: 0.7 },\n ],\n },\n\n /** Swipe action triggered */\n swipe: {\n name: 'ui.swipe',\n steps: [\n { type: 'vibrate' as const, duration: 30, intensity: 0.5 },\n { type: 'pause' as const, duration: 30, intensity: 0 },\n { type: 'vibrate' as const, duration: 25, intensity: 0.4 },\n ],\n },\n\n /** Context menu appearance */\n contextMenu: {\n name: 'ui.contextMenu',\n steps: [{ type: 'vibrate' as const, duration: 35, intensity: 0.7 }],\n },\n\n /** Drag start */\n dragStart: {\n name: 'ui.dragStart',\n steps: [{ type: 'vibrate' as const, duration: 30, intensity: 0.5 }],\n },\n\n /** Drag drop */\n drop: {\n name: 'ui.drop',\n steps: [\n { type: 'vibrate' as const, duration: 30, intensity: 0.8 },\n { type: 'pause' as const, duration: 30, intensity: 0 },\n { type: 'vibrate' as const, duration: 25, intensity: 0.5 },\n ],\n },\n} satisfies Record<string, HapticPattern>;\n","import type { HapticPattern } from '../types';\n\n/** Notification feedback presets */\nexport const notifications = {\n /** Success — two ascending pulses */\n success: {\n name: 'notifications.success',\n steps: [\n { type: 'vibrate' as const, duration: 35, intensity: 0.5 },\n { type: 'pause' as const, duration: 60, intensity: 0 },\n { type: 'vibrate' as const, duration: 45, intensity: 0.8 },\n ],\n },\n\n /** Warning — three even pulses */\n warning: {\n name: 'notifications.warning',\n steps: [\n { type: 'vibrate' as const, duration: 40, intensity: 0.7 },\n { type: 'pause' as const, duration: 50, intensity: 0 },\n { type: 'vibrate' as const, duration: 40, intensity: 0.7 },\n { type: 'pause' as const, duration: 50, intensity: 0 },\n { type: 'vibrate' as const, duration: 40, intensity: 0.7 },\n ],\n },\n\n /** Error — two heavy pulses */\n error: {\n name: 'notifications.error',\n steps: [\n { type: 'vibrate' as const, duration: 80, intensity: 1.0 },\n { type: 'pause' as const, duration: 100, intensity: 0 },\n { type: 'vibrate' as const, duration: 80, intensity: 1.0 },\n ],\n },\n\n /** Info — soft single pulse */\n info: {\n name: 'notifications.info',\n steps: [\n { type: 'vibrate' as const, duration: 35, intensity: 0.5 },\n ],\n },\n\n /** Message received */\n messageReceived: {\n name: 'notifications.messageReceived',\n steps: [\n { type: 'vibrate' as const, duration: 30, intensity: 0.5 },\n { type: 'pause' as const, duration: 100, intensity: 0 },\n { type: 'vibrate' as const, duration: 30, intensity: 0.5 },\n ],\n },\n\n /** Alarm — urgent repeating pattern */\n alarm: {\n name: 'notifications.alarm',\n steps: [\n { type: 'vibrate' as const, duration: 100, intensity: 1.0 },\n { type: 'pause' as const, duration: 50, intensity: 0 },\n { type: 'vibrate' as const, duration: 100, intensity: 1.0 },\n { type: 'pause' as const, duration: 50, intensity: 0 },\n { type: 'vibrate' as const, duration: 100, intensity: 1.0 },\n { type: 'pause' as const, duration: 200, intensity: 0 },\n { type: 'vibrate' as const, duration: 100, intensity: 1.0 },\n { type: 'pause' as const, duration: 50, intensity: 0 },\n { type: 'vibrate' as const, duration: 100, intensity: 1.0 },\n { type: 'pause' as const, duration: 50, intensity: 0 },\n { type: 'vibrate' as const, duration: 100, intensity: 1.0 },\n ],\n },\n\n /** Reminder — gentle nudge */\n reminder: {\n name: 'notifications.reminder',\n steps: [\n { type: 'vibrate' as const, duration: 30, intensity: 0.5 },\n { type: 'pause' as const, duration: 150, intensity: 0 },\n { type: 'vibrate' as const, duration: 30, intensity: 0.5 },\n ],\n },\n} satisfies Record<string, HapticPattern>;\n","import type { HapticPattern } from '../types';\n\n/** Gaming haptic presets */\nexport const gaming = {\n /** Explosion — heavy descending */\n explosion: {\n name: 'gaming.explosion',\n steps: [\n { type: 'vibrate' as const, duration: 100, intensity: 1.0 },\n { type: 'vibrate' as const, duration: 80, intensity: 0.8 },\n { type: 'vibrate' as const, duration: 60, intensity: 0.5 },\n { type: 'vibrate' as const, duration: 40, intensity: 0.3 },\n ],\n },\n\n /** Collision — sharp impact */\n collision: {\n name: 'gaming.collision',\n steps: [\n { type: 'vibrate' as const, duration: 40, intensity: 1.0 },\n { type: 'pause' as const, duration: 30, intensity: 0 },\n { type: 'vibrate' as const, duration: 25, intensity: 0.5 },\n ],\n },\n\n /** Heartbeat — rhythmic pulse */\n heartbeat: {\n name: 'gaming.heartbeat',\n steps: [\n { type: 'vibrate' as const, duration: 30, intensity: 0.8 },\n { type: 'pause' as const, duration: 80, intensity: 0 },\n { type: 'vibrate' as const, duration: 40, intensity: 1.0 },\n { type: 'pause' as const, duration: 400, intensity: 0 },\n ],\n },\n\n /** Gunshot — sharp burst */\n gunshot: {\n name: 'gaming.gunshot',\n steps: [\n { type: 'vibrate' as const, duration: 30, intensity: 1.0 },\n { type: 'vibrate' as const, duration: 40, intensity: 0.4 },\n ],\n },\n\n /** Sword clash — metallic ring */\n swordClash: {\n name: 'gaming.swordClash',\n steps: [\n { type: 'vibrate' as const, duration: 25, intensity: 1.0 },\n { type: 'pause' as const, duration: 20, intensity: 0 },\n { type: 'vibrate' as const, duration: 40, intensity: 0.6 },\n { type: 'vibrate' as const, duration: 50, intensity: 0.3 },\n ],\n },\n\n /** Power up — ascending intensity */\n powerUp: {\n name: 'gaming.powerUp',\n steps: [\n { type: 'vibrate' as const, duration: 40, intensity: 0.3 },\n { type: 'vibrate' as const, duration: 40, intensity: 0.5 },\n { type: 'vibrate' as const, duration: 40, intensity: 0.7 },\n { type: 'vibrate' as const, duration: 40, intensity: 0.9 },\n { type: 'vibrate' as const, duration: 60, intensity: 1.0 },\n ],\n },\n\n /** Damage taken — heavy stutter */\n damage: {\n name: 'gaming.damage',\n steps: [\n { type: 'vibrate' as const, duration: 50, intensity: 0.9 },\n { type: 'pause' as const, duration: 25, intensity: 0 },\n { type: 'vibrate' as const, duration: 40, intensity: 0.6 },\n { type: 'pause' as const, duration: 25, intensity: 0 },\n { type: 'vibrate' as const, duration: 30, intensity: 0.4 },\n ],\n },\n\n /** Item pickup — light cheerful */\n pickup: {\n name: 'gaming.pickup',\n steps: [\n { type: 'vibrate' as const, duration: 25, intensity: 0.4 },\n { type: 'pause' as const, duration: 40, intensity: 0 },\n { type: 'vibrate' as const, duration: 30, intensity: 0.7 },\n ],\n },\n\n /** Level complete — celebratory */\n levelComplete: {\n name: 'gaming.levelComplete',\n steps: [\n { type: 'vibrate' as const, duration: 30, intensity: 0.5 },\n { type: 'pause' as const, duration: 60, intensity: 0 },\n { type: 'vibrate' as const, duration: 30, intensity: 0.5 },\n { type: 'pause' as const, duration: 60, intensity: 0 },\n { type: 'vibrate' as const, duration: 40, intensity: 0.7 },\n { type: 'pause' as const, duration: 60, intensity: 0 },\n { type: 'vibrate' as const, duration: 60, intensity: 1.0 },\n ],\n },\n\n /** Engine rumble — continuous vibration */\n engineRumble: {\n name: 'gaming.engineRumble',\n steps: [\n { type: 'vibrate' as const, duration: 40, intensity: 0.5 },\n { type: 'pause' as const, duration: 15, intensity: 0 },\n { type: 'vibrate' as const, duration: 40, intensity: 0.6 },\n { type: 'pause' as const, duration: 15, intensity: 0 },\n { type: 'vibrate' as const, duration: 40, intensity: 0.5 },\n { type: 'pause' as const, duration: 15, intensity: 0 },\n { type: 'vibrate' as const, duration: 40, intensity: 0.6 },\n ],\n },\n} satisfies Record<string, HapticPattern>;\n","import type { HapticPattern } from '../types';\n\n/** Accessibility-focused haptic presets — rhythmic patterns for non-visual feedback */\nexport const accessibility = {\n /** Confirm action — clear double pulse */\n confirm: {\n name: 'accessibility.confirm',\n steps: [\n { type: 'vibrate' as const, duration: 35, intensity: 0.7 },\n { type: 'pause' as const, duration: 100, intensity: 0 },\n { type: 'vibrate' as const, duration: 35, intensity: 0.7 },\n ],\n },\n\n /** Deny/reject — long single buzz */\n deny: {\n name: 'accessibility.deny',\n steps: [\n { type: 'vibrate' as const, duration: 200, intensity: 0.8 },\n ],\n },\n\n /** Boundary reached (e.g., scroll limit, min/max value) */\n boundary: {\n name: 'accessibility.boundary',\n steps: [\n { type: 'vibrate' as const, duration: 30, intensity: 1.0 },\n ],\n },\n\n /** Focus change — subtle tick */\n focusChange: {\n name: 'accessibility.focusChange',\n steps: [\n { type: 'vibrate' as const, duration: 25, intensity: 0.5 },\n ],\n },\n\n /** Counting rhythm — one tick per count */\n countTick: {\n name: 'accessibility.countTick',\n steps: [\n { type: 'vibrate' as const, duration: 25, intensity: 0.5 },\n ],\n },\n\n /** Navigation landmark reached */\n landmark: {\n name: 'accessibility.landmark',\n steps: [\n { type: 'vibrate' as const, duration: 25, intensity: 0.6 },\n { type: 'pause' as const, duration: 40, intensity: 0 },\n { type: 'vibrate' as const, duration: 25, intensity: 0.6 },\n { type: 'pause' as const, duration: 40, intensity: 0 },\n { type: 'vibrate' as const, duration: 25, intensity: 0.6 },\n ],\n },\n\n /** Progress checkpoint — escalating feedback */\n progressCheckpoint: {\n name: 'accessibility.progressCheckpoint',\n steps: [\n { type: 'vibrate' as const, duration: 30, intensity: 0.5 },\n { type: 'pause' as const, duration: 60, intensity: 0 },\n { type: 'vibrate' as const, duration: 35, intensity: 0.7 },\n ],\n },\n} satisfies Record<string, HapticPattern>;\n","import type { HapticPattern } from '../types';\n\n/** System-level haptic presets */\nexport const system = {\n /** Keyboard key press */\n keyPress: {\n name: 'system.keyPress',\n steps: [{ type: 'vibrate' as const, duration: 25, intensity: 0.5 }],\n },\n\n /** Scroll tick (detent-like) */\n scrollTick: {\n name: 'system.scrollTick',\n steps: [{ type: 'vibrate' as const, duration: 20, intensity: 0.4 }],\n },\n\n /** Scroll boundary reached */\n scrollBounce: {\n name: 'system.scrollBounce',\n steps: [\n { type: 'vibrate' as const, duration: 25, intensity: 0.6 },\n { type: 'vibrate' as const, duration: 30, intensity: 0.4 },\n ],\n },\n\n /** Delete action */\n delete: {\n name: 'system.delete',\n steps: [\n { type: 'vibrate' as const, duration: 30, intensity: 0.5 },\n { type: 'pause' as const, duration: 50, intensity: 0 },\n { type: 'vibrate' as const, duration: 40, intensity: 0.8 },\n ],\n },\n\n /** Undo action */\n undo: {\n name: 'system.undo',\n steps: [\n { type: 'vibrate' as const, duration: 30, intensity: 0.5 },\n { type: 'pause' as const, duration: 80, intensity: 0 },\n { type: 'vibrate' as const, duration: 25, intensity: 0.4 },\n ],\n },\n\n /** Copy to clipboard */\n copy: {\n name: 'system.copy',\n steps: [{ type: 'vibrate' as const, duration: 30, intensity: 0.5 }],\n },\n\n /** Paste from clipboard */\n paste: {\n name: 'system.paste',\n steps: [\n { type: 'vibrate' as const, duration: 25, intensity: 0.4 },\n { type: 'pause' as const, duration: 30, intensity: 0 },\n { type: 'vibrate' as const, duration: 30, intensity: 0.6 },\n ],\n },\n} satisfies Record<string, HapticPattern>;\n","import type { HapticPattern } from '../types';\n\n/** Emotion-based haptic presets */\nexport const emotions = {\n /** Excited — fast, energetic pulses building up */\n excited: {\n name: 'emotions.excited',\n steps: [\n { type: 'vibrate' as const, duration: 30, intensity: 0.5 },\n { type: 'pause' as const, duration: 30, intensity: 0 },\n { type: 'vibrate' as const, duration: 30, intensity: 0.6 },\n { type: 'pause' as const, duration: 25, intensity: 0 },\n { type: 'vibrate' as const, duration: 35, intensity: 0.7 },\n { type: 'pause' as const, duration: 25, intensity: 0 },\n { type: 'vibrate' as const, duration: 35, intensity: 0.8 },\n { type: 'pause' as const, duration: 25, intensity: 0 },\n { type: 'vibrate' as const, duration: 40, intensity: 0.9 },\n { type: 'vibrate' as const, duration: 50, intensity: 1.0 },\n ],\n },\n\n /** Calm — slow, gentle wave with soft sustained vibrations */\n calm: {\n name: 'emotions.calm',\n steps: [\n { type: 'vibrate' as const, duration: 80, intensity: 0.2 },\n { type: 'pause' as const, duration: 200, intensity: 0 },\n { type: 'vibrate' as const, duration: 100, intensity: 0.25 },\n { type: 'pause' as const, duration: 250, intensity: 0 },\n { type: 'vibrate' as const, duration: 80, intensity: 0.2 },\n { type: 'pause' as const, duration: 200, intensity: 0 },\n { type: 'vibrate' as const, duration: 100, intensity: 0.15 },\n ],\n },\n\n /** Tense — tight, irregular short heavy bursts */\n tense: {\n name: 'emotions.tense',\n steps: [\n { type: 'vibrate' as const, duration: 35, intensity: 0.8 },\n { type: 'pause' as const, duration: 40, intensity: 0 },\n { type: 'vibrate' as const, duration: 30, intensity: 0.9 },\n { type: 'pause' as const, duration: 30, intensity: 0 },\n { type: 'vibrate' as const, duration: 40, intensity: 0.85 },\n { type: 'pause' as const, duration: 35, intensity: 0 },\n { type: 'vibrate' as const, duration: 30, intensity: 0.9 },\n { type: 'pause' as const, duration: 45, intensity: 0 },\n { type: 'vibrate' as const, duration: 35, intensity: 0.8 },\n ],\n },\n\n /** Happy — bouncy, playful ascending rhythm */\n happy: {\n name: 'emotions.happy',\n steps: [\n { type: 'vibrate' as const, duration: 30, intensity: 0.4 },\n { type: 'pause' as const, duration: 50, intensity: 0 },\n { type: 'vibrate' as const, duration: 35, intensity: 0.5 },\n { type: 'pause' as const, duration: 50, intensity: 0 },\n { type: 'vibrate' as const, duration: 35, intensity: 0.6 },\n { type: 'pause' as const, duration: 40, intensity: 0 },\n { type: 'vibrate' as const, duration: 40, intensity: 0.7 },\n { type: 'pause' as const, duration: 40, intensity: 0 },\n { type: 'vibrate' as const, duration: 45, intensity: 0.8 },\n ],\n },\n\n /** Sad — slow, heavy, descending vibrations that fade */\n sad: {\n name: 'emotions.sad',\n steps: [\n { type: 'vibrate' as const, duration: 100, intensity: 0.8 },\n { type: 'pause' as const, duration: 120, intensity: 0 },\n { type: 'vibrate' as const, duration: 90, intensity: 0.6 },\n { type: 'pause' as const, duration: 140, intensity: 0 },\n { type: 'vibrate' as const, duration: 80, intensity: 0.4 },\n { type: 'pause' as const, duration: 160, intensity: 0 },\n { type: 'vibrate' as const, duration: 70, intensity: 0.25 },\n ],\n },\n\n /** Angry — aggressive, chaotic heavy rapid hits */\n angry: {\n name: 'emotions.angry',\n steps: [\n { type: 'vibrate' as const, duration: 40, intensity: 1.0 },\n { type: 'pause' as const, duration: 25, intensity: 0 },\n { type: 'vibrate' as const, duration: 35, intensity: 0.9 },\n { type: 'pause' as const, duration: 25, intensity: 0 },\n { type: 'vibrate' as const, duration: 45, intensity: 1.0 },\n { type: 'pause' as const, duration: 30, intensity: 0 },\n { type: 'vibrate' as const, duration: 40, intensity: 0.95 },\n { type: 'vibrate' as const, duration: 50, intensity: 1.0 },\n { type: 'pause' as const, duration: 25, intensity: 0 },\n { type: 'vibrate' as const, duration: 45, intensity: 0.9 },\n ],\n },\n\n /** Surprised — sharp sudden hit, silence, then lighter hit */\n surprised: {\n name: 'emotions.surprised',\n steps: [\n { type: 'vibrate' as const, duration: 40, intensity: 1.0 },\n { type: 'pause' as const, duration: 200, intensity: 0 },\n { type: 'vibrate' as const, duration: 30, intensity: 0.4 },\n ],\n },\n\n /** Anxious — fast irregular heartbeat with inconsistent spacing */\n anxious: {\n name: 'emotions.anxious',\n steps: [\n { type: 'vibrate' as const, duration: 30, intensity: 0.7 },\n { type: 'pause' as const, duration: 60, intensity: 0 },\n { type: 'vibrate' as const, duration: 35, intensity: 0.8 },\n { type: 'pause' as const, duration: 40, intensity: 0 },\n { type: 'vibrate' as const, duration: 25, intensity: 0.6 },\n { type: 'pause' as const, duration: 80, intensity: 0 },\n { type: 'vibrate' as const, duration: 30, intensity: 0.75 },\n { type: 'pause' as const, duration: 50, intensity: 0 },\n { type: 'vibrate' as const, duration: 35, intensity: 0.85 },\n { type: 'pause' as const, duration: 35, intensity: 0 },\n { type: 'vibrate' as const, duration: 30, intensity: 0.7 },\n ],\n },\n\n /** Confident — strong, steady, measured even pulses */\n confident: {\n name: 'emotions.confident',\n steps: [\n { type: 'vibrate' as const, duration: 50, intensity: 0.8 },\n { type: 'pause' as const, duration: 80, intensity: 0 },\n { type: 'vibrate' as const, duration: 50, intensity: 0.8 },\n { type: 'pause' as const, duration: 80, intensity: 0 },\n { type: 'vibrate' as const, duration: 50, intensity: 0.8 },\n { type: 'pause' as const, duration: 80, intensity: 0 },\n { type: 'vibrate' as const, duration: 50, intensity: 0.8 },\n ],\n },\n\n /** Playful — alternating light-heavy in bouncy rhythm */\n playful: {\n name: 'emotions.playful',\n steps: [\n { type: 'vibrate' as const, duration: 25, intensity: 0.3 },\n { type: 'pause' as const, duration: 40, intensity: 0 },\n { type: 'vibrate' as const, duration: 40, intensity: 0.7 },\n { type: 'pause' as const, duration: 50, intensity: 0 },\n { type: 'vibrate' as const, duration: 25, intensity: 0.35 },\n { type: 'pause' as const, duration: 40, intensity: 0 },\n { type: 'vibrate' as const, duration: 40, intensity: 0.75 },\n { type: 'pause' as const, duration: 50, intensity: 0 },\n { type: 'vibrate' as const, duration: 25, intensity: 0.3 },\n { type: 'pause' as const, duration: 40, intensity: 0 },\n { type: 'vibrate' as const, duration: 45, intensity: 0.8 },\n ],\n },\n\n /** Romantic — gentle heartbeat rhythm, two soft pulses, long pause, repeat */\n romantic: {\n name: 'emotions.romantic',\n steps: [\n { type: 'vibrate' as const, duration: 35, intensity: 0.4 },\n { type: 'pause' as const, duration: 60, intensity: 0 },\n { type: 'vibrate' as const, duration: 45, intensity: 0.5 },\n { type: 'pause' as const, duration: 300, intensity: 0 },\n { type: 'vibrate' as const, duration: 35, intensity: 0.4 },\n { type: 'pause' as const, duration: 60, intensity: 0 },\n { type: 'vibrate' as const, duration: 45, intensity: 0.5 },\n { type: 'pause' as const, duration: 300, intensity: 0 },\n { type: 'vibrate' as const, duration: 35, intensity: 0.4 },\n { type: 'pause' as const, duration: 60, intensity: 0 },\n { type: 'vibrate' as const, duration: 45, intensity: 0.5 },\n ],\n },\n\n /** Peaceful — very subtle, barely-there ultra-light slow pulses */\n peaceful: {\n name: 'emotions.peaceful',\n steps: [\n { type: 'vibrate' as const, duration: 60, intensity: 0.1 },\n { type: 'pause' as const, duration: 300, intensity: 0 },\n { type: 'vibrate' as const, duration: 70, intensity: 0.12 },\n { type: 'pause' as const, duration: 350, intensity: 0 },\n { type: 'vibrate' as const, duration: 60, intensity: 0.1 },\n { type: 'pause' as const, duration: 300, intensity: 0 },\n { type: 'vibrate' as const, duration: 70, intensity: 0.08 },\n ],\n },\n} satisfies Record<string, HapticPattern>;\n","export { ui } from './ui';\nexport { notifications } from './notifications';\nexport { gaming } from './gaming';\nexport { accessibility } from './accessibility';\nexport { system } from './system';\nexport { emotions } from './emotions';\n\nimport { ui } from './ui';\nimport { notifications } from './notifications';\nimport { gaming } from './gaming';\nimport { accessibility } from './accessibility';\nimport { system } from './system';\nimport { emotions } from './emotions';\n\n/** All presets grouped by category */\nexport const presets = {\n ui,\n notifications,\n gaming,\n accessibility,\n system,\n emotions,\n} as const;\n","import type { HapticPattern, HapticStep } from '../types';\n\n// ─── Option types ───────────────────────────────────────────\n\nexport interface SpringOptions {\n /** Spring stiffness 0.5-1.0 */\n stiffness?: number;\n /** Damping factor 0.1-0.9 */\n damping?: number;\n /** Total duration in ms */\n duration?: number;\n}\n\nexport interface BounceOptions {\n /** Initial height 0.5-1.0 */\n height?: number;\n /** Bounciness factor 0.3-0.9 */\n bounciness?: number;\n /** Number of bounces */\n bounces?: number;\n}\n\nexport interface FrictionOptions {\n /** Surface roughness 0.1-1.0 */\n roughness?: number;\n /** Sliding speed 0.1-1.0 */\n speed?: number;\n /** Total duration in ms */\n duration?: number;\n}\n\nexport interface ImpactOptions {\n /** Object mass 0.1-1.0 */\n mass?: number;\n /** Surface hardness 0.1-1.0 */\n hardness?: number;\n}\n\nexport interface GravityOptions {\n /** Fall distance 0.3-1.0 */\n distance?: number;\n /** Total duration in ms */\n duration?: number;\n}\n\nexport interface ElasticOptions {\n /** Stretch amount 0.3-1.0 */\n stretch?: number;\n /** Snap-back speed 0.3-1.0 */\n snapSpeed?: number;\n}\n\nexport interface WaveOptions {\n /** Wave amplitude 0.3-1.0 */\n amplitude?: number;\n /** Wave frequency 0.5-2.0 */\n frequency?: number;\n /** Number of full cycles */\n cycles?: number;\n}\n\nexport interface PendulumOptions {\n /** Swing energy 0.3-1.0 */\n energy?: number;\n /** Number of swings */\n swings?: number;\n}\n\n// ─── Helpers ────────────────────────────────────────────────\n\nconst clamp = (v: number, min: number, max: number): number =>\n Math.min(max, Math.max(min, v));\n\nconst step = (\n type: 'vibrate' | 'pause',\n duration: number,\n intensity: number,\n): HapticStep => ({\n type,\n duration: Math.max(25, Math.round(duration)),\n intensity: clamp(Math.round(intensity * 100) / 100, 0, 1),\n});\n\n// ─── Physics patterns ───────────────────────────────────────\n\n/** Bouncy spring oscillation — starts heavy, bounces with decreasing intensity */\nexport function spring(options?: SpringOptions): HapticPattern {\n const stiffness = clamp(options?.stiffness ?? 0.7, 0.5, 1.0);\n const damping = clamp(options?.damping ?? 0.3, 0.1, 0.9);\n const duration = options?.duration ?? 500;\n\n const numSteps = Math.round(10 + stiffness * 5); // 10-15 steps\n const stepDuration = duration / numSteps;\n const steps: HapticStep[] = [];\n\n for (let i = 0; i < numSteps; i++) {\n const t = i / (numSteps - 1);\n const decay = Math.exp(-damping * t * 5);\n const oscillation = Math.abs(Math.cos(t * Math.PI * stiffness * 4));\n const intensity = decay * oscillation * stiffness;\n\n if (intensity > 0.05) {\n steps.push(step('vibrate', stepDuration, intensity));\n } else {\n steps.push(step('pause', stepDuration, 0));\n }\n }\n\n return { name: 'physics.spring', steps };\n}\n\n/** Ball bouncing — each bounce is shorter and lighter */\nexport function bounce(options?: BounceOptions): HapticPattern {\n const height = clamp(options?.height ?? 1.0, 0.5, 1.0);\n const bounciness = clamp(options?.bounciness ?? 0.6, 0.3, 0.9);\n const bounces = options?.bounces ?? 5;\n\n const steps: HapticStep[] = [];\n let currentHeight = height;\n\n for (let i = 0; i < bounces; i++) {\n const vibDuration = 40 + currentHeight * 60;\n const pauseDuration = 30 + currentHeight * 70;\n\n steps.push(step('vibrate', vibDuration, currentHeight));\n if (i < bounces - 1) {\n steps.push(step('pause', pauseDuration, 0));\n }\n\n currentHeight *= bounciness;\n }\n\n return { name: 'physics.bounce', steps };\n}\n\n/** Rough surface sliding — continuous but slightly irregular vibration */\nexport function friction(options?: FrictionOptions): HapticPattern {\n const roughness = clamp(options?.roughness ?? 0.5, 0.1, 1.0);\n const speed = clamp(options?.speed ?? 0.5, 0.1, 1.0);\n const duration = options?.duration ?? 300;\n\n const pulseCount = Math.round(4 + speed * 8);\n const pulseDuration = duration / pulseCount;\n const steps: HapticStep[] = [];\n\n for (let i = 0; i < pulseCount; i++) {\n // Irregular intensity based on roughness\n const variation = ((Math.sin(i * 7.3) + 1) / 2) * roughness * 0.4;\n const baseIntensity = 0.3 + roughness * 0.4;\n const intensity = baseIntensity + variation;\n\n steps.push(step('vibrate', pulseDuration * 0.7, intensity));\n steps.push(step('pause', pulseDuration * 0.3, 0));\n }\n\n return { name: 'physics.friction', steps };\n}\n\n/** Collision with surface — sharp initial hit followed by resonance */\nexport function impact(options?: ImpactOptions): HapticPattern {\n const mass = clamp(options?.mass ?? 0.5, 0.1, 1.0);\n const hardness = clamp(options?.hardness ?? 0.7, 0.1, 1.0);\n\n const steps: HapticStep[] = [];\n\n // Initial heavy hit\n const hitDuration = 30 + mass * 50;\n const hitIntensity = 0.5 + mass * 0.5;\n steps.push(step('vibrate', hitDuration, hitIntensity));\n\n // Resonance — decaying smaller vibrations\n const resonanceCount = Math.round(2 + hardness * 4);\n let decayIntensity = hitIntensity * 0.6;\n\n for (let i = 0; i < resonanceCount; i++) {\n const pauseDur = 25 + (1 - hardness) * 30;\n steps.push(step('pause', pauseDur, 0));\n steps.push(step('vibrate', 25 + mass * 20, decayIntensity));\n decayIntensity *= 0.5;\n }\n\n return { name: 'physics.impact', steps };\n}\n\n/** Falling sensation — accelerating intensity */\nexport function gravity(options?: GravityOptions): HapticPattern {\n const distance = clamp(options?.distance ?? 1.0, 0.3, 1.0);\n const duration = options?.duration ?? 400;\n\n const numSteps = Math.round(6 + distance * 4);\n const stepDuration = duration / numSteps;\n const steps: HapticStep[] = [];\n\n for (let i = 0; i < numSteps; i++) {\n const t = i / (numSteps - 1);\n // Quadratic acceleration like gravity: v = g*t, intensity ~ t^2\n const intensity = t * t * distance;\n steps.push(step('vibrate', stepDuration, Math.max(0.1, intensity)));\n }\n\n return { name: 'physics.gravity', steps };\n}\n\n/** Rubber band snap — stretch and snap back */\nexport function elastic(options?: ElasticOptions): HapticPattern {\n const stretch = clamp(options?.stretch ?? 0.7, 0.3, 1.0);\n const snapSpeed = clamp(options?.snapSpeed ?? 0.8, 0.3, 1.0);\n\n const steps: HapticStep[] = [];\n\n // Building tension — increasing intensity\n const tensionSteps = Math.round(3 + stretch * 3);\n for (let i = 0; i < tensionSteps; i++) {\n const t = (i + 1) / tensionSteps;\n const intensity = t * stretch * 0.6;\n steps.push(step('vibrate', 40 + (1 - snapSpeed) * 30, intensity));\n }\n\n // Sharp snap\n steps.push(step('vibrate', 25 + (1 - snapSpeed) * 20, 0.8 + stretch * 0.2));\n\n // Snap recoil — quick decay\n const recoilIntensity = 0.4 * snapSpeed;\n steps.push(step('vibrate', 30, recoilIntensity));\n steps.push(step('vibrate', 25, recoilIntensity * 0.4));\n\n return { name: 'physics.elastic', steps };\n}\n\n/** Ocean wave motion — smooth sine-wave-like intensity */\nexport function wave(options?: WaveOptions): HapticPattern {\n const amplitude = clamp(options?.amplitude ?? 0.7, 0.3, 1.0);\n const frequency = clamp(options?.frequency ?? 1.0, 0.5, 2.0);\n const cycles = options?.cycles ?? 2;\n\n const stepsPerCycle = Math.round(8 / frequency);\n const totalSteps = stepsPerCycle * cycles;\n const stepDuration = (400 / frequency) / stepsPerCycle;\n const steps: HapticStep[] = [];\n\n for (let i = 0; i < totalSteps; i++) {\n const t = i / stepsPerCycle;\n const sineValue = (Math.sin(t * 2 * Math.PI) + 1) / 2;\n const intensity = 0.1 + sineValue * amplitude * 0.9;\n steps.push(step('vibrate', stepDuration, intensity));\n }\n\n return { name: 'physics.wave', steps };\n}\n\n/** Swinging motion — intensity peaks at ends, quiet in middle */\nexport function pendulum(options?: PendulumOptions): HapticPattern {\n const energy = clamp(options?.energy ?? 0.8, 0.3, 1.0);\n const swings = options?.swings ?? 3;\n\n const stepsPerSwing = 6;\n const steps: HapticStep[] = [];\n\n for (let s = 0; s < swings; s++) {\n const swingEnergy = energy * Math.pow(0.8, s); // decay per swing\n\n for (let i = 0; i < stepsPerSwing; i++) {\n const t = i / (stepsPerSwing - 1);\n // Peaks at 0 and 1 (ends), low in middle\n const swing = Math.abs(Math.cos(t * Math.PI));\n const intensity = swing * swingEnergy;\n\n if (intensity > 0.05) {\n steps.push(step('vibrate', 35, intensity));\n } else {\n steps.push(step('pause', 35, 0));\n }\n }\n }\n\n return { name: 'physics.pendulum', steps };\n}\n","export {\n spring,\n bounce,\n friction,\n impact,\n gravity,\n elastic,\n wave,\n pendulum,\n} from './physics-patterns';\n\nexport type {\n SpringOptions,\n BounceOptions,\n FrictionOptions,\n ImpactOptions,\n GravityOptions,\n ElasticOptions,\n WaveOptions,\n PendulumOptions,\n} from './physics-patterns';\n\nimport {\n spring,\n bounce,\n friction,\n impact,\n gravity,\n elastic,\n wave,\n pendulum,\n} from './physics-patterns';\n\n/** All physics-based haptic pattern generators */\nexport const physics = {\n spring,\n bounce,\n friction,\n impact,\n gravity,\n elastic,\n wave,\n pendulum,\n} as const;\n","// Types\nexport type {\n HapticStep,\n HapticPattern,\n EasingFunction,\n ImpactStyle,\n NotificationType,\n SemanticEffect,\n AdapterCapabilities,\n HapticAdapter,\n HapticConfig,\n FallbackConfig,\n VisualFallbackStyle,\n HPLToken,\n HPLTokenType,\n HPLNode,\n HPLNodeType,\n} from './types';\n\n// Engine\nexport { HapticEngine } from './engine';\nexport { AdaptiveEngine, FallbackManager, detectAdapter } from './engine';\nexport { SensoryEngine } from './engine';\nexport type { SensoryEngineOptions } from './engine';\n\n// Adapters\nexport { NoopAdapter, WebVibrationAdapter, IoSAudioAdapter } from './adapters';\n\n// Patterns\nexport { parseHPL, HPLParser, HPLParserError } from './patterns';\nexport { compile, optimizeSteps } from './patterns';\nexport { tokenize, HPLTokenizerError } from './patterns';\nexport { validateHPL } from './patterns';\nexport type { ValidationResult } from './patterns';\nexport {\n exportPattern,\n importPattern,\n patternToJSON,\n patternFromJSON,\n patternToDataURL,\n patternFromDataURL,\n} from './patterns';\nexport type { HapticPatternExport, ExportOptions } from './patterns';\n\n// Composer\nexport { PatternComposer } from './composer';\n\n// Recorder\nexport { PatternRecorder } from './recorder';\n\n// Presets\nexport { presets, ui, notifications, gaming, accessibility, system, emotions } from './presets';\n\n// Physics\nexport { physics } from './physics';\nexport {\n spring,\n bounce,\n friction,\n impact,\n gravity,\n elastic,\n wave,\n pendulum,\n} from './physics';\nexport type {\n SpringOptions,\n BounceOptions,\n FrictionOptions,\n ImpactOptions,\n GravityOptions,\n ElasticOptions,\n WaveOptions,\n PendulumOptions,\n} from './physics';\n\n// Sound\nexport { SoundEngine } from './sound';\nexport type { SoundEngineOptions, ClickOptions, ToneOptions } from './sound';\n\n// Visual\nexport { VisualEngine } from './visual';\nexport type {\n VisualEngineOptions,\n FlashOptions,\n ShakeOptions,\n PulseOptions,\n RippleOptions,\n GlowOptions,\n BounceOptions as VisualBounceOptions,\n JelloOptions,\n RubberOptions,\n HighlightOptions,\n} from './visual';\n\n// Themes\nexport { ThemeManager, themes } from './themes';\nexport type { ThemePreset } from './themes';\n\n// Utils\nexport { detectPlatform } from './utils';\nexport type { PlatformInfo } from './utils';\n\n// ─── Default singleton ──────────────────────────────────────\n\nimport { HapticEngine } from './engine';\n\n/**\n * Pre-configured haptic engine singleton.\n * Import and use directly for quick haptic feedback:\n *\n * import { haptic } from '@hapticjs/core';\n * haptic.tap();\n * haptic.success();\n * haptic.play('~~..##..@@');\n */\nexport const haptic = HapticEngine.create();\n"]}