demoghost 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/demoghost.cjs +92 -0
- package/dist/demoghost.cjs.map +1 -0
- package/dist/demoghost.css +1 -0
- package/dist/demoghost.js +1855 -0
- package/dist/demoghost.js.map +1 -0
- package/dist/demoghost.min.js +92 -0
- package/dist/demoghost.min.js.map +1 -0
- package/dist/index.d.ts +745 -0
- package/package.json +66 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"demoghost.cjs","sources":["../../core/src/errors/index.ts","../../core/src/actions/ActionRegistry.ts","../../core/src/actions/handlers.ts","../../core/src/targeting/TargetResolver.ts","../../core/src/animation/bezier.ts","../../core/src/cursor/CursorEngine.ts","../../core/src/scroll/ScrollEngine.ts","../../core/src/spotlight/SpotlightEngine.ts","../../core/src/theme/theme.ts","../../core/src/accessibility/a11y.ts","../../core/src/events/EventEmitter.ts","../../core/src/engine/PlaybackController.ts","../../core/src/actions/creators.ts","../../core/src/index.ts","../../recorder/src/selector/SelectorGenerator.ts","../../recorder/src/privacy/PrivacyMasker.ts","../../recorder/src/capture/EventRecorder.ts","../../recorder/src/serialization/ScenarioSerializer.ts","../../recorder/src/index.ts","../../controls/src/index.ts","../src/index.ts"],"sourcesContent":["export class DemoGhostError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"DemoGhostError\";\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class DemoGhostTargetNotFoundError extends DemoGhostError {\n public readonly target: string;\n public readonly timeout: number;\n public readonly stepIndex?: number;\n\n constructor(target: string, timeout: number, stepIndex?: number) {\n const stepMsg = typeof stepIndex === \"number\" ? ` during step ${stepIndex + 1}` : \"\";\n super(`DemoGhost could not find target \"${target}\" within ${timeout}ms${stepMsg}.`);\n this.name = \"DemoGhostTargetNotFoundError\";\n this.target = target;\n this.timeout = timeout;\n this.stepIndex = stepIndex;\n }\n}\n\nexport class DemoGhostTimeoutError extends DemoGhostError {\n public readonly condition: string;\n public readonly timeout: number;\n\n constructor(condition: string, timeout: number) {\n super(`DemoGhost timed out waiting for ${condition} after ${timeout}ms.`);\n this.name = \"DemoGhostTimeoutError\";\n this.condition = condition;\n this.timeout = timeout;\n }\n}\n\nexport class DemoGhostPlaybackError extends DemoGhostError {\n public readonly stepIndex?: number;\n\n constructor(message: string, stepIndex?: number) {\n const stepMsg = typeof stepIndex === \"number\" ? ` at step ${stepIndex + 1}` : \"\";\n super(`Playback error${stepMsg}: ${message}`);\n this.name = \"DemoGhostPlaybackError\";\n this.stepIndex = stepIndex;\n }\n}\n\nexport class DemoGhostRecordingError extends DemoGhostError {\n constructor(message: string) {\n super(`Recording error: ${message}`);\n this.name = \"DemoGhostRecordingError\";\n }\n}\n\nexport class DemoGhostConfigurationError extends DemoGhostError {\n constructor(message: string) {\n super(`Configuration error: ${message}`);\n this.name = \"DemoGhostConfigurationError\";\n }\n}\n","import { ActionHandler, ActionExecutionContext, ActionType } from \"../types\";\nimport { DemoGhostPlaybackError } from \"../errors\";\n\nexport class ActionRegistry {\n private handlers = new Map<ActionType, ActionHandler>();\n\n public register(\n type: ActionType,\n handler: ActionHandler | ((context: ActionExecutionContext) => Promise<void>)\n ): void {\n if (typeof handler === \"function\") {\n this.handlers.set(type, { execute: handler });\n } else {\n this.handlers.set(type, handler);\n }\n }\n\n public get(type: ActionType): ActionHandler {\n const handler = this.handlers.get(type);\n if (!handler) {\n throw new DemoGhostPlaybackError(\n `Unknown action type \"${type}\". Did you forget to register it?`\n );\n }\n return handler;\n }\n\n public has(type: ActionType): boolean {\n return this.handlers.has(type);\n }\n}\n","import { ActionRegistry } from \"./ActionRegistry\";\nimport {\n ActionExecutionContext,\n MoveStep,\n ClickStep,\n DoubleClickStep,\n RightClickStep,\n TypeStep,\n ClearStep,\n FocusStep,\n BlurStep,\n WaitStep,\n ScrollStep,\n ScrollToStep,\n SelectStep,\n CheckStep,\n UncheckStep,\n HoverStep,\n PressStep,\n HighlightStep,\n CaptionStep,\n DragStep,\n TypingSpeed\n} from \"../types\";\nimport { DemoGhostTimeoutError } from \"../errors\";\n\nfunction getElementCenter(el: HTMLElement): { x: number; y: number } {\n const rect = el.getBoundingClientRect();\n return {\n x: Math.round(rect.left + rect.width / 2),\n y: Math.round(rect.top + rect.height / 2)\n };\n}\n\nfunction isInteractive(el: HTMLElement): boolean {\n const tag = el.tagName.toLowerCase();\n if (\n tag === \"button\" ||\n tag === \"a\" ||\n tag === \"input\" ||\n tag === \"select\" ||\n tag === \"textarea\"\n ) {\n return true;\n }\n const role = el.getAttribute(\"role\");\n if (role === \"button\" || role === \"link\" || role === \"checkbox\" || role === \"menuitem\") {\n return true;\n }\n return el.hasAttribute(\"onclick\") || window.getComputedStyle(el).cursor === \"pointer\";\n}\n\nfunction calculateKeystrokeDelay(speed: TypingSpeed = \"normal\", deterministic = false): number {\n if (typeof speed === \"number\") return speed;\n switch (speed) {\n case \"instant\":\n return 0;\n case \"fast\":\n return 30;\n case \"slow\":\n return 180;\n case \"human\": {\n if (deterministic) return 85;\n // Natural human variance: 40ms to 140ms\n return Math.floor(40 + Math.random() * 100);\n }\n case \"normal\":\n default:\n return 75;\n }\n}\n\nfunction setNativeProperty(\n element: HTMLElement,\n property: \"value\" | \"checked\",\n value: unknown\n): void {\n let prototype = Object.getPrototypeOf(element);\n while (prototype) {\n const descriptor = Object.getOwnPropertyDescriptor(prototype, property);\n if (descriptor?.set) {\n descriptor.set.call(element, value);\n return;\n }\n prototype = Object.getPrototypeOf(prototype);\n }\n (element as any)[property] = value;\n}\n\nfunction dispatchValueEvents(element: HTMLElement, includeChange = false): void {\n element.dispatchEvent(new Event(\"input\", { bubbles: true }));\n if (includeChange) element.dispatchEvent(new Event(\"change\", { bubbles: true }));\n}\n\nasync function waitForDuration(\n ctx: ActionExecutionContext,\n duration: number,\n scaleWithPlayback = true\n): Promise<void> {\n const playbackSpeed = scaleWithPlayback ? Math.max(0.1, Number(ctx.options.speed) || 1) : 1;\n let remaining = Math.max(0, duration / playbackSpeed);\n\n while (remaining > 0 && !ctx.signal.aborted) {\n await ctx.waitIfPaused();\n if (ctx.signal.aborted) return;\n\n const slice = Math.min(remaining, 50);\n const startedAt = performance.now();\n await new Promise<void>(resolve => {\n const onAbort = () => {\n clearTimeout(timer);\n resolve();\n };\n const timer = setTimeout(() => {\n ctx.signal.removeEventListener(\"abort\", onAbort);\n resolve();\n }, slice);\n ctx.signal.addEventListener(\"abort\", onAbort, { once: true });\n });\n remaining -= performance.now() - startedAt;\n }\n}\n\nexport function registerBuiltinActions(registry: ActionRegistry): void {\n // MOVE\n registry.register(\"move\", async (ctx: ActionExecutionContext) => {\n const step = ctx.step as MoveStep;\n const el = await ctx.targetResolver.resolve(step.target, ctx.stepIndex, ctx.signal);\n await ctx.scrollEngine.scrollIntoView(el);\n\n const targetPos = getElementCenter(el);\n ctx.cursor.setState(isInteractive(el) ? \"pointer\" : \"default\");\n await ctx.cursor.moveTo(\n targetPos.x,\n targetPos.y,\n (step.duration ?? 500) / Math.max(0.1, Number(ctx.options.speed) || 1)\n );\n });\n\n // CLICK\n registry.register(\"click\", async (ctx: ActionExecutionContext) => {\n const step = ctx.step as ClickStep;\n const el = await ctx.targetResolver.resolve(step.target, ctx.stepIndex, ctx.signal);\n await ctx.scrollEngine.scrollIntoView(el);\n\n const targetPos = getElementCenter(el);\n ctx.cursor.setState(isInteractive(el) ? \"pointer\" : \"default\");\n await ctx.cursor.moveTo(targetPos.x, targetPos.y, 450);\n if (ctx.signal.aborted) return;\n\n await ctx.cursor.click(step.button ?? \"left\");\n if (ctx.signal.aborted) return;\n\n // Dispatch DOM events\n el.dispatchEvent(\n new MouseEvent(\"mousedown\", { bubbles: true, cancelable: true, view: window })\n );\n el.dispatchEvent(new MouseEvent(\"mouseup\", { bubbles: true, cancelable: true, view: window }));\n if ((step.button ?? \"left\") === \"left\") {\n el.click();\n } else {\n el.dispatchEvent(\n new MouseEvent(\"click\", { bubbles: true, cancelable: true, view: window, button: 1 })\n );\n }\n\n if (typeof el.focus === \"function\") {\n el.focus();\n }\n });\n\n // DOUBLE CLICK\n registry.register(\"doubleClick\", async (ctx: ActionExecutionContext) => {\n const step = ctx.step as DoubleClickStep;\n const el = await ctx.targetResolver.resolve(step.target, ctx.stepIndex, ctx.signal);\n await ctx.scrollEngine.scrollIntoView(el);\n\n const targetPos = getElementCenter(el);\n ctx.cursor.setState(isInteractive(el) ? \"pointer\" : \"default\");\n await ctx.cursor.moveTo(targetPos.x, targetPos.y, 450);\n\n await ctx.cursor.doubleClick();\n if (ctx.signal.aborted) return;\n el.click();\n el.click();\n el.dispatchEvent(new MouseEvent(\"dblclick\", { bubbles: true, cancelable: true, view: window }));\n });\n\n // RIGHT CLICK\n registry.register(\"rightClick\", async (ctx: ActionExecutionContext) => {\n const step = ctx.step as RightClickStep;\n const el = await ctx.targetResolver.resolve(step.target, ctx.stepIndex, ctx.signal);\n await ctx.scrollEngine.scrollIntoView(el);\n\n const targetPos = getElementCenter(el);\n await ctx.cursor.moveTo(targetPos.x, targetPos.y, 450);\n await ctx.cursor.click(\"right\");\n if (ctx.signal.aborted) return;\n\n el.dispatchEvent(\n new MouseEvent(\"contextmenu\", { bubbles: true, cancelable: true, view: window })\n );\n });\n\n // TYPE\n registry.register(\"type\", async (ctx: ActionExecutionContext) => {\n const step = ctx.step as TypeStep;\n const el = await ctx.targetResolver.resolve(step.target, ctx.stepIndex, ctx.signal);\n await ctx.scrollEngine.scrollIntoView(el);\n\n const targetPos = getElementCenter(el);\n ctx.cursor.setState(\"text\");\n await ctx.cursor.moveTo(targetPos.x, targetPos.y, 450);\n await ctx.cursor.click();\n if (ctx.signal.aborted) return;\n\n if (typeof el.focus === \"function\") {\n el.focus();\n }\n\n const inputEl = el as HTMLInputElement | HTMLTextAreaElement;\n if (step.clearFirst && \"value\" in inputEl) {\n setNativeProperty(inputEl, \"value\", \"\");\n dispatchValueEvents(inputEl);\n }\n\n const text = String(step.value || \"\");\n const speed = step.speed ?? ctx.options.typingSpeed ?? \"human\";\n const deterministic = ctx.options.deterministic ?? false;\n\n for (let i = 0; i < text.length; i++) {\n await ctx.waitIfPaused();\n if (ctx.signal.aborted) return;\n const char = text[i];\n\n el.dispatchEvent(new KeyboardEvent(\"keydown\", { key: char, bubbles: true }));\n el.dispatchEvent(new KeyboardEvent(\"keypress\", { key: char, bubbles: true }));\n\n if (\"value\" in inputEl) {\n setNativeProperty(inputEl, \"value\", inputEl.value + char);\n dispatchValueEvents(inputEl);\n }\n\n el.dispatchEvent(new KeyboardEvent(\"keyup\", { key: char, bubbles: true }));\n\n const delay = calculateKeystrokeDelay(speed as TypingSpeed, deterministic);\n if (delay > 0) {\n await waitForDuration(ctx, delay);\n }\n }\n\n if (\"value\" in inputEl) {\n inputEl.dispatchEvent(new Event(\"change\", { bubbles: true }));\n }\n });\n\n // CLEAR\n registry.register(\"clear\", async (ctx: ActionExecutionContext) => {\n const step = ctx.step as ClearStep;\n const el = await ctx.targetResolver.resolve(step.target, ctx.stepIndex, ctx.signal);\n const inputEl = el as HTMLInputElement | HTMLTextAreaElement;\n\n if (\"value\" in inputEl) {\n setNativeProperty(inputEl, \"value\", \"\");\n dispatchValueEvents(inputEl, true);\n }\n });\n\n // FOCUS\n registry.register(\"focus\", async (ctx: ActionExecutionContext) => {\n const step = ctx.step as FocusStep;\n const el = await ctx.targetResolver.resolve(step.target, ctx.stepIndex, ctx.signal);\n await ctx.scrollEngine.scrollIntoView(el);\n if (typeof el.focus === \"function\") {\n el.focus();\n }\n });\n\n // BLUR\n registry.register(\"blur\", async (ctx: ActionExecutionContext) => {\n const step = ctx.step as BlurStep;\n const el = await ctx.targetResolver.resolve(step.target, ctx.stepIndex, ctx.signal);\n if (typeof el.blur === \"function\") {\n el.blur();\n }\n });\n\n // WAIT\n registry.register(\"wait\", async (ctx: ActionExecutionContext) => {\n const step = ctx.step as WaitStep;\n\n if (step.duration) {\n await waitForDuration(ctx, step.duration);\n return;\n }\n\n if (typeof step.condition === \"function\") {\n const timeout = step.timeout ?? 5000;\n const start = Date.now();\n while (Date.now() - start < timeout) {\n await ctx.waitIfPaused();\n if (ctx.signal.aborted) return;\n const res = await step.condition();\n if (res) return;\n await waitForDuration(ctx, 50, false);\n }\n throw new DemoGhostTimeoutError(\"custom condition\", timeout);\n }\n\n if (step.selector) {\n const timeout = step.timeout ?? 5000;\n const state = step.state ?? \"visible\";\n const start = Date.now();\n\n while (Date.now() - start < timeout) {\n await ctx.waitIfPaused();\n if (ctx.signal.aborted) return;\n const el = await ctx.targetResolver.resolveOptional(step.selector, ctx.signal);\n if (state === \"attached\" && el) return;\n if (state === \"detached\" && !el) return;\n if (state === \"visible\" && el) {\n const rect = el.getBoundingClientRect();\n if (rect.width > 0 && rect.height > 0) return;\n }\n if (state === \"hidden\" && (!el || el.offsetParent === null)) return;\n await waitForDuration(ctx, 50, false);\n }\n throw new DemoGhostTimeoutError(`selector \"${step.selector}\" state \"${state}\"`, timeout);\n }\n });\n\n // SCROLL\n registry.register(\"scroll\", async (ctx: ActionExecutionContext) => {\n const step = ctx.step as ScrollStep;\n if (step.target) {\n const el = await ctx.targetResolver.resolve(step.target, ctx.stepIndex, ctx.signal);\n await ctx.scrollEngine.scrollIntoView(el, step.offset);\n } else if (typeof step.x === \"number\" || typeof step.y === \"number\") {\n const x = step.x ?? window.scrollX;\n const y = step.y ?? window.scrollY;\n await ctx.scrollEngine.scrollTo(x, y, step.behavior ?? \"smooth\");\n }\n });\n\n // SCROLL TO\n registry.register(\"scrollTo\", async (ctx: ActionExecutionContext) => {\n const step = ctx.step as ScrollToStep;\n await ctx.scrollEngine.scrollTo(step.x, step.y, step.behavior ?? \"smooth\");\n });\n\n // SELECT\n registry.register(\"select\", async (ctx: ActionExecutionContext) => {\n const step = ctx.step as SelectStep;\n const el = (await ctx.targetResolver.resolve(\n step.target,\n ctx.stepIndex,\n ctx.signal\n )) as HTMLSelectElement;\n await ctx.scrollEngine.scrollIntoView(el);\n\n const targetPos = getElementCenter(el);\n await ctx.cursor.moveTo(targetPos.x, targetPos.y, 400);\n await ctx.cursor.click();\n\n if (el instanceof HTMLSelectElement) {\n const values = new Set(Array.isArray(step.value) ? step.value : [step.value]);\n if (el.multiple) {\n for (const option of Array.from(el.options)) option.selected = values.has(option.value);\n } else {\n setNativeProperty(el, \"value\", String(step.value));\n }\n dispatchValueEvents(el, true);\n }\n });\n\n // CHECK\n registry.register(\"check\", async (ctx: ActionExecutionContext) => {\n const step = ctx.step as CheckStep;\n const el = (await ctx.targetResolver.resolve(\n step.target,\n ctx.stepIndex,\n ctx.signal\n )) as HTMLInputElement;\n await ctx.scrollEngine.scrollIntoView(el);\n\n const targetPos = getElementCenter(el);\n await ctx.cursor.moveTo(targetPos.x, targetPos.y, 400);\n await ctx.cursor.click();\n\n if (\"checked\" in el && !el.checked) {\n el.click();\n if (!el.checked) {\n setNativeProperty(el, \"checked\", true);\n dispatchValueEvents(el, true);\n }\n }\n });\n\n // UNCHECK\n registry.register(\"uncheck\", async (ctx: ActionExecutionContext) => {\n const step = ctx.step as UncheckStep;\n const el = (await ctx.targetResolver.resolve(\n step.target,\n ctx.stepIndex,\n ctx.signal\n )) as HTMLInputElement;\n await ctx.scrollEngine.scrollIntoView(el);\n\n const targetPos = getElementCenter(el);\n await ctx.cursor.moveTo(targetPos.x, targetPos.y, 400);\n await ctx.cursor.click();\n\n if (\"checked\" in el && el.checked) {\n el.click();\n if (el.checked) {\n setNativeProperty(el, \"checked\", false);\n dispatchValueEvents(el, true);\n }\n }\n });\n\n // HOVER\n registry.register(\"hover\", async (ctx: ActionExecutionContext) => {\n const step = ctx.step as HoverStep;\n const el = await ctx.targetResolver.resolve(step.target, ctx.stepIndex, ctx.signal);\n await ctx.scrollEngine.scrollIntoView(el);\n\n const targetPos = getElementCenter(el);\n ctx.cursor.setState(isInteractive(el) ? \"pointer\" : \"default\");\n await ctx.cursor.moveTo(targetPos.x, targetPos.y, 450);\n\n el.dispatchEvent(\n new MouseEvent(\"mouseenter\", { bubbles: true, cancelable: true, view: window })\n );\n el.dispatchEvent(\n new MouseEvent(\"mouseover\", { bubbles: true, cancelable: true, view: window })\n );\n\n if (step.duration && step.duration > 0) {\n await waitForDuration(ctx, step.duration);\n }\n });\n\n // PRESS\n registry.register(\"press\", async (ctx: ActionExecutionContext) => {\n const step = ctx.step as PressStep;\n let el = document.activeElement as HTMLElement;\n if (step.target) {\n el = await ctx.targetResolver.resolve(step.target, ctx.stepIndex, ctx.signal);\n if (typeof el.focus === \"function\") el.focus();\n }\n const targetEl = el || document.body;\n targetEl.dispatchEvent(new KeyboardEvent(\"keydown\", { key: step.key, bubbles: true }));\n targetEl.dispatchEvent(new KeyboardEvent(\"keypress\", { key: step.key, bubbles: true }));\n targetEl.dispatchEvent(new KeyboardEvent(\"keyup\", { key: step.key, bubbles: true }));\n });\n\n // HIGHLIGHT\n registry.register(\"highlight\", async (ctx: ActionExecutionContext) => {\n const step = ctx.step as HighlightStep;\n const el = await ctx.targetResolver.resolve(step.target, ctx.stepIndex, ctx.signal);\n await ctx.scrollEngine.scrollIntoView(el);\n\n await ctx.spotlightEngine.highlight(el, {\n duration: step.duration ?? 1000,\n style: step.style ?? \"glow\"\n });\n });\n\n // CAPTION\n registry.register(\"caption\", async (ctx: ActionExecutionContext) => {\n const step = ctx.step as CaptionStep;\n let targetEl: HTMLElement | undefined;\n if (step.target) {\n targetEl = (await ctx.targetResolver.resolveOptional(step.target, ctx.signal)) || undefined;\n }\n ctx.spotlightEngine.showCaption(step.options, targetEl);\n if (step.options.duration) {\n await waitForDuration(ctx, step.options.duration);\n ctx.spotlightEngine.hideCaption();\n }\n });\n\n // DRAG\n registry.register(\"drag\", async (ctx: ActionExecutionContext) => {\n const step = ctx.step as DragStep;\n const sourceEl = await ctx.targetResolver.resolve(step.source, ctx.stepIndex, ctx.signal);\n const targetEl = await ctx.targetResolver.resolve(step.target, ctx.stepIndex, ctx.signal);\n\n await ctx.scrollEngine.scrollIntoView(sourceEl);\n const sourcePos = getElementCenter(sourceEl);\n const targetPos = getElementCenter(targetEl);\n\n await ctx.cursor.moveTo(sourcePos.x, sourcePos.y, 400);\n ctx.cursor.setState(\"active\");\n await ctx.cursor.click();\n\n sourceEl.dispatchEvent(\n new MouseEvent(\"mousedown\", { bubbles: true, clientX: sourcePos.x, clientY: sourcePos.y })\n );\n sourceEl.dispatchEvent(\n new DragEvent(\"dragstart\", { bubbles: true, clientX: sourcePos.x, clientY: sourcePos.y })\n );\n\n await ctx.cursor.moveTo(targetPos.x, targetPos.y, step.duration ?? 700);\n\n targetEl.dispatchEvent(\n new DragEvent(\"dragover\", { bubbles: true, clientX: targetPos.x, clientY: targetPos.y })\n );\n targetEl.dispatchEvent(\n new DragEvent(\"drop\", { bubbles: true, clientX: targetPos.x, clientY: targetPos.y })\n );\n targetEl.dispatchEvent(\n new MouseEvent(\"mouseup\", { bubbles: true, clientX: targetPos.x, clientY: targetPos.y })\n );\n ctx.cursor.setState(\"default\");\n });\n}\n","import { DemoTarget, TargetResolverInterface, TargetOptions } from \"../types\";\nimport { DemoGhostTargetNotFoundError } from \"../errors\";\n\nexport class TargetResolver implements TargetResolverInterface {\n private defaultTimeout: number;\n\n constructor(defaultTimeout = 5000) {\n this.defaultTimeout = defaultTimeout;\n }\n\n public async resolve(\n target: DemoTarget,\n stepIndex?: number,\n signal?: AbortSignal\n ): Promise<HTMLElement> {\n const el = await this.find(target, undefined, signal);\n if (el) return el;\n if (signal?.aborted) {\n throw new DOMException(\"Playback stopped\", \"AbortError\");\n }\n\n const norm = this.normalizeTarget(target);\n const selector = norm.selector;\n const timeout = norm.timeout;\n throw new DemoGhostTargetNotFoundError(\n typeof selector === \"string\" ? selector : \"<HTMLElement>\",\n timeout,\n stepIndex\n );\n }\n\n public async resolveOptional(\n target: DemoTarget,\n signal?: AbortSignal\n ): Promise<HTMLElement | null> {\n try {\n return await this.find(target, 100, signal);\n } catch {\n return null;\n }\n }\n\n private normalizeTarget(target: DemoTarget): {\n selector: string | HTMLElement;\n timeout: number;\n offset?: { x?: number; y?: number };\n } {\n if (\n typeof target === \"string\" ||\n (typeof HTMLElement !== \"undefined\" && target instanceof HTMLElement)\n ) {\n return { selector: target, timeout: this.defaultTimeout };\n }\n const opts = target as TargetOptions;\n return {\n selector: opts.selector,\n timeout: opts.waitForTarget ?? opts.timeout ?? this.defaultTimeout,\n offset: opts.offset\n };\n }\n\n private async find(\n target: DemoTarget,\n customTimeout?: number,\n signal?: AbortSignal\n ): Promise<HTMLElement | null> {\n if (typeof window === \"undefined\" || !document) return null;\n\n const norm = this.normalizeTarget(target);\n const selector = norm.selector;\n const targetTimeout = norm.timeout;\n const timeout = customTimeout !== undefined ? customTimeout : targetTimeout;\n\n if (typeof HTMLElement !== \"undefined\" && selector instanceof HTMLElement) {\n return selector;\n }\n\n if (typeof selector !== \"string\") {\n return null;\n }\n\n const query = selector.trim();\n\n // Fast check: direct DOM query\n const direct = this.querySingle(query);\n if (direct) return direct;\n\n if (timeout <= 0 || signal?.aborted) return null;\n\n // Async waiting using MutationObserver with RAF fallback\n return new Promise<HTMLElement | null>(resolve => {\n let resolved = false;\n let timer: any = null;\n let observer: MutationObserver | null = null;\n let frame: number | null = null;\n\n const cleanup = () => {\n resolved = true;\n if (timer) clearTimeout(timer);\n if (observer) {\n observer.disconnect();\n observer = null;\n }\n if (frame !== null && typeof cancelAnimationFrame !== \"undefined\") {\n cancelAnimationFrame(frame);\n frame = null;\n }\n signal?.removeEventListener(\"abort\", onAbort);\n };\n\n const onAbort = () => {\n cleanup();\n resolve(null);\n };\n\n const check = () => {\n if (resolved) return;\n const match = this.querySingle(query);\n if (match) {\n cleanup();\n resolve(match);\n }\n };\n\n timer = setTimeout(() => {\n cleanup();\n resolve(null);\n }, timeout);\n\n if (typeof MutationObserver !== \"undefined\") {\n observer = new MutationObserver(() => {\n check();\n });\n observer.observe(document.body || document.documentElement, {\n childList: true,\n subtree: true,\n attributes: true\n });\n }\n\n // Check once more in next animation frame\n if (typeof requestAnimationFrame !== \"undefined\") {\n frame = requestAnimationFrame(check);\n }\n\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n });\n }\n\n public querySingle(selector: string): HTMLElement | null {\n if (\n selector.includes(\":has-text(\") ||\n selector.includes(\":contains(\") ||\n selector.startsWith(\"text=\")\n ) {\n return this.queryByText(selector);\n }\n\n try {\n // Check for exact data-demoghost-id shorthand or attribute\n if (selector.startsWith(\"@\")) {\n const id = selector.slice(1);\n const match = document.querySelector<HTMLElement>(\n `[data-demoghost-id=\"${CSS.escape(id)}\"]`\n );\n if (match) return match;\n }\n\n // Standard CSS query\n const match = document.querySelector<HTMLElement>(selector);\n if (match) return match;\n\n // Fallback: Shadow DOM pierce traversal\n const shadowMatch = this.pierceShadow(document.body, selector);\n if (shadowMatch) return shadowMatch;\n } catch {\n // Fallback if selector has custom non-standard syntax\n if (selector.includes(\":contains(\") || selector.includes(\":has-text(\")) {\n return this.queryByText(selector);\n }\n }\n return null;\n }\n\n private queryByText(selector: string): HTMLElement | null {\n let baseSelector = \"*\";\n let text = \"\";\n let isExact = false;\n\n if (selector.startsWith(\"text=\")) {\n text = selector.slice(5).trim();\n if (\n (text.startsWith('\"') && text.endsWith('\"')) ||\n (text.startsWith(\"'\") && text.endsWith(\"'\"))\n ) {\n text = text.slice(1, -1);\n isExact = true;\n }\n } else {\n const match = selector.match(/^(.*?):(has-text|contains)\\(\\s*([\"']?)(.*?)\\3\\s*\\)$/i);\n if (!match) return null;\n baseSelector = match[1].trim() || \"*\";\n const mode = match[2].toLowerCase();\n text = match[4].replace(/\\\\([\\\\\"'])/g, \"$1\").trim();\n isExact = mode === \"contains\";\n }\n\n if (!text) return null;\n const lowerText = text.toLowerCase();\n\n try {\n const candidates = Array.from(document.querySelectorAll<HTMLElement>(baseSelector));\n const matching: HTMLElement[] = [];\n\n for (const el of candidates) {\n const content = (el.textContent || \"\").trim();\n if (isExact) {\n if (content.toLowerCase() === lowerText) {\n matching.push(el);\n }\n } else {\n if (content.toLowerCase().includes(lowerText)) {\n matching.push(el);\n }\n }\n }\n\n if (matching.length === 0) return null;\n\n // Crucial: Select the leaf-most (deepest) matching element in the DOM tree\n matching.sort((a, b) => {\n if (a.contains(b)) return 1; // b is a descendant of a, so b is deeper\n if (b.contains(a)) return -1; // a is a descendant of b, so a is deeper\n return 0;\n });\n\n return matching[0] || null;\n } catch {\n return null;\n }\n }\n\n private pierceShadow(root: ParentNode | null, selector: string): HTMLElement | null {\n if (!root) return null;\n\n try {\n const match = root.querySelector<HTMLElement>(selector);\n if (match) return match;\n } catch {\n // ignore\n }\n\n const children = Array.from(root.children || []);\n for (const child of children) {\n if ((child as HTMLElement).shadowRoot) {\n const found = this.pierceShadow((child as HTMLElement).shadowRoot, selector);\n if (found) return found;\n }\n const foundInChild = this.pierceShadow(child, selector);\n if (foundInChild) return foundInChild;\n }\n\n return null;\n }\n}\n","export interface Point {\n x: number;\n y: number;\n}\n\nexport type EasingFunction = (t: number) => number;\n\n/**\n * Standard cubic easing (ease-in-out)\n */\nexport const easeInOutCubic: EasingFunction = (t: number): number => {\n return t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) / 2;\n};\n\n/**\n * Natural human acceleration and deceleration curve with subtle smooth plateau\n */\nexport const naturalHumanEase: EasingFunction = (t: number): number => {\n // Modified smootherstep\n return t * t * t * (t * (t * 6 - 15) + 10);\n};\n\nexport const linearEase: EasingFunction = (t: number): number => t;\n\n/**\n * Evaluates a cubic bezier curve at parameter t (0 <= t <= 1)\n */\nexport function cubicBezierPoint(p0: Point, p1: Point, p2: Point, p3: Point, t: number): Point {\n const u = 1 - t;\n const tt = t * t;\n const uu = u * u;\n const uuu = uu * u;\n const ttt = tt * t;\n\n return {\n x: uuu * p0.x + 3 * uu * t * p1.x + 3 * u * tt * p2.x + ttt * p3.x,\n y: uuu * p0.y + 3 * uu * t * p1.y + 3 * u * tt * p2.y + ttt * p3.y\n };\n}\n\n/**\n * Generates natural human-like control points for a smooth curved trajectory between start and end.\n */\nexport function generateNaturalTrajectory(\n start: Point,\n end: Point,\n deterministic = false\n): [Point, Point] {\n const dx = end.x - start.x;\n const dy = end.y - start.y;\n const dist = Math.hypot(dx, dy);\n\n if (dist < 10) {\n return [\n { x: start.x + dx * 0.3, y: start.y + dy * 0.3 },\n { x: start.x + dx * 0.7, y: start.y + dy * 0.7 }\n ];\n }\n\n // Calculate perpendicular normal\n const nx = -dy / dist;\n const ny = dx / dist;\n\n // Curvature intensity scales with distance, up to a natural limit\n const maxArc = Math.min(dist * 0.25, 80);\n const factor = deterministic ? 0.6 : 0.4 + Math.random() * 0.6;\n // Slight random or alternating direction\n const direction = deterministic ? 1 : Math.random() > 0.5 ? 1 : -1;\n\n const arc1 = maxArc * factor * direction;\n const arc2 = maxArc * (factor * 0.7) * direction;\n\n const cp1: Point = {\n x: start.x + dx * 0.25 + nx * arc1,\n y: start.y + dy * 0.25 + ny * arc1\n };\n\n const cp2: Point = {\n x: start.x + dx * 0.75 + nx * arc2,\n y: start.y + dy * 0.75 + ny * arc2\n };\n\n return [cp1, cp2];\n}\n","import { CursorEngineInterface, CursorConfig, PointerMode } from \"../types\";\nimport {\n Point,\n cubicBezierPoint,\n generateNaturalTrajectory,\n naturalHumanEase\n} from \"../animation/bezier\";\n\nexport class CursorEngine implements CursorEngineInterface {\n private element: HTMLElement | null = null;\n private pointerMode: PointerMode;\n private config: CursorConfig;\n private position: Point = { x: 100, y: 100 };\n private activeAnimation: number | null = null;\n private activeAnimationResolve: (() => void) | null = null;\n private pendingTimers = new Map<ReturnType<typeof setTimeout>, () => void>();\n private ripples = new Set<HTMLElement>();\n private container: HTMLElement;\n private deterministic: boolean;\n private prefersReducedMotion = false;\n\n constructor(\n options: {\n pointerMode?: PointerMode;\n cursor?: CursorConfig;\n container?: HTMLElement;\n deterministic?: boolean;\n } = {}\n ) {\n this.pointerMode = options.pointerMode ?? \"cursor\";\n this.config = options.cursor ?? { style: \"classic\" };\n this.container =\n options.container ?? (typeof document !== \"undefined\" ? document.body : (null as any));\n this.deterministic = options.deterministic ?? false;\n\n if (typeof window !== \"undefined\" && window.matchMedia) {\n this.prefersReducedMotion = window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n }\n\n this.mount();\n }\n\n private mount(): void {\n if (typeof document === \"undefined\" || !this.container) return;\n\n this.element = document.createElement(\"div\");\n this.element.className = `dg-cursor dg-cursor--${this.pointerMode}`;\n this.element.setAttribute(\"aria-hidden\", \"true\");\n this.element.style.transform = `translate3d(${this.position.x}px, ${this.position.y}px, 0)`;\n\n this.renderCursorGraphic();\n this.container.appendChild(this.element);\n }\n\n private renderCursorGraphic(): void {\n if (!this.element) return;\n\n if (this.config.customElement) {\n this.element.innerHTML = \"\";\n this.element.appendChild(this.config.customElement.cloneNode(true));\n return;\n }\n\n if (this.config.customSvg) {\n this.element.innerHTML = this.config.customSvg;\n return;\n }\n\n if (this.pointerMode === \"touch\") {\n this.element.innerHTML = `\n <div class=\"dg-touch-orb\">\n <div class=\"dg-touch-inner\"></div>\n </div>\n `;\n return;\n }\n\n // Default desktop cursor styles\n const style = this.config.style ?? \"classic\";\n switch (style) {\n case \"dot\":\n this.element.innerHTML = `<div class=\"dg-cursor-dot\"></div>`;\n break;\n case \"minimal\":\n this.element.innerHTML = `\n <svg class=\"dg-cursor-svg dg-cursor-minimal\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\">\n <circle cx=\"12\" cy=\"12\" r=\"6\" fill=\"var(--demoghost-accent, #6366f1)\" />\n <circle cx=\"12\" cy=\"12\" r=\"9\" stroke=\"white\" stroke-width=\"2\" />\n </svg>\n `;\n break;\n case \"pointer\":\n this.element.innerHTML = `\n <svg class=\"dg-cursor-svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\">\n <path d=\"M7 11V4a2 2 0 0 1 4 0v5M11 9V6a2 2 0 0 1 4 0v3M15 9V7a2 2 0 0 1 4 0v7a6 6 0 0 1-6 6H9a6 6 0 0 1-6-6v-3a2 2 0 0 1 4 0v2\" fill=\"var(--demoghost-cursor, #0f172a)\" stroke=\"white\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n `;\n break;\n case \"classic\":\n this.element.innerHTML = `\n <svg class=\"dg-cursor-svg\" width=\"26\" height=\"26\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path d=\"M5.5 3.21V20.8c0 .45.54.67.85.35l4.86-4.86a.5.5 0 0 1 .35-.15h6.87c.45 0 .67-.54.35-.85L6.35 2.86a.5.5 0 0 0-.85.35Z\" \n fill=\"var(--demoghost-cursor, #0f172a)\" \n stroke=\"white\" \n stroke-width=\"1.5\" \n stroke-linejoin=\"round\"/>\n </svg>\n `;\n break;\n default:\n this.element.innerHTML = `\n <svg class=\"dg-cursor-svg\" width=\"26\" height=\"26\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path d=\"M5.5 3.21V20.8c0 .45.54.67.85.35l4.86-4.86a.5.5 0 0 1 .35-.15h6.87c.45 0 .67-.54.35-.85L6.35 2.86a.5.5 0 0 0-.85.35Z\" \n fill=\"var(--demoghost-cursor, #0f172a)\" \n stroke=\"white\" \n stroke-width=\"1.5\" \n stroke-linejoin=\"round\"/>\n </svg>\n `;\n break;\n }\n }\n\n public async moveTo(x: number, y: number, duration = 600): Promise<void> {\n this.finishActiveAnimation();\n\n const start = { ...this.position };\n const end = { x, y };\n\n if (this.prefersReducedMotion || duration <= 0) {\n this.updatePosition(end);\n return;\n }\n\n const trajectory = generateNaturalTrajectory(start, end, this.deterministic);\n const cp1 = trajectory[0];\n const cp2 = trajectory[1];\n\n return new Promise<void>(resolve => {\n this.activeAnimationResolve = resolve;\n const startTime = performance.now();\n\n const step = (now: number) => {\n const elapsed = now - startTime;\n const progress = Math.min(elapsed / duration, 1);\n const t = naturalHumanEase(progress);\n\n const currentPoint = cubicBezierPoint(start, cp1, cp2, end, t);\n this.updatePosition(currentPoint);\n\n if (progress < 1) {\n this.activeAnimation = requestAnimationFrame(step);\n } else {\n this.updatePosition(end);\n this.activeAnimation = null;\n this.activeAnimationResolve = null;\n resolve();\n }\n };\n\n this.activeAnimation = requestAnimationFrame(step);\n });\n }\n\n public async click(_button = \"left\"): Promise<void> {\n if (!this.element) return;\n\n this.element.classList.add(\"dg-cursor--active\");\n this.createRipple();\n\n await this.wait(120);\n if (this.element) {\n this.element.classList.remove(\"dg-cursor--active\");\n }\n }\n\n public async doubleClick(): Promise<void> {\n await this.click();\n await this.wait(80);\n await this.click();\n }\n\n private createRipple(): void {\n if (typeof document === \"undefined\" || !this.container) return;\n\n const ripple = document.createElement(\"div\");\n ripple.className = \"dg-click-ripple\";\n ripple.style.left = `${this.position.x}px`;\n ripple.style.top = `${this.position.y}px`;\n this.container.appendChild(ripple);\n this.ripples.add(ripple);\n\n this.schedule(600, () => this.removeRipple(ripple));\n }\n\n private wait(duration: number): Promise<void> {\n return new Promise(resolve => this.schedule(duration, resolve));\n }\n\n private schedule(duration: number, callback: () => void): void {\n const timer = setTimeout(() => {\n this.pendingTimers.delete(timer);\n callback();\n }, duration);\n this.pendingTimers.set(timer, callback);\n }\n\n private removeRipple(ripple: HTMLElement): void {\n ripple.remove();\n this.ripples.delete(ripple);\n }\n\n private finishActiveAnimation(): void {\n if (this.activeAnimation !== null) {\n cancelAnimationFrame(this.activeAnimation);\n this.activeAnimation = null;\n }\n if (this.activeAnimationResolve) {\n const resolve = this.activeAnimationResolve;\n this.activeAnimationResolve = null;\n resolve();\n }\n }\n\n public show(): void {\n if (this.element) {\n this.element.style.opacity = \"1\";\n this.element.style.pointerEvents = \"none\";\n }\n }\n\n public hide(): void {\n if (this.element) {\n this.element.style.opacity = \"0\";\n }\n }\n\n public setState(state: \"default\" | \"pointer\" | \"text\" | \"active\" | \"hidden\"): void {\n if (!this.element) return;\n this.element.classList.remove(\n \"dg-state-pointer\",\n \"dg-state-text\",\n \"dg-state-active\",\n \"dg-state-hidden\"\n );\n if (state !== \"default\") {\n this.element.classList.add(`dg-state-${state}`);\n }\n }\n\n public getPosition(): Point {\n return { ...this.position };\n }\n\n private updatePosition(pt: Point): void {\n this.position = pt;\n if (this.element) {\n this.element.style.transform = `translate3d(${pt.x}px, ${pt.y}px, 0)`;\n }\n }\n\n public destroy(): void {\n this.finishActiveAnimation();\n this.pendingTimers.forEach((callback, timer) => {\n clearTimeout(timer);\n callback();\n });\n this.pendingTimers.clear();\n for (const ripple of this.ripples) this.removeRipple(ripple);\n this.ripples.clear();\n if (this.element && this.element.parentNode) {\n this.element.parentNode.removeChild(this.element);\n this.element = null;\n }\n }\n}\n","import { ScrollEngineInterface, ScrollConfig } from \"../types\";\n\nexport class ScrollEngine implements ScrollEngineInterface {\n private config: ScrollConfig;\n private activeScroll: { interval: ReturnType<typeof setInterval>; resolve: () => void } | null =\n null;\n\n constructor(config: ScrollConfig = {}) {\n this.config = {\n behavior: \"smooth\",\n offset: 80,\n ...config\n };\n }\n\n public async scrollIntoView(element: HTMLElement, customOffset?: number): Promise<void> {\n if (typeof window === \"undefined\") return;\n\n const offset = customOffset ?? this.config.offset ?? 80;\n const rect = element.getBoundingClientRect();\n const windowHeight = window.innerHeight || document.documentElement.clientHeight;\n const windowWidth = window.innerWidth || document.documentElement.clientWidth;\n\n // Check if element is already comfortably visible\n const isVisibleY = rect.top >= offset && rect.bottom <= windowHeight - 20;\n const isVisibleX = rect.left >= 0 && rect.right <= windowWidth;\n\n if (isVisibleY && isVisibleX) {\n return;\n }\n\n const currentScrollY = window.scrollY || window.pageYOffset;\n const targetY = Math.max(0, currentScrollY + rect.top - offset);\n\n await this.scrollTo(window.scrollX || window.pageXOffset, targetY, this.config.behavior);\n }\n\n public async scrollTo(x: number, y: number, behavior: ScrollBehavior = \"smooth\"): Promise<void> {\n if (typeof window === \"undefined\") return;\n\n if (behavior === \"instant\") {\n window.scrollTo(x, y);\n return;\n }\n\n this.finishActiveScroll();\n\n // Measure start and wait for smooth scroll to finish or timeout\n const startY = window.scrollY;\n const startX = window.scrollX;\n const diff = Math.hypot(x - startX, y - startY);\n\n if (diff < 5) return;\n\n window.scrollTo({ left: x, top: y, behavior: \"smooth\" });\n\n // Wait until scrolling stops\n return new Promise<void>(resolve => {\n let lastY = window.scrollY;\n let lastX = window.scrollX;\n let checkCount = 0;\n const maxChecks = 25; // max ~500ms\n\n const interval = setInterval(() => {\n const currY = window.scrollY;\n const currX = window.scrollX;\n checkCount++;\n\n // If scroll position hasn't changed or reached target or max checks\n if ((currY === lastY && currX === lastX && checkCount > 2) || checkCount >= maxChecks) {\n this.finishActiveScroll();\n } else {\n lastY = currY;\n lastX = currX;\n }\n }, 30);\n this.activeScroll = { interval, resolve };\n });\n }\n\n private finishActiveScroll(): void {\n if (!this.activeScroll) return;\n clearInterval(this.activeScroll.interval);\n const resolve = this.activeScroll.resolve;\n this.activeScroll = null;\n resolve();\n }\n\n public destroy(): void {\n this.finishActiveScroll();\n }\n}\n","import { SpotlightEngineInterface, CaptionOptions } from \"../types\";\n\nexport class SpotlightEngine implements SpotlightEngineInterface {\n private container: HTMLElement;\n private overlayEl: HTMLElement | null = null;\n private captionEl: HTMLElement | null = null;\n private activeElement: HTMLElement | null = null;\n private activeStyle: string | null = null;\n private activeTimer: ReturnType<typeof setTimeout> | null = null;\n private activeTimerResolve: (() => void) | null = null;\n\n constructor(container?: HTMLElement) {\n this.container = container ?? (typeof document !== \"undefined\" ? document.body : (null as any));\n }\n\n public async highlight(\n element: HTMLElement,\n options: { duration?: number; style?: string; caption?: CaptionOptions | string } = {}\n ): Promise<void> {\n this.clearHighlight();\n\n this.activeElement = element;\n this.activeStyle = options.style ?? \"glow\";\n element.classList.add(`dg-highlight-${this.activeStyle}`);\n\n if (this.activeStyle === \"spotlight\") {\n this.renderSpotlightOverlay(element);\n }\n\n if (options.caption) {\n const captionOpts: CaptionOptions =\n typeof options.caption === \"string\" ? { text: options.caption } : options.caption;\n this.showCaption(captionOpts, element);\n }\n\n if (options.duration && options.duration > 0) {\n await new Promise<void>(resolve => {\n this.activeTimerResolve = resolve;\n this.activeTimer = setTimeout(() => {\n this.activeTimer = null;\n this.activeTimerResolve = null;\n resolve();\n }, options.duration);\n });\n this.clearHighlight();\n }\n }\n\n public clearHighlight(): void {\n if (this.activeElement && this.activeStyle) {\n this.activeElement.classList.remove(`dg-highlight-${this.activeStyle}`);\n this.activeElement = null;\n this.activeStyle = null;\n }\n\n if (this.overlayEl && this.overlayEl.parentNode) {\n this.overlayEl.parentNode.removeChild(this.overlayEl);\n this.overlayEl = null;\n }\n\n this.hideCaption();\n }\n\n private renderSpotlightOverlay(element: HTMLElement): void {\n if (typeof document === \"undefined\" || !this.container) return;\n\n this.overlayEl = document.createElement(\"div\");\n this.overlayEl.className = \"dg-spotlight-backdrop\";\n this.overlayEl.setAttribute(\"aria-hidden\", \"true\");\n\n const rect = element.getBoundingClientRect();\n const pad = 8;\n this.overlayEl.style.clipPath = `polygon(\n 0% 0%, 0% 100%, 100% 100%, 100% 0%,\n 0% 0%,\n ${rect.left - pad}px ${rect.top - pad}px,\n ${rect.right + pad}px ${rect.top - pad}px,\n ${rect.right + pad}px ${rect.bottom + pad}px,\n ${rect.left - pad}px ${rect.bottom + pad}px,\n ${rect.left - pad}px ${rect.top - pad}px\n )`;\n\n this.container.appendChild(this.overlayEl);\n }\n\n public showCaption(options: CaptionOptions, targetEl?: HTMLElement): void {\n this.hideCaption();\n if (typeof document === \"undefined\" || !this.container) return;\n\n this.captionEl = document.createElement(\"div\");\n this.captionEl.className = \"dg-caption dg-glass-panel\";\n this.captionEl.setAttribute(\"role\", \"status\");\n\n let innerHtml = \"\";\n if (options.title) {\n innerHtml += `<div class=\"dg-caption-title\">${this.escapeHtml(options.title)}</div>`;\n }\n innerHtml += `<div class=\"dg-caption-text\">${this.escapeHtml(options.text)}</div>`;\n this.captionEl.innerHTML = innerHtml;\n\n this.container.appendChild(this.captionEl);\n\n // Positioning\n if (targetEl) {\n const rect = targetEl.getBoundingClientRect();\n const pos = options.position || \"bottom\";\n const offset = 16;\n\n let top = 0;\n let left = 0;\n\n if (pos === \"top\") {\n top = rect.top - this.captionEl.offsetHeight - offset;\n left = rect.left + rect.width / 2 - this.captionEl.offsetWidth / 2;\n } else if (pos === \"left\") {\n top = rect.top + rect.height / 2 - this.captionEl.offsetHeight / 2;\n left = rect.left - this.captionEl.offsetWidth - offset;\n } else if (pos === \"right\") {\n top = rect.top + rect.height / 2 - this.captionEl.offsetHeight / 2;\n left = rect.right + offset;\n } else {\n // Bottom or auto\n top = rect.bottom + offset;\n left = rect.left + rect.width / 2 - this.captionEl.offsetWidth / 2;\n }\n\n // Clamp to viewport\n const pad = 12;\n left = Math.max(pad, Math.min(window.innerWidth - this.captionEl.offsetWidth - pad, left));\n top = Math.max(pad, Math.min(window.innerHeight - this.captionEl.offsetHeight - pad, top));\n\n this.captionEl.style.transform = `translate3d(${Math.round(left)}px, ${Math.round(top)}px, 0)`;\n } else {\n // Centered at bottom of viewport\n this.captionEl.style.bottom = \"80px\";\n this.captionEl.style.left = \"50%\";\n this.captionEl.style.transform = \"translateX(-50%)\";\n }\n\n // Auto-fade in\n requestAnimationFrame(() => {\n if (this.captionEl) {\n this.captionEl.classList.add(\"dg-caption--visible\");\n }\n });\n }\n\n public hideCaption(): void {\n if (this.captionEl && this.captionEl.parentNode) {\n this.captionEl.parentNode.removeChild(this.captionEl);\n this.captionEl = null;\n }\n }\n\n private escapeHtml(str: string): string {\n const div = document.createElement(\"div\");\n div.textContent = str;\n return div.innerHTML;\n }\n\n public destroy(): void {\n if (this.activeTimer) {\n clearTimeout(this.activeTimer);\n this.activeTimer = null;\n }\n if (this.activeTimerResolve) {\n const resolve = this.activeTimerResolve;\n this.activeTimerResolve = null;\n resolve();\n }\n this.clearHighlight();\n }\n}\n","import { DemoTheme, CustomTheme } from \"../types\";\n\nexport const THEME_PRESETS: Record<string, CustomTheme> = {\n light: {\n accent: \"#6366f1\",\n cursor: \"#0f172a\",\n glassBg: \"rgba(255, 255, 255, 0.75)\",\n border: \"rgba(226, 232, 240, 0.8)\",\n text: \"#0f172a\",\n shadow: \"0 20px 40px -15px rgba(0, 0, 0, 0.08)\",\n zIndexCursor: 999999,\n zIndexOverlay: 999990\n },\n dark: {\n accent: \"#818cf8\",\n cursor: \"#f8fafc\",\n glassBg: \"rgba(15, 23, 42, 0.82)\",\n border: \"rgba(255, 255, 255, 0.12)\",\n text: \"#f8fafc\",\n shadow: \"0 25px 50px -12px rgba(0, 0, 0, 0.5)\",\n zIndexCursor: 999999,\n zIndexOverlay: 999990\n },\n glass: {\n accent: \"#6366f1\",\n cursor: \"#0f172a\",\n glassBg: \"rgba(255, 255, 255, 0.65)\",\n border: \"rgba(255, 255, 255, 0.35)\",\n text: \"#0f172a\",\n shadow: \"0 20px 50px rgba(99, 102, 241, 0.15)\",\n zIndexCursor: 999999,\n zIndexOverlay: 999990\n }\n};\n\nexport class ThemeManager {\n public static apply(theme: DemoTheme = \"glass\", container?: HTMLElement): void {\n if (typeof document === \"undefined\") return;\n\n const target = container || document.documentElement;\n\n let resolvedTheme: CustomTheme = THEME_PRESETS.glass;\n\n if (typeof theme === \"string\") {\n if (theme === \"auto\") {\n const isDark =\n typeof window !== \"undefined\" &&\n window.matchMedia &&\n window.matchMedia(\"(prefers-color-scheme: dark)\").matches;\n resolvedTheme = isDark ? THEME_PRESETS.dark : THEME_PRESETS.light;\n } else if (THEME_PRESETS[theme]) {\n resolvedTheme = THEME_PRESETS[theme];\n }\n } else if (typeof theme === \"object\") {\n resolvedTheme = { ...THEME_PRESETS.glass, ...theme };\n }\n\n if (resolvedTheme.accent) target.style.setProperty(\"--demoghost-accent\", resolvedTheme.accent);\n if (resolvedTheme.cursor) target.style.setProperty(\"--demoghost-cursor\", resolvedTheme.cursor);\n if (resolvedTheme.glassBg)\n target.style.setProperty(\"--demoghost-glass-bg\", resolvedTheme.glassBg);\n if (resolvedTheme.border) target.style.setProperty(\"--demoghost-border\", resolvedTheme.border);\n if (resolvedTheme.text) target.style.setProperty(\"--demoghost-text\", resolvedTheme.text);\n if (resolvedTheme.shadow) target.style.setProperty(\"--demoghost-shadow\", resolvedTheme.shadow);\n if (resolvedTheme.zIndexCursor)\n target.style.setProperty(\"--demoghost-z-index-cursor\", String(resolvedTheme.zIndexCursor));\n if (resolvedTheme.zIndexOverlay)\n target.style.setProperty(\"--demoghost-z-index-overlay\", String(resolvedTheme.zIndexOverlay));\n }\n}\n","export class AccessibilityManager {\n private liveRegion: HTMLElement | null = null;\n private previousActiveElement: HTMLElement | null = null;\n private keydownHandler: ((e: KeyboardEvent) => void) | null = null;\n private announcementTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor() {\n this.initLiveRegion();\n }\n\n private initLiveRegion(): void {\n if (typeof document === \"undefined\") return;\n\n this.liveRegion = document.createElement(\"div\");\n this.liveRegion.className = \"dg-sr-only\";\n this.liveRegion.setAttribute(\"role\", \"status\");\n this.liveRegion.setAttribute(\"aria-live\", \"polite\");\n this.liveRegion.setAttribute(\"aria-atomic\", \"true\");\n document.body.appendChild(this.liveRegion);\n }\n\n public saveFocus(): void {\n if (typeof document !== \"undefined\" && document.activeElement instanceof HTMLElement) {\n this.previousActiveElement = document.activeElement;\n }\n }\n\n public restoreFocus(): void {\n if (this.previousActiveElement && typeof this.previousActiveElement.focus === \"function\") {\n try {\n this.previousActiveElement.focus();\n } catch {\n // Element might be detached\n }\n this.previousActiveElement = null;\n }\n }\n\n public announce(message: string): void {\n if (!this.liveRegion) return;\n // Clear and set to trigger speech synthesis in screen readers\n this.liveRegion.textContent = \"\";\n if (this.announcementTimer) clearTimeout(this.announcementTimer);\n this.announcementTimer = setTimeout(() => {\n this.announcementTimer = null;\n if (this.liveRegion) {\n this.liveRegion.textContent = message;\n }\n }, 50);\n }\n\n public bindKeyboardControls(options: { onStop: () => void; onTogglePause: () => void }): void {\n if (typeof window === \"undefined\") return;\n\n this.keydownHandler = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n e.preventDefault();\n options.onStop();\n }\n };\n\n window.addEventListener(\"keydown\", this.keydownHandler);\n }\n\n public destroy(): void {\n if (this.announcementTimer) {\n clearTimeout(this.announcementTimer);\n this.announcementTimer = null;\n }\n if (this.keydownHandler && typeof window !== \"undefined\") {\n window.removeEventListener(\"keydown\", this.keydownHandler);\n this.keydownHandler = null;\n }\n\n if (this.liveRegion && this.liveRegion.parentNode) {\n this.liveRegion.parentNode.removeChild(this.liveRegion);\n this.liveRegion = null;\n }\n\n this.restoreFocus();\n }\n}\n","export class EventEmitter<Events extends Record<string, any>> {\n private listeners: { [K in keyof Events]?: Array<(data: Events[K]) => void> } = {};\n\n public on<K extends keyof Events>(event: K, listener: (data: Events[K]) => void): () => void {\n if (!this.listeners[event]) {\n this.listeners[event] = [];\n }\n this.listeners[event]!.push(listener);\n return () => this.off(event, listener);\n }\n\n public off<K extends keyof Events>(event: K, listener: (data: Events[K]) => void): void {\n const list = this.listeners[event];\n if (!list) return;\n this.listeners[event] = list.filter(l => l !== listener);\n }\n\n public emit<K extends keyof Events>(event: K, data: Events[K]): void {\n const list = this.listeners[event];\n if (!list || list.length === 0) return;\n // Copy array to protect against modification during iteration\n [...list].forEach(listener => {\n try {\n listener(data);\n } catch (err) {\n console.error(`[DemoGhost] Error in event listener for \"${String(event)}\":`, err);\n }\n });\n }\n\n public removeAllListeners(): void {\n this.listeners = {};\n }\n}\n","import {\n DemoScenario,\n DemoStep,\n PlaybackControllerInterface,\n PlaybackState,\n PlaybackOptions,\n PlaybackEvents,\n ActionExecutionContext\n} from \"../types\";\nimport { ActionRegistry } from \"../actions/ActionRegistry\";\nimport { TargetResolver } from \"../targeting/TargetResolver\";\nimport { CursorEngine } from \"../cursor/CursorEngine\";\nimport { ScrollEngine } from \"../scroll/ScrollEngine\";\nimport { SpotlightEngine } from \"../spotlight/SpotlightEngine\";\nimport { ThemeManager } from \"../theme/theme\";\nimport { AccessibilityManager } from \"../accessibility/a11y\";\nimport { EventEmitter } from \"../events/EventEmitter\";\n\nexport class PlaybackController implements PlaybackControllerInterface {\n private scenario: DemoScenario;\n private options: PlaybackOptions;\n private actionRegistry: ActionRegistry;\n private emitter: EventEmitter<PlaybackEvents>;\n\n private _state: PlaybackState = \"idle\";\n private _currentStep = 0;\n private _speed = 1;\n\n private abortController: AbortController | null = null;\n private pauseResolver: (() => void) | null = null;\n private runPromise: Promise<void> | null = null;\n private enginesInitialized = false;\n private finishResolver!: () => void;\n private finishRejecter!: (err: any) => void;\n public finished: Promise<void>;\n\n // Sub-engines\n private targetResolver!: TargetResolver;\n private cursorEngine!: CursorEngine;\n private scrollEngine!: ScrollEngine;\n private spotlightEngine!: SpotlightEngine;\n private a11y!: AccessibilityManager;\n\n constructor(\n scenario: DemoScenario,\n options: PlaybackOptions = {},\n actionRegistry: ActionRegistry,\n emitter?: EventEmitter<PlaybackEvents>\n ) {\n this.scenario = scenario;\n this.options = options;\n this._speed = options.speed ?? 1;\n this.actionRegistry = actionRegistry;\n this.emitter = emitter || new EventEmitter<PlaybackEvents>();\n\n this.finished = Promise.resolve();\n this.resetFinishedPromise();\n\n this.initEngines();\n }\n\n private initEngines(): void {\n if (typeof window === \"undefined\") return;\n\n if (this.enginesInitialized) this.cleanup();\n\n ThemeManager.apply(this.options.theme, this.options.container);\n\n this.targetResolver = new TargetResolver(this.options.defaultTimeout ?? 5000);\n this.cursorEngine = new CursorEngine({\n pointerMode: this.options.pointer,\n cursor: this.options.cursor,\n container: this.options.container,\n deterministic: this.options.deterministic\n });\n this.scrollEngine = new ScrollEngine(this.options.scroll);\n this.spotlightEngine = new SpotlightEngine(this.options.container);\n this.a11y = new AccessibilityManager();\n\n this.a11y.saveFocus();\n this.a11y.bindKeyboardControls({\n onStop: () => this.stop(),\n onTogglePause: () => {\n if (this._state === \"playing\") this.pause();\n else if (this._state === \"paused\") this.resume();\n }\n });\n this.enginesInitialized = true;\n }\n\n private resetFinishedPromise(): void {\n this.finished = new Promise<void>((resolve, reject) => {\n this.finishResolver = resolve;\n this.finishRejecter = reject;\n });\n // Auto-start users may ignore `finished`; attaching a handler avoids an\n // unhandled-rejection warning while preserving rejection for consumers.\n void this.finished.catch(() => undefined);\n }\n\n public get state(): PlaybackState {\n return this._state;\n }\n\n public get currentStep(): number {\n return this._currentStep;\n }\n\n public get totalSteps(): number {\n return this.scenario.steps.length;\n }\n\n public get speed(): number {\n return this._speed;\n }\n\n public set speed(val: number) {\n this._speed = Math.max(0.1, val);\n }\n\n public play(): Promise<void> {\n if (this._state === \"playing\") return this.runPromise ?? this.finished;\n if (this._state === \"paused\") {\n this.resume();\n return this.runPromise ?? this.finished;\n }\n\n if (this._state === \"completed\" || this._state === \"stopped\" || this._state === \"error\") {\n return this.restart();\n }\n\n this.runPromise = this.runPlayback();\n return this.runPromise;\n }\n\n private async runPlayback(): Promise<void> {\n this._state = \"playing\";\n this.abortController = new AbortController();\n this.emitter.emit(\"start\", { scenario: this.scenario });\n\n try {\n while (this._currentStep < this.totalSteps) {\n if (this.abortController.signal.aborted) break;\n\n await this.waitIfPaused();\n if (this.abortController.signal.aborted) break;\n\n const step = this.scenario.steps[this._currentStep];\n await this.executeStep(step, this._currentStep);\n\n this._currentStep++;\n }\n\n if (!this.abortController.signal.aborted) {\n this._state = \"completed\";\n this.emitter.emit(\"complete\", { scenario: this.scenario });\n this.cleanup();\n this.finishResolver();\n }\n } catch (err: any) {\n if (this.abortController?.signal.aborted) {\n return;\n }\n this._state = \"error\";\n this.emitter.emit(\"error\", { error: err, stepIndex: this._currentStep });\n this.cleanup();\n this.finishRejecter(err);\n throw err;\n } finally {\n this.runPromise = null;\n }\n }\n\n private async executeStep(step: DemoStep, index: number): Promise<void> {\n const handler = this.actionRegistry.get(step.type);\n const startTime = performance.now();\n\n this.emitter.emit(\"step:start\", { step, index, total: this.totalSteps });\n this.log(`Step ${index + 1}/${this.totalSteps} -> ${step.type.toUpperCase()}`);\n\n // Caption announcement if provided on step\n if (step.caption) {\n const captionText = typeof step.caption === \"string\" ? step.caption : step.caption.text;\n this.a11y.announce(captionText);\n const capOpts = typeof step.caption === \"string\" ? { text: step.caption } : step.caption;\n let targetEl: HTMLElement | undefined;\n if (step.target) {\n targetEl =\n (await this.targetResolver.resolveOptional(step.target, this.abortController?.signal)) ||\n undefined;\n }\n this.spotlightEngine.showCaption(capOpts, targetEl);\n }\n\n if (step.delayBefore && step.delayBefore > 0) {\n await this.waitForDuration(step.delayBefore / this._speed);\n }\n\n const context: ActionExecutionContext = {\n step,\n stepIndex: index,\n totalSteps: this.totalSteps,\n targetResolver: this.targetResolver,\n cursor: this.cursorEngine,\n scrollEngine: this.scrollEngine,\n spotlightEngine: this.spotlightEngine,\n options: { ...this.options, speed: this._speed },\n signal: this.abortController!.signal,\n isPaused: () => this._state === \"paused\",\n waitIfPaused: () => this.waitIfPaused(),\n log: (msg: string, ...args: any[]) => this.log(msg, ...args)\n };\n\n await handler.execute(context);\n\n if (step.delayAfter && step.delayAfter > 0) {\n await this.waitForDuration(step.delayAfter / this._speed);\n }\n\n const elapsed = Math.round(performance.now() - startTime);\n this.log(`Step ${index + 1}/${this.totalSteps} completed in ${elapsed}ms`);\n this.emitter.emit(\"step:complete\", { step, index, total: this.totalSteps });\n }\n\n public pause(): void {\n if (this._state !== \"playing\") return;\n this._state = \"paused\";\n this.emitter.emit(\"pause\", undefined);\n }\n\n public resume(): void {\n if (this._state !== \"paused\") return;\n this._state = \"playing\";\n if (this.pauseResolver) {\n this.pauseResolver();\n this.pauseResolver = null;\n }\n this.emitter.emit(\"resume\", undefined);\n }\n\n public stop(): void {\n if (this._state === \"stopped\" || this._state === \"completed\") return;\n this._state = \"stopped\";\n if (this.abortController) {\n this.abortController.abort();\n }\n if (this.pauseResolver) {\n this.pauseResolver();\n this.pauseResolver = null;\n }\n this.emitter.emit(\"stop\", undefined);\n this.cleanup();\n this.finishResolver();\n }\n\n public async restart(): Promise<void> {\n const activeRun = this.runPromise;\n this.stop();\n if (activeRun) await activeRun.catch(() => undefined);\n this._currentStep = 0;\n this.initEngines();\n this.resetFinishedPromise();\n this._state = \"idle\";\n return this.play();\n }\n\n public async next(): Promise<void> {\n if (this._currentStep < this.totalSteps - 1) {\n this._currentStep++;\n const step = this.scenario.steps[this._currentStep];\n await this.executeStep(step, this._currentStep);\n }\n }\n\n public async previous(): Promise<void> {\n if (this._currentStep > 0) {\n this._currentStep--;\n const step = this.scenario.steps[this._currentStep];\n await this.executeStep(step, this._currentStep);\n }\n }\n\n private async waitIfPaused(): Promise<void> {\n if (this._state === \"paused\") {\n await new Promise<void>(resolve => {\n this.pauseResolver = resolve;\n });\n }\n }\n\n private async waitForDuration(duration: number): Promise<void> {\n let remaining = Math.max(0, duration);\n while (remaining > 0 && !this.abortController?.signal.aborted) {\n await this.waitIfPaused();\n if (this.abortController?.signal.aborted) return;\n const slice = Math.min(remaining, 50);\n const startedAt = performance.now();\n await new Promise<void>(resolve => {\n const timer = setTimeout(resolve, slice);\n this.abortController?.signal.addEventListener(\n \"abort\",\n () => {\n clearTimeout(timer);\n resolve();\n },\n { once: true }\n );\n });\n remaining -= performance.now() - startedAt;\n }\n }\n\n private cleanup(): void {\n if (!this.enginesInitialized) return;\n if (this.cursorEngine) this.cursorEngine.destroy();\n if (this.scrollEngine) this.scrollEngine.destroy();\n if (this.spotlightEngine) this.spotlightEngine.destroy();\n if (this.a11y) this.a11y.destroy();\n this.enginesInitialized = false;\n }\n\n public then<TResult1 = void, TResult2 = never>(\n onfulfilled?: ((value: void) => TResult1 | PromiseLike<TResult1>) | null,\n onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null\n ): Promise<TResult1 | TResult2> {\n return this.finished.then(onfulfilled, onrejected);\n }\n\n private log(msg: string, ...args: any[]): void {\n if (this.options.debug) {\n console.log(`[DemoGhost] ${msg}`, ...args);\n }\n }\n\n public on<K extends keyof PlaybackEvents>(\n event: K,\n listener: (data: PlaybackEvents[K]) => void\n ): () => void {\n return this.emitter.on(event, listener);\n }\n\n public off<K extends keyof PlaybackEvents>(\n event: K,\n listener: (data: PlaybackEvents[K]) => void\n ): void {\n this.emitter.off(event, listener);\n }\n}\n","import {\n DemoTarget,\n MoveStep,\n ClickStep,\n DoubleClickStep,\n RightClickStep,\n TypeStep,\n ClearStep,\n FocusStep,\n BlurStep,\n WaitStep,\n ScrollStep,\n ScrollToStep,\n SelectStep,\n CheckStep,\n UncheckStep,\n HoverStep,\n PressStep,\n HighlightStep,\n CaptionStep,\n CaptionOptions,\n DragStep\n} from \"../types\";\n\nexport function move(target: DemoTarget, options: Partial<MoveStep> = {}): MoveStep {\n return { type: \"move\", target, ...options };\n}\n\nexport function click(target: DemoTarget, options: Partial<ClickStep> = {}): ClickStep {\n return { type: \"click\", target, ...options };\n}\n\nexport function doubleClick(\n target: DemoTarget,\n options: Partial<DoubleClickStep> = {}\n): DoubleClickStep {\n return { type: \"doubleClick\", target, ...options };\n}\n\nexport function rightClick(\n target: DemoTarget,\n options: Partial<RightClickStep> = {}\n): RightClickStep {\n return { type: \"rightClick\", target, ...options };\n}\n\nexport function type(target: DemoTarget, value: string, options: Partial<TypeStep> = {}): TypeStep {\n return { type: \"type\", target, value, ...options };\n}\n\nexport function clear(target: DemoTarget, options: Partial<ClearStep> = {}): ClearStep {\n return { type: \"clear\", target, ...options };\n}\n\nexport function focus(target: DemoTarget, options: Partial<FocusStep> = {}): FocusStep {\n return { type: \"focus\", target, ...options };\n}\n\nexport function blur(target: DemoTarget, options: Partial<BlurStep> = {}): BlurStep {\n return { type: \"blur\", target, ...options };\n}\n\nexport function wait(\n durationOrCondition: number | (() => boolean | Promise<boolean>),\n options: Partial<WaitStep> = {}\n): WaitStep {\n if (typeof durationOrCondition === \"number\") {\n return { type: \"wait\", duration: durationOrCondition, ...options };\n }\n return { type: \"wait\", condition: durationOrCondition, ...options };\n}\n\nexport function waitFor(\n targetOrSelectorOrCondition:\n | string\n | (() => boolean | Promise<boolean>)\n | {\n selector: string;\n state?: \"visible\" | \"hidden\" | \"attached\" | \"detached\";\n timeout?: number;\n },\n options: Partial<WaitStep> = {}\n): WaitStep {\n if (typeof targetOrSelectorOrCondition === \"string\") {\n return { type: \"wait\", selector: targetOrSelectorOrCondition, state: \"visible\", ...options };\n }\n if (typeof targetOrSelectorOrCondition === \"function\") {\n return { type: \"wait\", condition: targetOrSelectorOrCondition, ...options };\n }\n return {\n type: \"wait\",\n selector: targetOrSelectorOrCondition.selector,\n state: targetOrSelectorOrCondition.state ?? \"visible\",\n timeout: targetOrSelectorOrCondition.timeout,\n ...options\n };\n}\n\nexport function scroll(\n targetOrOptions?: DemoTarget | Partial<ScrollStep>,\n options: Partial<ScrollStep> = {}\n): ScrollStep {\n if (\n typeof targetOrOptions === \"string\" ||\n (targetOrOptions && \"tagName\" in (targetOrOptions as any))\n ) {\n return { type: \"scroll\", target: targetOrOptions as DemoTarget, ...options };\n }\n if (targetOrOptions && typeof targetOrOptions === \"object\" && !(\"type\" in targetOrOptions)) {\n return { type: \"scroll\", ...(targetOrOptions as Partial<ScrollStep>) };\n }\n return { type: \"scroll\", ...options };\n}\n\nexport function scrollTo(x: number, y: number, behavior: ScrollBehavior = \"smooth\"): ScrollToStep {\n return { type: \"scrollTo\", x, y, behavior };\n}\n\nexport function select(\n target: DemoTarget,\n value: string | string[],\n options: Partial<SelectStep> = {}\n): SelectStep {\n return { type: \"select\", target, value, ...options };\n}\n\nexport function check(target: DemoTarget, options: Partial<CheckStep> = {}): CheckStep {\n return { type: \"check\", target, ...options };\n}\n\nexport function uncheck(target: DemoTarget, options: Partial<UncheckStep> = {}): UncheckStep {\n return { type: \"uncheck\", target, ...options };\n}\n\nexport function hover(\n target: DemoTarget,\n duration = 500,\n options: Partial<HoverStep> = {}\n): HoverStep {\n return { type: \"hover\", target, duration, ...options };\n}\n\nexport function press(key: string, options: Partial<PressStep> = {}): PressStep {\n return { type: \"press\", key, ...options };\n}\n\nexport function highlight(target: DemoTarget, options: Partial<HighlightStep> = {}): HighlightStep {\n return { type: \"highlight\", target, ...options };\n}\n\nexport function caption(textOrOptions: string | CaptionOptions, target?: DemoTarget): CaptionStep {\n const options: CaptionOptions =\n typeof textOrOptions === \"string\" ? { text: textOrOptions } : textOrOptions;\n return { type: \"caption\", options, target };\n}\n\nexport function drag(\n source: DemoTarget,\n target: DemoTarget,\n options: Partial<DragStep> = {}\n): DragStep {\n return { type: \"drag\", source, target, ...options };\n}\n","import { DemoScenario, DemoStep, PlaybackOptions, DemoGhostConfig, PlaybackEvents } from \"./types\";\nimport { ActionRegistry } from \"./actions/ActionRegistry\";\nimport { registerBuiltinActions } from \"./actions/handlers\";\nimport { PlaybackController } from \"./engine/PlaybackController\";\nimport { EventEmitter } from \"./events/EventEmitter\";\nimport \"./styles/demoghost.css\";\n\n// Export types\nexport * from \"./types\";\nexport * from \"./errors\";\nexport * from \"./actions/creators\";\nexport { ActionRegistry } from \"./actions/ActionRegistry\";\nexport { PlaybackController } from \"./engine/PlaybackController\";\nexport { EventEmitter } from \"./events/EventEmitter\";\nexport { TargetResolver } from \"./targeting/TargetResolver\";\nexport { CursorEngine } from \"./cursor/CursorEngine\";\nexport { ScrollEngine } from \"./scroll/ScrollEngine\";\nexport { SpotlightEngine } from \"./spotlight/SpotlightEngine\";\nexport { ThemeManager } from \"./theme/theme\";\nexport { AccessibilityManager } from \"./accessibility/a11y\";\n\nexport class DemoGhostCore {\n private static globalConfig: DemoGhostConfig = {};\n public static actions = new ActionRegistry();\n private static globalEmitter = new EventEmitter<PlaybackEvents>();\n\n static {\n registerBuiltinActions(DemoGhostCore.actions);\n }\n\n private static activeController: PlaybackController | null = null;\n\n public static configure(config: DemoGhostConfig): void {\n DemoGhostCore.globalConfig = { ...DemoGhostCore.globalConfig, ...config };\n }\n\n public static play(\n scenarioOrSteps: DemoScenario | DemoStep[],\n options: PlaybackOptions = {}\n ): PlaybackController {\n // Controlled cancellation: Stop previous running instance to avoid state corruption or duplicate cursors\n if (\n DemoGhostCore.activeController &&\n (DemoGhostCore.activeController.state === \"playing\" ||\n DemoGhostCore.activeController.state === \"paused\")\n ) {\n DemoGhostCore.activeController.stop();\n }\n\n const scenario: DemoScenario = Array.isArray(scenarioOrSteps)\n ? { steps: scenarioOrSteps }\n : scenarioOrSteps;\n\n const mergedOptions: PlaybackOptions = {\n ...DemoGhostCore.globalConfig,\n ...options\n };\n\n const controller = new PlaybackController(\n scenario,\n mergedOptions,\n DemoGhostCore.actions,\n DemoGhostCore.globalEmitter\n );\n\n DemoGhostCore.activeController = controller;\n\n if (mergedOptions.autoStart !== false) {\n controller.play().catch(err => {\n if (mergedOptions.debug) {\n console.error(\"[DemoGhost] Playback error:\", err);\n }\n });\n }\n\n return controller;\n }\n\n public static create(scenario: DemoScenario, defaultOptions: PlaybackOptions = {}) {\n return {\n play: (options: PlaybackOptions = {}) =>\n DemoGhostCore.play(scenario, { ...defaultOptions, ...options })\n };\n }\n\n public static on<K extends keyof PlaybackEvents>(\n event: K,\n listener: (data: PlaybackEvents[K]) => void\n ): () => void {\n return DemoGhostCore.globalEmitter.on(event, listener);\n }\n\n public static off<K extends keyof PlaybackEvents>(\n event: K,\n listener: (data: PlaybackEvents[K]) => void\n ): void {\n DemoGhostCore.globalEmitter.off(event, listener);\n }\n}\n\n// Global browser attachment for CDN or script tag\nif (typeof window !== \"undefined\") {\n (window as any).DemoGhostCore = DemoGhostCore;\n}\n","export interface SelectorOptions {\n preferredAttributes?: string[];\n ignoreClasses?: string[];\n maxDepth?: number;\n}\n\nexport class SelectorGenerator {\n private preferredAttributes: string[];\n private ignoreClasses: Set<string>;\n private maxDepth: number;\n\n constructor(options: SelectorOptions = {}) {\n this.preferredAttributes = options.preferredAttributes || [\n \"data-demoghost-id\",\n \"data-testid\",\n \"data-test-id\",\n \"data-cy\",\n \"data-qa\",\n \"data-action\"\n ];\n this.ignoreClasses = new Set([\n \"dg-cursor\",\n \"dg-caption\",\n \"dg-controls\",\n \"active\",\n \"focus\",\n \"hover\",\n \"selected\",\n ...(options.ignoreClasses || [])\n ]);\n this.maxDepth = options.maxDepth || 5;\n }\n\n public generate(element: HTMLElement): string {\n if (!element || !(element instanceof HTMLElement)) {\n return \"\";\n }\n\n // Tier 1: data-demoghost-id attribute\n const demoghostId = element.getAttribute(\"data-demoghost-id\");\n if (demoghostId) {\n return `[data-demoghost-id=\"${CSS.escape(demoghostId)}\"]`;\n }\n\n // Tier 2: Unique stable element ID\n if (element.id && this.isValidId(element.id)) {\n const idSelector = `#${CSS.escape(element.id)}`;\n if (this.isUnique(idSelector)) {\n return idSelector;\n }\n }\n\n // Tier 3: Preferred stable test-automation attributes (data-testid, data-cy, data-qa, etc.)\n for (const attr of this.preferredAttributes) {\n const val = element.getAttribute(attr);\n if (val) {\n const sel = `[${attr}=\"${CSS.escape(val)}\"]`;\n if (this.isUnique(sel)) {\n return sel;\n }\n }\n }\n\n // Tier 4: Semantic interactive attributes: name, aria-label, placeholder, title, alt\n const semanticAttrs = [\"name\", \"aria-label\", \"placeholder\", \"title\", \"alt\"];\n for (const attr of semanticAttrs) {\n const val = element.getAttribute(attr);\n if (val) {\n const tag = element.tagName.toLowerCase();\n const sel = `${tag}[${attr}=\"${CSS.escape(val)}\"]`;\n if (this.isUnique(sel)) {\n return sel;\n }\n }\n }\n\n // Tier 5: ARIA role + semantic tag/attribute combinations\n const role = element.getAttribute(\"role\");\n if (role) {\n const tag = element.tagName.toLowerCase();\n const roleSel = `${tag}[role=\"${CSS.escape(role)}\"]`;\n if (this.isUnique(roleSel)) {\n return roleSel;\n }\n const ariaLabel = element.getAttribute(\"aria-label\");\n if (ariaLabel) {\n const roleWithLabel = `[role=\"${CSS.escape(role)}\"][aria-label=\"${CSS.escape(ariaLabel)}\"]`;\n if (this.isUnique(roleWithLabel)) {\n return roleWithLabel;\n }\n }\n }\n\n // Tier 6: Text content + tag combination for buttons / links / headings\n const tag = element.tagName.toLowerCase();\n if ([\"button\", \"a\", \"h1\", \"h2\", \"h3\", \"label\", \"span\"].includes(tag)) {\n const text = (element.textContent || \"\").trim();\n if (text && text.length < 30 && !text.includes(\"\\n\")) {\n const textSel = `${tag}:contains(\"${text.replace(/\"/g, '\\\\\"')}\")`;\n const matches = Array.from(document.querySelectorAll(tag)).filter(\n el => (el.textContent || \"\").trim() === text\n );\n if (matches.length === 1) {\n return textSel;\n }\n }\n }\n\n // Tier 7: Form Control Specific Attributes (e.g. input[type=\"email\"], button[type=\"submit\"])\n const inputType = element.getAttribute(\"type\");\n if (inputType && [\"input\", \"button\"].includes(tag)) {\n const typeSel = `${tag}[type=\"${CSS.escape(inputType)}\"]`;\n if (this.isUnique(typeSel)) {\n return typeSel;\n }\n }\n\n // Tier 8: Unique clean CSS class combination\n const classSelector = this.getUniqueClassSelector(element);\n if (classSelector) {\n return classSelector;\n }\n\n // Tier 9: Contextual Ancestor Scoping (parent/container ID or form + selector)\n const contextualSel = this.getContextualSelector(element);\n if (contextualSel) {\n return contextualSel;\n }\n\n // Tier 10: Hierarchical structural CSS path with nth-of-type fallback\n return this.getHierarchicalPath(element);\n }\n\n private getContextualSelector(element: HTMLElement): string | null {\n let parent = element.parentElement;\n while (parent && parent !== document.body && parent !== document.documentElement) {\n if (parent.id && this.isValidId(parent.id)) {\n const tag = element.tagName.toLowerCase();\n const candidate = `#${CSS.escape(parent.id)} ${tag}`;\n if (this.isUnique(candidate)) return candidate;\n\n // Try with class if available\n const classes = Array.from(element.classList).filter(c => !this.ignoreClasses.has(c));\n if (classes.length > 0) {\n const candidateWithClass = `#${CSS.escape(parent.id)} ${tag}.${CSS.escape(classes[0])}`;\n if (this.isUnique(candidateWithClass)) return candidateWithClass;\n }\n }\n parent = parent.parentElement;\n }\n return null;\n }\n\n private isValidId(id: string): boolean {\n // Avoid dynamic auto-generated IDs (like :r1:, dynamic UUIDs, etc.)\n if (/^[0-9]/.test(id) || /:[a-z0-9]+:/i.test(id) || /^__/.test(id)) {\n return false;\n }\n return /^[a-zA-Z][a-zA-Z0-9_:-]*$/.test(id);\n }\n\n private isUnique(selector: string): boolean {\n try {\n return document.querySelectorAll(selector).length === 1;\n } catch {\n return false;\n }\n }\n\n private getUniqueClassSelector(element: HTMLElement): string | null {\n const classes = Array.from(element.classList).filter(c => !this.ignoreClasses.has(c));\n if (classes.length === 0) return null;\n\n const tag = element.tagName.toLowerCase();\n\n // Try single class\n for (const cls of classes) {\n const sel = `${tag}.${CSS.escape(cls)}`;\n if (this.isUnique(sel)) return sel;\n }\n\n // Try combined classes\n if (classes.length > 1) {\n const combined = `${tag}.${classes.map(c => CSS.escape(c)).join(\".\")}`;\n if (this.isUnique(combined)) return combined;\n }\n\n return null;\n }\n\n private getHierarchicalPath(element: HTMLElement): string {\n const path: string[] = [];\n let current: HTMLElement | null = element;\n let depth = 0;\n\n while (\n current &&\n current !== document.body &&\n current !== document.documentElement &&\n depth < this.maxDepth\n ) {\n let segment = current.tagName.toLowerCase();\n\n if (current.id && this.isValidId(current.id)) {\n segment = `#${CSS.escape(current.id)}`;\n path.unshift(segment);\n break; // Id is root of sub-selector\n }\n\n const parent: HTMLElement | null = current.parentElement;\n if (parent) {\n const siblings = Array.from(parent.children).filter(c => c.tagName === current!.tagName);\n if (siblings.length > 1) {\n const index = siblings.indexOf(current) + 1;\n segment += `:nth-of-type(${index})`;\n }\n }\n\n path.unshift(segment);\n const testSel = path.join(\" > \");\n if (this.isUnique(testSel)) {\n return testSel;\n }\n\n current = parent;\n depth++;\n }\n\n return path.join(\" > \");\n }\n}\n","export interface PrivacyOptions {\n maskPasswords?: boolean;\n maskSelectors?: string[];\n ignoreSelectors?: string[];\n}\n\nexport class PrivacyMasker {\n private maskPasswords: boolean;\n private maskSelectors: string[];\n private ignoreSelectors: string[];\n\n constructor(options: PrivacyOptions = {}) {\n this.maskPasswords = options.maskPasswords !== false;\n this.maskSelectors = [\n \"[data-demoghost-private]\",\n \"[data-private]\",\n \".secret\",\n \".private\",\n \".confidential\",\n ...(options.maskSelectors || [])\n ];\n this.ignoreSelectors = options.ignoreSelectors || [];\n }\n\n public shouldIgnore(element: HTMLElement): boolean {\n if (!element) return true;\n\n // Ignore internal DemoGhost UI elements\n if (\n element.closest(\".dg-cursor\") ||\n element.closest(\".dg-controls\") ||\n element.closest(\".dg-controls-container\") ||\n element.closest(\".dg-controls-hud\") ||\n element.closest(\".dg-caption\") ||\n element.closest(\".dg-spotlight-backdrop\")\n ) {\n return true;\n }\n\n for (const selector of this.ignoreSelectors) {\n if (element.matches(selector) || element.closest(selector)) {\n return true;\n }\n }\n\n return false;\n }\n\n public isSensitive(element: HTMLElement): boolean {\n if (!element) return false;\n\n // Password input check\n if (this.maskPasswords) {\n if (element instanceof HTMLInputElement && element.type.toLowerCase() === \"password\") {\n return true;\n }\n }\n\n // Name / autocomplete checks for sensitive fields\n const sensitiveText = [\"name\", \"id\", \"autocomplete\", \"placeholder\", \"aria-label\"]\n .map(attribute => element.getAttribute(attribute) || \"\")\n .join(\" \")\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"\");\n\n const sensitiveKeywords = [\n \"password\",\n \"secret\",\n \"creditcard\",\n \"cardnumber\",\n \"ccnumber\",\n \"cvv\",\n \"cvc\",\n \"csc\",\n \"cccsc\",\n \"securitycode\",\n \"pin\",\n \"passphrase\",\n \"ssn\",\n \"token\",\n \"apikey\",\n \"accesstoken\",\n \"clientsecret\",\n \"onetimecode\"\n ];\n\n for (const keyword of sensitiveKeywords) {\n if (sensitiveText.includes(keyword)) {\n return true;\n }\n }\n\n // Explicit mask selectors\n for (const selector of this.maskSelectors) {\n try {\n if (element.matches(selector) || element.closest(selector)) {\n return true;\n }\n } catch {\n // Invalid selector string\n }\n }\n\n return false;\n }\n\n public maskValue(element: HTMLElement, originalValue: string): string {\n if (this.isSensitive(element)) {\n return \"••••••••\";\n }\n return originalValue;\n }\n}\n","import type { DemoScenario, DemoStep } from \"@demoghost/core\";\nimport { SelectorGenerator, SelectorOptions } from \"../selector/SelectorGenerator\";\nimport { PrivacyMasker, PrivacyOptions } from \"../privacy/PrivacyMasker\";\n\nexport interface RecorderOptions {\n selector?: SelectorOptions;\n privacy?: PrivacyOptions;\n maskPasswords?: boolean;\n maskSelectors?: string[];\n ignoreSelectors?: string[];\n captureScroll?: boolean;\n captureKeyboard?: boolean;\n minWaitDuration?: number;\n}\n\nexport class EventRecorder {\n private options: RecorderOptions;\n private selectorGen: SelectorGenerator;\n private privacyMasker: PrivacyMasker;\n\n private steps: DemoStep[] = [];\n private isRecording = false;\n private lastActionTime = 0;\n private activeInputTimer: any = null;\n private activeInputElement: HTMLInputElement | HTMLTextAreaElement | null = null;\n private activeInputValue = \"\";\n\n private clickListener: any = null;\n private inputListener: any = null;\n private changeListener: any = null;\n private scrollListener: any = null;\n private keydownListener: any = null;\n\n constructor(options: RecorderOptions = {}) {\n this.options = {\n captureScroll: true,\n captureKeyboard: true,\n minWaitDuration: 600,\n ...options\n };\n this.selectorGen = new SelectorGenerator(options.selector);\n this.privacyMasker = new PrivacyMasker({\n ...options.privacy,\n maskPasswords: options.maskPasswords ?? options.privacy?.maskPasswords,\n maskSelectors: options.maskSelectors ?? options.privacy?.maskSelectors,\n ignoreSelectors: options.ignoreSelectors ?? options.privacy?.ignoreSelectors\n });\n }\n\n public start(): void {\n if (typeof window === \"undefined\" || this.isRecording) return;\n\n this.steps = [];\n this.isRecording = true;\n this.lastActionTime = Date.now();\n\n this.bindEvents();\n }\n\n public stop(): DemoScenario {\n if (!this.isRecording) {\n return { steps: this.steps };\n }\n\n this.flushActiveInput();\n this.unbindEvents();\n this.isRecording = false;\n\n return {\n version: 1,\n steps: [...this.steps]\n };\n }\n\n private bindEvents(): void {\n this.clickListener = (e: MouseEvent) => this.handleClick(e);\n this.inputListener = (e: Event) => this.handleInput(e);\n this.changeListener = (e: Event) => this.handleChange(e);\n this.keydownListener = (e: KeyboardEvent) => this.handleKeydown(e);\n\n document.addEventListener(\"click\", this.clickListener, true);\n document.addEventListener(\"input\", this.inputListener, true);\n document.addEventListener(\"change\", this.changeListener, true);\n if (this.options.captureKeyboard) {\n document.addEventListener(\"keydown\", this.keydownListener, true);\n }\n\n if (this.options.captureScroll) {\n this.scrollListener = () => this.handleScroll();\n window.addEventListener(\"scroll\", this.scrollListener, { passive: true });\n }\n }\n\n private unbindEvents(): void {\n if (typeof document === \"undefined\") return;\n\n if (this.clickListener) document.removeEventListener(\"click\", this.clickListener, true);\n if (this.inputListener) document.removeEventListener(\"input\", this.inputListener, true);\n if (this.changeListener) document.removeEventListener(\"change\", this.changeListener, true);\n if (this.keydownListener) document.removeEventListener(\"keydown\", this.keydownListener, true);\n if (this.scrollListener) window.removeEventListener(\"scroll\", this.scrollListener);\n this.clickListener = null;\n this.inputListener = null;\n this.changeListener = null;\n this.keydownListener = null;\n this.scrollListener = null;\n }\n\n private appendWaitIfNecessary(): void {\n const now = Date.now();\n const elapsed = now - this.lastActionTime;\n const minWait = this.options.minWaitDuration ?? 600;\n\n if (this.steps.length > 0 && elapsed >= minWait) {\n // Round to nearest 100ms\n const waitTime = Math.round(elapsed / 100) * 100;\n this.steps.push({ type: \"wait\", duration: waitTime });\n }\n this.lastActionTime = now;\n }\n\n private handleClick(e: MouseEvent): void {\n const target = e.target as HTMLElement;\n if (!target || this.privacyMasker.shouldIgnore(target)) return;\n\n // Flush any pending typing before recording click\n this.flushActiveInput();\n\n const tag = target.tagName.toLowerCase();\n // Don't record click on inputs that will be handled by typing/change\n if (\n tag === \"select\" ||\n tag === \"textarea\" ||\n (tag === \"input\" &&\n ![\"button\", \"submit\", \"reset\", \"image\"].includes(\n (target as HTMLInputElement).type.toLowerCase()\n ))\n ) {\n return;\n }\n\n const selector = this.selectorGen.generate(target);\n if (!selector) return;\n\n this.appendWaitIfNecessary();\n this.steps.push({\n type: \"click\",\n target: selector\n });\n }\n\n private handleInput(e: Event): void {\n const target = e.target as HTMLInputElement | HTMLTextAreaElement;\n if (!target || this.privacyMasker.shouldIgnore(target)) return;\n if (!this.isTextEntryElement(target)) return;\n\n if (this.activeInputElement !== target) {\n this.flushActiveInput();\n this.activeInputElement = target;\n }\n\n this.activeInputValue = this.privacyMasker.isSensitive(target)\n ? this.privacyMasker.maskValue(target, \"\")\n : target.value;\n\n if (this.activeInputTimer) {\n clearTimeout(this.activeInputTimer);\n }\n\n // Debounce typing end: 500ms\n this.activeInputTimer = setTimeout(() => {\n this.flushActiveInput();\n }, 500);\n }\n\n private flushActiveInput(): void {\n if (this.activeInputTimer) {\n clearTimeout(this.activeInputTimer);\n this.activeInputTimer = null;\n }\n\n if (!this.activeInputElement) return;\n\n const el = this.activeInputElement;\n const selector = this.selectorGen.generate(el);\n\n if (selector) {\n const maskedVal = this.privacyMasker.maskValue(el, this.activeInputValue);\n this.appendWaitIfNecessary();\n this.steps.push({\n type: \"type\",\n target: selector,\n value: maskedVal,\n clearFirst: true\n });\n }\n\n this.activeInputElement = null;\n this.activeInputValue = \"\";\n }\n\n private handleChange(e: Event): void {\n const target = e.target as HTMLElement;\n if (!target || this.privacyMasker.shouldIgnore(target)) return;\n\n this.flushActiveInput();\n\n const tag = target.tagName.toLowerCase();\n\n if (tag === \"select\") {\n const selectEl = target as HTMLSelectElement;\n const selector = this.selectorGen.generate(selectEl);\n if (selector) {\n this.appendWaitIfNecessary();\n this.steps.push({\n type: \"select\",\n target: selector,\n value: selectEl.value\n });\n }\n } else if (tag === \"input\") {\n const inputEl = target as HTMLInputElement;\n const type = (inputEl.type || \"text\").toLowerCase();\n\n if (type === \"checkbox\" || type === \"radio\") {\n const selector = this.selectorGen.generate(inputEl);\n if (selector) {\n this.appendWaitIfNecessary();\n this.steps.push({\n type: inputEl.checked ? \"check\" : \"uncheck\",\n target: selector\n });\n }\n }\n }\n }\n\n private handleKeydown(e: KeyboardEvent): void {\n if (e.repeat || e.isComposing) return;\n const target = e.target as HTMLElement;\n if (!target || this.privacyMasker.shouldIgnore(target)) return;\n\n const keys = new Set([\n \"Enter\",\n \"Escape\",\n \"Tab\",\n \"ArrowUp\",\n \"ArrowDown\",\n \"ArrowLeft\",\n \"ArrowRight\",\n \"Home\",\n \"End\",\n \"PageUp\",\n \"PageDown\"\n ]);\n if (!keys.has(e.key)) return;\n\n this.flushActiveInput();\n const selector = target === document.body ? undefined : this.selectorGen.generate(target);\n this.appendWaitIfNecessary();\n this.steps.push({\n type: \"press\",\n key: e.key,\n ...(selector ? { target: selector } : {})\n });\n }\n\n private isTextEntryElement(\n element: HTMLElement\n ): element is HTMLInputElement | HTMLTextAreaElement {\n if (element instanceof HTMLTextAreaElement) return true;\n if (!(element instanceof HTMLInputElement)) return false;\n return ![\n \"button\",\n \"checkbox\",\n \"color\",\n \"file\",\n \"hidden\",\n \"image\",\n \"radio\",\n \"range\",\n \"reset\",\n \"submit\"\n ].includes(element.type.toLowerCase());\n }\n\n private handleScroll(): void {\n // Throttled scroll capture\n const now = Date.now();\n if (now - this.lastActionTime < 1000) return;\n\n const scrollY = window.scrollY;\n const scrollX = window.scrollX;\n\n if (scrollY > 0 || scrollX > 0) {\n this.steps.push({\n type: \"scrollTo\",\n x: scrollX,\n y: scrollY,\n behavior: \"smooth\"\n });\n this.lastActionTime = now;\n }\n }\n}\n","import type { DemoScenario, DemoStep } from \"@demoghost/core\";\n\nconst BUILTIN_ACTIONS = new Set([\n \"move\",\n \"click\",\n \"doubleClick\",\n \"rightClick\",\n \"type\",\n \"clear\",\n \"focus\",\n \"blur\",\n \"wait\",\n \"waitFor\",\n \"scroll\",\n \"scrollTo\",\n \"select\",\n \"check\",\n \"uncheck\",\n \"hover\",\n \"press\",\n \"highlight\",\n \"caption\",\n \"drag\"\n]);\n\nexport class ScenarioSerializer {\n public static serialize(scenario: DemoScenario): string {\n return JSON.stringify(\n scenario,\n (_key, value) => {\n if (typeof value === \"function\") {\n throw new TypeError(\n \"Function-based steps cannot be serialized. Use waitFor(selector) instead.\"\n );\n }\n if (typeof HTMLElement !== \"undefined\" && value instanceof HTMLElement) {\n throw new TypeError(\n \"HTMLElement targets cannot be serialized. Use a stable selector string.\"\n );\n }\n return value;\n },\n 2\n );\n }\n\n public static deserialize(json: string): DemoScenario {\n try {\n const parsed: unknown = JSON.parse(json);\n if (!parsed || typeof parsed !== \"object\" || !Array.isArray((parsed as any).steps)) {\n throw new Error(\"Invalid scenario JSON: 'steps' array is required.\");\n }\n if (\n !(parsed as any).steps.every(\n (step: unknown) =>\n step !== null && typeof step === \"object\" && typeof (step as any).type === \"string\"\n )\n ) {\n throw new Error(\"Invalid scenario JSON: every step requires a string 'type'.\");\n }\n return parsed as DemoScenario;\n } catch (err: any) {\n throw new Error(`Failed to deserialize DemoGhost scenario: ${err.message}`);\n }\n }\n\n public static toTypeScript(scenario: DemoScenario): string {\n const usedActions = new Set<string>();\n const stepLines = scenario.steps.map(step => {\n if (BUILTIN_ACTIONS.has(step.type)) {\n usedActions.add(step.type === \"wait\" && step.selector ? \"waitFor\" : step.type);\n }\n return this.formatStepCode(step);\n });\n const imports = Array.from(usedActions).sort().join(\", \");\n const namedImports = imports ? `, ${imports}` : \"\";\n\n return `import { DemoGhost${namedImports} } from \"demoghost\";\n\nexport const scenario = [\n ${stepLines.join(\",\\n \")}\n];\n\nawait DemoGhost.play(scenario);\n`;\n }\n\n public static toJavaScript(scenario: DemoScenario): string {\n const stepLines = scenario.steps.map(step => this.formatStepCode(step, \"DemoGhost.\"));\n\n return `// DemoGhost Scenario Replay\nconst scenario = [\n ${stepLines.join(\",\\n \")}\n];\n\nawait DemoGhost.play(scenario);\n`;\n }\n\n private static formatStepCode(step: DemoStep, prefix = \"\"): string {\n const target = () => this.formatValue((step as any).target);\n const options = (excluded: string[]) => this.formatOptions(step, excluded);\n const withOptions = (base: string, value: string) =>\n value ? `${base}, ${value})` : `${base})`;\n\n switch (step.type) {\n case \"move\":\n case \"click\":\n case \"doubleClick\":\n case \"rightClick\":\n case \"clear\":\n case \"focus\":\n case \"blur\":\n case \"check\":\n case \"uncheck\":\n case \"highlight\": {\n const optionCode = options([\"type\", \"target\"]);\n return withOptions(`${prefix}${step.type}(${target()}`, optionCode);\n }\n case \"type\": {\n const optionCode = options([\"type\", \"target\", \"value\"]);\n return withOptions(\n `${prefix}type(${target()}, ${this.formatValue((step as any).value)}`,\n optionCode\n );\n }\n case \"wait\": {\n if ((step as any).selector) {\n const waitForOptions = {\n selector: (step as any).selector,\n ...this.pickOptions(step, [\"type\", \"selector\"])\n };\n return `${prefix}waitFor(${this.formatValue(waitForOptions)})`;\n }\n if (typeof (step as any).duration === \"number\") {\n const optionCode = options([\"type\", \"duration\"]);\n return withOptions(`${prefix}wait(${(step as any).duration}`, optionCode);\n }\n return this.formatValue(step);\n }\n case \"scroll\": {\n const optionCode = options([\"type\", \"target\"]);\n if ((step as any).target) return withOptions(`${prefix}scroll(${target()}`, optionCode);\n return `${prefix}scroll(${optionCode})`;\n }\n case \"scrollTo\":\n return `${prefix}scrollTo(${(step as any).x}, ${(step as any).y}, ${this.formatValue(\n (step as any).behavior ?? \"smooth\"\n )})`;\n case \"select\": {\n const optionCode = options([\"type\", \"target\", \"value\"]);\n return withOptions(\n `${prefix}select(${target()}, ${this.formatValue((step as any).value)}`,\n optionCode\n );\n }\n case \"hover\": {\n const duration = (step as any).duration;\n const optionCode = options([\"type\", \"target\", \"duration\"]);\n const base = `${prefix}hover(${target()}${duration === undefined ? \"\" : `, ${duration}`}`;\n return withOptions(base, optionCode);\n }\n case \"press\": {\n const optionCode = options([\"type\", \"key\"]);\n return withOptions(`${prefix}press(${this.formatValue((step as any).key)}`, optionCode);\n }\n case \"caption\":\n return `${prefix}caption(${this.formatValue((step as any).options)}${\n (step as any).target ? `, ${target()}` : \"\"\n })`;\n case \"drag\": {\n const optionCode = options([\"type\", \"source\", \"target\"]);\n return withOptions(\n `${prefix}drag(${this.formatValue((step as any).source)}, ${target()}`,\n optionCode\n );\n }\n default:\n return this.formatValue(step);\n }\n }\n\n private static formatOptions(step: DemoStep, excluded: string[]): string {\n const picked = this.pickOptions(step, excluded);\n return Object.keys(picked).length ? this.formatValue(picked) : \"\";\n }\n\n private static pickOptions(step: DemoStep, excluded: string[]): Record<string, unknown> {\n return Object.fromEntries(\n Object.entries(step).filter(([key, value]) => !excluded.includes(key) && value !== undefined)\n );\n }\n\n private static formatValue(value: unknown): string {\n const serialized = JSON.stringify(value);\n if (serialized === undefined) {\n throw new TypeError(\"Scenario contains a value that cannot be exported as code.\");\n }\n return serialized;\n }\n}\n","import { EventRecorder, type RecorderOptions } from \"./capture/EventRecorder\";\nimport { ScenarioSerializer } from \"./serialization/ScenarioSerializer\";\nimport type { DemoScenario } from \"@demoghost/core\";\n\nexport { EventRecorder } from \"./capture/EventRecorder\";\nexport type { RecorderOptions } from \"./capture/EventRecorder\";\nexport { SelectorGenerator } from \"./selector/SelectorGenerator\";\nexport type { SelectorOptions } from \"./selector/SelectorGenerator\";\nexport { PrivacyMasker } from \"./privacy/PrivacyMasker\";\nexport type { PrivacyOptions } from \"./privacy/PrivacyMasker\";\nexport { ScenarioSerializer } from \"./serialization/ScenarioSerializer\";\n\nexport class DemoGhostRecorder {\n public static record(options: RecorderOptions = {}): EventRecorder {\n const recorder = new EventRecorder(options);\n recorder.start();\n return recorder;\n }\n\n public static serialize(scenario: DemoScenario): string {\n return ScenarioSerializer.serialize(scenario);\n }\n\n public static deserialize(json: string): DemoScenario {\n return ScenarioSerializer.deserialize(json);\n }\n\n public static toTypeScript(scenario: DemoScenario): string {\n return ScenarioSerializer.toTypeScript(scenario);\n }\n\n public static toJavaScript(scenario: DemoScenario): string {\n return ScenarioSerializer.toJavaScript(scenario);\n }\n}\n","import type { PlaybackControllerInterface, PlaybackEvents } from \"@demoghost/core\";\nimport \"./styles/controls.css\";\n\nexport interface ControlsOptions {\n container?: HTMLElement;\n showStepBadge?: boolean;\n showProgress?: boolean;\n showSpeed?: boolean;\n}\n\nexport class DemoGhostControls {\n private controller: PlaybackControllerInterface;\n private options: ControlsOptions;\n private rootElement: HTMLElement | null = null;\n private unsubs: Array<() => void> = [];\n\n constructor(controller: PlaybackControllerInterface, options: ControlsOptions = {}) {\n this.controller = controller;\n this.options = {\n showStepBadge: true,\n showProgress: true,\n showSpeed: true,\n ...options\n };\n\n this.mount();\n this.bindEvents();\n }\n\n private mount(): void {\n if (typeof document === \"undefined\") return;\n\n const container = this.options.container || document.body;\n\n this.rootElement = document.createElement(\"div\");\n this.rootElement.className = \"dg-controls-container\";\n this.rootElement.setAttribute(\"role\", \"region\");\n this.rootElement.setAttribute(\"aria-label\", \"Demo playback controls\");\n\n this.render();\n container.appendChild(this.rootElement);\n }\n\n private render(): void {\n if (!this.rootElement) return;\n\n const total = this.controller.totalSteps;\n const current = Math.min(this.controller.currentStep + 1, total);\n const progressPct = total > 0 ? (current / total) * 100 : 0;\n const isPlaying = this.controller.state === \"playing\";\n\n this.rootElement.innerHTML = `\n <div class=\"dg-controls-hud dg-glass-panel\">\n <div class=\"dg-controls-header\">\n <div class=\"dg-controls-title\" id=\"dg-controls-title\">Interactive Demo</div>\n ${this.options.showStepBadge ? `<div class=\"dg-controls-step-badge\" id=\"dg-controls-step\">${current} / ${total}</div>` : \"\"}\n </div>\n ${\n this.options.showProgress\n ? `\n <div class=\"dg-controls-progress\">\n <div class=\"dg-controls-progress-bar\" id=\"dg-controls-bar\" style=\"width: ${progressPct}%\"></div>\n </div>\n `\n : \"\"\n }\n <div class=\"dg-controls-buttons\">\n <button type=\"button\" class=\"dg-btn\" id=\"dg-btn-prev\" aria-label=\"Previous step\">\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><polygon points=\"19 20 9 12 19 4 19 20\"></polygon><line x1=\"5\" y1=\"19\" x2=\"5\" y2=\"4\"></line></svg>\n </button>\n <button type=\"button\" class=\"dg-btn dg-btn--play\" id=\"dg-btn-toggle\" aria-label=\"${isPlaying ? \"Pause\" : \"Play\"}\">\n ${\n isPlaying\n ? `<svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><rect x=\"6\" y=\"4\" width=\"4\" height=\"16\"></rect><rect x=\"14\" y=\"4\" width=\"4\" height=\"16\"></rect></svg>`\n : `<svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><polygon points=\"5 3 19 12 5 21 5 3\"></polygon></svg>`\n }\n </button>\n <button type=\"button\" class=\"dg-btn\" id=\"dg-btn-next\" aria-label=\"Next step\">\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><polygon points=\"5 4 15 12 5 20 5 4\"></polygon><line x1=\"19\" y1=\"5\" x2=\"19\" y2=\"19\"></line></svg>\n </button>\n <button type=\"button\" class=\"dg-btn\" id=\"dg-btn-restart\" aria-label=\"Restart demo\">\n <svg width=\"17\" height=\"17\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><polyline points=\"23 4 23 10 17 10\"></polyline><path d=\"M20.49 15a9 9 0 1 1-2.12-9.36L23 10\"></path></svg>\n </button>\n ${\n this.options.showSpeed\n ? `\n <select class=\"dg-speed-select\" id=\"dg-speed\" aria-label=\"Playback speed\">\n <option value=\"0.5\">0.5x</option>\n <option value=\"1\" selected>1x</option>\n <option value=\"1.5\">1.5x</option>\n <option value=\"2\">2x</option>\n </select>\n `\n : \"\"\n }\n <button type=\"button\" class=\"dg-btn\" id=\"dg-btn-close\" aria-label=\"Close demo\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line></svg>\n </button>\n </div>\n </div>\n `;\n\n this.attachListeners();\n }\n\n private attachListeners(): void {\n if (!this.rootElement) return;\n\n const prevBtn = this.rootElement.querySelector(\"#dg-btn-prev\");\n const toggleBtn = this.rootElement.querySelector(\"#dg-btn-toggle\");\n const nextBtn = this.rootElement.querySelector(\"#dg-btn-next\");\n const restartBtn = this.rootElement.querySelector(\"#dg-btn-restart\");\n const closeBtn = this.rootElement.querySelector(\"#dg-btn-close\");\n const speedSel = this.rootElement.querySelector(\"#dg-speed\") as HTMLSelectElement;\n\n prevBtn?.addEventListener(\"click\", () => this.controller.previous());\n nextBtn?.addEventListener(\"click\", () => this.controller.next());\n toggleBtn?.addEventListener(\"click\", () => {\n if (this.controller.state === \"playing\") {\n this.controller.pause();\n } else if (this.controller.state === \"paused\") {\n this.controller.resume();\n } else if (this.controller.state === \"idle\") {\n void this.controller.play();\n } else {\n void this.controller.restart();\n }\n });\n restartBtn?.addEventListener(\"click\", () => this.controller.restart());\n closeBtn?.addEventListener(\"click\", () => this.controller.stop());\n\n speedSel?.addEventListener(\"change\", () => {\n const spd = parseFloat(speedSel.value);\n this.controller.speed = spd;\n });\n }\n\n private bindEvents(): void {\n const onStep = (data: PlaybackEvents[\"step:start\"]) => {\n const stepBadge = this.rootElement?.querySelector(\"#dg-controls-step\");\n if (stepBadge) {\n stepBadge.textContent = `${data.index + 1} / ${data.total}`;\n }\n const progressBar = this.rootElement?.querySelector(\"#dg-controls-bar\") as HTMLElement;\n if (progressBar) {\n const pct = ((data.index + 1) / data.total) * 100;\n progressBar.style.width = `${pct}%`;\n }\n const titleEl = this.rootElement?.querySelector(\"#dg-controls-title\");\n if (titleEl) {\n const stepCaption =\n typeof data.step.caption === \"string\"\n ? data.step.caption\n : data.step.caption?.title || data.step.type;\n titleEl.textContent = stepCaption;\n }\n };\n\n const onStateChange = () => {\n const toggleBtn = this.rootElement?.querySelector(\"#dg-btn-toggle\");\n if (!toggleBtn) return;\n const isPlaying = this.controller.state === \"playing\";\n toggleBtn.setAttribute(\"aria-label\", isPlaying ? \"Pause\" : \"Play\");\n toggleBtn.innerHTML = isPlaying\n ? `<svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><rect x=\"6\" y=\"4\" width=\"4\" height=\"16\"></rect><rect x=\"14\" y=\"4\" width=\"4\" height=\"16\"></rect></svg>`\n : `<svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><polygon points=\"5 3 19 12 5 21 5 3\"></polygon></svg>`;\n };\n\n const onClose = () => {\n this.destroy(true);\n };\n\n this.unsubs.push(this.controller.on(\"start\", onStateChange));\n this.unsubs.push(this.controller.on(\"step:start\", onStep));\n this.unsubs.push(this.controller.on(\"pause\", onStateChange));\n this.unsubs.push(this.controller.on(\"resume\", onStateChange));\n this.unsubs.push(this.controller.on(\"complete\", onClose));\n this.unsubs.push(this.controller.on(\"stop\", onClose));\n }\n\n public destroy(immediate = false): void {\n this.unsubs.forEach(u => u());\n this.unsubs = [];\n\n if (this.rootElement && this.rootElement.parentNode) {\n if (immediate) {\n this.rootElement.parentNode.removeChild(this.rootElement);\n this.rootElement = null;\n } else {\n const el = this.rootElement;\n el.classList.add(\"dg-controls-container--hidden\");\n setTimeout(() => {\n if (el && el.parentNode) {\n el.parentNode.removeChild(el);\n }\n }, 300);\n this.rootElement = null;\n }\n }\n }\n}\n\nexport function attachControls(\n controller: PlaybackControllerInterface,\n options?: ControlsOptions\n): DemoGhostControls {\n return new DemoGhostControls(controller, options);\n}\n","import {\n DemoGhostCore,\n type DemoScenario,\n type DemoStep,\n type PlaybackOptions,\n type DemoGhostConfig,\n type PlaybackEvents,\n PlaybackController\n} from \"../../core/src/index\";\nimport { DemoGhostRecorder, EventRecorder, type RecorderOptions } from \"../../recorder/src/index\";\nimport { DemoGhostControls } from \"../../controls/src/index\";\nimport \"./styles.css\";\n\nimport * as actionCreators from \"../../core/src/index\";\n\n// Re-export all core exports\nexport * from \"../../core/src/index\";\n// Re-export recorder\nexport * from \"../../recorder/src/index\";\n// Re-export controls\nexport * from \"../../controls/src/index\";\n\nexport class DemoGhost {\n public static actions = DemoGhostCore.actions;\n\n public static configure(config: DemoGhostConfig): void {\n DemoGhostCore.configure(config);\n }\n\n public static play(\n scenarioOrSteps: DemoScenario | DemoStep[],\n options: PlaybackOptions = {}\n ): PlaybackController {\n const controller = DemoGhostCore.play(scenarioOrSteps, options);\n\n // Auto-attach controls HUD if options.controls !== false\n if (options.controls !== false) {\n new DemoGhostControls(controller, {\n container: options.container\n });\n }\n\n return controller;\n }\n\n public static record(options: RecorderOptions = {}): EventRecorder {\n return DemoGhostRecorder.record(options);\n }\n\n public static create(scenario: DemoScenario, defaultOptions: PlaybackOptions = {}) {\n return {\n play: (options: PlaybackOptions = {}) =>\n DemoGhost.play(scenario, { ...defaultOptions, ...options })\n };\n }\n\n public static serialize(scenario: DemoScenario): string {\n return DemoGhostRecorder.serialize(scenario);\n }\n\n public static deserialize(json: string): DemoScenario {\n return DemoGhostRecorder.deserialize(json);\n }\n\n public static toTypeScript(scenario: DemoScenario): string {\n return DemoGhostRecorder.toTypeScript(scenario);\n }\n\n public static toJavaScript(scenario: DemoScenario): string {\n return DemoGhostRecorder.toJavaScript(scenario);\n }\n\n public static export(scenario: DemoScenario, format: \"json\" | \"ts\" | \"js\" = \"json\"): string {\n if (format === \"ts\") return DemoGhost.toTypeScript(scenario);\n if (format === \"js\") return DemoGhost.toJavaScript(scenario);\n return DemoGhost.serialize(scenario);\n }\n\n public static on<K extends keyof PlaybackEvents>(\n event: K,\n listener: (data: PlaybackEvents[K]) => void\n ): () => void {\n return DemoGhostCore.on(event, listener);\n }\n\n public static off<K extends keyof PlaybackEvents>(\n event: K,\n listener: (data: PlaybackEvents[K]) => void\n ): void {\n DemoGhostCore.off(event, listener);\n }\n\n // Direct action creator attachments for CDN / Global access\n public static move = actionCreators.move;\n public static click = actionCreators.click;\n public static doubleClick = actionCreators.doubleClick;\n public static rightClick = actionCreators.rightClick;\n public static type = actionCreators.type;\n public static clear = actionCreators.clear;\n public static focus = actionCreators.focus;\n public static blur = actionCreators.blur;\n public static wait = actionCreators.wait;\n public static waitFor = actionCreators.waitFor;\n public static scroll = actionCreators.scroll;\n public static scrollTo = actionCreators.scrollTo;\n public static select = actionCreators.select;\n public static check = actionCreators.check;\n public static uncheck = actionCreators.uncheck;\n public static hover = actionCreators.hover;\n public static press = actionCreators.press;\n public static highlight = actionCreators.highlight;\n public static caption = actionCreators.caption;\n public static drag = actionCreators.drag;\n}\n\n// Global browser window attachment for CDN\nif (typeof window !== \"undefined\") {\n (window as any).DemoGhost = DemoGhost;\n // Also attach individual functions to global scope for easy inline script tags if needed\n (window as any).dg = DemoGhost;\n}\n\nexport default DemoGhost;\n"],"names":["DemoGhostError","message","DemoGhostTargetNotFoundError","target","timeout","stepIndex","stepMsg","__publicField","DemoGhostTimeoutError","condition","DemoGhostPlaybackError","DemoGhostRecordingError","DemoGhostConfigurationError","ActionRegistry","type","handler","getElementCenter","el","rect","isInteractive","tag","role","calculateKeystrokeDelay","speed","deterministic","setNativeProperty","element","property","value","prototype","descriptor","dispatchValueEvents","includeChange","waitForDuration","ctx","duration","scaleWithPlayback","playbackSpeed","remaining","slice","startedAt","resolve","onAbort","timer","registerBuiltinActions","registry","step","targetPos","inputEl","text","i","char","delay","start","state","x","y","values","option","targetEl","sourceEl","sourcePos","TargetResolver","defaultTimeout","signal","norm","selector","opts","customTimeout","targetTimeout","query","direct","resolved","observer","frame","cleanup","check","match","id","shadowMatch","baseSelector","isExact","mode","lowerText","candidates","matching","content","a","b","root","children","child","found","foundInChild","naturalHumanEase","t","cubicBezierPoint","p0","p1","p2","p3","u","tt","uu","uuu","ttt","generateNaturalTrajectory","end","dx","dy","dist","nx","ny","maxArc","factor","direction","arc1","arc2","cp1","cp2","CursorEngine","options","trajectory","startTime","now","elapsed","progress","currentPoint","_button","ripple","callback","pt","ScrollEngine","config","customOffset","offset","windowHeight","windowWidth","isVisibleY","isVisibleX","currentScrollY","targetY","behavior","startY","startX","lastY","lastX","checkCount","maxChecks","interval","currY","currX","SpotlightEngine","container","captionOpts","pad","innerHtml","pos","top","left","str","div","THEME_PRESETS","ThemeManager","theme","resolvedTheme","AccessibilityManager","EventEmitter","event","listener","list","l","data","err","PlaybackController","scenario","actionRegistry","emitter","reject","val","_a","index","captionText","capOpts","context","msg","args","activeRun","_b","onfulfilled","onrejected","move","click","doubleClick","rightClick","clear","focus","blur","wait","durationOrCondition","waitFor","targetOrSelectorOrCondition","scroll","targetOrOptions","scrollTo","select","uncheck","hover","press","key","highlight","caption","textOrOptions","drag","source","_DemoGhostCore","scenarioOrSteps","mergedOptions","controller","defaultOptions","DemoGhostCore","SelectorGenerator","demoghostId","idSelector","attr","sel","semanticAttrs","roleSel","ariaLabel","roleWithLabel","textSel","inputType","typeSel","classSelector","contextualSel","parent","candidate","classes","c","candidateWithClass","cls","combined","path","current","depth","segment","siblings","testSel","PrivacyMasker","sensitiveText","attribute","sensitiveKeywords","keyword","originalValue","EventRecorder","_c","e","minWait","waitTime","maskedVal","selectEl","scrollY","scrollX","BUILTIN_ACTIONS","ScenarioSerializer","_key","json","parsed","usedActions","stepLines","imports","prefix","excluded","withOptions","base","optionCode","waitForOptions","picked","serialized","DemoGhostRecorder","recorder","DemoGhostControls","total","progressPct","isPlaying","prevBtn","toggleBtn","nextBtn","restartBtn","closeBtn","speedSel","spd","onStep","stepBadge","progressBar","pct","titleEl","stepCaption","_d","onStateChange","onClose","immediate","attachControls","_DemoGhost","format","actionCreators.move","actionCreators.click","actionCreators.doubleClick","actionCreators.rightClick","actionCreators.type","actionCreators.clear","actionCreators.focus","actionCreators.blur","actionCreators.wait","actionCreators.waitFor","actionCreators.scroll","actionCreators.scrollTo","actionCreators.select","actionCreators.check","actionCreators.uncheck","actionCreators.hover","actionCreators.press","actionCreators.highlight","actionCreators.caption","actionCreators.drag","DemoGhost"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
:root{--demoghost-accent: #6366f1;--demoghost-cursor: #0f172a;--demoghost-glass-bg: rgba(255, 255, 255, .75);--demoghost-border: rgba(226, 232, 240, .8);--demoghost-text: #0f172a;--demoghost-shadow: 0 20px 40px -15px rgba(0, 0, 0, .08);--demoghost-z-index-cursor: 999999;--demoghost-z-index-overlay: 999990}.dg-sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.dg-cursor{position:fixed;top:0;left:0;width:32px;height:32px;pointer-events:none;z-index:var(--demoghost-z-index-cursor, 999999);will-change:transform;transition:transform .05s linear,opacity .2s ease;-webkit-user-select:none;user-select:none}.dg-cursor-svg{filter:drop-shadow(0 2px 5px rgba(0,0,0,.25));transition:transform .12s cubic-bezier(.34,1.56,.64,1)}.dg-cursor--active .dg-cursor-svg{transform:scale(.85)}.dg-cursor-dot{width:16px;height:16px;background-color:var(--demoghost-accent, #6366f1);border:2px solid #ffffff;border-radius:50%;box-shadow:0 2px 8px #00000040;transition:transform .12s ease}.dg-cursor--active .dg-cursor-dot{transform:scale(.75)}.dg-touch-orb{width:44px;height:44px;border-radius:50%;background:radial-gradient(circle,rgba(99,102,241,.35) 0%,rgba(99,102,241,.1) 70%,transparent 100%);border:2px solid rgba(255,255,255,.85);box-shadow:0 4px 15px #6366f166;display:flex;align-items:center;justify-content:center;transform:translate(-50%,-50%);transition:transform .15s ease,background-color .15s ease}.dg-touch-inner{width:16px;height:16px;border-radius:50%;background-color:var(--demoghost-accent, #6366f1);box-shadow:0 0 10px #6366f1cc}.dg-cursor--active .dg-touch-orb{transform:translate(-50%,-50%) scale(1.25);background:radial-gradient(circle,rgba(99,102,241,.55) 0%,rgba(99,102,241,.2) 70%,transparent 100%)}.dg-click-ripple{position:fixed;width:40px;height:40px;margin-left:-20px;margin-top:-20px;border-radius:50%;border:2px solid var(--demoghost-accent, #6366f1);background-color:#6366f133;pointer-events:none;z-index:calc(var(--demoghost-z-index-cursor, 999999) - 1);animation:dg-ripple-anim .5s cubic-bezier(.1,.8,.3,1) forwards}@keyframes dg-ripple-anim{0%{transform:scale(.2);opacity:1}to{transform:scale(2);opacity:0}}.dg-spotlight-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;background-color:#0f172a80;backdrop-filter:blur(2px);-webkit-backdrop-filter:blur(2px);pointer-events:none;z-index:var(--demoghost-z-index-overlay, 999990);transition:clip-path .3s ease}.dg-highlight-glow{outline:2px solid var(--demoghost-accent, #6366f1)!important;outline-offset:4px;box-shadow:0 0 20px #6366f173!important;transition:box-shadow .3s ease;position:relative;z-index:calc(var(--demoghost-z-index-overlay, 999990) + 2)}.dg-highlight-outline{outline:2px dashed var(--demoghost-accent, #6366f1)!important;outline-offset:4px;position:relative;z-index:calc(var(--demoghost-z-index-overlay, 999990) + 2)}.dg-highlight-pulse{animation:dg-pulse 1.5s infinite;position:relative;z-index:calc(var(--demoghost-z-index-overlay, 999990) + 2)}@keyframes dg-pulse{0%{box-shadow:0 0 #6366f199}70%{box-shadow:0 0 0 12px #6366f100}to{box-shadow:0 0 #6366f100}}.dg-glass-panel{background:var(--demoghost-glass-bg, rgba(255, 255, 255, .75));backdrop-filter:blur(16px);-webkit-backdrop-filter:blur(16px);border:1px solid var(--demoghost-border, rgba(226, 232, 240, .8));box-shadow:var(--demoghost-shadow, 0 20px 40px -15px rgba(0, 0, 0, .08));border-radius:14px}.dg-caption{position:fixed;padding:12px 18px;max-width:320px;z-index:calc(var(--demoghost-z-index-overlay, 999990) + 5);pointer-events:none;opacity:0;transform:translateY(8px);transition:opacity .25s ease,transform .25s ease;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}.dg-caption--visible{opacity:1}.dg-caption-title{font-weight:600;font-size:14px;margin-bottom:4px;color:var(--demoghost-text, #0f172a)}.dg-caption-text{font-size:13px;line-height:1.45;color:var(--demoghost-text, #0f172a);opacity:.9}.dg-controls-container{position:fixed;bottom:24px;left:50%;transform:translate(-50%);z-index:calc(var(--demoghost-z-index-overlay, 999990) + 10);transition:transform .35s cubic-bezier(.16,1,.3,1),opacity .3s ease;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,sans-serif;-webkit-user-select:none;user-select:none}.dg-controls-container--hidden{transform:translate(-50%) translateY(40px);opacity:0;pointer-events:none}.dg-controls-hud{min-width:380px;max-width:90vw;padding:12px 18px;border-radius:20px;background:var(--demoghost-glass-bg, rgba(255, 255, 255, .72));backdrop-filter:blur(24px) saturate(190%);-webkit-backdrop-filter:blur(24px) saturate(190%);border:1px solid var(--demoghost-border, rgba(255, 255, 255, .45));box-shadow:0 20px 50px #0000001f,0 0 0 1px #fff3 inset;color:var(--demoghost-text, #0f172a);display:flex;flex-direction:column;gap:10px}.dg-controls-header{display:flex;align-items:center;justify-content:space-between;gap:12px}.dg-controls-title{font-size:13px;font-weight:600;letter-spacing:-.01em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--demoghost-text, #0f172a)}.dg-controls-step-badge{font-size:12px;font-weight:500;opacity:.7;white-space:nowrap;font-variant-numeric:tabular-nums}.dg-controls-progress{width:100%;height:4px;background:#00000014;border-radius:4px;overflow:hidden;position:relative}.dg-controls-progress-bar{height:100%;background:var(--demoghost-accent, #6366f1);border-radius:4px;transition:width .3s ease}.dg-controls-buttons{display:flex;align-items:center;justify-content:center;gap:10px}.dg-btn{background:transparent;border:none;outline:none;cursor:pointer;padding:6px;border-radius:10px;color:var(--demoghost-text, #0f172a);opacity:.85;display:flex;align-items:center;justify-content:center;transition:all .15s ease}.dg-btn:hover{opacity:1;background:#0000000f;transform:scale(1.05)}.dg-btn:active{transform:scale(.95)}.dg-btn--play{width:36px;height:36px;background:var(--demoghost-accent, #6366f1);color:#fff;border-radius:50%;box-shadow:0 4px 12px #6366f159;opacity:1}.dg-btn--play:hover{background:var(--demoghost-accent, #6366f1);box-shadow:0 6px 16px #6366f180;filter:brightness(1.08)}.dg-speed-select{background:transparent;border:1px solid rgba(0,0,0,.12);border-radius:8px;padding:3px 6px;font-size:11px;font-weight:600;color:var(--demoghost-text, #0f172a);cursor:pointer;outline:none;transition:border-color .15s ease}.dg-speed-select:hover{border-color:var(--demoghost-accent, #6366f1)}@media(max-width:480px){.dg-controls-hud{min-width:92vw;padding:10px 14px}}
|