@hapticjs/core 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +741 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +296 -1
- package/dist/index.d.ts +296 -1
- package/dist/index.js +729 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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"]}
|
|
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/middleware/middleware.ts","../src/profiles/intensity-profiles.ts","../src/experiment/ab-testing.ts","../src/rhythm/rhythm-sync.ts","../src/motion/motion-detector.ts","../src/accessibility/haptic-a11y.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","import type { HapticStep } from '../types';\n\n/** A middleware that intercepts and transforms haptic patterns before playback */\nexport type HapticMiddleware = {\n name: string;\n process: (steps: HapticStep[]) => HapticStep[];\n};\n\n/**\n * Manages a pipeline of middleware that transform haptic patterns.\n *\n * Usage:\n * const manager = new MiddlewareManager();\n * manager.use(intensityScaler(0.5));\n * manager.use(durationScaler(2));\n * const transformed = manager.process(steps);\n */\nexport class MiddlewareManager {\n private middleware: HapticMiddleware[] = [];\n\n /** Register a middleware */\n use(middleware: HapticMiddleware): void {\n this.middleware.push(middleware);\n }\n\n /** Remove a middleware by name */\n remove(name: string): void {\n this.middleware = this.middleware.filter((m) => m.name !== name);\n }\n\n /** Run all middleware in order */\n process(steps: HapticStep[]): HapticStep[] {\n let result = steps;\n for (const m of this.middleware) {\n result = m.process(result);\n }\n return result;\n }\n\n /** Remove all middleware */\n clear(): void {\n this.middleware = [];\n }\n\n /** List registered middleware names */\n list(): string[] {\n return this.middleware.map((m) => m.name);\n }\n}\n\n// ─── Built-in middleware factories ─────────────────────────\n\n/** Multiplies all intensities by a scale factor, clamped to 0-1 */\nexport function intensityScaler(scale: number): HapticMiddleware {\n return {\n name: 'intensityScaler',\n process: (steps) =>\n steps.map((s) => ({\n ...s,\n intensity: Math.min(1, Math.max(0, s.intensity * scale)),\n })),\n };\n}\n\n/** Multiplies all durations by a scale factor, enforces minimum 20ms */\nexport function durationScaler(scale: number): HapticMiddleware {\n return {\n name: 'durationScaler',\n process: (steps) =>\n steps.map((s) => ({\n ...s,\n duration: Math.max(20, Math.round(s.duration * scale)),\n })),\n };\n}\n\n/** Clamps all intensities to [min, max] */\nexport function intensityClamper(min: number, max: number): HapticMiddleware {\n return {\n name: 'intensityClamper',\n process: (steps) =>\n steps.map((s) => ({\n ...s,\n intensity: Math.min(max, Math.max(min, s.intensity)),\n })),\n };\n}\n\n/** Repeats the entire pattern N times */\nexport function patternRepeater(times: number): HapticMiddleware {\n return {\n name: 'patternRepeater',\n process: (steps) => {\n const result: HapticStep[] = [];\n for (let i = 0; i < times; i++) {\n result.push(...steps.map((s) => ({ ...s })));\n }\n return result;\n },\n };\n}\n\n/** Reverses the step order */\nexport function reverser(): HapticMiddleware {\n return {\n name: 'reverser',\n process: (steps) => [...steps].reverse(),\n };\n}\n\n/** Increases all intensities by 30% and durations by 20% for accessibility */\nexport function accessibilityBooster(): HapticMiddleware {\n return {\n name: 'accessibilityBooster',\n process: (steps) =>\n steps.map((s) => ({\n ...s,\n intensity: Math.min(1, s.intensity * 1.3),\n duration: Math.max(20, Math.round(s.duration * 1.2)),\n })),\n };\n}\n","import type { HapticMiddleware } from '../middleware';\nimport { intensityScaler, durationScaler } from '../middleware';\n\n/** User preference profile that scales all haptic feedback */\nexport type IntensityProfile = {\n name: string;\n /** 0-2 multiplier for vibration intensity */\n hapticScale: number;\n /** 0-2 multiplier for durations */\n durationScale: number;\n /** Whether sound feedback is enabled */\n soundEnabled: boolean;\n /** Sound volume from 0-1 */\n soundVolume: number;\n /** Whether visual feedback is enabled */\n visualEnabled: boolean;\n};\n\n// ─── Built-in profiles ─────────────────────────────────────\n\nexport const profiles: Record<string, IntensityProfile> = {\n off: {\n name: 'off',\n hapticScale: 0,\n durationScale: 0,\n soundEnabled: false,\n soundVolume: 0,\n visualEnabled: false,\n },\n subtle: {\n name: 'subtle',\n hapticScale: 0.5,\n durationScale: 0.7,\n soundEnabled: true,\n soundVolume: 0.1,\n visualEnabled: true,\n },\n normal: {\n name: 'normal',\n hapticScale: 1.0,\n durationScale: 1.0,\n soundEnabled: true,\n soundVolume: 0.3,\n visualEnabled: true,\n },\n strong: {\n name: 'strong',\n hapticScale: 1.3,\n durationScale: 1.2,\n soundEnabled: true,\n soundVolume: 0.5,\n visualEnabled: true,\n },\n intense: {\n name: 'intense',\n hapticScale: 1.8,\n durationScale: 1.5,\n soundEnabled: true,\n soundVolume: 0.7,\n visualEnabled: true,\n },\n accessible: {\n name: 'accessible',\n hapticScale: 1.5,\n durationScale: 1.3,\n soundEnabled: true,\n soundVolume: 0.6,\n visualEnabled: true,\n },\n};\n\n/**\n * Manages user intensity profiles for haptic feedback.\n *\n * Usage:\n * const pm = new ProfileManager();\n * pm.setProfile('strong');\n * const mw = pm.toMiddleware();\n */\nexport class ProfileManager {\n private currentProfile: IntensityProfile;\n private registry: Map<string, IntensityProfile>;\n\n constructor() {\n this.registry = new Map();\n for (const [name, profile] of Object.entries(profiles)) {\n this.registry.set(name, profile);\n }\n this.currentProfile = profiles.normal!;\n }\n\n /** Apply a profile by name or custom profile object */\n setProfile(name: string | IntensityProfile): void {\n if (typeof name === 'string') {\n const profile = this.registry.get(name);\n if (!profile) {\n throw new Error(`Unknown profile: \"${name}\"`);\n }\n this.currentProfile = profile;\n } else {\n this.registry.set(name.name, name);\n this.currentProfile = name;\n }\n }\n\n /** Get the current profile */\n getProfile(): IntensityProfile {\n return this.currentProfile;\n }\n\n /** List available profile names */\n listProfiles(): string[] {\n return Array.from(this.registry.keys());\n }\n\n /** Register a custom profile */\n registerProfile(profile: IntensityProfile): void {\n this.registry.set(profile.name, profile);\n }\n\n /** Convert current profile to a HapticMiddleware (intensity + duration scaling) */\n toMiddleware(): HapticMiddleware {\n const profile = this.currentProfile;\n const iScaler = intensityScaler(profile.hapticScale);\n const dScaler = durationScaler(profile.durationScale);\n\n return {\n name: `profile:${profile.name}`,\n process: (steps) => dScaler.process(iScaler.process(steps)),\n };\n }\n\n /** Current profile name */\n get current(): string {\n return this.currentProfile.name;\n }\n}\n","import type { HapticStep, HapticPattern } from '../types';\n\n/** A tracked event entry */\ninterface TrackingEntry {\n userId: string;\n variant: string;\n event: string;\n value?: number;\n timestamp: number;\n}\n\n/** Aggregated results per variant */\ninterface VariantResult {\n assignments: number;\n events: Record<string, number>;\n}\n\n/**\n * A/B test different haptic patterns to see which users prefer.\n *\n * Usage:\n * const exp = new HapticExperiment('checkout', { a: 'tap', b: 'success' });\n * const variant = exp.assign('user-123');\n * const pattern = exp.getVariant('user-123');\n * exp.track('user-123', 'conversion');\n */\nexport class HapticExperiment {\n private _name: string;\n private variants: Record<string, string | HapticPattern | HapticStep[]>;\n private variantNames: string[];\n private assignments: Map<string, string> = new Map();\n private tracking: TrackingEntry[] = [];\n\n constructor(\n name: string,\n variants: Record<string, string | HapticPattern | HapticStep[]>,\n ) {\n this._name = name;\n this.variants = variants;\n this.variantNames = Object.keys(variants);\n\n if (this.variantNames.length === 0) {\n throw new Error('Experiment must have at least one variant');\n }\n }\n\n /** Experiment name */\n get name(): string {\n return this._name;\n }\n\n /**\n * Randomly assign a variant (consistent for same userId via simple hash).\n * If no userId is provided, generates a random assignment.\n */\n assign(userId?: string): string {\n const id = userId ?? `anon-${Math.random().toString(36).slice(2)}`;\n\n // Return existing assignment for this user\n const existing = this.assignments.get(id);\n if (existing) return existing;\n\n // Hash-based deterministic assignment for consistent results\n const hash = this._hash(id);\n const index = hash % this.variantNames.length;\n const variant = this.variantNames[index]!;\n\n this.assignments.set(id, variant);\n return variant;\n }\n\n /** Get the assigned variant pattern for a user */\n getVariant(userId?: string): string | HapticPattern | HapticStep[] | undefined {\n const id = userId ?? undefined;\n if (!id) return undefined;\n\n const variant = this.assignments.get(id);\n if (!variant) return undefined;\n\n return this.variants[variant];\n }\n\n /** Track an event for a user */\n track(userId: string, event: string, value?: number): void {\n const variant = this.assignments.get(userId);\n if (!variant) return;\n\n this.tracking.push({\n userId,\n variant,\n event,\n value,\n timestamp: Date.now(),\n });\n }\n\n /** Get aggregated results per variant */\n getResults(): Record<string, VariantResult> {\n const results: Record<string, VariantResult> = {};\n\n // Initialize all variants\n for (const name of this.variantNames) {\n results[name] = { assignments: 0, events: {} };\n }\n\n // Count assignments\n for (const variant of this.assignments.values()) {\n if (results[variant]) {\n results[variant].assignments++;\n }\n }\n\n // Aggregate events\n for (const entry of this.tracking) {\n if (results[entry.variant]) {\n const events = results[entry.variant]!.events;\n events[entry.event] = (events[entry.event] ?? 0) + 1;\n }\n }\n\n return results;\n }\n\n /** Clear all tracking data and assignments */\n reset(): void {\n this.assignments.clear();\n this.tracking = [];\n }\n\n /** Simple string hash for deterministic variant assignment */\n private _hash(str: string): number {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash; // Convert to 32-bit integer\n }\n return Math.abs(hash);\n }\n}\n","/**\n * RhythmSync — sync haptic feedback to audio/music BPM.\n *\n * Provides beat detection via tap tempo, BPM control,\n * and automatic haptic triggering on each beat.\n */\n\nexport interface RhythmSyncOptions {\n /** Beats per minute (60-300) */\n bpm?: number;\n /** Global intensity multiplier (0-1) */\n intensity?: number;\n /** HPL pattern string to play on each beat */\n pattern?: string;\n}\n\nexport class RhythmSync {\n private _bpm: number;\n private _intensity: number;\n private _pattern: string; // reserved for pattern-based rhythm\n private _isPlaying = false;\n private _beatCount = 0;\n private _intervalId: ReturnType<typeof setInterval> | null = null;\n private _callbacks: Array<(beat: number) => void> = [];\n private _tapTimestamps: number[] = [];\n private _audioElement: unknown = null;\n private _syncEngine: unknown = null;\n private _syncEffect: string = 'tap';\n\n constructor(options: RhythmSyncOptions = {}) {\n this._bpm = Math.min(300, Math.max(60, options.bpm ?? 120));\n this._intensity = Math.min(1, Math.max(0, options.intensity ?? 0.7));\n this._pattern = options.pattern ?? '';\n }\n\n // ─── BPM Control ─────────────────────────────────────────\n\n /** Set beats per minute (clamped to 60-300) */\n setBPM(bpm: number): void {\n this._bpm = Math.min(300, Math.max(60, bpm));\n\n // Restart interval if currently playing\n if (this._isPlaying) {\n this._stopInterval();\n this._startInterval();\n }\n }\n\n /**\n * Store an audio element reference for sync.\n * Since Web Audio API's AnalyserNode isn't reliably available in all\n * environments, use tapTempo() for BPM detection instead.\n */\n detectBPM(audioElement: unknown): void {\n this._audioElement = audioElement;\n }\n\n /**\n * Tap tempo — call repeatedly to set BPM from tap intervals.\n * Calculates average BPM from the last 4-8 taps.\n * Returns the current estimated BPM.\n */\n tapTempo(): number {\n const now = Date.now();\n this._tapTimestamps.push(now);\n\n // Keep only the last 8 taps\n if (this._tapTimestamps.length > 8) {\n this._tapTimestamps = this._tapTimestamps.slice(-8);\n }\n\n // Need at least 2 taps to calculate\n if (this._tapTimestamps.length < 2) {\n return this._bpm;\n }\n\n // Use last 4-8 intervals\n const timestamps = this._tapTimestamps.slice(-8);\n const intervals: number[] = [];\n\n for (let i = 1; i < timestamps.length; i++) {\n intervals.push(timestamps[i]! - timestamps[i - 1]!);\n }\n\n // Average interval in ms\n const avgInterval = intervals.reduce((sum, v) => sum + v, 0) / intervals.length;\n\n if (avgInterval > 0) {\n const estimatedBPM = Math.round(60000 / avgInterval);\n this._bpm = Math.min(300, Math.max(60, estimatedBPM));\n }\n\n return this._bpm;\n }\n\n // ─── Playback ────────────────────────────────────────────\n\n /** Start emitting beats at the current BPM */\n start(callback?: (beat: number) => void): void {\n if (this._isPlaying) return;\n\n if (callback) {\n this._callbacks.push(callback);\n }\n\n this._isPlaying = true;\n this._beatCount = 0;\n this._startInterval();\n }\n\n /** Stop the rhythm */\n stop(): void {\n this._isPlaying = false;\n this._stopInterval();\n }\n\n /** Register a beat callback */\n onBeat(callback: (beat: number) => void): void {\n this._callbacks.push(callback);\n }\n\n // ─── Haptic Sync ────────────────────────────────────────\n\n /**\n * Auto-trigger a haptic effect on each beat.\n * Calls engine.tap() by default, or the specified semantic method.\n */\n syncHaptic(engine: any, effect: string = 'tap'): void {\n this._syncEngine = engine;\n this._syncEffect = effect;\n }\n\n // ─── Getters ─────────────────────────────────────────────\n\n /** Current BPM */\n get bpm(): number {\n return this._bpm;\n }\n\n /** Whether rhythm is active */\n get isPlaying(): boolean {\n return this._isPlaying;\n }\n\n /** Total beats since start */\n get beatCount(): number {\n return this._beatCount;\n }\n\n /** Current pattern string */\n get pattern(): string {\n return this._pattern;\n }\n\n /** The attached audio element, if any */\n get audioElement(): unknown {\n return this._audioElement;\n }\n\n // ─── Lifecycle ───────────────────────────────────────────\n\n /** Clean up intervals and callbacks */\n dispose(): void {\n this.stop();\n this._callbacks = [];\n this._tapTimestamps = [];\n this._syncEngine = null;\n this._audioElement = null;\n }\n\n // ─── Internal ────────────────────────────────────────────\n\n private _startInterval(): void {\n const intervalMs = 60000 / this._bpm;\n\n this._intervalId = setInterval(() => {\n this._beatCount++;\n const beat = this._beatCount;\n\n // Fire all registered callbacks\n for (const cb of this._callbacks) {\n cb(beat);\n }\n\n // Fire synced haptic\n if (this._syncEngine) {\n const engine = this._syncEngine as any;\n if (typeof engine[this._syncEffect] === 'function') {\n engine[this._syncEffect](this._intensity);\n } else if (typeof engine.tap === 'function') {\n engine.tap(this._intensity);\n }\n }\n }, intervalMs);\n }\n\n private _stopInterval(): void {\n if (this._intervalId !== null) {\n clearInterval(this._intervalId);\n this._intervalId = null;\n }\n }\n}\n","/**\n * MotionDetector — detect device motion (shake, tilt, rotation) as INPUT\n * to trigger haptic feedback.\n *\n * Uses DeviceMotionEvent and DeviceOrientationEvent when available.\n * Handles SSR gracefully by checking for window/document.\n */\n\nexport interface MotionDetectorOptions {\n /** Acceleration magnitude threshold for shake detection (default: 15) */\n shakeThreshold?: number;\n /** Tilt angle change threshold in degrees (default: 10) */\n tiltThreshold?: number;\n}\n\ninterface MotionCallbacks {\n shake: Array<(intensity: number) => void>;\n tilt: Array<(direction: { x: number; y: number }) => void>;\n rotation: Array<(angle: number) => void>;\n flip: Array<() => void>;\n}\n\nexport class MotionDetector {\n private _shakeThreshold: number;\n private _tiltThreshold: number;\n private _isListening = false;\n private _callbacks: MotionCallbacks = {\n shake: [],\n tilt: [],\n rotation: [],\n flip: [],\n };\n private _lastOrientation: { beta: number; gamma: number } | null = null;\n private _lastFlipState: boolean | null = null;\n private _boundMotionHandler: ((e: any) => void) | null = null;\n private _boundOrientationHandler: ((e: any) => void) | null = null;\n\n constructor(options: MotionDetectorOptions = {}) {\n this._shakeThreshold = options.shakeThreshold ?? 15;\n this._tiltThreshold = options.tiltThreshold ?? 10;\n }\n\n // ─── Detection ───────────────────────────────────────────\n\n /** Whether DeviceMotion API is available */\n get isSupported(): boolean {\n if (typeof window === 'undefined') return false;\n return 'DeviceMotionEvent' in window;\n }\n\n /** Whether currently listening for motion events */\n get isListening(): boolean {\n return this._isListening;\n }\n\n // ─── Permission ──────────────────────────────────────────\n\n /**\n * Request permission for motion events (required on iOS 13+).\n * Returns true if permission was granted.\n */\n async requestPermission(): Promise<boolean> {\n if (typeof window === 'undefined') return false;\n\n const DeviceMotionEventRef = (window as any).DeviceMotionEvent;\n if (\n DeviceMotionEventRef &&\n typeof DeviceMotionEventRef.requestPermission === 'function'\n ) {\n try {\n const result = await DeviceMotionEventRef.requestPermission();\n return result === 'granted';\n } catch {\n return false;\n }\n }\n\n // No permission needed on this platform\n return this.isSupported;\n }\n\n // ─── Lifecycle ───────────────────────────────────────────\n\n /** Begin listening to device motion and orientation events */\n start(): void {\n if (this._isListening) return;\n if (typeof window === 'undefined') return;\n\n this._boundMotionHandler = this._handleMotion.bind(this);\n this._boundOrientationHandler = this._handleOrientation.bind(this);\n\n window.addEventListener('devicemotion', this._boundMotionHandler);\n window.addEventListener('deviceorientation', this._boundOrientationHandler);\n\n this._isListening = true;\n }\n\n /** Stop listening to motion events */\n stop(): void {\n if (!this._isListening) return;\n if (typeof window === 'undefined') return;\n\n if (this._boundMotionHandler) {\n window.removeEventListener('devicemotion', this._boundMotionHandler);\n }\n if (this._boundOrientationHandler) {\n window.removeEventListener('deviceorientation', this._boundOrientationHandler);\n }\n\n this._isListening = false;\n this._lastOrientation = null;\n this._lastFlipState = null;\n }\n\n // ─── Callbacks ───────────────────────────────────────────\n\n /** Register callback for shake events. Intensity is 0-1 based on acceleration. */\n onShake(callback: (intensity: number) => void): void {\n this._callbacks.shake.push(callback);\n }\n\n /** Register callback for tilt changes. Direction x/y are -1 to 1. */\n onTilt(callback: (direction: { x: number; y: number }) => void): void {\n this._callbacks.tilt.push(callback);\n }\n\n /** Register callback for rotation. Angle in degrees. */\n onRotation(callback: (angle: number) => void): void {\n this._callbacks.rotation.push(callback);\n }\n\n /** Register callback for device flip (face-down/up toggle). */\n onFlip(callback: () => void): void {\n this._callbacks.flip.push(callback);\n }\n\n // ─── Cleanup ─────────────────────────────────────────────\n\n /** Remove all listeners and callbacks */\n dispose(): void {\n this.stop();\n this._callbacks = { shake: [], tilt: [], rotation: [], flip: [] };\n }\n\n // ─── Internal ────────────────────────────────────────────\n\n private _handleMotion(event: any): void {\n const accel = event.accelerationIncludingGravity;\n if (!accel) return;\n\n const { x, y, z } = accel;\n if (x == null || y == null || z == null) return;\n\n // Calculate acceleration magnitude (subtract gravity ~9.8)\n const magnitude = Math.sqrt(x * x + y * y + z * z) - 9.81;\n\n if (magnitude > this._shakeThreshold) {\n // Normalize intensity to 0-1 range (threshold to 2x threshold)\n const intensity = Math.min(\n 1,\n (magnitude - this._shakeThreshold) / this._shakeThreshold,\n );\n for (const cb of this._callbacks.shake) {\n cb(intensity);\n }\n }\n }\n\n private _handleOrientation(event: any): void {\n const { alpha, beta, gamma } = event;\n if (beta == null || gamma == null) return;\n\n // ─── Tilt detection ──────────────────────────────────\n if (this._lastOrientation) {\n const deltaBeta = Math.abs(beta - this._lastOrientation.beta);\n const deltaGamma = Math.abs(gamma - this._lastOrientation.gamma);\n\n if (deltaBeta > this._tiltThreshold || deltaGamma > this._tiltThreshold) {\n // Normalize to -1..1 range (beta: -180..180, gamma: -90..90)\n const tiltX = Math.max(-1, Math.min(1, gamma / 90));\n const tiltY = Math.max(-1, Math.min(1, beta / 180));\n\n for (const cb of this._callbacks.tilt) {\n cb({ x: tiltX, y: tiltY });\n }\n }\n }\n\n this._lastOrientation = { beta, gamma };\n\n // ─── Rotation detection ──────────────────────────────\n if (alpha != null) {\n for (const cb of this._callbacks.rotation) {\n cb(alpha);\n }\n }\n\n // ─── Flip detection ──────────────────────────────────\n // Device is face-down when beta is close to +/-180\n const isFaceDown = Math.abs(beta) > 140;\n\n if (this._lastFlipState !== null && isFaceDown !== this._lastFlipState) {\n for (const cb of this._callbacks.flip) {\n cb();\n }\n }\n\n this._lastFlipState = isFaceDown;\n }\n}\n","/**\n * HapticA11y — auto-adds haptic feedback to common accessibility interactions.\n *\n * Attaches to DOM events (focus, blur, invalid, click) and uses\n * MutationObserver to watch for dynamically added elements.\n * Provides subtle, non-intrusive haptic cues for screen interactions.\n */\n\nexport interface HapticA11yOptions {\n /** Enable haptic on focus changes (default: true) */\n focusChange?: boolean;\n /** Enable haptic on form validation errors (default: true) */\n formErrors?: boolean;\n /** Enable haptic on navigation/link clicks (default: true) */\n navigation?: boolean;\n /** Enable haptic on alert/notification elements (default: true) */\n announcements?: boolean;\n}\n\nexport class HapticA11y {\n private engine: any;\n private options: Required<HapticA11yOptions>;\n private _isAttached = false;\n private _root: any = null;\n private _observer: any = null;\n private _focusChangeCallback: ((event: any) => void) | null = null;\n private _formErrorCallback: ((event: any) => void) | null = null;\n\n // Bound handlers for cleanup\n private _handleFocusIn: ((e: any) => void) | null = null;\n private _handleFocusOut: ((e: any) => void) | null = null;\n private _handleInvalid: ((e: any) => void) | null = null;\n private _handleClick: ((e: any) => void) | null = null;\n\n constructor(engine: any, options: HapticA11yOptions = {}) {\n this.engine = engine;\n this.options = {\n focusChange: options.focusChange ?? true,\n formErrors: options.formErrors ?? true,\n navigation: options.navigation ?? true,\n announcements: options.announcements ?? true,\n };\n }\n\n /** Whether currently attached and listening */\n get isAttached(): boolean {\n return this._isAttached;\n }\n\n // ─── Attach / Detach ─────────────────────────────────────\n\n /**\n * Attach to a root element and begin listening for interactions.\n * Defaults to document.body if no root is provided.\n */\n attach(root?: any): void {\n if (this._isAttached) return;\n if (typeof document === 'undefined') return;\n\n this._root = root ?? document.body;\n if (!this._root) return;\n\n this._bindHandlers();\n this._attachListeners();\n this._startObserver();\n this._isAttached = true;\n }\n\n /** Remove all listeners and stop observing */\n detach(): void {\n if (!this._isAttached) return;\n\n this._removeListeners();\n this._stopObserver();\n this._isAttached = false;\n this._root = null;\n }\n\n // ─── Custom Handlers ─────────────────────────────────────\n\n /** Set a custom handler for focus changes */\n onFocusChange(callback?: (event: any) => void): void {\n this._focusChangeCallback = callback ?? null;\n }\n\n /** Set a custom handler for form errors */\n onFormError(callback?: (event: any) => void): void {\n this._formErrorCallback = callback ?? null;\n }\n\n // ─── Cleanup ─────────────────────────────────────────────\n\n /** Clean up all listeners, observers, and callbacks */\n dispose(): void {\n this.detach();\n this._focusChangeCallback = null;\n this._formErrorCallback = null;\n }\n\n // ─── Internal ────────────────────────────────────────────\n\n private _bindHandlers(): void {\n this._handleFocusIn = (e: any) => {\n if (!this.options.focusChange) return;\n\n if (this._focusChangeCallback) {\n this._focusChangeCallback(e);\n return;\n }\n\n // Subtle tick on focus change\n this._safeCall(() => this.engine.selection());\n };\n\n this._handleFocusOut = (_e: any) => {\n // No haptic on focus out — keep it subtle\n };\n\n this._handleInvalid = (e: any) => {\n if (!this.options.formErrors) return;\n\n if (this._formErrorCallback) {\n this._formErrorCallback(e);\n return;\n }\n\n // Error haptic on form validation failure\n this._safeCall(() => this.engine.error());\n };\n\n this._handleClick = (e: any) => {\n const target = e.target as HTMLElement | null;\n if (!target) return;\n\n const tagName = target.tagName?.toLowerCase();\n\n // Button clicks → tap haptic\n if (tagName === 'button' || target.getAttribute?.('role') === 'button') {\n this._safeCall(() => this.engine.tap());\n return;\n }\n\n // Link navigation → selection haptic\n if (tagName === 'a' && this.options.navigation) {\n this._safeCall(() => this.engine.selection());\n return;\n }\n\n // Toggle inputs\n if (tagName === 'input') {\n const inputType = (target as any).type?.toLowerCase();\n if (inputType === 'checkbox' || inputType === 'radio') {\n const checked = (target as any).checked;\n this._safeCall(() => this.engine.toggle(checked));\n }\n }\n };\n }\n\n private _attachListeners(): void {\n if (!this._root) return;\n\n this._root.addEventListener('focusin', this._handleFocusIn, true);\n this._root.addEventListener('focusout', this._handleFocusOut, true);\n this._root.addEventListener('invalid', this._handleInvalid, true);\n this._root.addEventListener('click', this._handleClick, true);\n }\n\n private _removeListeners(): void {\n if (!this._root) return;\n\n this._root.removeEventListener('focusin', this._handleFocusIn, true);\n this._root.removeEventListener('focusout', this._handleFocusOut, true);\n this._root.removeEventListener('invalid', this._handleInvalid, true);\n this._root.removeEventListener('click', this._handleClick, true);\n }\n\n private _startObserver(): void {\n if (typeof MutationObserver === 'undefined') return;\n if (!this.options.announcements) return;\n\n this._observer = new MutationObserver((mutations: any[]) => {\n for (const mutation of mutations) {\n for (const node of mutation.addedNodes) {\n if (node.nodeType !== 1) continue; // Element nodes only\n\n const el = node as HTMLElement;\n const role = el.getAttribute?.('role');\n const ariaLive = el.getAttribute?.('aria-live');\n\n // Alert/notification elements → warning haptic\n if (role === 'alert' || role === 'alertdialog') {\n this._safeCall(() => this.engine.warning());\n } else if (role === 'status' || ariaLive === 'polite' || ariaLive === 'assertive') {\n this._safeCall(() => this.engine.selection());\n }\n\n // Modal/dialog open → toggle haptic\n if (role === 'dialog' || el.tagName?.toLowerCase() === 'dialog') {\n this._safeCall(() => this.engine.toggle(true));\n }\n }\n\n // Modal/dialog removed → toggle haptic\n for (const node of mutation.removedNodes) {\n if (node.nodeType !== 1) continue;\n\n const el = node as HTMLElement;\n const role = el.getAttribute?.('role');\n\n if (role === 'dialog' || el.tagName?.toLowerCase() === 'dialog') {\n this._safeCall(() => this.engine.toggle(false));\n }\n }\n }\n });\n\n this._observer.observe(this._root, {\n childList: true,\n subtree: true,\n });\n }\n\n private _stopObserver(): void {\n if (this._observer) {\n this._observer.disconnect();\n this._observer = null;\n }\n }\n\n private _safeCall(fn: () => any): void {\n try {\n const result = fn();\n if (result && typeof result.catch === 'function') {\n result.catch(() => {\n /* swallow haptic errors silently */\n });\n }\n } catch {\n /* swallow haptic errors silently */\n }\n }\n}\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// Middleware\nexport {\n MiddlewareManager,\n intensityScaler,\n durationScaler,\n intensityClamper,\n patternRepeater,\n reverser,\n accessibilityBooster,\n} from './middleware';\nexport type { HapticMiddleware } from './middleware';\n\n// Profiles\nexport { ProfileManager, profiles } from './profiles';\nexport type { IntensityProfile } from './profiles';\n\n// Experiment\nexport { HapticExperiment } from './experiment';\n\n// Rhythm\nexport { RhythmSync } from './rhythm';\nexport type { RhythmSyncOptions } from './rhythm';\n\n// Motion\nexport { MotionDetector } from './motion';\nexport type { MotionDetectorOptions } from './motion';\n\n// Accessibility\nexport { HapticA11y } from './accessibility';\nexport type { HapticA11yOptions } from './accessibility';\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"]}
|