@guidelytech/guide-runtime 0.8.0 → 0.9.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/capture.cjs +8 -0
- package/dist/capture.cjs.map +1 -1
- package/dist/capture.js +2 -2
- package/dist/chunk-KJRXCITD.js +515 -0
- package/dist/chunk-KJRXCITD.js.map +1 -0
- package/dist/chunk-PG7CMBHD.js +330 -0
- package/dist/chunk-PG7CMBHD.js.map +1 -0
- package/dist/chunk-VNJPNGZ4.js +301 -0
- package/dist/chunk-VNJPNGZ4.js.map +1 -0
- package/dist/index.cjs +138 -18
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +10 -1
- package/dist/index.d.ts +10 -1
- package/dist/index.js +74 -10
- package/dist/index.js.map +1 -1
- package/dist/messenger.cjs +586 -35
- package/dist/messenger.cjs.map +1 -1
- package/dist/messenger.d.cts +21 -1
- package/dist/messenger.d.ts +21 -1
- package/dist/messenger.js +527 -23
- package/dist/messenger.js.map +1 -1
- package/package.json +5 -5
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 /** 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\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) => {\n const modes = step.advanceOn === \"any\" ? [\"element_click\", \"element_visible\", \"event\", \"delay\"] : [step.advanceOn];\n for (const mode of modes) {\n if (mode === \"element_click\" && step.advanceValue) {\n const selector = step.advanceValue;\n const handler = (e: Event) => {\n const t = e.target as Element | null;\n try {\n if (t && typeof t.closest === \"function\" && t.closest(selector)) 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 try {\n view = renderStep({\n scope: getScope(),\n step,\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);\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 if (step.url && !urlMatches(step.url, currentUrl())) {\n status = \"waiting_url\";\n pendingIndex = i;\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 });\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], 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\";\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"]}
|