@hapticjs/core 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types/config.ts","../src/adapters/noop.adapter.ts","../src/utils/scheduling.ts","../src/adapters/web-vibration.adapter.ts","../src/utils/platform.ts","../src/engine/capability-detector.ts","../src/engine/adaptive-engine.ts","../src/engine/fallback-manager.ts","../src/composer/pattern-composer.ts","../src/patterns/tokenizer.ts","../src/patterns/parser.ts","../src/patterns/compiler.ts","../src/engine/haptic-engine.ts","../src/patterns/validator.ts","../src/presets/ui.ts","../src/presets/notifications.ts","../src/presets/gaming.ts","../src/presets/accessibility.ts","../src/presets/system.ts","../src/presets/index.ts","../src/index.ts"],"names":["presets"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { HapticAdapter } from './adapter';\n\n/** Visual fallback style when haptics are unavailable */\nexport type VisualFallbackStyle = 'flash' | 'shake' | 'pulse';\n\n/** Fallback configuration for non-haptic feedback */\nexport interface FallbackConfig {\n type: 'none' | 'visual' | 'audio' | 'both';\n visual?: {\n /** Element to animate */\n element?: HTMLElement;\n /** CSS class to toggle */\n className?: string;\n /** Animation style */\n style?: VisualFallbackStyle;\n };\n audio?: {\n enabled: boolean;\n /** Volume from 0 to 1 */\n volume: number;\n };\n}\n\n/** Main configuration for the haptic engine */\nexport interface HapticConfig {\n /** Explicitly set an adapter (overrides auto-detection) */\n adapter?: HapticAdapter;\n /** Global intensity multiplier (0.0 to 1.0) */\n intensity: number;\n /** Whether haptics are enabled */\n enabled: boolean;\n /** Fallback when haptics are unavailable */\n fallback: FallbackConfig;\n /** Respect system haptic settings */\n respectSystemSettings: boolean;\n}\n\n/** Default configuration */\nexport const DEFAULT_CONFIG: HapticConfig = {\n intensity: 1.0,\n enabled: true,\n fallback: { type: 'none' },\n respectSystemSettings: true,\n};\n","import type { HapticAdapter, AdapterCapabilities, HapticStep } from '../types';\n\n/**\n * No-op adapter — used in SSR, Node, or when no haptic hardware is available.\n * Silently accepts all calls without doing anything.\n */\nexport class NoopAdapter implements HapticAdapter {\n readonly name = 'noop';\n readonly supported = false;\n\n capabilities(): AdapterCapabilities {\n return {\n maxIntensityLevels: 0,\n minDuration: 0,\n maxDuration: 0,\n supportsPattern: false,\n supportsIntensity: false,\n dualMotor: false,\n };\n }\n\n async pulse(_intensity: number, _duration: number): Promise<void> {\n // No-op\n }\n\n async playSequence(_steps: HapticStep[]): Promise<void> {\n // No-op\n }\n\n cancel(): void {\n // No-op\n }\n\n dispose(): void {\n // No-op\n }\n}\n","/** Scheduling utilities for timed haptic playback */\n\nexport function delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n}\n\nexport function normalizeIntensity(intensity: number): number {\n return clamp(intensity, 0, 1);\n}\n","import type { HapticAdapter, AdapterCapabilities, HapticStep } from '../types';\nimport { delay } from '../utils/scheduling';\n\n/**\n * Web Vibration API adapter.\n * Uses navigator.vibrate() — supported on Android browsers.\n * Intensity is simulated via PWM (rapid on/off) since the API only supports on/off.\n */\nexport class WebVibrationAdapter implements HapticAdapter {\n readonly name = 'web-vibration';\n readonly supported: boolean;\n\n private _cancelled = false;\n\n constructor() {\n this.supported =\n typeof navigator !== 'undefined' && 'vibrate' in navigator;\n }\n\n capabilities(): AdapterCapabilities {\n return {\n maxIntensityLevels: 1, // on/off only\n minDuration: 10,\n maxDuration: 10000,\n supportsPattern: true,\n supportsIntensity: false,\n dualMotor: false,\n };\n }\n\n async pulse(_intensity: number, duration: number): Promise<void> {\n if (!this.supported) return;\n navigator.vibrate(duration);\n }\n\n async playSequence(steps: HapticStep[]): Promise<void> {\n if (!this.supported || steps.length === 0) return;\n\n this._cancelled = false;\n\n // Convert to Vibration API pattern: [vibrate, pause, vibrate, pause, ...]\n const pattern = this._toVibrationPattern(steps);\n\n // If it's a simple pattern, use native pattern support\n if (this._canUseNativePattern(steps)) {\n navigator.vibrate(pattern);\n return;\n }\n\n // For complex patterns (intensity variation), play step by step\n for (const step of steps) {\n if (this._cancelled) break;\n\n if (step.type === 'vibrate') {\n if (step.intensity > 0.1) {\n // Simulate intensity via PWM for lower intensities\n if (step.intensity < 0.5) {\n await this._pwmVibrate(step.duration, step.intensity);\n } else {\n navigator.vibrate(step.duration);\n await delay(step.duration);\n }\n } else {\n await delay(step.duration);\n }\n } else {\n await delay(step.duration);\n }\n }\n }\n\n cancel(): void {\n this._cancelled = true;\n if (this.supported) {\n navigator.vibrate(0);\n }\n }\n\n dispose(): void {\n this.cancel();\n }\n\n /** Convert steps to Vibration API pattern array */\n private _toVibrationPattern(steps: HapticStep[]): number[] {\n const pattern: number[] = [];\n for (const step of steps) {\n pattern.push(step.duration);\n }\n return pattern;\n }\n\n /** Check if all steps can be played with native pattern (no intensity variation) */\n private _canUseNativePattern(steps: HapticStep[]): boolean {\n return steps.every(\n (s) =>\n (s.type === 'pause') ||\n (s.type === 'vibrate' && s.intensity >= 0.5)\n );\n }\n\n /** Simulate lower intensity via pulse-width modulation */\n private async _pwmVibrate(duration: number, intensity: number): Promise<void> {\n const cycleTime = 20; // ms per PWM cycle\n const onTime = Math.round(cycleTime * intensity);\n const offTime = cycleTime - onTime;\n const cycles = Math.floor(duration / cycleTime);\n\n const pattern: number[] = [];\n for (let i = 0; i < cycles; i++) {\n pattern.push(onTime, offTime);\n }\n\n if (pattern.length > 0) {\n navigator.vibrate(pattern);\n await delay(duration);\n }\n }\n}\n","/** 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 { 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 // Fallback to no-op (SSR, Node, unsupported browsers, iOS)\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: 10, intensity }]);\n }\n\n /** Double tap */\n async doubleTap(intensity = 0.6): Promise<void> {\n await this._playSteps([\n { type: 'vibrate', duration: 10, intensity },\n { type: 'pause', duration: 80, intensity: 0 },\n { type: 'vibrate', duration: 10, intensity },\n ]);\n }\n\n /** Long press feedback */\n async longPress(intensity = 0.8): Promise<void> {\n await this._playSteps([{ type: 'vibrate', duration: 50, intensity }]);\n }\n\n /** Success notification */\n async success(): Promise<void> {\n await this._playSteps([\n { type: 'vibrate', duration: 30, intensity: 0.5 },\n { type: 'pause', duration: 60, intensity: 0 },\n { type: 'vibrate', duration: 40, intensity: 0.8 },\n ]);\n }\n\n /** Warning notification */\n async warning(): Promise<void> {\n await this._playSteps([\n { type: 'vibrate', duration: 40, intensity: 0.7 },\n { type: 'pause', duration: 50, intensity: 0 },\n { type: 'vibrate', duration: 40, intensity: 0.7 },\n { type: 'pause', duration: 50, intensity: 0 },\n { type: 'vibrate', duration: 40, intensity: 0.7 },\n ]);\n }\n\n /** Error notification */\n async error(): Promise<void> {\n await this._playSteps([\n { type: 'vibrate', duration: 80, intensity: 1.0 },\n { type: 'pause', duration: 100, intensity: 0 },\n { type: 'vibrate', duration: 80, intensity: 1.0 },\n ]);\n }\n\n /** Selection change feedback */\n async selection(): Promise<void> {\n await this._playSteps([{ type: 'vibrate', duration: 8, intensity: 0.4 }]);\n }\n\n /** Toggle feedback */\n async toggle(on: boolean): Promise<void> {\n if (on) {\n await this._playSteps([{ type: 'vibrate', duration: 15, intensity: 0.6 }]);\n } else {\n await this._playSteps([{ type: 'vibrate', duration: 10, intensity: 0.3 }]);\n }\n }\n\n /** Impact with style (matches iOS UIImpactFeedbackGenerator) */\n async impact(style: ImpactStyle = 'medium'): Promise<void> {\n const presets: Record<ImpactStyle, HapticStep[]> = {\n light: [{ type: 'vibrate', duration: 10, intensity: 0.3 }],\n medium: [{ type: 'vibrate', duration: 15, intensity: 0.6 }],\n heavy: [{ type: 'vibrate', duration: 25, intensity: 1.0 }],\n rigid: [{ type: 'vibrate', duration: 8, intensity: 0.9 }],\n soft: [{ type: 'vibrate', duration: 30, intensity: 0.4 }],\n };\n await this._playSteps(presets[style]);\n }\n\n // ─── Parametric API ────────────────────────────────────────\n\n /** Vibrate for a specified duration */\n async vibrate(duration: number, intensity = 1.0): Promise<void> {\n await this._playSteps([\n { type: 'vibrate', duration, intensity: normalizeIntensity(intensity) },\n ]);\n }\n\n /**\n * Play a haptic pattern.\n * Accepts:\n * - HPL string: \"~~..##..@@\"\n * - HapticPattern object\n * - Raw HapticStep array\n */\n async play(pattern: string | HapticPattern | HapticStep[]): Promise<void> {\n let steps: HapticStep[];\n\n if (typeof pattern === 'string') {\n const ast = parseHPL(pattern);\n steps = compile(ast);\n } else if (Array.isArray(pattern)) {\n steps = pattern;\n } else {\n steps = pattern.steps;\n }\n\n await this._playSteps(steps);\n }\n\n // ─── Composer ──────────────────────────────────────────────\n\n /** Create a new pattern composer */\n compose(): PatternComposer {\n const composer = new PatternComposer();\n composer.onPlay((steps) => this._playSteps(steps));\n return composer;\n }\n\n // ─── Configuration ─────────────────────────────────────────\n\n /** Update engine configuration */\n configure(config: Partial<HapticConfig>): void {\n Object.assign(this.config, config);\n\n if (config.adapter) {\n this.adapter = config.adapter;\n }\n\n if (config.fallback) {\n this.fallback.updateConfig(this.config.fallback);\n }\n }\n\n /** Check if haptics are supported on this device */\n get isSupported(): boolean {\n return this.adapter.supported;\n }\n\n /** Get the current adapter name */\n get adapterName(): string {\n return this.adapter.name;\n }\n\n // ─── Lifecycle ─────────────────────────────────────────────\n\n /** Cancel any ongoing haptic effect */\n cancel(): void {\n this.adapter.cancel();\n }\n\n /** Clean up resources */\n dispose(): void {\n this.adapter.dispose();\n }\n\n // ─── Internal ──────────────────────────────────────────────\n\n private async _playSteps(steps: HapticStep[]): Promise<void> {\n if (!this.config.enabled || steps.length === 0) return;\n\n // Apply global intensity multiplier\n let adjusted = steps.map((s) => ({\n ...s,\n intensity:\n s.type === 'vibrate'\n ? normalizeIntensity(s.intensity * this.config.intensity)\n : 0,\n }));\n\n // Adapt to device capabilities\n const caps = this.adapter.capabilities();\n adjusted = this.adaptive.adapt(adjusted, caps);\n\n // Optimize\n adjusted = optimizeSteps(adjusted);\n\n if (this.adapter.supported) {\n await this.adapter.playSequence(adjusted);\n } else {\n await this.fallback.execute(adjusted);\n }\n }\n}\n","/** Validate an HPL pattern string and return human-readable errors */\nexport interface ValidationResult {\n valid: boolean;\n errors: string[];\n}\n\nconst VALID_CHARS = new Set('~#@.|\\\\-[] \\t\\nx0123456789');\n\nexport function validateHPL(input: string): ValidationResult {\n const errors: string[] = [];\n\n if (input.length === 0) {\n return { valid: true, errors: [] };\n }\n\n // Check for invalid characters\n for (let i = 0; i < input.length; i++) {\n if (!VALID_CHARS.has(input[i]!)) {\n errors.push(`Invalid character '${input[i]}' at position ${i}`);\n }\n }\n\n // Check bracket matching\n let depth = 0;\n for (let i = 0; i < input.length; i++) {\n if (input[i] === '[') depth++;\n if (input[i] === ']') depth--;\n if (depth < 0) {\n errors.push(`Unmatched ']' at position ${i}`);\n }\n }\n if (depth > 0) {\n errors.push(`${depth} unclosed '[' bracket(s)`);\n }\n\n // Check for empty groups\n for (let i = 0; i < input.length - 1; i++) {\n if (input[i] === '[' && input[i + 1] === ']') {\n errors.push(`Empty group at position ${i}`);\n }\n }\n\n // Check repeat modifiers are after groups or atoms\n for (let i = 0; i < input.length; i++) {\n if (input[i] === 'x' && i + 1 < input.length && /\\d/.test(input[i + 1]!)) {\n if (i === 0) {\n errors.push(`Repeat modifier 'x' at position ${i} must follow a group or atom`);\n }\n }\n }\n\n return { valid: errors.length === 0, errors };\n}\n","import type { HapticPattern } from '../types';\n\n/** UI interaction presets */\nexport const ui = {\n /** Light button tap */\n tap: {\n name: 'ui.tap',\n steps: [{ type: 'vibrate' as const, duration: 10, intensity: 0.6 }],\n },\n\n /** Double tap */\n doubleTap: {\n name: 'ui.doubleTap',\n steps: [\n { type: 'vibrate' as const, duration: 10, intensity: 0.6 },\n { type: 'pause' as const, duration: 80, intensity: 0 },\n { type: 'vibrate' as const, duration: 10, intensity: 0.6 },\n ],\n },\n\n /** Long press acknowledgment */\n longPress: {\n name: 'ui.longPress',\n steps: [{ type: 'vibrate' as const, duration: 50, intensity: 0.8 }],\n },\n\n /** Toggle switch on */\n toggleOn: {\n name: 'ui.toggleOn',\n steps: [{ type: 'vibrate' as const, duration: 15, intensity: 0.6 }],\n },\n\n /** Toggle switch off */\n toggleOff: {\n name: 'ui.toggleOff',\n steps: [{ type: 'vibrate' as const, duration: 10, intensity: 0.3 }],\n },\n\n /** Slider snap to value */\n sliderSnap: {\n name: 'ui.sliderSnap',\n steps: [{ type: 'vibrate' as const, duration: 5, intensity: 0.4 }],\n },\n\n /** Selection changed */\n selection: {\n name: 'ui.selection',\n steps: [{ type: 'vibrate' as const, duration: 8, intensity: 0.4 }],\n },\n\n /** Pull to refresh threshold reached */\n pullToRefresh: {\n name: 'ui.pullToRefresh',\n steps: [\n { type: 'vibrate' as const, duration: 20, intensity: 0.5 },\n { type: 'pause' as const, duration: 40, intensity: 0 },\n { type: 'vibrate' as const, duration: 30, intensity: 0.7 },\n ],\n },\n\n /** Swipe action triggered */\n swipe: {\n name: 'ui.swipe',\n steps: [\n { type: 'vibrate' as const, duration: 12, intensity: 0.4 },\n { type: 'pause' as const, duration: 30, intensity: 0 },\n { type: 'vibrate' as const, duration: 8, intensity: 0.3 },\n ],\n },\n\n /** Context menu appearance */\n contextMenu: {\n name: 'ui.contextMenu',\n steps: [{ type: 'vibrate' as const, duration: 20, intensity: 0.7 }],\n },\n\n /** Drag start */\n dragStart: {\n name: 'ui.dragStart',\n steps: [{ type: 'vibrate' as const, duration: 12, intensity: 0.5 }],\n },\n\n /** Drag drop */\n drop: {\n name: 'ui.drop',\n steps: [\n { type: 'vibrate' as const, duration: 20, intensity: 0.8 },\n { type: 'pause' as const, duration: 30, intensity: 0 },\n { type: 'vibrate' as const, duration: 10, intensity: 0.4 },\n ],\n },\n} satisfies Record<string, HapticPattern>;\n","import type { HapticPattern } from '../types';\n\n/** Notification feedback presets */\nexport const notifications = {\n /** Success — two ascending pulses */\n success: {\n name: 'notifications.success',\n steps: [\n { type: 'vibrate' as const, duration: 30, intensity: 0.5 },\n { type: 'pause' as const, duration: 60, intensity: 0 },\n { type: 'vibrate' as const, duration: 40, intensity: 0.8 },\n ],\n },\n\n /** Warning — three even pulses */\n warning: {\n name: 'notifications.warning',\n steps: [\n { type: 'vibrate' as const, duration: 40, intensity: 0.7 },\n { type: 'pause' as const, duration: 50, intensity: 0 },\n { type: 'vibrate' as const, duration: 40, intensity: 0.7 },\n { type: 'pause' as const, duration: 50, intensity: 0 },\n { type: 'vibrate' as const, duration: 40, intensity: 0.7 },\n ],\n },\n\n /** Error — two heavy pulses */\n error: {\n name: 'notifications.error',\n steps: [\n { type: 'vibrate' as const, duration: 80, intensity: 1.0 },\n { type: 'pause' as const, duration: 100, intensity: 0 },\n { type: 'vibrate' as const, duration: 80, intensity: 1.0 },\n ],\n },\n\n /** Info — soft single pulse */\n info: {\n name: 'notifications.info',\n steps: [\n { type: 'vibrate' as const, duration: 20, intensity: 0.4 },\n ],\n },\n\n /** Message received */\n messageReceived: {\n name: 'notifications.messageReceived',\n steps: [\n { type: 'vibrate' as const, duration: 15, intensity: 0.5 },\n { type: 'pause' as const, duration: 100, intensity: 0 },\n { type: 'vibrate' as const, duration: 15, intensity: 0.5 },\n ],\n },\n\n /** Alarm — urgent repeating pattern */\n alarm: {\n name: 'notifications.alarm',\n steps: [\n { type: 'vibrate' as const, duration: 100, intensity: 1.0 },\n { type: 'pause' as const, duration: 50, intensity: 0 },\n { type: 'vibrate' as const, duration: 100, intensity: 1.0 },\n { type: 'pause' as const, duration: 50, intensity: 0 },\n { type: 'vibrate' as const, duration: 100, intensity: 1.0 },\n { type: 'pause' as const, duration: 200, intensity: 0 },\n { type: 'vibrate' as const, duration: 100, intensity: 1.0 },\n { type: 'pause' as const, duration: 50, intensity: 0 },\n { type: 'vibrate' as const, duration: 100, intensity: 1.0 },\n { type: 'pause' as const, duration: 50, intensity: 0 },\n { type: 'vibrate' as const, duration: 100, intensity: 1.0 },\n ],\n },\n\n /** Reminder — gentle nudge */\n reminder: {\n name: 'notifications.reminder',\n steps: [\n { type: 'vibrate' as const, duration: 25, intensity: 0.5 },\n { type: 'pause' as const, duration: 150, intensity: 0 },\n { type: 'vibrate' as const, duration: 25, intensity: 0.5 },\n ],\n },\n} satisfies Record<string, HapticPattern>;\n","import type { HapticPattern } from '../types';\n\n/** Gaming haptic presets */\nexport const gaming = {\n /** Explosion — heavy descending */\n explosion: {\n name: 'gaming.explosion',\n steps: [\n { type: 'vibrate' as const, duration: 100, intensity: 1.0 },\n { type: 'vibrate' as const, duration: 80, intensity: 0.8 },\n { type: 'vibrate' as const, duration: 60, intensity: 0.5 },\n { type: 'vibrate' as const, duration: 40, intensity: 0.3 },\n { type: 'vibrate' as const, duration: 30, intensity: 0.1 },\n ],\n },\n\n /** Collision — sharp impact */\n collision: {\n name: 'gaming.collision',\n steps: [\n { type: 'vibrate' as const, duration: 30, intensity: 1.0 },\n { type: 'pause' as const, duration: 20, intensity: 0 },\n { type: 'vibrate' as const, duration: 15, intensity: 0.5 },\n ],\n },\n\n /** Heartbeat — rhythmic pulse */\n heartbeat: {\n name: 'gaming.heartbeat',\n steps: [\n { type: 'vibrate' as const, duration: 20, intensity: 0.8 },\n { type: 'pause' as const, duration: 80, intensity: 0 },\n { type: 'vibrate' as const, duration: 30, intensity: 1.0 },\n { type: 'pause' as const, duration: 400, intensity: 0 },\n ],\n },\n\n /** Gunshot — sharp burst */\n gunshot: {\n name: 'gaming.gunshot',\n steps: [\n { type: 'vibrate' as const, duration: 15, intensity: 1.0 },\n { type: 'vibrate' as const, duration: 30, intensity: 0.4 },\n ],\n },\n\n /** Sword clash — metallic ring */\n swordClash: {\n name: 'gaming.swordClash',\n steps: [\n { type: 'vibrate' as const, duration: 10, intensity: 1.0 },\n { type: 'pause' as const, duration: 10, intensity: 0 },\n { type: 'vibrate' as const, duration: 30, intensity: 0.6 },\n { type: 'vibrate' as const, duration: 50, intensity: 0.3 },\n ],\n },\n\n /** Power up — ascending intensity */\n powerUp: {\n name: 'gaming.powerUp',\n steps: [\n { type: 'vibrate' as const, duration: 40, intensity: 0.2 },\n { type: 'vibrate' as const, duration: 40, intensity: 0.4 },\n { type: 'vibrate' as const, duration: 40, intensity: 0.6 },\n { type: 'vibrate' as const, duration: 40, intensity: 0.8 },\n { type: 'vibrate' as const, duration: 60, intensity: 1.0 },\n ],\n },\n\n /** Damage taken — heavy stutter */\n damage: {\n name: 'gaming.damage',\n steps: [\n { type: 'vibrate' as const, duration: 40, intensity: 0.9 },\n { type: 'pause' as const, duration: 20, intensity: 0 },\n { type: 'vibrate' as const, duration: 30, intensity: 0.6 },\n { type: 'pause' as const, duration: 20, intensity: 0 },\n { type: 'vibrate' as const, duration: 20, intensity: 0.3 },\n ],\n },\n\n /** Item pickup — light cheerful */\n pickup: {\n name: 'gaming.pickup',\n steps: [\n { type: 'vibrate' as const, duration: 10, intensity: 0.3 },\n { type: 'pause' as const, duration: 40, intensity: 0 },\n { type: 'vibrate' as const, duration: 15, intensity: 0.6 },\n ],\n },\n\n /** Level complete — celebratory */\n levelComplete: {\n name: 'gaming.levelComplete',\n steps: [\n { type: 'vibrate' as const, duration: 20, intensity: 0.5 },\n { type: 'pause' as const, duration: 60, intensity: 0 },\n { type: 'vibrate' as const, duration: 20, intensity: 0.5 },\n { type: 'pause' as const, duration: 60, intensity: 0 },\n { type: 'vibrate' as const, duration: 30, intensity: 0.7 },\n { type: 'pause' as const, duration: 60, intensity: 0 },\n { type: 'vibrate' as const, duration: 50, intensity: 1.0 },\n ],\n },\n\n /** Engine rumble — continuous vibration */\n engineRumble: {\n name: 'gaming.engineRumble',\n steps: [\n { type: 'vibrate' as const, duration: 30, intensity: 0.4 },\n { type: 'pause' as const, duration: 10, intensity: 0 },\n { type: 'vibrate' as const, duration: 30, intensity: 0.5 },\n { type: 'pause' as const, duration: 10, intensity: 0 },\n { type: 'vibrate' as const, duration: 30, intensity: 0.4 },\n { type: 'pause' as const, duration: 10, intensity: 0 },\n { type: 'vibrate' as const, duration: 30, intensity: 0.5 },\n ],\n },\n} satisfies Record<string, HapticPattern>;\n","import type { HapticPattern } from '../types';\n\n/** Accessibility-focused haptic presets — rhythmic patterns for non-visual feedback */\nexport const accessibility = {\n /** Confirm action — clear double pulse */\n confirm: {\n name: 'accessibility.confirm',\n steps: [\n { type: 'vibrate' as const, duration: 30, intensity: 0.7 },\n { type: 'pause' as const, duration: 100, intensity: 0 },\n { type: 'vibrate' as const, duration: 30, intensity: 0.7 },\n ],\n },\n\n /** Deny/reject — long single buzz */\n deny: {\n name: 'accessibility.deny',\n steps: [\n { type: 'vibrate' as const, duration: 200, intensity: 0.8 },\n ],\n },\n\n /** Boundary reached (e.g., scroll limit, min/max value) */\n boundary: {\n name: 'accessibility.boundary',\n steps: [\n { type: 'vibrate' as const, duration: 15, intensity: 1.0 },\n ],\n },\n\n /** Focus change — subtle tick */\n focusChange: {\n name: 'accessibility.focusChange',\n steps: [\n { type: 'vibrate' as const, duration: 5, intensity: 0.3 },\n ],\n },\n\n /** Counting rhythm — one tick per count */\n countTick: {\n name: 'accessibility.countTick',\n steps: [\n { type: 'vibrate' as const, duration: 8, intensity: 0.5 },\n ],\n },\n\n /** Navigation landmark reached */\n landmark: {\n name: 'accessibility.landmark',\n steps: [\n { type: 'vibrate' as const, duration: 15, intensity: 0.6 },\n { type: 'pause' as const, duration: 40, intensity: 0 },\n { type: 'vibrate' as const, duration: 15, intensity: 0.6 },\n { type: 'pause' as const, duration: 40, intensity: 0 },\n { type: 'vibrate' as const, duration: 15, intensity: 0.6 },\n ],\n },\n\n /** Progress checkpoint — escalating feedback */\n progressCheckpoint: {\n name: 'accessibility.progressCheckpoint',\n steps: [\n { type: 'vibrate' as const, duration: 20, intensity: 0.4 },\n { type: 'pause' as const, duration: 60, intensity: 0 },\n { type: 'vibrate' as const, duration: 25, intensity: 0.7 },\n ],\n },\n} satisfies Record<string, HapticPattern>;\n","import type { HapticPattern } from '../types';\n\n/** System-level haptic presets */\nexport const system = {\n /** Keyboard key press */\n keyPress: {\n name: 'system.keyPress',\n steps: [{ type: 'vibrate' as const, duration: 5, intensity: 0.3 }],\n },\n\n /** Scroll tick (detent-like) */\n scrollTick: {\n name: 'system.scrollTick',\n steps: [{ type: 'vibrate' as const, duration: 3, intensity: 0.2 }],\n },\n\n /** Scroll boundary reached */\n scrollBounce: {\n name: 'system.scrollBounce',\n steps: [\n { type: 'vibrate' as const, duration: 10, intensity: 0.5 },\n { type: 'vibrate' as const, duration: 20, intensity: 0.3 },\n ],\n },\n\n /** Delete action */\n delete: {\n name: 'system.delete',\n steps: [\n { type: 'vibrate' as const, duration: 15, intensity: 0.5 },\n { type: 'pause' as const, duration: 50, intensity: 0 },\n { type: 'vibrate' as const, duration: 25, intensity: 0.8 },\n ],\n },\n\n /** Undo action */\n undo: {\n name: 'system.undo',\n steps: [\n { type: 'vibrate' as const, duration: 20, intensity: 0.5 },\n { type: 'pause' as const, duration: 80, intensity: 0 },\n { type: 'vibrate' as const, duration: 10, intensity: 0.3 },\n ],\n },\n\n /** Copy to clipboard */\n copy: {\n name: 'system.copy',\n steps: [{ type: 'vibrate' as const, duration: 12, intensity: 0.4 }],\n },\n\n /** Paste from clipboard */\n paste: {\n name: 'system.paste',\n steps: [\n { type: 'vibrate' as const, duration: 8, intensity: 0.3 },\n { type: 'pause' as const, duration: 30, intensity: 0 },\n { type: 'vibrate' as const, duration: 12, intensity: 0.5 },\n ],\n },\n} satisfies Record<string, HapticPattern>;\n","export { ui } from './ui';\nexport { notifications } from './notifications';\nexport { gaming } from './gaming';\nexport { accessibility } from './accessibility';\nexport { system } from './system';\n\nimport { ui } from './ui';\nimport { notifications } from './notifications';\nimport { gaming } from './gaming';\nimport { accessibility } from './accessibility';\nimport { system } from './system';\n\n/** All presets grouped by category */\nexport const presets = {\n ui,\n notifications,\n gaming,\n accessibility,\n system,\n} as const;\n","// Types\nexport type {\n HapticStep,\n HapticPattern,\n EasingFunction,\n ImpactStyle,\n NotificationType,\n SemanticEffect,\n AdapterCapabilities,\n HapticAdapter,\n HapticConfig,\n FallbackConfig,\n VisualFallbackStyle,\n HPLToken,\n HPLTokenType,\n HPLNode,\n HPLNodeType,\n} from './types';\n\n// Engine\nexport { HapticEngine } from './engine';\nexport { AdaptiveEngine, FallbackManager, detectAdapter } from './engine';\n\n// Adapters\nexport { NoopAdapter, WebVibrationAdapter } 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';\n\n// Composer\nexport { PatternComposer } from './composer';\n\n// Presets\nexport { presets, ui, notifications, gaming, accessibility, system } from './presets';\n\n// Utils\nexport { detectPlatform } from './utils';\nexport type { PlatformInfo } from './utils';\n\n// ─── Default singleton ──────────────────────────────────────\n\nimport { HapticEngine } from './engine';\n\n/**\n * Pre-configured haptic engine singleton.\n * Import and use directly for quick haptic feedback:\n *\n * import { haptic } from '@hapticjs/core';\n * haptic.tap();\n * haptic.success();\n * haptic.play('~~..##..@@');\n */\nexport const haptic = HapticEngine.create();\n"]}
1
+ {"version":3,"sources":["../src/types/config.ts","../src/adapters/noop.adapter.ts","../src/utils/scheduling.ts","../src/adapters/web-vibration.adapter.ts","../src/adapters/ios-audio.adapter.ts","../src/utils/platform.ts","../src/engine/capability-detector.ts","../src/engine/adaptive-engine.ts","../src/engine/fallback-manager.ts","../src/composer/pattern-composer.ts","../src/patterns/tokenizer.ts","../src/patterns/parser.ts","../src/patterns/compiler.ts","../src/engine/haptic-engine.ts","../src/patterns/validator.ts","../src/patterns/sharing.ts","../src/presets/ui.ts","../src/presets/notifications.ts","../src/presets/gaming.ts","../src/presets/accessibility.ts","../src/presets/system.ts","../src/presets/index.ts","../src/index.ts"],"names":["totalDuration","presets"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { HapticAdapter } from './adapter';\n\n/** Visual fallback style when haptics are unavailable */\nexport type VisualFallbackStyle = 'flash' | 'shake' | 'pulse';\n\n/** Fallback configuration for non-haptic feedback */\nexport interface FallbackConfig {\n type: 'none' | 'visual' | 'audio' | 'both';\n visual?: {\n /** Element to animate */\n element?: HTMLElement;\n /** CSS class to toggle */\n className?: string;\n /** Animation style */\n style?: VisualFallbackStyle;\n };\n audio?: {\n enabled: boolean;\n /** Volume from 0 to 1 */\n volume: number;\n };\n}\n\n/** Main configuration for the haptic engine */\nexport interface HapticConfig {\n /** Explicitly set an adapter (overrides auto-detection) */\n adapter?: HapticAdapter;\n /** Global intensity multiplier (0.0 to 1.0) */\n intensity: number;\n /** Whether haptics are enabled */\n enabled: boolean;\n /** Fallback when haptics are unavailable */\n fallback: FallbackConfig;\n /** Respect system haptic settings */\n respectSystemSettings: boolean;\n}\n\n/** Default configuration */\nexport const DEFAULT_CONFIG: HapticConfig = {\n intensity: 1.0,\n enabled: true,\n fallback: { type: 'none' },\n respectSystemSettings: true,\n};\n","import type { HapticAdapter, AdapterCapabilities, HapticStep } from '../types';\n\n/**\n * No-op adapter — used in SSR, Node, or when no haptic hardware is available.\n * Silently accepts all calls without doing anything.\n */\nexport class NoopAdapter implements HapticAdapter {\n readonly name = 'noop';\n readonly supported = false;\n\n capabilities(): AdapterCapabilities {\n return {\n maxIntensityLevels: 0,\n minDuration: 0,\n maxDuration: 0,\n supportsPattern: false,\n supportsIntensity: false,\n dualMotor: false,\n };\n }\n\n async pulse(_intensity: number, _duration: number): Promise<void> {\n // No-op\n }\n\n async playSequence(_steps: HapticStep[]): Promise<void> {\n // No-op\n }\n\n cancel(): void {\n // No-op\n }\n\n dispose(): void {\n // No-op\n }\n}\n","/** Scheduling utilities for timed haptic playback */\n\nexport function delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n}\n\nexport function normalizeIntensity(intensity: number): number {\n return clamp(intensity, 0, 1);\n}\n","import type { HapticAdapter, AdapterCapabilities, HapticStep } from '../types';\nimport { delay } from '../utils/scheduling';\n\n/**\n * Web Vibration API adapter.\n * Uses navigator.vibrate() — supported on Android browsers.\n * Intensity is simulated via PWM (rapid on/off) since the API only supports on/off.\n */\nexport class WebVibrationAdapter implements HapticAdapter {\n readonly name = 'web-vibration';\n readonly supported: boolean;\n\n private _cancelled = false;\n\n constructor() {\n this.supported =\n typeof navigator !== 'undefined' && 'vibrate' in navigator;\n }\n\n capabilities(): AdapterCapabilities {\n return {\n maxIntensityLevels: 1, // on/off only\n minDuration: 10,\n maxDuration: 10000,\n supportsPattern: true,\n supportsIntensity: false,\n dualMotor: false,\n };\n }\n\n async pulse(_intensity: number, duration: number): Promise<void> {\n if (!this.supported) return;\n navigator.vibrate(duration);\n }\n\n async playSequence(steps: HapticStep[]): Promise<void> {\n if (!this.supported || steps.length === 0) return;\n\n this._cancelled = false;\n\n // Convert to Vibration API pattern: [vibrate, pause, vibrate, pause, ...]\n const pattern = this._toVibrationPattern(steps);\n\n // If it's a simple pattern, use native pattern support\n if (this._canUseNativePattern(steps)) {\n navigator.vibrate(pattern);\n return;\n }\n\n // For complex patterns (intensity variation), play step by step\n for (const step of steps) {\n if (this._cancelled) break;\n\n if (step.type === 'vibrate') {\n if (step.intensity > 0.1) {\n // Simulate intensity via PWM for lower intensities\n if (step.intensity < 0.5) {\n await this._pwmVibrate(step.duration, step.intensity);\n } else {\n navigator.vibrate(step.duration);\n await delay(step.duration);\n }\n } else {\n await delay(step.duration);\n }\n } else {\n await delay(step.duration);\n }\n }\n }\n\n cancel(): void {\n this._cancelled = true;\n if (this.supported) {\n navigator.vibrate(0);\n }\n }\n\n dispose(): void {\n this.cancel();\n }\n\n /** Convert steps to Vibration API pattern array */\n private _toVibrationPattern(steps: HapticStep[]): number[] {\n const pattern: number[] = [];\n for (const step of steps) {\n pattern.push(step.duration);\n }\n return pattern;\n }\n\n /** Check if all steps can be played with native pattern (no intensity variation) */\n private _canUseNativePattern(steps: HapticStep[]): boolean {\n return steps.every(\n (s) =>\n (s.type === 'pause') ||\n (s.type === 'vibrate' && s.intensity >= 0.5)\n );\n }\n\n /** Simulate lower intensity via pulse-width modulation */\n private async _pwmVibrate(duration: number, intensity: number): Promise<void> {\n const cycleTime = 20; // ms per PWM cycle\n const onTime = Math.round(cycleTime * intensity);\n const offTime = cycleTime - onTime;\n const cycles = Math.floor(duration / cycleTime);\n\n const pattern: number[] = [];\n for (let i = 0; i < cycles; i++) {\n pattern.push(onTime, offTime);\n }\n\n if (pattern.length > 0) {\n navigator.vibrate(pattern);\n await delay(duration);\n }\n }\n}\n","import type { HapticAdapter, AdapterCapabilities, HapticStep } from '../types';\nimport { delay } from '../utils/scheduling';\n\n/**\n * iOS Audio workaround adapter.\n * Uses AudioContext to generate short, low-frequency oscillator tones (20-60 Hz)\n * that create a subtle physical sensation through device speakers.\n * This is a fallback for iOS Safari, which does not support the Vibration API.\n */\nexport class IoSAudioAdapter implements HapticAdapter {\n readonly name = 'ios-audio';\n readonly supported: boolean;\n\n private _audioCtx: AudioContext | null = null;\n private _activeOscillator: OscillatorNode | null = null;\n private _activeGain: GainNode | null = null;\n private _cancelled = false;\n\n constructor() {\n this.supported = this._detectSupport();\n }\n\n capabilities(): AdapterCapabilities {\n return {\n maxIntensityLevels: 100,\n minDuration: 5,\n maxDuration: 5000,\n supportsPattern: true,\n supportsIntensity: true,\n dualMotor: false,\n };\n }\n\n async pulse(intensity: number, duration: number): Promise<void> {\n if (!this.supported) return;\n await this._playTone(intensity, duration);\n }\n\n async playSequence(steps: HapticStep[]): Promise<void> {\n if (!this.supported || steps.length === 0) return;\n\n this._cancelled = false;\n\n for (const step of steps) {\n if (this._cancelled) break;\n\n if (step.type === 'vibrate' && step.intensity > 0) {\n await this._playTone(step.intensity, step.duration);\n } else {\n await delay(step.duration);\n }\n }\n }\n\n cancel(): void {\n this._cancelled = true;\n this._stopOscillator();\n }\n\n dispose(): void {\n this.cancel();\n if (this._audioCtx) {\n void this._audioCtx.close();\n this._audioCtx = null;\n }\n }\n\n // ─── Internal ──────────────────────────────────────────────\n\n private _detectSupport(): boolean {\n if (typeof window === 'undefined') return false;\n\n const hasAudioContext =\n typeof AudioContext !== 'undefined' ||\n typeof (window as unknown as Record<string, unknown>).webkitAudioContext !== 'undefined';\n\n if (!hasAudioContext) return false;\n\n // Check for iOS platform\n const ua = navigator.userAgent;\n const isIOS =\n /iPad|iPhone|iPod/.test(ua) ||\n (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1);\n\n return isIOS;\n }\n\n /** Get or create the AudioContext, resuming if suspended */\n private async _getAudioContext(): Promise<AudioContext> {\n if (!this._audioCtx) {\n const Ctor =\n typeof AudioContext !== 'undefined'\n ? AudioContext\n : ((window as unknown as Record<string, unknown>).webkitAudioContext as typeof AudioContext);\n this._audioCtx = new Ctor();\n }\n\n if (this._audioCtx.state === 'suspended') {\n await this._audioCtx.resume();\n }\n\n return this._audioCtx;\n }\n\n /** Map intensity (0-1) to frequency in the 20-60 Hz sub-bass range */\n private _intensityToFrequency(intensity: number): number {\n return 20 + intensity * 40; // 20 Hz at 0 intensity, 60 Hz at full\n }\n\n /** Play a single oscillator tone for the given duration */\n private async _playTone(intensity: number, duration: number): Promise<void> {\n const ctx = await this._getAudioContext();\n\n const oscillator = ctx.createOscillator();\n const gainNode = ctx.createGain();\n\n oscillator.type = 'sine';\n oscillator.frequency.setValueAtTime(\n this._intensityToFrequency(intensity),\n ctx.currentTime,\n );\n\n gainNode.gain.setValueAtTime(intensity, ctx.currentTime);\n\n oscillator.connect(gainNode);\n gainNode.connect(ctx.destination);\n\n this._activeOscillator = oscillator;\n this._activeGain = gainNode;\n\n oscillator.start(ctx.currentTime);\n oscillator.stop(ctx.currentTime + duration / 1000);\n\n await new Promise<void>((resolve) => {\n oscillator.onended = () => {\n oscillator.disconnect();\n gainNode.disconnect();\n this._activeOscillator = null;\n this._activeGain = null;\n resolve();\n };\n });\n }\n\n /** Immediately stop the active oscillator if any */\n private _stopOscillator(): void {\n if (this._activeOscillator) {\n try {\n this._activeOscillator.stop();\n this._activeOscillator.disconnect();\n } catch {\n // Already stopped — ignore\n }\n this._activeOscillator = null;\n }\n\n if (this._activeGain) {\n try {\n this._activeGain.disconnect();\n } catch {\n // Already disconnected — ignore\n }\n this._activeGain = null;\n }\n }\n}\n","/** Platform detection utilities */\n\nexport interface PlatformInfo {\n isWeb: boolean;\n isNode: boolean;\n isReactNative: boolean;\n hasVibrationAPI: boolean;\n hasGamepadAPI: boolean;\n isIOS: boolean;\n isAndroid: boolean;\n isMobile: boolean;\n}\n\nexport function detectPlatform(): PlatformInfo {\n const isWeb = typeof window !== 'undefined' && typeof document !== 'undefined';\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n const isNode =\n typeof globalThis !== 'undefined' &&\n typeof (globalThis as Record<string, unknown>).process === 'object' &&\n typeof ((globalThis as Record<string, unknown>).process as Record<string, unknown>)?.versions === 'object';\n const isReactNative =\n typeof navigator !== 'undefined' && navigator.product === 'ReactNative';\n\n const hasVibrationAPI = isWeb && 'vibrate' in navigator;\n const hasGamepadAPI = isWeb && 'getGamepads' in navigator;\n\n const ua = isWeb ? navigator.userAgent : '';\n const isIOS = /iPad|iPhone|iPod/.test(ua) || (isWeb && navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1);\n const isAndroid = /Android/.test(ua);\n const isMobile = isIOS || isAndroid;\n\n return {\n isWeb,\n isNode,\n isReactNative,\n hasVibrationAPI,\n hasGamepadAPI,\n isIOS,\n isAndroid,\n isMobile,\n };\n}\n","import type { HapticAdapter } from '../types';\nimport { NoopAdapter } from '../adapters/noop.adapter';\nimport { WebVibrationAdapter } from '../adapters/web-vibration.adapter';\nimport { IoSAudioAdapter } from '../adapters/ios-audio.adapter';\nimport { detectPlatform } from '../utils/platform';\n\n/**\n * Auto-detect the best available haptic adapter for the current platform.\n */\nexport function detectAdapter(): HapticAdapter {\n const platform = detectPlatform();\n\n // Web browser with Vibration API support\n if (platform.hasVibrationAPI) {\n return new WebVibrationAdapter();\n }\n\n // iOS fallback: use AudioContext to simulate haptic feedback\n if (platform.isIOS && platform.isWeb) {\n const iosAdapter = new IoSAudioAdapter();\n if (iosAdapter.supported) {\n return iosAdapter;\n }\n }\n\n // Fallback to no-op (SSR, Node, unsupported browsers)\n return new NoopAdapter();\n}\n","import type { HapticStep, AdapterCapabilities } from '../types';\nimport { clamp } from '../utils/scheduling';\n\n/**\n * Adapts ideal haptic patterns to what the device can actually produce.\n * Handles intensity quantization, duration clamping, and step merging.\n */\nexport class AdaptiveEngine {\n adapt(steps: HapticStep[], capabilities: AdapterCapabilities): HapticStep[] {\n return steps.map((step) => this._adaptStep(step, capabilities));\n }\n\n private _adaptStep(step: HapticStep, caps: AdapterCapabilities): HapticStep {\n const adapted = { ...step };\n\n // Clamp duration\n if (adapted.type === 'vibrate') {\n adapted.duration = clamp(adapted.duration, caps.minDuration, caps.maxDuration);\n }\n\n // Quantize intensity if device has limited levels\n if (!caps.supportsIntensity && adapted.type === 'vibrate') {\n // On/off only — threshold at 0.1\n adapted.intensity = adapted.intensity > 0.1 ? 1.0 : 0;\n } else if (caps.maxIntensityLevels > 1 && caps.maxIntensityLevels < 100) {\n // Quantize to available levels\n const levels = caps.maxIntensityLevels;\n adapted.intensity = Math.round(adapted.intensity * levels) / levels;\n }\n\n return adapted;\n }\n}\n","import type { FallbackConfig, HapticStep } from '../types';\n\n/**\n * Provides visual/audio fallback when haptic hardware is unavailable.\n */\nexport class FallbackManager {\n private config: FallbackConfig;\n\n constructor(config: FallbackConfig) {\n this.config = config;\n }\n\n updateConfig(config: FallbackConfig): void {\n this.config = config;\n }\n\n /** Execute fallback feedback for the given steps */\n async execute(steps: HapticStep[]): Promise<void> {\n if (this.config.type === 'none') return;\n\n const totalDuration = steps.reduce((sum, s) => sum + s.duration, 0);\n const maxIntensity = Math.max(...steps.filter((s) => s.type === 'vibrate').map((s) => s.intensity), 0);\n\n if (this.config.type === 'visual' || this.config.type === 'both') {\n await this._visualFallback(totalDuration, maxIntensity);\n }\n\n if (this.config.type === 'audio' || this.config.type === 'both') {\n await this._audioFallback(totalDuration, maxIntensity);\n }\n }\n\n private async _visualFallback(duration: number, intensity: number): Promise<void> {\n const visual = this.config.visual;\n if (!visual || typeof document === 'undefined') return;\n\n const element = visual.element ?? document.body;\n const style = visual.style ?? 'pulse';\n const className = visual.className;\n\n if (className) {\n element.classList.add(className);\n setTimeout(() => element.classList.remove(className), duration);\n return;\n }\n\n // Built-in visual feedback\n switch (style) {\n case 'flash': {\n const opacity = 0.1 + intensity * 0.3;\n const overlay = document.createElement('div');\n Object.assign(overlay.style, {\n position: 'fixed',\n inset: '0',\n backgroundColor: `rgba(0, 0, 0, ${opacity})`,\n pointerEvents: 'none',\n zIndex: '99999',\n transition: `opacity ${duration}ms ease-out`,\n });\n document.body.appendChild(overlay);\n requestAnimationFrame(() => {\n overlay.style.opacity = '0';\n });\n setTimeout(() => overlay.remove(), duration + 100);\n break;\n }\n case 'shake': {\n const magnitude = Math.round(intensity * 5);\n element.style.transition = 'none';\n element.style.transform = `translateX(${magnitude}px)`;\n setTimeout(() => {\n element.style.transition = `transform ${duration}ms ease-out`;\n element.style.transform = '';\n }, 50);\n break;\n }\n case 'pulse': {\n const scale = 1 + intensity * 0.02;\n element.style.transition = `transform ${duration}ms ease-out`;\n element.style.transform = `scale(${scale})`;\n setTimeout(() => {\n element.style.transform = '';\n }, duration);\n break;\n }\n }\n }\n\n private async _audioFallback(duration: number, intensity: number): Promise<void> {\n const audio = this.config.audio;\n if (!audio?.enabled || typeof AudioContext === 'undefined') return;\n\n try {\n const ctx = new AudioContext();\n const oscillator = ctx.createOscillator();\n const gainNode = ctx.createGain();\n\n oscillator.connect(gainNode);\n gainNode.connect(ctx.destination);\n\n oscillator.frequency.value = 200 + intensity * 200;\n gainNode.gain.value = audio.volume * intensity * 0.1;\n\n oscillator.start();\n oscillator.stop(ctx.currentTime + duration / 1000);\n\n await new Promise<void>((resolve) => {\n oscillator.onended = () => {\n ctx.close();\n resolve();\n };\n });\n } catch {\n // Audio fallback is best-effort\n }\n }\n}\n","import type { HapticStep, EasingFunction } from '../types';\n\n/**\n * Fluent builder for composing haptic patterns programmatically.\n *\n * Usage:\n * const pattern = new PatternComposer()\n * .tap(0.5)\n * .pause(100)\n * .ramp(0.2, 1.0, 300)\n * .buzz(200)\n * .build();\n */\nexport class PatternComposer {\n private steps: HapticStep[] = [];\n private _onPlay?: (steps: HapticStep[]) => Promise<void>;\n\n /** Register a play callback (used by HapticEngine) */\n onPlay(fn: (steps: HapticStep[]) => Promise<void>): this {\n this._onPlay = fn;\n return this;\n }\n\n /** Add a short tap vibration */\n tap(intensity = 0.6): this {\n this.steps.push({ type: 'vibrate', duration: 10, intensity });\n return this;\n }\n\n /** Add a vibration with specified duration and intensity */\n vibrate(duration: number, intensity = 1.0): this {\n this.steps.push({ type: 'vibrate', duration, intensity });\n return this;\n }\n\n /** Add a buzz (medium-length vibration) */\n buzz(duration = 100, intensity = 0.7): this {\n this.steps.push({ type: 'vibrate', duration, intensity });\n return this;\n }\n\n /** Add a pause */\n pause(duration = 50): this {\n this.steps.push({ type: 'pause', duration, intensity: 0 });\n return this;\n }\n\n /** Add an intensity ramp from start to end intensity over duration */\n ramp(\n startIntensity: number,\n endIntensity: number,\n duration: number,\n easing: EasingFunction = 'linear',\n ): this {\n const stepCount = Math.max(1, Math.floor(duration / 20));\n const stepDuration = duration / stepCount;\n\n for (let i = 0; i < stepCount; i++) {\n const t = i / (stepCount - 1 || 1);\n const easedT = applyEasing(t, easing);\n const intensity = startIntensity + (endIntensity - startIntensity) * easedT;\n this.steps.push({ type: 'vibrate', duration: stepDuration, intensity });\n }\n\n return this;\n }\n\n /** Add a pulse pattern (on-off-on-off) */\n pulse(count: number, onDuration = 50, offDuration = 50, intensity = 0.8): this {\n for (let i = 0; i < count; i++) {\n this.steps.push({ type: 'vibrate', duration: onDuration, intensity });\n if (i < count - 1) {\n this.steps.push({ type: 'pause', duration: offDuration, intensity: 0 });\n }\n }\n return this;\n }\n\n /** Repeat the entire current sequence N times */\n repeat(times: number): this {\n const original = [...this.steps];\n for (let i = 1; i < times; i++) {\n this.steps.push(...original.map((s) => ({ ...s })));\n }\n return this;\n }\n\n /** Build and return the step array */\n build(): HapticStep[] {\n return [...this.steps];\n }\n\n /** Build and immediately play the pattern */\n async play(): Promise<void> {\n if (this._onPlay) {\n await this._onPlay(this.steps);\n }\n }\n\n /** Reset the composer */\n clear(): this {\n this.steps = [];\n return this;\n }\n\n /** Get total duration in ms */\n get duration(): number {\n return this.steps.reduce((sum, s) => sum + s.duration, 0);\n }\n}\n\nfunction applyEasing(t: number, easing: EasingFunction): number {\n switch (easing) {\n case 'linear':\n return t;\n case 'ease-in':\n return t * t;\n case 'ease-out':\n return t * (2 - t);\n case 'ease-in-out':\n return t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t;\n }\n}\n","import type { HPLToken, HPLTokenType } from '../types';\n\nconst TOKEN_MAP: Record<string, HPLTokenType> = {\n '~': 'LIGHT',\n '#': 'MEDIUM',\n '@': 'HEAVY',\n '.': 'PAUSE',\n '|': 'TAP',\n '-': 'SUSTAIN',\n '[': 'GROUP_START',\n ']': 'GROUP_END',\n};\n\nexport class HPLTokenizerError extends Error {\n constructor(\n message: string,\n public readonly position: number,\n ) {\n super(`HPL Tokenizer Error at position ${position}: ${message}`);\n this.name = 'HPLTokenizerError';\n }\n}\n\n/** Tokenize an HPL pattern string into tokens */\nexport function tokenize(input: string): HPLToken[] {\n const tokens: HPLToken[] = [];\n let i = 0;\n\n while (i < input.length) {\n const char = input[i]!;\n\n // Skip whitespace\n if (char === ' ' || char === '\\t' || char === '\\n') {\n i++;\n continue;\n }\n\n // Check for repeat modifier: xN\n if (char === 'x' && i + 1 < input.length) {\n let numStr = '';\n let j = i + 1;\n while (j < input.length && input[j]! >= '0' && input[j]! <= '9') {\n numStr += input[j];\n j++;\n }\n if (numStr.length > 0) {\n tokens.push({\n type: 'REPEAT',\n value: `x${numStr}`,\n repeatCount: parseInt(numStr, 10),\n });\n i = j;\n continue;\n }\n }\n\n // Check known tokens\n const tokenType = TOKEN_MAP[char];\n if (tokenType) {\n tokens.push({ type: tokenType, value: char });\n i++;\n continue;\n }\n\n throw new HPLTokenizerError(`Unexpected character '${char}'`, i);\n }\n\n return tokens;\n}\n","import type {\n HPLToken,\n HPLNode,\n HPLSequenceNode,\n HPLGroupNode,\n HPLVibrateNode,\n HPLPauseNode,\n HPLTapNode,\n HPLSustainNode,\n} from '../types';\nimport { tokenize } from './tokenizer';\n\n/** Duration constants in milliseconds */\nconst UNIT_DURATION = 50;\nconst TAP_DURATION = 10;\n\n/** Intensity levels for vibrate tokens */\nconst INTENSITY_MAP: Record<string, number> = {\n LIGHT: 0.3,\n MEDIUM: 0.6,\n HEAVY: 1.0,\n};\n\nexport class HPLParserError extends Error {\n constructor(message: string) {\n super(`HPL Parser Error: ${message}`);\n this.name = 'HPLParserError';\n }\n}\n\n/**\n * Recursive descent parser for the Haptic Pattern Language (HPL).\n *\n * Grammar:\n * Pattern := Segment+\n * Segment := Group | Atom\n * Group := '[' Segment+ ']' Repeat?\n * Atom := '~' | '#' | '@' | '.' | '|' | '-'\n * Repeat := 'x' Number\n */\nexport class HPLParser {\n private tokens: HPLToken[] = [];\n private pos = 0;\n\n parse(input: string): HPLSequenceNode {\n this.tokens = tokenize(input);\n this.pos = 0;\n\n if (this.tokens.length === 0) {\n return { type: 'sequence', children: [] };\n }\n\n const children = this._parseSegments();\n\n if (this.pos < this.tokens.length) {\n throw new HPLParserError(\n `Unexpected token '${this.tokens[this.pos]!.value}' at position ${this.pos}`,\n );\n }\n\n return { type: 'sequence', children };\n }\n\n private _parseSegments(): HPLNode[] {\n const nodes: HPLNode[] = [];\n while (this.pos < this.tokens.length) {\n const token = this.tokens[this.pos]!;\n\n if (token.type === 'GROUP_END') {\n break; // Let parent group handle this\n }\n\n nodes.push(this._parseSegment());\n }\n return nodes;\n }\n\n private _parseSegment(): HPLNode {\n const token = this.tokens[this.pos]!;\n\n if (token.type === 'GROUP_START') {\n return this._parseGroup();\n }\n\n return this._parseAtom();\n }\n\n private _parseGroup(): HPLGroupNode {\n this.pos++; // consume '['\n\n const children = this._parseSegments();\n\n if (this.pos >= this.tokens.length || this.tokens[this.pos]!.type !== 'GROUP_END') {\n throw new HPLParserError('Unclosed group — expected \"]\"');\n }\n this.pos++; // consume ']'\n\n // Check for repeat modifier\n let repeat = 1;\n if (this.pos < this.tokens.length && this.tokens[this.pos]!.type === 'REPEAT') {\n repeat = this.tokens[this.pos]!.repeatCount ?? 1;\n this.pos++;\n }\n\n return { type: 'group', children, repeat };\n }\n\n private _parseAtom(): HPLNode {\n const token = this.tokens[this.pos]!;\n this.pos++;\n\n switch (token.type) {\n case 'LIGHT':\n case 'MEDIUM':\n case 'HEAVY':\n return this._makeVibrate(token.type);\n case 'PAUSE':\n return this._makePause();\n case 'TAP':\n return this._makeTap();\n case 'SUSTAIN':\n return this._makeSustain();\n default:\n throw new HPLParserError(`Unexpected token type '${token.type}'`);\n }\n }\n\n private _makeVibrate(level: string): HPLVibrateNode {\n return {\n type: 'vibrate',\n intensity: INTENSITY_MAP[level] ?? 0.5,\n duration: UNIT_DURATION,\n };\n }\n\n private _makePause(): HPLPauseNode {\n return { type: 'pause', duration: UNIT_DURATION };\n }\n\n private _makeTap(): HPLTapNode {\n return { type: 'tap', duration: TAP_DURATION, intensity: 1.0 };\n }\n\n private _makeSustain(): HPLSustainNode {\n return { type: 'sustain', extension: UNIT_DURATION };\n }\n}\n\n/** Convenience function to parse an HPL string */\nexport function parseHPL(input: string): HPLSequenceNode {\n const parser = new HPLParser();\n return parser.parse(input);\n}\n","import type { HapticStep } from '../types/haptic-effect';\nimport type { HPLNode, HPLSequenceNode } from '../types/pattern';\n\n/**\n * Compiles an HPL AST into a flat array of HapticSteps.\n * Handles group expansion, sustain merging, and repeat unrolling.\n */\nexport function compile(ast: HPLSequenceNode): HapticStep[] {\n const raw = compileNode(ast);\n return mergeSustains(raw);\n}\n\nfunction compileNode(node: HPLNode): HapticStep[] {\n switch (node.type) {\n case 'vibrate':\n return [{ type: 'vibrate', duration: node.duration, intensity: node.intensity }];\n\n case 'pause':\n return [{ type: 'pause', duration: node.duration, intensity: 0 }];\n\n case 'tap':\n return [{ type: 'vibrate', duration: node.duration, intensity: node.intensity }];\n\n case 'sustain':\n // Sustain is a marker — it extends the previous step during merge\n return [{ type: 'vibrate', duration: node.extension, intensity: -1 }]; // sentinel\n\n case 'group': {\n const groupSteps = node.children.flatMap(compileNode);\n const result: HapticStep[] = [];\n for (let i = 0; i < node.repeat; i++) {\n result.push(...groupSteps.map((s) => ({ ...s })));\n }\n return result;\n }\n\n case 'sequence':\n return node.children.flatMap(compileNode);\n }\n}\n\n/**\n * Merge sustain markers (-) into the preceding step.\n * A sustain with intensity=-1 extends the previous vibrate's duration.\n */\nfunction mergeSustains(steps: HapticStep[]): HapticStep[] {\n const result: HapticStep[] = [];\n\n for (const step of steps) {\n if (step.intensity === -1 && result.length > 0) {\n // Sustain — extend previous step\n const prev = result[result.length - 1]!;\n prev.duration += step.duration;\n } else {\n result.push({ ...step });\n }\n }\n\n return result;\n}\n\n/**\n * Optimize a step sequence by merging adjacent same-type steps.\n */\nexport function optimizeSteps(steps: HapticStep[]): HapticStep[] {\n if (steps.length === 0) return [];\n\n const result: HapticStep[] = [{ ...steps[0]! }];\n\n for (let i = 1; i < steps.length; i++) {\n const current = steps[i]!;\n const prev = result[result.length - 1]!;\n\n // Merge adjacent pauses\n if (current.type === 'pause' && prev.type === 'pause') {\n prev.duration += current.duration;\n continue;\n }\n\n // Merge adjacent vibrates with same intensity\n if (\n current.type === 'vibrate' &&\n prev.type === 'vibrate' &&\n Math.abs(current.intensity - prev.intensity) < 0.01\n ) {\n prev.duration += current.duration;\n continue;\n }\n\n result.push({ ...current });\n }\n\n return result;\n}\n","import type {\n HapticAdapter,\n HapticConfig,\n HapticStep,\n HapticPattern,\n ImpactStyle,\n} from '../types';\nimport { DEFAULT_CONFIG } from '../types';\nimport { detectAdapter } from './capability-detector';\nimport { AdaptiveEngine } from './adaptive-engine';\nimport { FallbackManager } from './fallback-manager';\nimport { PatternComposer } from '../composer/pattern-composer';\nimport { parseHPL } from '../patterns/parser';\nimport { compile, optimizeSteps } from '../patterns/compiler';\nimport { normalizeIntensity } from '../utils/scheduling';\n\n/**\n * The main haptic engine — orchestrates adapters, patterns, and fallbacks.\n *\n * Usage:\n * const engine = HapticEngine.create();\n * engine.tap();\n * engine.success();\n * engine.play('~~..##..@@');\n */\nexport class HapticEngine {\n private adapter: HapticAdapter;\n private config: HapticConfig;\n private adaptive: AdaptiveEngine;\n private fallback: FallbackManager;\n\n constructor(config?: Partial<HapticConfig>) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n this.adapter = this.config.adapter ?? detectAdapter();\n this.adaptive = new AdaptiveEngine();\n this.fallback = new FallbackManager(this.config.fallback);\n }\n\n /** Create a new engine with auto-detected adapter */\n static create(config?: Partial<HapticConfig>): HapticEngine {\n return new HapticEngine(config);\n }\n\n // ─── Semantic API ──────────────────────────────────────────\n\n /** Light tap feedback */\n async tap(intensity = 0.6): Promise<void> {\n await this._playSteps([{ type: 'vibrate', duration: 30, intensity }]);\n }\n\n /** Double tap */\n async doubleTap(intensity = 0.6): Promise<void> {\n await this._playSteps([\n { type: 'vibrate', duration: 10, intensity },\n { type: 'pause', duration: 80, intensity: 0 },\n { type: 'vibrate', duration: 10, intensity },\n ]);\n }\n\n /** Long press feedback */\n async longPress(intensity = 0.8): Promise<void> {\n await this._playSteps([{ type: 'vibrate', duration: 50, intensity }]);\n }\n\n /** Success notification */\n async success(): Promise<void> {\n await this._playSteps([\n { type: 'vibrate', duration: 30, intensity: 0.5 },\n { type: 'pause', duration: 60, intensity: 0 },\n { type: 'vibrate', duration: 40, intensity: 0.8 },\n ]);\n }\n\n /** Warning notification */\n async warning(): Promise<void> {\n await this._playSteps([\n { type: 'vibrate', duration: 40, intensity: 0.7 },\n { type: 'pause', duration: 50, intensity: 0 },\n { type: 'vibrate', duration: 40, intensity: 0.7 },\n { type: 'pause', duration: 50, intensity: 0 },\n { type: 'vibrate', duration: 40, intensity: 0.7 },\n ]);\n }\n\n /** Error notification */\n async error(): Promise<void> {\n await this._playSteps([\n { type: 'vibrate', duration: 80, intensity: 1.0 },\n { type: 'pause', duration: 100, intensity: 0 },\n { type: 'vibrate', duration: 80, intensity: 1.0 },\n ]);\n }\n\n /** Selection change feedback */\n async selection(): Promise<void> {\n await this._playSteps([{ type: 'vibrate', duration: 8, intensity: 0.4 }]);\n }\n\n /** Toggle feedback */\n async toggle(on: boolean): Promise<void> {\n if (on) {\n await this._playSteps([{ type: 'vibrate', duration: 15, intensity: 0.6 }]);\n } else {\n await this._playSteps([{ type: 'vibrate', duration: 10, intensity: 0.3 }]);\n }\n }\n\n /** Impact with style (matches iOS UIImpactFeedbackGenerator) */\n async impact(style: ImpactStyle = 'medium'): Promise<void> {\n const presets: Record<ImpactStyle, HapticStep[]> = {\n light: [{ type: 'vibrate', duration: 10, intensity: 0.3 }],\n medium: [{ type: 'vibrate', duration: 15, intensity: 0.6 }],\n heavy: [{ type: 'vibrate', duration: 25, intensity: 1.0 }],\n rigid: [{ type: 'vibrate', duration: 8, intensity: 0.9 }],\n soft: [{ type: 'vibrate', duration: 30, intensity: 0.4 }],\n };\n await this._playSteps(presets[style]);\n }\n\n // ─── Parametric API ────────────────────────────────────────\n\n /** Vibrate for a specified duration */\n async vibrate(duration: number, intensity = 1.0): Promise<void> {\n await this._playSteps([\n { type: 'vibrate', duration, intensity: normalizeIntensity(intensity) },\n ]);\n }\n\n /**\n * Play a haptic pattern.\n * Accepts:\n * - HPL string: \"~~..##..@@\"\n * - HapticPattern object\n * - Raw HapticStep array\n */\n async play(pattern: string | HapticPattern | HapticStep[]): Promise<void> {\n let steps: HapticStep[];\n\n if (typeof pattern === 'string') {\n const ast = parseHPL(pattern);\n steps = compile(ast);\n } else if (Array.isArray(pattern)) {\n steps = pattern;\n } else {\n steps = pattern.steps;\n }\n\n await this._playSteps(steps);\n }\n\n // ─── Composer ──────────────────────────────────────────────\n\n /** Create a new pattern composer */\n compose(): PatternComposer {\n const composer = new PatternComposer();\n composer.onPlay((steps) => this._playSteps(steps));\n return composer;\n }\n\n // ─── Configuration ─────────────────────────────────────────\n\n /** Update engine configuration */\n configure(config: Partial<HapticConfig>): void {\n Object.assign(this.config, config);\n\n if (config.adapter) {\n this.adapter = config.adapter;\n }\n\n if (config.fallback) {\n this.fallback.updateConfig(this.config.fallback);\n }\n }\n\n /** Check if haptics are supported on this device */\n get isSupported(): boolean {\n return this.adapter.supported;\n }\n\n /** Get the current adapter name */\n get adapterName(): string {\n return this.adapter.name;\n }\n\n // ─── Lifecycle ─────────────────────────────────────────────\n\n /** Cancel any ongoing haptic effect */\n cancel(): void {\n this.adapter.cancel();\n }\n\n /** Clean up resources */\n dispose(): void {\n this.adapter.dispose();\n }\n\n // ─── Internal ──────────────────────────────────────────────\n\n private async _playSteps(steps: HapticStep[]): Promise<void> {\n if (!this.config.enabled || steps.length === 0) return;\n\n // Apply global intensity multiplier\n let adjusted = steps.map((s) => ({\n ...s,\n intensity:\n s.type === 'vibrate'\n ? normalizeIntensity(s.intensity * this.config.intensity)\n : 0,\n }));\n\n // Adapt to device capabilities\n const caps = this.adapter.capabilities();\n adjusted = this.adaptive.adapt(adjusted, caps);\n\n // Optimize\n adjusted = optimizeSteps(adjusted);\n\n if (this.adapter.supported) {\n await this.adapter.playSequence(adjusted);\n } else {\n await this.fallback.execute(adjusted);\n }\n }\n}\n","/** Validate an HPL pattern string and return human-readable errors */\nexport interface ValidationResult {\n valid: boolean;\n errors: string[];\n}\n\nconst VALID_CHARS = new Set('~#@.|\\\\-[] \\t\\nx0123456789');\n\nexport function validateHPL(input: string): ValidationResult {\n const errors: string[] = [];\n\n if (input.length === 0) {\n return { valid: true, errors: [] };\n }\n\n // Check for invalid characters\n for (let i = 0; i < input.length; i++) {\n if (!VALID_CHARS.has(input[i]!)) {\n errors.push(`Invalid character '${input[i]}' at position ${i}`);\n }\n }\n\n // Check bracket matching\n let depth = 0;\n for (let i = 0; i < input.length; i++) {\n if (input[i] === '[') depth++;\n if (input[i] === ']') depth--;\n if (depth < 0) {\n errors.push(`Unmatched ']' at position ${i}`);\n }\n }\n if (depth > 0) {\n errors.push(`${depth} unclosed '[' bracket(s)`);\n }\n\n // Check for empty groups\n for (let i = 0; i < input.length - 1; i++) {\n if (input[i] === '[' && input[i + 1] === ']') {\n errors.push(`Empty group at position ${i}`);\n }\n }\n\n // Check repeat modifiers are after groups or atoms\n for (let i = 0; i < input.length; i++) {\n if (input[i] === 'x' && i + 1 < input.length && /\\d/.test(input[i + 1]!)) {\n if (i === 0) {\n errors.push(`Repeat modifier 'x' at position ${i} must follow a group or atom`);\n }\n }\n }\n\n return { valid: errors.length === 0, errors };\n}\n","import type { HapticStep, HapticPattern } from '../types/haptic-effect';\nimport { parseHPL } from './parser';\nimport { compile } from './compiler';\n\n/** Portable JSON-serializable format for sharing haptic patterns */\nexport interface HapticPatternExport {\n version: 1;\n name: string;\n description?: string;\n /** Original HPL string if pattern was created from HPL */\n hpl?: string;\n /** Compiled haptic steps */\n steps: HapticStep[];\n metadata?: {\n /** Total duration in milliseconds */\n duration: number;\n author?: string;\n tags?: string[];\n /** ISO date string */\n createdAt?: string;\n };\n}\n\n/** Options for exporting a pattern */\nexport interface ExportOptions {\n name?: string;\n description?: string;\n author?: string;\n tags?: string[];\n}\n\n/** Input types accepted by exportPattern */\ntype ExportInput = HapticPattern | HapticStep[] | string;\n\n/**\n * Calculate total duration of a step sequence.\n */\nfunction totalDuration(steps: HapticStep[]): number {\n return steps.reduce((sum, s) => sum + s.duration, 0);\n}\n\n/**\n * Resolve input to steps and optional HPL source string.\n */\nfunction resolveInput(input: ExportInput): { steps: HapticStep[]; hpl?: string; name?: string } {\n // HPL string\n if (typeof input === 'string') {\n const ast = parseHPL(input);\n return { steps: compile(ast), hpl: input };\n }\n\n // HapticStep[]\n if (Array.isArray(input)) {\n return { steps: input };\n }\n\n // HapticPattern\n return { steps: input.steps, name: input.name };\n}\n\n/**\n * Export a haptic pattern as a portable JSON-serializable object.\n *\n * Accepts a HapticPattern, HapticStep[], or HPL string.\n */\nexport function exportPattern(\n input: ExportInput,\n options: ExportOptions = {},\n): HapticPatternExport {\n const resolved = resolveInput(input);\n const steps = resolved.steps;\n const name = options.name ?? resolved.name ?? 'Untitled Pattern';\n\n const result: HapticPatternExport = {\n version: 1,\n name,\n steps,\n };\n\n if (options.description) {\n result.description = options.description;\n }\n\n if (resolved.hpl) {\n result.hpl = resolved.hpl;\n }\n\n const hasMetadataFields = options.author || options.tags;\n if (hasMetadataFields || steps.length > 0) {\n result.metadata = {\n duration: totalDuration(steps),\n createdAt: new Date().toISOString(),\n };\n\n if (options.author) {\n result.metadata.author = options.author;\n }\n\n if (options.tags) {\n result.metadata.tags = options.tags;\n }\n }\n\n return result;\n}\n\n/**\n * Validate that a value looks like a valid HapticPatternExport.\n * Throws descriptive errors for invalid data.\n */\nfunction validateExport(data: unknown): asserts data is HapticPatternExport {\n if (data === null || typeof data !== 'object') {\n throw new Error('Invalid pattern data: expected an object');\n }\n\n const obj = data as Record<string, unknown>;\n\n if (obj.version !== 1) {\n throw new Error(\n `Unsupported pattern version: ${String(obj.version)}. Expected version 1`,\n );\n }\n\n if (typeof obj.name !== 'string' || obj.name.length === 0) {\n throw new Error('Invalid pattern data: \"name\" must be a non-empty string');\n }\n\n if (!Array.isArray(obj.steps)) {\n throw new Error('Invalid pattern data: \"steps\" must be an array');\n }\n\n for (let i = 0; i < obj.steps.length; i++) {\n const step = obj.steps[i] as Record<string, unknown>;\n\n if (step.type !== 'vibrate' && step.type !== 'pause') {\n throw new Error(\n `Invalid step at index ${i}: \"type\" must be \"vibrate\" or \"pause\"`,\n );\n }\n\n if (typeof step.duration !== 'number' || step.duration < 0) {\n throw new Error(\n `Invalid step at index ${i}: \"duration\" must be a non-negative number`,\n );\n }\n\n if (typeof step.intensity !== 'number' || step.intensity < 0 || step.intensity > 1) {\n throw new Error(\n `Invalid step at index ${i}: \"intensity\" must be a number between 0 and 1`,\n );\n }\n }\n}\n\n/**\n * Import a pattern from a HapticPatternExport object or JSON string.\n * Validates the data and returns a HapticPattern.\n */\nexport function importPattern(data: HapticPatternExport | string): HapticPattern {\n const parsed = typeof data === 'string' ? JSON.parse(data) : data;\n validateExport(parsed);\n\n const pattern: HapticPattern = {\n name: parsed.name,\n steps: parsed.steps.map((s) => ({ ...s })),\n };\n\n if (parsed.metadata) {\n pattern.metadata = { ...parsed.metadata };\n }\n\n return pattern;\n}\n\n/**\n * Serialize a pattern to a pretty-printed JSON string.\n */\nexport function patternToJSON(\n input: ExportInput,\n options: ExportOptions = {},\n): string {\n const exported = exportPattern(input, options);\n return JSON.stringify(exported, null, 2);\n}\n\n/**\n * Parse a JSON string into a HapticPattern.\n */\nexport function patternFromJSON(json: string): HapticPattern {\n return importPattern(json);\n}\n\n/**\n * Encode a pattern as a data: URL for easy sharing via links.\n */\nexport function patternToDataURL(\n input: ExportInput,\n options: ExportOptions = {},\n): string {\n const json = patternToJSON(input, options);\n const encoded = btoa(json);\n return `data:application/haptic+json;base64,${encoded}`;\n}\n\n/**\n * Decode a data: URL back to a HapticPattern.\n */\nexport function patternFromDataURL(url: string): HapticPattern {\n const prefix = 'data:application/haptic+json;base64,';\n\n if (!url.startsWith(prefix)) {\n throw new Error(\n 'Invalid haptic data URL: expected \"data:application/haptic+json;base64,\" prefix',\n );\n }\n\n const encoded = url.slice(prefix.length);\n const json = atob(encoded);\n return patternFromJSON(json);\n}\n","import type { HapticPattern } from '../types';\n\n/** UI interaction presets */\nexport const ui = {\n /** Light button tap */\n tap: {\n name: 'ui.tap',\n steps: [{ type: 'vibrate' as const, duration: 10, intensity: 0.6 }],\n },\n\n /** Double tap */\n doubleTap: {\n name: 'ui.doubleTap',\n steps: [\n { type: 'vibrate' as const, duration: 10, intensity: 0.6 },\n { type: 'pause' as const, duration: 80, intensity: 0 },\n { type: 'vibrate' as const, duration: 10, intensity: 0.6 },\n ],\n },\n\n /** Long press acknowledgment */\n longPress: {\n name: 'ui.longPress',\n steps: [{ type: 'vibrate' as const, duration: 50, intensity: 0.8 }],\n },\n\n /** Toggle switch on */\n toggleOn: {\n name: 'ui.toggleOn',\n steps: [{ type: 'vibrate' as const, duration: 15, intensity: 0.6 }],\n },\n\n /** Toggle switch off */\n toggleOff: {\n name: 'ui.toggleOff',\n steps: [{ type: 'vibrate' as const, duration: 10, intensity: 0.3 }],\n },\n\n /** Slider snap to value */\n sliderSnap: {\n name: 'ui.sliderSnap',\n steps: [{ type: 'vibrate' as const, duration: 5, intensity: 0.4 }],\n },\n\n /** Selection changed */\n selection: {\n name: 'ui.selection',\n steps: [{ type: 'vibrate' as const, duration: 8, intensity: 0.4 }],\n },\n\n /** Pull to refresh threshold reached */\n pullToRefresh: {\n name: 'ui.pullToRefresh',\n steps: [\n { type: 'vibrate' as const, duration: 20, intensity: 0.5 },\n { type: 'pause' as const, duration: 40, intensity: 0 },\n { type: 'vibrate' as const, duration: 30, intensity: 0.7 },\n ],\n },\n\n /** Swipe action triggered */\n swipe: {\n name: 'ui.swipe',\n steps: [\n { type: 'vibrate' as const, duration: 12, intensity: 0.4 },\n { type: 'pause' as const, duration: 30, intensity: 0 },\n { type: 'vibrate' as const, duration: 8, intensity: 0.3 },\n ],\n },\n\n /** Context menu appearance */\n contextMenu: {\n name: 'ui.contextMenu',\n steps: [{ type: 'vibrate' as const, duration: 20, intensity: 0.7 }],\n },\n\n /** Drag start */\n dragStart: {\n name: 'ui.dragStart',\n steps: [{ type: 'vibrate' as const, duration: 12, intensity: 0.5 }],\n },\n\n /** Drag drop */\n drop: {\n name: 'ui.drop',\n steps: [\n { type: 'vibrate' as const, duration: 20, intensity: 0.8 },\n { type: 'pause' as const, duration: 30, intensity: 0 },\n { type: 'vibrate' as const, duration: 10, intensity: 0.4 },\n ],\n },\n} satisfies Record<string, HapticPattern>;\n","import type { HapticPattern } from '../types';\n\n/** Notification feedback presets */\nexport const notifications = {\n /** Success — two ascending pulses */\n success: {\n name: 'notifications.success',\n steps: [\n { type: 'vibrate' as const, duration: 30, intensity: 0.5 },\n { type: 'pause' as const, duration: 60, intensity: 0 },\n { type: 'vibrate' as const, duration: 40, intensity: 0.8 },\n ],\n },\n\n /** Warning — three even pulses */\n warning: {\n name: 'notifications.warning',\n steps: [\n { type: 'vibrate' as const, duration: 40, intensity: 0.7 },\n { type: 'pause' as const, duration: 50, intensity: 0 },\n { type: 'vibrate' as const, duration: 40, intensity: 0.7 },\n { type: 'pause' as const, duration: 50, intensity: 0 },\n { type: 'vibrate' as const, duration: 40, intensity: 0.7 },\n ],\n },\n\n /** Error — two heavy pulses */\n error: {\n name: 'notifications.error',\n steps: [\n { type: 'vibrate' as const, duration: 80, intensity: 1.0 },\n { type: 'pause' as const, duration: 100, intensity: 0 },\n { type: 'vibrate' as const, duration: 80, intensity: 1.0 },\n ],\n },\n\n /** Info — soft single pulse */\n info: {\n name: 'notifications.info',\n steps: [\n { type: 'vibrate' as const, duration: 20, intensity: 0.4 },\n ],\n },\n\n /** Message received */\n messageReceived: {\n name: 'notifications.messageReceived',\n steps: [\n { type: 'vibrate' as const, duration: 15, intensity: 0.5 },\n { type: 'pause' as const, duration: 100, intensity: 0 },\n { type: 'vibrate' as const, duration: 15, intensity: 0.5 },\n ],\n },\n\n /** Alarm — urgent repeating pattern */\n alarm: {\n name: 'notifications.alarm',\n steps: [\n { type: 'vibrate' as const, duration: 100, intensity: 1.0 },\n { type: 'pause' as const, duration: 50, intensity: 0 },\n { type: 'vibrate' as const, duration: 100, intensity: 1.0 },\n { type: 'pause' as const, duration: 50, intensity: 0 },\n { type: 'vibrate' as const, duration: 100, intensity: 1.0 },\n { type: 'pause' as const, duration: 200, intensity: 0 },\n { type: 'vibrate' as const, duration: 100, intensity: 1.0 },\n { type: 'pause' as const, duration: 50, intensity: 0 },\n { type: 'vibrate' as const, duration: 100, intensity: 1.0 },\n { type: 'pause' as const, duration: 50, intensity: 0 },\n { type: 'vibrate' as const, duration: 100, intensity: 1.0 },\n ],\n },\n\n /** Reminder — gentle nudge */\n reminder: {\n name: 'notifications.reminder',\n steps: [\n { type: 'vibrate' as const, duration: 25, intensity: 0.5 },\n { type: 'pause' as const, duration: 150, intensity: 0 },\n { type: 'vibrate' as const, duration: 25, intensity: 0.5 },\n ],\n },\n} satisfies Record<string, HapticPattern>;\n","import type { HapticPattern } from '../types';\n\n/** Gaming haptic presets */\nexport const gaming = {\n /** Explosion — heavy descending */\n explosion: {\n name: 'gaming.explosion',\n steps: [\n { type: 'vibrate' as const, duration: 100, intensity: 1.0 },\n { type: 'vibrate' as const, duration: 80, intensity: 0.8 },\n { type: 'vibrate' as const, duration: 60, intensity: 0.5 },\n { type: 'vibrate' as const, duration: 40, intensity: 0.3 },\n { type: 'vibrate' as const, duration: 30, intensity: 0.1 },\n ],\n },\n\n /** Collision — sharp impact */\n collision: {\n name: 'gaming.collision',\n steps: [\n { type: 'vibrate' as const, duration: 30, intensity: 1.0 },\n { type: 'pause' as const, duration: 20, intensity: 0 },\n { type: 'vibrate' as const, duration: 15, intensity: 0.5 },\n ],\n },\n\n /** Heartbeat — rhythmic pulse */\n heartbeat: {\n name: 'gaming.heartbeat',\n steps: [\n { type: 'vibrate' as const, duration: 20, intensity: 0.8 },\n { type: 'pause' as const, duration: 80, intensity: 0 },\n { type: 'vibrate' as const, duration: 30, intensity: 1.0 },\n { type: 'pause' as const, duration: 400, intensity: 0 },\n ],\n },\n\n /** Gunshot — sharp burst */\n gunshot: {\n name: 'gaming.gunshot',\n steps: [\n { type: 'vibrate' as const, duration: 15, intensity: 1.0 },\n { type: 'vibrate' as const, duration: 30, intensity: 0.4 },\n ],\n },\n\n /** Sword clash — metallic ring */\n swordClash: {\n name: 'gaming.swordClash',\n steps: [\n { type: 'vibrate' as const, duration: 10, intensity: 1.0 },\n { type: 'pause' as const, duration: 10, intensity: 0 },\n { type: 'vibrate' as const, duration: 30, intensity: 0.6 },\n { type: 'vibrate' as const, duration: 50, intensity: 0.3 },\n ],\n },\n\n /** Power up — ascending intensity */\n powerUp: {\n name: 'gaming.powerUp',\n steps: [\n { type: 'vibrate' as const, duration: 40, intensity: 0.2 },\n { type: 'vibrate' as const, duration: 40, intensity: 0.4 },\n { type: 'vibrate' as const, duration: 40, intensity: 0.6 },\n { type: 'vibrate' as const, duration: 40, intensity: 0.8 },\n { type: 'vibrate' as const, duration: 60, intensity: 1.0 },\n ],\n },\n\n /** Damage taken — heavy stutter */\n damage: {\n name: 'gaming.damage',\n steps: [\n { type: 'vibrate' as const, duration: 40, intensity: 0.9 },\n { type: 'pause' as const, duration: 20, intensity: 0 },\n { type: 'vibrate' as const, duration: 30, intensity: 0.6 },\n { type: 'pause' as const, duration: 20, intensity: 0 },\n { type: 'vibrate' as const, duration: 20, intensity: 0.3 },\n ],\n },\n\n /** Item pickup — light cheerful */\n pickup: {\n name: 'gaming.pickup',\n steps: [\n { type: 'vibrate' as const, duration: 10, intensity: 0.3 },\n { type: 'pause' as const, duration: 40, intensity: 0 },\n { type: 'vibrate' as const, duration: 15, intensity: 0.6 },\n ],\n },\n\n /** Level complete — celebratory */\n levelComplete: {\n name: 'gaming.levelComplete',\n steps: [\n { type: 'vibrate' as const, duration: 20, intensity: 0.5 },\n { type: 'pause' as const, duration: 60, intensity: 0 },\n { type: 'vibrate' as const, duration: 20, intensity: 0.5 },\n { type: 'pause' as const, duration: 60, intensity: 0 },\n { type: 'vibrate' as const, duration: 30, intensity: 0.7 },\n { type: 'pause' as const, duration: 60, intensity: 0 },\n { type: 'vibrate' as const, duration: 50, intensity: 1.0 },\n ],\n },\n\n /** Engine rumble — continuous vibration */\n engineRumble: {\n name: 'gaming.engineRumble',\n steps: [\n { type: 'vibrate' as const, duration: 30, intensity: 0.4 },\n { type: 'pause' as const, duration: 10, intensity: 0 },\n { type: 'vibrate' as const, duration: 30, intensity: 0.5 },\n { type: 'pause' as const, duration: 10, intensity: 0 },\n { type: 'vibrate' as const, duration: 30, intensity: 0.4 },\n { type: 'pause' as const, duration: 10, intensity: 0 },\n { type: 'vibrate' as const, duration: 30, intensity: 0.5 },\n ],\n },\n} satisfies Record<string, HapticPattern>;\n","import type { HapticPattern } from '../types';\n\n/** Accessibility-focused haptic presets — rhythmic patterns for non-visual feedback */\nexport const accessibility = {\n /** Confirm action — clear double pulse */\n confirm: {\n name: 'accessibility.confirm',\n steps: [\n { type: 'vibrate' as const, duration: 30, intensity: 0.7 },\n { type: 'pause' as const, duration: 100, intensity: 0 },\n { type: 'vibrate' as const, duration: 30, intensity: 0.7 },\n ],\n },\n\n /** Deny/reject — long single buzz */\n deny: {\n name: 'accessibility.deny',\n steps: [\n { type: 'vibrate' as const, duration: 200, intensity: 0.8 },\n ],\n },\n\n /** Boundary reached (e.g., scroll limit, min/max value) */\n boundary: {\n name: 'accessibility.boundary',\n steps: [\n { type: 'vibrate' as const, duration: 15, intensity: 1.0 },\n ],\n },\n\n /** Focus change — subtle tick */\n focusChange: {\n name: 'accessibility.focusChange',\n steps: [\n { type: 'vibrate' as const, duration: 5, intensity: 0.3 },\n ],\n },\n\n /** Counting rhythm — one tick per count */\n countTick: {\n name: 'accessibility.countTick',\n steps: [\n { type: 'vibrate' as const, duration: 8, intensity: 0.5 },\n ],\n },\n\n /** Navigation landmark reached */\n landmark: {\n name: 'accessibility.landmark',\n steps: [\n { type: 'vibrate' as const, duration: 15, intensity: 0.6 },\n { type: 'pause' as const, duration: 40, intensity: 0 },\n { type: 'vibrate' as const, duration: 15, intensity: 0.6 },\n { type: 'pause' as const, duration: 40, intensity: 0 },\n { type: 'vibrate' as const, duration: 15, intensity: 0.6 },\n ],\n },\n\n /** Progress checkpoint — escalating feedback */\n progressCheckpoint: {\n name: 'accessibility.progressCheckpoint',\n steps: [\n { type: 'vibrate' as const, duration: 20, intensity: 0.4 },\n { type: 'pause' as const, duration: 60, intensity: 0 },\n { type: 'vibrate' as const, duration: 25, intensity: 0.7 },\n ],\n },\n} satisfies Record<string, HapticPattern>;\n","import type { HapticPattern } from '../types';\n\n/** System-level haptic presets */\nexport const system = {\n /** Keyboard key press */\n keyPress: {\n name: 'system.keyPress',\n steps: [{ type: 'vibrate' as const, duration: 5, intensity: 0.3 }],\n },\n\n /** Scroll tick (detent-like) */\n scrollTick: {\n name: 'system.scrollTick',\n steps: [{ type: 'vibrate' as const, duration: 3, intensity: 0.2 }],\n },\n\n /** Scroll boundary reached */\n scrollBounce: {\n name: 'system.scrollBounce',\n steps: [\n { type: 'vibrate' as const, duration: 10, intensity: 0.5 },\n { type: 'vibrate' as const, duration: 20, intensity: 0.3 },\n ],\n },\n\n /** Delete action */\n delete: {\n name: 'system.delete',\n steps: [\n { type: 'vibrate' as const, duration: 15, intensity: 0.5 },\n { type: 'pause' as const, duration: 50, intensity: 0 },\n { type: 'vibrate' as const, duration: 25, intensity: 0.8 },\n ],\n },\n\n /** Undo action */\n undo: {\n name: 'system.undo',\n steps: [\n { type: 'vibrate' as const, duration: 20, intensity: 0.5 },\n { type: 'pause' as const, duration: 80, intensity: 0 },\n { type: 'vibrate' as const, duration: 10, intensity: 0.3 },\n ],\n },\n\n /** Copy to clipboard */\n copy: {\n name: 'system.copy',\n steps: [{ type: 'vibrate' as const, duration: 12, intensity: 0.4 }],\n },\n\n /** Paste from clipboard */\n paste: {\n name: 'system.paste',\n steps: [\n { type: 'vibrate' as const, duration: 8, intensity: 0.3 },\n { type: 'pause' as const, duration: 30, intensity: 0 },\n { type: 'vibrate' as const, duration: 12, intensity: 0.5 },\n ],\n },\n} satisfies Record<string, HapticPattern>;\n","export { ui } from './ui';\nexport { notifications } from './notifications';\nexport { gaming } from './gaming';\nexport { accessibility } from './accessibility';\nexport { system } from './system';\n\nimport { ui } from './ui';\nimport { notifications } from './notifications';\nimport { gaming } from './gaming';\nimport { accessibility } from './accessibility';\nimport { system } from './system';\n\n/** All presets grouped by category */\nexport const presets = {\n ui,\n notifications,\n gaming,\n accessibility,\n system,\n} as const;\n","// Types\nexport type {\n HapticStep,\n HapticPattern,\n EasingFunction,\n ImpactStyle,\n NotificationType,\n SemanticEffect,\n AdapterCapabilities,\n HapticAdapter,\n HapticConfig,\n FallbackConfig,\n VisualFallbackStyle,\n HPLToken,\n HPLTokenType,\n HPLNode,\n HPLNodeType,\n} from './types';\n\n// Engine\nexport { HapticEngine } from './engine';\nexport { AdaptiveEngine, FallbackManager, detectAdapter } from './engine';\n\n// Adapters\nexport { NoopAdapter, WebVibrationAdapter, IoSAudioAdapter } from './adapters';\n\n// Patterns\nexport { parseHPL, HPLParser, HPLParserError } from './patterns';\nexport { compile, optimizeSteps } from './patterns';\nexport { tokenize, HPLTokenizerError } from './patterns';\nexport { validateHPL } from './patterns';\nexport type { ValidationResult } from './patterns';\nexport {\n exportPattern,\n importPattern,\n patternToJSON,\n patternFromJSON,\n patternToDataURL,\n patternFromDataURL,\n} from './patterns';\nexport type { HapticPatternExport, ExportOptions } from './patterns';\n\n// Composer\nexport { PatternComposer } from './composer';\n\n// Presets\nexport { presets, ui, notifications, gaming, accessibility, system } from './presets';\n\n// Utils\nexport { detectPlatform } from './utils';\nexport type { PlatformInfo } from './utils';\n\n// ─── Default singleton ──────────────────────────────────────\n\nimport { HapticEngine } from './engine';\n\n/**\n * Pre-configured haptic engine singleton.\n * Import and use directly for quick haptic feedback:\n *\n * import { haptic } from '@hapticjs/core';\n * haptic.tap();\n * haptic.success();\n * haptic.play('~~..##..@@');\n */\nexport const haptic = HapticEngine.create();\n"]}
package/dist/index.d.cts CHANGED
@@ -304,6 +304,36 @@ declare class WebVibrationAdapter implements HapticAdapter {
304
304
  private _pwmVibrate;
305
305
  }
306
306
 
307
+ /**
308
+ * iOS Audio workaround adapter.
309
+ * Uses AudioContext to generate short, low-frequency oscillator tones (20-60 Hz)
310
+ * that create a subtle physical sensation through device speakers.
311
+ * This is a fallback for iOS Safari, which does not support the Vibration API.
312
+ */
313
+ declare class IoSAudioAdapter implements HapticAdapter {
314
+ readonly name = "ios-audio";
315
+ readonly supported: boolean;
316
+ private _audioCtx;
317
+ private _activeOscillator;
318
+ private _activeGain;
319
+ private _cancelled;
320
+ constructor();
321
+ capabilities(): AdapterCapabilities;
322
+ pulse(intensity: number, duration: number): Promise<void>;
323
+ playSequence(steps: HapticStep[]): Promise<void>;
324
+ cancel(): void;
325
+ dispose(): void;
326
+ private _detectSupport;
327
+ /** Get or create the AudioContext, resuming if suspended */
328
+ private _getAudioContext;
329
+ /** Map intensity (0-1) to frequency in the 20-60 Hz sub-bass range */
330
+ private _intensityToFrequency;
331
+ /** Play a single oscillator tone for the given duration */
332
+ private _playTone;
333
+ /** Immediately stop the active oscillator if any */
334
+ private _stopOscillator;
335
+ }
336
+
307
337
  declare class HPLParserError extends Error {
308
338
  constructor(message: string);
309
339
  }
@@ -357,6 +387,61 @@ interface ValidationResult {
357
387
  }
358
388
  declare function validateHPL(input: string): ValidationResult;
359
389
 
390
+ /** Portable JSON-serializable format for sharing haptic patterns */
391
+ interface HapticPatternExport {
392
+ version: 1;
393
+ name: string;
394
+ description?: string;
395
+ /** Original HPL string if pattern was created from HPL */
396
+ hpl?: string;
397
+ /** Compiled haptic steps */
398
+ steps: HapticStep[];
399
+ metadata?: {
400
+ /** Total duration in milliseconds */
401
+ duration: number;
402
+ author?: string;
403
+ tags?: string[];
404
+ /** ISO date string */
405
+ createdAt?: string;
406
+ };
407
+ }
408
+ /** Options for exporting a pattern */
409
+ interface ExportOptions {
410
+ name?: string;
411
+ description?: string;
412
+ author?: string;
413
+ tags?: string[];
414
+ }
415
+ /** Input types accepted by exportPattern */
416
+ type ExportInput = HapticPattern | HapticStep[] | string;
417
+ /**
418
+ * Export a haptic pattern as a portable JSON-serializable object.
419
+ *
420
+ * Accepts a HapticPattern, HapticStep[], or HPL string.
421
+ */
422
+ declare function exportPattern(input: ExportInput, options?: ExportOptions): HapticPatternExport;
423
+ /**
424
+ * Import a pattern from a HapticPatternExport object or JSON string.
425
+ * Validates the data and returns a HapticPattern.
426
+ */
427
+ declare function importPattern(data: HapticPatternExport | string): HapticPattern;
428
+ /**
429
+ * Serialize a pattern to a pretty-printed JSON string.
430
+ */
431
+ declare function patternToJSON(input: ExportInput, options?: ExportOptions): string;
432
+ /**
433
+ * Parse a JSON string into a HapticPattern.
434
+ */
435
+ declare function patternFromJSON(json: string): HapticPattern;
436
+ /**
437
+ * Encode a pattern as a data: URL for easy sharing via links.
438
+ */
439
+ declare function patternToDataURL(input: ExportInput, options?: ExportOptions): string;
440
+ /**
441
+ * Decode a data: URL back to a HapticPattern.
442
+ */
443
+ declare function patternFromDataURL(url: string): HapticPattern;
444
+
360
445
  /** Platform detection utilities */
361
446
  interface PlatformInfo {
362
447
  isWeb: boolean;
@@ -381,4 +466,4 @@ declare function detectPlatform(): PlatformInfo;
381
466
  */
382
467
  declare const haptic: HapticEngine;
383
468
 
384
- export { type AdapterCapabilities, AdaptiveEngine, type EasingFunction, type FallbackConfig, FallbackManager, type HPLNode, type HPLNodeType, HPLParser, HPLParserError, type HPLToken, type HPLTokenType, HPLTokenizerError, type HapticAdapter, type HapticConfig, HapticEngine, type HapticPattern, type HapticStep, type ImpactStyle, NoopAdapter, type NotificationType, PatternComposer, type PlatformInfo, type SemanticEffect, type ValidationResult, type VisualFallbackStyle, WebVibrationAdapter, compile, detectAdapter, detectPlatform, haptic, optimizeSteps, parseHPL, tokenize, validateHPL };
469
+ export { type AdapterCapabilities, AdaptiveEngine, type EasingFunction, type ExportOptions, type FallbackConfig, FallbackManager, type HPLNode, type HPLNodeType, HPLParser, HPLParserError, type HPLToken, type HPLTokenType, HPLTokenizerError, type HapticAdapter, type HapticConfig, HapticEngine, type HapticPattern, type HapticPatternExport, type HapticStep, type ImpactStyle, IoSAudioAdapter, NoopAdapter, type NotificationType, PatternComposer, type PlatformInfo, type SemanticEffect, type ValidationResult, type VisualFallbackStyle, WebVibrationAdapter, compile, detectAdapter, detectPlatform, exportPattern, haptic, importPattern, optimizeSteps, parseHPL, patternFromDataURL, patternFromJSON, patternToDataURL, patternToJSON, tokenize, validateHPL };