@guidelytech/guide-runtime 0.9.0 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/position.ts","../src/render.ts","../src/controller.ts","../src/checklist.ts","../src/survey.ts","../src/resource-center.ts","../src/authoring.ts"],"sourcesContent":["import { arrow, autoPlacement, autoUpdate, computePosition, flip, offset, shift, type Placement as FuiPlacement } from \"@floating-ui/dom\";\nimport type { Placement } from \"@guidelytech/shared\";\n\nexport interface AnchorOptions {\n placement?: Placement;\n offset?: number;\n arrowEl?: HTMLElement | null;\n /** Called after every position update. */\n onUpdate?: (placement: FuiPlacement) => void;\n}\n\n/**\n * Anchors `floating` next to `reference` using floating-ui (`flip`, `shift`, `offset`, `arrow`).\n * `placement: \"auto\"` uses `autoPlacement`. Returns a cleanup function that stops `autoUpdate`.\n */\nexport function anchor(reference: Element, floating: HTMLElement, options: AnchorOptions = {}): () => void {\n const placement = options.placement ?? \"auto\";\n const gap = options.offset ?? 10;\n const middleware = [offset(gap + (options.arrowEl ? 4 : 0))];\n if (placement === \"auto\") middleware.push(autoPlacement({ padding: 16 }));\n else middleware.push(flip({ padding: 16 }));\n middleware.push(shift({ padding: 16 }));\n if (options.arrowEl) middleware.push(arrow({ element: options.arrowEl, padding: 8 }));\n let stopped = false;\n const update = async () => {\n if (stopped || !floating.isConnected) return;\n try {\n const result = await computePosition(reference, floating, {\n placement: placement === \"auto\" ? \"bottom\" : placement,\n strategy: \"fixed\",\n middleware,\n });\n if (stopped) return;\n floating.style.left = `${Math.round(result.x)}px`;\n floating.style.top = `${Math.round(result.y)}px`;\n floating.setAttribute(\"data-placement\", result.placement);\n if (options.arrowEl && result.middlewareData.arrow) {\n const { x, y } = result.middlewareData.arrow;\n const side = result.placement.split(\"-\")[0];\n const staticSide = { top: \"bottom\", right: \"left\", bottom: \"top\", left: \"right\" }[side as \"top\" | \"right\" | \"bottom\" | \"left\"];\n Object.assign(options.arrowEl.style, {\n left: x != null ? `${x}px` : \"\",\n top: y != null ? `${y}px` : \"\",\n right: \"\",\n bottom: \"\",\n [staticSide]: \"-7px\",\n });\n }\n options.onUpdate?.(result.placement);\n } catch {\n /* positioning must never crash the host */\n }\n };\n let stopAuto: (() => void) | null = null;\n try {\n stopAuto = autoUpdate(reference, floating, () => void update(), { animationFrame: false });\n } catch {\n void update();\n }\n return () => {\n stopped = true;\n stopAuto?.();\n };\n}\n\n/** Tracks the bounding rect of an element and calls `cb` on scroll/resize/mutation. */\nexport function trackRect(el: Element, cb: (rect: DOMRect) => void): () => void {\n let raf = 0;\n let stopped = false;\n const run = () => {\n if (stopped) return;\n cb(el.getBoundingClientRect());\n };\n const schedule = () => {\n if (stopped) return;\n if (typeof requestAnimationFrame === \"function\") {\n cancelAnimationFrame(raf);\n raf = requestAnimationFrame(run);\n } else run();\n };\n run();\n const win = el.ownerDocument.defaultView;\n win?.addEventListener(\"scroll\", schedule, true);\n win?.addEventListener(\"resize\", schedule);\n let ro: ResizeObserver | null = null;\n if (typeof ResizeObserver !== \"undefined\") {\n try {\n ro = new ResizeObserver(schedule);\n ro.observe(el);\n if (el.ownerDocument.documentElement) ro.observe(el.ownerDocument.documentElement);\n } catch {\n ro = null;\n }\n }\n const interval = setInterval(run, 500);\n return () => {\n stopped = true;\n win?.removeEventListener(\"scroll\", schedule, true);\n win?.removeEventListener(\"resize\", schedule);\n ro?.disconnect();\n clearInterval(interval);\n if (typeof cancelAnimationFrame === \"function\") cancelAnimationFrame(raf);\n };\n}\n","import { visibleButtons, type GuideStep, type StepButton } from \"@guidelytech/shared\";\nimport { anchor, trackRect } from \"./position\";\nimport { setSanitizedHtml } from \"./sanitize\";\n\nexport interface RenderStepOptions {\n /** Themed scope element inside the shadow root. */\n scope: HTMLElement;\n step: GuideStep;\n index: number;\n total: number;\n /** Whether a \"back\" action has a step to return to; back buttons are hidden otherwise. */\n canGoBack?: boolean;\n target?: Element | null;\n /** Render anchored steps as a centered modal (target fallback). */\n asModal?: boolean;\n onButton: (button: StepButton) => void;\n /** Close button / Escape / outside click. */\n onClose: () => void;\n /** Called when a hotspot is expanded. */\n onOpen?: () => void;\n announce?: (text: string) => void;\n}\n\nexport interface StepView {\n /** Root element of the rendered step (card, banner, hotspot...). */\n el: HTMLElement;\n /** Element that received focus (card), when any. */\n card: HTMLElement | null;\n destroy(): void;\n}\n\nconst FOCUSABLE = \"button:not([disabled]),[href],input:not([disabled]),select:not([disabled]),textarea:not([disabled]),[tabindex]:not([tabindex='-1'])\";\nlet uid = 0;\nconst nextId = (p: string) => `g-${p}-${++uid}`;\n\nfunction h<K extends keyof HTMLElementTagNameMap>(doc: Document, tag: K, className?: string, text?: string): HTMLElementTagNameMap[K] {\n const el = doc.createElement(tag);\n if (className) el.className = className;\n if (text != null) el.textContent = text;\n return el;\n}\n\nfunction buildButtons(doc: Document, step: GuideStep, canGoBack: boolean, onButton: (b: StepButton) => void): HTMLElement[] {\n return visibleButtons(step, canGoBack).map((b) => {\n const btn = h(doc, \"button\", `g-btn g-btn-${b.variant}`, b.label);\n btn.type = \"button\";\n btn.setAttribute(\"data-action\", b.action);\n btn.addEventListener(\"click\", (e) => {\n e.preventDefault();\n onButton(b);\n });\n return btn;\n });\n}\n\n/** Builds the shared chrome: close, image, title, body, progress and buttons. */\nexport function buildCard(doc: Document, opts: RenderStepOptions, extraClass: string): { card: HTMLElement; inner: HTMLElement; titleId: string; bodyId: string } {\n const { step } = opts;\n const card = h(doc, \"div\", `g-card ${extraClass}`);\n card.tabIndex = -1;\n card.setAttribute(\"data-step-id\", step.id);\n if (step.width) card.style.width = `min(${step.width}px, calc(100vw - 32px))`;\n const titleId = nextId(\"title\");\n const bodyId = nextId(\"body\");\n if (step.imageUrl) {\n const img = h(doc, \"img\", \"g-image\");\n img.src = step.imageUrl;\n img.alt = \"\";\n card.appendChild(img);\n }\n const inner = h(doc, \"div\", \"g-inner\");\n if (step.showClose) {\n const close = h(doc, \"button\", \"g-close\", \"×\");\n close.type = \"button\";\n close.setAttribute(\"aria-label\", \"Close\");\n close.addEventListener(\"click\", (e) => {\n e.preventDefault();\n opts.onClose();\n });\n card.appendChild(close);\n }\n if (step.title) {\n const t = h(doc, \"h2\", \"g-title\", step.title);\n t.id = titleId;\n inner.appendChild(t);\n }\n if (step.body) {\n const b = h(doc, \"div\", \"g-body\");\n b.id = bodyId;\n setSanitizedHtml(b, step.body);\n inner.appendChild(b);\n }\n const buttons = buildButtons(doc, step, opts.canGoBack ?? opts.index > 0, opts.onButton);\n if (buttons.length || (step.showProgress && opts.total > 1)) {\n const footer = h(doc, \"div\", \"g-footer\");\n if (step.showProgress && opts.total > 1) footer.appendChild(h(doc, \"span\", \"g-progress\", `${opts.index + 1} of ${opts.total}`));\n buttons.forEach((b) => footer.appendChild(b));\n inner.appendChild(footer);\n }\n card.appendChild(inner);\n if (step.title) card.setAttribute(\"aria-labelledby\", titleId);\n if (step.body) card.setAttribute(\"aria-describedby\", bodyId);\n return { card, inner, titleId, bodyId };\n}\n\nfunction focusables(root: HTMLElement): HTMLElement[] {\n return Array.from(root.querySelectorAll<HTMLElement>(FOCUSABLE));\n}\n\n/** Keyboard handling: Escape closes (when allowed), Tab is trapped inside modals. */\nfunction installKeyboard(card: HTMLElement, step: GuideStep, trap: boolean, onClose: () => void): () => void {\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\" && step.showClose) {\n e.stopPropagation();\n onClose();\n return;\n }\n if (trap && e.key === \"Tab\") {\n const items = focusables(card);\n if (!items.length) {\n e.preventDefault();\n card.focus();\n return;\n }\n const first = items[0] as HTMLElement;\n const last = items[items.length - 1] as HTMLElement;\n const active = (card.getRootNode() as ShadowRoot | Document).activeElement;\n if (e.shiftKey && (active === first || active === card)) {\n e.preventDefault();\n last.focus();\n } else if (!e.shiftKey && active === last) {\n e.preventDefault();\n first.focus();\n }\n }\n };\n card.addEventListener(\"keydown\", onKey);\n return () => card.removeEventListener(\"keydown\", onKey);\n}\n\nfunction focusInto(card: HTMLElement): () => void {\n const doc = card.ownerDocument;\n const previous = doc.activeElement as HTMLElement | null;\n const primary = card.querySelector<HTMLElement>(\".g-btn-primary\") || focusables(card)[0] || card;\n try {\n primary.focus({ preventScroll: true });\n } catch {\n /* ignore */\n }\n return () => {\n try {\n if (previous && previous.isConnected && typeof previous.focus === \"function\") previous.focus({ preventScroll: true });\n } catch {\n /* ignore */\n }\n };\n}\n\nfunction overlayEl(doc: Document, opts: RenderStepOptions, transparent = false): HTMLElement {\n const overlay = h(doc, \"div\", `g-overlay${transparent ? \" g-transparent\" : \"\"}`);\n if (opts.step.dismissOnOutsideClick) overlay.addEventListener(\"click\", () => opts.onClose());\n return overlay;\n}\n\nfunction positionClass(position: GuideStep[\"position\"]): string {\n return `g-pos-${position}`;\n}\n\nexport function renderModal(doc: Document, opts: RenderStepOptions): StepView {\n const cleanups: Array<() => void> = [];\n const { card } = buildCard(doc, opts, \"g-modal\");\n card.setAttribute(\"role\", \"dialog\");\n card.setAttribute(\"aria-modal\", \"true\");\n const wrapper = h(doc, \"div\", \"g-step\");\n if (opts.step.showOverlay || opts.asModal) wrapper.appendChild(overlayEl(doc, opts));\n else if (opts.step.dismissOnOutsideClick) wrapper.appendChild(overlayEl(doc, opts, true));\n wrapper.appendChild(card);\n opts.scope.appendChild(wrapper);\n cleanups.push(installKeyboard(card, opts.step, true, opts.onClose));\n cleanups.push(focusInto(card));\n return { el: wrapper, card, destroy: () => cleanupAll(cleanups, wrapper) };\n}\n\nfunction cleanupAll(cleanups: Array<() => void>, el: HTMLElement) {\n cleanups.splice(0).forEach((fn) => {\n try {\n fn();\n } catch {\n /* ignore */\n }\n });\n el.remove();\n}\n\nfunction setTargetDescribedBy(target: Element, id: string): () => void {\n const prev = target.getAttribute(\"aria-describedby\");\n try {\n target.setAttribute(\"aria-describedby\", prev ? `${prev} ${id}` : id);\n } catch {\n return () => {};\n }\n return () => {\n if (prev) target.setAttribute(\"aria-describedby\", prev);\n else target.removeAttribute(\"aria-describedby\");\n };\n}\n\nexport function renderTooltip(doc: Document, opts: RenderStepOptions, kind: \"tooltip\" | \"popover\"): StepView {\n const target = opts.target;\n if (!target) return renderModal(doc, { ...opts, asModal: true });\n const cleanups: Array<() => void> = [];\n const { card } = buildCard(doc, opts, `g-${kind}`);\n const arrowEl = h(doc, \"div\", \"g-arrow\");\n card.appendChild(arrowEl);\n card.setAttribute(\"role\", kind === \"tooltip\" ? \"tooltip\" : \"dialog\");\n card.id = nextId(kind);\n const wrapper = h(doc, \"div\", \"g-step\");\n if (opts.step.showOverlay) wrapper.appendChild(overlayEl(doc, opts));\n else if (opts.step.dismissOnOutsideClick) wrapper.appendChild(overlayEl(doc, opts, true));\n wrapper.appendChild(card);\n opts.scope.appendChild(wrapper);\n if (opts.step.target?.scrollIntoView !== false) scrollTo(target);\n cleanups.push(anchor(target, card, { placement: opts.step.placement, offset: opts.step.offset, arrowEl }));\n cleanups.push(setTargetDescribedBy(target, card.id));\n cleanups.push(installKeyboard(card, opts.step, false, opts.onClose));\n cleanups.push(focusInto(card));\n return { el: wrapper, card, destroy: () => cleanupAll(cleanups, wrapper) };\n}\n\nfunction scrollTo(target: Element) {\n try {\n target.scrollIntoView?.({ block: \"nearest\", inline: \"nearest\", behavior: \"auto\" });\n } catch {\n /* ignore */\n }\n}\n\n/** Overlay with a cut-out around the target (4 rects), so the target itself stays clickable. */\nexport function renderSpotlight(doc: Document, opts: RenderStepOptions): StepView {\n const target = opts.target;\n if (!target) return renderModal(doc, { ...opts, asModal: true });\n const cleanups: Array<() => void> = [];\n const wrapper = h(doc, \"div\", \"g-step\");\n const pad = opts.step.spotlightPadding ?? 6;\n const rects = [\"top\", \"left\", \"right\", \"bottom\"].map((side) => {\n const r = h(doc, \"div\", `g-spot-rect g-spot-${side}`);\n if (opts.step.dismissOnOutsideClick) r.addEventListener(\"click\", () => opts.onClose());\n wrapper.appendChild(r);\n return r;\n });\n const ring = h(doc, \"div\", \"g-spot-ring\");\n wrapper.appendChild(ring);\n const { card } = buildCard(doc, opts, \"g-spotlight-card\");\n card.setAttribute(\"role\", \"dialog\");\n const arrowEl = h(doc, \"div\", \"g-arrow\");\n card.appendChild(arrowEl);\n wrapper.appendChild(card);\n opts.scope.appendChild(wrapper);\n if (opts.step.target?.scrollIntoView !== false) scrollTo(target);\n const win = doc.defaultView;\n const layout = (r: DOMRect) => {\n const vw = win?.innerWidth ?? 0;\n const vh = win?.innerHeight ?? 0;\n const x = Math.max(0, r.left - pad);\n const y = Math.max(0, r.top - pad);\n const w = Math.min(vw, r.right + pad) - x;\n const hgt = Math.min(vh, r.bottom + pad) - y;\n const [top, left, right, bottom] = rects as unknown as [HTMLElement, HTMLElement, HTMLElement, HTMLElement];\n Object.assign(top.style, { left: \"0\", top: \"0\", width: \"100%\", height: `${y}px` });\n Object.assign(left.style, { left: \"0\", top: `${y}px`, width: `${x}px`, height: `${hgt}px` });\n Object.assign(right.style, { left: `${x + w}px`, top: `${y}px`, width: `${Math.max(0, vw - x - w)}px`, height: `${hgt}px` });\n Object.assign(bottom.style, { left: \"0\", top: `${y + hgt}px`, width: \"100%\", height: `${Math.max(0, vh - y - hgt)}px` });\n Object.assign(ring.style, { left: `${x}px`, top: `${y}px`, width: `${w}px`, height: `${hgt}px` });\n };\n cleanups.push(trackRect(target, layout));\n cleanups.push(anchor(target, card, { placement: opts.step.placement, offset: opts.step.offset + pad, arrowEl }));\n cleanups.push(installKeyboard(card, opts.step, false, opts.onClose));\n cleanups.push(focusInto(card));\n return { el: wrapper, card, destroy: () => cleanupAll(cleanups, wrapper) };\n}\n\n/** Pulsing dot at the target; opens an anchored card on click/hover. */\nexport function renderHotspot(doc: Document, opts: RenderStepOptions): StepView {\n const target = opts.target;\n if (!target) return renderModal(doc, { ...opts, asModal: true });\n const cleanups: Array<() => void> = [];\n const cfg = opts.step.hotspot ?? { size: 14, pulse: true, openOn: \"click\" as const };\n const wrapper = h(doc, \"div\", \"g-step\");\n const dot = h(doc, \"button\", `g-hotspot${cfg.pulse ? \" g-pulse\" : \"\"}`);\n dot.type = \"button\";\n dot.setAttribute(\"aria-label\", opts.step.title || \"Open hint\");\n dot.setAttribute(\"aria-expanded\", \"false\");\n dot.style.width = `${cfg.size}px`;\n dot.style.height = `${cfg.size}px`;\n dot.appendChild(h(doc, \"span\", \"g-hotspot-hit\"));\n wrapper.appendChild(dot);\n opts.scope.appendChild(wrapper);\n cleanups.push(trackRect(target, (r) => {\n dot.style.left = `${Math.round(r.right - cfg.size / 2)}px`;\n dot.style.top = `${Math.round(r.top - cfg.size / 2)}px`;\n }));\n let card: HTMLElement | null = null;\n let stopAnchor: (() => void) | null = null;\n let stopKeys: (() => void) | null = null;\n const close = () => {\n stopAnchor?.();\n stopKeys?.();\n card?.remove();\n card = null;\n dot.setAttribute(\"aria-expanded\", \"false\");\n };\n const open = () => {\n if (card) return;\n const built = buildCard(doc, { ...opts, onClose: () => opts.onClose() }, \"g-hotspot-card\");\n card = built.card;\n card.setAttribute(\"role\", \"dialog\");\n const arrowEl = h(doc, \"div\", \"g-arrow\");\n card.appendChild(arrowEl);\n wrapper.appendChild(card);\n stopAnchor = anchor(target, card, { placement: opts.step.placement, offset: opts.step.offset, arrowEl });\n stopKeys = installKeyboard(card, opts.step, false, close);\n dot.setAttribute(\"aria-expanded\", \"true\");\n opts.onOpen?.();\n if (cfg.openOn === \"click\") focusInto(card);\n };\n dot.addEventListener(\"click\", (e) => {\n e.preventDefault();\n if (card) close();\n else open();\n });\n if (cfg.openOn === \"hover\") {\n dot.addEventListener(\"mouseenter\", open);\n dot.addEventListener(\"focus\", open);\n }\n cleanups.push(close);\n return { el: wrapper, card: dot, destroy: () => cleanupAll(cleanups, wrapper) };\n}\n\nexport function renderBanner(doc: Document, opts: RenderStepOptions): StepView {\n const { step } = opts;\n const cleanups: Array<() => void> = [];\n const pos = step.position === \"top\" || step.placement === \"top\" || step.position.startsWith(\"top\") ? \"top\" : \"bottom\";\n const banner = h(doc, \"div\", `g-banner g-pos-${pos}`);\n banner.setAttribute(\"role\", \"status\");\n banner.setAttribute(\"data-step-id\", step.id);\n const body = h(doc, \"div\", \"g-body\");\n if (step.title) body.appendChild(h(doc, \"strong\", \"\", `${step.title} `));\n const text = h(doc, \"span\");\n setSanitizedHtml(text, step.body);\n body.appendChild(text);\n banner.appendChild(body);\n buildButtons(doc, step, opts.canGoBack ?? opts.index > 0, opts.onButton).forEach((b) => banner.appendChild(b));\n if (step.showClose) {\n const close = h(doc, \"button\", \"g-close\", \"×\");\n close.type = \"button\";\n close.setAttribute(\"aria-label\", \"Dismiss\");\n close.addEventListener(\"click\", () => opts.onClose());\n banner.appendChild(close);\n }\n opts.scope.appendChild(banner);\n cleanups.push(installKeyboard(banner, step, false, opts.onClose));\n return { el: banner, card: banner, destroy: () => cleanupAll(cleanups, banner) };\n}\n\nexport function renderSlideout(doc: Document, opts: RenderStepOptions): StepView {\n const cleanups: Array<() => void> = [];\n const pos = opts.step.position === \"top\" ? \"top-right\" : opts.step.position === \"bottom\" ? \"bottom-right\" : opts.step.position;\n const { card } = buildCard(doc, opts, `g-slideout ${positionClass(pos)}`);\n card.setAttribute(\"role\", \"dialog\");\n const wrapper = h(doc, \"div\", \"g-step\");\n if (opts.step.dismissOnOutsideClick) wrapper.appendChild(overlayEl(doc, opts, true));\n wrapper.appendChild(card);\n opts.scope.appendChild(wrapper);\n cleanups.push(installKeyboard(card, opts.step, false, opts.onClose));\n cleanups.push(focusInto(card));\n return { el: wrapper, card, destroy: () => cleanupAll(cleanups, wrapper) };\n}\n\n/** Sanitized custom HTML with no chrome. Elements with `data-g-action=\"next|back|dismiss|complete|skip\"` act as buttons. */\nexport function renderCustom(doc: Document, opts: RenderStepOptions): StepView {\n const cleanups: Array<() => void> = [];\n const wrapper = h(doc, \"div\", \"g-step\");\n if (opts.step.showOverlay) wrapper.appendChild(overlayEl(doc, opts));\n const el = h(doc, \"div\", \"g-custom\");\n el.tabIndex = -1;\n el.setAttribute(\"data-step-id\", opts.step.id);\n setSanitizedHtml(el, opts.step.customHtml || opts.step.body || \"\");\n const onClick = (e: Event) => {\n const t = (e.target as Element | null)?.closest?.(\"[data-g-action]\") as HTMLElement | null;\n const action = t?.getAttribute(\"data-g-action\");\n if (!action) return;\n e.preventDefault();\n if (action === \"dismiss\") opts.onClose();\n else opts.onButton({ id: `custom-${action}`, label: action, action: action as StepButton[\"action\"], variant: \"primary\", value: t?.getAttribute(\"data-g-value\") || undefined });\n };\n el.addEventListener(\"click\", onClick);\n wrapper.appendChild(el);\n opts.scope.appendChild(wrapper);\n cleanups.push(installKeyboard(el, opts.step, false, opts.onClose));\n cleanups.push(focusInto(el));\n return { el: wrapper, card: el, destroy: () => cleanupAll(cleanups, wrapper) };\n}\n\n/**\n * Renders a step of any type into the scope. Checklist and survey steps are rendered by the\n * dedicated widgets (`renderChecklist`, `renderSurvey`) and fall back to a modal here.\n */\nexport function renderStep(opts: RenderStepOptions): StepView {\n const doc = opts.scope.ownerDocument;\n const type = opts.asModal ? \"modal\" : opts.step.type;\n switch (type) {\n case \"tooltip\":\n return renderTooltip(doc, opts, \"tooltip\");\n case \"popover\":\n return renderTooltip(doc, opts, \"popover\");\n case \"spotlight\":\n return renderSpotlight(doc, opts);\n case \"hotspot\":\n return renderHotspot(doc, opts);\n case \"banner\":\n return renderBanner(doc, opts);\n case \"slideout\":\n return renderSlideout(doc, opts);\n case \"custom\":\n return renderCustom(doc, opts);\n case \"modal\":\n case \"checklist\":\n case \"survey\":\n default:\n return renderModal(doc, opts);\n }\n}\n\n/** Does the step type anchor to a target element? */\nexport function isAnchoredStep(step: GuideStep): boolean {\n return (step.type === \"tooltip\" || step.type === \"popover\" || step.type === \"spotlight\" || step.type === \"hotspot\") && !!step.target && step.target.selectors.length > 0;\n}\n","import { evaluateRules } from \"@guidelytech/shared/runtime\";\nimport { type EventName, type GuideConfig, type GuideKind, type GuideStep, type ProjectTheme, type StepButton, type TargetingContext } from \"@guidelytech/shared\";\nimport { createScope, ensureHost } from \"./host\";\nimport { isAnchoredStep, renderStep, type StepView } from \"./render\";\nimport { urlMatches, waitForTarget } from \"./selectors\";\n\n/** Minimal guide shape the runtime needs (a `PublishedGuide` or an authoring draft). */\nexport interface RunnableGuide {\n id: string;\n key: string;\n name: string;\n kind: GuideKind | string;\n version: number;\n config: GuideConfig;\n}\n\nexport interface RuntimeEvent {\n name: EventName;\n guideId: string;\n guideKey: string;\n guideVersion: number;\n stepId?: string;\n stepIndex?: number;\n properties?: Record<string, unknown>;\n}\n\nexport type GuideEndReason = \"completed\" | \"dismissed\" | \"skipped\" | \"destroyed\";\nexport type GuideStatus = \"idle\" | \"running\" | \"waiting_url\" | \"waiting_target\" | \"ended\";\n\nexport interface RunGuideOptions {\n /** Project theme (merged with the guide's appearance). */\n theme?: Partial<ProjectTheme> | null;\n /** Targeting context used for branches and step-level targeting. */\n ctx?: TargetingContext | (() => TargetingContext);\n /** Receives lifecycle events (`guide_viewed`, `guide_started`, `step_viewed`, ...). */\n onEvent?: (event: RuntimeEvent) => void;\n /** Called for `url` button actions. Defaults to `location.assign` / `window.open`. */\n onNavigate?: (url: string, newTab?: boolean) => void;\n /** Called for `start_guide`, `event` and `open_resource_center` button actions. */\n onAction?: (action: \"start_guide\" | \"event\" | \"open_resource_center\", value?: string, button?: StepButton) => void;\n /** Rendering errors are reported here instead of being thrown into the host app. */\n onError?: (error: unknown) => void;\n /** Called exactly once when the guide ends for any reason. */\n onEnd?: (reason: GuideEndReason) => void;\n /** Event bus used by `advanceOn: \"event\"` steps. */\n eventBus?: { on(name: string, cb: () => void): () => void };\n /** Start at this step id instead of the first step. */\n startAtStep?: string;\n /** Returns the current URL (defaults to `location.href`). */\n currentUrl?: () => string;\n /**\n * The user started this guide on demand (\"Show me\"): a step on another page offers to take them\n * there after `urlPromptDelayMs` (default 1200 ms, so a click that navigates doesn't flash it)\n * instead of waiting silently.\n */\n promptForUrl?: boolean;\n urlPromptDelayMs?: number;\n /** The step the guide is on, shown or waiting for its page or element (to resume it after a page load). */\n onPosition?: (stepId: string) => void;\n /** Render into this element instead of creating a scope in the Shadow-DOM host. */\n container?: HTMLElement;\n doc?: Document;\n}\n\nexport interface GuideController {\n readonly guide: RunnableGuide;\n start(): void;\n next(): void;\n back(): void;\n goTo(stepId: string): void;\n dismiss(): void;\n complete(): void;\n skip(): void;\n /** Re-evaluate a step waiting for a URL (call after SPA navigation). */\n resume(): void;\n destroy(): void;\n getState(): { status: GuideStatus; stepId: string | null; stepIndex: number; total: number };\n}\n\nfunction noop() {}\n\nconst escapeHtml = (s: string) => s.replace(/[&<>\"']/g, (c) => `&#${c.charCodeAt(0)};`);\n\n/** A step URL pattern the browser can open as is: a same-site path without wildcards. */\nexport function navigableUrl(pattern: string | undefined): string | null {\n if (!pattern || /[*?#\\s]/.test(pattern) || pattern.includes(\"/:\")) return null;\n if (pattern.startsWith(\"/\") && !pattern.startsWith(\"//\")) return pattern;\n try {\n const u = new URL(pattern);\n if (typeof location !== \"undefined\" && u.origin === location.origin) return u.pathname;\n } catch {\n /* not a URL */\n }\n return null;\n}\n/**\n * Runs a guide: walks steps, waits for targets, handles advancement, branches, multi-page steps,\n * buttons and cleanup. Rendering is wrapped in try/catch so the host app can never crash.\n */\nexport function runGuide(guide: RunnableGuide, options: RunGuideOptions = {}): GuideController {\n const doc = options.doc ?? (options.container?.ownerDocument || document);\n const steps = guide.config.steps;\n const total = steps.length;\n const onEvent = options.onEvent ?? noop;\n const onError = options.onError ?? noop;\n const getCtx = () => (typeof options.ctx === \"function\" ? options.ctx() : options.ctx) ?? null;\n const currentUrl = options.currentUrl ?? (() => (typeof location !== \"undefined\" ? location.href : \"\"));\n\n let status: GuideStatus = \"idle\";\n let index = -1;\n let pendingIndex = -1;\n let view: StepView | null = null;\n const stepCleanups: Array<() => void> = [];\n let started = false;\n let stepDone = false;\n let ended = false;\n const history: number[] = [];\n let scope: { el: HTMLElement; destroy(): void } | null = null;\n\n const emit = (name: EventName, step?: GuideStep | null, stepIndex?: number, properties?: Record<string, unknown>) => {\n try {\n onEvent({ name, guideId: guide.id, guideKey: guide.key, guideVersion: guide.version, stepId: step?.id, stepIndex, properties });\n } catch (err) {\n onError(err);\n }\n };\n\n const announce = (text: string) => {\n try {\n ensureHost(doc).announce(text);\n } catch {\n /* ignore */\n }\n };\n\n const getScope = (): HTMLElement => {\n if (options.container) return options.container;\n if (!scope) scope = createScope(options.theme, guide.config.appearance, doc);\n return scope.el;\n };\n\n const clearStep = () => {\n stepCleanups.splice(0).forEach((fn) => {\n try {\n fn();\n } catch {\n /* ignore */\n }\n });\n try {\n view?.destroy();\n } catch (err) {\n onError(err);\n }\n view = null;\n stepDone = false;\n };\n\n const end = (reason: GuideEndReason) => {\n if (ended) return;\n ended = true;\n const step = steps[index];\n clearStep();\n status = \"ended\";\n if (reason === \"completed\") emit(\"guide_completed\", step, index);\n else if (reason === \"dismissed\") emit(\"guide_dismissed\", step, index);\n else if (reason === \"skipped\") emit(\"guide_skipped\", step, index);\n scope?.destroy();\n scope = null;\n try {\n options.onEnd?.(reason);\n } catch (err) {\n onError(err);\n }\n };\n\n const completeStep = () => {\n if (stepDone || index < 0) return;\n stepDone = true;\n emit(\"step_completed\", steps[index], index);\n };\n\n const goNext = (overrideStepId?: string) => {\n const step = steps[index];\n let target = -1;\n const ctx = getCtx();\n if (step && ctx) {\n for (const branch of step.branches) {\n if (evaluateRules(branch.when, ctx)) {\n target = steps.findIndex((s) => s.id === branch.goTo);\n if (target >= 0) break;\n }\n }\n }\n if (target < 0 && overrideStepId) target = steps.findIndex((s) => s.id === overrideStepId);\n if (target < 0) target = index + 1;\n if (target >= total) return end(\"completed\");\n history.push(index);\n showStep(target, 1);\n };\n\n const advance = () => {\n if (ended) return;\n completeStep();\n goNext();\n };\n\n const handleButton = (b: StepButton) => {\n try {\n switch (b.action) {\n case \"next\":\n completeStep();\n goNext(b.value);\n break;\n case \"back\":\n controller.back();\n break;\n case \"dismiss\":\n end(\"dismissed\");\n break;\n case \"complete\":\n completeStep();\n end(\"completed\");\n break;\n case \"skip\":\n end(\"skipped\");\n break;\n case \"url\": {\n completeStep();\n const url = b.value || \"\";\n if (options.onNavigate) options.onNavigate(url, b.newTab);\n else if (b.newTab) window.open(url, \"_blank\", \"noopener\");\n else location.assign(url);\n if (index + 1 >= total) end(\"completed\");\n else goNext();\n break;\n }\n case \"start_guide\":\n completeStep();\n end(\"completed\");\n options.onAction?.(\"start_guide\", b.value, b);\n break;\n case \"event\":\n options.onAction?.(\"event\", b.value, b);\n break;\n case \"open_resource_center\":\n options.onAction?.(\"open_resource_center\", b.value, b);\n break;\n default:\n break;\n }\n } catch (err) {\n onError(err);\n }\n };\n\n const setupAdvance = (step: GuideStep, target: Element | null) => {\n const modes = step.advanceOn === \"any\" ? [\"element_click\", \"element_visible\", \"event\", \"delay\"] : [step.advanceOn];\n for (const mode of modes) {\n // Without a selector, clicking the highlighted element itself moves on (tours made from how-tos).\n if (mode === \"element_click\" && (step.advanceValue || target)) {\n const selector = step.advanceValue;\n const handler = (e: Event) => {\n const t = e.target as Node | null;\n try {\n if (selector ? t && typeof (t as Element).closest === \"function\" && (t as Element).closest(selector) : t && target?.contains(t)) advance();\n } catch {\n /* invalid selector */\n }\n };\n doc.addEventListener(\"click\", handler, true);\n doc.addEventListener(\"focusin\", handler, true);\n stepCleanups.push(() => {\n doc.removeEventListener(\"click\", handler, true);\n doc.removeEventListener(\"focusin\", handler, true);\n });\n } else if (mode === \"element_visible\" && step.advanceValue) {\n const ac = new AbortController();\n stepCleanups.push(() => ac.abort());\n waitForTarget([{ kind: \"css\", value: step.advanceValue }], { timeoutMs: 0, signal: ac.signal, root: doc })\n .then((el) => {\n if (ac.signal.aborted) return;\n if (typeof IntersectionObserver === \"undefined\") return advance();\n const io = new IntersectionObserver((entries) => {\n if (entries.some((en) => en.isIntersecting)) {\n io.disconnect();\n advance();\n }\n });\n io.observe(el);\n stepCleanups.push(() => io.disconnect());\n })\n .catch(noop);\n } else if (mode === \"event\" && step.advanceValue && options.eventBus) {\n stepCleanups.push(options.eventBus.on(step.advanceValue, advance));\n } else if (mode === \"delay\") {\n const t = setTimeout(advance, step.advanceDelayMs ?? 3000);\n stepCleanups.push(() => clearTimeout(t));\n }\n }\n };\n\n const render = (step: GuideStep, target: Element | null, asModal = false) => {\n if (ended) return;\n status = \"running\";\n // A \"click the element\" step whose element is missing would leave the user stuck: give it a Next button.\n const shown = !target && step.advanceOn === \"element_click\" && !step.advanceValue && !step.buttons.length ? { ...step, buttons: [{ id: \"g-next\", label: index + 1 >= total ? \"Done\" : \"Next\", action: index + 1 >= total ? (\"complete\" as const) : (\"next\" as const), variant: \"primary\" as const }] } : step;\n try {\n view = renderStep({\n scope: getScope(),\n step: shown,\n index,\n total,\n canGoBack: history.length > 0 || index > 0,\n target,\n asModal,\n onButton: handleButton,\n onClose: () => end(\"dismissed\"),\n announce,\n });\n } catch (err) {\n onError(err);\n view = null;\n // Rendering failed: skip the step rather than leaving the guide stuck.\n if (index + 1 < total) return goNext();\n return end(\"skipped\");\n }\n if (!started) {\n started = true;\n emit(\"guide_started\", step, index);\n }\n emit(\"step_viewed\", step, index, asModal ? { fallback: \"show_as_modal\" } : undefined);\n announce(step.title ? `${step.title}. Step ${index + 1} of ${total}` : `Step ${index + 1} of ${total}`);\n setupAdvance(step, target);\n };\n\n /** \"Continue on another page\": the waiting step's page, with a button to go there when it's a plain path. */\n const showUrlPrompt = (step: GuideStep) => {\n if (ended || status !== \"waiting_url\" || view) return;\n const href = navigableUrl(step.url);\n const where = (step.url ?? \"\").replace(/^https?:\\/\\/[^/]+/i, \"\") || \"another page\";\n const prompt: GuideStep = {\n ...step,\n type: \"modal\",\n title: \"Continue on another page\",\n body: `<p>The next step${step.title ? `, <strong>${escapeHtml(step.title)}</strong>,` : \"\"} is on <code>${escapeHtml(where)}</code>.</p>`,\n imageUrl: \"\",\n buttons: [\n ...(href ? [{ id: \"g-go\", label: \"Take me there\", action: \"url\" as const, value: href, variant: \"primary\" as const }] : []),\n { id: \"g-exit\", label: \"Exit\", action: \"dismiss\" as const, variant: href ? (\"secondary\" as const) : (\"primary\" as const) },\n ],\n };\n try {\n view = renderStep({\n scope: getScope(),\n step: prompt,\n index,\n total,\n canGoBack: false,\n target: null,\n asModal: true,\n onButton: (b) => {\n if (b.action !== \"url\" || !b.value) return end(\"dismissed\");\n if (options.onNavigate) options.onNavigate(b.value);\n else location.assign(b.value);\n },\n onClose: () => end(\"dismissed\"),\n announce,\n });\n } catch (err) {\n onError(err);\n }\n };\n\n const applyFallback = (step: GuideStep, direction: 1 | -1) => {\n const fallback = step.target?.fallback ?? \"skip\";\n emit(\"step_viewed\", step, index, { fallback, targetMissing: true });\n if (fallback === \"show_as_modal\") return render(step, null, true);\n if (fallback === \"end_guide\") return end(\"skipped\");\n // skip\n const nextIndex = index + direction;\n if (nextIndex < 0) return showStep(0, 1);\n if (nextIndex >= total) return end(\"completed\");\n showStep(nextIndex, direction);\n };\n\n function showStep(i: number, direction: 1 | -1 = 1): void {\n if (ended) return;\n clearStep();\n if (i < 0) i = 0;\n if (i >= total) return end(\"completed\");\n index = i;\n const step = steps[i] as GuideStep;\n const ctx = getCtx();\n if (step.targeting && step.targeting.rules.length && ctx && !evaluateRules(step.targeting, ctx)) {\n const nextIndex = i + direction;\n if (nextIndex >= total) return end(\"completed\");\n if (nextIndex < 0) return;\n return showStep(nextIndex, direction);\n }\n try {\n options.onPosition?.(step.id);\n } catch (err) {\n onError(err);\n }\n if (step.url && !urlMatches(step.url, currentUrl())) {\n status = \"waiting_url\";\n pendingIndex = i;\n if (options.promptForUrl) {\n const t = setTimeout(() => showUrlPrompt(step), options.urlPromptDelayMs ?? 1200);\n stepCleanups.push(() => clearTimeout(t));\n }\n return;\n }\n pendingIndex = -1;\n if (isAnchoredStep(step) && step.target) {\n status = \"waiting_target\";\n const ac = new AbortController();\n stepCleanups.push(() => ac.abort());\n const timeoutMs = step.target.fallback === \"wait\" ? 0 : step.target.waitMs;\n waitForTarget(step.target, { timeoutMs, signal: ac.signal, root: doc })\n .then((el) => {\n if (ac.signal.aborted || ended) return;\n render(step, el);\n })\n .catch((err) => {\n if (ac.signal.aborted || ended) return;\n if (err && (err as Error).name === \"AbortError\") return;\n applyFallback(step, direction);\n });\n return;\n }\n render(step, null);\n }\n\n const controller: GuideController = {\n guide,\n start() {\n if (status !== \"idle\") return;\n emit(\"guide_viewed\");\n if (total === 0) return end(\"completed\");\n let startIndex = options.startAtStep ? steps.findIndex((s) => s.id === options.startAtStep) : 0;\n if (startIndex < 0) startIndex = 0;\n showStep(startIndex, 1);\n },\n next() {\n if (ended || index < 0) return;\n completeStep();\n goNext();\n },\n back() {\n if (ended) return;\n const prev = history.pop();\n if (prev == null) {\n if (index > 0) showStep(index - 1, -1);\n return;\n }\n showStep(prev, -1);\n },\n goTo(stepId: string) {\n const i = steps.findIndex((s) => s.id === stepId);\n if (i >= 0 && !ended) {\n if (index >= 0) history.push(index);\n showStep(i, 1);\n }\n },\n dismiss: () => end(\"dismissed\"),\n complete() {\n completeStep();\n end(\"completed\");\n },\n skip: () => end(\"skipped\"),\n resume() {\n if (ended) return;\n if (status === \"waiting_url\" && pendingIndex >= 0) {\n showStep(pendingIndex, 1);\n return;\n }\n // A rendered step whose URL no longer matches must wait again.\n const step = steps[index];\n if (step?.url && status === \"running\" && !urlMatches(step.url, currentUrl())) showStep(index, 1);\n },\n destroy() {\n if (ended) return;\n ended = true;\n clearStep();\n status = \"ended\";\n scope?.destroy();\n scope = null;\n try {\n options.onEnd?.(\"destroyed\");\n } catch (err) {\n onError(err);\n }\n },\n getState: () => ({ status, stepId: steps[index]?.id ?? null, stepIndex: index, total }),\n };\n return controller;\n}\n","import type { ChecklistConfig, ChecklistTask } from \"@guidelytech/shared\";\nimport { isChecklistComplete } from \"@guidelytech/shared/runtime\";\nimport { setSanitizedHtml } from \"./sanitize\";\n\nexport interface ChecklistProgress {\n completedTaskIds: string[];\n completedAt?: string | null;\n dismissedAt?: string | null;\n}\n\nexport interface ChecklistWidgetOptions {\n scope: HTMLElement;\n config: ChecklistConfig;\n progress?: ChecklistProgress;\n /** Initially open? Defaults to `config.autoOpen`. */\n open?: boolean;\n onTaskClick?: (task: ChecklistTask) => void;\n onDismiss?: () => void;\n onOpen?: () => void;\n onClose?: () => void;\n}\n\nexport interface ChecklistWidget {\n el: HTMLElement;\n open(): void;\n close(): void;\n toggle(): void;\n isOpen(): boolean;\n setProgress(progress: ChecklistProgress): void;\n destroy(): void;\n}\n\nexport { isChecklistComplete };\n\n/** Launcher pill + expandable panel listing tasks with checkmarks and a progress bar. */\nexport function renderChecklist(options: ChecklistWidgetOptions): ChecklistWidget {\n const { scope, config } = options;\n const doc = scope.ownerDocument;\n let progress: ChecklistProgress = options.progress ?? { completedTaskIds: [] };\n let open = options.open ?? config.autoOpen;\n const pos = `g-pos-${config.position}`;\n\n const root = doc.createElement(\"div\");\n root.className = \"g-checklist\";\n const launcher = doc.createElement(\"button\");\n launcher.type = \"button\";\n launcher.className = `g-launcher ${pos}`;\n launcher.setAttribute(\"aria-expanded\", \"false\");\n const ring = doc.createElement(\"span\");\n ring.className = \"g-ring\";\n const count = doc.createElement(\"span\");\n count.className = \"g-count\";\n ring.appendChild(count);\n launcher.appendChild(ring);\n const label = doc.createElement(\"span\");\n label.textContent = config.launcherLabel;\n launcher.appendChild(label);\n\n const panel = doc.createElement(\"div\");\n panel.className = `g-panel ${pos}`;\n panel.setAttribute(\"role\", \"dialog\");\n panel.setAttribute(\"aria-label\", config.launcherLabel);\n panel.hidden = true;\n\n const head = doc.createElement(\"div\");\n head.className = \"g-panel-head\";\n const title = doc.createElement(\"h2\");\n title.className = \"g-panel-title\";\n title.textContent = config.launcherLabel;\n const sub = doc.createElement(\"p\");\n sub.className = \"g-panel-sub\";\n const bar = doc.createElement(\"div\");\n bar.className = \"g-bar\";\n const fill = doc.createElement(\"span\");\n bar.appendChild(fill);\n const close = doc.createElement(\"button\");\n close.type = \"button\";\n close.className = \"g-close\";\n close.textContent = \"×\";\n close.setAttribute(\"aria-label\", \"Minimize checklist\");\n head.append(title, sub, bar, close);\n const body = doc.createElement(\"div\");\n body.className = \"g-panel-body\";\n const foot = doc.createElement(\"div\");\n foot.className = \"g-panel-foot\";\n panel.append(head, body, foot);\n root.append(launcher, panel);\n scope.appendChild(root);\n\n const setOpen = (v: boolean) => {\n open = v;\n panel.hidden = !v;\n launcher.setAttribute(\"aria-expanded\", String(v));\n if (v) {\n (panel.querySelector<HTMLElement>(\".g-task:not([disabled])\") || close).focus?.({ preventScroll: true });\n options.onOpen?.();\n } else options.onClose?.();\n };\n\n const renderTasks = () => {\n const done = new Set(progress.completedTaskIds);\n const doneCount = config.tasks.filter((t) => done.has(t.id)).length;\n const pct = config.tasks.length ? Math.round((doneCount / config.tasks.length) * 100) : 0;\n count.textContent = `${doneCount}/${config.tasks.length}`;\n launcher.style.setProperty(\"--g-pct\", `${pct}%`);\n launcher.setAttribute(\"aria-label\", `${config.launcherLabel}: ${doneCount} of ${config.tasks.length} tasks completed`);\n sub.textContent = `${doneCount} of ${config.tasks.length} completed`;\n fill.style.width = `${pct}%`;\n bar.setAttribute(\"role\", \"progressbar\");\n bar.setAttribute(\"aria-valuenow\", String(pct));\n bar.setAttribute(\"aria-valuemin\", \"0\");\n bar.setAttribute(\"aria-valuemax\", \"100\");\n body.textContent = \"\";\n foot.textContent = \"\";\n const complete = isChecklistComplete(config, progress);\n if (complete) {\n const wrap = doc.createElement(\"div\");\n wrap.className = \"g-complete\";\n const t = doc.createElement(\"h3\");\n t.className = \"g-title\";\n t.textContent = config.completionTitle;\n const b = doc.createElement(\"div\");\n b.className = \"g-body\";\n setSanitizedHtml(b, config.completionBody);\n wrap.append(t, b);\n body.appendChild(wrap);\n }\n const list = doc.createElement(\"div\");\n list.setAttribute(\"role\", \"list\");\n let locked = false;\n config.tasks.forEach((task, i) => {\n const isDone = done.has(task.id);\n const btn = doc.createElement(\"button\");\n btn.type = \"button\";\n btn.className = `g-task${isDone ? \" g-done\" : \"\"}`;\n btn.setAttribute(\"role\", \"listitem\");\n btn.setAttribute(\"data-task-id\", task.id);\n btn.setAttribute(\"aria-checked\", String(isDone));\n if (config.ordered && locked && !isDone) {\n btn.disabled = true;\n btn.title = \"Complete the previous task first\";\n }\n if (config.ordered && !isDone) locked = true;\n const check = doc.createElement(\"span\");\n check.className = \"g-check\";\n check.setAttribute(\"aria-hidden\", \"true\");\n check.textContent = isDone ? \"✓\" : \"\";\n const text = doc.createElement(\"span\");\n const tt = doc.createElement(\"div\");\n tt.className = \"g-task-title\";\n tt.textContent = `${i + 1}. ${task.title}`;\n text.appendChild(tt);\n if (task.description) {\n const td = doc.createElement(\"div\");\n td.className = \"g-task-desc\";\n td.textContent = task.description;\n text.appendChild(td);\n }\n btn.append(check, text);\n btn.addEventListener(\"click\", () => options.onTaskClick?.(task));\n list.appendChild(btn);\n });\n body.appendChild(list);\n if (config.dismissible) {\n const dismiss = doc.createElement(\"button\");\n dismiss.type = \"button\";\n dismiss.className = \"g-btn g-btn-ghost\";\n dismiss.textContent = complete ? \"Close\" : \"Dismiss checklist\";\n dismiss.addEventListener(\"click\", () => options.onDismiss?.());\n foot.appendChild(dismiss);\n }\n };\n\n launcher.addEventListener(\"click\", () => setOpen(!open));\n close.addEventListener(\"click\", () => setOpen(false));\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\" && open) {\n e.stopPropagation();\n setOpen(false);\n launcher.focus();\n }\n };\n panel.addEventListener(\"keydown\", onKey);\n renderTasks();\n if (open) setOpen(true);\n\n return {\n el: root,\n open: () => setOpen(true),\n close: () => setOpen(false),\n toggle: () => setOpen(!open),\n isOpen: () => open,\n setProgress(p) {\n progress = p;\n renderTasks();\n },\n destroy() {\n panel.removeEventListener(\"keydown\", onKey);\n root.remove();\n },\n };\n}\n","import type { SurveyConfig, SurveyQuestion } from \"@guidelytech/shared\";\nimport { setSanitizedHtml } from \"./sanitize\";\n\nimport { isQuestionVisible, type SurveyAnswer, type SurveyAnswers } from \"@guidelytech/shared/runtime\";\n\nexport { isQuestionVisible };\nexport type { SurveyAnswer, SurveyAnswers };\n\nexport interface SurveyWidgetOptions {\n scope: HTMLElement;\n config: SurveyConfig;\n title?: string;\n onSubmit: (answers: SurveyAnswers) => void;\n onDismiss?: () => void;\n onChange?: (answers: SurveyAnswers) => void;\n}\n\nexport interface SurveyWidget {\n el: HTMLElement;\n getAnswers(): SurveyAnswers;\n showThankYou(): void;\n destroy(): void;\n}\n\n/** Survey card: NPS/CSAT/thumbs/choice/text/rating questions with conditional follow-ups and a thank-you state. */\nexport function renderSurvey(options: SurveyWidgetOptions): SurveyWidget {\n const { scope, config } = options;\n const doc = scope.ownerDocument;\n const answers: SurveyAnswers = {};\n const card = doc.createElement(\"div\");\n card.className = `g-card g-survey g-slideout g-pos-${config.position}`;\n card.setAttribute(\"role\", \"dialog\");\n card.setAttribute(\"aria-label\", options.title || \"Survey\");\n card.tabIndex = -1;\n const inner = doc.createElement(\"div\");\n inner.className = \"g-inner\";\n card.appendChild(inner);\n if (options.onDismiss) {\n const close = doc.createElement(\"button\");\n close.type = \"button\";\n close.className = \"g-close\";\n close.textContent = \"×\";\n close.setAttribute(\"aria-label\", \"Close survey\");\n close.addEventListener(\"click\", () => options.onDismiss?.());\n card.appendChild(close);\n }\n scope.appendChild(card);\n\n const form = doc.createElement(\"form\");\n form.noValidate = true;\n inner.appendChild(form);\n const errorEl = doc.createElement(\"div\");\n errorEl.className = \"g-error\";\n errorEl.setAttribute(\"role\", \"alert\");\n\n const setAnswer = (id: string, v: SurveyAnswer | undefined) => {\n if (v === undefined || v === \"\" || (Array.isArray(v) && v.length === 0)) delete answers[id];\n else answers[id] = v;\n options.onChange?.({ ...answers });\n updateVisibility();\n };\n\n const questionEls = new Map<string, HTMLElement>();\n\n const scaleButtons = (q: SurveyQuestion, min: number, max: number, labels?: boolean) => {\n const wrap = doc.createElement(\"div\");\n const row = doc.createElement(\"div\");\n row.className = \"g-scale\";\n row.setAttribute(\"role\", \"radiogroup\");\n row.setAttribute(\"aria-label\", q.title);\n for (let i = min; i <= max; i++) {\n const b = doc.createElement(\"button\");\n b.type = \"button\";\n b.textContent = String(i);\n b.setAttribute(\"aria-pressed\", \"false\");\n b.addEventListener(\"click\", () => {\n row.querySelectorAll(\"button\").forEach((x) => x.setAttribute(\"aria-pressed\", \"false\"));\n b.setAttribute(\"aria-pressed\", \"true\");\n setAnswer(q.id, i);\n });\n row.appendChild(b);\n }\n wrap.appendChild(row);\n if (labels && (q.lowLabel || q.highLabel)) {\n const l = doc.createElement(\"div\");\n l.className = \"g-scale-labels\";\n l.append(Object.assign(doc.createElement(\"span\"), { textContent: q.lowLabel || \"\" }), Object.assign(doc.createElement(\"span\"), { textContent: q.highLabel || \"\" }));\n wrap.appendChild(l);\n }\n return wrap;\n };\n\n const buildInput = (q: SurveyQuestion): HTMLElement => {\n switch (q.type) {\n case \"nps\":\n return scaleButtons(q, 0, 10, true);\n case \"csat\":\n return scaleButtons(q, 1, q.scaleMax ?? 5, true);\n case \"rating\": {\n const max = q.scaleMax ?? 5;\n const row = doc.createElement(\"div\");\n row.className = \"g-stars\";\n row.setAttribute(\"role\", \"radiogroup\");\n row.setAttribute(\"aria-label\", q.title);\n const btns: HTMLButtonElement[] = [];\n for (let i = 1; i <= max; i++) {\n const b = doc.createElement(\"button\");\n b.type = \"button\";\n b.textContent = \"★\";\n b.setAttribute(\"aria-label\", `${i} of ${max}`);\n b.setAttribute(\"aria-pressed\", \"false\");\n b.addEventListener(\"click\", () => {\n btns.forEach((x, j) => {\n x.classList.toggle(\"g-on\", j < i);\n x.setAttribute(\"aria-pressed\", String(j === i - 1));\n });\n setAnswer(q.id, i);\n });\n btns.push(b);\n row.appendChild(b);\n }\n return row;\n }\n case \"thumbs\": {\n const row = doc.createElement(\"div\");\n row.className = \"g-thumbs\";\n row.setAttribute(\"role\", \"radiogroup\");\n [\n [\"up\", \"👍\", \"Thumbs up\"],\n [\"down\", \"👎\", \"Thumbs down\"],\n ].forEach(([val, icon, lbl]) => {\n const b = doc.createElement(\"button\");\n b.type = \"button\";\n b.textContent = icon as string;\n b.setAttribute(\"aria-label\", lbl as string);\n b.setAttribute(\"aria-pressed\", \"false\");\n b.addEventListener(\"click\", () => {\n row.querySelectorAll(\"button\").forEach((x) => x.setAttribute(\"aria-pressed\", \"false\"));\n b.setAttribute(\"aria-pressed\", \"true\");\n setAnswer(q.id, val === \"up\");\n });\n row.appendChild(b);\n });\n return row;\n }\n case \"single_choice\":\n case \"multiple_choice\": {\n const multi = q.type === \"multiple_choice\";\n const group = doc.createElement(\"div\");\n group.setAttribute(\"role\", multi ? \"group\" : \"radiogroup\");\n group.setAttribute(\"aria-label\", q.title);\n q.options.forEach((opt) => {\n const b = doc.createElement(\"button\");\n b.type = \"button\";\n b.className = `g-choice${multi ? \" g-multi\" : \"\"}`;\n b.setAttribute(\"role\", multi ? \"checkbox\" : \"radio\");\n b.setAttribute(\"aria-checked\", \"false\");\n b.setAttribute(\"data-option-id\", opt.id);\n const dot = doc.createElement(\"span\");\n dot.className = \"g-dot\";\n b.append(dot, Object.assign(doc.createElement(\"span\"), { textContent: opt.label }));\n b.addEventListener(\"click\", () => {\n if (multi) {\n const cur = new Set((answers[q.id] as string[] | undefined) ?? []);\n if (cur.has(opt.id)) cur.delete(opt.id);\n else cur.add(opt.id);\n b.setAttribute(\"aria-checked\", String(cur.has(opt.id)));\n setAnswer(q.id, Array.from(cur));\n } else {\n group.querySelectorAll(\".g-choice\").forEach((x) => x.setAttribute(\"aria-checked\", \"false\"));\n b.setAttribute(\"aria-checked\", \"true\");\n setAnswer(q.id, opt.id);\n }\n });\n group.appendChild(b);\n });\n return group;\n }\n case \"text\":\n default: {\n const ta = doc.createElement(\"textarea\");\n ta.className = \"g-input\";\n ta.rows = 3;\n ta.placeholder = q.placeholder || \"\";\n ta.setAttribute(\"aria-label\", q.title);\n ta.addEventListener(\"input\", () => setAnswer(q.id, ta.value.slice(0, 5000)));\n return ta;\n }\n }\n };\n\n config.questions.forEach((q) => {\n const wrap = doc.createElement(\"div\");\n wrap.className = \"g-question\";\n wrap.setAttribute(\"data-question-id\", q.id);\n const t = doc.createElement(\"p\");\n t.className = \"g-q-title\";\n t.textContent = q.title + (q.required ? \"\" : \" (optional)\");\n wrap.appendChild(t);\n if (q.description) {\n const d = doc.createElement(\"p\");\n d.className = \"g-q-desc\";\n d.textContent = q.description;\n wrap.appendChild(d);\n }\n wrap.appendChild(buildInput(q));\n questionEls.set(q.id, wrap);\n form.appendChild(wrap);\n });\n\n const footer = doc.createElement(\"div\");\n footer.className = \"g-footer\";\n const submit = doc.createElement(\"button\");\n submit.type = \"submit\";\n submit.className = \"g-btn g-btn-primary\";\n submit.textContent = \"Submit\";\n footer.appendChild(submit);\n form.appendChild(errorEl);\n form.appendChild(footer);\n\n function updateVisibility() {\n config.questions.forEach((q) => {\n const el = questionEls.get(q.id);\n if (!el) return;\n const visible = isQuestionVisible(q, answers);\n el.hidden = !visible;\n if (!visible && answers[q.id] !== undefined) delete answers[q.id];\n });\n }\n\n form.addEventListener(\"submit\", (e) => {\n e.preventDefault();\n const missing = config.questions.filter((q) => q.required && isQuestionVisible(q, answers) && answers[q.id] === undefined);\n if (missing.length) {\n errorEl.textContent = `Please answer: ${missing.map((q) => q.title).join(\", \")}`;\n questionEls.get(missing[0]!.id)?.querySelector<HTMLElement>(\"button,textarea\")?.focus();\n return;\n }\n errorEl.textContent = \"\";\n options.onSubmit({ ...answers });\n });\n\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\" && options.onDismiss) {\n e.stopPropagation();\n options.onDismiss();\n }\n };\n card.addEventListener(\"keydown\", onKey);\n updateVisibility();\n (form.querySelector<HTMLElement>(\"button,textarea\") || card).focus?.({ preventScroll: true });\n\n return {\n el: card,\n getAnswers: () => ({ ...answers }),\n showThankYou() {\n inner.textContent = \"\";\n const wrap = doc.createElement(\"div\");\n wrap.className = \"g-complete\";\n const t = doc.createElement(\"h3\");\n t.className = \"g-title\";\n t.textContent = config.thankYouTitle;\n const b = doc.createElement(\"div\");\n b.className = \"g-body\";\n setSanitizedHtml(b, config.thankYouBody);\n const done = doc.createElement(\"button\");\n done.type = \"button\";\n done.className = \"g-btn g-btn-primary\";\n done.textContent = \"Done\";\n done.style.marginTop = \"12px\";\n done.addEventListener(\"click\", () => options.onDismiss?.());\n wrap.append(t, b, done);\n inner.appendChild(wrap);\n done.focus?.({ preventScroll: true });\n },\n destroy() {\n card.removeEventListener(\"keydown\", onKey);\n card.remove();\n },\n };\n}\n","import type { ResourceCenterArticle, ResourceCenterConfig } from \"@guidelytech/shared\";\nimport { createHelpView, el, type HelpGuideRef } from \"./help-view\";\n\nexport type ResourceCenterGuideRef = HelpGuideRef;\n\nexport interface ResourceCenterOptions {\n scope: HTMLElement;\n config: ResourceCenterConfig;\n /** Published guides (used to display recommended guides and checklists by id/key). */\n guides?: ResourceCenterGuideRef[];\n /** Server search. Results are merged with the client-side title/summary filter. */\n search?: (q: string) => Promise<ResourceCenterArticle[]>;\n /** The visitor's audiences (for audience-targeted articles and collections). */\n audienceIds?: () => ReadonlySet<string> | readonly string[];\n /** Loads bodies the published config left out to stay small (`bodyOmitted`). */\n loadArticle?: (id: string) => Promise<ResourceCenterArticle | null>;\n onStartGuide?: (guideId: string) => void;\n onOpenChecklist?: (guideId: string) => void;\n onArticleView?: (article: ResourceCenterArticle) => void;\n onOpen?: () => void;\n onClose?: () => void;\n /** Hide the launcher (when the host app provides its own trigger). */\n hideLauncher?: boolean;\n}\n\nexport interface ResourceCenterWidget {\n el: HTMLElement;\n open(): void;\n close(): void;\n toggle(): void;\n isOpen(): boolean;\n destroy(): void;\n}\n\n/** Launcher + panel with search, collections, articles, recommended guides, checklists, FAQs and links. */\nexport function renderResourceCenter(options: ResourceCenterOptions): ResourceCenterWidget {\n const { scope, config } = options;\n const doc = scope.ownerDocument;\n const guides = options.guides ?? [];\n let open = false;\n const pos = `g-pos-${config.launcher.position}`;\n const byId = (ids: string[]) => ids.map((id) => guides.find((g) => g.id === id || g.key === id)).filter((g): g is ResourceCenterGuideRef => !!g);\n\n const root = el(doc, \"div\", \"g-resource-center\");\n const launcher = el(doc, \"button\", `g-launcher ${pos}`);\n launcher.type = \"button\";\n launcher.setAttribute(\"aria-expanded\", \"false\");\n if (config.launcher.showIcon) {\n const icon = el(doc, \"span\", \"\", \"?\");\n icon.setAttribute(\"aria-hidden\", \"true\");\n launcher.appendChild(icon);\n }\n launcher.appendChild(el(doc, \"span\", \"\", config.launcher.label || config.title));\n launcher.setAttribute(\"aria-label\", config.launcher.label || config.title);\n if (options.hideLauncher) launcher.hidden = true;\n\n const panel = el(doc, \"div\", `g-panel ${pos}`);\n panel.setAttribute(\"role\", \"dialog\");\n panel.setAttribute(\"aria-label\", config.title);\n panel.hidden = true;\n const head = el(doc, \"div\", \"g-panel-head\");\n head.appendChild(el(doc, \"h2\", \"g-panel-title\", config.title));\n const close = el(doc, \"button\", \"g-close\", \"×\");\n close.type = \"button\";\n close.setAttribute(\"aria-label\", \"Close\");\n head.appendChild(close);\n const help = createHelpView({\n doc,\n data: () => ({ collections: config.collections, articles: config.articles, recommended: byId(config.recommendedGuideIds), checklists: byId(config.checklistGuideIds), faqs: config.faqs, links: config.links }),\n search: options.search,\n audienceIds: options.audienceIds,\n loadArticle: options.loadArticle,\n onStartGuide: options.onStartGuide,\n onOpenChecklist: options.onOpenChecklist,\n onArticleView: options.onArticleView,\n guides: () => guides,\n onShowMe: (key) => {\n setOpen(false);\n options.onStartGuide?.(key);\n },\n // Articles read in a larger panel.\n onArticleChange: (reading) => panel.classList.toggle(\"g-panel-reading\", reading),\n });\n panel.append(head, help.el);\n root.append(launcher, panel);\n scope.appendChild(root);\n\n const setOpen = (v: boolean) => {\n if (open === v) return;\n open = v;\n panel.hidden = !v;\n launcher.setAttribute(\"aria-expanded\", String(v));\n if (v) {\n help.render();\n help.focusSearch();\n options.onOpen?.();\n } else {\n help.reset();\n options.onClose?.();\n }\n };\n launcher.addEventListener(\"click\", () => setOpen(!open));\n close.addEventListener(\"click\", () => setOpen(false));\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n e.stopPropagation();\n setOpen(false);\n launcher.focus();\n }\n };\n panel.addEventListener(\"keydown\", onKey);\n\n return {\n el: root,\n open: () => setOpen(true),\n close: () => setOpen(false),\n toggle: () => setOpen(!open),\n isOpen: () => open,\n destroy() {\n help.destroy();\n panel.removeEventListener(\"keydown\", onKey);\n root.remove();\n },\n };\n}\n","import type { AuthoringPick, GuideStep, ProjectTheme, SelectorStrategy } from \"@guidelytech/shared\";\nimport { runGuide, type GuideController, type RunnableGuide } from \"./controller\";\nimport { createScope, ensureHost } from \"./host\";\nimport { describeElement, isGuidelyElement, querySelectorStrategy, isVisible } from \"./selectors\";\n\nexport interface AuthoringOptions {\n /** Called with the pick for each clicked element. */\n onPick: (pick: AuthoringPick & { element: Element }) => void;\n /** Called when the user exits authoring mode (Done / Exit / Esc with nothing hovered). */\n onExit: () => void;\n dashboardOrigin?: string;\n /** Text shown in the toolbar. */\n message?: string;\n doc?: Document;\n}\n\nexport interface AuthoringSession {\n /** Replace the toolbar status text. */\n setStatus(text: string): void;\n /** Pause/resume picking (e.g. while a preview is shown). */\n setPicking(enabled: boolean): void;\n stop(): void;\n}\n\nconst DEFAULT_MESSAGE = \"Guidely authoring — hover an element and click to select · Esc to cancel\";\n\n/**\n * Enters authoring mode: Shadow-DOM toolbar, hover outline following `elementFromPoint`, and\n * click-to-pick (captured in the capture phase so the host app never receives the click).\n */\nexport function startAuthoring(options: AuthoringOptions): AuthoringSession {\n const doc = options.doc ?? document;\n const win = doc.defaultView ?? window;\n const scope = createScope(null, { theme: \"light\", animation: \"none\" }, doc);\n const bar = doc.createElement(\"div\");\n bar.className = \"g-auth-bar\";\n bar.setAttribute(\"role\", \"toolbar\");\n const dot = doc.createElement(\"span\");\n dot.className = \"g-dot-live\";\n const status = doc.createElement(\"span\");\n status.textContent = options.message ?? DEFAULT_MESSAGE;\n const spacer = doc.createElement(\"span\");\n spacer.className = \"g-spacer\";\n const done = doc.createElement(\"button\");\n done.type = \"button\";\n done.className = \"g-btn g-btn-primary\";\n done.textContent = \"Done\";\n const exit = doc.createElement(\"button\");\n exit.type = \"button\";\n exit.className = \"g-btn g-btn-secondary\";\n exit.textContent = \"Exit authoring\";\n bar.append(dot, status, spacer, done, exit);\n const outline = doc.createElement(\"div\");\n outline.className = \"g-auth-outline\";\n outline.hidden = true;\n const label = doc.createElement(\"span\");\n label.className = \"g-auth-label\";\n outline.appendChild(label);\n scope.el.append(bar, outline);\n\n let picking = true;\n let hovered: Element | null = null;\n let stopped = false;\n\n const describe = (el: Element): string => {\n const tag = el.tagName.toLowerCase();\n const id = el.id ? `#${el.id}` : \"\";\n const tour = el.getAttribute(\"data-tour\") || el.getAttribute(\"data-testid\");\n const text = (el.textContent || \"\").replace(/\\s+/g, \" \").trim().slice(0, 40);\n return `${tag}${id}${tour ? `[${tour}]` : \"\"}${text ? ` “${text}”` : \"\"}`;\n };\n\n const paint = (el: Element | null, picked = false) => {\n if (!el) {\n outline.hidden = true;\n return;\n }\n const r = el.getBoundingClientRect();\n outline.hidden = false;\n outline.classList.toggle(\"g-picked\", picked);\n Object.assign(outline.style, { left: `${r.left}px`, top: `${r.top}px`, width: `${r.width}px`, height: `${r.height}px` });\n label.textContent = describe(el);\n label.style.top = r.top < 30 ? \"100%\" : \"-24px\";\n };\n\n const elementAt = (x: number, y: number): Element | null => {\n const el = doc.elementFromPoint(x, y);\n if (!el || isGuidelyElement(el) || el === doc.documentElement || el === doc.body) return null;\n return el;\n };\n\n const onMove = (e: MouseEvent) => {\n if (!picking || stopped) return;\n const el = elementAt(e.clientX, e.clientY);\n if (el !== hovered) {\n hovered = el;\n paint(el);\n }\n };\n const onScroll = () => {\n if (hovered) paint(hovered);\n };\n const onClick = (e: MouseEvent) => {\n if (!picking || stopped) return;\n if (e.target && isGuidelyElement(e.target as Element)) return;\n const el = elementAt(e.clientX, e.clientY) ?? hovered;\n if (!el) return;\n e.preventDefault();\n e.stopPropagation();\n e.stopImmediatePropagation();\n const d = describeElement(el);\n paint(el, true);\n status.textContent = `Selected ${describe(el)} — click another element or press Done`;\n options.onPick({ selectors: d.selectors, textSnapshot: d.textSnapshot, rect: d.rect, url: win.location.href, element: el });\n };\n const swallow = (e: Event) => {\n if (!picking || stopped) return;\n const t = e.target as Element | null;\n if (t && isGuidelyElement(t)) return;\n e.preventDefault();\n e.stopPropagation();\n };\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n e.preventDefault();\n e.stopPropagation();\n stop();\n options.onExit();\n }\n };\n const stop = () => {\n if (stopped) return;\n stopped = true;\n doc.removeEventListener(\"mousemove\", onMove, true);\n doc.removeEventListener(\"click\", onClick, true);\n doc.removeEventListener(\"mousedown\", swallow, true);\n doc.removeEventListener(\"mouseup\", swallow, true);\n doc.removeEventListener(\"keydown\", onKey, true);\n win.removeEventListener(\"scroll\", onScroll, true);\n win.removeEventListener(\"resize\", onScroll);\n scope.destroy();\n };\n done.addEventListener(\"click\", () => {\n stop();\n options.onExit();\n });\n exit.addEventListener(\"click\", () => {\n stop();\n options.onExit();\n });\n doc.addEventListener(\"mousemove\", onMove, true);\n doc.addEventListener(\"click\", onClick, true);\n doc.addEventListener(\"mousedown\", swallow, true);\n doc.addEventListener(\"mouseup\", swallow, true);\n doc.addEventListener(\"keydown\", onKey, true);\n win.addEventListener(\"scroll\", onScroll, true);\n win.addEventListener(\"resize\", onScroll);\n\n return {\n setStatus: (text) => {\n status.textContent = text;\n },\n setPicking: (enabled) => {\n picking = enabled;\n if (!enabled) paint(null);\n },\n stop,\n };\n}\n\nexport interface PreviewHandle {\n controller: GuideController;\n destroy(): void;\n}\n\n/**\n * Renders a single draft step on the current page (used by the dashboard editor's \"preview in\n * app\" and by the simulated preview). Anchored steps resolve their target; when it cannot be\n * found the step is shown as a modal so authors always see something.\n */\nexport function previewStep(step: GuideStep, theme?: Partial<ProjectTheme> | null, options: { appearance?: RunnableGuide[\"config\"][\"appearance\"]; onEnd?: () => void; doc?: Document; index?: number; total?: number } = {}): PreviewHandle {\n const previewStepConfig: GuideStep = { ...step, target: step.target ? { ...step.target, fallback: \"show_as_modal\", waitMs: Math.min(step.target.waitMs, 1500) } : step.target };\n const guide: RunnableGuide = {\n id: `preview-${step.id}`,\n key: \"preview\",\n name: \"Preview\",\n kind: \"flow\",\n version: 0,\n config: { steps: [previewStepConfig], visibility: \"everyone\", targeting: { id: \"root\", op: \"and\", rules: [] }, trigger: { type: \"manual\", delayMs: 0 }, frequency: { mode: \"every_time\", cooldownHours: 0, priority: 0, mutuallyExclusiveWith: [], reshowAfterDismiss: true }, appearance: options.appearance ?? { theme: \"auto\", animation: \"fade\" }, urlPatterns: [], platforms: [\"web\"] },\n };\n const controller = runGuide(guide, { theme, doc: options.doc, onEnd: () => options.onEnd?.(), onNavigate: () => {}, onAction: () => {} });\n controller.start();\n return { controller, destroy: () => controller.destroy() };\n}\n\nexport interface HighlightHandle {\n /** Number of matched elements per strategy. */\n counts: number[];\n /** Element resolved as the step target (first strategy with exactly one visible match). */\n resolved: Element | null;\n destroy(): void;\n}\n\n/** Draws dashed boxes around every element matched by the selectors, for testing selectors while authoring. */\nexport function highlightSelectors(selectors: SelectorStrategy[], options: { durationMs?: number; doc?: Document } = {}): HighlightHandle {\n const doc = options.doc ?? document;\n const scope = createScope(null, { theme: \"light\", animation: \"none\" }, doc);\n const boxes: HTMLElement[] = [];\n const counts: number[] = [];\n let resolved: Element | null = null;\n const matched = new Set<Element>();\n selectors.forEach((s) => {\n const els = querySelectorStrategy(s, doc).filter((el) => !isGuidelyElement(el));\n const visible = els.filter(isVisible);\n counts.push(els.length);\n if (!resolved && visible.length === 1) resolved = visible[0] as Element;\n els.forEach((el) => matched.add(el));\n });\n matched.forEach((el) => {\n const r = el.getBoundingClientRect();\n const box = doc.createElement(\"div\");\n box.className = \"g-highlight\";\n Object.assign(box.style, { left: `${r.left}px`, top: `${r.top}px`, width: `${r.width}px`, height: `${r.height}px` });\n if (el === resolved) box.style.borderColor = \"#22c55e\";\n scope.el.appendChild(box);\n boxes.push(box);\n });\n let timer: ReturnType<typeof setTimeout> | null = null;\n const destroy = () => {\n if (timer) clearTimeout(timer);\n scope.destroy();\n };\n if (options.durationMs !== 0) timer = setTimeout(destroy, options.durationMs ?? 2500);\n ensureHost(doc);\n return { counts, resolved, destroy };\n}\n"],"mappings":"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","names":["el","el","el","el","el"]}
1
+ {"version":3,"sources":["../src/position.ts","../src/render.ts","../src/controller.ts","../src/checklist.ts","../src/survey.ts","../src/resource-center.ts","../src/authoring.ts"],"sourcesContent":["import { arrow, autoPlacement, autoUpdate, computePosition, flip, offset, shift, type Placement as FuiPlacement } from \"@floating-ui/dom\";\nimport type { Placement } from \"@guidelytech/shared\";\nimport { visualRect } from \"./selectors\";\n\nexport interface AnchorOptions {\n placement?: Placement;\n offset?: number;\n arrowEl?: HTMLElement | null;\n /** Called after every position update. */\n onUpdate?: (placement: FuiPlacement) => void;\n}\n\n/**\n * Anchors `floating` next to `reference` using floating-ui (`flip`, `shift`, `offset`, `arrow`).\n * `placement: \"auto\"` uses `autoPlacement`. Returns a cleanup function that stops `autoUpdate`.\n */\nexport function anchor(target: Element, floating: HTMLElement, options: AnchorOptions = {}): () => void {\n // A shadow host is measured with its shadow content (see `visualRect`).\n const reference = target.shadowRoot ? { getBoundingClientRect: () => visualRect(target), contextElement: target } : target;\n const placement = options.placement ?? \"auto\";\n const gap = options.offset ?? 10;\n const middleware = [offset(gap + (options.arrowEl ? 4 : 0))];\n if (placement === \"auto\") middleware.push(autoPlacement({ padding: 16 }));\n else middleware.push(flip({ padding: 16 }));\n middleware.push(shift({ padding: 16 }));\n if (options.arrowEl) middleware.push(arrow({ element: options.arrowEl, padding: 8 }));\n let stopped = false;\n const update = async () => {\n if (stopped || !floating.isConnected) return;\n try {\n const result = await computePosition(reference, floating, {\n placement: placement === \"auto\" ? \"bottom\" : placement,\n strategy: \"fixed\",\n middleware,\n });\n if (stopped) return;\n floating.style.left = `${Math.round(result.x)}px`;\n floating.style.top = `${Math.round(result.y)}px`;\n floating.setAttribute(\"data-placement\", result.placement);\n if (options.arrowEl && result.middlewareData.arrow) {\n const { x, y } = result.middlewareData.arrow;\n const side = result.placement.split(\"-\")[0];\n const staticSide = { top: \"bottom\", right: \"left\", bottom: \"top\", left: \"right\" }[side as \"top\" | \"right\" | \"bottom\" | \"left\"];\n Object.assign(options.arrowEl.style, {\n left: x != null ? `${x}px` : \"\",\n top: y != null ? `${y}px` : \"\",\n right: \"\",\n bottom: \"\",\n [staticSide]: \"-7px\",\n });\n }\n options.onUpdate?.(result.placement);\n } catch {\n /* positioning must never crash the host */\n }\n };\n let stopAuto: (() => void) | null = null;\n try {\n stopAuto = autoUpdate(reference, floating, () => void update(), { animationFrame: false });\n } catch {\n void update();\n }\n return () => {\n stopped = true;\n stopAuto?.();\n };\n}\n\n/** Tracks the bounding rect of an element and calls `cb` on scroll/resize/mutation. */\nexport function trackRect(el: Element, cb: (rect: DOMRect) => void): () => void {\n let raf = 0;\n let stopped = false;\n const run = () => {\n if (stopped) return;\n cb(visualRect(el));\n };\n const schedule = () => {\n if (stopped) return;\n if (typeof requestAnimationFrame === \"function\") {\n cancelAnimationFrame(raf);\n raf = requestAnimationFrame(run);\n } else run();\n };\n run();\n const win = el.ownerDocument.defaultView;\n win?.addEventListener(\"scroll\", schedule, true);\n win?.addEventListener(\"resize\", schedule);\n // `scroll` is not composed: scrolling a container inside a shadow root never reaches `window`.\n const shadowRoots: ShadowRoot[] = [];\n for (let root = el.getRootNode(); root.nodeType === 11 && (root as ShadowRoot).host; root = (root as ShadowRoot).host.getRootNode()) shadowRoots.push(root as ShadowRoot);\n for (const root of shadowRoots) root.addEventListener(\"scroll\", schedule, true);\n let ro: ResizeObserver | null = null;\n if (typeof ResizeObserver !== \"undefined\") {\n try {\n ro = new ResizeObserver(schedule);\n ro.observe(el);\n if (el.ownerDocument.documentElement) ro.observe(el.ownerDocument.documentElement);\n } catch {\n ro = null;\n }\n }\n const interval = setInterval(run, 500);\n return () => {\n stopped = true;\n win?.removeEventListener(\"scroll\", schedule, true);\n win?.removeEventListener(\"resize\", schedule);\n for (const root of shadowRoots) root.removeEventListener(\"scroll\", schedule, true);\n ro?.disconnect();\n clearInterval(interval);\n if (typeof cancelAnimationFrame === \"function\") cancelAnimationFrame(raf);\n };\n}\n","import { visibleButtons, type GuideStep, type StepButton } from \"@guidelytech/shared\";\nimport { anchor, trackRect } from \"./position\";\nimport { setSanitizedHtml } from \"./sanitize\";\n\nexport interface RenderStepOptions {\n /** Themed scope element inside the shadow root. */\n scope: HTMLElement;\n step: GuideStep;\n index: number;\n total: number;\n /** Whether a \"back\" action has a step to return to; back buttons are hidden otherwise. */\n canGoBack?: boolean;\n target?: Element | null;\n /** Render anchored steps as a centered modal (target fallback). */\n asModal?: boolean;\n onButton: (button: StepButton) => void;\n /** Close button / Escape / outside click. */\n onClose: () => void;\n /** Called when a hotspot is expanded. */\n onOpen?: () => void;\n announce?: (text: string) => void;\n /** Run the step's code block (custom steps; see RunGuideOptions.runCode). */\n runCode?: boolean;\n onError?: (error: unknown) => void;\n}\n\nexport interface StepView {\n /** Root element of the rendered step (card, banner, hotspot...). */\n el: HTMLElement;\n /** Element that received focus (card), when any. */\n card: HTMLElement | null;\n destroy(): void;\n}\n\nconst FOCUSABLE = \"button:not([disabled]),[href],input:not([disabled]),select:not([disabled]),textarea:not([disabled]),[tabindex]:not([tabindex='-1'])\";\nlet uid = 0;\nconst nextId = (p: string) => `g-${p}-${++uid}`;\n\nfunction h<K extends keyof HTMLElementTagNameMap>(doc: Document, tag: K, className?: string, text?: string): HTMLElementTagNameMap[K] {\n const el = doc.createElement(tag);\n if (className) el.className = className;\n if (text != null) el.textContent = text;\n return el;\n}\n\nfunction buildButtons(doc: Document, step: GuideStep, canGoBack: boolean, onButton: (b: StepButton) => void): HTMLElement[] {\n return visibleButtons(step, canGoBack).map((b) => {\n const btn = h(doc, \"button\", `g-btn g-btn-${b.variant}`, b.label);\n btn.type = \"button\";\n btn.setAttribute(\"data-action\", b.action);\n btn.addEventListener(\"click\", (e) => {\n e.preventDefault();\n onButton(b);\n });\n return btn;\n });\n}\n\n/** Builds the shared chrome: close, image, title, body, progress and buttons. */\nexport function buildCard(doc: Document, opts: RenderStepOptions, extraClass: string): { card: HTMLElement; inner: HTMLElement; titleId: string; bodyId: string } {\n const { step } = opts;\n const card = h(doc, \"div\", `g-card ${extraClass}`);\n card.tabIndex = -1;\n card.setAttribute(\"data-step-id\", step.id);\n if (step.width) card.style.width = `min(${step.width}px, calc(100vw - 32px))`;\n const titleId = nextId(\"title\");\n const bodyId = nextId(\"body\");\n if (step.imageUrl) {\n const img = h(doc, \"img\", \"g-image\");\n img.src = step.imageUrl;\n // Empty alt = decorative (the default), so screen readers skip it.\n img.alt = step.imageAlt ?? \"\";\n card.appendChild(img);\n }\n const inner = h(doc, \"div\", \"g-inner\");\n if (step.showClose) {\n const close = h(doc, \"button\", \"g-close\", \"×\");\n close.type = \"button\";\n close.setAttribute(\"aria-label\", \"Close\");\n close.addEventListener(\"click\", (e) => {\n e.preventDefault();\n opts.onClose();\n });\n card.appendChild(close);\n }\n if (step.title) {\n const t = h(doc, \"h2\", \"g-title\", step.title);\n t.id = titleId;\n inner.appendChild(t);\n }\n if (step.body) {\n const b = h(doc, \"div\", \"g-body\");\n b.id = bodyId;\n setSanitizedHtml(b, step.body);\n inner.appendChild(b);\n }\n const buttons = buildButtons(doc, step, opts.canGoBack ?? opts.index > 0, opts.onButton);\n if (buttons.length || (step.showProgress && opts.total > 1)) {\n const footer = h(doc, \"div\", \"g-footer\");\n if (step.showProgress && opts.total > 1) {\n const progress = h(doc, \"span\", \"g-progress\", `${opts.index + 1} of ${opts.total}`);\n progress.setAttribute(\"aria-label\", `Step ${opts.index + 1} of ${opts.total}`);\n footer.appendChild(progress);\n }\n buttons.forEach((b) => footer.appendChild(b));\n inner.appendChild(footer);\n }\n card.appendChild(inner);\n if (step.title) card.setAttribute(\"aria-labelledby\", titleId);\n else card.setAttribute(\"aria-label\", opts.total > 1 ? `Step ${opts.index + 1} of ${opts.total}` : \"Guide\");\n if (step.body) card.setAttribute(\"aria-describedby\", bodyId);\n return { card, inner, titleId, bodyId };\n}\n\nfunction focusables(root: HTMLElement): HTMLElement[] {\n return Array.from(root.querySelectorAll<HTMLElement>(FOCUSABLE));\n}\n\nfunction isTextEntry(el: EventTarget | null): boolean {\n const t = el as HTMLElement | null;\n if (!t || !t.tagName) return false;\n const tag = t.tagName.toLowerCase();\n return tag === \"input\" || tag === \"textarea\" || tag === \"select\" || t.isContentEditable === true;\n}\n\n/**\n * Keyboard handling: Escape closes (when allowed), Tab is trapped inside modals, and the arrow keys\n * move between steps (→ = the step's Next / Done button, ← = Back) unless focus is in a text field.\n */\nfunction installKeyboard(card: HTMLElement, step: GuideStep, trap: boolean, onClose: () => void): () => void {\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\" && step.showClose) {\n e.stopPropagation();\n onClose();\n return;\n }\n if ((e.key === \"ArrowRight\" || e.key === \"ArrowLeft\") && !e.altKey && !e.ctrlKey && !e.metaKey && !isTextEntry(e.target)) {\n const actions = e.key === \"ArrowRight\" ? [\"next\", \"complete\"] : [\"back\"];\n const btn = actions.map((a) => card.querySelector<HTMLButtonElement>(`button[data-action=\"${a}\"]`)).find(Boolean);\n if (btn) {\n e.preventDefault();\n e.stopPropagation();\n btn.click();\n }\n return;\n }\n if (trap && e.key === \"Tab\") {\n const items = focusables(card);\n if (!items.length) {\n e.preventDefault();\n card.focus();\n return;\n }\n const first = items[0] as HTMLElement;\n const last = items[items.length - 1] as HTMLElement;\n const active = (card.getRootNode() as ShadowRoot | Document).activeElement;\n if (e.shiftKey && (active === first || active === card)) {\n e.preventDefault();\n last.focus();\n } else if (!e.shiftKey && active === last) {\n e.preventDefault();\n first.focus();\n }\n }\n };\n card.addEventListener(\"keydown\", onKey);\n return () => card.removeEventListener(\"keydown\", onKey);\n}\n\nfunction focusInto(card: HTMLElement): () => void {\n const doc = card.ownerDocument;\n const active = doc.activeElement as HTMLElement | null;\n // Focus inside the Guidely host (a previous step) is not worth returning to; the controller restores the page's.\n const previous = active && active.id !== \"guidely-root\" ? active : null;\n const primary = card.querySelector<HTMLElement>(\".g-btn-primary\") || focusables(card)[0] || card;\n try {\n primary.focus({ preventScroll: true });\n } catch {\n /* ignore */\n }\n return () => {\n try {\n if (previous && previous.isConnected && typeof previous.focus === \"function\") previous.focus({ preventScroll: true });\n } catch {\n /* ignore */\n }\n };\n}\n\nfunction overlayEl(doc: Document, opts: RenderStepOptions, transparent = false): HTMLElement {\n const overlay = h(doc, \"div\", `g-overlay${transparent ? \" g-transparent\" : \"\"}`);\n if (opts.step.dismissOnOutsideClick) overlay.addEventListener(\"click\", () => opts.onClose());\n return overlay;\n}\n\nfunction positionClass(position: GuideStep[\"position\"]): string {\n return `g-pos-${position}`;\n}\n\nexport function renderModal(doc: Document, opts: RenderStepOptions): StepView {\n const cleanups: Array<() => void> = [];\n const { card } = buildCard(doc, opts, \"g-modal\");\n card.setAttribute(\"role\", \"dialog\");\n card.setAttribute(\"aria-modal\", \"true\");\n const wrapper = h(doc, \"div\", \"g-step\");\n if (opts.step.showOverlay || opts.asModal) wrapper.appendChild(overlayEl(doc, opts));\n else if (opts.step.dismissOnOutsideClick) wrapper.appendChild(overlayEl(doc, opts, true));\n wrapper.appendChild(card);\n opts.scope.appendChild(wrapper);\n cleanups.push(installKeyboard(card, opts.step, true, opts.onClose));\n cleanups.push(focusInto(card));\n return { el: wrapper, card, destroy: () => cleanupAll(cleanups, wrapper) };\n}\n\nfunction cleanupAll(cleanups: Array<() => void>, el: HTMLElement) {\n cleanups.splice(0).forEach((fn) => {\n try {\n fn();\n } catch {\n /* ignore */\n }\n });\n el.remove();\n}\n\nfunction setTargetDescribedBy(target: Element, id: string): () => void {\n const prev = target.getAttribute(\"aria-describedby\");\n try {\n target.setAttribute(\"aria-describedby\", prev ? `${prev} ${id}` : id);\n } catch {\n return () => {};\n }\n return () => {\n if (prev) target.setAttribute(\"aria-describedby\", prev);\n else target.removeAttribute(\"aria-describedby\");\n };\n}\n\nexport function renderTooltip(doc: Document, opts: RenderStepOptions, kind: \"tooltip\" | \"popover\"): StepView {\n const target = opts.target;\n if (!target) return renderModal(doc, { ...opts, asModal: true });\n const cleanups: Array<() => void> = [];\n const { card } = buildCard(doc, opts, `g-${kind}`);\n const arrowEl = h(doc, \"div\", \"g-arrow\");\n card.appendChild(arrowEl);\n card.setAttribute(\"role\", kind === \"tooltip\" ? \"tooltip\" : \"dialog\");\n card.id = nextId(kind);\n const wrapper = h(doc, \"div\", \"g-step\");\n if (opts.step.showOverlay) wrapper.appendChild(overlayEl(doc, opts));\n else if (opts.step.dismissOnOutsideClick) wrapper.appendChild(overlayEl(doc, opts, true));\n wrapper.appendChild(card);\n opts.scope.appendChild(wrapper);\n if (opts.step.target?.scrollIntoView !== false) scrollTo(target);\n cleanups.push(anchor(target, card, { placement: opts.step.placement, offset: opts.step.offset, arrowEl }));\n cleanups.push(setTargetDescribedBy(target, card.id));\n cleanups.push(installKeyboard(card, opts.step, false, opts.onClose));\n cleanups.push(focusInto(card));\n return { el: wrapper, card, destroy: () => cleanupAll(cleanups, wrapper) };\n}\n\nfunction scrollTo(target: Element) {\n try {\n target.scrollIntoView?.({ block: \"nearest\", inline: \"nearest\", behavior: \"auto\" });\n } catch {\n /* ignore */\n }\n}\n\n/** Overlay with a cut-out around the target (4 rects), so the target itself stays clickable. */\nexport function renderSpotlight(doc: Document, opts: RenderStepOptions): StepView {\n const target = opts.target;\n if (!target) return renderModal(doc, { ...opts, asModal: true });\n const cleanups: Array<() => void> = [];\n const wrapper = h(doc, \"div\", \"g-step\");\n const pad = opts.step.spotlightPadding ?? 6;\n const rects = [\"top\", \"left\", \"right\", \"bottom\"].map((side) => {\n const r = h(doc, \"div\", `g-spot-rect g-spot-${side}`);\n if (opts.step.dismissOnOutsideClick) r.addEventListener(\"click\", () => opts.onClose());\n wrapper.appendChild(r);\n return r;\n });\n const ring = h(doc, \"div\", \"g-spot-ring\");\n wrapper.appendChild(ring);\n const { card } = buildCard(doc, opts, \"g-spotlight-card\");\n card.setAttribute(\"role\", \"dialog\");\n const arrowEl = h(doc, \"div\", \"g-arrow\");\n card.appendChild(arrowEl);\n wrapper.appendChild(card);\n opts.scope.appendChild(wrapper);\n if (opts.step.target?.scrollIntoView !== false) scrollTo(target);\n const win = doc.defaultView;\n const layout = (r: DOMRect) => {\n const vw = win?.innerWidth ?? 0;\n const vh = win?.innerHeight ?? 0;\n const x = Math.max(0, r.left - pad);\n const y = Math.max(0, r.top - pad);\n const w = Math.min(vw, r.right + pad) - x;\n const hgt = Math.min(vh, r.bottom + pad) - y;\n const [top, left, right, bottom] = rects as unknown as [HTMLElement, HTMLElement, HTMLElement, HTMLElement];\n Object.assign(top.style, { left: \"0\", top: \"0\", width: \"100%\", height: `${y}px` });\n Object.assign(left.style, { left: \"0\", top: `${y}px`, width: `${x}px`, height: `${hgt}px` });\n Object.assign(right.style, { left: `${x + w}px`, top: `${y}px`, width: `${Math.max(0, vw - x - w)}px`, height: `${hgt}px` });\n Object.assign(bottom.style, { left: \"0\", top: `${y + hgt}px`, width: \"100%\", height: `${Math.max(0, vh - y - hgt)}px` });\n Object.assign(ring.style, { left: `${x}px`, top: `${y}px`, width: `${w}px`, height: `${hgt}px` });\n };\n cleanups.push(trackRect(target, layout));\n cleanups.push(anchor(target, card, { placement: opts.step.placement, offset: opts.step.offset + pad, arrowEl }));\n cleanups.push(installKeyboard(card, opts.step, false, opts.onClose));\n cleanups.push(focusInto(card));\n return { el: wrapper, card, destroy: () => cleanupAll(cleanups, wrapper) };\n}\n\n/** Pulsing dot at the target; opens an anchored card on click/hover. */\nexport function renderHotspot(doc: Document, opts: RenderStepOptions): StepView {\n const target = opts.target;\n if (!target) return renderModal(doc, { ...opts, asModal: true });\n const cleanups: Array<() => void> = [];\n const cfg = opts.step.hotspot ?? { size: 14, pulse: true, openOn: \"click\" as const };\n const wrapper = h(doc, \"div\", \"g-step\");\n const dot = h(doc, \"button\", `g-hotspot${cfg.pulse ? \" g-pulse\" : \"\"}`);\n dot.type = \"button\";\n dot.setAttribute(\"aria-label\", opts.step.title || \"Open hint\");\n dot.setAttribute(\"aria-expanded\", \"false\");\n dot.style.width = `${cfg.size}px`;\n dot.style.height = `${cfg.size}px`;\n dot.appendChild(h(doc, \"span\", \"g-hotspot-hit\"));\n wrapper.appendChild(dot);\n opts.scope.appendChild(wrapper);\n cleanups.push(trackRect(target, (r) => {\n dot.style.left = `${Math.round(r.right - cfg.size / 2)}px`;\n dot.style.top = `${Math.round(r.top - cfg.size / 2)}px`;\n }));\n let card: HTMLElement | null = null;\n let stopAnchor: (() => void) | null = null;\n let stopKeys: (() => void) | null = null;\n const close = (returnFocus = false) => {\n const hadFocus = !!card && (card.getRootNode() as ShadowRoot | Document).activeElement !== null && card.contains((card.getRootNode() as ShadowRoot | Document).activeElement);\n stopAnchor?.();\n stopKeys?.();\n card?.remove();\n card = null;\n dot.setAttribute(\"aria-expanded\", \"false\");\n // Keyboard users land back on the dot that opened the card.\n if (returnFocus || hadFocus) {\n try {\n dot.focus({ preventScroll: true });\n } catch {\n /* ignore */\n }\n }\n };\n const open = () => {\n if (card) return;\n const built = buildCard(doc, { ...opts, onClose: () => opts.onClose() }, \"g-hotspot-card\");\n card = built.card;\n card.setAttribute(\"role\", \"dialog\");\n card.id = nextId(\"hotspot\");\n dot.setAttribute(\"aria-controls\", card.id);\n const arrowEl = h(doc, \"div\", \"g-arrow\");\n card.appendChild(arrowEl);\n wrapper.appendChild(card);\n stopAnchor = anchor(target, card, { placement: opts.step.placement, offset: opts.step.offset, arrowEl });\n stopKeys = installKeyboard(card, opts.step, false, () => close(true));\n dot.setAttribute(\"aria-expanded\", \"true\");\n opts.onOpen?.();\n if (cfg.openOn === \"click\") focusInto(card);\n };\n dot.addEventListener(\"click\", (e) => {\n e.preventDefault();\n if (card) close();\n else open();\n });\n if (cfg.openOn === \"hover\") {\n dot.addEventListener(\"mouseenter\", open);\n dot.addEventListener(\"focus\", open);\n }\n cleanups.push(close);\n return { el: wrapper, card: dot, destroy: () => cleanupAll(cleanups, wrapper) };\n}\n\nexport function renderBanner(doc: Document, opts: RenderStepOptions): StepView {\n const { step } = opts;\n const cleanups: Array<() => void> = [];\n const pos = step.position === \"top\" || step.placement === \"top\" || step.position.startsWith(\"top\") ? \"top\" : \"bottom\";\n const banner = h(doc, \"div\", `g-banner g-pos-${pos}`);\n // A labelled region (not a live region: the controller announces it once).\n banner.setAttribute(\"role\", \"region\");\n banner.setAttribute(\"aria-label\", step.title || \"Announcement\");\n banner.setAttribute(\"data-step-id\", step.id);\n const body = h(doc, \"div\", \"g-body\");\n if (step.title) body.appendChild(h(doc, \"strong\", \"\", `${step.title} `));\n const text = h(doc, \"span\");\n setSanitizedHtml(text, step.body);\n body.appendChild(text);\n banner.appendChild(body);\n buildButtons(doc, step, opts.canGoBack ?? opts.index > 0, opts.onButton).forEach((b) => banner.appendChild(b));\n if (step.showClose) {\n const close = h(doc, \"button\", \"g-close\", \"×\");\n close.type = \"button\";\n close.setAttribute(\"aria-label\", \"Dismiss\");\n close.addEventListener(\"click\", () => opts.onClose());\n banner.appendChild(close);\n }\n opts.scope.appendChild(banner);\n cleanups.push(installKeyboard(banner, step, false, opts.onClose));\n return { el: banner, card: banner, destroy: () => cleanupAll(cleanups, banner) };\n}\n\nexport function renderSlideout(doc: Document, opts: RenderStepOptions): StepView {\n const cleanups: Array<() => void> = [];\n const pos = opts.step.position === \"top\" ? \"top-right\" : opts.step.position === \"bottom\" ? \"bottom-right\" : opts.step.position;\n const { card } = buildCard(doc, opts, `g-slideout ${positionClass(pos)}`);\n card.setAttribute(\"role\", \"dialog\");\n const wrapper = h(doc, \"div\", \"g-step\");\n if (opts.step.dismissOnOutsideClick) wrapper.appendChild(overlayEl(doc, opts, true));\n wrapper.appendChild(card);\n opts.scope.appendChild(wrapper);\n cleanups.push(installKeyboard(card, opts.step, false, opts.onClose));\n cleanups.push(focusInto(card));\n return { el: wrapper, card, destroy: () => cleanupAll(cleanups, wrapper) };\n}\n\n/**\n * Runs a code-block step's JavaScript (`step.code`) with `guidely` (next, back, dismiss, complete,\n * skip) and `container` (the step's element). It may return a cleanup function, called when the\n * step goes away. Errors are reported, never thrown into the host app. Pages whose Content\n * Security Policy forbids `unsafe-eval` won't run it.\n */\nfunction runCodeBlock(code: string, container: HTMLElement, opts: RenderStepOptions): () => void {\n const act = (action: StepButton[\"action\"]) => () => opts.onButton({ id: `code-${action}`, label: action, action, variant: \"primary\" });\n const api = Object.freeze({ next: act(\"next\"), back: act(\"back\"), complete: act(\"complete\"), skip: act(\"skip\"), dismiss: () => opts.onClose(), stepId: opts.step.id });\n try {\n // eslint-disable-next-line @typescript-eslint/no-implied-eval\n const fn = new Function(\"guidely\", \"container\", `\"use strict\";\\n${code}`) as (g: typeof api, c: HTMLElement) => unknown;\n const result = fn(api, container);\n return typeof result === \"function\" ? () => {\n try {\n (result as () => void)();\n } catch (err) {\n opts.onError?.(err);\n }\n } : () => {};\n } catch (err) {\n opts.onError?.(err);\n return () => {};\n }\n}\n\n/** Sanitized custom HTML with no chrome. Elements with `data-g-action=\"next|back|dismiss|complete|skip\"` act as buttons. */\nexport function renderCustom(doc: Document, opts: RenderStepOptions): StepView {\n const cleanups: Array<() => void> = [];\n const wrapper = h(doc, \"div\", \"g-step\");\n if (opts.step.showOverlay) wrapper.appendChild(overlayEl(doc, opts));\n const el = h(doc, \"div\", \"g-custom\");\n el.tabIndex = -1;\n el.setAttribute(\"data-step-id\", opts.step.id);\n setSanitizedHtml(el, opts.step.customHtml || opts.step.body || \"\");\n el.setAttribute(\"role\", opts.step.showOverlay ? \"dialog\" : \"group\");\n el.setAttribute(\"aria-label\", opts.step.title || \"Guide\");\n if (opts.step.showOverlay) el.setAttribute(\"aria-modal\", \"true\");\n const onClick = (e: Event) => {\n const t = (e.target as Element | null)?.closest?.(\"[data-g-action]\") as HTMLElement | null;\n const action = t?.getAttribute(\"data-g-action\");\n if (!action) return;\n e.preventDefault();\n if (action === \"dismiss\") opts.onClose();\n else opts.onButton({ id: `custom-${action}`, label: action, action: action as StepButton[\"action\"], variant: \"primary\", value: t?.getAttribute(\"data-g-value\") || undefined });\n };\n el.addEventListener(\"click\", onClick);\n wrapper.appendChild(el);\n opts.scope.appendChild(wrapper);\n cleanups.push(installKeyboard(el, opts.step, false, opts.onClose));\n cleanups.push(focusInto(el));\n if (opts.runCode && opts.step.code) cleanups.push(runCodeBlock(opts.step.code, el, opts));\n return { el: wrapper, card: el, destroy: () => cleanupAll(cleanups, wrapper) };\n}\n\n/**\n * Renders a step of any type into the scope. Checklist and survey steps are rendered by the\n * dedicated widgets (`renderChecklist`, `renderSurvey`) and fall back to a modal here.\n */\nexport function renderStep(opts: RenderStepOptions): StepView {\n const doc = opts.scope.ownerDocument;\n const type = opts.asModal ? \"modal\" : opts.step.type;\n switch (type) {\n case \"tooltip\":\n return renderTooltip(doc, opts, \"tooltip\");\n case \"popover\":\n return renderTooltip(doc, opts, \"popover\");\n case \"spotlight\":\n return renderSpotlight(doc, opts);\n case \"hotspot\":\n return renderHotspot(doc, opts);\n case \"banner\":\n return renderBanner(doc, opts);\n case \"slideout\":\n return renderSlideout(doc, opts);\n case \"custom\":\n return renderCustom(doc, opts);\n case \"modal\":\n case \"checklist\":\n case \"survey\":\n default:\n return renderModal(doc, opts);\n }\n}\n\n/** Does the step type anchor to a target element? */\nexport function isAnchoredStep(step: GuideStep): boolean {\n return (step.type === \"tooltip\" || step.type === \"popover\" || step.type === \"spotlight\" || step.type === \"hotspot\") && !!step.target && step.target.selectors.length > 0;\n}\n","import { evaluateRules } from \"@guidelytech/shared/runtime\";\nimport { type EventName, type GuideConfig, type GuideKind, type GuideStep, type ProjectTheme, type StepButton, type TargetingContext } from \"@guidelytech/shared\";\nimport { createScope, ensureHost } from \"./host\";\nimport { isAnchoredStep, renderStep, type StepView } from \"./render\";\nimport { closestComposed, composedTarget, containsComposed, urlMatches, waitForTarget } from \"./selectors\";\n\n/** Minimal guide shape the runtime needs (a `PublishedGuide` or an authoring draft). */\nexport interface RunnableGuide {\n id: string;\n key: string;\n name: string;\n kind: GuideKind | string;\n version: number;\n config: GuideConfig;\n}\n\nexport interface RuntimeEvent {\n name: EventName;\n guideId: string;\n guideKey: string;\n guideVersion: number;\n stepId?: string;\n stepIndex?: number;\n properties?: Record<string, unknown>;\n}\n\nexport type GuideEndReason = \"completed\" | \"dismissed\" | \"skipped\" | \"destroyed\";\nexport type GuideStatus = \"idle\" | \"running\" | \"waiting_url\" | \"waiting_target\" | \"ended\";\n\nexport interface RunGuideOptions {\n /** Project theme (merged with the guide's appearance). */\n theme?: Partial<ProjectTheme> | null;\n /** Targeting context used for branches and step-level targeting. */\n ctx?: TargetingContext | (() => TargetingContext);\n /** Receives lifecycle events (`guide_viewed`, `guide_started`, `step_viewed`, ...). */\n onEvent?: (event: RuntimeEvent) => void;\n /** Called for `url` button actions. Defaults to `location.assign` / `window.open`. */\n onNavigate?: (url: string, newTab?: boolean) => void;\n /** Called for `start_guide`, `event` and `open_resource_center` button actions. */\n onAction?: (action: \"start_guide\" | \"event\" | \"open_resource_center\", value?: string, button?: StepButton) => void;\n /** Rendering errors are reported here instead of being thrown into the host app. */\n onError?: (error: unknown) => void;\n /** Called exactly once when the guide ends for any reason. */\n onEnd?: (reason: GuideEndReason) => void;\n /** Event bus used by `advanceOn: \"event\"` steps. */\n eventBus?: { on(name: string, cb: () => void): () => void };\n /** Start at this step id instead of the first step. */\n startAtStep?: string;\n /** Returns the current URL (defaults to `location.href`). */\n currentUrl?: () => string;\n /**\n * The user started this guide on demand (\"Show me\"): a step on another page offers to take them\n * there after `urlPromptDelayMs` (default 1200 ms, so a click that navigates doesn't flash it)\n * instead of waiting silently.\n */\n promptForUrl?: boolean;\n urlPromptDelayMs?: number;\n /** The step the guide is on, shown or waiting for its page or element (to resume it after a page load). */\n onPosition?: (stepId: string) => void;\n /**\n * Run code-block steps (`step.code`). Only the SDK sets this, for published guides; the server\n * leaves code out unless a workspace admin allowed code blocks. Previews never run code.\n */\n runCode?: boolean;\n /** Render into this element instead of creating a scope in the Shadow-DOM host. */\n container?: HTMLElement;\n doc?: Document;\n}\n\nexport interface GuideController {\n readonly guide: RunnableGuide;\n start(): void;\n next(): void;\n back(): void;\n goTo(stepId: string): void;\n dismiss(): void;\n complete(): void;\n skip(): void;\n /** Re-evaluate a step waiting for a URL (call after SPA navigation). */\n resume(): void;\n destroy(): void;\n getState(): { status: GuideStatus; stepId: string | null; stepIndex: number; total: number };\n}\n\nfunction noop() {}\n\nconst escapeHtml = (s: string) => s.replace(/[&<>\"']/g, (c) => `&#${c.charCodeAt(0)};`);\n\n/** A step URL pattern the browser can open as is: a same-site path without wildcards. */\nexport function navigableUrl(pattern: string | undefined): string | null {\n if (!pattern || /[*?#\\s]/.test(pattern) || pattern.includes(\"/:\")) return null;\n if (pattern.startsWith(\"/\") && !pattern.startsWith(\"//\")) return pattern;\n try {\n const u = new URL(pattern);\n if (typeof location !== \"undefined\" && u.origin === location.origin) return u.pathname;\n } catch {\n /* not a URL */\n }\n return null;\n}\n/**\n * Runs a guide: walks steps, waits for targets, handles advancement, branches, multi-page steps,\n * buttons and cleanup. Rendering is wrapped in try/catch so the host app can never crash.\n */\nexport function runGuide(guide: RunnableGuide, options: RunGuideOptions = {}): GuideController {\n const doc = options.doc ?? (options.container?.ownerDocument || document);\n const steps = guide.config.steps;\n const total = steps.length;\n const onEvent = options.onEvent ?? noop;\n const onError = options.onError ?? noop;\n const getCtx = () => (typeof options.ctx === \"function\" ? options.ctx() : options.ctx) ?? null;\n const currentUrl = options.currentUrl ?? (() => (typeof location !== \"undefined\" ? location.href : \"\"));\n\n let status: GuideStatus = \"idle\";\n let index = -1;\n let pendingIndex = -1;\n let view: StepView | null = null;\n const stepCleanups: Array<() => void> = [];\n let started = false;\n let stepDone = false;\n let ended = false;\n const history: number[] = [];\n let scope: { el: HTMLElement; destroy(): void } | null = null;\n\n const emit = (name: EventName, step?: GuideStep | null, stepIndex?: number, properties?: Record<string, unknown>) => {\n try {\n onEvent({ name, guideId: guide.id, guideKey: guide.key, guideVersion: guide.version, stepId: step?.id, stepIndex, properties });\n } catch (err) {\n onError(err);\n }\n };\n\n const announce = (text: string) => {\n try {\n ensureHost(doc).announce(text);\n } catch {\n /* ignore */\n }\n };\n\n const getScope = (): HTMLElement => {\n if (options.container) return options.container;\n if (!scope) scope = createScope(options.theme, guide.config.appearance, doc);\n return scope.el;\n };\n\n const clearStep = () => {\n stepCleanups.splice(0).forEach((fn) => {\n try {\n fn();\n } catch {\n /* ignore */\n }\n });\n try {\n view?.destroy();\n } catch (err) {\n onError(err);\n }\n view = null;\n stepDone = false;\n };\n\n // Focus returns to where the visitor was when the guide started (steps move focus inside the guide).\n let returnFocusTo: HTMLElement | null = null;\n const restoreFocus = () => {\n const el = returnFocusTo;\n returnFocusTo = null;\n try {\n const now = doc.activeElement as HTMLElement | null;\n const lost = !now || now === doc.body || now.id === \"guidely-root\";\n if (el && lost && el.isConnected && typeof el.focus === \"function\") el.focus({ preventScroll: true });\n } catch {\n /* ignore */\n }\n };\n\n const end = (reason: GuideEndReason) => {\n if (ended) return;\n ended = true;\n const step = steps[index];\n clearStep();\n status = \"ended\";\n if (reason === \"completed\") emit(\"guide_completed\", step, index);\n else if (reason === \"dismissed\") emit(\"guide_dismissed\", step, index);\n else if (reason === \"skipped\") emit(\"guide_skipped\", step, index);\n scope?.destroy();\n scope = null;\n restoreFocus();\n try {\n options.onEnd?.(reason);\n } catch (err) {\n onError(err);\n }\n };\n\n const completeStep = () => {\n if (stepDone || index < 0) return;\n stepDone = true;\n emit(\"step_completed\", steps[index], index);\n };\n\n const goNext = (overrideStepId?: string) => {\n const step = steps[index];\n let target = -1;\n const ctx = getCtx();\n if (step && ctx) {\n for (const branch of step.branches) {\n if (evaluateRules(branch.when, ctx)) {\n target = steps.findIndex((s) => s.id === branch.goTo);\n if (target >= 0) break;\n }\n }\n }\n if (target < 0 && overrideStepId) target = steps.findIndex((s) => s.id === overrideStepId);\n if (target < 0) target = index + 1;\n if (target >= total) return end(\"completed\");\n history.push(index);\n showStep(target, 1);\n };\n\n const advance = () => {\n if (ended) return;\n completeStep();\n goNext();\n };\n\n const handleButton = (b: StepButton) => {\n try {\n switch (b.action) {\n case \"next\":\n completeStep();\n goNext(b.value);\n break;\n case \"back\":\n controller.back();\n break;\n case \"dismiss\":\n end(\"dismissed\");\n break;\n case \"complete\":\n completeStep();\n end(\"completed\");\n break;\n case \"skip\":\n end(\"skipped\");\n break;\n case \"url\": {\n completeStep();\n const url = b.value || \"\";\n if (options.onNavigate) options.onNavigate(url, b.newTab);\n else if (b.newTab) window.open(url, \"_blank\", \"noopener\");\n else location.assign(url);\n if (index + 1 >= total) end(\"completed\");\n else goNext();\n break;\n }\n case \"start_guide\":\n completeStep();\n end(\"completed\");\n options.onAction?.(\"start_guide\", b.value, b);\n break;\n case \"event\":\n options.onAction?.(\"event\", b.value, b);\n break;\n case \"open_resource_center\":\n options.onAction?.(\"open_resource_center\", b.value, b);\n break;\n default:\n break;\n }\n } catch (err) {\n onError(err);\n }\n };\n\n const setupAdvance = (step: GuideStep, target: Element | null) => {\n const modes = step.advanceOn === \"any\" ? [\"element_click\", \"element_visible\", \"event\", \"delay\"] : [step.advanceOn];\n for (const mode of modes) {\n // Without a selector, clicking the highlighted element itself moves on (tours made from how-tos).\n if (mode === \"element_click\" && (step.advanceValue || target)) {\n const selector = step.advanceValue;\n const handler = (e: Event) => {\n const t = composedTarget(e);\n try {\n if (selector ? t && closestComposed(t, selector) : t && target && containsComposed(target, t)) advance();\n } catch {\n /* invalid selector */\n }\n };\n doc.addEventListener(\"click\", handler, true);\n doc.addEventListener(\"focusin\", handler, true);\n stepCleanups.push(() => {\n doc.removeEventListener(\"click\", handler, true);\n doc.removeEventListener(\"focusin\", handler, true);\n });\n } else if (mode === \"element_visible\" && step.advanceValue) {\n const ac = new AbortController();\n stepCleanups.push(() => ac.abort());\n waitForTarget([{ kind: \"css\", value: step.advanceValue }], { timeoutMs: 0, signal: ac.signal, root: doc })\n .then((el) => {\n if (ac.signal.aborted) return;\n if (typeof IntersectionObserver === \"undefined\") return advance();\n const io = new IntersectionObserver((entries) => {\n if (entries.some((en) => en.isIntersecting)) {\n io.disconnect();\n advance();\n }\n });\n io.observe(el);\n stepCleanups.push(() => io.disconnect());\n })\n .catch(noop);\n } else if (mode === \"event\" && step.advanceValue && options.eventBus) {\n stepCleanups.push(options.eventBus.on(step.advanceValue, advance));\n } else if (mode === \"delay\") {\n const t = setTimeout(advance, step.advanceDelayMs ?? 3000);\n stepCleanups.push(() => clearTimeout(t));\n }\n }\n };\n\n const render = (step: GuideStep, target: Element | null, asModal = false) => {\n if (ended) return;\n status = \"running\";\n // A \"click the element\" step whose element is missing would leave the user stuck: give it a Next button.\n const shown = !target && step.advanceOn === \"element_click\" && !step.advanceValue && !step.buttons.length ? { ...step, buttons: [{ id: \"g-next\", label: index + 1 >= total ? \"Done\" : \"Next\", action: index + 1 >= total ? (\"complete\" as const) : (\"next\" as const), variant: \"primary\" as const }] } : step;\n try {\n view = renderStep({\n scope: getScope(),\n step: shown,\n index,\n total,\n canGoBack: history.length > 0 || index > 0,\n target,\n asModal,\n onButton: handleButton,\n onClose: () => end(\"dismissed\"),\n announce,\n runCode: options.runCode,\n onError,\n });\n } catch (err) {\n onError(err);\n view = null;\n // Rendering failed: skip the step rather than leaving the guide stuck.\n if (index + 1 < total) return goNext();\n return end(\"skipped\");\n }\n if (!started) {\n started = true;\n emit(\"guide_started\", step, index);\n }\n emit(\"step_viewed\", step, index, asModal ? { fallback: \"show_as_modal\" } : undefined);\n announce(step.title ? `${step.title}. Step ${index + 1} of ${total}` : `Step ${index + 1} of ${total}`);\n setupAdvance(step, target);\n };\n\n /** \"Continue on another page\": the waiting step's page, with a button to go there when it's a plain path. */\n const showUrlPrompt = (step: GuideStep) => {\n if (ended || status !== \"waiting_url\" || view) return;\n const href = navigableUrl(step.url);\n const where = (step.url ?? \"\").replace(/^https?:\\/\\/[^/]+/i, \"\") || \"another page\";\n const prompt: GuideStep = {\n ...step,\n type: \"modal\",\n title: \"Continue on another page\",\n body: `<p>The next step${step.title ? `, <strong>${escapeHtml(step.title)}</strong>,` : \"\"} is on <code>${escapeHtml(where)}</code>.</p>`,\n imageUrl: \"\",\n buttons: [\n ...(href ? [{ id: \"g-go\", label: \"Take me there\", action: \"url\" as const, value: href, variant: \"primary\" as const }] : []),\n { id: \"g-exit\", label: \"Exit\", action: \"dismiss\" as const, variant: href ? (\"secondary\" as const) : (\"primary\" as const) },\n ],\n };\n try {\n view = renderStep({\n scope: getScope(),\n step: prompt,\n index,\n total,\n canGoBack: false,\n target: null,\n asModal: true,\n onButton: (b) => {\n if (b.action !== \"url\" || !b.value) return end(\"dismissed\");\n if (options.onNavigate) options.onNavigate(b.value);\n else location.assign(b.value);\n },\n onClose: () => end(\"dismissed\"),\n announce,\n });\n } catch (err) {\n onError(err);\n }\n };\n\n const applyFallback = (step: GuideStep, direction: 1 | -1) => {\n const fallback = step.target?.fallback ?? \"skip\";\n emit(\"step_viewed\", step, index, { fallback, targetMissing: true });\n if (fallback === \"show_as_modal\") return render(step, null, true);\n if (fallback === \"end_guide\") return end(\"skipped\");\n // skip\n const nextIndex = index + direction;\n if (nextIndex < 0) return showStep(0, 1);\n if (nextIndex >= total) return end(\"completed\");\n showStep(nextIndex, direction);\n };\n\n function showStep(i: number, direction: 1 | -1 = 1): void {\n if (ended) return;\n clearStep();\n if (i < 0) i = 0;\n if (i >= total) return end(\"completed\");\n index = i;\n const step = steps[i] as GuideStep;\n const ctx = getCtx();\n if (step.targeting && step.targeting.rules.length && ctx && !evaluateRules(step.targeting, ctx)) {\n const nextIndex = i + direction;\n if (nextIndex >= total) return end(\"completed\");\n if (nextIndex < 0) return;\n return showStep(nextIndex, direction);\n }\n try {\n options.onPosition?.(step.id);\n } catch (err) {\n onError(err);\n }\n if (step.url && !urlMatches(step.url, currentUrl())) {\n status = \"waiting_url\";\n pendingIndex = i;\n if (options.promptForUrl) {\n const t = setTimeout(() => showUrlPrompt(step), options.urlPromptDelayMs ?? 1200);\n stepCleanups.push(() => clearTimeout(t));\n }\n return;\n }\n pendingIndex = -1;\n if (isAnchoredStep(step) && step.target) {\n status = \"waiting_target\";\n const ac = new AbortController();\n stepCleanups.push(() => ac.abort());\n const timeoutMs = step.target.fallback === \"wait\" ? 0 : step.target.waitMs;\n waitForTarget(step.target, { timeoutMs, signal: ac.signal, root: doc })\n .then((el) => {\n if (ac.signal.aborted || ended) return;\n render(step, el);\n })\n .catch((err) => {\n if (ac.signal.aborted || ended) return;\n if (err && (err as Error).name === \"AbortError\") return;\n applyFallback(step, direction);\n });\n return;\n }\n render(step, null);\n }\n\n const controller: GuideController = {\n guide,\n start() {\n if (status !== \"idle\") return;\n const focused = doc.activeElement as HTMLElement | null;\n if (focused && focused !== doc.body && focused.id !== \"guidely-root\") returnFocusTo = focused;\n emit(\"guide_viewed\");\n if (total === 0) return end(\"completed\");\n let startIndex = options.startAtStep ? steps.findIndex((s) => s.id === options.startAtStep) : 0;\n if (startIndex < 0) startIndex = 0;\n showStep(startIndex, 1);\n },\n next() {\n if (ended || index < 0) return;\n completeStep();\n goNext();\n },\n back() {\n if (ended) return;\n const prev = history.pop();\n if (prev == null) {\n if (index > 0) showStep(index - 1, -1);\n return;\n }\n showStep(prev, -1);\n },\n goTo(stepId: string) {\n const i = steps.findIndex((s) => s.id === stepId);\n if (i >= 0 && !ended) {\n if (index >= 0) history.push(index);\n showStep(i, 1);\n }\n },\n dismiss: () => end(\"dismissed\"),\n complete() {\n completeStep();\n end(\"completed\");\n },\n skip: () => end(\"skipped\"),\n resume() {\n if (ended) return;\n if (status === \"waiting_url\" && pendingIndex >= 0) {\n showStep(pendingIndex, 1);\n return;\n }\n // A rendered step whose URL no longer matches must wait again.\n const step = steps[index];\n if (step?.url && status === \"running\" && !urlMatches(step.url, currentUrl())) showStep(index, 1);\n },\n destroy() {\n if (ended) return;\n ended = true;\n clearStep();\n status = \"ended\";\n scope?.destroy();\n scope = null;\n try {\n options.onEnd?.(\"destroyed\");\n } catch (err) {\n onError(err);\n }\n },\n getState: () => ({ status, stepId: steps[index]?.id ?? null, stepIndex: index, total }),\n };\n return controller;\n}\n","import type { ChecklistConfig, ChecklistTask } from \"@guidelytech/shared\";\nimport { isChecklistComplete } from \"@guidelytech/shared/runtime\";\nimport { setSanitizedHtml } from \"./sanitize\";\n\nexport interface ChecklistProgress {\n completedTaskIds: string[];\n completedAt?: string | null;\n dismissedAt?: string | null;\n}\n\nexport interface ChecklistWidgetOptions {\n scope: HTMLElement;\n config: ChecklistConfig;\n progress?: ChecklistProgress;\n /** Initially open? Defaults to `config.autoOpen`. */\n open?: boolean;\n onTaskClick?: (task: ChecklistTask) => void;\n onDismiss?: () => void;\n onOpen?: () => void;\n onClose?: () => void;\n}\n\nexport interface ChecklistWidget {\n el: HTMLElement;\n open(): void;\n close(): void;\n toggle(): void;\n isOpen(): boolean;\n setProgress(progress: ChecklistProgress): void;\n destroy(): void;\n}\n\nexport { isChecklistComplete };\n\n/** Launcher pill + expandable panel listing tasks with checkmarks and a progress bar. */\nexport function renderChecklist(options: ChecklistWidgetOptions): ChecklistWidget {\n const { scope, config } = options;\n const doc = scope.ownerDocument;\n let progress: ChecklistProgress = options.progress ?? { completedTaskIds: [] };\n let open = options.open ?? config.autoOpen;\n const pos = `g-pos-${config.position}`;\n\n const root = doc.createElement(\"div\");\n root.className = \"g-checklist\";\n const launcher = doc.createElement(\"button\");\n launcher.type = \"button\";\n launcher.className = `g-launcher ${pos}`;\n launcher.setAttribute(\"aria-expanded\", \"false\");\n const ring = doc.createElement(\"span\");\n ring.className = \"g-ring\";\n const count = doc.createElement(\"span\");\n count.className = \"g-count\";\n ring.appendChild(count);\n launcher.appendChild(ring);\n const label = doc.createElement(\"span\");\n label.textContent = config.launcherLabel;\n launcher.appendChild(label);\n\n const panel = doc.createElement(\"div\");\n panel.className = `g-panel ${pos}`;\n panel.setAttribute(\"role\", \"dialog\");\n panel.setAttribute(\"aria-label\", config.launcherLabel);\n panel.hidden = true;\n\n const head = doc.createElement(\"div\");\n head.className = \"g-panel-head\";\n const title = doc.createElement(\"h2\");\n title.className = \"g-panel-title\";\n title.textContent = config.launcherLabel;\n const sub = doc.createElement(\"p\");\n sub.className = \"g-panel-sub\";\n const bar = doc.createElement(\"div\");\n bar.className = \"g-bar\";\n const fill = doc.createElement(\"span\");\n bar.appendChild(fill);\n const close = doc.createElement(\"button\");\n close.type = \"button\";\n close.className = \"g-close\";\n close.textContent = \"×\";\n close.setAttribute(\"aria-label\", \"Minimize checklist\");\n head.append(title, sub, bar, close);\n const body = doc.createElement(\"div\");\n body.className = \"g-panel-body\";\n const foot = doc.createElement(\"div\");\n foot.className = \"g-panel-foot\";\n panel.append(head, body, foot);\n root.append(launcher, panel);\n scope.appendChild(root);\n\n const setOpen = (v: boolean) => {\n open = v;\n panel.hidden = !v;\n launcher.setAttribute(\"aria-expanded\", String(v));\n if (v) {\n (panel.querySelector<HTMLElement>(\".g-task:not([disabled])\") || close).focus?.({ preventScroll: true });\n options.onOpen?.();\n } else options.onClose?.();\n };\n\n const renderTasks = () => {\n const done = new Set(progress.completedTaskIds);\n const doneCount = config.tasks.filter((t) => done.has(t.id)).length;\n const pct = config.tasks.length ? Math.round((doneCount / config.tasks.length) * 100) : 0;\n count.textContent = `${doneCount}/${config.tasks.length}`;\n launcher.style.setProperty(\"--g-pct\", `${pct}%`);\n launcher.setAttribute(\"aria-label\", `${config.launcherLabel}: ${doneCount} of ${config.tasks.length} tasks completed`);\n sub.textContent = `${doneCount} of ${config.tasks.length} completed`;\n fill.style.width = `${pct}%`;\n bar.setAttribute(\"role\", \"progressbar\");\n bar.setAttribute(\"aria-valuenow\", String(pct));\n bar.setAttribute(\"aria-valuemin\", \"0\");\n bar.setAttribute(\"aria-valuemax\", \"100\");\n body.textContent = \"\";\n foot.textContent = \"\";\n const complete = isChecklistComplete(config, progress);\n if (complete) {\n const wrap = doc.createElement(\"div\");\n wrap.className = \"g-complete\";\n const t = doc.createElement(\"h3\");\n t.className = \"g-title\";\n t.textContent = config.completionTitle;\n const b = doc.createElement(\"div\");\n b.className = \"g-body\";\n setSanitizedHtml(b, config.completionBody);\n wrap.append(t, b);\n body.appendChild(wrap);\n }\n const list = doc.createElement(\"div\");\n list.setAttribute(\"role\", \"list\");\n let locked = false;\n config.tasks.forEach((task, i) => {\n const isDone = done.has(task.id);\n const btn = doc.createElement(\"button\");\n btn.type = \"button\";\n btn.className = `g-task${isDone ? \" g-done\" : \"\"}`;\n btn.setAttribute(\"role\", \"listitem\");\n btn.setAttribute(\"data-task-id\", task.id);\n btn.setAttribute(\"aria-checked\", String(isDone));\n if (config.ordered && locked && !isDone) {\n btn.disabled = true;\n btn.title = \"Complete the previous task first\";\n }\n if (config.ordered && !isDone) locked = true;\n const check = doc.createElement(\"span\");\n check.className = \"g-check\";\n check.setAttribute(\"aria-hidden\", \"true\");\n check.textContent = isDone ? \"✓\" : \"\";\n const text = doc.createElement(\"span\");\n const tt = doc.createElement(\"div\");\n tt.className = \"g-task-title\";\n tt.textContent = `${i + 1}. ${task.title}`;\n text.appendChild(tt);\n if (task.description) {\n const td = doc.createElement(\"div\");\n td.className = \"g-task-desc\";\n td.textContent = task.description;\n text.appendChild(td);\n }\n btn.append(check, text);\n btn.addEventListener(\"click\", () => options.onTaskClick?.(task));\n list.appendChild(btn);\n });\n body.appendChild(list);\n if (config.dismissible) {\n const dismiss = doc.createElement(\"button\");\n dismiss.type = \"button\";\n dismiss.className = \"g-btn g-btn-ghost\";\n dismiss.textContent = complete ? \"Close\" : \"Dismiss checklist\";\n dismiss.addEventListener(\"click\", () => options.onDismiss?.());\n foot.appendChild(dismiss);\n }\n };\n\n launcher.addEventListener(\"click\", () => setOpen(!open));\n close.addEventListener(\"click\", () => setOpen(false));\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\" && open) {\n e.stopPropagation();\n setOpen(false);\n launcher.focus();\n }\n };\n panel.addEventListener(\"keydown\", onKey);\n renderTasks();\n if (open) setOpen(true);\n\n return {\n el: root,\n open: () => setOpen(true),\n close: () => setOpen(false),\n toggle: () => setOpen(!open),\n isOpen: () => open,\n setProgress(p) {\n progress = p;\n renderTasks();\n },\n destroy() {\n panel.removeEventListener(\"keydown\", onKey);\n root.remove();\n },\n };\n}\n","import type { SurveyConfig, SurveyQuestion } from \"@guidelytech/shared\";\nimport { setSanitizedHtml } from \"./sanitize\";\n\nimport { isQuestionVisible, type SurveyAnswer, type SurveyAnswers } from \"@guidelytech/shared/runtime\";\n\nexport { isQuestionVisible };\nexport type { SurveyAnswer, SurveyAnswers };\n\nexport interface SurveyWidgetOptions {\n scope: HTMLElement;\n config: SurveyConfig;\n title?: string;\n onSubmit: (answers: SurveyAnswers) => void;\n onDismiss?: () => void;\n onChange?: (answers: SurveyAnswers) => void;\n}\n\nexport interface SurveyWidget {\n el: HTMLElement;\n getAnswers(): SurveyAnswers;\n showThankYou(): void;\n destroy(): void;\n}\n\n/** Survey card: NPS/CSAT/thumbs/choice/text/rating questions with conditional follow-ups and a thank-you state. */\nexport function renderSurvey(options: SurveyWidgetOptions): SurveyWidget {\n const { scope, config } = options;\n const doc = scope.ownerDocument;\n const answers: SurveyAnswers = {};\n const card = doc.createElement(\"div\");\n card.className = `g-card g-survey g-slideout g-pos-${config.position}`;\n card.setAttribute(\"role\", \"dialog\");\n card.setAttribute(\"aria-label\", options.title || \"Survey\");\n card.tabIndex = -1;\n const inner = doc.createElement(\"div\");\n inner.className = \"g-inner\";\n card.appendChild(inner);\n if (options.onDismiss) {\n const close = doc.createElement(\"button\");\n close.type = \"button\";\n close.className = \"g-close\";\n close.textContent = \"×\";\n close.setAttribute(\"aria-label\", \"Close survey\");\n close.addEventListener(\"click\", () => options.onDismiss?.());\n card.appendChild(close);\n }\n scope.appendChild(card);\n\n const form = doc.createElement(\"form\");\n form.noValidate = true;\n inner.appendChild(form);\n const errorEl = doc.createElement(\"div\");\n errorEl.className = \"g-error\";\n errorEl.setAttribute(\"role\", \"alert\");\n\n const setAnswer = (id: string, v: SurveyAnswer | undefined) => {\n if (v === undefined || v === \"\" || (Array.isArray(v) && v.length === 0)) delete answers[id];\n else answers[id] = v;\n options.onChange?.({ ...answers });\n updateVisibility();\n };\n\n const questionEls = new Map<string, HTMLElement>();\n\n const scaleButtons = (q: SurveyQuestion, min: number, max: number, labels?: boolean) => {\n const wrap = doc.createElement(\"div\");\n const row = doc.createElement(\"div\");\n row.className = \"g-scale\";\n row.setAttribute(\"role\", \"radiogroup\");\n row.setAttribute(\"aria-label\", q.title);\n for (let i = min; i <= max; i++) {\n const b = doc.createElement(\"button\");\n b.type = \"button\";\n b.textContent = String(i);\n b.setAttribute(\"aria-pressed\", \"false\");\n b.addEventListener(\"click\", () => {\n row.querySelectorAll(\"button\").forEach((x) => x.setAttribute(\"aria-pressed\", \"false\"));\n b.setAttribute(\"aria-pressed\", \"true\");\n setAnswer(q.id, i);\n });\n row.appendChild(b);\n }\n wrap.appendChild(row);\n if (labels && (q.lowLabel || q.highLabel)) {\n const l = doc.createElement(\"div\");\n l.className = \"g-scale-labels\";\n l.append(Object.assign(doc.createElement(\"span\"), { textContent: q.lowLabel || \"\" }), Object.assign(doc.createElement(\"span\"), { textContent: q.highLabel || \"\" }));\n wrap.appendChild(l);\n }\n return wrap;\n };\n\n const buildInput = (q: SurveyQuestion): HTMLElement => {\n switch (q.type) {\n case \"nps\":\n return scaleButtons(q, 0, 10, true);\n case \"csat\":\n return scaleButtons(q, 1, q.scaleMax ?? 5, true);\n case \"rating\": {\n const max = q.scaleMax ?? 5;\n const row = doc.createElement(\"div\");\n row.className = \"g-stars\";\n row.setAttribute(\"role\", \"radiogroup\");\n row.setAttribute(\"aria-label\", q.title);\n const btns: HTMLButtonElement[] = [];\n for (let i = 1; i <= max; i++) {\n const b = doc.createElement(\"button\");\n b.type = \"button\";\n b.textContent = \"★\";\n b.setAttribute(\"aria-label\", `${i} of ${max}`);\n b.setAttribute(\"aria-pressed\", \"false\");\n b.addEventListener(\"click\", () => {\n btns.forEach((x, j) => {\n x.classList.toggle(\"g-on\", j < i);\n x.setAttribute(\"aria-pressed\", String(j === i - 1));\n });\n setAnswer(q.id, i);\n });\n btns.push(b);\n row.appendChild(b);\n }\n return row;\n }\n case \"thumbs\": {\n const row = doc.createElement(\"div\");\n row.className = \"g-thumbs\";\n row.setAttribute(\"role\", \"radiogroup\");\n [\n [\"up\", \"👍\", \"Thumbs up\"],\n [\"down\", \"👎\", \"Thumbs down\"],\n ].forEach(([val, icon, lbl]) => {\n const b = doc.createElement(\"button\");\n b.type = \"button\";\n b.textContent = icon as string;\n b.setAttribute(\"aria-label\", lbl as string);\n b.setAttribute(\"aria-pressed\", \"false\");\n b.addEventListener(\"click\", () => {\n row.querySelectorAll(\"button\").forEach((x) => x.setAttribute(\"aria-pressed\", \"false\"));\n b.setAttribute(\"aria-pressed\", \"true\");\n setAnswer(q.id, val === \"up\");\n });\n row.appendChild(b);\n });\n return row;\n }\n case \"single_choice\":\n case \"multiple_choice\": {\n const multi = q.type === \"multiple_choice\";\n const group = doc.createElement(\"div\");\n group.setAttribute(\"role\", multi ? \"group\" : \"radiogroup\");\n group.setAttribute(\"aria-label\", q.title);\n q.options.forEach((opt) => {\n const b = doc.createElement(\"button\");\n b.type = \"button\";\n b.className = `g-choice${multi ? \" g-multi\" : \"\"}`;\n b.setAttribute(\"role\", multi ? \"checkbox\" : \"radio\");\n b.setAttribute(\"aria-checked\", \"false\");\n b.setAttribute(\"data-option-id\", opt.id);\n const dot = doc.createElement(\"span\");\n dot.className = \"g-dot\";\n b.append(dot, Object.assign(doc.createElement(\"span\"), { textContent: opt.label }));\n b.addEventListener(\"click\", () => {\n if (multi) {\n const cur = new Set((answers[q.id] as string[] | undefined) ?? []);\n if (cur.has(opt.id)) cur.delete(opt.id);\n else cur.add(opt.id);\n b.setAttribute(\"aria-checked\", String(cur.has(opt.id)));\n setAnswer(q.id, Array.from(cur));\n } else {\n group.querySelectorAll(\".g-choice\").forEach((x) => x.setAttribute(\"aria-checked\", \"false\"));\n b.setAttribute(\"aria-checked\", \"true\");\n setAnswer(q.id, opt.id);\n }\n });\n group.appendChild(b);\n });\n return group;\n }\n case \"text\":\n default: {\n const ta = doc.createElement(\"textarea\");\n ta.className = \"g-input\";\n ta.rows = 3;\n ta.placeholder = q.placeholder || \"\";\n ta.setAttribute(\"aria-label\", q.title);\n ta.addEventListener(\"input\", () => setAnswer(q.id, ta.value.slice(0, 5000)));\n return ta;\n }\n }\n };\n\n config.questions.forEach((q) => {\n const wrap = doc.createElement(\"div\");\n wrap.className = \"g-question\";\n wrap.setAttribute(\"data-question-id\", q.id);\n const t = doc.createElement(\"p\");\n t.className = \"g-q-title\";\n t.textContent = q.title + (q.required ? \"\" : \" (optional)\");\n wrap.appendChild(t);\n if (q.description) {\n const d = doc.createElement(\"p\");\n d.className = \"g-q-desc\";\n d.textContent = q.description;\n wrap.appendChild(d);\n }\n wrap.appendChild(buildInput(q));\n questionEls.set(q.id, wrap);\n form.appendChild(wrap);\n });\n\n const footer = doc.createElement(\"div\");\n footer.className = \"g-footer\";\n const submit = doc.createElement(\"button\");\n submit.type = \"submit\";\n submit.className = \"g-btn g-btn-primary\";\n submit.textContent = \"Submit\";\n footer.appendChild(submit);\n form.appendChild(errorEl);\n form.appendChild(footer);\n\n function updateVisibility() {\n config.questions.forEach((q) => {\n const el = questionEls.get(q.id);\n if (!el) return;\n const visible = isQuestionVisible(q, answers);\n el.hidden = !visible;\n if (!visible && answers[q.id] !== undefined) delete answers[q.id];\n });\n }\n\n form.addEventListener(\"submit\", (e) => {\n e.preventDefault();\n const missing = config.questions.filter((q) => q.required && isQuestionVisible(q, answers) && answers[q.id] === undefined);\n if (missing.length) {\n errorEl.textContent = `Please answer: ${missing.map((q) => q.title).join(\", \")}`;\n questionEls.get(missing[0]!.id)?.querySelector<HTMLElement>(\"button,textarea\")?.focus();\n return;\n }\n errorEl.textContent = \"\";\n options.onSubmit({ ...answers });\n });\n\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\" && options.onDismiss) {\n e.stopPropagation();\n options.onDismiss();\n }\n };\n card.addEventListener(\"keydown\", onKey);\n updateVisibility();\n (form.querySelector<HTMLElement>(\"button,textarea\") || card).focus?.({ preventScroll: true });\n\n return {\n el: card,\n getAnswers: () => ({ ...answers }),\n showThankYou() {\n inner.textContent = \"\";\n const wrap = doc.createElement(\"div\");\n wrap.className = \"g-complete\";\n const t = doc.createElement(\"h3\");\n t.className = \"g-title\";\n t.textContent = config.thankYouTitle;\n const b = doc.createElement(\"div\");\n b.className = \"g-body\";\n setSanitizedHtml(b, config.thankYouBody);\n const done = doc.createElement(\"button\");\n done.type = \"button\";\n done.className = \"g-btn g-btn-primary\";\n done.textContent = \"Done\";\n done.style.marginTop = \"12px\";\n done.addEventListener(\"click\", () => options.onDismiss?.());\n wrap.append(t, b, done);\n inner.appendChild(wrap);\n done.focus?.({ preventScroll: true });\n },\n destroy() {\n card.removeEventListener(\"keydown\", onKey);\n card.remove();\n },\n };\n}\n","import type { ResourceCenterArticle, ResourceCenterConfig, ResourceCenterModuleId, RuleGroup } from \"@guidelytech/shared\";\nimport { orderedModules, unreadAnnouncements, visibleAnnouncements } from \"@guidelytech/shared/runtime\";\nimport { createHelpView, el, type HelpGuideRef } from \"./help-view\";\n\nexport type ResourceCenterGuideRef = HelpGuideRef;\n\nexport interface ResourceCenterOptions {\n scope: HTMLElement;\n config: ResourceCenterConfig;\n /** Published guides (used to display recommended guides and checklists by id/key). */\n guides?: ResourceCenterGuideRef[];\n /** Server search. Results are merged with the client-side title/summary filter. */\n search?: (q: string) => Promise<ResourceCenterArticle[]>;\n /** The visitor's audiences (for audience-targeted articles and collections). */\n audienceIds?: () => ReadonlySet<string> | readonly string[];\n /** Loads bodies the published config left out to stay small (`bodyOmitted`). */\n loadArticle?: (id: string) => Promise<ResourceCenterArticle | null>;\n onStartGuide?: (guideId: string) => void;\n onOpenChecklist?: (guideId: string) => void;\n onArticleView?: (article: ResourceCenterArticle) => void;\n onOpen?: () => void;\n onClose?: () => void;\n /** Hide the launcher (when the host app provides its own trigger). */\n hideLauncher?: boolean;\n /** Evaluates a module's targeting for the current visitor (absent = every module shows). */\n evaluate?: (rules: RuleGroup) => boolean;\n /** When the visitor last opened \"What's new\" (for the unread badge). */\n announcementsSeenAt?: () => string | null | undefined;\n /** The panel opened with \"What's new\" visible: everything listed is now read. */\n onAnnouncementsSeen?: () => void;\n}\n\nexport interface ResourceCenterWidget {\n el: HTMLElement;\n open(): void;\n close(): void;\n toggle(): void;\n isOpen(): boolean;\n destroy(): void;\n}\n\n/** Launcher + panel with search, collections, articles, recommended guides, checklists, FAQs and links. */\nexport function renderResourceCenter(options: ResourceCenterOptions): ResourceCenterWidget {\n const { scope, config } = options;\n const doc = scope.ownerDocument;\n const guides = options.guides ?? [];\n let open = false;\n const pos = `g-pos-${config.launcher.position}`;\n const byId = (ids: string[]) => ids.map((id) => guides.find((g) => g.id === id || g.key === id)).filter((g): g is ResourceCenterGuideRef => !!g);\n\n const root = el(doc, \"div\", \"g-resource-center\");\n const launcher = el(doc, \"button\", `g-launcher ${pos}`);\n launcher.type = \"button\";\n launcher.setAttribute(\"aria-expanded\", \"false\");\n if (config.launcher.showIcon) {\n const icon = el(doc, \"span\", \"\", \"?\");\n icon.setAttribute(\"aria-hidden\", \"true\");\n launcher.appendChild(icon);\n }\n launcher.appendChild(el(doc, \"span\", \"\", config.launcher.label || config.title));\n launcher.setAttribute(\"aria-label\", config.launcher.label || config.title);\n if (options.hideLauncher) launcher.hidden = true;\n const badge = el(doc, \"span\", \"g-launcher-badge\");\n badge.hidden = true;\n launcher.appendChild(badge);\n\n /** Sections this visitor sees, in order (disabled ones and ones whose targeting doesn't match are left out). */\n const modules = (): ResourceCenterModuleId[] =>\n orderedModules(config.modules)\n .filter((m) => m.enabled && (!(\"targeting\" in m) || !m.targeting || !options.evaluate || options.evaluate(m.targeting)))\n .map((m) => m.id as ResourceCenterModuleId);\n const announcements = () => (modules().includes(\"announcements\") ? visibleAnnouncements(config.announcements, options.audienceIds?.() ?? []) : []);\n const updateBadge = () => {\n const unread = unreadAnnouncements(announcements(), options.announcementsSeenAt?.());\n badge.hidden = unread === 0;\n badge.textContent = unread > 9 ? \"9+\" : String(unread);\n const label = config.launcher.label || config.title;\n launcher.setAttribute(\"aria-label\", unread ? `${label} (${unread} new update${unread === 1 ? \"\" : \"s\"})` : label);\n };\n updateBadge();\n\n const panel = el(doc, \"div\", `g-panel ${pos}`);\n panel.setAttribute(\"role\", \"dialog\");\n panel.setAttribute(\"aria-label\", config.title);\n panel.hidden = true;\n const head = el(doc, \"div\", \"g-panel-head\");\n head.appendChild(el(doc, \"h2\", \"g-panel-title\", config.title));\n const close = el(doc, \"button\", \"g-close\", \"×\");\n close.type = \"button\";\n close.setAttribute(\"aria-label\", \"Close\");\n head.appendChild(close);\n let seenAtOpen: string | null = options.announcementsSeenAt?.() ?? null;\n const help = createHelpView({\n doc,\n data: () => ({\n collections: config.collections,\n articles: config.articles,\n recommended: byId(config.recommendedGuideIds),\n checklists: byId(config.checklistGuideIds),\n faqs: config.faqs,\n links: config.links,\n announcements: announcements(),\n announcementsSeenAt: seenAtOpen,\n modules: modules(),\n }),\n search: options.search,\n audienceIds: options.audienceIds,\n loadArticle: options.loadArticle,\n onStartGuide: options.onStartGuide,\n onOpenChecklist: options.onOpenChecklist,\n onArticleView: options.onArticleView,\n guides: () => guides,\n onShowMe: (key) => {\n setOpen(false);\n options.onStartGuide?.(key);\n },\n // Articles read in a larger panel.\n onArticleChange: (reading) => panel.classList.toggle(\"g-panel-reading\", reading),\n });\n panel.append(head, help.el);\n root.append(launcher, panel);\n scope.appendChild(root);\n\n const setOpen = (v: boolean) => {\n if (open === v) return;\n open = v;\n panel.hidden = !v;\n launcher.setAttribute(\"aria-expanded\", String(v));\n if (v) {\n // Entries stay marked \"New\" while the panel is open; the badge clears now.\n seenAtOpen = options.announcementsSeenAt?.() ?? null;\n help.render();\n help.focusSearch();\n if (announcements().length) {\n options.onAnnouncementsSeen?.();\n updateBadge();\n }\n options.onOpen?.();\n } else {\n help.reset();\n options.onClose?.();\n }\n };\n launcher.addEventListener(\"click\", () => setOpen(!open));\n close.addEventListener(\"click\", () => setOpen(false));\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n e.stopPropagation();\n setOpen(false);\n launcher.focus();\n }\n };\n panel.addEventListener(\"keydown\", onKey);\n\n return {\n el: root,\n open: () => setOpen(true),\n close: () => setOpen(false),\n toggle: () => setOpen(!open),\n isOpen: () => open,\n destroy() {\n help.destroy();\n panel.removeEventListener(\"keydown\", onKey);\n root.remove();\n },\n };\n}\n","import type { AuthoringPick, GuideStep, ProjectTheme, SelectorStrategy } from \"@guidelytech/shared\";\nimport { runGuide, type GuideController, type RunnableGuide } from \"./controller\";\nimport { createScope, ensureHost } from \"./host\";\nimport { componentAnchor, composedTarget, deepElementFromPoint, describeElement, isGuidelyElement, querySelectorStrategy, resolveTarget, visualRect } from \"./selectors\";\n\nexport interface AuthoringOptions {\n /** Called with the pick for each clicked element. */\n onPick: (pick: AuthoringPick & { element: Element }) => void;\n /** Called when the user exits authoring mode (Done / Exit / Esc with nothing hovered). */\n onExit: () => void;\n dashboardOrigin?: string;\n /** Text shown in the toolbar. */\n message?: string;\n doc?: Document;\n}\n\nexport interface AuthoringSession {\n /** Replace the toolbar status text. */\n setStatus(text: string): void;\n /** Pause/resume picking (e.g. while a preview is shown). */\n setPicking(enabled: boolean): void;\n stop(): void;\n}\n\nconst DEFAULT_MESSAGE = \"Guidely authoring — hover an element and click to select · Esc to cancel\";\n\n/**\n * Enters authoring mode: Shadow-DOM toolbar, hover outline following `elementFromPoint`, and\n * click-to-pick (captured in the capture phase so the host app never receives the click).\n */\nexport function startAuthoring(options: AuthoringOptions): AuthoringSession {\n const doc = options.doc ?? document;\n const win = doc.defaultView ?? window;\n const scope = createScope(null, { theme: \"light\", animation: \"none\" }, doc);\n const bar = doc.createElement(\"div\");\n bar.className = \"g-auth-bar\";\n bar.setAttribute(\"role\", \"toolbar\");\n const dot = doc.createElement(\"span\");\n dot.className = \"g-dot-live\";\n const status = doc.createElement(\"span\");\n status.textContent = options.message ?? DEFAULT_MESSAGE;\n const spacer = doc.createElement(\"span\");\n spacer.className = \"g-spacer\";\n const done = doc.createElement(\"button\");\n done.type = \"button\";\n done.className = \"g-btn g-btn-primary\";\n done.textContent = \"Done\";\n const exit = doc.createElement(\"button\");\n exit.type = \"button\";\n exit.className = \"g-btn g-btn-secondary\";\n exit.textContent = \"Exit authoring\";\n bar.append(dot, status, spacer, done, exit);\n const outline = doc.createElement(\"div\");\n outline.className = \"g-auth-outline\";\n outline.hidden = true;\n const label = doc.createElement(\"span\");\n label.className = \"g-auth-label\";\n outline.appendChild(label);\n scope.el.append(bar, outline);\n\n let picking = true;\n let hovered: Element | null = null;\n let stopped = false;\n\n const describe = (el: Element): string => {\n const tag = el.tagName.toLowerCase();\n const id = el.id ? `#${el.id}` : \"\";\n const tour = el.getAttribute(\"data-tour\") || el.getAttribute(\"data-testid\");\n const text = (el.textContent || \"\").replace(/\\s+/g, \" \").trim().slice(0, 40);\n return `${tag}${id}${tour ? `[${tour}]` : \"\"}${text ? ` “${text}”` : \"\"}`;\n };\n\n const paint = (el: Element | null, picked = false) => {\n if (!el) {\n outline.hidden = true;\n return;\n }\n const r = visualRect(el);\n outline.hidden = false;\n outline.classList.toggle(\"g-picked\", picked);\n Object.assign(outline.style, { left: `${r.left}px`, top: `${r.top}px`, width: `${r.width}px`, height: `${r.height}px` });\n label.textContent = describe(el);\n label.style.top = r.top < 30 ? \"100%\" : \"-24px\";\n };\n\n const elementAt = (x: number, y: number): Element | null => {\n const el = deepElementFromPoint(doc, x, y);\n if (!el || isGuidelyElement(el) || el === doc.documentElement || el === doc.body) return null;\n // Outline what will be targeted: a component rather than its internals.\n return componentAnchor(el);\n };\n\n const onMove = (e: MouseEvent) => {\n if (!picking || stopped) return;\n const el = elementAt(e.clientX, e.clientY);\n if (el !== hovered) {\n hovered = el;\n paint(el);\n }\n };\n const onScroll = () => {\n if (hovered) paint(hovered);\n };\n const onClick = (e: MouseEvent) => {\n if (!picking || stopped) return;\n if (isGuidelyElement(composedTarget(e))) return;\n const el = elementAt(e.clientX, e.clientY) ?? hovered;\n if (!el) return;\n e.preventDefault();\n e.stopPropagation();\n e.stopImmediatePropagation();\n const d = describeElement(el);\n paint(el, true);\n status.textContent = `Selected ${describe(el)} — click another element or press Done`;\n options.onPick({ selectors: d.selectors, textSnapshot: d.textSnapshot, rect: d.rect, url: win.location.href, element: el });\n };\n const swallow = (e: Event) => {\n if (!picking || stopped) return;\n if (isGuidelyElement(composedTarget(e))) return;\n e.preventDefault();\n e.stopPropagation();\n };\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n e.preventDefault();\n e.stopPropagation();\n stop();\n options.onExit();\n }\n };\n const stop = () => {\n if (stopped) return;\n stopped = true;\n doc.removeEventListener(\"mousemove\", onMove, true);\n doc.removeEventListener(\"click\", onClick, true);\n doc.removeEventListener(\"mousedown\", swallow, true);\n doc.removeEventListener(\"mouseup\", swallow, true);\n doc.removeEventListener(\"keydown\", onKey, true);\n win.removeEventListener(\"scroll\", onScroll, true);\n win.removeEventListener(\"resize\", onScroll);\n scope.destroy();\n };\n done.addEventListener(\"click\", () => {\n stop();\n options.onExit();\n });\n exit.addEventListener(\"click\", () => {\n stop();\n options.onExit();\n });\n doc.addEventListener(\"mousemove\", onMove, true);\n doc.addEventListener(\"click\", onClick, true);\n doc.addEventListener(\"mousedown\", swallow, true);\n doc.addEventListener(\"mouseup\", swallow, true);\n doc.addEventListener(\"keydown\", onKey, true);\n win.addEventListener(\"scroll\", onScroll, true);\n win.addEventListener(\"resize\", onScroll);\n\n return {\n setStatus: (text) => {\n status.textContent = text;\n },\n setPicking: (enabled) => {\n picking = enabled;\n if (!enabled) paint(null);\n },\n stop,\n };\n}\n\nexport interface PreviewHandle {\n controller: GuideController;\n destroy(): void;\n}\n\n/**\n * Renders a single draft step on the current page (used by the dashboard editor's \"preview in\n * app\" and by the simulated preview). Anchored steps resolve their target; when it cannot be\n * found the step is shown as a modal so authors always see something.\n */\nexport function previewStep(step: GuideStep, theme?: Partial<ProjectTheme> | null, options: { appearance?: RunnableGuide[\"config\"][\"appearance\"]; onEnd?: () => void; doc?: Document; index?: number; total?: number } = {}): PreviewHandle {\n const previewStepConfig: GuideStep = { ...step, target: step.target ? { ...step.target, fallback: \"show_as_modal\", waitMs: Math.min(step.target.waitMs, 1500) } : step.target };\n const guide: RunnableGuide = {\n id: `preview-${step.id}`,\n key: \"preview\",\n name: \"Preview\",\n kind: \"flow\",\n version: 0,\n config: { steps: [previewStepConfig], visibility: \"everyone\", targeting: { id: \"root\", op: \"and\", rules: [] }, trigger: { type: \"manual\", delayMs: 0 }, frequency: { mode: \"every_time\", cooldownHours: 0, priority: 0, mutuallyExclusiveWith: [], reshowAfterDismiss: true }, appearance: options.appearance ?? { theme: \"auto\", animation: \"fade\" }, urlPatterns: [], platforms: [\"web\"] },\n };\n const controller = runGuide(guide, { theme, doc: options.doc, onEnd: () => options.onEnd?.(), onNavigate: () => {}, onAction: () => {} });\n controller.start();\n return { controller, destroy: () => controller.destroy() };\n}\n\nexport interface HighlightHandle {\n /** Number of matched elements per strategy. */\n counts: number[];\n /** Element resolved as the step target (first strategy with exactly one visible match). */\n resolved: Element | null;\n destroy(): void;\n}\n\n/** Draws dashed boxes around every element matched by the selectors, for testing selectors while authoring. */\nexport function highlightSelectors(selectors: SelectorStrategy[], options: { durationMs?: number; doc?: Document } = {}): HighlightHandle {\n const doc = options.doc ?? document;\n const scope = createScope(null, { theme: \"light\", animation: \"none\" }, doc);\n const boxes: HTMLElement[] = [];\n const counts: number[] = [];\n const resolved = resolveTarget(selectors, doc);\n const matched = new Set<Element>();\n selectors.forEach((s) => {\n const els = querySelectorStrategy(s, doc).filter((el) => !isGuidelyElement(el));\n counts.push(els.length);\n els.forEach((el) => matched.add(el));\n });\n matched.forEach((el) => {\n const r = visualRect(el);\n const box = doc.createElement(\"div\");\n box.className = \"g-highlight\";\n Object.assign(box.style, { left: `${r.left}px`, top: `${r.top}px`, width: `${r.width}px`, height: `${r.height}px` });\n if (el === resolved) box.style.borderColor = \"#22c55e\";\n scope.el.appendChild(box);\n boxes.push(box);\n });\n let timer: ReturnType<typeof setTimeout> | null = null;\n const destroy = () => {\n if (timer) clearTimeout(timer);\n scope.destroy();\n };\n if (options.durationMs !== 0) timer = setTimeout(destroy, options.durationMs ?? 2500);\n ensureHost(doc);\n return { counts, resolved, destroy };\n}\n"],"mappings":"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","names":["el","el","el","el","el"]}