@guidelytech/guide-runtime 0.2.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +16 -32
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +5 -8
- package/dist/index.d.ts +5 -8
- package/dist/index.js +11 -27
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/selectors.ts","../src/sanitize.ts","../src/styles.ts","../src/host.ts","../src/position.ts","../src/render.ts","../src/controller.ts","../src/checklist.ts","../src/survey.ts","../src/help-view.ts","../src/resource-center.ts","../src/authoring.ts"],"sourcesContent":["/**\n * @guidelytech/guide-runtime — framework-free DOM engine for Guidely guides.\n *\n * Selectors, Shadow-DOM host, step renderers, guide controller, checklist/survey/resource-center\n * widgets, HTML sanitizer and authoring (element picker) utilities.\n */\nexport { resolveTarget, waitForTarget, generateSelectors, describeElement, textSnapshotOf, isVisible, isStableId, isGuidelyElement, querySelectorStrategy, normalizeText, urlMatches, TargetTimeoutError } from \"./selectors\";\nexport type { WaitForTargetOptions, ElementDescription, QueryRoot } from \"./selectors\";\nexport { sanitizeHtml, sanitizeToFragment, setSanitizedHtml } from \"./sanitize\";\nexport { ensureHost, destroyHost, createScope, resolveTheme, applyTheme, prefersReducedMotion, DEFAULT_THEME, HOST_ID } from \"./host\";\nexport type { HostHandle, ThemeVars, ResolvedThemeMode } from \"./host\";\nexport { anchor, trackRect } from \"./position\";\nexport type { AnchorOptions } from \"./position\";\nexport { renderStep, buildCard, isAnchoredStep, renderModal, renderTooltip, renderSpotlight, renderHotspot, renderBanner, renderSlideout, renderCustom } from \"./render\";\nexport type { RenderStepOptions, StepView } from \"./render\";\nexport { runGuide } from \"./controller\";\nexport type { GuideController, RunGuideOptions, RunnableGuide, RuntimeEvent, GuideEndReason, GuideStatus } from \"./controller\";\nexport { renderChecklist, isChecklistComplete } from \"./checklist\";\nexport type { ChecklistWidget, ChecklistWidgetOptions, ChecklistProgress } from \"./checklist\";\nexport { renderSurvey, isQuestionVisible } from \"./survey\";\nexport type { SurveyWidget, SurveyWidgetOptions, SurveyAnswers, SurveyAnswer } from \"./survey\";\nexport { renderResourceCenter } from \"./resource-center\";\nexport type { ResourceCenterWidget, ResourceCenterOptions, ResourceCenterGuideRef } from \"./resource-center\";\nexport { startAuthoring, previewStep, highlightSelectors } from \"./authoring\";\nexport type { AuthoringOptions, AuthoringSession, PreviewHandle, HighlightHandle } from \"./authoring\";\nexport { STYLES } from \"./styles\";\n","import { matchUrlPattern } from \"@guidelytech/shared/runtime\";\nimport type { SelectorStrategy, StepTarget } from \"@guidelytech/shared\";\n\n/**\n * URL matching used for `step.url`, `urlPatterns` and `trigger.urlPattern`: a pattern matches the\n * full URL, the path+query+hash, or the bare path (so `/deals` also matches `/deals?x=1`).\n */\nexport function urlMatches(pattern: string | undefined | null, url: string): boolean {\n if (!pattern) return true;\n if (matchUrlPattern(pattern, url)) return true;\n try {\n const u = new URL(url, \"http://localhost\");\n if (!pattern.includes(\"?\") && !pattern.includes(\"#\")) return matchUrlPattern(pattern, u.pathname) || matchUrlPattern(pattern, u.origin + u.pathname);\n } catch {\n /* ignore */\n }\n return false;\n}\n\nexport type QueryRoot = Document | DocumentFragment | Element;\n\nconst TEXT_CANDIDATES =\n \"button, a, [role='button'], [role='link'], [role='tab'], [role='menuitem'], h1, h2, h3, h4, h5, h6, label, summary\";\n\nconst HOST_ID = \"guidely-root\";\n\nfunction docOf(root: QueryRoot): Document {\n return root.nodeType === 9 ? (root as Document) : (root.ownerDocument as Document);\n}\n\n/** True when the environment has a layout engine (real browsers). happy-dom/jsdom report zero sizes. */\nfunction hasLayout(doc: Document): boolean {\n const de = doc.documentElement;\n if (!de) return false;\n const r = de.getBoundingClientRect();\n return r.width > 0 || r.height > 0;\n}\n\n/** Normalises whitespace in a text snippet. */\nexport function normalizeText(text: string | null | undefined): string {\n return (text || \"\").replace(/\\s+/g, \" \").trim();\n}\n\n/** Is the element rendered (not hidden by `hidden`, `display:none`, `visibility:hidden`, or zero size)? */\nexport function isVisible(el: Element): boolean {\n if (!el.isConnected) return false;\n const doc = el.ownerDocument;\n const win = doc.defaultView;\n let cur: Element | null = el;\n while (cur && cur !== doc.documentElement) {\n if ((cur as HTMLElement).hidden) return false;\n if (win) {\n const cs = win.getComputedStyle(cur);\n if (cs.display === \"none\" || cs.visibility === \"hidden\") return false;\n }\n cur = cur.parentElement ?? ((cur.getRootNode() as ShadowRoot).host as Element | undefined) ?? null;\n }\n if (hasLayout(doc)) {\n const r = el.getBoundingClientRect();\n if (r.width === 0 && r.height === 0) return false;\n }\n return true;\n}\n\n/** Elements that belong to Guidely's own UI are never valid targets. */\nexport function isGuidelyElement(el: Element | null): boolean {\n if (!el) return false;\n const root = el.getRootNode();\n if (root instanceof ShadowRoot && root.host.id === HOST_ID) return true;\n return el.id === HOST_ID || !!el.closest?.(`#${HOST_ID}`);\n}\n\nfunction safeQueryAll(root: QueryRoot, selector: string): Element[] {\n try {\n return Array.from(root.querySelectorAll(selector));\n } catch {\n return [];\n }\n}\n\nfunction escapeCss(value: string): string {\n const g = globalThis as { CSS?: { escape?: (v: string) => string } };\n if (g.CSS && typeof g.CSS.escape === \"function\") return g.CSS.escape(value);\n return value.replace(/[\"\\\\]/g, \"\\\\$&\");\n}\n\nfunction queryXPath(root: QueryRoot, expr: string): Element[] {\n const doc = docOf(root);\n const d = doc as Document & { evaluate?: Document[\"evaluate\"] };\n if (typeof d.evaluate !== \"function\") return [];\n try {\n const result = d.evaluate(expr, root, null, 7 /* ORDERED_NODE_SNAPSHOT_TYPE */, null);\n const out: Element[] = [];\n for (let i = 0; i < result.snapshotLength; i++) {\n const n = result.snapshotItem(i);\n if (n && n.nodeType === 1) out.push(n as Element);\n }\n return out;\n } catch {\n return [];\n }\n}\n\nfunction queryText(root: QueryRoot, text: string): Element[] {\n const needle = normalizeText(text).toLowerCase();\n if (!needle) return [];\n const candidates = safeQueryAll(root, TEXT_CANDIDATES);\n const exact = candidates.filter((c) => normalizeText(c.textContent).toLowerCase() === needle);\n if (exact.length) return exact;\n return candidates.filter((c) => normalizeText(c.textContent).toLowerCase().includes(needle));\n}\n\n/** Resolves every element matching one strategy (visible or not). */\nexport function querySelectorStrategy(strategy: SelectorStrategy, root: QueryRoot): Element[] {\n const value = strategy.value.trim();\n if (!value) return [];\n switch (strategy.kind) {\n case \"id\": {\n const id = value.startsWith(\"#\") ? value.slice(1) : value;\n return safeQueryAll(root, `#${escapeCss(id)}`);\n }\n case \"data-attr\":\n case \"aria\":\n case \"css\":\n return safeQueryAll(root, value.startsWith(\"[\") || /^[a-z*#.[]/i.test(value) ? value : `[${value}]`);\n case \"text\":\n return queryText(root, value);\n case \"xpath\":\n return queryXPath(root, value);\n default:\n return [];\n }\n}\n\n/**\n * Resolves a step target by trying each strategy in order. A strategy wins only when it\n * resolves to exactly one *visible* element; otherwise the next strategy is tried.\n */\nexport function resolveTarget(target: Pick<StepTarget, \"selectors\"> | SelectorStrategy[], root: QueryRoot = document): Element | null {\n const selectors = Array.isArray(target) ? target : target.selectors;\n for (const strategy of selectors) {\n const matches = querySelectorStrategy(strategy, root).filter((el) => !isGuidelyElement(el) && isVisible(el));\n if (matches.length === 1) return matches[0] as Element;\n }\n return null;\n}\n\nexport interface WaitForTargetOptions {\n /** Give up after this many milliseconds (default 5000). */\n timeoutMs?: number;\n /** Abort early. */\n signal?: AbortSignal;\n root?: QueryRoot;\n /** Polling fallback interval (default 250ms, which is also the maximum). */\n pollMs?: number;\n}\n\nexport class TargetTimeoutError extends Error {\n override name = \"TargetTimeoutError\";\n constructor(message = \"Target element not found before timeout\") {\n super(message);\n }\n}\n\n/**\n * Waits until `resolveTarget` finds an element. Uses a MutationObserver plus a polling fallback\n * (at most every 250ms) so visibility changes without DOM mutations are also detected.\n */\nexport function waitForTarget(target: Pick<StepTarget, \"selectors\"> | SelectorStrategy[], options: WaitForTargetOptions = {}): Promise<Element> {\n const timeoutMs = options.timeoutMs ?? 5000;\n const root = options.root ?? document;\n const pollMs = Math.min(250, Math.max(16, options.pollMs ?? 250));\n return new Promise<Element>((resolve, reject) => {\n const immediate = resolveTarget(target, root);\n if (immediate) return resolve(immediate);\n if (options.signal?.aborted) return reject(new DOMException(\"Aborted\", \"AbortError\"));\n let done = false;\n let observer: MutationObserver | null = null;\n let timer: ReturnType<typeof setInterval> | null = null;\n let timeout: ReturnType<typeof setTimeout> | null = null;\n const cleanup = () => {\n done = true;\n observer?.disconnect();\n if (timer) clearInterval(timer);\n if (timeout) clearTimeout(timeout);\n options.signal?.removeEventListener(\"abort\", onAbort);\n };\n const check = () => {\n if (done) return;\n const el = resolveTarget(target, root);\n if (el) {\n cleanup();\n resolve(el);\n }\n };\n const onAbort = () => {\n cleanup();\n reject(new DOMException(\"Aborted\", \"AbortError\"));\n };\n options.signal?.addEventListener(\"abort\", onAbort);\n const observeRoot = root.nodeType === 9 ? (root as Document).documentElement : (root as Element);\n if (typeof MutationObserver !== \"undefined\" && observeRoot) {\n observer = new MutationObserver(check);\n observer.observe(observeRoot, { childList: true, subtree: true, attributes: true, attributeFilter: [\"class\", \"style\", \"hidden\", \"id\", \"data-tour\", \"aria-label\"] });\n }\n timer = setInterval(check, pollMs);\n if (timeoutMs > 0) {\n timeout = setTimeout(() => {\n cleanup();\n reject(new TargetTimeoutError());\n }, timeoutMs);\n }\n });\n}\n\n// ---------------------------------------------------------------------------\n// Selector generation (used by the element picker)\n// ---------------------------------------------------------------------------\n\nconst GENERATED_ID = /(\\d{4,}|:r[0-9a-z]+:|^radix-|^headlessui-|^mui-|^ember\\d|^react-|^\\w*-\\d+$|__|^[a-f0-9]{8,}$|^svelte-)/i;\nconst GENERATED_CLASS = /(^css-|^sc-|^jss\\d|^svelte-|^emotion-|^chakra-|^Mui|^_|[0-9a-f]{6,}|^\\w{1,2}$|^[a-z]+-\\d+$|[:[\\]/])/;\nconst PREFERRED_DATA_ATTRS = [\"data-testid\", \"data-tour\", \"data-test\", \"data-test-id\", \"data-cy\", \"data-qa\", \"data-id\", \"data-name\", \"data-guidely\"];\nconst IGNORED_DATA_ATTRS = /^data-(state|v-|reactid|react|radix|headlessui|svelte|hydrated|orientation|highlighted|focus|key|index|rbd|dnd|rk-|sveltekit)/i;\n\n/** Is this id stable enough to be used as a selector (not generated by a framework)? */\nexport function isStableId(id: string): boolean {\n return !!id && /^[A-Za-z][\\w-]*$/.test(id) && !GENERATED_ID.test(id);\n}\n\nfunction isStableClass(cls: string): boolean {\n return !!cls && !GENERATED_CLASS.test(cls) && cls.length <= 40;\n}\n\nfunction uniqueIn(doc: Document, selector: string, el: Element): boolean {\n const all = safeQueryAll(doc, selector);\n return all.length === 1 && all[0] === el;\n}\n\nfunction attrSelector(name: string, value: string): string {\n return `[${name}='${value.replace(/\\\\/g, \"\\\\\\\\\").replace(/'/g, \"\\\\'\")}']`;\n}\n\nfunction cssPath(el: Element, doc: Document): string | null {\n const segments: string[] = [];\n let cur: Element | null = el;\n while (cur && cur.nodeType === 1 && cur !== doc.body && cur !== doc.documentElement) {\n const tag = cur.tagName.toLowerCase();\n if (isStableId(cur.id)) {\n segments.unshift(`#${cur.id}`);\n break;\n }\n let seg = tag;\n const parent: Element | null = cur.parentElement;\n if (parent) {\n const sameTag = Array.from(parent.children).filter((c) => c.tagName === cur!.tagName);\n if (sameTag.length > 1) {\n const stableCls = Array.from(cur.classList).find((c) => isStableClass(c) && sameTag.filter((s) => s.classList.contains(c)).length === 1);\n seg += stableCls ? `.${escapeCss(stableCls)}` : `:nth-of-type(${sameTag.indexOf(cur) + 1})`;\n }\n }\n segments.unshift(seg);\n const candidate = segments.join(\" > \");\n if (uniqueIn(doc, candidate, el)) return candidate;\n cur = parent;\n }\n const full = segments.join(\" > \");\n return uniqueIn(doc, full, el) ? full : null;\n}\n\n/** Short human-readable text for an element, trimmed to 200 characters. */\nexport function textSnapshotOf(el: Element): string {\n const he = el as HTMLElement;\n const own = normalizeText(he.innerText ?? el.textContent);\n const alt = normalizeText(el.getAttribute(\"aria-label\") || el.getAttribute(\"title\") || el.getAttribute(\"placeholder\") || el.getAttribute(\"alt\") || (el as HTMLInputElement).value);\n return (own || alt).slice(0, 200);\n}\n\n/**\n * Generates an ordered list of selector strategies for an element, most robust first:\n * stable id → data-* attributes → aria-label → role/name → short unique CSS path → visible text.\n */\nexport function generateSelectors(el: Element): SelectorStrategy[] {\n const doc = el.ownerDocument;\n const out: SelectorStrategy[] = [];\n const seen = new Set<string>();\n const push = (s: SelectorStrategy) => {\n const k = `${s.kind}:${s.value}`;\n if (!seen.has(k)) {\n seen.add(k);\n out.push(s);\n }\n };\n const tag = el.tagName.toLowerCase();\n\n if (isStableId(el.id) && uniqueIn(doc, `#${escapeCss(el.id)}`, el)) push({ kind: \"id\", value: `#${el.id}`, label: `id ${el.id}` });\n\n const dataAttrs = Array.from(el.attributes).filter((a) => a.name.startsWith(\"data-\") && !IGNORED_DATA_ATTRS.test(a.name) && a.value && a.value.length <= 120 && !/\\d{5,}/.test(a.value));\n dataAttrs.sort((a, b) => {\n const ia = PREFERRED_DATA_ATTRS.indexOf(a.name);\n const ib = PREFERRED_DATA_ATTRS.indexOf(b.name);\n return (ia === -1 ? 99 : ia) - (ib === -1 ? 99 : ib);\n });\n for (const a of dataAttrs) {\n const sel = attrSelector(a.name, a.value);\n if (uniqueIn(doc, sel, el)) push({ kind: \"data-attr\", value: sel, label: `${a.name}=${a.value}` });\n else if (uniqueIn(doc, tag + sel, el)) push({ kind: \"data-attr\", value: tag + sel, label: `${a.name}=${a.value}` });\n }\n\n const aria = el.getAttribute(\"aria-label\");\n if (aria && aria.length <= 120) {\n const sel = attrSelector(\"aria-label\", aria);\n if (uniqueIn(doc, sel, el)) push({ kind: \"aria\", value: sel, label: aria });\n else if (uniqueIn(doc, tag + sel, el)) push({ kind: \"aria\", value: tag + sel, label: aria });\n }\n\n const name = el.getAttribute(\"name\");\n if (name && uniqueIn(doc, tag + attrSelector(\"name\", name), el)) push({ kind: \"css\", value: tag + attrSelector(\"name\", name), label: `${tag} name=${name}` });\n const role = el.getAttribute(\"role\");\n if (role) {\n const title = el.getAttribute(\"title\") || el.getAttribute(\"aria-labelledby\");\n const sel = title ? `[role='${role}']${attrSelector(el.getAttribute(\"title\") ? \"title\" : \"aria-labelledby\", title)}` : `[role='${role}']`;\n if (uniqueIn(doc, sel, el)) push({ kind: \"css\", value: sel, label: `role ${role}` });\n }\n if (tag === \"a\") {\n const href = el.getAttribute(\"href\");\n if (href && href.length <= 200 && uniqueIn(doc, `a${attrSelector(\"href\", href)}`, el)) push({ kind: \"css\", value: `a${attrSelector(\"href\", href)}`, label: `link ${href}` });\n }\n\n const path = cssPath(el, doc);\n if (path) push({ kind: \"css\", value: path, label: \"css path\" });\n\n if (/^(button|a|h[1-6]|label|summary)$/.test(tag) || role === \"button\" || role === \"link\" || role === \"tab\" || role === \"menuitem\") {\n const text = normalizeText((el as HTMLElement).innerText ?? el.textContent);\n if (text && text.length <= 80) push({ kind: \"text\", value: text, label: `text \"${text}\"` });\n }\n return out.slice(0, 10);\n}\n\nexport interface ElementDescription {\n selectors: SelectorStrategy[];\n textSnapshot: string;\n rect: { x: number; y: number; width: number; height: number };\n tag: string;\n}\n\n/** Everything the authoring picker needs for one element. */\nexport function describeElement(el: Element): ElementDescription {\n const r = el.getBoundingClientRect();\n return {\n selectors: generateSelectors(el),\n textSnapshot: textSnapshotOf(el),\n rect: { x: r.x, y: r.y, width: r.width, height: r.height },\n tag: el.tagName.toLowerCase(),\n };\n}\n","const ALLOWED_TAGS = new Set([\"p\", \"br\", \"strong\", \"b\", \"em\", \"i\", \"u\", \"a\", \"ul\", \"ol\", \"li\", \"img\", \"h1\", \"h2\", \"h3\", \"h4\", \"code\", \"pre\", \"blockquote\", \"span\", \"div\", \"hr\", \"button\"]);\nconst DROP_TAGS = new Set([\"script\", \"style\", \"iframe\", \"object\", \"embed\", \"form\", \"input\", \"textarea\", \"select\", \"link\", \"meta\", \"base\", \"template\", \"svg\", \"math\", \"frame\", \"frameset\", \"noscript\"]);\nconst ALLOWED_ATTRS = new Set([\"href\", \"src\", \"alt\", \"title\", \"target\", \"rel\", \"class\", \"data-g-action\", \"data-g-value\"]);\nfunction isSafeUrl(value: string, attr: string, tag: string): boolean {\n // eslint-disable-next-line no-control-regex\n const v = value.trim().replace(/[\\u0000-\\u001f\\s]/g, \"\").toLowerCase();\n if (!v) return false;\n const m = /^([a-z][a-z0-9+.-]*):/.exec(v);\n if (!m) return true; // relative URL\n const scheme = m[1];\n if (scheme === \"data\") return tag === \"img\" && attr === \"src\" && v.startsWith(\"data:image/\");\n return scheme === \"http\" || scheme === \"https\" || scheme === \"mailto\" || scheme === \"tel\";\n}\n\nfunction sanitizeElement(el: Element): void {\n const tag = el.tagName.toLowerCase();\n for (const attr of Array.from(el.attributes)) {\n const name = attr.name.toLowerCase();\n if (name.startsWith(\"on\") || !ALLOWED_ATTRS.has(name)) {\n el.removeAttribute(attr.name);\n continue;\n }\n if ((name === \"href\" || name === \"src\") && !isSafeUrl(attr.value, name, tag)) el.removeAttribute(attr.name);\n }\n if (tag === \"a\") {\n const target = el.getAttribute(\"target\");\n if (target && target !== \"_blank\" && target !== \"_self\") el.removeAttribute(\"target\");\n if (el.getAttribute(\"target\") === \"_blank\") el.setAttribute(\"rel\", \"noopener noreferrer\");\n }\n if (tag === \"button\") el.setAttribute(\"type\", \"button\");\n if (tag === \"img\") {\n el.setAttribute(\"loading\", \"lazy\");\n if (!el.getAttribute(\"alt\")) el.setAttribute(\"alt\", \"\");\n }\n}\n\nfunction walk(node: Node): void {\n const children = Array.from(node.childNodes);\n for (const child of children) {\n if (child.nodeType === 8 /* comment */) {\n node.removeChild(child);\n continue;\n }\n if (child.nodeType !== 1) continue;\n const el = child as Element;\n const tag = el.tagName.toLowerCase();\n if (DROP_TAGS.has(tag)) {\n node.removeChild(el);\n continue;\n }\n if (!ALLOWED_TAGS.has(tag)) {\n // Unwrap: keep text/children, drop the element itself.\n while (el.firstChild) node.insertBefore(el.firstChild, el);\n node.removeChild(el);\n // Re-walk the parent since children moved up.\n walk(node);\n return;\n }\n sanitizeElement(el);\n walk(el);\n }\n}\n\n/**\n * Parses HTML into a sanitized DocumentFragment using a strict allowlist. No external\n * dependency: a `<template>` element parses inertly and the tree is walked element by element.\n */\nexport function sanitizeToFragment(html: string, doc: Document = document): DocumentFragment {\n const tpl = doc.createElement(\"template\");\n tpl.innerHTML = html || \"\";\n walk(tpl.content);\n return tpl.content;\n}\n\n/** Returns sanitized HTML as a string. */\nexport function sanitizeHtml(html: string, doc: Document = document): string {\n const frag = sanitizeToFragment(html, doc);\n const div = doc.createElement(\"div\");\n div.appendChild(frag);\n return div.innerHTML;\n}\n\n/** Replaces the content of `el` with the sanitized HTML. */\nexport function setSanitizedHtml(el: Element, html: string): void {\n el.textContent = \"\";\n el.appendChild(sanitizeToFragment(html, el.ownerDocument));\n}\n","/** All runtime CSS, injected once into the Shadow DOM host. Tokens are CSS custom properties. */\nexport const STYLES = `\n:host{all:initial;position:static;display:block;contain:none}\n*,*::before,*::after{box-sizing:border-box}\n.g-scope [hidden]{display:none!important}\n.g-scope{\n --g-primary:#4f46e5;--g-bg:#ffffff;--g-text:#111827;--g-radius:12px;--g-font:Inter,system-ui,-apple-system,sans-serif;--g-z:2147483000;--g-overlay:.5;\n --g-muted:color-mix(in srgb,var(--g-text) 62%,transparent);--g-border:color-mix(in srgb,var(--g-text) 12%,transparent);\n --g-subtle:color-mix(in srgb,var(--g-text) 5%,transparent);--g-shadow:0 10px 40px rgba(0,0,0,.18),0 2px 8px rgba(0,0,0,.08);\n --g-primary-text:#ffffff;\n font-family:var(--g-font);font-size:14px;line-height:1.5;color:var(--g-text);-webkit-font-smoothing:antialiased;\n}\n.g-scope[data-theme=\"dark\"]{--g-shadow:0 10px 40px rgba(0,0,0,.5),0 2px 8px rgba(0,0,0,.3)}\n.g-live{position:fixed;width:1px;height:1px;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}\n.g-layer{position:fixed;inset:0;z-index:var(--g-z);pointer-events:none}\n.g-overlay{position:fixed;inset:0;background:rgba(0,0,0,var(--g-overlay));z-index:calc(var(--g-z) + 3);pointer-events:auto}\n.g-overlay.g-transparent{background:transparent}\n.g-spot-rect{position:fixed;background:rgba(0,0,0,var(--g-overlay));z-index:calc(var(--g-z) + 3);pointer-events:auto}\n.g-spot-ring{position:fixed;z-index:calc(var(--g-z) + 3);pointer-events:none;border-radius:6px;box-shadow:0 0 0 2px var(--g-primary),0 0 0 6px color-mix(in srgb,var(--g-primary) 30%,transparent)}\n.g-card{\n position:fixed;z-index:calc(var(--g-z) + 4);pointer-events:auto;background:var(--g-bg);color:var(--g-text);border-radius:var(--g-radius);\n box-shadow:var(--g-shadow);border:1px solid var(--g-border);width:min(360px,calc(100vw - 32px));max-width:calc(100vw - 32px);max-height:calc(100vh - 32px);overflow:auto;outline:none;\n}\n.g-card.g-modal{left:50%;top:50%;transform:translate(-50%,-50%);width:min(480px,calc(100vw - 32px))}\n.g-card.g-tooltip,.g-card.g-popover,.g-card.g-spotlight-card,.g-card.g-hotspot-card{top:0;left:0;width:min(320px,calc(100vw - 32px))}\n.g-card.g-slideout{width:min(360px,calc(100vw - 32px));margin:16px}\n.g-pos-bottom-right{right:0;bottom:0}.g-pos-bottom-left{left:0;bottom:0}.g-pos-top-right{right:0;top:0}.g-pos-top-left{left:0;top:0}\n.g-pos-center{left:50%;top:50%;transform:translate(-50%,-50%)}\n.g-pos-top{top:0;left:0;right:0}.g-pos-bottom{bottom:0;left:0;right:0}\n.g-banner{position:fixed;left:0;right:0;z-index:calc(var(--g-z) + 1);pointer-events:auto;background:var(--g-primary);color:var(--g-primary-text);padding:10px 48px 10px 16px;display:flex;align-items:center;gap:12px;font-size:14px;box-shadow:0 2px 10px rgba(0,0,0,.15);max-width:100vw}\n.g-banner .g-body{flex:1;min-width:0}\n.g-banner .g-body a{color:inherit;text-decoration:underline}\n.g-banner .g-close{color:inherit;right:8px;top:50%;transform:translateY(-50%)}\n.g-banner .g-btn{background:rgba(255,255,255,.18);color:inherit;border-color:transparent;min-height:36px}\n.g-banner.g-pos-top{top:0}.g-banner.g-pos-bottom{bottom:0}\n.g-inner{padding:20px}\n.g-close{position:absolute;top:8px;right:8px;width:40px;height:40px;display:inline-flex;align-items:center;justify-content:center;border:0;background:transparent;color:var(--g-muted);border-radius:999px;cursor:pointer;font:inherit;font-size:20px;line-height:1}\n.g-close:hover,.g-close:focus-visible{background:var(--g-subtle);color:var(--g-text);outline:none}\n.g-close:focus-visible,.g-btn:focus-visible,.g-task:focus-visible,.g-choice:focus-visible,.g-scale button:focus-visible,.g-launcher:focus-visible,.g-input:focus-visible,.g-rc-item:focus-visible{outline:2px solid var(--g-primary);outline-offset:2px}\n.g-image{display:block;width:100%;max-height:220px;object-fit:cover;border-radius:var(--g-radius) var(--g-radius) 0 0}\n.g-title{margin:0 28px 6px 0;font-size:16px;font-weight:600;line-height:1.3}\n.g-body{font-size:14px;color:var(--g-text)}\n.g-body p{margin:0 0 8px}.g-body p:last-child{margin-bottom:0}\n.g-body ul,.g-body ol{margin:6px 0;padding-left:20px}\n.g-body a{color:var(--g-primary)}\n.g-body img{max-width:100%;height:auto;border-radius:6px}\n.g-body code{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:13px;background:var(--g-subtle);padding:1px 4px;border-radius:4px}\n.g-body pre{background:var(--g-subtle);padding:10px;border-radius:6px;overflow:auto}\n.g-body blockquote{margin:6px 0;padding-left:10px;border-left:3px solid var(--g-border);color:var(--g-muted)}\n.g-footer{display:flex;align-items:center;gap:8px;margin-top:14px;flex-wrap:wrap}\n.g-progress{font-size:12px;color:var(--g-muted);margin-right:auto}\n.g-btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;min-height:40px;padding:8px 14px;border-radius:calc(var(--g-radius) * .66);border:1px solid transparent;font:inherit;font-size:14px;font-weight:500;cursor:pointer;text-decoration:none;transition:background .15s,color .15s,border-color .15s}\n.g-btn-primary{background:var(--g-primary);color:var(--g-primary-text)}\n.g-btn-primary:hover{filter:brightness(1.08)}\n.g-btn-secondary{background:var(--g-subtle);color:var(--g-text);border-color:var(--g-border)}\n.g-btn-secondary:hover{background:color-mix(in srgb,var(--g-text) 10%,transparent)}\n.g-btn-ghost{background:transparent;color:var(--g-muted)}\n.g-btn-ghost:hover{background:var(--g-subtle);color:var(--g-text)}\n.g-btn-link{background:transparent;color:var(--g-primary);padding-left:4px;padding-right:4px}\n.g-btn-link:hover{text-decoration:underline}\n.g-btn:disabled{opacity:.5;cursor:not-allowed}\n.g-arrow{position:absolute;width:12px;height:12px;background:var(--g-bg);transform:rotate(45deg);border:1px solid var(--g-border);z-index:-1}\n.g-hotspot{position:fixed;z-index:calc(var(--g-z) + 1);pointer-events:auto;border-radius:999px;background:var(--g-primary);border:2px solid #fff;box-shadow:0 0 0 2px color-mix(in srgb,var(--g-primary) 40%,transparent);cursor:pointer;padding:0;margin:0}\n.g-hotspot::after{content:\"\";position:absolute;inset:-4px;border-radius:999px;border:2px solid var(--g-primary);opacity:0}\n.g-hotspot.g-pulse::after{animation:g-pulse 1.8s ease-out infinite}\n.g-hotspot-hit{position:absolute;inset:-14px}\n.g-custom{position:fixed;z-index:calc(var(--g-z) + 4);pointer-events:auto;left:50%;top:50%;transform:translate(-50%,-50%);max-width:calc(100vw - 32px);max-height:calc(100vh - 32px);overflow:auto}\n/* animations */\n.g-scope[data-anim=\"fade\"] .g-card,.g-scope[data-anim=\"fade\"] .g-banner,.g-scope[data-anim=\"fade\"] .g-panel{animation:g-fade .18s ease-out}\n.g-scope[data-anim=\"slide\"] .g-card,.g-scope[data-anim=\"slide\"] .g-panel{animation:g-slide .22s ease-out}\n.g-scope[data-anim=\"none\"] *{animation:none!important;transition:none!important}\n@keyframes g-fade{from{opacity:0}to{opacity:1}}\n@keyframes g-slide{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}\n@keyframes g-pulse{0%{transform:scale(.6);opacity:.9}100%{transform:scale(2.2);opacity:0}}\n@media (prefers-reduced-motion:reduce){.g-scope *{animation:none!important;transition:none!important}}\n/* launcher + panel (checklist / resource center) */\n.g-launcher{position:fixed;z-index:calc(var(--g-z) + 1);pointer-events:auto;display:inline-flex;align-items:center;gap:8px;min-height:44px;padding:10px 16px;border-radius:999px;border:0;background:var(--g-primary);color:var(--g-primary-text);font:inherit;font-size:14px;font-weight:600;cursor:pointer;box-shadow:var(--g-shadow);margin:16px}\n.g-launcher .g-ring{width:22px;height:22px;border-radius:999px;background:conic-gradient(#fff var(--g-pct,0%),rgba(255,255,255,.3) 0);display:inline-flex;align-items:center;justify-content:center;font-size:10px;position:relative}\n.g-launcher .g-ring::after{content:\"\";position:absolute;inset:3px;border-radius:999px;background:var(--g-primary)}\n.g-launcher .g-count{position:relative;z-index:1}\n.g-panel{position:fixed;z-index:calc(var(--g-z) + 2);pointer-events:auto;width:min(380px,calc(100vw - 32px));max-height:min(620px,calc(100vh - 100px));display:flex;flex-direction:column;background:var(--g-bg);color:var(--g-text);border-radius:var(--g-radius);box-shadow:var(--g-shadow);border:1px solid var(--g-border);margin:16px;bottom:60px;overflow:hidden}\n.g-panel-head{padding:16px 48px 12px 20px;border-bottom:1px solid var(--g-border);position:relative}\n.g-panel-title{margin:0;font-size:16px;font-weight:600}\n.g-panel-sub{margin:4px 0 0;font-size:12px;color:var(--g-muted)}\n.g-panel-body{overflow:auto;padding:8px 0;flex:1}\n.g-help{display:flex;flex-direction:column;min-height:0;flex:1}\n.g-bar{height:6px;border-radius:999px;background:var(--g-subtle);overflow:hidden;margin-top:10px}\n.g-bar > span{display:block;height:100%;background:var(--g-primary);transition:width .3s}\n.g-task{display:flex;gap:12px;align-items:flex-start;width:100%;padding:12px 20px;border:0;background:transparent;text-align:left;font:inherit;color:inherit;cursor:pointer;min-height:44px}\n.g-task:hover{background:var(--g-subtle)}\n.g-task[disabled]{cursor:not-allowed;opacity:.55}\n.g-task .g-check{flex:none;width:22px;height:22px;border-radius:999px;border:2px solid var(--g-border);display:inline-flex;align-items:center;justify-content:center;font-size:13px;margin-top:1px;color:#fff}\n.g-task.g-done .g-check{background:var(--g-primary);border-color:var(--g-primary)}\n.g-task.g-done .g-task-title{text-decoration:line-through;color:var(--g-muted)}\n.g-task-title{font-weight:500}\n.g-task-desc{font-size:12px;color:var(--g-muted);margin-top:2px}\n.g-panel-foot{padding:10px 20px;border-top:1px solid var(--g-border);display:flex;justify-content:flex-end;gap:8px}\n.g-complete{padding:28px 20px;text-align:center}\n.g-complete .g-title{margin-right:0;font-size:18px}\n/* survey */\n.g-question{margin-bottom:16px}\n.g-q-title{font-weight:600;margin:0 0 4px}\n.g-q-desc{font-size:12px;color:var(--g-muted);margin:0 0 8px}\n.g-scale{display:flex;gap:4px;flex-wrap:wrap}\n.g-scale button{min-width:34px;height:40px;flex:1;padding:0 4px;border-radius:6px;border:1px solid var(--g-border);background:var(--g-subtle);color:var(--g-text);font:inherit;cursor:pointer}\n.g-scale button[aria-pressed=\"true\"],.g-scale button:hover{background:var(--g-primary);color:var(--g-primary-text);border-color:var(--g-primary)}\n.g-scale-labels{display:flex;justify-content:space-between;font-size:11px;color:var(--g-muted);margin-top:4px}\n.g-stars button,.g-thumbs button{font-size:22px;background:transparent;border:0;cursor:pointer;color:var(--g-muted);min-width:40px;height:40px;font:inherit}\n.g-stars button[aria-pressed=\"true\"],.g-stars button.g-on{color:#f59e0b}\n.g-thumbs button[aria-pressed=\"true\"]{color:var(--g-primary)}\n.g-choice{display:flex;align-items:center;gap:10px;padding:8px 10px;border:1px solid var(--g-border);border-radius:8px;margin-bottom:6px;cursor:pointer;min-height:40px;font:inherit;background:transparent;color:inherit;width:100%;text-align:left}\n.g-choice[aria-checked=\"true\"]{border-color:var(--g-primary);background:color-mix(in srgb,var(--g-primary) 8%,transparent)}\n.g-choice .g-dot{width:16px;height:16px;border-radius:999px;border:2px solid var(--g-border);flex:none}\n.g-choice.g-multi .g-dot{border-radius:4px}\n.g-choice[aria-checked=\"true\"] .g-dot{background:var(--g-primary);border-color:var(--g-primary)}\n.g-input{width:100%;min-height:40px;padding:8px 10px;border:1px solid var(--g-border);border-radius:8px;background:var(--g-bg);color:var(--g-text);font:inherit;resize:vertical}\n.g-error{color:#dc2626;font-size:12px;margin-top:4px}\n/* resource center */\n.g-rc-search{padding:12px 20px 4px}\n.g-rc-section{padding:8px 20px 4px;font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--g-muted);font-weight:600}\n.g-rc-item{display:flex;align-items:flex-start;gap:10px;width:100%;padding:10px 20px;border:0;background:transparent;font:inherit;color:inherit;text-align:left;cursor:pointer;min-height:44px;text-decoration:none}\n.g-rc-item:hover{background:var(--g-subtle)}\n.g-rc-item .g-rc-title{font-weight:500}\n.g-rc-item .g-rc-sum{font-size:12px;color:var(--g-muted);margin-top:2px}\n.g-rc-item .g-rc-icon{flex:none;width:20px;text-align:center;color:var(--g-primary)}\n.g-rc-article{padding:16px 20px}\n.g-rc-back{margin-bottom:8px}\n.g-rc-empty{padding:24px 20px;color:var(--g-muted);text-align:center}\n.g-faq-a{padding:0 20px 12px 50px;font-size:13px;color:var(--g-muted)}\n.g-faq-a[hidden]{display:none}\n/* authoring */\n.g-auth-bar{position:fixed;top:0;left:0;right:0;z-index:calc(var(--g-z) + 10);pointer-events:auto;display:flex;align-items:center;gap:12px;padding:8px 16px;background:#111827;color:#fff;font:500 13px/1.4 var(--g-font);box-shadow:0 2px 10px rgba(0,0,0,.3)}\n.g-auth-bar .g-dot-live{width:8px;height:8px;border-radius:999px;background:#22c55e;box-shadow:0 0 0 3px rgba(34,197,94,.3)}\n.g-auth-bar .g-spacer{flex:1}\n.g-auth-bar .g-btn{min-height:32px;padding:4px 12px;font-size:13px}\n.g-auth-bar .g-btn-secondary{background:rgba(255,255,255,.12);color:#fff;border-color:transparent}\n.g-auth-outline{position:fixed;z-index:calc(var(--g-z) + 9);pointer-events:none;border:2px solid var(--g-primary);background:color-mix(in srgb,var(--g-primary) 12%,transparent);border-radius:4px;transition:all .06s linear}\n.g-auth-label{position:absolute;left:-2px;top:-24px;background:var(--g-primary);color:#fff;font:600 11px/1 var(--g-font);padding:5px 7px;border-radius:4px;white-space:nowrap;max-width:320px;overflow:hidden;text-overflow:ellipsis}\n.g-auth-outline.g-picked{border-style:dashed;border-color:#22c55e;background:rgba(34,197,94,.12)}\n.g-auth-outline.g-picked .g-auth-label{background:#16a34a}\n.g-highlight{position:fixed;z-index:calc(var(--g-z) + 8);pointer-events:none;border:2px dashed #f59e0b;background:rgba(245,158,11,.12);border-radius:4px}\n@media (max-width:480px){.g-card.g-modal,.g-panel{width:calc(100vw - 32px)}.g-inner{padding:16px}}\n`;\n","import type { Appearance, ProjectTheme } from \"@guidelytech/shared\";\nimport { STYLES } from \"./styles\";\n\nexport const HOST_ID = \"guidely-root\";\n\nexport interface HostHandle {\n host: HTMLElement;\n shadow: ShadowRoot;\n /** Polite live region for screen-reader announcements. */\n live: HTMLElement;\n announce(text: string): void;\n destroy(): void;\n}\n\nlet current: HostHandle | null = null;\n\n/** Default project theme used when the config has not loaded yet. */\nexport const DEFAULT_THEME: ProjectTheme = {\n primaryColor: \"#4f46e5\",\n backgroundColor: \"#ffffff\",\n textColor: \"#111827\",\n borderRadius: 12,\n fontFamily: \"Inter, system-ui, -apple-system, sans-serif\",\n};\n\n/** Returns (creating when needed) the single Shadow-DOM host appended to `document.body`. */\nexport function ensureHost(doc: Document = document): HostHandle {\n if (current && current.host.isConnected && current.host.ownerDocument === doc) return current;\n let host = doc.getElementById(HOST_ID) as HTMLElement | null;\n if (!host) {\n host = doc.createElement(\"div\");\n host.id = HOST_ID;\n host.setAttribute(\"data-guidely\", \"\");\n (doc.body || doc.documentElement).appendChild(host);\n }\n const shadow = host.shadowRoot ?? host.attachShadow({ mode: \"open\" });\n if (!shadow.querySelector(\"style[data-g-base]\")) {\n const style = doc.createElement(\"style\");\n style.setAttribute(\"data-g-base\", \"\");\n style.textContent = STYLES;\n shadow.appendChild(style);\n }\n let live = shadow.querySelector<HTMLElement>(\".g-live\");\n if (!live) {\n live = doc.createElement(\"div\");\n live.className = \"g-live\";\n live.setAttribute(\"aria-live\", \"polite\");\n live.setAttribute(\"aria-atomic\", \"true\");\n shadow.appendChild(live);\n }\n const liveEl = live;\n current = {\n host,\n shadow,\n live: liveEl,\n announce(text: string) {\n liveEl.textContent = \"\";\n setTimeout(() => {\n liveEl.textContent = text;\n }, 30);\n },\n destroy() {\n host?.remove();\n if (current?.host === host) current = null;\n },\n };\n return current;\n}\n\n/** Removes the host from the document (all overlays with it). */\nexport function destroyHost(): void {\n current?.destroy();\n const stray = typeof document !== \"undefined\" ? document.getElementById(HOST_ID) : null;\n stray?.remove();\n current = null;\n}\n\nexport type ResolvedThemeMode = \"light\" | \"dark\";\n\nfunction prefersDark(): boolean {\n try {\n return typeof window !== \"undefined\" && typeof window.matchMedia === \"function\" && window.matchMedia(\"(prefers-color-scheme: dark)\").matches;\n } catch {\n return false;\n }\n}\n\nexport function prefersReducedMotion(): boolean {\n try {\n return typeof window !== \"undefined\" && typeof window.matchMedia === \"function\" && window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n } catch {\n return false;\n }\n}\n\nexport interface ThemeVars {\n primary: string;\n bg: string;\n text: string;\n radius: number;\n font: string;\n z: number;\n overlay: number;\n mode: ResolvedThemeMode;\n animation: Appearance[\"animation\"];\n}\n\n/** Merges project theme + guide appearance into CSS custom property values. */\nexport function resolveTheme(theme: Partial<ProjectTheme> | null | undefined, appearance?: Partial<Appearance> | null): ThemeVars {\n const t = { ...DEFAULT_THEME, ...(theme || {}) };\n const a = appearance || {};\n const requested = a.theme ?? \"auto\";\n const mode: ResolvedThemeMode = requested === \"auto\" ? (prefersDark() ? \"dark\" : \"light\") : requested;\n const dark = mode === \"dark\";\n return {\n primary: a.primaryColor || t.primaryColor,\n bg: a.backgroundColor || (dark ? \"#1f2937\" : t.backgroundColor),\n text: a.textColor || (dark ? \"#f9fafb\" : t.textColor),\n radius: a.borderRadius ?? t.borderRadius,\n font: a.fontFamily || t.fontFamily,\n z: a.zIndex ?? 2147483000,\n overlay: a.overlayOpacity ?? 0.5,\n mode,\n animation: prefersReducedMotion() ? \"none\" : (a.animation ?? \"fade\"),\n };\n}\n\n/** Applies theme variables to a scope element. */\nexport function applyTheme(el: HTMLElement, vars: ThemeVars): void {\n el.style.setProperty(\"--g-primary\", vars.primary);\n el.style.setProperty(\"--g-bg\", vars.bg);\n el.style.setProperty(\"--g-text\", vars.text);\n el.style.setProperty(\"--g-radius\", `${vars.radius}px`);\n el.style.setProperty(\"--g-font\", vars.font);\n el.style.setProperty(\"--g-z\", String(vars.z));\n el.style.setProperty(\"--g-overlay\", String(vars.overlay));\n el.setAttribute(\"data-theme\", vars.mode);\n el.setAttribute(\"data-anim\", vars.animation);\n}\n\n/**\n * Creates a themed scope container inside the shadow root. Each guide/widget renders inside its\n * own scope so appearance settings never leak between guides.\n */\nexport function createScope(theme?: Partial<ProjectTheme> | null, appearance?: Partial<Appearance> | null, doc: Document = document): { el: HTMLElement; vars: ThemeVars; destroy(): void } {\n const handle = ensureHost(doc);\n const el = doc.createElement(\"div\");\n el.className = \"g-scope\";\n const vars = resolveTheme(theme, appearance);\n applyTheme(el, vars);\n handle.shadow.appendChild(el);\n let mq: MediaQueryList | null = null;\n const onChange = () => applyTheme(el, resolveTheme(theme, appearance));\n if ((appearance?.theme ?? \"auto\") === \"auto\" && typeof window !== \"undefined\" && typeof window.matchMedia === \"function\") {\n try {\n mq = window.matchMedia(\"(prefers-color-scheme: dark)\");\n mq.addEventListener?.(\"change\", onChange);\n } catch {\n mq = null;\n }\n }\n return {\n el,\n vars,\n destroy() {\n mq?.removeEventListener?.(\"change\", onChange);\n el.remove();\n },\n };\n}\n","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 { 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\n/** Are all required tasks done? */\nexport function isChecklistComplete(config: ChecklistConfig, progress: ChecklistProgress): boolean {\n const done = new Set(progress.completedTaskIds);\n return config.tasks.filter((t) => t.required).every((t) => done.has(t.id));\n}\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\nexport type SurveyAnswer = string | number | boolean | string[];\nexport type SurveyAnswers = Record<string, SurveyAnswer>;\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/** Evaluates a question's `showWhen` condition against current answers. */\nexport function isQuestionVisible(q: SurveyQuestion, answers: SurveyAnswers): boolean {\n if (!q.showWhen) return true;\n const actual = answers[q.showWhen.questionId];\n if (actual === undefined) return false;\n const expected = q.showWhen.value;\n switch (q.showWhen.op) {\n case \"equals\":\n return Array.isArray(actual) ? actual.includes(String(expected)) : String(actual) === String(expected);\n case \"lte\":\n return Number(actual) <= Number(expected);\n case \"gte\":\n return Number(actual) >= Number(expected);\n case \"in\": {\n const list = Array.isArray(expected) ? expected : [String(expected)];\n return Array.isArray(actual) ? actual.some((a) => list.includes(a)) : list.includes(String(actual));\n }\n default:\n return false;\n }\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 { setSanitizedHtml } from \"./sanitize\";\n\nexport interface HelpGuideRef {\n id: string;\n key: string;\n name: string;\n kind: string;\n}\n\n/** What the help view lists. Article bodies may be missing (`bodyOmitted` or summaries only): they load on open. */\nexport interface HelpData {\n collections: ResourceCenterConfig[\"collections\"];\n articles: Array<Omit<ResourceCenterArticle, \"body\"> & { body?: string }>;\n recommended?: HelpGuideRef[];\n checklists?: HelpGuideRef[];\n faqs?: ResourceCenterConfig[\"faqs\"];\n links?: ResourceCenterConfig[\"links\"];\n}\n\nexport interface HelpViewOptions {\n doc: Document;\n data: () => HelpData;\n /** Server search. Results are merged with the client-side title/summary filter. */\n search?: (q: string) => Promise<ResourceCenterArticle[]>;\n /** Loads an article body that isn't in `data()`. */\n loadArticle?: (id: string) => Promise<ResourceCenterArticle | null>;\n onStartGuide?: (guideId: string) => void;\n onOpenChecklist?: (guideId: string) => void;\n onArticleView?: (article: ResourceCenterArticle) => void;\n}\n\nexport interface HelpView {\n /** Search box + scrollable body. */\n el: HTMLElement;\n render(): void;\n /** Back to the article list and clear the search. */\n reset(): void;\n openArticle(id: string): void;\n focusSearch(): void;\n setQuery(q: string): void;\n destroy(): void;\n}\n\nexport function el<K extends keyof HTMLElementTagNameMap>(doc: Document, tag: K, cls?: string, text?: string): HTMLElementTagNameMap[K] {\n const e = doc.createElement(tag);\n if (cls) e.className = cls;\n if (text != null) e.textContent = text;\n return e;\n}\n\nexport function listItem(doc: Document, icon: string, title: string, summary?: string): HTMLButtonElement {\n const b = el(doc, \"button\", \"g-rc-item\");\n b.type = \"button\";\n const i = el(doc, \"span\", \"g-rc-icon\", icon);\n i.setAttribute(\"aria-hidden\", \"true\");\n const text = el(doc, \"span\");\n text.appendChild(el(doc, \"div\", \"g-rc-title\", title));\n if (summary) text.appendChild(el(doc, \"div\", \"g-rc-sum\", summary));\n b.append(i, text);\n return b;\n}\n\ntype ListedArticle = HelpData[\"articles\"][number];\n\n/** Article browser shared by the resource center and the messenger Help tab. */\nexport function createHelpView(options: HelpViewOptions): HelpView {\n const { doc } = options;\n let query = \"\";\n let serverResults: ResourceCenterArticle[] = [];\n let searchSeq = 0;\n let openSeq = 0;\n let active: { article: ListedArticle; loading: boolean } | null = null;\n\n const root = el(doc, \"div\", \"g-help\");\n const searchWrap = el(doc, \"div\", \"g-rc-search\");\n const input = el(doc, \"input\", \"g-input\");\n input.type = \"search\";\n input.placeholder = \"Search help articles…\";\n input.setAttribute(\"aria-label\", \"Search help articles\");\n searchWrap.appendChild(input);\n const body = el(doc, \"div\", \"g-panel-body\");\n root.append(searchWrap, body);\n\n const hasBody = (a: ListedArticle): a is ResourceCenterArticle => typeof a.body === \"string\" && !a.bodyOmitted;\n\n const openArticle = (article: ListedArticle) => {\n if (article.externalUrl) {\n window.open(article.externalUrl, \"_blank\", \"noopener,noreferrer\");\n if (hasBody(article)) options.onArticleView?.(article);\n return;\n }\n const seq = ++openSeq;\n if (hasBody(article) || !options.loadArticle) {\n active = { article, loading: false };\n if (hasBody(article)) options.onArticleView?.(article);\n return render();\n }\n active = { article, loading: true };\n render();\n options\n .loadArticle(article.id)\n .then((full) => {\n if (seq !== openSeq || !active) return;\n active = { article: full ?? { ...article, body: \"\" }, loading: false };\n if (full) options.onArticleView?.(full);\n render();\n })\n .catch(() => {\n if (seq !== openSeq || !active) return;\n active = { article: { ...article, body: \"\" }, loading: false };\n render();\n });\n };\n\n const renderArticle = ({ article, loading }: NonNullable<typeof active>) => {\n const wrap = el(doc, \"div\", \"g-rc-article\");\n const back = el(doc, \"button\", \"g-btn g-btn-link g-rc-back\", \"← Back\");\n back.type = \"button\";\n back.addEventListener(\"click\", () => {\n openSeq++;\n active = null;\n render();\n });\n const title = el(doc, \"h3\", \"g-title\", article.title);\n const content = el(doc, \"div\", \"g-body\");\n if (loading) content.appendChild(el(doc, \"div\", \"g-rc-empty\", \"Loading…\"));\n else if (article.body) setSanitizedHtml(content, article.body);\n else content.appendChild(el(doc, \"div\", \"g-rc-empty\", \"This article couldn't be loaded.\"));\n wrap.append(back, title, content);\n body.appendChild(wrap);\n back.focus?.({ preventScroll: true });\n };\n\n const section = (label: string) => body.appendChild(el(doc, \"div\", \"g-rc-section\", label));\n const articleButton = (a: ListedArticle) => {\n const b = listItem(doc, \"📄\", a.title, a.summary);\n b.addEventListener(\"click\", () => openArticle(a));\n body.appendChild(b);\n };\n\n function render() {\n body.textContent = \"\";\n if (active) return renderArticle(active);\n const data = options.data();\n const q = query.trim().toLowerCase();\n if (q) {\n const local = data.articles.filter((a) => a.title.toLowerCase().includes(q) || a.summary.toLowerCase().includes(q));\n const seen = new Set(local.map((a) => a.id));\n const merged: ListedArticle[] = [...local, ...serverResults.filter((a) => !seen.has(a.id))];\n section(`Results (${merged.length})`);\n if (!merged.length) body.appendChild(el(doc, \"div\", \"g-rc-empty\", \"No articles match your search.\"));\n merged.forEach(articleButton);\n return;\n }\n if (data.recommended?.length) {\n section(\"Recommended\");\n data.recommended.forEach((g) => {\n const b = listItem(doc, \"▶\", g.name, \"Start guide\");\n b.addEventListener(\"click\", () => options.onStartGuide?.(g.id));\n body.appendChild(b);\n });\n }\n if (data.checklists?.length) {\n section(\"Checklists\");\n data.checklists.forEach((g) => {\n const b = listItem(doc, \"☑\", g.name, \"Open checklist\");\n b.addEventListener(\"click\", () => options.onOpenChecklist?.(g.id));\n body.appendChild(b);\n });\n }\n const collections = [...data.collections].sort((a, b) => a.order - b.order);\n const uncollected = data.articles.filter((a) => !a.collectionId || !collections.some((c) => c.id === a.collectionId));\n collections.forEach((c) => {\n const articles = data.articles.filter((a) => a.collectionId === c.id);\n if (!articles.length) return;\n section(c.name);\n articles.forEach(articleButton);\n });\n if (uncollected.length) {\n section(\"Articles\");\n uncollected.forEach(articleButton);\n }\n if (data.faqs?.length) {\n section(\"FAQ\");\n data.faqs.forEach((f) => {\n const b = listItem(doc, \"?\", f.question);\n b.setAttribute(\"aria-expanded\", \"false\");\n const a = el(doc, \"div\", \"g-faq-a\");\n setSanitizedHtml(a, f.answer);\n a.hidden = true;\n b.addEventListener(\"click\", () => {\n a.hidden = !a.hidden;\n b.setAttribute(\"aria-expanded\", String(!a.hidden));\n });\n body.append(b, a);\n });\n }\n if (data.links?.length) {\n section(\"Links\");\n data.links.forEach((l) => {\n const a = el(doc, \"a\", \"g-rc-item\");\n a.href = l.url;\n a.target = \"_blank\";\n a.rel = \"noopener noreferrer\";\n const i = el(doc, \"span\", \"g-rc-icon\", \"↗\");\n i.setAttribute(\"aria-hidden\", \"true\");\n a.append(i, el(doc, \"span\", \"g-rc-title\", l.label));\n body.appendChild(a);\n });\n }\n if (!body.childNodes.length) body.appendChild(el(doc, \"div\", \"g-rc-empty\", \"Nothing here yet.\"));\n }\n\n let debounce: ReturnType<typeof setTimeout> | null = null;\n const onInput = () => {\n query = input.value;\n openSeq++;\n active = null;\n render();\n if (debounce) clearTimeout(debounce);\n if (!options.search || !query.trim()) {\n serverResults = [];\n return;\n }\n const seq = ++searchSeq;\n debounce = setTimeout(() => {\n options\n .search?.(query.trim())\n .then((results) => {\n if (seq !== searchSeq) return;\n serverResults = Array.isArray(results) ? results : [];\n render();\n })\n .catch(() => {});\n }, 250);\n };\n input.addEventListener(\"input\", onInput);\n\n return {\n el: root,\n render,\n reset() {\n openSeq++;\n active = null;\n query = \"\";\n input.value = \"\";\n serverResults = [];\n },\n openArticle(id: string) {\n const listed = options.data().articles.find((a) => a.id === id) ?? { id, slug: id, title: \"Article\", summary: \"\", updatedAt: \"\", bodyOmitted: true };\n openArticle(listed);\n },\n focusSearch: () => input.focus?.({ preventScroll: true }),\n setQuery(q: string) {\n input.value = q;\n onInput();\n },\n destroy() {\n if (debounce) clearTimeout(debounce);\n input.removeEventListener(\"input\", onInput);\n root.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 /** 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 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: [] },\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":["HOST_ID","el","el","HOST_ID","el","el","el","import_runtime","el","el","el"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/selectors.ts","../src/sanitize.ts","../src/styles.ts","../src/host.ts","../src/position.ts","../src/render.ts","../src/controller.ts","../src/checklist.ts","../src/survey.ts","../src/help-view.ts","../src/resource-center.ts","../src/authoring.ts"],"sourcesContent":["/**\n * @guidelytech/guide-runtime — framework-free DOM engine for Guidely guides.\n *\n * Selectors, Shadow-DOM host, step renderers, guide controller, checklist/survey/resource-center\n * widgets, HTML sanitizer and authoring (element picker) utilities.\n */\nexport { resolveTarget, waitForTarget, generateSelectors, describeElement, textSnapshotOf, isVisible, isStableId, isGuidelyElement, querySelectorStrategy, normalizeText, urlMatches, TargetTimeoutError } from \"./selectors\";\nexport type { WaitForTargetOptions, ElementDescription, QueryRoot } from \"./selectors\";\nexport { sanitizeHtml, sanitizeToFragment, setSanitizedHtml } from \"./sanitize\";\nexport { ensureHost, destroyHost, createScope, resolveTheme, applyTheme, prefersReducedMotion, DEFAULT_THEME, HOST_ID } from \"./host\";\nexport type { HostHandle, ThemeVars, ResolvedThemeMode } from \"./host\";\nexport { anchor, trackRect } from \"./position\";\nexport type { AnchorOptions } from \"./position\";\nexport { renderStep, buildCard, isAnchoredStep, renderModal, renderTooltip, renderSpotlight, renderHotspot, renderBanner, renderSlideout, renderCustom } from \"./render\";\nexport type { RenderStepOptions, StepView } from \"./render\";\nexport { runGuide } from \"./controller\";\nexport type { GuideController, RunGuideOptions, RunnableGuide, RuntimeEvent, GuideEndReason, GuideStatus } from \"./controller\";\nexport { renderChecklist, isChecklistComplete } from \"./checklist\";\nexport type { ChecklistWidget, ChecklistWidgetOptions, ChecklistProgress } from \"./checklist\";\nexport { renderSurvey, isQuestionVisible } from \"./survey\";\nexport type { SurveyWidget, SurveyWidgetOptions, SurveyAnswers, SurveyAnswer } from \"./survey\";\nexport { renderResourceCenter } from \"./resource-center\";\nexport type { ResourceCenterWidget, ResourceCenterOptions, ResourceCenterGuideRef } from \"./resource-center\";\nexport { startAuthoring, previewStep, highlightSelectors } from \"./authoring\";\nexport type { AuthoringOptions, AuthoringSession, PreviewHandle, HighlightHandle } from \"./authoring\";\nexport { STYLES } from \"./styles\";\n","import { matchUrlPattern } from \"@guidelytech/shared/runtime\";\nimport type { SelectorStrategy, StepTarget } from \"@guidelytech/shared\";\n\n/**\n * URL matching used for `step.url`, `urlPatterns` and `trigger.urlPattern`: a pattern matches the\n * full URL, the path+query+hash, or the bare path (so `/deals` also matches `/deals?x=1`).\n */\nexport function urlMatches(pattern: string | undefined | null, url: string): boolean {\n if (!pattern) return true;\n if (matchUrlPattern(pattern, url)) return true;\n try {\n const u = new URL(url, \"http://localhost\");\n if (!pattern.includes(\"?\") && !pattern.includes(\"#\")) return matchUrlPattern(pattern, u.pathname) || matchUrlPattern(pattern, u.origin + u.pathname);\n } catch {\n /* ignore */\n }\n return false;\n}\n\nexport type QueryRoot = Document | DocumentFragment | Element;\n\nconst TEXT_CANDIDATES =\n \"button, a, [role='button'], [role='link'], [role='tab'], [role='menuitem'], h1, h2, h3, h4, h5, h6, label, summary\";\n\nconst HOST_ID = \"guidely-root\";\n\nfunction docOf(root: QueryRoot): Document {\n return root.nodeType === 9 ? (root as Document) : (root.ownerDocument as Document);\n}\n\n/** True when the environment has a layout engine (real browsers). happy-dom/jsdom report zero sizes. */\nfunction hasLayout(doc: Document): boolean {\n const de = doc.documentElement;\n if (!de) return false;\n const r = de.getBoundingClientRect();\n return r.width > 0 || r.height > 0;\n}\n\n/** Normalises whitespace in a text snippet. */\nexport function normalizeText(text: string | null | undefined): string {\n return (text || \"\").replace(/\\s+/g, \" \").trim();\n}\n\n/** Is the element rendered (not hidden by `hidden`, `display:none`, `visibility:hidden`, or zero size)? */\nexport function isVisible(el: Element): boolean {\n if (!el.isConnected) return false;\n const doc = el.ownerDocument;\n const win = doc.defaultView;\n let cur: Element | null = el;\n while (cur && cur !== doc.documentElement) {\n if ((cur as HTMLElement).hidden) return false;\n if (win) {\n const cs = win.getComputedStyle(cur);\n if (cs.display === \"none\" || cs.visibility === \"hidden\") return false;\n }\n cur = cur.parentElement ?? ((cur.getRootNode() as ShadowRoot).host as Element | undefined) ?? null;\n }\n if (hasLayout(doc)) {\n const r = el.getBoundingClientRect();\n if (r.width === 0 && r.height === 0) return false;\n }\n return true;\n}\n\n/** Elements that belong to Guidely's own UI are never valid targets. */\nexport function isGuidelyElement(el: Element | null): boolean {\n if (!el) return false;\n const root = el.getRootNode();\n if (root instanceof ShadowRoot && root.host.id === HOST_ID) return true;\n return el.id === HOST_ID || !!el.closest?.(`#${HOST_ID}`);\n}\n\nfunction safeQueryAll(root: QueryRoot, selector: string): Element[] {\n try {\n return Array.from(root.querySelectorAll(selector));\n } catch {\n return [];\n }\n}\n\nfunction escapeCss(value: string): string {\n const g = globalThis as { CSS?: { escape?: (v: string) => string } };\n if (g.CSS && typeof g.CSS.escape === \"function\") return g.CSS.escape(value);\n return value.replace(/[\"\\\\]/g, \"\\\\$&\");\n}\n\nfunction queryXPath(root: QueryRoot, expr: string): Element[] {\n const doc = docOf(root);\n const d = doc as Document & { evaluate?: Document[\"evaluate\"] };\n if (typeof d.evaluate !== \"function\") return [];\n try {\n const result = d.evaluate(expr, root, null, 7 /* ORDERED_NODE_SNAPSHOT_TYPE */, null);\n const out: Element[] = [];\n for (let i = 0; i < result.snapshotLength; i++) {\n const n = result.snapshotItem(i);\n if (n && n.nodeType === 1) out.push(n as Element);\n }\n return out;\n } catch {\n return [];\n }\n}\n\nfunction queryText(root: QueryRoot, text: string): Element[] {\n const needle = normalizeText(text).toLowerCase();\n if (!needle) return [];\n const candidates = safeQueryAll(root, TEXT_CANDIDATES);\n const exact = candidates.filter((c) => normalizeText(c.textContent).toLowerCase() === needle);\n if (exact.length) return exact;\n return candidates.filter((c) => normalizeText(c.textContent).toLowerCase().includes(needle));\n}\n\n/** Resolves every element matching one strategy (visible or not). */\nexport function querySelectorStrategy(strategy: SelectorStrategy, root: QueryRoot): Element[] {\n const value = strategy.value.trim();\n if (!value) return [];\n switch (strategy.kind) {\n case \"id\": {\n const id = value.startsWith(\"#\") ? value.slice(1) : value;\n return safeQueryAll(root, `#${escapeCss(id)}`);\n }\n case \"guidely-id\": {\n const id = value.startsWith(\"#\") ? value.slice(1) : value;\n return safeQueryAll(root, attrSelector(\"data-guidely-id\", id));\n }\n case \"data-attr\":\n case \"aria\":\n case \"css\":\n return safeQueryAll(root, value.startsWith(\"[\") || /^[a-z*#.[]/i.test(value) ? value : `[${value}]`);\n case \"text\":\n return queryText(root, value);\n case \"xpath\":\n return queryXPath(root, value);\n default:\n return [];\n }\n}\n\n/**\n * Resolves a step target by trying each strategy in order. A strategy wins only when it\n * resolves to exactly one *visible* element; otherwise the next strategy is tried.\n */\nexport function resolveTarget(target: Pick<StepTarget, \"selectors\"> | SelectorStrategy[], root: QueryRoot = document): Element | null {\n const selectors = Array.isArray(target) ? target : target.selectors;\n for (const strategy of selectors) {\n const matches = querySelectorStrategy(strategy, root).filter((el) => !isGuidelyElement(el) && isVisible(el));\n if (matches.length === 1) return matches[0] as Element;\n }\n return null;\n}\n\nexport interface WaitForTargetOptions {\n /** Give up after this many milliseconds (default 5000). */\n timeoutMs?: number;\n /** Abort early. */\n signal?: AbortSignal;\n root?: QueryRoot;\n /** Polling fallback interval (default 250ms, which is also the maximum). */\n pollMs?: number;\n}\n\nexport class TargetTimeoutError extends Error {\n override name = \"TargetTimeoutError\";\n constructor(message = \"Target element not found before timeout\") {\n super(message);\n }\n}\n\n/**\n * Waits until `resolveTarget` finds an element. Uses a MutationObserver plus a polling fallback\n * (at most every 250ms) so visibility changes without DOM mutations are also detected.\n */\nexport function waitForTarget(target: Pick<StepTarget, \"selectors\"> | SelectorStrategy[], options: WaitForTargetOptions = {}): Promise<Element> {\n const timeoutMs = options.timeoutMs ?? 5000;\n const root = options.root ?? document;\n const pollMs = Math.min(250, Math.max(16, options.pollMs ?? 250));\n return new Promise<Element>((resolve, reject) => {\n const immediate = resolveTarget(target, root);\n if (immediate) return resolve(immediate);\n if (options.signal?.aborted) return reject(new DOMException(\"Aborted\", \"AbortError\"));\n let done = false;\n let observer: MutationObserver | null = null;\n let timer: ReturnType<typeof setInterval> | null = null;\n let timeout: ReturnType<typeof setTimeout> | null = null;\n const cleanup = () => {\n done = true;\n observer?.disconnect();\n if (timer) clearInterval(timer);\n if (timeout) clearTimeout(timeout);\n options.signal?.removeEventListener(\"abort\", onAbort);\n };\n const check = () => {\n if (done) return;\n const el = resolveTarget(target, root);\n if (el) {\n cleanup();\n resolve(el);\n }\n };\n const onAbort = () => {\n cleanup();\n reject(new DOMException(\"Aborted\", \"AbortError\"));\n };\n options.signal?.addEventListener(\"abort\", onAbort);\n const observeRoot = root.nodeType === 9 ? (root as Document).documentElement : (root as Element);\n if (typeof MutationObserver !== \"undefined\" && observeRoot) {\n observer = new MutationObserver(check);\n observer.observe(observeRoot, { childList: true, subtree: true, attributes: true, attributeFilter: [\"class\", \"style\", \"hidden\", \"id\", \"data-tour\", \"data-guidely-id\", \"aria-label\"] });\n }\n timer = setInterval(check, pollMs);\n if (timeoutMs > 0) {\n timeout = setTimeout(() => {\n cleanup();\n reject(new TargetTimeoutError());\n }, timeoutMs);\n }\n });\n}\n\n// ---------------------------------------------------------------------------\n// Selector generation (used by the element picker)\n// ---------------------------------------------------------------------------\n\nconst GENERATED_ID = /(\\d{4,}|:r[0-9a-z]+:|^radix-|^headlessui-|^mui-|^ember\\d|^react-|^\\w*-\\d+$|__|^[a-f0-9]{8,}$|^svelte-)/i;\nconst GENERATED_CLASS = /(^css-|^sc-|^jss\\d|^svelte-|^emotion-|^chakra-|^Mui|^_|[0-9a-f]{6,}|^\\w{1,2}$|^[a-z]+-\\d+$|[:[\\]/])/;\nconst PREFERRED_DATA_ATTRS = [\"data-testid\", \"data-tour\", \"data-test\", \"data-test-id\", \"data-cy\", \"data-qa\", \"data-id\", \"data-name\", \"data-guidely\"];\nconst IGNORED_DATA_ATTRS = /^data-(guidely-id|state|v-|reactid|react|radix|headlessui|svelte|hydrated|orientation|highlighted|focus|key|index|rbd|dnd|rk-|sveltekit)/i;\n\n/** Is this id stable enough to be used as a selector (not generated by a framework)? */\nexport function isStableId(id: string): boolean {\n return !!id && /^[A-Za-z][\\w-]*$/.test(id) && !GENERATED_ID.test(id);\n}\n\nfunction isStableClass(cls: string): boolean {\n return !!cls && !GENERATED_CLASS.test(cls) && cls.length <= 40;\n}\n\nfunction uniqueIn(doc: Document, selector: string, el: Element): boolean {\n const all = safeQueryAll(doc, selector);\n return all.length === 1 && all[0] === el;\n}\n\nfunction attrSelector(name: string, value: string): string {\n return `[${name}='${value.replace(/\\\\/g, \"\\\\\\\\\").replace(/'/g, \"\\\\'\")}']`;\n}\n\nfunction cssPath(el: Element, doc: Document): string | null {\n const segments: string[] = [];\n let cur: Element | null = el;\n while (cur && cur.nodeType === 1 && cur !== doc.body && cur !== doc.documentElement) {\n const tag = cur.tagName.toLowerCase();\n if (isStableId(cur.id)) {\n segments.unshift(`#${cur.id}`);\n break;\n }\n let seg = tag;\n const parent: Element | null = cur.parentElement;\n if (parent) {\n const sameTag = Array.from(parent.children).filter((c) => c.tagName === cur!.tagName);\n if (sameTag.length > 1) {\n const stableCls = Array.from(cur.classList).find((c) => isStableClass(c) && sameTag.filter((s) => s.classList.contains(c)).length === 1);\n seg += stableCls ? `.${escapeCss(stableCls)}` : `:nth-of-type(${sameTag.indexOf(cur) + 1})`;\n }\n }\n segments.unshift(seg);\n const candidate = segments.join(\" > \");\n if (uniqueIn(doc, candidate, el)) return candidate;\n cur = parent;\n }\n const full = segments.join(\" > \");\n return uniqueIn(doc, full, el) ? full : null;\n}\n\n/** Short human-readable text for an element, trimmed to 200 characters. */\nexport function textSnapshotOf(el: Element): string {\n const he = el as HTMLElement;\n const own = normalizeText(he.innerText ?? el.textContent);\n const alt = normalizeText(el.getAttribute(\"aria-label\") || el.getAttribute(\"title\") || el.getAttribute(\"placeholder\") || el.getAttribute(\"alt\") || (el as HTMLInputElement).value);\n return (own || alt).slice(0, 200);\n}\n\n/**\n * Generates an ordered list of selector strategies for an element, most robust first:\n * stable id → data-* attributes → aria-label → role/name → short unique CSS path → visible text.\n */\nexport function generateSelectors(el: Element): SelectorStrategy[] {\n const doc = el.ownerDocument;\n const out: SelectorStrategy[] = [];\n const seen = new Set<string>();\n const push = (s: SelectorStrategy) => {\n const k = `${s.kind}:${s.value}`;\n if (!seen.has(k)) {\n seen.add(k);\n out.push(s);\n }\n };\n const tag = el.tagName.toLowerCase();\n\n // A Guidely id is shared with the mobile apps, so it is the most portable target there is.\n const guidelyId = el.getAttribute(\"data-guidely-id\");\n if (guidelyId && uniqueIn(doc, attrSelector(\"data-guidely-id\", guidelyId), el)) push({ kind: \"guidely-id\", value: guidelyId, label: `Guidely id ${guidelyId}` });\n if (isStableId(el.id) && uniqueIn(doc, `#${escapeCss(el.id)}`, el)) push({ kind: \"id\", value: `#${el.id}`, label: `id ${el.id}` });\n\n const dataAttrs = Array.from(el.attributes).filter((a) => a.name.startsWith(\"data-\") && !IGNORED_DATA_ATTRS.test(a.name) && a.value && a.value.length <= 120 && !/\\d{5,}/.test(a.value));\n dataAttrs.sort((a, b) => {\n const ia = PREFERRED_DATA_ATTRS.indexOf(a.name);\n const ib = PREFERRED_DATA_ATTRS.indexOf(b.name);\n return (ia === -1 ? 99 : ia) - (ib === -1 ? 99 : ib);\n });\n for (const a of dataAttrs) {\n const sel = attrSelector(a.name, a.value);\n if (uniqueIn(doc, sel, el)) push({ kind: \"data-attr\", value: sel, label: `${a.name}=${a.value}` });\n else if (uniqueIn(doc, tag + sel, el)) push({ kind: \"data-attr\", value: tag + sel, label: `${a.name}=${a.value}` });\n }\n\n const aria = el.getAttribute(\"aria-label\");\n if (aria && aria.length <= 120) {\n const sel = attrSelector(\"aria-label\", aria);\n if (uniqueIn(doc, sel, el)) push({ kind: \"aria\", value: sel, label: aria });\n else if (uniqueIn(doc, tag + sel, el)) push({ kind: \"aria\", value: tag + sel, label: aria });\n }\n\n const name = el.getAttribute(\"name\");\n if (name && uniqueIn(doc, tag + attrSelector(\"name\", name), el)) push({ kind: \"css\", value: tag + attrSelector(\"name\", name), label: `${tag} name=${name}` });\n const role = el.getAttribute(\"role\");\n if (role) {\n const title = el.getAttribute(\"title\") || el.getAttribute(\"aria-labelledby\");\n const sel = title ? `[role='${role}']${attrSelector(el.getAttribute(\"title\") ? \"title\" : \"aria-labelledby\", title)}` : `[role='${role}']`;\n if (uniqueIn(doc, sel, el)) push({ kind: \"css\", value: sel, label: `role ${role}` });\n }\n if (tag === \"a\") {\n const href = el.getAttribute(\"href\");\n if (href && href.length <= 200 && uniqueIn(doc, `a${attrSelector(\"href\", href)}`, el)) push({ kind: \"css\", value: `a${attrSelector(\"href\", href)}`, label: `link ${href}` });\n }\n\n const path = cssPath(el, doc);\n if (path) push({ kind: \"css\", value: path, label: \"css path\" });\n\n if (/^(button|a|h[1-6]|label|summary)$/.test(tag) || role === \"button\" || role === \"link\" || role === \"tab\" || role === \"menuitem\") {\n const text = normalizeText((el as HTMLElement).innerText ?? el.textContent);\n if (text && text.length <= 80) push({ kind: \"text\", value: text, label: `text \"${text}\"` });\n }\n return out.slice(0, 10);\n}\n\nexport interface ElementDescription {\n selectors: SelectorStrategy[];\n textSnapshot: string;\n rect: { x: number; y: number; width: number; height: number };\n tag: string;\n}\n\n/** Everything the authoring picker needs for one element. */\nexport function describeElement(el: Element): ElementDescription {\n const r = el.getBoundingClientRect();\n return {\n selectors: generateSelectors(el),\n textSnapshot: textSnapshotOf(el),\n rect: { x: r.x, y: r.y, width: r.width, height: r.height },\n tag: el.tagName.toLowerCase(),\n };\n}\n","const ALLOWED_TAGS = new Set([\"p\", \"br\", \"strong\", \"b\", \"em\", \"i\", \"u\", \"a\", \"ul\", \"ol\", \"li\", \"img\", \"h1\", \"h2\", \"h3\", \"h4\", \"code\", \"pre\", \"blockquote\", \"span\", \"div\", \"hr\", \"button\"]);\nconst DROP_TAGS = new Set([\"script\", \"style\", \"iframe\", \"object\", \"embed\", \"form\", \"input\", \"textarea\", \"select\", \"link\", \"meta\", \"base\", \"template\", \"svg\", \"math\", \"frame\", \"frameset\", \"noscript\"]);\nconst ALLOWED_ATTRS = new Set([\"href\", \"src\", \"alt\", \"title\", \"target\", \"rel\", \"class\", \"data-g-action\", \"data-g-value\"]);\nfunction isSafeUrl(value: string, attr: string, tag: string): boolean {\n // eslint-disable-next-line no-control-regex\n const v = value.trim().replace(/[\\u0000-\\u001f\\s]/g, \"\").toLowerCase();\n if (!v) return false;\n const m = /^([a-z][a-z0-9+.-]*):/.exec(v);\n if (!m) return true; // relative URL\n const scheme = m[1];\n if (scheme === \"data\") return tag === \"img\" && attr === \"src\" && v.startsWith(\"data:image/\");\n return scheme === \"http\" || scheme === \"https\" || scheme === \"mailto\" || scheme === \"tel\";\n}\n\nfunction sanitizeElement(el: Element): void {\n const tag = el.tagName.toLowerCase();\n for (const attr of Array.from(el.attributes)) {\n const name = attr.name.toLowerCase();\n if (name.startsWith(\"on\") || !ALLOWED_ATTRS.has(name)) {\n el.removeAttribute(attr.name);\n continue;\n }\n if ((name === \"href\" || name === \"src\") && !isSafeUrl(attr.value, name, tag)) el.removeAttribute(attr.name);\n }\n if (tag === \"a\") {\n const target = el.getAttribute(\"target\");\n if (target && target !== \"_blank\" && target !== \"_self\") el.removeAttribute(\"target\");\n if (el.getAttribute(\"target\") === \"_blank\") el.setAttribute(\"rel\", \"noopener noreferrer\");\n }\n if (tag === \"button\") el.setAttribute(\"type\", \"button\");\n if (tag === \"img\") {\n el.setAttribute(\"loading\", \"lazy\");\n if (!el.getAttribute(\"alt\")) el.setAttribute(\"alt\", \"\");\n }\n}\n\nfunction walk(node: Node): void {\n const children = Array.from(node.childNodes);\n for (const child of children) {\n if (child.nodeType === 8 /* comment */) {\n node.removeChild(child);\n continue;\n }\n if (child.nodeType !== 1) continue;\n const el = child as Element;\n const tag = el.tagName.toLowerCase();\n if (DROP_TAGS.has(tag)) {\n node.removeChild(el);\n continue;\n }\n if (!ALLOWED_TAGS.has(tag)) {\n // Unwrap: keep text/children, drop the element itself.\n while (el.firstChild) node.insertBefore(el.firstChild, el);\n node.removeChild(el);\n // Re-walk the parent since children moved up.\n walk(node);\n return;\n }\n sanitizeElement(el);\n walk(el);\n }\n}\n\n/**\n * Parses HTML into a sanitized DocumentFragment using a strict allowlist. No external\n * dependency: a `<template>` element parses inertly and the tree is walked element by element.\n */\nexport function sanitizeToFragment(html: string, doc: Document = document): DocumentFragment {\n const tpl = doc.createElement(\"template\");\n tpl.innerHTML = html || \"\";\n walk(tpl.content);\n return tpl.content;\n}\n\n/** Returns sanitized HTML as a string. */\nexport function sanitizeHtml(html: string, doc: Document = document): string {\n const frag = sanitizeToFragment(html, doc);\n const div = doc.createElement(\"div\");\n div.appendChild(frag);\n return div.innerHTML;\n}\n\n/** Replaces the content of `el` with the sanitized HTML. */\nexport function setSanitizedHtml(el: Element, html: string): void {\n el.textContent = \"\";\n el.appendChild(sanitizeToFragment(html, el.ownerDocument));\n}\n","/** All runtime CSS, injected once into the Shadow DOM host. Tokens are CSS custom properties. */\nexport const STYLES = `\n:host{all:initial;position:static;display:block;contain:none}\n*,*::before,*::after{box-sizing:border-box}\n.g-scope [hidden]{display:none!important}\n.g-scope{\n --g-primary:#4f46e5;--g-bg:#ffffff;--g-text:#111827;--g-radius:12px;--g-font:Inter,system-ui,-apple-system,sans-serif;--g-z:2147483000;--g-overlay:.5;\n --g-muted:color-mix(in srgb,var(--g-text) 62%,transparent);--g-border:color-mix(in srgb,var(--g-text) 12%,transparent);\n --g-subtle:color-mix(in srgb,var(--g-text) 5%,transparent);--g-shadow:0 10px 40px rgba(0,0,0,.18),0 2px 8px rgba(0,0,0,.08);\n --g-primary-text:#ffffff;\n font-family:var(--g-font);font-size:14px;line-height:1.5;color:var(--g-text);-webkit-font-smoothing:antialiased;\n}\n.g-scope[data-theme=\"dark\"]{--g-shadow:0 10px 40px rgba(0,0,0,.5),0 2px 8px rgba(0,0,0,.3)}\n.g-live{position:fixed;width:1px;height:1px;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}\n.g-layer{position:fixed;inset:0;z-index:var(--g-z);pointer-events:none}\n.g-overlay{position:fixed;inset:0;background:rgba(0,0,0,var(--g-overlay));z-index:calc(var(--g-z) + 3);pointer-events:auto}\n.g-overlay.g-transparent{background:transparent}\n.g-spot-rect{position:fixed;background:rgba(0,0,0,var(--g-overlay));z-index:calc(var(--g-z) + 3);pointer-events:auto}\n.g-spot-ring{position:fixed;z-index:calc(var(--g-z) + 3);pointer-events:none;border-radius:6px;box-shadow:0 0 0 2px var(--g-primary),0 0 0 6px color-mix(in srgb,var(--g-primary) 30%,transparent)}\n.g-card{\n position:fixed;z-index:calc(var(--g-z) + 4);pointer-events:auto;background:var(--g-bg);color:var(--g-text);border-radius:var(--g-radius);\n box-shadow:var(--g-shadow);border:1px solid var(--g-border);width:min(360px,calc(100vw - 32px));max-width:calc(100vw - 32px);max-height:calc(100vh - 32px);overflow:auto;outline:none;\n}\n.g-card.g-modal{left:50%;top:50%;transform:translate(-50%,-50%);width:min(480px,calc(100vw - 32px))}\n.g-card.g-tooltip,.g-card.g-popover,.g-card.g-spotlight-card,.g-card.g-hotspot-card{top:0;left:0;width:min(320px,calc(100vw - 32px))}\n.g-card.g-slideout{width:min(360px,calc(100vw - 32px));margin:16px}\n.g-pos-bottom-right{right:0;bottom:0}.g-pos-bottom-left{left:0;bottom:0}.g-pos-top-right{right:0;top:0}.g-pos-top-left{left:0;top:0}\n.g-pos-center{left:50%;top:50%;transform:translate(-50%,-50%)}\n.g-pos-top{top:0;left:0;right:0}.g-pos-bottom{bottom:0;left:0;right:0}\n.g-banner{position:fixed;left:0;right:0;z-index:calc(var(--g-z) + 1);pointer-events:auto;background:var(--g-primary);color:var(--g-primary-text);padding:10px 48px 10px 16px;display:flex;align-items:center;gap:12px;font-size:14px;box-shadow:0 2px 10px rgba(0,0,0,.15);max-width:100vw}\n.g-banner .g-body{flex:1;min-width:0}\n.g-banner .g-body a{color:inherit;text-decoration:underline}\n.g-banner .g-close{color:inherit;right:8px;top:50%;transform:translateY(-50%)}\n.g-banner .g-btn{background:rgba(255,255,255,.18);color:inherit;border-color:transparent;min-height:36px}\n.g-banner.g-pos-top{top:0}.g-banner.g-pos-bottom{bottom:0}\n.g-inner{padding:20px}\n.g-close{position:absolute;top:8px;right:8px;width:40px;height:40px;display:inline-flex;align-items:center;justify-content:center;border:0;background:transparent;color:var(--g-muted);border-radius:999px;cursor:pointer;font:inherit;font-size:20px;line-height:1}\n.g-close:hover,.g-close:focus-visible{background:var(--g-subtle);color:var(--g-text);outline:none}\n.g-close:focus-visible,.g-btn:focus-visible,.g-task:focus-visible,.g-choice:focus-visible,.g-scale button:focus-visible,.g-launcher:focus-visible,.g-input:focus-visible,.g-rc-item:focus-visible{outline:2px solid var(--g-primary);outline-offset:2px}\n.g-image{display:block;width:100%;max-height:220px;object-fit:cover;border-radius:var(--g-radius) var(--g-radius) 0 0}\n.g-title{margin:0 28px 6px 0;font-size:16px;font-weight:600;line-height:1.3}\n.g-body{font-size:14px;color:var(--g-text)}\n.g-body p{margin:0 0 8px}.g-body p:last-child{margin-bottom:0}\n.g-body ul,.g-body ol{margin:6px 0;padding-left:20px}\n.g-body a{color:var(--g-primary)}\n.g-body img{max-width:100%;height:auto;border-radius:6px}\n.g-body code{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:13px;background:var(--g-subtle);padding:1px 4px;border-radius:4px}\n.g-body pre{background:var(--g-subtle);padding:10px;border-radius:6px;overflow:auto}\n.g-body blockquote{margin:6px 0;padding-left:10px;border-left:3px solid var(--g-border);color:var(--g-muted)}\n.g-footer{display:flex;align-items:center;gap:8px;margin-top:14px;flex-wrap:wrap}\n.g-progress{font-size:12px;color:var(--g-muted);margin-right:auto}\n.g-btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;min-height:40px;padding:8px 14px;border-radius:calc(var(--g-radius) * .66);border:1px solid transparent;font:inherit;font-size:14px;font-weight:500;cursor:pointer;text-decoration:none;transition:background .15s,color .15s,border-color .15s}\n.g-btn-primary{background:var(--g-primary);color:var(--g-primary-text)}\n.g-btn-primary:hover{filter:brightness(1.08)}\n.g-btn-secondary{background:var(--g-subtle);color:var(--g-text);border-color:var(--g-border)}\n.g-btn-secondary:hover{background:color-mix(in srgb,var(--g-text) 10%,transparent)}\n.g-btn-ghost{background:transparent;color:var(--g-muted)}\n.g-btn-ghost:hover{background:var(--g-subtle);color:var(--g-text)}\n.g-btn-link{background:transparent;color:var(--g-primary);padding-left:4px;padding-right:4px}\n.g-btn-link:hover{text-decoration:underline}\n.g-btn:disabled{opacity:.5;cursor:not-allowed}\n.g-arrow{position:absolute;width:12px;height:12px;background:var(--g-bg);transform:rotate(45deg);border:1px solid var(--g-border);z-index:-1}\n.g-hotspot{position:fixed;z-index:calc(var(--g-z) + 1);pointer-events:auto;border-radius:999px;background:var(--g-primary);border:2px solid #fff;box-shadow:0 0 0 2px color-mix(in srgb,var(--g-primary) 40%,transparent);cursor:pointer;padding:0;margin:0}\n.g-hotspot::after{content:\"\";position:absolute;inset:-4px;border-radius:999px;border:2px solid var(--g-primary);opacity:0}\n.g-hotspot.g-pulse::after{animation:g-pulse 1.8s ease-out infinite}\n.g-hotspot-hit{position:absolute;inset:-14px}\n.g-custom{position:fixed;z-index:calc(var(--g-z) + 4);pointer-events:auto;left:50%;top:50%;transform:translate(-50%,-50%);max-width:calc(100vw - 32px);max-height:calc(100vh - 32px);overflow:auto}\n/* animations */\n.g-scope[data-anim=\"fade\"] .g-card,.g-scope[data-anim=\"fade\"] .g-banner,.g-scope[data-anim=\"fade\"] .g-panel{animation:g-fade .18s ease-out}\n.g-scope[data-anim=\"slide\"] .g-card,.g-scope[data-anim=\"slide\"] .g-panel{animation:g-slide .22s ease-out}\n.g-scope[data-anim=\"none\"] *{animation:none!important;transition:none!important}\n@keyframes g-fade{from{opacity:0}to{opacity:1}}\n@keyframes g-slide{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}\n@keyframes g-pulse{0%{transform:scale(.6);opacity:.9}100%{transform:scale(2.2);opacity:0}}\n@media (prefers-reduced-motion:reduce){.g-scope *{animation:none!important;transition:none!important}}\n/* launcher + panel (checklist / resource center) */\n.g-launcher{position:fixed;z-index:calc(var(--g-z) + 1);pointer-events:auto;display:inline-flex;align-items:center;gap:8px;min-height:44px;padding:10px 16px;border-radius:999px;border:0;background:var(--g-primary);color:var(--g-primary-text);font:inherit;font-size:14px;font-weight:600;cursor:pointer;box-shadow:var(--g-shadow);margin:16px}\n.g-launcher .g-ring{width:22px;height:22px;border-radius:999px;background:conic-gradient(#fff var(--g-pct,0%),rgba(255,255,255,.3) 0);display:inline-flex;align-items:center;justify-content:center;font-size:10px;position:relative}\n.g-launcher .g-ring::after{content:\"\";position:absolute;inset:3px;border-radius:999px;background:var(--g-primary)}\n.g-launcher .g-count{position:relative;z-index:1}\n.g-panel{position:fixed;z-index:calc(var(--g-z) + 2);pointer-events:auto;width:min(380px,calc(100vw - 32px));max-height:min(620px,calc(100vh - 100px));display:flex;flex-direction:column;background:var(--g-bg);color:var(--g-text);border-radius:var(--g-radius);box-shadow:var(--g-shadow);border:1px solid var(--g-border);margin:16px;bottom:60px;overflow:hidden}\n.g-panel-head{padding:16px 48px 12px 20px;border-bottom:1px solid var(--g-border);position:relative}\n.g-panel-title{margin:0;font-size:16px;font-weight:600}\n.g-panel-sub{margin:4px 0 0;font-size:12px;color:var(--g-muted)}\n.g-panel-body{overflow:auto;padding:8px 0;flex:1}\n.g-help{display:flex;flex-direction:column;min-height:0;flex:1}\n.g-bar{height:6px;border-radius:999px;background:var(--g-subtle);overflow:hidden;margin-top:10px}\n.g-bar > span{display:block;height:100%;background:var(--g-primary);transition:width .3s}\n.g-task{display:flex;gap:12px;align-items:flex-start;width:100%;padding:12px 20px;border:0;background:transparent;text-align:left;font:inherit;color:inherit;cursor:pointer;min-height:44px}\n.g-task:hover{background:var(--g-subtle)}\n.g-task[disabled]{cursor:not-allowed;opacity:.55}\n.g-task .g-check{flex:none;width:22px;height:22px;border-radius:999px;border:2px solid var(--g-border);display:inline-flex;align-items:center;justify-content:center;font-size:13px;margin-top:1px;color:#fff}\n.g-task.g-done .g-check{background:var(--g-primary);border-color:var(--g-primary)}\n.g-task.g-done .g-task-title{text-decoration:line-through;color:var(--g-muted)}\n.g-task-title{font-weight:500}\n.g-task-desc{font-size:12px;color:var(--g-muted);margin-top:2px}\n.g-panel-foot{padding:10px 20px;border-top:1px solid var(--g-border);display:flex;justify-content:flex-end;gap:8px}\n.g-complete{padding:28px 20px;text-align:center}\n.g-complete .g-title{margin-right:0;font-size:18px}\n/* survey */\n.g-question{margin-bottom:16px}\n.g-q-title{font-weight:600;margin:0 0 4px}\n.g-q-desc{font-size:12px;color:var(--g-muted);margin:0 0 8px}\n.g-scale{display:flex;gap:4px;flex-wrap:wrap}\n.g-scale button{min-width:34px;height:40px;flex:1;padding:0 4px;border-radius:6px;border:1px solid var(--g-border);background:var(--g-subtle);color:var(--g-text);font:inherit;cursor:pointer}\n.g-scale button[aria-pressed=\"true\"],.g-scale button:hover{background:var(--g-primary);color:var(--g-primary-text);border-color:var(--g-primary)}\n.g-scale-labels{display:flex;justify-content:space-between;font-size:11px;color:var(--g-muted);margin-top:4px}\n.g-stars button,.g-thumbs button{font-size:22px;background:transparent;border:0;cursor:pointer;color:var(--g-muted);min-width:40px;height:40px;font:inherit}\n.g-stars button[aria-pressed=\"true\"],.g-stars button.g-on{color:#f59e0b}\n.g-thumbs button[aria-pressed=\"true\"]{color:var(--g-primary)}\n.g-choice{display:flex;align-items:center;gap:10px;padding:8px 10px;border:1px solid var(--g-border);border-radius:8px;margin-bottom:6px;cursor:pointer;min-height:40px;font:inherit;background:transparent;color:inherit;width:100%;text-align:left}\n.g-choice[aria-checked=\"true\"]{border-color:var(--g-primary);background:color-mix(in srgb,var(--g-primary) 8%,transparent)}\n.g-choice .g-dot{width:16px;height:16px;border-radius:999px;border:2px solid var(--g-border);flex:none}\n.g-choice.g-multi .g-dot{border-radius:4px}\n.g-choice[aria-checked=\"true\"] .g-dot{background:var(--g-primary);border-color:var(--g-primary)}\n.g-input{width:100%;min-height:40px;padding:8px 10px;border:1px solid var(--g-border);border-radius:8px;background:var(--g-bg);color:var(--g-text);font:inherit;resize:vertical}\n.g-error{color:#dc2626;font-size:12px;margin-top:4px}\n/* resource center */\n.g-rc-search{padding:12px 20px 4px}\n.g-rc-section{padding:8px 20px 4px;font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--g-muted);font-weight:600}\n.g-rc-item{display:flex;align-items:flex-start;gap:10px;width:100%;padding:10px 20px;border:0;background:transparent;font:inherit;color:inherit;text-align:left;cursor:pointer;min-height:44px;text-decoration:none}\n.g-rc-item:hover{background:var(--g-subtle)}\n.g-rc-item .g-rc-title{font-weight:500}\n.g-rc-item .g-rc-sum{font-size:12px;color:var(--g-muted);margin-top:2px}\n.g-rc-item .g-rc-icon{flex:none;width:20px;text-align:center;color:var(--g-primary)}\n.g-rc-article{padding:16px 20px}\n.g-rc-back{margin-bottom:8px}\n.g-rc-empty{padding:24px 20px;color:var(--g-muted);text-align:center}\n.g-faq-a{padding:0 20px 12px 50px;font-size:13px;color:var(--g-muted)}\n.g-faq-a[hidden]{display:none}\n/* authoring */\n.g-auth-bar{position:fixed;top:0;left:0;right:0;z-index:calc(var(--g-z) + 10);pointer-events:auto;display:flex;align-items:center;gap:12px;padding:8px 16px;background:#111827;color:#fff;font:500 13px/1.4 var(--g-font);box-shadow:0 2px 10px rgba(0,0,0,.3)}\n.g-auth-bar .g-dot-live{width:8px;height:8px;border-radius:999px;background:#22c55e;box-shadow:0 0 0 3px rgba(34,197,94,.3)}\n.g-auth-bar .g-spacer{flex:1}\n.g-auth-bar .g-btn{min-height:32px;padding:4px 12px;font-size:13px}\n.g-auth-bar .g-btn-secondary{background:rgba(255,255,255,.12);color:#fff;border-color:transparent}\n.g-auth-outline{position:fixed;z-index:calc(var(--g-z) + 9);pointer-events:none;border:2px solid var(--g-primary);background:color-mix(in srgb,var(--g-primary) 12%,transparent);border-radius:4px;transition:all .06s linear}\n.g-auth-label{position:absolute;left:-2px;top:-24px;background:var(--g-primary);color:#fff;font:600 11px/1 var(--g-font);padding:5px 7px;border-radius:4px;white-space:nowrap;max-width:320px;overflow:hidden;text-overflow:ellipsis}\n.g-auth-outline.g-picked{border-style:dashed;border-color:#22c55e;background:rgba(34,197,94,.12)}\n.g-auth-outline.g-picked .g-auth-label{background:#16a34a}\n.g-highlight{position:fixed;z-index:calc(var(--g-z) + 8);pointer-events:none;border:2px dashed #f59e0b;background:rgba(245,158,11,.12);border-radius:4px}\n@media (max-width:480px){.g-card.g-modal,.g-panel{width:calc(100vw - 32px)}.g-inner{padding:16px}}\n`;\n","import type { Appearance, ProjectTheme } from \"@guidelytech/shared\";\nimport { STYLES } from \"./styles\";\n\nexport const HOST_ID = \"guidely-root\";\n\nexport interface HostHandle {\n host: HTMLElement;\n shadow: ShadowRoot;\n /** Polite live region for screen-reader announcements. */\n live: HTMLElement;\n announce(text: string): void;\n destroy(): void;\n}\n\nlet current: HostHandle | null = null;\n\n/** Default project theme used when the config has not loaded yet. */\nexport const DEFAULT_THEME: ProjectTheme = {\n primaryColor: \"#4f46e5\",\n backgroundColor: \"#ffffff\",\n textColor: \"#111827\",\n borderRadius: 12,\n fontFamily: \"Inter, system-ui, -apple-system, sans-serif\",\n};\n\n/** Returns (creating when needed) the single Shadow-DOM host appended to `document.body`. */\nexport function ensureHost(doc: Document = document): HostHandle {\n if (current && current.host.isConnected && current.host.ownerDocument === doc) return current;\n let host = doc.getElementById(HOST_ID) as HTMLElement | null;\n if (!host) {\n host = doc.createElement(\"div\");\n host.id = HOST_ID;\n host.setAttribute(\"data-guidely\", \"\");\n (doc.body || doc.documentElement).appendChild(host);\n }\n const shadow = host.shadowRoot ?? host.attachShadow({ mode: \"open\" });\n if (!shadow.querySelector(\"style[data-g-base]\")) {\n const style = doc.createElement(\"style\");\n style.setAttribute(\"data-g-base\", \"\");\n style.textContent = STYLES;\n shadow.appendChild(style);\n }\n let live = shadow.querySelector<HTMLElement>(\".g-live\");\n if (!live) {\n live = doc.createElement(\"div\");\n live.className = \"g-live\";\n live.setAttribute(\"aria-live\", \"polite\");\n live.setAttribute(\"aria-atomic\", \"true\");\n shadow.appendChild(live);\n }\n const liveEl = live;\n current = {\n host,\n shadow,\n live: liveEl,\n announce(text: string) {\n liveEl.textContent = \"\";\n setTimeout(() => {\n liveEl.textContent = text;\n }, 30);\n },\n destroy() {\n host?.remove();\n if (current?.host === host) current = null;\n },\n };\n return current;\n}\n\n/** Removes the host from the document (all overlays with it). */\nexport function destroyHost(): void {\n current?.destroy();\n const stray = typeof document !== \"undefined\" ? document.getElementById(HOST_ID) : null;\n stray?.remove();\n current = null;\n}\n\nexport type ResolvedThemeMode = \"light\" | \"dark\";\n\nfunction prefersDark(): boolean {\n try {\n return typeof window !== \"undefined\" && typeof window.matchMedia === \"function\" && window.matchMedia(\"(prefers-color-scheme: dark)\").matches;\n } catch {\n return false;\n }\n}\n\nexport function prefersReducedMotion(): boolean {\n try {\n return typeof window !== \"undefined\" && typeof window.matchMedia === \"function\" && window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;\n } catch {\n return false;\n }\n}\n\nexport interface ThemeVars {\n primary: string;\n bg: string;\n text: string;\n radius: number;\n font: string;\n z: number;\n overlay: number;\n mode: ResolvedThemeMode;\n animation: Appearance[\"animation\"];\n}\n\n/** Merges project theme + guide appearance into CSS custom property values. */\nexport function resolveTheme(theme: Partial<ProjectTheme> | null | undefined, appearance?: Partial<Appearance> | null): ThemeVars {\n const t = { ...DEFAULT_THEME, ...(theme || {}) };\n const a = appearance || {};\n const requested = a.theme ?? \"auto\";\n const mode: ResolvedThemeMode = requested === \"auto\" ? (prefersDark() ? \"dark\" : \"light\") : requested;\n const dark = mode === \"dark\";\n return {\n primary: a.primaryColor || t.primaryColor,\n bg: a.backgroundColor || (dark ? \"#1f2937\" : t.backgroundColor),\n text: a.textColor || (dark ? \"#f9fafb\" : t.textColor),\n radius: a.borderRadius ?? t.borderRadius,\n font: a.fontFamily || t.fontFamily,\n z: a.zIndex ?? 2147483000,\n overlay: a.overlayOpacity ?? 0.5,\n mode,\n animation: prefersReducedMotion() ? \"none\" : (a.animation ?? \"fade\"),\n };\n}\n\n/** Applies theme variables to a scope element. */\nexport function applyTheme(el: HTMLElement, vars: ThemeVars): void {\n el.style.setProperty(\"--g-primary\", vars.primary);\n el.style.setProperty(\"--g-bg\", vars.bg);\n el.style.setProperty(\"--g-text\", vars.text);\n el.style.setProperty(\"--g-radius\", `${vars.radius}px`);\n el.style.setProperty(\"--g-font\", vars.font);\n el.style.setProperty(\"--g-z\", String(vars.z));\n el.style.setProperty(\"--g-overlay\", String(vars.overlay));\n el.setAttribute(\"data-theme\", vars.mode);\n el.setAttribute(\"data-anim\", vars.animation);\n}\n\n/**\n * Creates a themed scope container inside the shadow root. Each guide/widget renders inside its\n * own scope so appearance settings never leak between guides.\n */\nexport function createScope(theme?: Partial<ProjectTheme> | null, appearance?: Partial<Appearance> | null, doc: Document = document): { el: HTMLElement; vars: ThemeVars; destroy(): void } {\n const handle = ensureHost(doc);\n const el = doc.createElement(\"div\");\n el.className = \"g-scope\";\n const vars = resolveTheme(theme, appearance);\n applyTheme(el, vars);\n handle.shadow.appendChild(el);\n let mq: MediaQueryList | null = null;\n const onChange = () => applyTheme(el, resolveTheme(theme, appearance));\n if ((appearance?.theme ?? \"auto\") === \"auto\" && typeof window !== \"undefined\" && typeof window.matchMedia === \"function\") {\n try {\n mq = window.matchMedia(\"(prefers-color-scheme: dark)\");\n mq.addEventListener?.(\"change\", onChange);\n } catch {\n mq = null;\n }\n }\n return {\n el,\n vars,\n destroy() {\n mq?.removeEventListener?.(\"change\", onChange);\n el.remove();\n },\n };\n}\n","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 { setSanitizedHtml } from \"./sanitize\";\n\nexport interface HelpGuideRef {\n id: string;\n key: string;\n name: string;\n kind: string;\n}\n\n/** What the help view lists. Article bodies may be missing (`bodyOmitted` or summaries only): they load on open. */\nexport interface HelpData {\n collections: ResourceCenterConfig[\"collections\"];\n articles: Array<Omit<ResourceCenterArticle, \"body\"> & { body?: string }>;\n recommended?: HelpGuideRef[];\n checklists?: HelpGuideRef[];\n faqs?: ResourceCenterConfig[\"faqs\"];\n links?: ResourceCenterConfig[\"links\"];\n}\n\nexport interface HelpViewOptions {\n doc: Document;\n data: () => HelpData;\n /** Server search. Results are merged with the client-side title/summary filter. */\n search?: (q: string) => Promise<ResourceCenterArticle[]>;\n /** Loads an article body that isn't in `data()`. */\n loadArticle?: (id: string) => Promise<ResourceCenterArticle | null>;\n onStartGuide?: (guideId: string) => void;\n onOpenChecklist?: (guideId: string) => void;\n onArticleView?: (article: ResourceCenterArticle) => void;\n}\n\nexport interface HelpView {\n /** Search box + scrollable body. */\n el: HTMLElement;\n render(): void;\n /** Back to the article list and clear the search. */\n reset(): void;\n openArticle(id: string): void;\n focusSearch(): void;\n setQuery(q: string): void;\n destroy(): void;\n}\n\nexport function el<K extends keyof HTMLElementTagNameMap>(doc: Document, tag: K, cls?: string, text?: string): HTMLElementTagNameMap[K] {\n const e = doc.createElement(tag);\n if (cls) e.className = cls;\n if (text != null) e.textContent = text;\n return e;\n}\n\nexport function listItem(doc: Document, icon: string, title: string, summary?: string): HTMLButtonElement {\n const b = el(doc, \"button\", \"g-rc-item\");\n b.type = \"button\";\n const i = el(doc, \"span\", \"g-rc-icon\", icon);\n i.setAttribute(\"aria-hidden\", \"true\");\n const text = el(doc, \"span\");\n text.appendChild(el(doc, \"div\", \"g-rc-title\", title));\n if (summary) text.appendChild(el(doc, \"div\", \"g-rc-sum\", summary));\n b.append(i, text);\n return b;\n}\n\ntype ListedArticle = HelpData[\"articles\"][number];\n\n/** Article browser shared by the resource center and the messenger Help tab. */\nexport function createHelpView(options: HelpViewOptions): HelpView {\n const { doc } = options;\n let query = \"\";\n let serverResults: ResourceCenterArticle[] = [];\n let searchSeq = 0;\n let openSeq = 0;\n let active: { article: ListedArticle; loading: boolean } | null = null;\n\n const root = el(doc, \"div\", \"g-help\");\n const searchWrap = el(doc, \"div\", \"g-rc-search\");\n const input = el(doc, \"input\", \"g-input\");\n input.type = \"search\";\n input.placeholder = \"Search help articles…\";\n input.setAttribute(\"aria-label\", \"Search help articles\");\n searchWrap.appendChild(input);\n const body = el(doc, \"div\", \"g-panel-body\");\n root.append(searchWrap, body);\n\n const hasBody = (a: ListedArticle): a is ResourceCenterArticle => typeof a.body === \"string\" && !a.bodyOmitted;\n\n const openArticle = (article: ListedArticle) => {\n if (article.externalUrl) {\n window.open(article.externalUrl, \"_blank\", \"noopener,noreferrer\");\n if (hasBody(article)) options.onArticleView?.(article);\n return;\n }\n const seq = ++openSeq;\n if (hasBody(article) || !options.loadArticle) {\n active = { article, loading: false };\n if (hasBody(article)) options.onArticleView?.(article);\n return render();\n }\n active = { article, loading: true };\n render();\n options\n .loadArticle(article.id)\n .then((full) => {\n if (seq !== openSeq || !active) return;\n active = { article: full ?? { ...article, body: \"\" }, loading: false };\n if (full) options.onArticleView?.(full);\n render();\n })\n .catch(() => {\n if (seq !== openSeq || !active) return;\n active = { article: { ...article, body: \"\" }, loading: false };\n render();\n });\n };\n\n const renderArticle = ({ article, loading }: NonNullable<typeof active>) => {\n const wrap = el(doc, \"div\", \"g-rc-article\");\n const back = el(doc, \"button\", \"g-btn g-btn-link g-rc-back\", \"← Back\");\n back.type = \"button\";\n back.addEventListener(\"click\", () => {\n openSeq++;\n active = null;\n render();\n });\n const title = el(doc, \"h3\", \"g-title\", article.title);\n const content = el(doc, \"div\", \"g-body\");\n if (loading) content.appendChild(el(doc, \"div\", \"g-rc-empty\", \"Loading…\"));\n else if (article.body) setSanitizedHtml(content, article.body);\n else content.appendChild(el(doc, \"div\", \"g-rc-empty\", \"This article couldn't be loaded.\"));\n wrap.append(back, title, content);\n body.appendChild(wrap);\n back.focus?.({ preventScroll: true });\n };\n\n const section = (label: string) => body.appendChild(el(doc, \"div\", \"g-rc-section\", label));\n const articleButton = (a: ListedArticle) => {\n const b = listItem(doc, \"📄\", a.title, a.summary);\n b.addEventListener(\"click\", () => openArticle(a));\n body.appendChild(b);\n };\n\n function render() {\n body.textContent = \"\";\n if (active) return renderArticle(active);\n const data = options.data();\n const q = query.trim().toLowerCase();\n if (q) {\n const local = data.articles.filter((a) => a.title.toLowerCase().includes(q) || a.summary.toLowerCase().includes(q));\n const seen = new Set(local.map((a) => a.id));\n const merged: ListedArticle[] = [...local, ...serverResults.filter((a) => !seen.has(a.id))];\n section(`Results (${merged.length})`);\n if (!merged.length) body.appendChild(el(doc, \"div\", \"g-rc-empty\", \"No articles match your search.\"));\n merged.forEach(articleButton);\n return;\n }\n if (data.recommended?.length) {\n section(\"Recommended\");\n data.recommended.forEach((g) => {\n const b = listItem(doc, \"▶\", g.name, \"Start guide\");\n b.addEventListener(\"click\", () => options.onStartGuide?.(g.id));\n body.appendChild(b);\n });\n }\n if (data.checklists?.length) {\n section(\"Checklists\");\n data.checklists.forEach((g) => {\n const b = listItem(doc, \"☑\", g.name, \"Open checklist\");\n b.addEventListener(\"click\", () => options.onOpenChecklist?.(g.id));\n body.appendChild(b);\n });\n }\n const collections = [...data.collections].sort((a, b) => a.order - b.order);\n const uncollected = data.articles.filter((a) => !a.collectionId || !collections.some((c) => c.id === a.collectionId));\n collections.forEach((c) => {\n const articles = data.articles.filter((a) => a.collectionId === c.id);\n if (!articles.length) return;\n section(c.name);\n articles.forEach(articleButton);\n });\n if (uncollected.length) {\n section(\"Articles\");\n uncollected.forEach(articleButton);\n }\n if (data.faqs?.length) {\n section(\"FAQ\");\n data.faqs.forEach((f) => {\n const b = listItem(doc, \"?\", f.question);\n b.setAttribute(\"aria-expanded\", \"false\");\n const a = el(doc, \"div\", \"g-faq-a\");\n setSanitizedHtml(a, f.answer);\n a.hidden = true;\n b.addEventListener(\"click\", () => {\n a.hidden = !a.hidden;\n b.setAttribute(\"aria-expanded\", String(!a.hidden));\n });\n body.append(b, a);\n });\n }\n if (data.links?.length) {\n section(\"Links\");\n data.links.forEach((l) => {\n const a = el(doc, \"a\", \"g-rc-item\");\n a.href = l.url;\n a.target = \"_blank\";\n a.rel = \"noopener noreferrer\";\n const i = el(doc, \"span\", \"g-rc-icon\", \"↗\");\n i.setAttribute(\"aria-hidden\", \"true\");\n a.append(i, el(doc, \"span\", \"g-rc-title\", l.label));\n body.appendChild(a);\n });\n }\n if (!body.childNodes.length) body.appendChild(el(doc, \"div\", \"g-rc-empty\", \"Nothing here yet.\"));\n }\n\n let debounce: ReturnType<typeof setTimeout> | null = null;\n const onInput = () => {\n query = input.value;\n openSeq++;\n active = null;\n render();\n if (debounce) clearTimeout(debounce);\n if (!options.search || !query.trim()) {\n serverResults = [];\n return;\n }\n const seq = ++searchSeq;\n debounce = setTimeout(() => {\n options\n .search?.(query.trim())\n .then((results) => {\n if (seq !== searchSeq) return;\n serverResults = Array.isArray(results) ? results : [];\n render();\n })\n .catch(() => {});\n }, 250);\n };\n input.addEventListener(\"input\", onInput);\n\n return {\n el: root,\n render,\n reset() {\n openSeq++;\n active = null;\n query = \"\";\n input.value = \"\";\n serverResults = [];\n },\n openArticle(id: string) {\n const listed = options.data().articles.find((a) => a.id === id) ?? { id, slug: id, title: \"Article\", summary: \"\", updatedAt: \"\", bodyOmitted: true };\n openArticle(listed);\n },\n focusSearch: () => input.focus?.({ preventScroll: true }),\n setQuery(q: string) {\n input.value = q;\n onInput();\n },\n destroy() {\n if (debounce) clearTimeout(debounce);\n input.removeEventListener(\"input\", onInput);\n root.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 /** 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 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":["HOST_ID","el","el","HOST_ID","el","el","el","import_runtime","el","import_runtime","import_runtime","el","el"]}
|