@guidelytech/guide-runtime 0.10.0 → 0.12.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/sanitize.ts","../src/pdf-viewer.ts","../src/help-view.ts"],"sourcesContent":["import { EMBED_IFRAME_ATTRS, VIDEO_ATTRS, isAllowedEmbedSrc, isSafeMediaUrl } from \"@guidelytech/shared/runtime\";\n\nconst 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\", \"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\", \"width\", \"height\", \"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 for (const dim of [\"width\", \"height\"]) if (el.hasAttribute(dim) && !/^\\d{1,5}$/.test(el.getAttribute(dim)!)) el.removeAttribute(dim);\n el.setAttribute(\"loading\", \"lazy\");\n if (!el.getAttribute(\"alt\")) el.setAttribute(\"alt\", \"\");\n }\n}\n\n/**\n * Media elements are rebuilt from scratch rather than filtered: an `<iframe>` only for a canonical\n * YouTube/Vimeo/Loom/Wistia embed, a `<video>` only for an absolute http(s) file, each with fixed\n * attributes. Returns null when the element must go.\n */\nfunction rebuildMedia(el: Element): Element | null {\n const doc = el.ownerDocument;\n const tag = el.tagName.toLowerCase();\n const src = el.getAttribute(\"src\");\n let out: Element;\n if (tag === \"iframe\") {\n if (!isAllowedEmbedSrc(src)) return null;\n out = doc.createElement(\"iframe\");\n out.setAttribute(\"src\", src!);\n out.setAttribute(\"title\", el.getAttribute(\"title\") || \"Embedded video\");\n for (const [k, v] of Object.entries(EMBED_IFRAME_ATTRS)) out.setAttribute(k, v);\n } else {\n if (!isSafeMediaUrl(src)) return null;\n out = doc.createElement(\"video\");\n out.setAttribute(\"src\", src!);\n const poster = el.getAttribute(\"poster\");\n if (isSafeMediaUrl(poster)) out.setAttribute(\"poster\", poster!);\n for (const [k, v] of Object.entries(VIDEO_ATTRS)) out.setAttribute(k, v);\n }\n return out;\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 (tag === \"iframe\" || tag === \"video\") {\n const media = rebuildMedia(el);\n if (media) node.replaceChild(media, el);\n else 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","import { FILE_LINK_CLASS, PDF_BLOCK_CLASS, PDF_PAGES_CLASS } from \"@guidelytech/shared/runtime\";\nimport { prefersReducedMotion } from \"./host\";\n\n/**\n * Turns the PDFs in a sanitized article body (`div.gd-pdf`: the PDF link plus its pages as images)\n * into inline viewers: pages swipe sideways with a page counter and previous/next buttons, and the\n * header or a tap on a page opens a full-screen reader inside the widget, so visitors read the\n * document without downloading it. The original PDF stays one tap away in the reader. Without this\n * (or without script) the CSS alone still shows a scrollable strip of pages.\n */\nexport function enhancePdfViewers(root: Element, doc: Document = root.ownerDocument): void {\n for (const block of Array.from(root.querySelectorAll(`div.${PDF_BLOCK_CLASS}`))) {\n const link = block.querySelector<HTMLAnchorElement>(`a.${FILE_LINK_CLASS}`);\n const strip = block.querySelector<HTMLElement>(`.${PDF_PAGES_CLASS}`);\n if (!link || !strip || block.hasAttribute(\"data-g-ready\")) continue;\n // The sanitizer strips unsafe sources; those images aren't pages.\n for (const img of Array.from(strip.querySelectorAll(\"img:not([src])\"))) img.remove();\n const pages = Array.from(strip.querySelectorAll(\"img\"));\n if (!pages.length) {\n strip.remove();\n continue;\n }\n block.setAttribute(\"data-g-ready\", \"\");\n const name = (link.textContent || \"\").trim() || \"PDF\";\n block.setAttribute(\"role\", \"group\");\n block.setAttribute(\"aria-label\", `${name}, ${pages.length} ${pages.length === 1 ? \"page\" : \"pages\"}`);\n link.setAttribute(\"aria-label\", `Read ${name} full screen`);\n link.addEventListener(\"click\", (e) => {\n e.preventDefault();\n openReader(doc, block, link, pages, 0);\n });\n\n const viewport = doc.createElement(\"div\");\n viewport.className = \"g-pdf-viewport\";\n strip.replaceWith(viewport);\n viewport.appendChild(strip);\n strip.tabIndex = 0;\n strip.setAttribute(\"aria-label\", `${name} pages`);\n\n const counter = doc.createElement(\"span\");\n counter.className = \"g-pdf-count\";\n counter.setAttribute(\"aria-live\", \"polite\");\n const prev = navButton(doc, \"prev\", \"Previous page\", \"‹\");\n const next = navButton(doc, \"next\", \"Next page\", \"›\");\n viewport.append(prev, next, counter);\n\n // Distance between page starts: one page width plus the gap.\n const stride = () => Math.max(1, pages.length > 1 ? pages[1]!.offsetLeft - pages[0]!.offsetLeft : strip.clientWidth);\n const current = () => Math.round(strip.scrollLeft / stride());\n const go = (i: number) => strip.scrollTo({ left: Math.max(0, Math.min(pages.length - 1, i)) * stride(), behavior: prefersReducedMotion() ? \"auto\" : \"smooth\" });\n const update = () => {\n const i = Math.min(pages.length - 1, current());\n counter.textContent = `${i + 1} / ${pages.length}`;\n prev.disabled = i === 0;\n next.disabled = i >= pages.length - 1;\n };\n prev.addEventListener(\"click\", () => go(current() - 1));\n next.addEventListener(\"click\", () => go(current() + 1));\n strip.addEventListener(\"scroll\", update, { passive: true });\n strip.addEventListener(\"keydown\", (e) => {\n if (e.key === \"ArrowRight\" || e.key === \"ArrowLeft\") {\n e.preventDefault();\n go(current() + (e.key === \"ArrowRight\" ? 1 : -1));\n } else if (e.key === \"Enter\") openReader(doc, block, link, pages, current());\n });\n pages.forEach((img, i) => img.addEventListener(\"click\", () => openReader(doc, block, link, pages, i)));\n if (pages.length === 1) viewport.classList.add(\"g-pdf-single\");\n update();\n }\n}\n\nfunction navButton(doc: Document, cls: string, label: string, text: string) {\n const b = doc.createElement(\"button\");\n b.type = \"button\";\n b.className = `g-pdf-nav g-pdf-${cls}`;\n b.setAttribute(\"aria-label\", label);\n b.textContent = text;\n return b;\n}\n\n/** Full-screen reader: every page stacked vertically, the original PDF linked, Escape to close. */\nfunction openReader(doc: Document, block: Element, link: HTMLAnchorElement, pages: HTMLImageElement[], start: number) {\n const host = (block.closest(\".g-scope\") as HTMLElement | null) ?? doc.body;\n // Inside the shadow root, `document.activeElement` is only the host.\n const returnFocus = (block.getRootNode() as Document | ShadowRoot).activeElement as HTMLElement | null;\n const name = (link.textContent || \"\").trim() || \"PDF\";\n\n const reader = doc.createElement(\"div\");\n reader.className = \"g-pdf-reader\";\n reader.setAttribute(\"role\", \"dialog\");\n reader.setAttribute(\"aria-modal\", \"true\");\n reader.setAttribute(\"aria-label\", name);\n const bar = doc.createElement(\"div\");\n bar.className = \"g-pdf-bar\";\n const title = doc.createElement(\"span\");\n title.className = \"g-pdf-title\";\n title.textContent = name;\n const original = doc.createElement(\"a\");\n original.className = \"g-btn g-btn-secondary\";\n original.href = link.href;\n original.target = \"_blank\";\n original.rel = \"noopener noreferrer\";\n original.textContent = \"Open PDF ↗\";\n const close = doc.createElement(\"button\");\n close.type = \"button\";\n close.className = \"g-close g-pdf-close\";\n close.setAttribute(\"aria-label\", \"Close\");\n close.textContent = \"×\";\n bar.append(title, original, close);\n\n const scroller = doc.createElement(\"div\");\n scroller.className = \"g-pdf-scroll\";\n scroller.tabIndex = 0;\n for (const page of pages) {\n const img = doc.createElement(\"img\");\n img.src = page.src;\n img.alt = page.alt;\n img.decoding = \"async\";\n // Sizes up front so every page has its height before loading, and opening at page N lands on it.\n for (const dim of [\"width\", \"height\"]) if (page.hasAttribute(dim)) img.setAttribute(dim, page.getAttribute(dim)!);\n scroller.appendChild(img);\n }\n reader.append(bar, scroller);\n\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n e.stopPropagation();\n done();\n } else if (e.key === \"Tab\") {\n // Keep focus inside the reader.\n const items: HTMLElement[] = [original, close, scroller];\n const at = items.indexOf((reader.getRootNode() as Document | ShadowRoot).activeElement as HTMLElement);\n e.preventDefault();\n items[(at + (e.shiftKey ? items.length - 1 : 1)) % items.length]!.focus();\n }\n };\n const done = () => {\n reader.remove();\n returnFocus?.focus?.({ preventScroll: true });\n };\n close.addEventListener(\"click\", done);\n reader.addEventListener(\"keydown\", onKey);\n host.appendChild(reader);\n close.focus();\n const target = scroller.children[start] as HTMLImageElement | undefined;\n if (target && start > 0) {\n const land = () => (scroller.scrollTop = target.offsetTop - 12);\n requestAnimationFrame(land);\n // Pages without stored sizes only get their height once the pages above have loaded.\n if (!target.hasAttribute(\"height\")) for (const img of Array.from(scroller.children).slice(0, start)) img.addEventListener(\"load\", land, { once: true });\n }\n}\n","import type { ResourceCenterAnnouncement, ResourceCenterArticle, ResourceCenterConfig, ResourceCenterModuleId } from \"@guidelytech/shared\";\nimport { isArticleListed, matchesHelpQuery, RC_MODULE_IDS, RC_MODULE_LABELS, resourceCenterSections, showMeKeyFromHref, SHOW_ME_HREF_PREFIX } from \"@guidelytech/shared/runtime\";\nimport { enhancePdfViewers } from \"./pdf-viewer\";\nimport { setSanitizedHtml } from \"./sanitize\";\n\nexport interface HelpGuideRef {\n id: string;\n key: string;\n name: string;\n kind: string;\n}\n\n/** A page-aware suggestion at the top of the help view (the messenger works out what and how it opens). */\nexport interface HelpSuggestion {\n kind: \"guide\" | \"howto\" | \"article\";\n title: string;\n summary?: string;\n run: () => void;\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 /** Shown first, under its own title (\"For the Invoices page\"). */\n suggested?: { title: string; items: HelpSuggestion[] };\n recommended?: HelpGuideRef[];\n checklists?: HelpGuideRef[];\n faqs?: ResourceCenterConfig[\"faqs\"];\n links?: ResourceCenterConfig[\"links\"];\n /** \"What's new\" entries (already filtered for the visitor, newest first). */\n announcements?: ResourceCenterAnnouncement[];\n /** Announcements published after this time are marked new. */\n announcementsSeenAt?: string | null;\n /** Sections to show, in order (absent = all, default order). */\n modules?: ResourceCenterModuleId[];\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 /** The visitor's audiences; articles and collections targeted at others aren't listed. */\n audienceIds?: () => ReadonlySet<string> | readonly string[];\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 /** Extra items above the list (`query` empty) or above the article results (the messenger's how-tos). */\n extra?: (query: string) => Node[];\n /** Live guides in this environment: \"Show me\" prompts only appear for ones that can be started. */\n guides?: () => readonly HelpGuideRef[];\n /** Starts a walkthrough from a Show me prompt (an article's, or a search result's). */\n onShowMe?: (guideKey: string) => void;\n /** An article opened (`true`) or the view went back to the list (`false`); hosts enlarge their panel to read it. */\n onArticleChange?: (open: boolean) => void;\n}\n\n/** Guide kinds a Show me prompt can start on demand. */\nconst SHOW_ME_KINDS = new Set([\"flow\", \"modal\", \"tooltip\", \"announcement\"]);\n\n/** The guide a Show me prompt names, when it is live here and can be started. */\nexport function startableGuide(guides: readonly HelpGuideRef[] | undefined, keyOrId: string | null | undefined): HelpGuideRef | null {\n if (!keyOrId || !guides) return null;\n return guides.find((g) => (g.key === keyOrId || g.id === keyOrId) && SHOW_ME_KINDS.has(g.kind)) ?? null;\n}\n\n/**\n * A result row: the item opens on click, and a separate \"Show me\" button starts its walkthrough\n * right away. Two sibling buttons, never one inside the other.\n */\nexport function resultRow(doc: Document, icon: string, title: string, summary: string | undefined, onOpen: () => void, showMe?: () => void): HTMLElement {\n const item = listItem(doc, icon, title, summary);\n item.addEventListener(\"click\", onOpen);\n if (!showMe) return item;\n const row = el(doc, \"div\", \"g-rc-row\");\n const b = el(doc, \"button\", \"g-btn g-btn-primary g-rc-showme\", \"▶ Show me\");\n b.type = \"button\";\n b.setAttribute(\"aria-label\", `Show me: ${title}`);\n b.addEventListener(\"click\", showMe);\n row.append(item, b);\n return row;\n}\n\n/**\n * Turns the Show me links in a rendered article (`<a href=\"#guidely-show-me:<key>\">`) into buttons\n * that start the walkthrough, and removes the ones whose guide isn't live here.\n */\nexport function enhanceShowMe(root: HTMLElement, doc: Document, canStart: (key: string) => boolean, start: (key: string) => void): void {\n for (const a of Array.from(root.querySelectorAll<HTMLAnchorElement>(`a[href^=\"${SHOW_ME_HREF_PREFIX}\"]`))) {\n const key = showMeKeyFromHref(a.getAttribute(\"href\"));\n const holder = a.closest(\"p.gd-show-me\") ?? a;\n if (!key || !canStart(key)) {\n // A prompt alone in its paragraph goes with it; one inside text keeps its words.\n if (holder !== a) holder.remove();\n else a.replaceWith(doc.createTextNode(a.textContent ?? \"\"));\n continue;\n }\n const b = el(doc, \"button\", \"g-btn g-btn-primary g-help-showme\", `▶ ${(a.textContent ?? \"\").trim() || \"Show me\"}`);\n b.type = \"button\";\n b.addEventListener(\"click\", () => start(key));\n a.replaceWith(b);\n }\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 /** True while an article is open. */\n isArticleOpen(): boolean;\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 const setActive = (next: typeof active) => {\n const was = !!active;\n active = next;\n if (was !== !!next) options.onArticleChange?.(!!next);\n };\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 const canShowMe = (key: string) => !!options.onShowMe && !!startableGuide(options.guides?.(), key);\n const showMe = (key: string) => options.onShowMe?.(startableGuide(options.guides?.(), key)?.key ?? key);\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 setActive({ article, loading: false });\n if (hasBody(article)) options.onArticleView?.(article);\n return render();\n }\n setActive({ article, loading: true });\n render();\n options\n .loadArticle(article.id)\n .then((full) => {\n if (seq !== openSeq || !active) return;\n setActive({ article: full ?? { ...article, body: \"\" }, loading: false });\n if (full) options.onArticleView?.(full);\n render();\n })\n .catch(() => {\n if (seq !== openSeq || !active) return;\n setActive({ 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 setActive(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) {\n setSanitizedHtml(content, article.body);\n enhancePdfViewers(content, doc);\n enhanceShowMe(content, doc, canShowMe, showMe);\n }\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, depth = 0) => {\n const s = body.appendChild(el(doc, \"div\", \"g-rc-section\", label));\n if (depth) s.dataset.depth = String(depth);\n return s;\n };\n const articleButton = (a: ListedArticle) => {\n const key = a.walkthroughs?.find(canShowMe);\n const summary = a.hasVideo ? (a.summary ? `Video · ${a.summary}` : \"Video\") : a.summary;\n body.appendChild(resultRow(doc, a.hasVideo ? \"▶\" : \"📄\", a.title, summary, () => openArticle(a), key ? () => showMe(key) : undefined));\n };\n\n function render() {\n body.textContent = \"\";\n if (active) return renderArticle(active);\n const data = options.data();\n const member = options.audienceIds?.() ?? [];\n searchWrap.hidden = !!data.modules && !data.modules.includes(\"search\");\n const sections = resourceCenterSections(data.collections, data.articles, member);\n const q = query.trim().toLowerCase();\n if (q) {\n // Walkthroughs the team lists in Help (recommended guides) whose name matches, ready to start.\n const walkthroughs = (data.recommended ?? []).filter((g) => matchesHelpQuery(g.name, q) && startableGuide(options.guides?.() ?? data.recommended, g.id));\n if (walkthroughs.length) {\n section(`Walkthroughs (${walkthroughs.length})`);\n for (const g of walkthroughs) body.appendChild(resultRow(doc, \"▶\", g.name, \"Show me, step by step\", () => options.onStartGuide?.(g.id)));\n }\n }\n body.append(...(options.extra?.(q) ?? []));\n if (q) {\n const visible = sections.flatMap((s) => s.articles);\n const local = visible.filter((a) => matchesHelpQuery(`${a.title} ${a.summary}`, q));\n const seen = new Set(local.map((a) => a.id));\n // Server search covers every published article: keep only the ones listed for this visitor.\n const hidden = new Set(data.articles.map((a) => a.id).filter((id) => !visible.some((v) => v.id === id)));\n const merged: ListedArticle[] = [...local, ...serverResults.filter((a) => !seen.has(a.id) && !hidden.has(a.id) && isArticleListed(data.collections, a, member))];\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.suggested?.items.length) {\n section(data.suggested.title);\n const glyph = { guide: \"▶\", howto: \"☰\", article: \"📄\" } as const;\n data.suggested.items.forEach((item) => {\n const b = listItem(doc, glyph[item.kind], item.title, item.summary);\n b.addEventListener(\"click\", item.run);\n body.appendChild(b);\n });\n }\n const renderers: Record<ResourceCenterModuleId, () => void> = {\n search: () => {},\n announcements: () => {\n if (!data.announcements?.length) return;\n section(RC_MODULE_LABELS.announcements);\n const seen = data.announcementsSeenAt ? Date.parse(data.announcementsSeenAt) : NaN;\n data.announcements.slice(0, 20).forEach((n) => body.appendChild(announcementItem(n, Number.isNaN(seen) || Date.parse(n.publishedAt) > seen)));\n },\n guides: () => {\n if (!data.recommended?.length) return;\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 checklists: () => {\n if (!data.checklists?.length) return;\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 articles: () => {\n // Nested collections read as \"Billing › Invoices\", depth first.\n for (const s of sections) {\n section(s.collection ? s.path.join(\" › \") : \"Articles\", s.depth);\n s.articles.forEach(articleButton);\n }\n },\n faqs: () => {\n if (!data.faqs?.length) return;\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 a.id = `g-faq-${f.id}`;\n b.setAttribute(\"aria-controls\", a.id);\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 links: () => {\n if (!data.links?.length) return;\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 a.setAttribute(\"aria-label\", `${l.label} (opens in a new tab)`);\n body.appendChild(a);\n });\n },\n };\n for (const id of data.modules ?? RC_MODULE_IDS) renderers[id]?.();\n if (!body.childNodes.length) body.appendChild(el(doc, \"div\", \"g-rc-empty\", \"Nothing here yet.\"));\n }\n\n /** One \"What's new\" entry: title, date, body and its links (Show me, the article, a URL). */\n function announcementItem(n: ResourceCenterAnnouncement, unread: boolean): HTMLElement {\n const item = el(doc, \"article\", `g-rc-news${unread ? \" g-rc-news-unread\" : \"\"}`);\n const head = el(doc, \"div\", \"g-rc-news-head\");\n const title = el(doc, \"h3\", \"g-rc-news-title\", n.title);\n head.appendChild(title);\n if (unread) {\n const dot = el(doc, \"span\", \"g-rc-news-new\", \"New\");\n head.appendChild(dot);\n }\n const date = el(doc, \"time\", \"g-rc-news-date\");\n date.dateTime = n.publishedAt;\n try {\n date.textContent = new Date(n.publishedAt).toLocaleDateString(undefined, { year: \"numeric\", month: \"short\", day: \"numeric\" });\n } catch {\n date.textContent = n.publishedAt.slice(0, 10);\n }\n item.append(head, date);\n if (n.body) {\n const b = el(doc, \"div\", \"g-body g-rc-news-body\");\n setSanitizedHtml(b, n.body);\n item.appendChild(b);\n }\n const actions = el(doc, \"div\", \"g-rc-news-actions\");\n const guide = n.guideId ? startableGuide(options.guides?.(), n.guideId) : null;\n if (guide) {\n const b = el(doc, \"button\", \"g-btn g-btn-primary\", n.linkLabel || \"Show me\");\n b.type = \"button\";\n b.addEventListener(\"click\", () => (options.onShowMe ? options.onShowMe(guide.key) : options.onStartGuide?.(guide.id)));\n actions.appendChild(b);\n }\n if (n.articleId) {\n const listed = options.data().articles.find((a) => a.id === n.articleId);\n if (listed) {\n const b = el(doc, \"button\", \"g-btn g-btn-secondary\", guide ? \"Read more\" : n.linkLabel || \"Read more\");\n b.type = \"button\";\n b.addEventListener(\"click\", () => openArticle(listed));\n actions.appendChild(b);\n }\n }\n if (n.url && /^https?:\\/\\//i.test(n.url)) {\n const a = el(doc, \"a\", \"g-btn g-btn-link\", !guide && !n.articleId && n.linkLabel ? n.linkLabel : \"Learn more\");\n a.href = n.url;\n a.target = \"_blank\";\n a.rel = \"noopener noreferrer\";\n actions.appendChild(a);\n }\n if (actions.childNodes.length) item.appendChild(actions);\n return item;\n }\n\n let debounce: ReturnType<typeof setTimeout> | null = null;\n const onInput = () => {\n query = input.value;\n openSeq++;\n setActive(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 setActive(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 isArticleOpen: () => !!active,\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"],"mappings":"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","names":["el"]}
@@ -0,0 +1,359 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
4
+
5
+ // src/styles.ts
6
+ var STYLES = `
7
+ :host{all:initial;position:static;display:block;contain:none}
8
+ *,*::before,*::after{box-sizing:border-box}
9
+ .g-scope [hidden]{display:none!important}
10
+ .g-scope{
11
+ --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;
12
+ --g-muted:color-mix(in srgb,var(--g-text) 62%,transparent);--g-border:color-mix(in srgb,var(--g-text) 12%,transparent);
13
+ --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);
14
+ --g-primary-text:#ffffff;
15
+ font-family:var(--g-font);font-size:14px;line-height:1.5;color:var(--g-text);-webkit-font-smoothing:antialiased;
16
+ }
17
+ .g-scope[data-theme="dark"]{--g-shadow:0 10px 40px rgba(0,0,0,.5),0 2px 8px rgba(0,0,0,.3)}
18
+ .g-live{position:fixed;width:1px;height:1px;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
19
+ .g-layer{position:fixed;inset:0;z-index:var(--g-z);pointer-events:none}
20
+ .g-overlay{position:fixed;inset:0;background:rgba(0,0,0,var(--g-overlay));z-index:calc(var(--g-z) + 3);pointer-events:auto}
21
+ .g-overlay.g-transparent{background:transparent}
22
+ .g-spot-rect{position:fixed;background:rgba(0,0,0,var(--g-overlay));z-index:calc(var(--g-z) + 3);pointer-events:auto}
23
+ .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)}
24
+ .g-card{
25
+ 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);
26
+ 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;
27
+ }
28
+ .g-card.g-modal{left:50%;top:50%;transform:translate(-50%,-50%);width:min(480px,calc(100vw - 32px))}
29
+ .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))}
30
+ .g-card.g-slideout{width:min(360px,calc(100vw - 32px));margin:16px}
31
+ .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}
32
+ .g-pos-center{left:50%;top:50%;transform:translate(-50%,-50%)}
33
+ .g-pos-top{top:0;left:0;right:0}.g-pos-bottom{bottom:0;left:0;right:0}
34
+ .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}
35
+ .g-banner .g-body{flex:1;min-width:0}
36
+ .g-banner .g-body a{color:inherit;text-decoration:underline}
37
+ .g-banner .g-close{color:inherit;right:8px;top:50%;transform:translateY(-50%)}
38
+ .g-banner .g-btn{background:rgba(255,255,255,.18);color:inherit;border-color:transparent;min-height:36px}
39
+ .g-banner.g-pos-top{top:0}.g-banner.g-pos-bottom{bottom:0}
40
+ .g-inner{padding:20px}
41
+ .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}
42
+ .g-close:hover,.g-close:focus-visible{background:var(--g-subtle);color:var(--g-text);outline:none}
43
+ .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}
44
+ .g-image{display:block;width:100%;max-height:220px;object-fit:cover;border-radius:var(--g-radius) var(--g-radius) 0 0}
45
+ .g-title{margin:0 28px 6px 0;font-size:16px;font-weight:600;line-height:1.3}
46
+ .g-body{font-size:14px;color:var(--g-text)}
47
+ .g-body p{margin:0 0 8px}.g-body p:last-child{margin-bottom:0}
48
+ .g-body ul,.g-body ol{margin:6px 0;padding-left:20px}
49
+ .g-body a{color:var(--g-primary)}
50
+ .g-body img{max-width:100%;height:auto;border-radius:6px}
51
+ .g-body video,.g-body iframe{display:block;width:100%;max-width:100%;border:0;border-radius:6px;margin:8px 0;background:#000}
52
+ .g-body video{height:auto;max-height:60vh}
53
+ .g-body iframe{aspect-ratio:16/9;height:auto}
54
+ .g-body .gd-pdf{margin:10px 0;border:1px solid var(--g-border);border-radius:10px;background:var(--g-subtle);overflow:hidden}
55
+ .g-body a.gd-file{display:flex;align-items:center;gap:8px;padding:8px 10px;color:var(--g-text);font-size:13px;font-weight:500;text-decoration:none;min-height:40px;overflow-wrap:anywhere}
56
+ .g-body a.gd-file::before{content:"PDF";flex:none;font-size:9px;font-weight:700;letter-spacing:.04em;line-height:1;color:#fff;background:#e5484d;border-radius:4px;padding:4px 5px}
57
+ .g-body a.gd-file::after{content:"\u2922";margin-left:auto;padding-left:8px;color:var(--g-muted);font-size:15px}
58
+ .g-body a.gd-file:hover::after,.g-body a.gd-file:focus-visible::after{color:var(--g-primary)}
59
+ .g-body a.gd-file:focus-visible{outline:2px solid var(--g-primary);outline-offset:-2px;border-radius:10px}
60
+ .g-body > a.gd-file,.g-body p > a.gd-file{margin:10px 0;border:1px solid var(--g-border);border-radius:10px;background:var(--g-subtle)}
61
+ .g-body > a.gd-file::after,.g-body p > a.gd-file::after,.g-body .gd-pdf:not([data-g-ready]) > a.gd-file::after{content:"\u2197"}
62
+ .g-pdf-viewport{position:relative}
63
+ .g-body .gd-pdf-pages{display:flex;gap:10px;overflow-x:auto;scroll-snap-type:x mandatory;overscroll-behavior-x:contain;scrollbar-width:none;padding:0 10px 10px;scroll-padding:0 10px}
64
+ .g-body .gd-pdf-pages::-webkit-scrollbar{display:none}
65
+ .g-body .gd-pdf-pages:focus-visible{outline:2px solid var(--g-primary);outline-offset:-2px}
66
+ .g-body .gd-pdf-pages img{flex:0 0 100%;width:100%;height:auto;margin:0;scroll-snap-align:center;background:#fff;border-radius:4px;box-shadow:0 1px 3px rgba(0,0,0,.18);cursor:zoom-in}
67
+ .g-pdf-viewport .gd-pdf-pages{padding:0;scroll-padding:0;margin:0 10px 10px}
68
+ .g-pdf-count{position:absolute;right:18px;bottom:18px;padding:2px 8px;border-radius:999px;background:rgba(17,17,17,.72);color:#fff;font-size:11px;font-weight:500;pointer-events:none;font-variant-numeric:tabular-nums}
69
+ .g-pdf-nav{position:absolute;top:calc(50% - 21px);width:32px;height:32px;display:inline-flex;align-items:center;justify-content:center;border:0;border-radius:999px;background:rgba(17,17,17,.6);color:#fff;font:inherit;font-size:20px;line-height:1;cursor:pointer;opacity:0;transition:opacity .15s}
70
+ .g-pdf-prev{left:16px}.g-pdf-next{right:16px}
71
+ .g-pdf-viewport:hover .g-pdf-nav,.g-pdf-nav:focus-visible{opacity:1}
72
+ .g-pdf-nav:disabled,.g-pdf-single .g-pdf-nav,.g-pdf-single .g-pdf-count{display:none}
73
+ .g-pdf-nav:focus-visible{outline:2px solid #fff;outline-offset:1px}
74
+ @media (hover:none){.g-pdf-nav{display:none}}
75
+ .g-pdf-reader{position:fixed;inset:0;z-index:calc(var(--g-z) + 10);display:flex;flex-direction:column;background:#0b0b0d;pointer-events:auto;color:#fff}
76
+ .g-pdf-bar{display:flex;align-items:center;gap:10px;padding:8px 8px 8px 16px;min-height:56px}
77
+ .g-pdf-title{flex:1;min-width:0;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
78
+ .g-pdf-bar .g-btn{min-height:36px;color:#fff;background:rgba(255,255,255,.12);border-color:rgba(255,255,255,.18)}
79
+ .g-pdf-close{position:static;color:#fff}
80
+ .g-pdf-close:hover,.g-pdf-close:focus-visible{background:rgba(255,255,255,.14);color:#fff}
81
+ .g-pdf-scroll{position:relative;flex:1;overflow-y:auto;overscroll-behavior:contain;padding:4px 16px 24px;display:flex;flex-direction:column;align-items:center;gap:12px;outline:none}
82
+ .g-pdf-scroll img{display:block;width:100%;max-width:900px;height:auto;background:#fff;border-radius:2px;box-shadow:0 2px 12px rgba(0,0,0,.4)}
83
+ .g-body code{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:13px;background:var(--g-subtle);padding:1px 4px;border-radius:4px}
84
+ .g-body pre{background:var(--g-subtle);padding:10px;border-radius:6px;overflow:auto}
85
+ .g-body blockquote{margin:6px 0;padding-left:10px;border-left:3px solid var(--g-border);color:var(--g-muted)}
86
+ .g-footer{display:flex;align-items:center;gap:8px;margin-top:14px;flex-wrap:wrap}
87
+ .g-progress{font-size:12px;color:var(--g-muted);margin-right:auto}
88
+ .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}
89
+ .g-btn-primary{background:var(--g-primary);color:var(--g-primary-text)}
90
+ .g-btn-primary:hover{filter:brightness(1.08)}
91
+ .g-btn-secondary{background:var(--g-subtle);color:var(--g-text);border-color:var(--g-border)}
92
+ .g-btn-secondary:hover{background:color-mix(in srgb,var(--g-text) 10%,transparent)}
93
+ .g-btn-ghost{background:transparent;color:var(--g-muted)}
94
+ .g-btn-ghost:hover{background:var(--g-subtle);color:var(--g-text)}
95
+ .g-btn-link{background:transparent;color:var(--g-primary);padding-left:4px;padding-right:4px}
96
+ .g-btn-link:hover{text-decoration:underline}
97
+ .g-btn:disabled{opacity:.5;cursor:not-allowed}
98
+ .g-arrow{position:absolute;width:12px;height:12px;background:var(--g-bg);transform:rotate(45deg);border:1px solid var(--g-border);z-index:-1}
99
+ .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}
100
+ .g-hotspot::after{content:"";position:absolute;inset:-4px;border-radius:999px;border:2px solid var(--g-primary);opacity:0}
101
+ .g-hotspot.g-pulse::after{animation:g-pulse 1.8s ease-out infinite}
102
+ .g-hotspot-hit{position:absolute;inset:-14px}
103
+ .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}
104
+ /* animations */
105
+ .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}
106
+ .g-scope[data-anim="slide"] .g-card,.g-scope[data-anim="slide"] .g-panel{animation:g-slide .22s ease-out}
107
+ .g-scope[data-anim="none"] *{animation:none!important;transition:none!important}
108
+ @keyframes g-fade{from{opacity:0}to{opacity:1}}
109
+ @keyframes g-slide{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}
110
+ @keyframes g-pulse{0%{transform:scale(.6);opacity:.9}100%{transform:scale(2.2);opacity:0}}
111
+ @media (prefers-reduced-motion:reduce){.g-scope *{animation:none!important;transition:none!important}}
112
+ /* launcher + panel (checklist / resource center) */
113
+ .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}
114
+ .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}
115
+ .g-launcher .g-ring::after{content:"";position:absolute;inset:3px;border-radius:999px;background:var(--g-primary)}
116
+ .g-launcher .g-count{position:relative;z-index:1}
117
+ .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}
118
+ .g-panel-head{padding:16px 48px 12px 20px;border-bottom:1px solid var(--g-border);position:relative}
119
+ .g-panel-title{margin:0;font-size:16px;font-weight:600}
120
+ .g-panel-sub{margin:4px 0 0;font-size:12px;color:var(--g-muted)}
121
+ .g-panel-body{overflow:auto;padding:8px 0;flex:1}
122
+ .g-help{display:flex;flex-direction:column;min-height:0;flex:1}
123
+ .g-bar{height:6px;border-radius:999px;background:var(--g-subtle);overflow:hidden;margin-top:10px}
124
+ .g-bar > span{display:block;height:100%;background:var(--g-primary);transition:width .3s}
125
+ .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}
126
+ .g-task:hover{background:var(--g-subtle)}
127
+ .g-task[disabled]{cursor:not-allowed;opacity:.55}
128
+ .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}
129
+ .g-task.g-done .g-check{background:var(--g-primary);border-color:var(--g-primary)}
130
+ .g-task.g-done .g-task-title{text-decoration:line-through;color:var(--g-muted)}
131
+ .g-task-title{font-weight:500}
132
+ .g-task-desc{font-size:12px;color:var(--g-muted);margin-top:2px}
133
+ .g-panel-foot{padding:10px 20px;border-top:1px solid var(--g-border);display:flex;justify-content:flex-end;gap:8px}
134
+ .g-complete{padding:28px 20px;text-align:center}
135
+ .g-complete .g-title{margin-right:0;font-size:18px}
136
+ /* survey */
137
+ .g-question{margin-bottom:16px}
138
+ .g-q-title{font-weight:600;margin:0 0 4px}
139
+ .g-q-desc{font-size:12px;color:var(--g-muted);margin:0 0 8px}
140
+ .g-scale{display:flex;gap:4px;flex-wrap:wrap}
141
+ .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}
142
+ .g-scale button[aria-pressed="true"],.g-scale button:hover{background:var(--g-primary);color:var(--g-primary-text);border-color:var(--g-primary)}
143
+ .g-scale-labels{display:flex;justify-content:space-between;font-size:11px;color:var(--g-muted);margin-top:4px}
144
+ .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}
145
+ .g-stars button[aria-pressed="true"],.g-stars button.g-on{color:#f59e0b}
146
+ .g-thumbs button[aria-pressed="true"]{color:var(--g-primary)}
147
+ .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}
148
+ .g-choice[aria-checked="true"]{border-color:var(--g-primary);background:color-mix(in srgb,var(--g-primary) 8%,transparent)}
149
+ .g-choice .g-dot{width:16px;height:16px;border-radius:999px;border:2px solid var(--g-border);flex:none}
150
+ .g-choice.g-multi .g-dot{border-radius:4px}
151
+ .g-choice[aria-checked="true"] .g-dot{background:var(--g-primary);border-color:var(--g-primary)}
152
+ .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}
153
+ .g-error{color:#dc2626;font-size:12px;margin-top:4px}
154
+ /* resource center */
155
+ .g-rc-search{padding:12px 20px 4px}
156
+ .g-rc-section{padding:8px 20px 4px;font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--g-muted);font-weight:600}
157
+ .g-rc-section[data-depth]{text-transform:none;letter-spacing:0;font-size:12px}
158
+ .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}
159
+ .g-rc-item:hover{background:var(--g-subtle)}
160
+ .g-rc-item .g-rc-title{font-weight:500}
161
+ .g-rc-item .g-rc-sum{font-size:12px;color:var(--g-muted);margin-top:2px}
162
+ .g-rc-item .g-rc-icon{flex:none;width:20px;text-align:center;color:var(--g-primary)}
163
+ .g-rc-row{display:flex;align-items:center;gap:6px;padding-right:16px}
164
+ .g-rc-row>.g-rc-item{flex:1;min-width:0;padding-right:4px}
165
+ .g-rc-row:hover{background:var(--g-subtle)}
166
+ .g-rc-row:hover>.g-rc-item{background:transparent}
167
+ .g-rc-showme{flex:none;min-height:32px;padding:4px 10px;font-size:12px;white-space:nowrap}
168
+ .g-help-showme{margin:4px 0 12px}
169
+ .g-rc-article{padding:16px 20px}
170
+ .g-resource-center .g-panel{transition:width .2s ease,max-height .2s ease}
171
+ .g-resource-center .g-panel.g-panel-reading{width:min(720px,calc(100vw - 32px));max-height:calc(100vh - 100px)}
172
+ .g-rc-back{margin-bottom:8px}
173
+ .g-rc-empty{padding:24px 20px;color:var(--g-muted);text-align:center}
174
+ .g-faq-a{padding:0 20px 12px 50px;font-size:13px;color:var(--g-muted)}
175
+ .g-faq-a[hidden]{display:none}
176
+ /* authoring */
177
+ .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)}
178
+ .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)}
179
+ .g-auth-bar .g-spacer{flex:1}
180
+ .g-auth-bar .g-btn{min-height:32px;padding:4px 12px;font-size:13px}
181
+ .g-auth-bar .g-btn-secondary{background:rgba(255,255,255,.12);color:#fff;border-color:transparent}
182
+ .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}
183
+ .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}
184
+ .g-auth-outline.g-picked{border-style:dashed;border-color:#22c55e;background:rgba(34,197,94,.12)}
185
+ .g-auth-outline.g-picked .g-auth-label{background:#16a34a}
186
+ .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}
187
+ @media (max-width:480px){.g-card.g-modal,.g-panel{width:calc(100vw - 32px)}.g-inner{padding:16px}}
188
+ /* resource center: unread badge + "What's new" */
189
+ .g-launcher-badge{position:absolute;top:-4px;right:-4px;min-width:20px;height:20px;padding:0 6px;border-radius:999px;background:#dc2626;color:#fff;font-size:11px;font-weight:700;line-height:20px;text-align:center;box-shadow:0 0 0 2px var(--g-bg)}
190
+ .g-rc-news{padding:10px 20px 12px;border-bottom:1px solid var(--g-border)}
191
+ .g-rc-news:last-of-type{border-bottom:0}
192
+ .g-rc-news-head{display:flex;align-items:baseline;gap:8px}
193
+ .g-rc-news-title{margin:0;font-size:14px;font-weight:600;line-height:1.35;flex:1}
194
+ .g-rc-news-new{flex:none;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;color:var(--g-primary-text);background:var(--g-primary);border-radius:999px;padding:2px 7px}
195
+ .g-rc-news-date{display:block;font-size:12px;color:var(--g-muted);margin:2px 0 6px}
196
+ .g-rc-news-body{font-size:13px}
197
+ .g-rc-news-actions{display:flex;flex-wrap:wrap;gap:8px;margin-top:8px}
198
+ .g-rc-news-actions .g-btn{min-height:32px;padding:6px 12px;font-size:13px}
199
+ /* accessibility */
200
+ .g-sr-only{position:absolute;width:1px;height:1px;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}
201
+ .g-hotspot:focus-visible,.g-custom:focus-visible,.g-card:focus-visible{outline:2px solid var(--g-primary);outline-offset:2px}
202
+ @media (forced-colors:active){.g-card,.g-panel,.g-banner{border:1px solid CanvasText}.g-btn{border:1px solid ButtonText}}
203
+ `;
204
+
205
+ // src/host.ts
206
+ import { readableTextOn, scopeCustomCss } from "@guidelytech/shared/runtime";
207
+ var HOST_ID = "guidely-root";
208
+ var current = null;
209
+ var DEFAULT_THEME = {
210
+ primaryColor: "#4f46e5",
211
+ backgroundColor: "#ffffff",
212
+ textColor: "#111827",
213
+ borderRadius: 12,
214
+ fontFamily: "Inter, system-ui, -apple-system, sans-serif"
215
+ };
216
+ function ensureHost(doc = document) {
217
+ if (current && current.host.isConnected && current.host.ownerDocument === doc) return current;
218
+ let host = doc.getElementById(HOST_ID);
219
+ if (!host) {
220
+ host = doc.createElement("div");
221
+ host.id = HOST_ID;
222
+ host.setAttribute("data-guidely", "");
223
+ (doc.body || doc.documentElement).appendChild(host);
224
+ }
225
+ const shadow = host.shadowRoot ?? host.attachShadow({ mode: "open" });
226
+ if (!shadow.querySelector("style[data-g-base]")) {
227
+ const style = doc.createElement("style");
228
+ style.setAttribute("data-g-base", "");
229
+ style.textContent = STYLES;
230
+ shadow.appendChild(style);
231
+ }
232
+ let live = shadow.querySelector(".g-live");
233
+ if (!live) {
234
+ live = doc.createElement("div");
235
+ live.className = "g-live";
236
+ live.setAttribute("aria-live", "polite");
237
+ live.setAttribute("aria-atomic", "true");
238
+ shadow.appendChild(live);
239
+ }
240
+ const liveEl = live;
241
+ current = {
242
+ host,
243
+ shadow,
244
+ live: liveEl,
245
+ announce(text) {
246
+ liveEl.textContent = "";
247
+ setTimeout(() => {
248
+ liveEl.textContent = text;
249
+ }, 30);
250
+ },
251
+ destroy() {
252
+ host?.remove();
253
+ if (current?.host === host) current = null;
254
+ }
255
+ };
256
+ return current;
257
+ }
258
+ function destroyHost() {
259
+ current?.destroy();
260
+ const stray = typeof document !== "undefined" ? document.getElementById(HOST_ID) : null;
261
+ stray?.remove();
262
+ current = null;
263
+ }
264
+ function prefersDark() {
265
+ try {
266
+ return typeof window !== "undefined" && typeof window.matchMedia === "function" && window.matchMedia("(prefers-color-scheme: dark)").matches;
267
+ } catch {
268
+ return false;
269
+ }
270
+ }
271
+ function prefersReducedMotion() {
272
+ try {
273
+ return typeof window !== "undefined" && typeof window.matchMedia === "function" && window.matchMedia("(prefers-reduced-motion: reduce)").matches;
274
+ } catch {
275
+ return false;
276
+ }
277
+ }
278
+ function resolveTheme(theme, appearance) {
279
+ const t = { ...DEFAULT_THEME, ...theme || {} };
280
+ const a = appearance || {};
281
+ const requested = a.theme ?? "auto";
282
+ const mode = requested === "auto" ? prefersDark() ? "dark" : "light" : requested;
283
+ const dark = mode === "dark";
284
+ return {
285
+ primary: a.primaryColor || t.primaryColor,
286
+ bg: a.backgroundColor || (dark ? "#1f2937" : t.backgroundColor),
287
+ text: a.textColor || (dark ? "#f9fafb" : t.textColor),
288
+ radius: a.borderRadius ?? t.borderRadius,
289
+ font: a.fontFamily || t.fontFamily,
290
+ z: a.zIndex ?? 2147483e3,
291
+ overlay: a.overlayOpacity ?? 0.5,
292
+ mode,
293
+ animation: prefersReducedMotion() ? "none" : a.animation ?? "fade"
294
+ };
295
+ }
296
+ function applyTheme(el, vars) {
297
+ el.style.setProperty("--g-primary", vars.primary);
298
+ if (/^#[0-9a-f]{3}([0-9a-f]{3})?$/i.test(vars.primary)) el.style.setProperty("--g-primary-text", readableTextOn(vars.primary));
299
+ el.style.setProperty("--g-bg", vars.bg);
300
+ el.style.setProperty("--g-text", vars.text);
301
+ el.style.setProperty("--g-radius", `${vars.radius}px`);
302
+ el.style.setProperty("--g-font", vars.font);
303
+ el.style.setProperty("--g-z", String(vars.z));
304
+ el.style.setProperty("--g-overlay", String(vars.overlay));
305
+ el.setAttribute("data-theme", vars.mode);
306
+ el.setAttribute("data-anim", vars.animation);
307
+ }
308
+ function createScope(theme, appearance, doc = document) {
309
+ const handle = ensureHost(doc);
310
+ const el = doc.createElement("div");
311
+ el.className = "g-scope";
312
+ const vars = resolveTheme(theme, appearance);
313
+ applyTheme(el, vars);
314
+ handle.shadow.appendChild(el);
315
+ const css = [appearance ? theme?.customCss : void 0, appearance?.customCss].filter((c) => !!c && !!c.trim());
316
+ let style = null;
317
+ if (css.length) {
318
+ const id = `c${++cssScopeSeq}`;
319
+ el.setAttribute("data-g-css", id);
320
+ style = doc.createElement("style");
321
+ style.setAttribute("data-g-custom", id);
322
+ style.textContent = css.map((c) => scopeCustomCss(c, `.g-scope[data-g-css="${id}"]`)).join("\n");
323
+ handle.shadow.insertBefore(style, el);
324
+ }
325
+ let mq = null;
326
+ const onChange = () => applyTheme(el, resolveTheme(theme, appearance));
327
+ if ((appearance?.theme ?? "auto") === "auto" && typeof window !== "undefined" && typeof window.matchMedia === "function") {
328
+ try {
329
+ mq = window.matchMedia("(prefers-color-scheme: dark)");
330
+ mq.addEventListener?.("change", onChange);
331
+ } catch {
332
+ mq = null;
333
+ }
334
+ }
335
+ return {
336
+ el,
337
+ vars,
338
+ destroy() {
339
+ mq?.removeEventListener?.("change", onChange);
340
+ style?.remove();
341
+ el.remove();
342
+ }
343
+ };
344
+ }
345
+ var cssScopeSeq = 0;
346
+
347
+ export {
348
+ __publicField,
349
+ STYLES,
350
+ HOST_ID,
351
+ DEFAULT_THEME,
352
+ ensureHost,
353
+ destroyHost,
354
+ prefersReducedMotion,
355
+ resolveTheme,
356
+ applyTheme,
357
+ createScope
358
+ };
359
+ //# sourceMappingURL=chunk-VJSQM23R.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/styles.ts","../src/host.ts"],"sourcesContent":["/** 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 video,.g-body iframe{display:block;width:100%;max-width:100%;border:0;border-radius:6px;margin:8px 0;background:#000}\n.g-body video{height:auto;max-height:60vh}\n.g-body iframe{aspect-ratio:16/9;height:auto}\n.g-body .gd-pdf{margin:10px 0;border:1px solid var(--g-border);border-radius:10px;background:var(--g-subtle);overflow:hidden}\n.g-body a.gd-file{display:flex;align-items:center;gap:8px;padding:8px 10px;color:var(--g-text);font-size:13px;font-weight:500;text-decoration:none;min-height:40px;overflow-wrap:anywhere}\n.g-body a.gd-file::before{content:\"PDF\";flex:none;font-size:9px;font-weight:700;letter-spacing:.04em;line-height:1;color:#fff;background:#e5484d;border-radius:4px;padding:4px 5px}\n.g-body a.gd-file::after{content:\"⤢\";margin-left:auto;padding-left:8px;color:var(--g-muted);font-size:15px}\n.g-body a.gd-file:hover::after,.g-body a.gd-file:focus-visible::after{color:var(--g-primary)}\n.g-body a.gd-file:focus-visible{outline:2px solid var(--g-primary);outline-offset:-2px;border-radius:10px}\n.g-body > a.gd-file,.g-body p > a.gd-file{margin:10px 0;border:1px solid var(--g-border);border-radius:10px;background:var(--g-subtle)}\n.g-body > a.gd-file::after,.g-body p > a.gd-file::after,.g-body .gd-pdf:not([data-g-ready]) > a.gd-file::after{content:\"↗\"}\n.g-pdf-viewport{position:relative}\n.g-body .gd-pdf-pages{display:flex;gap:10px;overflow-x:auto;scroll-snap-type:x mandatory;overscroll-behavior-x:contain;scrollbar-width:none;padding:0 10px 10px;scroll-padding:0 10px}\n.g-body .gd-pdf-pages::-webkit-scrollbar{display:none}\n.g-body .gd-pdf-pages:focus-visible{outline:2px solid var(--g-primary);outline-offset:-2px}\n.g-body .gd-pdf-pages img{flex:0 0 100%;width:100%;height:auto;margin:0;scroll-snap-align:center;background:#fff;border-radius:4px;box-shadow:0 1px 3px rgba(0,0,0,.18);cursor:zoom-in}\n.g-pdf-viewport .gd-pdf-pages{padding:0;scroll-padding:0;margin:0 10px 10px}\n.g-pdf-count{position:absolute;right:18px;bottom:18px;padding:2px 8px;border-radius:999px;background:rgba(17,17,17,.72);color:#fff;font-size:11px;font-weight:500;pointer-events:none;font-variant-numeric:tabular-nums}\n.g-pdf-nav{position:absolute;top:calc(50% - 21px);width:32px;height:32px;display:inline-flex;align-items:center;justify-content:center;border:0;border-radius:999px;background:rgba(17,17,17,.6);color:#fff;font:inherit;font-size:20px;line-height:1;cursor:pointer;opacity:0;transition:opacity .15s}\n.g-pdf-prev{left:16px}.g-pdf-next{right:16px}\n.g-pdf-viewport:hover .g-pdf-nav,.g-pdf-nav:focus-visible{opacity:1}\n.g-pdf-nav:disabled,.g-pdf-single .g-pdf-nav,.g-pdf-single .g-pdf-count{display:none}\n.g-pdf-nav:focus-visible{outline:2px solid #fff;outline-offset:1px}\n@media (hover:none){.g-pdf-nav{display:none}}\n.g-pdf-reader{position:fixed;inset:0;z-index:calc(var(--g-z) + 10);display:flex;flex-direction:column;background:#0b0b0d;pointer-events:auto;color:#fff}\n.g-pdf-bar{display:flex;align-items:center;gap:10px;padding:8px 8px 8px 16px;min-height:56px}\n.g-pdf-title{flex:1;min-width:0;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n.g-pdf-bar .g-btn{min-height:36px;color:#fff;background:rgba(255,255,255,.12);border-color:rgba(255,255,255,.18)}\n.g-pdf-close{position:static;color:#fff}\n.g-pdf-close:hover,.g-pdf-close:focus-visible{background:rgba(255,255,255,.14);color:#fff}\n.g-pdf-scroll{position:relative;flex:1;overflow-y:auto;overscroll-behavior:contain;padding:4px 16px 24px;display:flex;flex-direction:column;align-items:center;gap:12px;outline:none}\n.g-pdf-scroll img{display:block;width:100%;max-width:900px;height:auto;background:#fff;border-radius:2px;box-shadow:0 2px 12px rgba(0,0,0,.4)}\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-section[data-depth]{text-transform:none;letter-spacing:0;font-size:12px}\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-row{display:flex;align-items:center;gap:6px;padding-right:16px}\n.g-rc-row>.g-rc-item{flex:1;min-width:0;padding-right:4px}\n.g-rc-row:hover{background:var(--g-subtle)}\n.g-rc-row:hover>.g-rc-item{background:transparent}\n.g-rc-showme{flex:none;min-height:32px;padding:4px 10px;font-size:12px;white-space:nowrap}\n.g-help-showme{margin:4px 0 12px}\n.g-rc-article{padding:16px 20px}\n.g-resource-center .g-panel{transition:width .2s ease,max-height .2s ease}\n.g-resource-center .g-panel.g-panel-reading{width:min(720px,calc(100vw - 32px));max-height:calc(100vh - 100px)}\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/* resource center: unread badge + \"What's new\" */\n.g-launcher-badge{position:absolute;top:-4px;right:-4px;min-width:20px;height:20px;padding:0 6px;border-radius:999px;background:#dc2626;color:#fff;font-size:11px;font-weight:700;line-height:20px;text-align:center;box-shadow:0 0 0 2px var(--g-bg)}\n.g-rc-news{padding:10px 20px 12px;border-bottom:1px solid var(--g-border)}\n.g-rc-news:last-of-type{border-bottom:0}\n.g-rc-news-head{display:flex;align-items:baseline;gap:8px}\n.g-rc-news-title{margin:0;font-size:14px;font-weight:600;line-height:1.35;flex:1}\n.g-rc-news-new{flex:none;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;color:var(--g-primary-text);background:var(--g-primary);border-radius:999px;padding:2px 7px}\n.g-rc-news-date{display:block;font-size:12px;color:var(--g-muted);margin:2px 0 6px}\n.g-rc-news-body{font-size:13px}\n.g-rc-news-actions{display:flex;flex-wrap:wrap;gap:8px;margin-top:8px}\n.g-rc-news-actions .g-btn{min-height:32px;padding:6px 12px;font-size:13px}\n/* accessibility */\n.g-sr-only{position:absolute;width:1px;height:1px;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}\n.g-hotspot:focus-visible,.g-custom:focus-visible,.g-card:focus-visible{outline:2px solid var(--g-primary);outline-offset:2px}\n@media (forced-colors:active){.g-card,.g-panel,.g-banner{border:1px solid CanvasText}.g-btn{border:1px solid ButtonText}}\n`;\n","import type { Appearance, ProjectTheme } from \"@guidelytech/shared\";\nimport { readableTextOn, scopeCustomCss } from \"@guidelytech/shared/runtime\";\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 // Button labels, banners and badges on the primary colour use whichever of white or dark text reads better (WCAG AA).\n if (/^#[0-9a-f]{3}([0-9a-f]{3})?$/i.test(vars.primary)) el.style.setProperty(\"--g-primary-text\", readableTextOn(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 // Custom CSS (theme first, then the guide's) is sanitized and prefixed with this scope only. The\n // theme's CSS styles guides (scopes created with an appearance), not the resource center or messenger.\n const css = [appearance ? theme?.customCss : undefined, appearance?.customCss].filter((c): c is string => !!c && !!c.trim());\n let style: HTMLStyleElement | null = null;\n if (css.length) {\n const id = `c${++cssScopeSeq}`;\n el.setAttribute(\"data-g-css\", id);\n style = doc.createElement(\"style\");\n style.setAttribute(\"data-g-custom\", id);\n style.textContent = css.map((c) => scopeCustomCss(c, `.g-scope[data-g-css=\"${id}\"]`)).join(\"\\n\");\n handle.shadow.insertBefore(style, el);\n }\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 style?.remove();\n el.remove();\n },\n };\n}\n\nlet cssScopeSeq = 0;\n"],"mappings":"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","names":[]}